diff options
| author | doop <56421834+dooplecks@users.noreply.github.com> | 2024-05-14 16:43:47 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-05-14 14:43:47 -0600 |
| commit | 35484fb2c7c90c41ea461ae9d37974e360b2ad64 (patch) | |
| tree | 1ff36fb7fe1c5b18d7edcb0e7ab845b71b4b6ee6 /rel | |
| parent | 486e578065a0d5aa41bcae56ee0bc1b9ed0d6e42 (diff) | |
d_a_tag_yami work (#2154)
Diffstat (limited to 'rel')
| -rw-r--r-- | rel/d/a/tag/d_a_tag_yami/Makefile | 1 | ||||
| -rw-r--r-- | rel/d/a/tag/d_a_tag_yami/d_a_tag_yami.cpp | 497 |
2 files changed, 115 insertions, 383 deletions
diff --git a/rel/d/a/tag/d_a_tag_yami/Makefile b/rel/d/a/tag/d_a_tag_yami/Makefile index da98777558..a7f92f7ad3 100644 --- a/rel/d/a/tag/d_a_tag_yami/Makefile +++ b/rel/d/a/tag/d_a_tag_yami/Makefile @@ -19,6 +19,7 @@ M753_LIBS := \ M753_CFLAGS := \ -sdata 0 \ -sdata2 0 \ + -sym on \ M753_LDFLAGS := \ -nodefaults \ diff --git a/rel/d/a/tag/d_a_tag_yami/d_a_tag_yami.cpp b/rel/d/a/tag/d_a_tag_yami/d_a_tag_yami.cpp index 649e64cfce..33b90e0019 100644 --- a/rel/d/a/tag/d_a_tag_yami/d_a_tag_yami.cpp +++ b/rel/d/a/tag/d_a_tag_yami/d_a_tag_yami.cpp @@ -1,278 +1,81 @@ -// -// Generated By: dol2asm -// Translation Unit: d_a_tag_yami -// +/** + * d_a_tag_yami.cpp + * Tag - Yami (Twili) + */ #include "rel/d/a/tag/d_a_tag_yami/d_a_tag_yami.h" -#include "dol2asm.h" - -// -// Types: -// - -struct csXyz { - /* 802673F4 */ csXyz(s16, s16, s16); -}; - -struct mDoMtx_stack_c { - /* 8000CF0C */ void ZXYrotS(csXyz const&); - - static u8 now[48]; -}; - -struct fopAc_ac_c { - /* 80018B64 */ fopAc_ac_c(); - /* 80018C8C */ ~fopAc_ac_c(); -}; - -struct Vec {}; - -struct cXyz { - /* 80266AE4 */ void operator+(Vec const&) const; - /* 80266B34 */ void operator-(Vec const&) const; -}; - -struct daTagYami_c { - /* 80D659F8 */ void create(); - /* 80D65C24 */ void Execute(); - /* 80D65C60 */ void calcCoC(cXyz&); - /* 80D65D08 */ void col_set(); - /* 80D65D0C */ void chk_CoHit(); - /* 80D65D60 */ void getPlDist(); - /* 80D65EEC */ void onMidnaTagSw(); - /* 80D65F24 */ void offMidnaTagSw2(); - /* 80D66100 */ void setCoC(cXyz); -}; - -struct dSv_info_c { - /* 80035200 */ void onSwitch(int, int); - /* 800352B0 */ void offSwitch(int, int); - /* 80035360 */ void isSwitch(int, int) const; -}; - -struct dSv_event_flag_c { - static u8 saveBitLabels[1644 + 4 /* padding */]; -}; - -struct dSv_event_c { - /* 800349BC */ void isEventBit(u16) const; -}; - -struct dCcD_Stts { - /* 80083860 */ void Init(int, int, fopAc_ac_c*); -}; - -struct dCcD_SrcCyl {}; - -struct dCcD_GStts { - /* 80083760 */ dCcD_GStts(); - /* 80D6611C */ ~dCcD_GStts(); -}; - -struct dCcD_GObjInf { - /* 80083A28 */ dCcD_GObjInf(); - /* 800840E4 */ ~dCcD_GObjInf(); -}; - -struct dCcD_Cyl { - /* 800848B4 */ void Set(dCcD_SrcCyl const&); -}; - -struct cM3dGCyl { - /* 80D66178 */ ~cM3dGCyl(); -}; - -struct cM3dGAab { - /* 80D661C0 */ ~cM3dGAab(); -}; - -struct cCcD_GStts { - /* 80D660B8 */ ~cCcD_GStts(); -}; - -// -// Forward References: -// - -extern "C" void create__11daTagYami_cFv(); -extern "C" void Execute__11daTagYami_cFv(); -extern "C" void calcCoC__11daTagYami_cFR4cXyz(); -extern "C" void col_set__11daTagYami_cFv(); -extern "C" void chk_CoHit__11daTagYami_cFv(); -extern "C" void getPlDist__11daTagYami_cFv(); -extern "C" void onMidnaTagSw__11daTagYami_cFv(); -extern "C" void offMidnaTagSw2__11daTagYami_cFv(); -extern "C" static void daTagYami_Create__FP10fopAc_ac_c(); -extern "C" static void daTagYami_Execute__FP10fopAc_ac_c(); -extern "C" static void daTagYami_Delete__FP11daTagYami_c(); -extern "C" void __dt__10cCcD_GSttsFv(); -extern "C" void setCoC__11daTagYami_cF4cXyz(); -extern "C" void __dt__10dCcD_GSttsFv(); -extern "C" void __dt__8cM3dGCylFv(); -extern "C" void __dt__8cM3dGAabFv(); - -// -// External References: -// - -extern "C" void ZXYrotS__14mDoMtx_stack_cFRC5csXyz(); -extern "C" void __ct__10fopAc_ac_cFv(); -extern "C" void __dt__10fopAc_ac_cFv(); -extern "C" void isEventBit__11dSv_event_cCFUs(); -extern "C" void onSwitch__10dSv_info_cFii(); -extern "C" void offSwitch__10dSv_info_cFii(); -extern "C" void isSwitch__10dSv_info_cCFii(); -extern "C" void __ct__10dCcD_GSttsFv(); -extern "C" void Init__9dCcD_SttsFiiP10fopAc_ac_c(); -extern "C" void __ct__12dCcD_GObjInfFv(); -extern "C" void __dt__12dCcD_GObjInfFv(); -extern "C" void Set__8dCcD_CylFRC11dCcD_SrcCyl(); -extern "C" void __pl__4cXyzCFRC3Vec(); -extern "C" void __mi__4cXyzCFRC3Vec(); -extern "C" void __ct__5csXyzFsss(); -extern "C" void __dl__FPv(); -extern "C" void PSMTXMultVec(); -extern "C" void PSVECSquareMag(); -extern "C" void _savegpr_28(); -extern "C" void _restgpr_28(); -extern "C" extern void* g_fopAc_Method[8]; -extern "C" extern void* g_fpcLf_Method[5 + 1 /* padding */]; -extern "C" u8 saveBitLabels__16dSv_event_flag_c[1644 + 4 /* padding */]; -extern "C" extern void* __vt__8dCcD_Cyl[36]; -extern "C" extern void* __vt__9dCcD_Stts[11]; -extern "C" extern void* __vt__12cCcD_CylAttr[25]; -extern "C" extern void* __vt__14cCcD_ShapeAttr[22]; -extern "C" extern void* __vt__9cCcD_Stts[8]; -extern "C" u8 now__14mDoMtx_stack_c[48]; -extern "C" extern u8 g_dComIfG_gameInfo[122384]; -extern "C" extern u32 __float_nan; - -// -// Declarations: -// +#include "d/com/d_com_inf_game.h" /* ############################################################################################## */ /* 80D66210-80D66254 000000 0044+00 2/2 0/0 0/0 .rodata l_sph_src */ -SECTION_RODATA static u8 const l_sph_src[68] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xD8, 0xFB, 0xFD, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; -COMPILER_STRIP_GATE(0x80D66210, &l_sph_src); - -/* 80D66254-80D66258 000044 0004+00 0/1 0/0 0/0 .rodata @3726 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_3726 = 700.0f; -COMPILER_STRIP_GATE(0x80D66254, &lit_3726); -#pragma pop - -/* 80D66258-80D6625C 000048 0004+00 0/1 0/0 0/0 .rodata @3727 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_3727 = 300.0f; -COMPILER_STRIP_GATE(0x80D66258, &lit_3727); -#pragma pop - -/* 80D66280-80D662A0 -00001 0020+00 1/0 0/0 0/0 .data l_daTagYami_Method */ -SECTION_DATA static void* l_daTagYami_Method[8] = { - (void*)daTagYami_Create__FP10fopAc_ac_c, - (void*)daTagYami_Delete__FP11daTagYami_c, - (void*)daTagYami_Execute__FP10fopAc_ac_c, - (void*)NULL, - (void*)NULL, - (void*)NULL, - (void*)NULL, - (void*)NULL, -}; - -/* 80D662A0-80D662D0 -00001 0030+00 0/0 0/0 1/0 .data g_profile_TAG_YAMI */ -SECTION_DATA extern void* g_profile_TAG_YAMI[12] = { - (void*)0xFFFFFFFD, (void*)0x0003FFFD, - (void*)0x00230000, (void*)&g_fpcLf_Method, - (void*)0x00000704, (void*)NULL, - (void*)NULL, (void*)&g_fopAc_Method, - (void*)0x00150000, (void*)&l_daTagYami_Method, - (void*)0x00040000, (void*)0x000E0000, -}; - -/* 80D662D0-80D662DC 000050 000C+00 3/3 0/0 0/0 .data __vt__10cCcD_GStts */ -SECTION_DATA extern void* __vt__10cCcD_GStts[3] = { - (void*)NULL /* RTTI */, - (void*)NULL, - (void*)__dt__10cCcD_GSttsFv, -}; - -/* 80D662DC-80D662E8 00005C 000C+00 2/2 0/0 0/0 .data __vt__10dCcD_GStts */ -SECTION_DATA extern void* __vt__10dCcD_GStts[3] = { - (void*)NULL /* RTTI */, - (void*)NULL, - (void*)__dt__10dCcD_GSttsFv, -}; - -/* 80D662E8-80D662F4 000068 000C+00 3/3 0/0 0/0 .data __vt__8cM3dGCyl */ -SECTION_DATA extern void* __vt__8cM3dGCyl[3] = { - (void*)NULL /* RTTI */, - (void*)NULL, - (void*)__dt__8cM3dGCylFv, -}; - -/* 80D662F4-80D66300 000074 000C+00 3/3 0/0 0/0 .data __vt__8cM3dGAab */ -SECTION_DATA extern void* __vt__8cM3dGAab[3] = { - (void*)NULL /* RTTI */, - (void*)NULL, - (void*)__dt__8cM3dGAabFv, +const static dCcD_SrcCyl l_sph_src = { + { + {0x0, {{0x0, 0x0, 0x0}, {0xd8fbfdff, 0x0}, 0x19}}, // mObj + {dCcD_SE_NONE, 0x0, 0x0, 0x0, 0x8}, // mGObjAt + {dCcD_SE_NONE, 0x0, 0x0, 0x0, 0x0}, // mGObjTg + {0x0}, // mGObjCo + }, // mObjInf + { + {0.0f, 0.0f, 0.0f}, // mCenter + 0.0f, // mRadius + 0.0f // mHeight + } // mCyl }; /* 80D659F8-80D65C24 000078 022C+00 1/1 0/0 0/0 .text create__11daTagYami_cFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void daTagYami_c::create() { - nofralloc -#include "asm/rel/d/a/tag/d_a_tag_yami/d_a_tag_yami/create__11daTagYami_cFv.s" +int daTagYami_c::create() { + fopAcM_SetupActor(this, daTagYami_c); + + if (dComIfGs_isEventBit(dSv_event_flag_c::saveBitLabels[570])) { + return cPhs_ERROR_e; + } + + OS_REPORT("-------------- TAG YAMI CREATE!!\n"); + mStts.Init(0xff, 0xff, this); + mCyl.Set(l_sph_src); + mCyl.SetStts(&mStts); + + mIsCoHit = 0; + mMTagSw = get_MTagSw(); + mMTagSw2 = get_MTagSw2(); + + switch (get_prm()) { + case 2: { + cXyz coC; + calcCoC(coC); + setCoC(coC); + setCoR(700.0f); + setCoH(300.0f); + + if (fopAcM_isSwitch(this, 0x3d) && fopAcM_isSwitch(this, 0x3e)) { + off_CoHit(); + } else { + on_CoHit(); + } + break; + } + default: + return cPhs_ERROR_e; + } + + return cPhs_COMPLEATE_e; } -#pragma pop /* 80D65C24-80D65C60 0002A4 003C+00 1/1 0/0 0/0 .text Execute__11daTagYami_cFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void daTagYami_c::Execute() { - nofralloc -#include "asm/rel/d/a/tag/d_a_tag_yami/d_a_tag_yami/Execute__11daTagYami_cFv.s" +int daTagYami_c::Execute() { + col_set(); + mIsCoHit = chk_CoHit(); + return 1; } -#pragma pop /* ############################################################################################## */ -/* 80D6625C-80D66260 00004C 0004+00 1/2 0/0 0/0 .rodata @3820 */ -SECTION_RODATA static u8 const lit_3820[4] = { - 0x00, - 0x00, - 0x00, - 0x00, -}; -COMPILER_STRIP_GATE(0x80D6625C, &lit_3820); - -/* 80D66260-80D66268 000050 0004+04 1/1 0/0 0/0 .rodata @3821 */ -SECTION_RODATA static f32 const lit_3821[1 + 1 /* padding */] = { - 430.0f, - /* padding */ - 0.0f, -}; -COMPILER_STRIP_GATE(0x80D66260, &lit_3821); - /* 80D65C60-80D65D08 0002E0 00A8+00 1/1 0/0 0/0 .text calcCoC__11daTagYami_cFR4cXyz */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void daTagYami_c::calcCoC(cXyz& param_0) { - nofralloc -#include "asm/rel/d/a/tag/d_a_tag_yami/d_a_tag_yami/calcCoC__11daTagYami_cFR4cXyz.s" +void daTagYami_c::calcCoC(cXyz& i_dst) { + cXyz base(0.0f, 0.0f, 430.0f); + mDoMtx_stack_c::ZXYrotS(csXyz(0, -0x7f96, 0)); + mDoMtx_stack_c::multVec(&base, &base); + i_dst = home.pos + base; } -#pragma pop /* 80D65D08-80D65D0C 000388 0004+00 1/1 0/0 0/0 .text col_set__11daTagYami_cFv */ void daTagYami_c::col_set() { @@ -280,151 +83,79 @@ void daTagYami_c::col_set() { } /* 80D65D0C-80D65D60 00038C 0054+00 1/1 0/0 0/0 .text chk_CoHit__11daTagYami_cFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void daTagYami_c::chk_CoHit() { - nofralloc -#include "asm/rel/d/a/tag/d_a_tag_yami/d_a_tag_yami/chk_CoHit__11daTagYami_cFv.s" +u32 daTagYami_c::chk_CoHit() { + if (!mCoHitValid) { + return 0; + } + + f32 coR = getCoR(); + f32 plDist = getPlDist(); + return plDist < coR; } -#pragma pop /* ############################################################################################## */ -/* 80D66268-80D66270 000058 0008+00 0/1 0/0 0/0 .rodata @3889 */ -#pragma push -#pragma force_active on -SECTION_RODATA static u8 const lit_3889[8] = { - 0x3F, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; -COMPILER_STRIP_GATE(0x80D66268, &lit_3889); -#pragma pop - -/* 80D66270-80D66278 000060 0008+00 0/1 0/0 0/0 .rodata @3890 */ -#pragma push -#pragma force_active on -SECTION_RODATA static u8 const lit_3890[8] = { - 0x40, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; -COMPILER_STRIP_GATE(0x80D66270, &lit_3890); -#pragma pop - -/* 80D66278-80D66280 000068 0008+00 0/1 0/0 0/0 .rodata @3891 */ -#pragma push -#pragma force_active on -SECTION_RODATA static u8 const lit_3891[8] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; -COMPILER_STRIP_GATE(0x80D66278, &lit_3891); -#pragma pop - /* 80D65D60-80D65EEC 0003E0 018C+00 1/1 0/0 0/0 .text getPlDist__11daTagYami_cFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void daTagYami_c::getPlDist() { - nofralloc -#include "asm/rel/d/a/tag/d_a_tag_yami/d_a_tag_yami/getPlDist__11daTagYami_cFv.s" +f32 daTagYami_c::getPlDist() { + cXyz coC(mCoC); + daPy_py_c* py = daPy_getPlayerActorClass(); + cXyz pyPos = fopAcM_GetPosition((fopAc_ac_c*)py); + cXyz diff = pyPos - coC; + return diff.absXZ(); } -#pragma pop /* 80D65EEC-80D65F24 00056C 0038+00 0/0 0/0 1/1 .text onMidnaTagSw__11daTagYami_cFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void daTagYami_c::onMidnaTagSw() { - nofralloc -#include "asm/rel/d/a/tag/d_a_tag_yami/d_a_tag_yami/onMidnaTagSw__11daTagYami_cFv.s" +void daTagYami_c::onMidnaTagSw() { + fopAcM_onSwitch(this, mMTagSw); } -#pragma pop /* 80D65F24-80D65F5C 0005A4 0038+00 0/0 0/0 1/1 .text offMidnaTagSw2__11daTagYami_cFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void daTagYami_c::offMidnaTagSw2() { - nofralloc -#include "asm/rel/d/a/tag/d_a_tag_yami/d_a_tag_yami/offMidnaTagSw2__11daTagYami_cFv.s" +void daTagYami_c::offMidnaTagSw2() { + OS_REPORT("-----------off mtag2 sw!!\n"); + fopAcM_offSwitch(this, mMTagSw2); } -#pragma pop /* 80D65F5C-80D65F7C 0005DC 0020+00 1/0 0/0 0/0 .text daTagYami_Create__FP10fopAc_ac_c */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -static asm void daTagYami_Create(fopAc_ac_c* param_0) { - nofralloc -#include "asm/rel/d/a/tag/d_a_tag_yami/d_a_tag_yami/daTagYami_Create__FP10fopAc_ac_c.s" +int daTagYami_Create(fopAc_ac_c* i_this) { + return static_cast<daTagYami_c*>(i_this)->create(); } -#pragma pop /* 80D65F7C-80D65F9C 0005FC 0020+00 1/0 0/0 0/0 .text daTagYami_Execute__FP10fopAc_ac_c */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -static asm void daTagYami_Execute(fopAc_ac_c* param_0) { - nofralloc -#include "asm/rel/d/a/tag/d_a_tag_yami/d_a_tag_yami/daTagYami_Execute__FP10fopAc_ac_c.s" +int daTagYami_Execute(fopAc_ac_c* i_this) { + return static_cast<daTagYami_c*>(i_this)->Execute(); } -#pragma pop /* 80D65F9C-80D660B8 00061C 011C+00 1/0 0/0 0/0 .text daTagYami_Delete__FP11daTagYami_c */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -static asm void daTagYami_Delete(daTagYami_c* param_0) { - nofralloc -#include "asm/rel/d/a/tag/d_a_tag_yami/d_a_tag_yami/daTagYami_Delete__FP11daTagYami_c.s" +int daTagYami_Delete(daTagYami_c* i_this) { + i_this->~daTagYami_c(); + return 1; } -#pragma pop -/* 80D660B8-80D66100 000738 0048+00 1/0 0/0 0/0 .text __dt__10cCcD_GSttsFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm cCcD_GStts::~cCcD_GStts() { - nofralloc -#include "asm/rel/d/a/tag/d_a_tag_yami/d_a_tag_yami/__dt__10cCcD_GSttsFv.s" -} -#pragma pop - -/* 80D66100-80D6611C 000780 001C+00 1/1 0/0 0/0 .text setCoC__11daTagYami_cF4cXyz */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void daTagYami_c::setCoC(cXyz param_0) { - nofralloc -#include "asm/rel/d/a/tag/d_a_tag_yami/d_a_tag_yami/setCoC__11daTagYami_cF4cXyz.s" -} -#pragma pop - -/* 80D6611C-80D66178 00079C 005C+00 1/0 0/0 0/0 .text __dt__10dCcD_GSttsFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm dCcD_GStts::~dCcD_GStts() { - nofralloc -#include "asm/rel/d/a/tag/d_a_tag_yami/d_a_tag_yami/__dt__10dCcD_GSttsFv.s" -} -#pragma pop - -/* 80D66178-80D661C0 0007F8 0048+00 1/0 0/0 0/0 .text __dt__8cM3dGCylFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm cM3dGCyl::~cM3dGCyl() { - nofralloc -#include "asm/rel/d/a/tag/d_a_tag_yami/d_a_tag_yami/__dt__8cM3dGCylFv.s" -} -#pragma pop +/* ############################################################################################## */ +/* 80D66280-80D662A0 -00001 0020+00 1/0 0/0 0/0 .data l_daTagYami_Method */ +static actor_method_class l_daTagYami_Method = { + (process_method_func)daTagYami_Create, + (process_method_func)daTagYami_Delete, + (process_method_func)daTagYami_Execute, +}; -/* 80D661C0-80D66208 000840 0048+00 1/0 0/0 0/0 .text __dt__8cM3dGAabFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm cM3dGAab::~cM3dGAab() { - nofralloc -#include "asm/rel/d/a/tag/d_a_tag_yami/d_a_tag_yami/__dt__8cM3dGAabFv.s" -} -#pragma pop +/* 80D662A0-80D662D0 -00001 0030+00 0/0 0/0 1/0 .data g_profile_TAG_YAMI */ +extern actor_process_profile_definition g_profile_TAG_YAMI = { + fpcLy_CURRENT_e, // mLayerID + 3, // mListID + fpcPi_CURRENT_e, // mListPrio + PROC_TAG_YAMI, // mProcName + &g_fpcLf_Method.mBase, // sub_method + sizeof(daTagYami_c), // mSize + 0, // mSizeOther + 0, // mParameters + &g_fopAc_Method.base, // sub_method + 21, // mPriority + &l_daTagYami_Method, // sub_method + 0x40000, // mStatus + fopAc_ACTOR_e, // mActorType + fopAc_CULLBOX_CUSTOM_e, // cullType +}; + +#pragma nosyminline on |
