summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorElijah Thomas <42302100+elijah-thomas774@users.noreply.github.com>2026-04-18 14:52:30 -0400
committerGitHub <noreply@github.com>2026-04-18 14:52:30 -0400
commitd3ce7281c6e9ae6644e3670992d417c99043a119 (patch)
treef5192ce8573614612338b22397dca58441e9634b
parent17176e3c8334ea0c46fa293a9c463a02789d6d7b (diff)
parent9f4cf0c308b483556a513d6b438041a47b52a71a (diff)
Merge pull request #307 from elijah-thomas774/remly
dAcEremly_c equivalent. Future Cleanup needed
-rw-r--r--config/SOUE01/rels/d_a_e_remlyNP/symbols.txt152
-rw-r--r--config/SOUE01/symbols.txt24
-rw-r--r--include/d/a/e/d_a_e_remly.h193
-rw-r--r--include/d/a/e/d_a_en_base.h11
-rw-r--r--include/d/a/obj/d_a_obj_base.h13
-rw-r--r--include/d/d_player_act.h9
-rw-r--r--include/d/d_player_mdl.h2
-rw-r--r--include/d/t/d_t_stream.h3
-rw-r--r--include/m/m3d/m_anmmdl.h7
-rw-r--r--include/m/m_angle.h11
-rw-r--r--include/toBeSorted/d_emitter.h2
-rw-r--r--include/toBeSorted/event_manager.h3
-rw-r--r--src/REL/d/a/e/d_a_e_remly.cpp2683
-rw-r--r--src/REL/d/a/e/d_a_e_sm.cpp2
14 files changed, 2988 insertions, 127 deletions
diff --git a/config/SOUE01/rels/d_a_e_remlyNP/symbols.txt b/config/SOUE01/rels/d_a_e_remlyNP/symbols.txt
index d45cf35b..99dce6b4 100644
--- a/config/SOUE01/rels/d_a_e_remlyNP/symbols.txt
+++ b/config/SOUE01/rels/d_a_e_remlyNP/symbols.txt
@@ -8,20 +8,20 @@ __dt__24sFState_c<11dAcEremly_c>Fv = .text:0x00000270; // type:function size:0x5
__dt__27sFStateFct_c<11dAcEremly_c>Fv = .text:0x000002D0; // type:function size:0x6C
__dt__80sStateMgr_c<11dAcEremly_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x00000340; // type:function size:0xA0
__dt__50sFStateMgr_c<11dAcEremly_c,20sStateMethodUsr_FI_c>Fv = .text:0x000003E0; // type:function size:0xA4
-fn_177_490 = .text:0x00000490; // type:function size:0x58
-fn_177_4F0 = .text:0x000004F0; // type:function size:0x58
-fn_177_550 = .text:0x00000550; // type:function size:0x5C
-fn_177_5B0 = .text:0x000005B0; // type:function size:0xD8
-fn_177_690 = .text:0x00000690; // type:function size:0x104
-fn_177_7A0 = .text:0x000007A0; // type:function size:0x498
+__dt__15dShadowCircle_cFv = .text:0x00000490; // type:function size:0x58
+__dt__Q211dAcEremly_c10callback_cFv = .text:0x000004F0; // type:function size:0x58
+__dt__14dWaterEffect_cFv = .text:0x00000550; // type:function size:0x5C
+timingB__Q211dAcEremly_c10callback_cFUlPQ34nw4r3g3d13WorldMtxManipQ34nw4r3g3d6ResMdl = .text:0x000005B0; // type:function size:0xD8
+createHeap__11dAcEremly_cFv = .text:0x00000690; // type:function size:0x104
+actorCreate__11dAcEremly_cFv = .text:0x000007A0; // type:function size:0x498
changeState__80sStateMgr_c<11dAcEremly_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>FRC12sStateIDIf_c = .text:0x00000C40; // type:function size:0x10
-fn_177_C50 = .text:0x00000C50; // type:function size:0x10C
-fn_177_D60 = .text:0x00000D60; // type:function size:0x8
-fn_177_D70 = .text:0x00000D70; // type:function size:0x108C
+actorPostCreate__11dAcEremly_cFv = .text:0x00000C50; // type:function size:0x10C
+doDelete__11dAcEremly_cFv = .text:0x00000D60; // type:function size:0x8
+actorExecute__11dAcEremly_cFv = .text:0x00000D70; // type:function size:0x108C
executeState__80sStateMgr_c<11dAcEremly_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x00001E00; // type:function size:0x10
getStateID__80sStateMgr_c<11dAcEremly_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x00001E10; // type:function size:0x10
-fn_177_1E20 = .text:0x00001E20; // type:function size:0x1C
-fn_177_1E40 = .text:0x00001E40; // type:function size:0x24C
+calcTimer<Us>__4sLibFPUs_Us = .text:0x00001E20; // type:function size:0x1C
+draw__11dAcEremly_cFv = .text:0x00001E40; // type:function size:0x24C
initializeState_Wait__11dAcEremly_cFv = .text:0x00002090; // type:function size:0x104
executeState_Wait__11dAcEremly_cFv = .text:0x000021A0; // type:function size:0x478
finalizeState_Wait__11dAcEremly_cFv = .text:0x00002620; // type:function size:0x4
@@ -94,33 +94,33 @@ finalizeState_NightJumpAttack__11dAcEremly_cFv = .text:0x00006860; // type:funct
initializeState_BirthWait__11dAcEremly_cFv = .text:0x00006870; // type:function size:0x7C
executeState_BirthWait__11dAcEremly_cFv = .text:0x000068F0; // type:function size:0x13C
finalizeState_BirthWait__11dAcEremly_cFv = .text:0x00006A30; // type:function size:0x4
-fn_177_6A40 = .text:0x00006A40; // type:function size:0xCC
-fn_177_6B10 = .text:0x00006B10; // type:function size:0x38C
-fn_177_6EA0 = .text:0x00006EA0; // type:function size:0x120
-fn_177_6FC0 = .text:0x00006FC0; // type:function size:0x78
-fn_177_7040 = .text:0x00007040; // type:function size:0x2EC
-fn_177_7330 = .text:0x00007330; // type:function size:0x90
-fn_177_73C0 = .text:0x000073C0; // type:function size:0x144
-fn_177_7510 = .text:0x00007510; // type:function size:0xC8
-fn_177_75E0 = .text:0x000075E0; // type:function size:0x6C
-fn_177_7650 = .text:0x00007650; // type:function size:0x164
-fn_177_77C0 = .text:0x000077C0; // type:function size:0x108
-fn_177_78D0 = .text:0x000078D0; // type:function size:0xF4
-fn_177_79D0 = .text:0x000079D0; // type:function size:0x134
-fn_177_7B10 = .text:0x00007B10; // type:function size:0x1B4
-AcERemly__handleRemlitEventsMaybe2 = .text:0x00007CD0; // type:function size:0x844
-fn_177_8520 = .text:0x00008520; // type:function size:0xD8
-fn_177_8600 = .text:0x00008600; // type:function size:0xC0
-fn_177_86C0 = .text:0x000086C0; // type:function size:0x2B4
-fn_177_8980 = .text:0x00008980; // type:function size:0x13C
-fn_177_8AC0 = .text:0x00008AC0; // type:function size:0x160
-fn_177_8C20 = .text:0x00008C20; // type:function size:0x36C
-fn_177_8F90 = .text:0x00008F90; // type:function size:0x3E0
-fn_177_9370 = .text:0x00009370; // type:function size:0xE8
-fn_177_9460 = .text:0x00009460; // type:function size:0x8
-fn_177_9470 = .text:0x00009470; // type:function size:0x4
-fn_177_9480 = .text:0x00009480; // type:function size:0x4
-fn_177_9490 = .text:0x00009490; // type:function size:0x8
+playWink__11dAcEremly_cFv = .text:0x00006A40; // type:function size:0xCC
+fn_177_6B10__11dAcEremly_cFbRC4mAng = .text:0x00006B10; // type:function size:0x38C
+fn_177_6EA0__11dAcEremly_cFb = .text:0x00006EA0; // type:function size:0x120
+adjustHeadRotation__11dAcEremly_cFb = .text:0x00006FC0; // type:function size:0x78
+fn_177_7040__11dAcEremly_cFUlf = .text:0x00007040; // type:function size:0x2EC
+isScary__11dAcEremly_cFv = .text:0x00007330; // type:function size:0x90
+shouldBeScared__11dAcEremly_cFv = .text:0x000073C0; // type:function size:0x144
+fn_177_7510__11dAcEremly_cFf = .text:0x00007510; // type:function size:0xC8
+fn_177_75E0__11dAcEremly_cFv = .text:0x000075E0; // type:function size:0x6C
+fn_177_7650__11dAcEremly_cCFb = .text:0x00007650; // type:function size:0x164
+fn_177_77C0__11dAcEremly_cFv = .text:0x000077C0; // type:function size:0x108
+fn_177_78D0__11dAcEremly_cFv = .text:0x000078D0; // type:function size:0xF4
+fn_177_79D0__11dAcEremly_cFb = .text:0x000079D0; // type:function size:0x134
+fn_177_7B10__11dAcEremly_cFv = .text:0x00007B10; // type:function size:0x1B4
+nightSleepDemoImpl__11dAcEremly_cFv = .text:0x00007CD0; // type:function size:0x844
+fn_177_8520__11dAcEremly_cFb = .text:0x00008520; // type:function size:0xD8
+fn_177_8600__11dAcEremly_cFv = .text:0x00008600; // type:function size:0xC0
+fn_177_86C0__11dAcEremly_cFv = .text:0x000086C0; // type:function size:0x2B4
+fn_177_8980__11dAcEremly_cFf = .text:0x00008980; // type:function size:0x13C
+fn_177_8AC0__11dAcEremly_cFv = .text:0x00008AC0; // type:function size:0x160
+fn_177_8C20__11dAcEremly_cF4mAng = .text:0x00008C20; // type:function size:0x36C
+fn_177_8F90__11dAcEremly_cFv = .text:0x00008F90; // type:function size:0x3E0
+fn_177_9370__11dAcEremly_cFf = .text:0x00009370; // type:function size:0xE8
+vt_0x88__11dAcEnBase_cFi = .text:0x00009460; // type:function size:0x8
+vt_0x84__11dAcEnBase_cFv = .text:0x00009470; // type:function size:0x4
+vt_0x80__11dAcEnBase_cFv = .text:0x00009480; // type:function size:0x4
+getObjectListEntry__11dAcEnBase_cFv = .text:0x00009490; // type:function size:0x8
__dt__11dAcEremly_cFv = .text:0x000094A0; // type:function size:0x168
build__27sFStateFct_c<11dAcEremly_c>FRC12sStateIDIf_c = .text:0x00009610; // type:function size:0x60
dispose__27sFStateFct_c<11dAcEremly_c>FRP10sStateIf_c = .text:0x00009670; // type:function size:0xC
@@ -196,27 +196,63 @@ lbl_177_data_29C = .data:0x0000029C; // type:object size:0x5 data:string
lbl_177_data_2A4 = .data:0x000002A4; // type:object size:0x64
jumptable_177_data_308 = .data:0x00000308; // type:object size:0x30 scope:local
lbl_177_data_338 = .data:0x00000338; // type:object size:0xB data:string
-lbl_177_data_344 = .data:0x00000344; // type:object size:0x8C
-lbl_177_data_3D0 = .data:0x000003D0; // type:object size:0x30
-lbl_177_data_400 = .data:0x00000400; // type:object size:0x30
-lbl_177_data_430 = .data:0x00000430; // type:object size:0x18
-lbl_177_data_448 = .data:0x00000448; // type:object size:0x18
-lbl_177_data_460 = .data:0x00000460; // type:object size:0x18
-lbl_177_data_478 = .data:0x00000478; // type:object size:0xC
-lbl_177_data_484 = .data:0x00000484; // type:object size:0x64C
+__vt__11dAcEremly_c = .data:0x00000344; // type:object size:0x8C
+__vt__50sFStateMgr_c<11dAcEremly_c,20sStateMethodUsr_FI_c> = .data:0x000003D0; // type:object size:0x30
+__vt__80sStateMgr_c<11dAcEremly_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c> = .data:0x00000400; // type:object size:0x30
+__vt__27sFStateFct_c<11dAcEremly_c> = .data:0x00000430; // type:object size:0x18
+__vt__24sFState_c<11dAcEremly_c> = .data:0x00000448; // type:object size:0x18
+__vt__Q211dAcEremly_c10callback_c = .data:0x00000460; // type:object size:0x18
+__vt__14dWaterEffect_c = .data:0x00000478; // type:object size:0xC
+__vt__15dShadowCircle_c = .data:0x00000484; // type:object size:0x64C
lbl_177_data_AD0 = .data:0x00000AD0; // type:object size:0x34
__global_destructor_chain = .bss:0x00000000; // type:object size:0x4 scope:global
-lbl_177_bss_8 = .bss:0x00000008; // type:object size:0x10 data:4byte
-lbl_177_bss_18 = .bss:0x00000018; // type:object size:0x40 data:4byte
-lbl_177_bss_58 = .bss:0x00000058; // type:object size:0x80 data:4byte
-lbl_177_bss_D8 = .bss:0x000000D8; // type:object size:0x40 data:4byte
-lbl_177_bss_118 = .bss:0x00000118; // type:object size:0x100 data:4byte
-lbl_177_bss_218 = .bss:0x00000218; // type:object size:0x80 data:4byte
-lbl_177_bss_298 = .bss:0x00000298; // type:object size:0x40 data:4byte
-lbl_177_bss_2D8 = .bss:0x000002D8; // type:object size:0x140 data:4byte
-lbl_177_bss_418 = .bss:0x00000418; // type:object size:0x80 data:4byte
-lbl_177_bss_498 = .bss:0x00000498; // type:object size:0x80 data:4byte
-lbl_177_bss_518 = .bss:0x00000518; // type:object size:0x40 data:4byte
-lbl_177_bss_558 = .bss:0x00000558; // type:object size:0xB0 data:4byte
+lbl_177_bss_8 = .bss:0x00000008; // type:object size:0xC scope:local data:4byte
+StateID_Wait__11dAcEremly_c = .bss:0x00000018; // type:object size:0x30 data:4byte
+lbl_177_bss_48 = .bss:0x00000048; // type:object size:0xC scope:local data:4byte
+StateID_Walk__11dAcEremly_c = .bss:0x00000058; // type:object size:0x30 data:4byte
+lbl_177_bss_88 = .bss:0x00000088; // type:object size:0xC scope:local data:4byte
+StateID_Run__11dAcEremly_c = .bss:0x00000098; // type:object size:0x30 data:4byte
+lbl_177_bss_C8 = .bss:0x000000C8; // type:object size:0xC scope:local data:4byte
+StateID_Escape__11dAcEremly_c = .bss:0x000000D8; // type:object size:0x30 data:4byte
+lbl_177_bss_108 = .bss:0x00000108; // type:object size:0xC scope:local data:4byte
+StateID_EscapeDash__11dAcEremly_c = .bss:0x00000118; // type:object size:0x30 data:4byte
+lbl_177_bss_148 = .bss:0x00000148; // type:object size:0xC scope:local data:4byte
+StateID_Wind__11dAcEremly_c = .bss:0x00000158; // type:object size:0x30 data:4byte
+lbl_177_bss_188 = .bss:0x00000188; // type:object size:0xC scope:local data:4byte
+StateID_Hold__11dAcEremly_c = .bss:0x00000198; // type:object size:0x30 data:4byte
+lbl_177_bss_1C8 = .bss:0x000001C8; // type:object size:0xC scope:local data:4byte
+StateID_Jump__11dAcEremly_c = .bss:0x000001D8; // type:object size:0x30 data:4byte
+lbl_177_bss_208 = .bss:0x00000208; // type:object size:0xC scope:local data:4byte
+StateID_Fly__11dAcEremly_c = .bss:0x00000218; // type:object size:0x30 data:4byte
+lbl_177_bss_248 = .bss:0x00000248; // type:object size:0xC scope:local data:4byte
+StateID_Damage__11dAcEremly_c = .bss:0x00000258; // type:object size:0x30 data:4byte
+lbl_177_bss_288 = .bss:0x00000288; // type:object size:0xC scope:local data:4byte
+StateID_Sleep__11dAcEremly_c = .bss:0x00000298; // type:object size:0x30 data:4byte
+lbl_177_bss_2C8 = .bss:0x000002C8; // type:object size:0xC scope:local data:4byte
+StateID_Scared__11dAcEremly_c = .bss:0x000002D8; // type:object size:0x30 data:4byte
+lbl_177_bss_308 = .bss:0x00000308; // type:object size:0xC scope:local data:4byte
+StateID_Stun__11dAcEremly_c = .bss:0x00000318; // type:object size:0x30 data:4byte
+lbl_177_bss_348 = .bss:0x00000348; // type:object size:0xC scope:local data:4byte
+StateID_Water__11dAcEremly_c = .bss:0x00000358; // type:object size:0x30 data:4byte
+lbl_177_bss_388 = .bss:0x00000388; // type:object size:0xC scope:local data:4byte
+StateID_Hear__11dAcEremly_c = .bss:0x00000398; // type:object size:0x30 data:4byte
+lbl_177_bss_3C8 = .bss:0x000003C8; // type:object size:0xC scope:local data:4byte
+StateID_NightSleepDemo__11dAcEremly_c = .bss:0x000003D8; // type:object size:0x30 data:4byte
+lbl_177_bss_408 = .bss:0x00000408; // type:object size:0xC scope:local data:4byte
+StateID_NightFoo__11dAcEremly_c = .bss:0x00000418; // type:object size:0x30 data:4byte
+lbl_177_bss_448 = .bss:0x00000448; // type:object size:0xC scope:local data:4byte
+StateID_NightReflectionFoo__11dAcEremly_c = .bss:0x00000458; // type:object size:0x30 data:4byte
+lbl_177_bss_488 = .bss:0x00000488; // type:object size:0xC scope:local data:4byte
+StateID_NightWait__11dAcEremly_c = .bss:0x00000498; // type:object size:0x30 data:4byte
+lbl_177_bss_4C8 = .bss:0x000004C8; // type:object size:0xC scope:local data:4byte
+StateID_NightWalk__11dAcEremly_c = .bss:0x000004D8; // type:object size:0x30 data:4byte
+lbl_177_bss_508 = .bss:0x00000508; // type:object size:0xC scope:local data:4byte
+StateID_NightRun__11dAcEremly_c = .bss:0x00000518; // type:object size:0x30 data:4byte
+lbl_177_bss_548 = .bss:0x00000548; // type:object size:0xC scope:local data:4byte
+StateID_NightRet__11dAcEremly_c = .bss:0x00000558; // type:object size:0x30 data:4byte
+lbl_177_bss_588 = .bss:0x00000588; // type:object size:0xC scope:local data:4byte
+StateID_NightJumpAttack__11dAcEremly_c = .bss:0x00000598; // type:object size:0x30 data:4byte
+lbl_177_bss_5C8 = .bss:0x000005C8; // type:object size:0xC scope:local data:4byte
+StateID_BirthWait__11dAcEremly_c = .bss:0x000005D8; // type:object size:0x30 data:4byte
lbl_177_bss_608 = .bss:0x00000608; // type:object size:0x4 data:4byte
lbl_177_bss_60C = .bss:0x0000060C; // type:object size:0x14 data:byte
diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt
index 19789f7b..9298e409 100644
--- a/config/SOUE01/symbols.txt
+++ b/config/SOUE01/symbols.txt
@@ -976,7 +976,7 @@ setupEffect__10dEmitter_cFbUsRC7mVec3_cPC7mAng3_cPC7mVec3_cPC8_GXColorPC8_GXColo
setupEffect__10dEmitter_cFbUsRC6mMtx_cPC8_GXColorPC8_GXColor = .text:0x8002A230; // type:function size:0x150
polyAttrsToGroundEffectIdx__14dJEffManager_cFll = .text:0x8002A380; // type:function size:0xCC
spawnGroundEffect__14dJEffManager_cFRC7mVec3_cUcUcRC7mVec3_clff = .text:0x8002A450; // type:function size:0x1C0
-fn_8002A610 = .text:0x8002A610; // type:function size:0x678
+spawnHitMarkEffect__14dJEffManager_cFiR8cCcD_ObjPC7mVec3_cb = .text:0x8002A610; // type:function size:0x678
fn_8002AC90 = .text:0x8002AC90; // type:function size:0x460
vt_0x1C0__17daPlayerActBase_cCFv = .text:0x8002B0F0; // type:function size:0x8
init__14dWaterEffect_cFP12dAcObjBase_cfff = .text:0x8002B100; // type:function size:0x14
@@ -1153,7 +1153,7 @@ preDraw__11dAcEnBase_cFv = .text:0x8002F540; // type:function size:0x74
fn_8002F5C0 = .text:0x8002F5C0; // type:function size:0x110
checkBeetleActorReferences__17daPlayerActBase_cFl = .text:0x8002F6D0; // type:function size:0x8
getBeetleActorReferencesSize__17daPlayerActBase_cFv = .text:0x8002F6E0; // type:function size:0x8
-fn_8002F6F0 = .text:0x8002F6F0; // type:function size:0xC
+getBombWithinRadius__17daPlayerActBase_cFP9dAcBase_cRC7mVec3_cf = .text:0x8002F6F0; // type:function size:0xC
fn_8002F700 = .text:0x8002F700; // type:function size:0x8
fn_8002F710 = .text:0x8002F710; // type:function size:0x110
checkRefArrayAtIndex__17daPlayerActBase_cFv = .text:0x8002F820; // type:function size:0x8
@@ -1172,12 +1172,12 @@ fn_8002FBF0 = .text:0x8002FBF0; // type:function size:0x20
fn_8002FC10 = .text:0x8002FC10; // type:function size:0xF4
someEnemyDamageCollisionStuffMaybe__11dAcEnBase_cFR19dColliderLinkedListPUs = .text:0x8002FD10; // type:function size:0x7C
fn_8002FD90 = .text:0x8002FD90; // type:function size:0x4C
-fn_8002FDE0 = .text:0x8002FDE0; // type:function size:0x170
+fn_8002FDE0__11dAcEnBase_cFR8cCcD_ObjPUs = .text:0x8002FDE0; // type:function size:0x170
fn_8002FF50 = .text:0x8002FF50; // type:function size:0xD4
-fn_80030030 = .text:0x80030030; // type:function size:0x174
-fn_800301B0 = .text:0x800301B0; // type:function size:0x1D4
+fn_80030030__11dAcEnBase_cFRC7mVec3_cRsRsf = .text:0x80030030; // type:function size:0x174
+fn_800301b0__11dAcEnBase_cFRC7mVec3_c4mAngbf = .text:0x800301B0; // type:function size:0x1D4
fn_80030390 = .text:0x80030390; // type:function size:0x64
-fn_80030400 = .text:0x80030400; // type:function size:0x168
+fn_80030400__11dAcEnBase_cFRQ23m3d5mdl_cUcbUc = .text:0x80030400; // type:function size:0x168
fn_80030570 = .text:0x80030570; // type:function size:0x144
fn_800306C0 = .text:0x800306C0; // type:function size:0x10
fn_800306D0 = .text:0x800306D0; // type:function size:0x24
@@ -1186,7 +1186,7 @@ fn_80030730 = .text:0x80030730; // type:function size:0xB0
fn_800307E0 = .text:0x800307E0; // type:function size:0x34
fn_80030820 = .text:0x80030820; // type:function size:0x14
fn_80030840 = .text:0x80030840; // type:function size:0x13C
-fn_80030980 = .text:0x80030980; // type:function size:0x188
+fn_80030980__11dAcEnBase_cFRQ23m3d5mdl_clb = .text:0x80030980; // type:function size:0x188
fn_80030B10 = .text:0x80030B10; // type:function size:0x10C
fn_80030c20__11dAcEnBase_cFUlffff = .text:0x80030C20; // type:function size:0x28
fn_80030C50 = .text:0x80030C50; // type:function size:0x8
@@ -2722,7 +2722,7 @@ getBodyMtx__19daPlayerModelBase_cFP6mMtx_ci = .text:0x800614F0; // type:function
getCurrentCarriedActor__19daPlayerModelBase_cFv = .text:0x80061510; // type:function size:0x8 scope:weak
vt_0x0F4__19daPlayerModelBase_cCFv = .text:0x80061520; // type:function size:0x8 scope:weak
vt_0x0F0__19daPlayerModelBase_cCFv = .text:0x80061530; // type:function size:0x8 scope:weak
-vt_0x0EC__19daPlayerModelBase_cCFv = .text:0x80061540; // type:function size:0x8 scope:weak
+getHeadTranslation__19daPlayerModelBase_cCFv = .text:0x80061540; // type:function size:0x8 scope:weak
vt_0x0E8__19daPlayerModelBase_cCFv = .text:0x80061550; // type:function size:0x8 scope:weak
getCenterTranslation__19daPlayerModelBase_cCFv = .text:0x80061560; // type:function size:0x8 scope:weak
canBlockAttack__19daPlayerModelBase_cFv = .text:0x80061570; // type:function size:0x8 scope:weak
@@ -3545,7 +3545,7 @@ ActorEventRelated__isInEvent = .text:0x8009D950; // type:function size:0x54
isThisActorInEvent__17ActorEventRelatedFv = .text:0x8009D9B0; // type:function size:0x5C
fn_8009DA10 = .text:0x8009DA10; // type:function size:0x30
fn_8009DA40 = .text:0x8009DA40; // type:function size:0x40
-getSkipOnlyEvent = .text:0x8009DA80; // type:function size:0xC
+getSkipOnlyEvent__12EventManagerFv = .text:0x8009DA80; // type:function size:0xC
EventManager__ctorCont = .text:0x8009DA90; // type:function size:0x11C
fn_8009DBB0 = .text:0x8009DBB0; // type:function size:0x128
startEventManager = .text:0x8009DCE0; // type:function size:0x280
@@ -3566,7 +3566,7 @@ fn_8009EEA0 = .text:0x8009EEA0; // type:function size:0x53C
alsoSetAsCurrentEvent__12EventManagerFP9dAcBase_cP5EventPv = .text:0x8009F3E0; // type:function size:0x470
fn_8009F850 = .text:0x8009F850; // type:function size:0x134
fn_8009F990__12EventManagerFv = .text:0x8009F990; // type:function size:0x80
-fn_8009FA10 = .text:0x8009FA10; // type:function size:0x8
+fn_8009FA10__12EventManagerFP9dAcBase_cP5EventPv = .text:0x8009FA10; // type:function size:0x8
attachSkipEvent = .text:0x8009FA20; // type:function size:0x1A0
setEvent__12EventManagerFP9dAcBase_cP5EventP9dAcBase_c = .text:0x8009FBC0; // type:function size:0x120
changeOwnEvent__12EventManagerFP9dAcBase_cP9dAcBase_cP5Eventi = .text:0x8009FCE0; // type:function size:0x11C
@@ -3594,7 +3594,7 @@ getCurrentEventActorBasedOnGroup = .text:0x800A0890; // type:function size:0x58
fn_800A08F0__12EventManagerFQ27fBase_c12GROUP_TYPE_e = .text:0x800A08F0; // type:function size:0x58
checkButton2HeldForCutscenes = .text:0x800A0950; // type:function size:0x60
canSkipCurrentEvent__12EventManagerFv = .text:0x800A09B0; // type:function size:0x1D0
-fn_800A0B80 = .text:0x800A0B80; // type:function size:0x10
+fn_800A0B80__12EventManagerFv = .text:0x800A0B80; // type:function size:0x10
eventRelatedStateFlags_shift0x11_1__12EventManagerFv = .text:0x800A0B90; // type:function size:0x10
fn_800A0BA0 = .text:0x800A0BA0; // type:function size:0x94
__ct__5EventFPCcUlUlPvPv = .text:0x800A0C40; // type:function size:0xEC
@@ -10411,7 +10411,7 @@ GoddessChestsOpenedCounter__init_vtable = .text:0x801947A0; // type:function siz
GoddessChestsOpenedCounter__dtor = .text:0x801947C0; // type:function size:0x58
GoddessChestsOpenedCounter__getMaxGoddessChests = .text:0x80194820; // type:function size:0x8
GoddessChestsOpenedCounter__init = .text:0x80194830; // type:function size:0x3C
-angleToRotate = .text:0x80194870; // type:function size:0x194
+getForce__11dTgStream_cFRC7mVec3_cR7mVec3_cRC9fLiMgBa_c = .text:0x80194870; // type:function size:0x194
fn_80194A10 = .text:0x80194A10; // type:function size:0xC
getStatueType__10dAcOSave_cCFv = .text:0x80194A20; // type:function size:0xC
getStatueNameId__10dAcOSave_cCFv = .text:0x80194A30; // type:function size:0x24
diff --git a/include/d/a/e/d_a_e_remly.h b/include/d/a/e/d_a_e_remly.h
index c958e582..7935e323 100644
--- a/include/d/a/e/d_a_e_remly.h
+++ b/include/d/a/e/d_a_e_remly.h
@@ -1,14 +1,80 @@
#ifndef D_A_E_REMLY_H
#define D_A_E_REMLY_H
+#include "common.h"
+#include "d/a/d_a_base.h"
#include "d/a/e/d_a_en_base.h"
+#include "d/col/bg/d_bg_s_acch.h"
+#include "d/col/cc/d_cc_d.h"
+#include "d/d_shadow.h"
+#include "m/m3d/m_anmtexpat.h"
+#include "m/m3d/m_mdl.h"
+#include "m/m_angle.h"
+#include "m/m_vec.h"
#include "s/s_State.hpp"
+#include "toBeSorted/d_d3d.h"
+#include "toBeSorted/d_emitter.h"
+class dAcBomb_c;
+class dAcNpcSkn2_c;
class dAcEremly_c : public dAcEnBase_c {
public:
+ class callback_c : public m3d::callback_c {
+ public:
+ virtual ~callback_c() {}
+ virtual void timingB(u32, nw4r::g3d::WorldMtxManip *, nw4r::g3d::ResMdl) override;
+
+ /* 0x04 */ mAng3_c mHeadRotation;
+ /* 0x0C */ UNKWORD field_0x0C; // Guess
+ };
+
+ enum State_e {
+ STATE_0 = 0,
+ STATE_1 = 1,
+ STATE_2 = 2,
+ STATE_3 = 3,
+ STATE_4 = 4,
+ STATE_5 = 5,
+ STATE_6 = 6,
+ STATE_7 = 7,
+ STATE_8 = 8,
+ STATE_9 = 9,
+ STATE_10 = 10,
+ STATE_11 = 11,
+ STATE_12 = 12,
+ STATE_13 = 13,
+ STATE_14 = 14,
+ STATE_15 = 15,
+ STATE_16 = 16,
+ STATE_17 = 17,
+ STATE_18 = 18,
+ STATE_19 = 19,
+ STATE_20 = 20,
+ STATE_21 = 21,
+ STATE_22 = 22,
+ STATE_23 = 23,
+ STATE_24 = 24,
+ STATE_25 = 25,
+ STATE_26 = 26,
+ STATE_27 = 27,
+ STATE_28 = 28,
+ STATE_29 = 29,
+ STATE_30 = 30,
+ STATE_31 = 31,
+ STATE_32 = 32,
+ };
+
+public:
dAcEremly_c() : mStateMgr(*this) {}
virtual ~dAcEremly_c() {}
+ virtual int doDelete() override;
+ virtual int draw() override;
+ virtual bool createHeap() override;
+ virtual int actorCreate() override;
+ virtual int actorPostCreate() override;
+ virtual int actorExecute() override;
+
STATE_FUNC_DECLARE(dAcEremly_c, Wait);
STATE_FUNC_DECLARE(dAcEremly_c, Walk);
STATE_FUNC_DECLARE(dAcEremly_c, Run);
@@ -34,8 +100,133 @@ public:
STATE_FUNC_DECLARE(dAcEremly_c, NightJumpAttack);
STATE_FUNC_DECLARE(dAcEremly_c, BirthWait);
+ bool isState(State_e state) {
+ return field_0xB60 == (u32)state;
+ }
+
+ STATE_MGR_DEFINE_UTIL_EXECUTESTATE(dAcEremly_c);
+ STATE_MGR_DEFINE_UTIL_ISSTATE(dAcEremly_c);
+ STATE_MGR_DEFINE_UTIL_CHANGESTATE(dAcEremly_c);
+
private:
- /* 0x??? */ STATE_MGR_DECLARE(dAcEremly_c);
+ void playWink();
+ bool fn_177_6B10(bool lookAtTarget, const mAng &);
+ void fn_177_6EA0(bool);
+ void adjustHeadRotation(bool);
+
+ bool fn_177_7040(u32, f32);
+
+ bool isScary();
+
+ bool shouldBeScared();
+
+ bool fn_177_7510(f32);
+
+ bool fn_177_75E0();
+
+ /** false -> comapres to camera
+ * true -> compares to player */
+ bool fn_177_7650(bool comparePlayer) const;
+
+ void fn_177_77C0();
+
+ // Set Scary Face
+ void fn_177_78D0();
+
+ void fn_177_79D0(bool);
+
+ bool fn_177_7B10();
+ void nightSleepDemoImpl();
+
+ void fn_177_8520(bool);
+ void fn_177_8600();
+ bool fn_177_86C0();
+ bool fn_177_8980(f32);
+ bool fn_177_8AC0();
+ bool fn_177_8C20(mAng);
+ bool fn_177_8F90();
+ bool fn_177_9370(f32);
+
+private:
+ /* 0x378 */ STATE_MGR_DECLARE(dAcEremly_c);
+
+ /* 0x3B4 */ dShadowCircle_c mShadow;
+ /* 0x3BC */ d3d::AnmMdlWrapper mMdl;
+ /* 0x438 */ m3d::anmTexPat_c mTexPat;
+
+ /* 0x458 */ dBgS_AcchCir mAcchCir;
+ /* 0x3B4 */ dBgS_ObjAcch mAcch;
+ /* 0x864 */ dCcD_Sph mSph;
+
+ /* 0x9B4 */ callback_c mMdlCallback;
+
+ /* 0x9C4 */ dEmitter_c mEmitters[2];
+
+ /* 0xA2C */ dAcRef_c<dAcNpcSkn2_c> mRef1; // Temporary until type known
+ /* 0xA38 */ dAcRef_c<dAcBomb_c> mNearbyBombRef;
+
+ /* 0xA44 */ mVec3_c mTargetPosition;
+ /* 0xA50 */ mVec3_c field_0xA50;
+
+ /* 0xA5C */ dWaterEffect_c mWaterEffect;
+
+ /* 0xAA4 */ mVec3_c field_0xAA4;
+ /* 0xAB0 */ mVec3_c field_0xAB0;
+ /* 0xABC */ mVec3_c field_0xABC;
+ /* 0xAC8 */ mVec3_c field_0xAC8;
+ /* 0xAD4 */ mVec3_c field_0xAD4;
+ /* 0xAE0 */ mVec3_c field_0xAE0;
+ /* 0xAEC */ mVec3_c field_0xAEC;
+ /* 0xAF8 */ mVec3_c field_0xAF8;
+
+ /* 0xB04 */ f32 field_0xB04;
+ /* 0xB08 */ f32 field_0xB08;
+ /* 0xB0C */ f32 field_0xB0C;
+ /* 0xB10 */ f32 field_0xB10;
+ /* 0xB14 */ s32 field_0xB14;
+ /* 0xB18 */ u32 field_0xB18;
+ /* 0xB1C */ u8 _B1C[0xB1E - 0xB1C];
+ /* 0xB1E */ mAng3_c field_0xB1E;
+ /* 0xB24 */ s16 field_0xB24;
+ /* 0xB26 */ s16 field_0xB26;
+ /* 0xB26 */ u32 field_0xB28;
+ /* 0xB2C */ s32 field_0xB2C;
+ /* 0xB30 */ mAng field_0xB30;
+ /* 0xB32 */ mAng field_0xB32;
+ /* 0xB34 */ mAng field_0xB34;
+ /* 0xB38 */ f32 field_0xB38;
+ /* 0xB3C */ f32 field_0xB3C;
+ /* 0xB40 */ f32 field_0xB40;
+ /* 0xB44 */ u16 field_0xB44;
+ /* 0xB46 */ u16 field_0xB46;
+ /* 0xB48 */ u16 field_0xB48;
+ /* 0xB4A */ u16 mWinkTimer;
+ /* 0xB4C */ u16 field_0xB4C;
+ /* 0xB4E */ u16 field_0xB4E;
+ /* 0xB50 */ u16 field_0xB50;
+ /* 0xB52 */ u16 field_0xB52;
+ /* 0xB54 */ u16 field_0xB54;
+ /* 0xB56 */ u16 field_0xB56;
+ /* 0xB58 */ u16 field_0xB58;
+ /* 0xB5A */ u16 field_0xB5A;
+ /* 0xB5C */ u16 field_0xB5C;
+ /* 0xB5E */ u16 field_0xB5E;
+ /* 0xB60 */ u8 field_0xB60; // Some State representation
+ /* 0xB61 */ u8 field_0xB61;
+ /* 0xB62 */ u8 mSleepDemoPlayedSceneflag;
+ /* 0xB63 */ u8 field_0xB63;
+ /* 0xB64 */ u8 field_0xB64;
+ /* 0xB65 */ u8 field_0xB65;
+ /* 0xB66 */ u8 field_0xB66;
+ /* 0xB67 */ u8 field_0xB67;
+ /* 0xB68 */ u8 field_0xB68;
+ /* 0xB69 */ u8 field_0xB69;
+ /* 0xB6A */ u8 field_0xB6A;
+ /* 0xB6B */ u8 field_0xB6B;
+ /* 0xB6C */ u8 field_0xB6C;
+ /* 0xB6D */ u8 field_0xB6D;
+ /* 0xB6E */ u8 field_0xB6E;
+ /* 0xB6F */ u8 field_0xB6F;
};
#endif
diff --git a/include/d/a/e/d_a_en_base.h b/include/d/a/e/d_a_en_base.h
index 328992a1..4424cfdf 100644
--- a/include/d/a/e/d_a_en_base.h
+++ b/include/d/a/e/d_a_en_base.h
@@ -5,6 +5,7 @@
#include "d/a/obj/d_a_obj_base.h"
#include "d/a/obj/d_a_obj_bomb.h"
#include "d/d_cc.h"
+#include "m/m3d/m_mdl.h"
#include "m/m_angle.h"
#include "m/m_vec.h"
@@ -22,6 +23,7 @@ public:
INTERACT_0x4 = (1 << 2),
INTERACT_0x40 = (1 << 6),
INTERACT_0x1000 = (1 << 12),
+ INTERACT_0x2000 = (1 << 13),
};
public:
@@ -68,13 +70,16 @@ public:
// Deals with dealing damage to Enemy
// Returns a value 0-13 (similar to mStts rank?)
- int fn_8002fde0(cCcD_Obj &mCc, u16 *pTgOut);
-
+ int fn_8002FDE0(cCcD_Obj &mCc, u16 *pTgOut);
+ void fn_80030030(const mVec3_c &pos, s16 &, s16 &, f32);
// Returns 0-3 based on collision
- // 2
int fn_800301b0(const mVec3_c &pos, mAng ang, bool, f32);
+ void fn_80030400(m3d::mdl_c &, u8, bool, u8);
void fn_800306d0();
void fn_80030700();
+
+ static void fn_80030980(m3d::mdl_c &, s32, bool markDirty);
+
void fn_80030c20(u32 flags, f32, f32, f32, f32);
s32 someEnemyDamageCollisionStuffMaybe(dColliderLinkedList &list, u16 *pOutFlags);
diff --git a/include/d/a/obj/d_a_obj_base.h b/include/d/a/obj/d_a_obj_base.h
index 57f1222a..ff29770a 100644
--- a/include/d/a/obj/d_a_obj_base.h
+++ b/include/d/a/obj/d_a_obj_base.h
@@ -95,6 +95,15 @@ public:
mVec3_c &getOldPosition() {
return mOldPosition;
}
+ void setOldPosition(const mVec3_c &v) {
+ mOldPosition = v;
+ }
+ mVec3_c &getStartingPosition() {
+ return mStartingPos;
+ }
+ void setStartingPosition(const mVec3_c &v) {
+ mStartingPos = v;
+ }
mVec3_c &getVelocity() {
return mVelocity;
}
@@ -102,6 +111,10 @@ public:
return mAngle;
}
+ void setStartingRotation(const mAng3_c &v) {
+ mStartingRot = v;
+ }
+
f32 getVelocityMag() const {
return fabsf(nw4r::math::VEC3LenSq(mVelocity));
}
diff --git a/include/d/d_player_act.h b/include/d/d_player_act.h
index a360676f..1d4a0096 100644
--- a/include/d/d_player_act.h
+++ b/include/d/d_player_act.h
@@ -1,6 +1,8 @@
#ifndef D_A_PLAYER_ACT_H
#define D_A_PLAYER_ACT_H
+#include "d/a/d_a_base.h"
+#include "d/a/obj/d_a_obj_bomb.h"
#include "d/d_player_base.h"
#include "m/m_vec.h"
@@ -93,7 +95,7 @@ public:
// unused; overridden by daPlayerModelBase_c
return mVec3_c::Zero;
}
- /* vt 0x0EC */ virtual const mVec3_c &vt_0x0EC() const {
+ /* vt 0x0EC */ virtual const mVec3_c &getHeadTranslation() const {
// unused; overridden by daPlayerModelBase_c
return mVec3_c::Zero;
}
@@ -413,7 +415,7 @@ public:
/* vt 0x2A8 */ virtual void lookTowardItem() {}
/* vt 0x2AC */ virtual void vt_0x2AC() {}
/* vt 0x2B0 */ virtual void vt_0x2B0() {}
- /* vt 0x2B4 */ virtual void triggerMoveEventMaybe(u32, u32, u32, const mVec3_c *, const mAng&, u32, u32) {}
+ /* vt 0x2B4 */ virtual void triggerMoveEventMaybe(u32, u32, u32, const mVec3_c *, const mAng &, u32, u32) {}
/* vt 0x2B8 */ virtual void setActorRef9() {}
/* vt 0x2BC */ virtual void unlinkActorRef9() {}
/* vt 0x2C0 */ virtual bool vt_0x2C0() {
@@ -654,6 +656,9 @@ public:
return sCurrentSword;
}
+ // Checks through beetle actor references and
+ static dAcBomb_c *getBombWithinRadius(dAcBase_c *, const mVec3_c &, f32);
+
static bool isInEvent();
bool isAttackingLeft() const;
bool isAttackingRight() const;
diff --git a/include/d/d_player_mdl.h b/include/d/d_player_mdl.h
index c52ab8f6..a01d0a5a 100644
--- a/include/d/d_player_mdl.h
+++ b/include/d/d_player_mdl.h
@@ -824,7 +824,7 @@ public:
/* vt 0x0E8 */ virtual const mVec3_c &vt_0x0E8() const override {
return field_0x12F4;
}
- /* vt 0x0EC */ virtual const mVec3_c &vt_0x0EC() const override {
+ /* vt 0x0EC */ virtual const mVec3_c &getHeadTranslation() const override {
return mHeadTranslation;
}
/* vt 0x0F0 */ virtual const mVec3_c &vt_0x0F0() const override {
diff --git a/include/d/t/d_t_stream.h b/include/d/t/d_t_stream.h
index ef32391f..9a52f1d9 100644
--- a/include/d/t/d_t_stream.h
+++ b/include/d/t/d_t_stream.h
@@ -5,6 +5,7 @@
#include "f/f_list_mg.h"
#include "f/f_list_nd.h"
#include "m/m_mtx.h"
+#include "m/m_vec.h"
class dTgStream_c : public dTg_c {
public:
@@ -21,6 +22,8 @@ public:
void addToList(fLiMgBa_c &list);
+ static bool getForce(const mVec3_c &position, mVec3_c &force, const fLiMgBa_c &list = sStreamList);
+
private:
/* 0x0FC */ u8 mSceneflag; ///< Sceneflag to indicate when to flow
/* 0x0FD */ u8 mAreaIdx;
diff --git a/include/m/m3d/m_anmmdl.h b/include/m/m3d/m_anmmdl.h
index cb8ec945..29cf6e2e 100644
--- a/include/m/m3d/m_anmmdl.h
+++ b/include/m/m3d/m_anmmdl.h
@@ -60,6 +60,13 @@ public:
void setAnmFile(void *data) {
mAnmFile = nw4r::g3d::ResFile(data);
}
+ nw4r::g3d::ResFile getAnmFile() {
+ return mAnmFile;
+ }
+
+ nw4r::g3d::ResFile getMdlFile() {
+ return mMdlFile;
+ }
protected:
nw4r::g3d::ResFile mMdlFile;
diff --git a/include/m/m_angle.h b/include/m/m_angle.h
index 1de484bc..bd3e30f3 100644
--- a/include/m/m_angle.h
+++ b/include/m/m_angle.h
@@ -53,6 +53,11 @@ public:
return *this;
}
+ template <typename T>
+ bool operator==(const T other) {
+ return mVal == other;
+ }
+
public:
static s32 abs(const mAng b) {
return labs(b);
@@ -63,6 +68,12 @@ public:
s32 absDiff(const mAng &other) const {
return sLib::absDiff(mVal, other.mVal);
}
+ // NOTE: Try not to use this one...
+ // May need a better home in future.
+ template <typename T>
+ static s32 absDiff2(T a, T b) {
+ return abs(a - b);
+ }
f32 sin() const {
return nw4r::math::SinIdx(*this);
}
diff --git a/include/toBeSorted/d_emitter.h b/include/toBeSorted/d_emitter.h
index 8f68cd05..8b8ae66f 100644
--- a/include/toBeSorted/d_emitter.h
+++ b/include/toBeSorted/d_emitter.h
@@ -207,7 +207,7 @@ private:
}
public:
- dWaterEffect_c() : mIsInWater(1), mIsSmall(false) {}
+ dWaterEffect_c() : mIsInWater(true), mIsSmall(false) {}
virtual ~dWaterEffect_c() {}
void init(dAcObjBase_c *, f32 height, f32 scale, f32 depth);
diff --git a/include/toBeSorted/event_manager.h b/include/toBeSorted/event_manager.h
index 3f3946ab..929cb869 100644
--- a/include/toBeSorted/event_manager.h
+++ b/include/toBeSorted/event_manager.h
@@ -20,6 +20,9 @@ public:
static bool canSkipCurrentEvent();
static dAcBase_c *getMainActorInEvent();
+ static Event *getSkipOnlyEvent();
+ static bool fn_800A0B80();
+ static void fn_8009FA10(dAcBase_c *actor, Event *event, void *unknown);
static void execute();
static EventManager *sInstance;
diff --git a/src/REL/d/a/e/d_a_e_remly.cpp b/src/REL/d/a/e/d_a_e_remly.cpp
index 85034734..413cc16d 100644
--- a/src/REL/d/a/e/d_a_e_remly.cpp
+++ b/src/REL/d/a/e/d_a_e_remly.cpp
@@ -1,7 +1,116 @@
#include "d/a/e/d_a_e_remly.h"
+#include "c/c_counter.h"
+#include "c/c_lib.h"
+#include "c/c_math.h"
+#include "common.h"
+#include "d/a/d_a_base.h"
+#include "d/a/d_a_player.h"
+#include "d/a/npc/d_a_npc_shinkan2.h"
+#include "d/a/obj/d_a_obj_base.h"
+#include "d/a/obj/d_a_obj_bomb.h"
+#include "d/col/bg/d_bg_s.h"
+#include "d/col/bg/d_bg_s_gnd_chk.h"
+#include "d/col/bg/d_bg_s_wtr_chk.h"
+#include "d/col/c/c_cc_d.h"
+#include "d/col/cc/d_cc_s.h"
+#include "d/d_camera.h"
+#include "d/d_light_env.h"
+#include "d/d_linkage.h"
+#include "d/d_rumble.h"
+#include "d/d_sc_game.h"
+#include "d/d_stage_mgr.h"
+#include "d/d_vec.h"
+#include "d/flag/sceneflag_manager.h"
+#include "d/flag/storyflag_manager.h"
+#include "d/snd/d_snd_wzsound.h"
+#include "d/t/d_t_stream.h"
+#include "f/f_base.h"
+#include "f/f_manager.h"
+#include "f/f_profile_name.h"
+#include "m/m3d/m3d.h"
+#include "m/m3d/m_fanm.h"
+#include "m/m3d/m_smdl.h"
+#include "m/m_angle.h"
+#include "m/m_mtx.h"
+#include "m/m_quat.h"
+#include "m/m_vec.h"
+#include "nw4r/g3d/res/g3d_resanmtexpat.h"
+#include "nw4r/g3d/res/g3d_resfile.h"
+#include "nw4r/g3d/res/g3d_resmdl.h"
+#include "nw4r/g3d/res/g3d_resnode.h"
+#include "nw4r/math/math_arithmetic.h"
+#include "rvl/GX/GXTypes.h"
+#include "s/s_Math.h"
+#include "toBeSorted/attention.h"
+#include "toBeSorted/d_d3d.h"
+#include "toBeSorted/d_emitter.h"
+#include "toBeSorted/event.h"
+#include "toBeSorted/event_manager.h"
+
SPECIAL_ACTOR_PROFILE(E_REMLY, dAcEremly_c, fProfile::E_REMLY, 0xE1, 0, 3);
+static dCcD_SrcSph sSphSrc = {
+ {{
+ AT_TYPE_DAMAGE,
+ 0xD,
+ {0, 0, 0},
+ 2,
+ 0,
+ 0,
+ 0,
+ 0,
+ }, {
+ ~(AT_TYPE_BUGNET | AT_TYPE_BEETLE | AT_TYPE_0x8000 | AT_TYPE_WIND),
+ 0x303,
+ {0, 0, 0x40F},
+ 8,
+ 0,
+ }, {
+ 0xE5,
+ }},
+ {
+ 50.f, },
+};
+
+struct dAcEremly_HIO_c {
+ f32 _0x00;
+ f32 _0x04;
+ f32 _0x08;
+ f32 _0x0C;
+ f32 _0x10;
+ f32 _0x14;
+ f32 _0x18;
+ f32 _0x1C;
+ f32 _0x20;
+ f32 _0x24;
+ f32 _0x28;
+ f32 _0x2C;
+ f32 _0x30;
+ f32 _0x34;
+ f32 _0x38;
+ f32 _0x3C;
+ f32 _0x40;
+ f32 _0x44;
+ s16 _0x48;
+ f32 _0x4C;
+ f32 _0x50;
+ f32 _0x54;
+ f32 _0x58;
+ s16 _0x5C;
+ s16 _0x5E;
+ s16 _0x60;
+ s16 _0x62;
+ s16 _0x64;
+ f32 _0x68;
+ f32 _0x6C;
+ static const dAcEremly_HIO_c sInstance;
+};
+const dAcEremly_HIO_c dAcEremly_HIO_c::sInstance = {
+ 1.f, 1000.f, 500.0f, 200.0f, 120.0f, 250.0f, 400.0f, 400.0f, 600.0f, 0.8f, 5.0f, 20.0f, 10.0f, -8.0f, 20.0f,
+ 7.0f, 15.0f, 50.0f, 30, 1000.f, 300.f, 8.f, 1.3f, 300, 300, 30, 90, 90, 40.f, 0.f,
+};
+
STATE_DEFINE(dAcEremly_c, Wait);
STATE_DEFINE(dAcEremly_c, Walk);
STATE_DEFINE(dAcEremly_c, Run);
@@ -27,75 +136,2553 @@ STATE_DEFINE(dAcEremly_c, NightRet);
STATE_DEFINE(dAcEremly_c, NightJumpAttack);
STATE_DEFINE(dAcEremly_c, BirthWait);
-void dAcEremly_c::initializeState_Wait() {}
-void dAcEremly_c::executeState_Wait() {}
+void dAcEremly_c::callback_c::timingB(u32 nodeId, nw4r::g3d::WorldMtxManip *result, nw4r::g3d::ResMdl resMdl) {
+ static u32 headNode = resMdl.GetResNode("head").GetID();
+
+ if (nodeId == headNode) {
+ mMtx_c m;
+ result->GetMtx(m);
+ m.ZXYrotM(mHeadRotation);
+ result->SetMtx(m);
+ }
+}
+
+bool dAcEremly_c::createHeap() {
+ TRY_CREATE(mMdl.create3(*this, getOarcResFile("Remly"), "Remly", "RemlyWalk", 0x133));
+ fn_80030980(mMdl.getModel(), 1, false);
+
+ mMdl.getModel().setCallback(&mMdlCallback);
+
+ nw4r::g3d::ResFile res = mMdl.getMdlFile();
+ nw4r::g3d::ResMdl resMdl = mMdl.getModel().getResMdl();
+ nw4r::g3d::ResAnmTexPat resTexPat = res.GetResAnmTexPat("RemlyWink");
+
+ bool result;
+ TRY_CREATE2(mTexPat.create(resMdl, resTexPat, &mAllocator, nullptr, 1));
+ mMdl.getModel().setAnm(mTexPat);
+
+ return true;
+}
+
+int dAcEremly_c::actorCreate() {
+ s32 _weird_zero = 0;
+
+ CREATE_ALLOCATOR(dAcEremly_c);
+
+ u8 p = getFromParams(0, 0xF);
+ field_0xB61 = p != 15 ? p : 0;
+ mSleepDemoPlayedSceneflag = getFromParams(4, 0xFF);
+
+ s32 f = getFromParams(12, 0xFF);
+ field_0xB08 = f != 0xFF ? f * 100.f : 1000.f;
+
+ mAcch.Set(this, 1, &mAcchCir);
+
+ mBoundingBox.Set(mVec3_c(-150.f, -700.f, -150.f), mVec3_c(150.f, 150.f, 150.f));
+
+ mAcceleration = -3.f;
+ mMaxSpeed = -60.f;
+ mScale.set(1.f, 1.f, 1.f);
+
+ field_0xB10 = 1.f;
+ field_0xB1E.clear();
+ mStts.SetRank(5);
+ mSph.Set(sSphSrc);
+ mSph.SetStts(mStts);
+
+ mMdlCallback.mHeadRotation.clear();
+
+ mMdl.getModel().setScale(mScale);
+ mMdl.play();
+
+ updateMatrix();
+ mMdl.getModel().setLocalMtx(mWorldMtx);
+ mMdl.getModel().calc(false);
+
+ mSph.ClrAtSet();
+ mLinkage.set(0, 0.f, 0.f, 0.f, nullptr);
+
+ mStartingPos.set(mPosition.x, mPosition.y, mPosition.z);
+ mTargetPosition.set(mPosition.x, mPosition.y, mPosition.z);
+ field_0xB38 = mPosition.y;
+ mStartingRot = mRotation;
+
+ mRef1.unlink();
+ mNearbyBombRef.unlink();
+
+ field_0xB64 = 1;
+ mSph.ClrAtSet(); // Duplicated clear
+
+ mEmitters[0].init(this);
+ mEmitters[1].init(this);
+
+ mWaterEffect.init(this, 100.f, mScale.x * 0.7f, 0.f);
+ mWaterEffect.setIsSmall(true);
+
+ field_0xA50.x = mPosition.x;
+ field_0xA50.y = mPosition.y;
+ field_0xA50.z = mPosition.z;
+ mAcchCir.SetWall(field_0xB10 * 10.f, field_0xB10 * 60.f);
+
+ mAcch.SetField_0xD4(100.f + _weird_zero);
+ field_0xB04 = 60.f;
+
+ if (field_0xB61 == 0) {
+ mAcch.SetGndThinCellingOff();
+ if (dScGame_c::currentSpawnInfo.isNight()) {
+ mTargetFiTextID = 1;
+ } else {
+ mTargetFiTextID = 0;
+ }
+
+ if (!isScary()) {
+ setBattleBgmRelated(0);
+ changeState(StateID_Sleep);
+ mMdl.setAnm("RemlySleep", m3d::PLAY_MODE_4, 0.f);
+ mAcchCir.SetWall(30.f, 50.f);
+ return SUCCEEDED;
+ }
+
+ mScale.set(1.3f, 1.3f, 1.3f);
+
+ field_0xB10 = 1.3f;
+ field_0xB40 = 1.3f;
+
+ field_0xB64 = 2;
+
+ (void)mMdl.getModel().getResMdl();
+ fn_177_78D0();
+
+ field_0xB48 = 24.f + cM::rndF(24.f);
+ if (mSleepDemoPlayedSceneflag == 0xFF ||
+ SceneflagManager::sInstance->checkBoolFlag(mRoomID, mSleepDemoPlayedSceneflag)) {
+ changeState(StateID_NightWait);
+ } else {
+ changeState(StateID_NightSleepDemo);
+ }
+ } else if (field_0xB61 == 1) {
+ setBattleBgmRelated(0);
+ changeState(StateID_Sleep);
+ } else {
+ changeState(StateID_Run);
+ }
+ return SUCCEEDED;
+}
+
+int dAcEremly_c::actorPostCreate() {
+ if (field_0xB61 == 1) {
+ fBase_c *pActor = fManager_c::searchBaseByProfName(fProfile::NPC_SKN2);
+ if (pActor != nullptr) {
+ dAcNpcSkn2_c *pSkn2 = static_cast<dAcNpcSkn2_c *>(pActor);
+ mRef1.link(pSkn2);
+
+ mAcch.ClrRoofNone();
+ if (fn_177_75E0()) {
+ fn_177_79D0(false);
+
+ mRotation.y = mAngle.y = cLib::targetAngleY(mPosition, mStartingPos);
+
+ updateMatrix();
+ mMdl.getModel().setLocalMtx(mWorldMtx);
+ mMdl.getModel().calc(false);
+ changeState(StateID_Wait);
+ return SUCCEEDED;
+ }
+
+ changeState(StateID_Sleep);
+ return SUCCEEDED;
+ }
+
+ mRef1.unlink();
+ field_0xB61 = 0;
+ }
+ return SUCCEEDED;
+}
+
+int dAcEremly_c::doDelete() {
+ return SUCCEEDED;
+}
+
+int dAcEremly_c::actorExecute() {
+ s32 _weird_zero = 0;
+
+ mHealth = 100;
+ nw4r::g3d::ResMdl resMdl = mMdl.getModel().getResMdl();
+
+ mStateMgr.executeState();
+ if (mStateMgr.isState(StateID_BirthWait)) {
+ return SUCCEEDED;
+ }
+
+ if (field_0xB60 == 32) {
+ mSpeed = 0.f;
+
+ if (mMdl.getAnm().isStop()) {
+ mMdl.setAnm("RemlyWaitStand", m3d::PLAY_MODE_4, 4.f);
+ field_0xB60 = 0;
+ field_0xB66 = 1;
+ field_0xB48 = 48.f + cM::rndF(48.f);
+ field_0xB6A = 1;
+ changeState(StateID_Wait);
+ }
+ }
+
+ if (!isState(StateID_Hold)) {
+ mSph.OnCoSet();
+ }
+
+ if ((cCounter_c::GetGameFrame() & 0xF) == 0) {
+ dAcBomb_c *pBomb = dAcPy_c::getBombWithinRadius(this, mPosition, 600.f);
+ if (pBomb != nullptr) {
+ mNearbyBombRef.link(pBomb);
+ field_0xB6C = 1;
+ } else {
+ mNearbyBombRef.unlink();
+ }
+ }
+
+ if (isState(StateID_EscapeDash) || isState(StateID_Water) || isState(StateID_Scared)) {
+ if (fn_177_7650(false)) {
+ if (isScary()) {
+ deleteRequest();
+ return SUCCEEDED;
+ }
+ changeState(StateID_BirthWait);
+ }
+ }
+
+ if (0 == sLib::calcTimer(&field_0xB4E)) {
+ s32 damageTypeMaybe = fn_8002FDE0(mSph, nullptr);
+ switch (damageTypeMaybe) {
+ case 7: {
+ if (isState(StateID_Fly) && field_0xB60 != 20) {
+ if (field_0xB60 == 16) {
+ mMdl.setAnm("RemlyFlyDamage", m3d::PLAY_MODE_4, 4.f);
+ field_0xB60 = 17;
+ field_0xB4E = 48;
+ }
+ } else {
+ if (field_0xB60 == 6) {
+ mMdl.setAnm("RemlySwimDamage", m3d::PLAY_MODE_4, 4.f);
+ field_0xB4E = 90;
+ field_0xB60 = 8;
+ } else {
+ mSph.ClrAtSet();
+ changeState(StateID_Wind);
+ }
+ }
+ } break;
+ case 12: {
+ if (!isState(StateID_Fly) && field_0xB60 != 6 && field_0xB60 != 8) {
+ if (mSph.ChkTgHit() && mSph.ChkTgAtHitType(AT_TYPE_0x80000 | AT_TYPE_SLINGSHOT)) {
+ mAngle.y = getXZAngleToPlayer();
+ mSpeed = -15.f;
+ changeState(StateID_Stun);
+ break;
+ }
+ }
+ }
+ // fallthrough
+ default: {
+ if (damageTypeMaybe != 0) {
+ field_0xB52 = 8;
+ field_0xB4E = 8;
+ dJEffManager_c::spawnHitMarkEffect(6, mSph, nullptr, true);
+
+ if (isState(StateID_Fly) && field_0xB60 != 20) {
+ if (field_0xB60 == 16) {
+ mMdl.setAnm("RemlyFlyDamage", m3d::PLAY_MODE_4, 4.f);
+ field_0xB60 = 17;
+ }
+ } else if (field_0xB60 == 6 || field_0xB60 == 8) {
+ mMdl.setAnm("RemlySwimDamage", m3d::PLAY_MODE_4, 4.f);
+ field_0xB60 = 8;
+ } else {
+ if (field_0xB64 != 0) {
+ field_0xB64--;
+ if (mSph.ChkTgHit() && mSph.ChkTgAtHitType(AT_TYPE_BOMB | AT_TYPE_ARROW)) {
+ field_0xB64 = 0;
+ }
+ }
+ field_0xB6A = 0;
+ mSph.ClrAtSet();
+
+ field_0xB68 = 1;
+ field_0xB6B = 0;
+
+ if (isState(StateID_Scared)) {
+ field_0xB6B = 1;
+ }
+
+ changeState(StateID_Damage);
+ }
+ }
+ } break;
+ }
+ }
+
+ if (!isState(StateID_Hold)) {
+ field_0xAA4.set(mPosition);
+ calcVelocity();
+ mPosition += mVelocity;
+ mPosition += mStts.GetCcMove();
+ mPosition += field_0xAF8;
+ field_0xAF8 *= 0.7f;
+ }
+
+ if (isScary()) {
+ if (field_0xB64 == 0 || fn_177_8AC0()) {
+ if (field_0xB40 != 1.0f) {
+ field_0xB54 = 7;
+ field_0xB40 = 1.f;
+ }
+ } else {
+ if (field_0xB40 != 1.3f) {
+ field_0xB54 = 7;
+ field_0xB40 = 1.3f;
+ }
+ }
+
+ if (0 != sLib::calcTimer(&field_0xB54)) {
+ sLib::addCalcScaledDiff(&field_0xB10, field_0xB40, 1.f, 0.05f);
+ }
+ }
+
+ mScale.set(field_0xB10, field_0xB10, field_0xB10);
+
+ mMdl.getModel().setScale(mScale);
+ mMdl.play();
+ if (!isState(StateID_Hold)) {
+ mAcch.CrrPos(*dBgS::GetInstance());
+ mWaterEffect.execute(mAcch.GetWtrGroundH(), mAcch.GetGroundH());
+ } else {
+ mLinkage.bushTpFunc(mAcch);
+ }
+
+ if (!isState(StateID_Hold) && !isState(StateID_NightSleepDemo) && !isState(StateID_Damage) &&
+ !isState(StateID_Fly) && !isState(StateID_Jump)) {
+ sLib::addCalcAngle(mRotation.y.ref(), mAngle.y, 2, 0x800);
+ }
+
+ if (!isState(StateID_Fly) && !isState(StateID_Hold) && !isState(StateID_BirthWait) && !isState(StateID_Water)) {
+ if (!mAcch.ChkGndHit()) {
+ if (fn_177_8980(100.f) && field_0xB58 == 0) {
+ field_0xB58 = 1;
+ }
+ if (field_0xB58 != 0) {
+ if (field_0xB61 == 1 && !fn_177_75E0() && EventManager::isInEvent()) {
+ setActorProperty(AC_PROP_0x1);
+ mPosition.set(mStartingPos.x, mStartingPos.y, mStartingPos.z);
+ mRotation.y = mStartingRot.y;
+ mAngle.y = mStartingRot.y;
+ changeState(StateID_Sleep);
+ }
+ if ((s32)++field_0xB58 > 30) {
+ changeState(StateID_Fly);
+ }
+ }
+
+ field_0xB38 = mPosition.y;
+ } else {
+ sLib::chase(&field_0xB38, mPosition.y, 10.f);
+ fn_177_8520(false);
+
+ if (field_0xB24 != 0 || field_0xB26 != 0) {
+ field_0xB38 = mPosition.y;
+ }
+ field_0xB58 = 0;
+ }
+ } else {
+ field_0xB26 = 0;
+ field_0xB24 = 0;
+ field_0xB38 = mPosition.y + field_0xB3C;
+ }
+
+ if (!fn_177_7B10() && isState(StateID_Water)) {
+ field_0xB6B = 1;
+ }
+
+ sLib::addCalcAngle(field_0xB1E.x.ref(), field_0xB24, 2, 0x1000);
+ sLib::addCalcAngle(field_0xB1E.z.ref(), field_0xB26, 2, 0x1000);
+
+ mWorldMtx.transS(mPosition.x, field_0xB38, mPosition.z);
+
+ mWorldMtx.XrotM(field_0xB1E.x);
+ mWorldMtx.ZrotM(field_0xB1E.z);
+ mWorldMtx.ZXYrotM(mRotation);
+
+ mMdl.getModel().setLocalMtx(mWorldMtx);
+ mMdl.getModel().calc(false);
+ playWink();
+
+ f32 radius = 40.f + _weird_zero;
+ mVec3_c center;
+
+ center.x = mPosition.x;
+ center.y = mPosition.y;
+ center.z = mPosition.z;
+
+ center.y += 30.f + _weird_zero;
+
+ mMtx_c m;
+ mSph.SetC(center);
+ if (isState(StateID_Fly)) {
+ mMdl.getModel().getNodeWorldMtx(resMdl.GetResNode("backbone3").GetID(), m);
+ m.getTranslation(center);
+ mSph.SetC(center);
+ }
+ mSph.SetR(radius * field_0xB10);
+
+ dCcS::GetInstance()->Set(&mSph);
+
+ if (!(isScary() && field_0xB64) // Check Batreaux Human
+ && !(isState(StateID_Hold) || field_0xB60 == 6) // Hold
+ && !isState(StateID_Stun) && !isState(StateID_Jump)) {
+ AttentionManager::GetInstance()->addPickUpTarget(*this, 3.f * radius * field_0xB10);
+ if (mLinkage.checkConnection(dLinkage_c::CONNECTION_1)) {
+ changeState(StateID_Hold);
+ }
+ }
+
+ if (field_0xB60 == 7) {
+ mMdl.getModel().getNodeWorldMtx(resMdl.GetResNode("backbone02").GetID(), m);
+ m.getTranslation(center);
+
+ mEmitters[1].holdEffect(PARTICLE_RESOURCE_ID_MAPPING_859_, center, nullptr, nullptr, nullptr, nullptr);
+ }
+
+ mPositionCopy2.set(mPosition);
+ mPositionCopy2.y += 30.f;
+
+ mPositionCopy3.set(mPositionCopy2);
+ mPositionCopy3.y += 50.f;
+
+ if (isState(StateID_Fly)) {
+ mPositionCopy3.y += 50.f;
+ }
+
+ if (!isState(StateID_Hold)) {
+ if (!isScary()) {
+ setInteractionFlags(INTERACT_0x2000);
+ }
+ fn_80030c20(3, 600.f, radius, -400.f, 400.f);
+ }
+
+ sLib::calcTimer(&field_0xB52);
+ fn_80030400(mMdl.getModel(), 100, false, field_0xB52);
+ return SUCCEEDED;
+}
+
+/// Ugh
+inline f32 getValue0() {
+ s32 _weird_zero = 0;
+ return _weird_zero + 70.f;
+}
+int dAcEremly_c::draw() {
+ s32 _weird_zero = 0;
+
+ if (mStateMgr.isState(StateID_BirthWait)) {
+ return SUCCEEDED;
+ }
+
+ if (mStateMgr.isState(StateID_Fly)) {
+ if (EventManager::isInEvent()) {
+ if (EventManager::isCurrentEvent("RescuePlayer") || EventManager::isCurrentEvent("RescuePlayerToUpward")) {
+ return SUCCEEDED;
+ }
+ }
+ }
+
+ m3d::smdl_c &mdl = mMdl.getModel();
+ drawModelType1(&mdl);
+
+ // elp
+ static mQuat_c shadow(0.f, getValue0(), 0.f, _weird_zero + 290.f);
+ fn_8002edb0(mShadow, mdl, &shadow, -1, -1, mPosition.y - mAcch.GetGroundH());
+
+ return SUCCEEDED;
+}
+
+void dAcEremly_c::initializeState_Wait() {
+ field_0xB14 = 0;
+ mAcceleration = -3.f;
+
+ fn_177_8520(true);
+
+ if (field_0xB66 || field_0xB6A) {
+ mMdl.setAnm("RemlyWaitStand", m3d::PLAY_MODE_4, 4.f);
+ field_0xB60 = 0;
+
+ field_0xB48 = cM::rndF(48.f) + 48.f;
+ } else {
+ mMdl.setAnm("RemlyWaitSit", m3d::PLAY_MODE_4, 10.f);
+ field_0xB60 = 1;
+
+ field_0xB44 = cM::rndF(128.f) + 128.f;
+ }
+}
+void dAcEremly_c::executeState_Wait() {
+ const dAcPy_c *pPlayer = dAcPy_c::GetLink();
+ if (field_0xB6A == 0) {
+ fn_177_6EA0(false);
+ }
+ sLib::addCalcScaled(&mSpeed, 0.7f, 5.f);
+
+ if (isScary()) {
+ changeState(StateID_EscapeDash);
+ return;
+ }
+
+ if (fn_177_86C0()) {
+ return;
+ }
+
+ if (field_0xB60 == 2) {
+ if (mMdl.getAnm().isStop()) {
+ mMdl.setAnm("RemlyWaitSit", m3d::PLAY_MODE_4, 10.f);
+ field_0xB60 = 1;
+ }
+ return;
+ }
+
+ if (shouldBeScared()) {
+ if (field_0xB6E == 0) {
+ if (fn_800301b0(mPositionCopy2, mRotation.y + 0x8000, true, 140.f) != 0) {
+ field_0xB6E = 1;
+ } else if (isWithinPlayerRadius(600.f) || mNearbyBombRef.isLinked()) {
+ changeState(StateID_Escape);
+ field_0xB6A = 1;
+ } else {
+ fn_177_6B10(false, 0);
+ field_0xB48 = 48.f + cM::rndF(48.f);
+ field_0xB44 = 0x80;
+ if (isWithinPlayerRadius(250.f)) {
+ changeState(StateID_Scared);
+ }
+ }
+ } else if (fn_177_6B10(false, 0)) {
+ changeState(StateID_Escape);
+ field_0xB6A = 1;
+ field_0xB48 = 20;
+ field_0xB44 = 128;
+ } else if (isWithinPlayerRadius(250.f)) {
+ changeState(StateID_Scared);
+ }
+ return;
+ }
+
+ field_0xB6E = 0;
+ fn_177_6B10(false, 0);
+ if (field_0xB56 != 0 || fn_177_8F90()) {
+ return;
+ }
+
+ if (0 == sLib::calcTimer(&field_0xB48) && field_0xB66 != 0) {
+ field_0xB66 = 0;
+ field_0xB6A = 0;
+ field_0xB6E = 0;
+ field_0xB44 = 128.f + cM::rndF(128.f);
+
+ changeState(StateID_Wait);
+ return;
+ }
+
+ if (field_0xB61 == 1) {
+ return;
+ }
+ if (sLib::calcTimer(&field_0xB44)) {
+ return;
+ }
+
+ // Maybe Inline
+ bool coPlayer = false;
+ if (mSph.ChkCoHit()) {
+ coPlayer = true;
+ if (mSph.GetCoActor()->isActorPlayer()) {
+ coPlayer = false;
+ }
+ }
+
+ if (field_0xB50 == 0 && !coPlayer && !fn_177_8C20(getXZAngleToPlayer())) {
+ if (mAng::absDiff2(getXZAngleToPlayer(), mAng(pPlayer->mRotation.y + 0x8000)) > 0x2000) {
+ field_0xB69 = 1;
+ field_0xB67 = 0;
+
+ changeState(StateID_Walk);
+ return;
+ }
+ }
+
+ if (field_0xB60 == 1) {
+ mMdl.setAnm("RemlyWaitSitCry", m3d::PLAY_MODE_4, 10.f);
+ field_0xB60 = 2;
+ }
+ field_0xB44 = 128.f + cM::rndF(128.f);
+}
void dAcEremly_c::finalizeState_Wait() {}
-void dAcEremly_c::initializeState_Walk() {}
-void dAcEremly_c::executeState_Walk() {}
+
+void dAcEremly_c::initializeState_Walk() {
+ if (field_0xB67 != 0 && field_0xB6A == 0) {
+ mMdl.setAnm("RemlyCryWalk", m3d::PLAY_MODE_4, 10.f);
+ field_0xB60 = 3;
+ } else {
+ mMdl.setAnm("RemlyWalk", m3d::PLAY_MODE_4, 10.f);
+ field_0xB60 = 4;
+ }
+
+ // These two values somehow need to be before the RemlyCryWalk data
+ field_0xB32 = 0;
+ field_0xB34 = 0;
+
+ if (field_0xB69 != 0) {
+ fn_177_77C0();
+ }
+ field_0xB14 = 0;
+ field_0xB66 = 1;
+}
+void dAcEremly_c::executeState_Walk() {
+ s32 _weird_zero = 0;
+
+ bool b0 = false;
+ const dAcPy_c *pPlayer = dAcPy_c::GetLink();
+
+ adjustHeadRotation(true);
+
+ if (fn_177_86C0()) {
+ return;
+ }
+
+ if (!field_0xB6A && mAng::absDiff2(getXZAngleToPlayer(), mRotation.y) < 0x4000 && shouldBeScared() &&
+ field_0xB6E == 0) {
+ changeState(StateID_Escape);
+ field_0xB6A = 1;
+ return;
+ }
+
+ if (field_0xB69 != 0) {
+ mMtx_c m;
+ m.YrotS(field_0xB32);
+ mVec3_c in(0.f, 0.f, 180.f), out;
+ m.multVec(in, out);
+ out += pPlayer->mPosition;
+ mTargetPosition.set(out);
+
+ if (fn_177_7040(2, 0.8f)) {
+ field_0xB32 += field_0xB34;
+ }
+ if (mSph.ChkCoHit()) {
+ b0 = true;
+ if (mSph.GetCoActor()->isActorPlayer() &&
+ mAng::absDiff2<mAng>(getXZAngleToPlayer(), pPlayer->mRotation.y + 0x8000) >
+ mAng(1024.f + cM::rndF(1024.f))) {
+ b0 = false;
+ }
+ }
+
+ if (b0 ||
+ mAng::absDiff2<mAng>(getXZAngleToPlayer(), pPlayer->mRotation.y + 0x8000) <
+ mAng(1024.f + cM::rndF(1024.f)) ||
+ fn_177_8C20(mRotation.y)) {
+ field_0xB69 = 0;
+ changeState(StateID_Wait);
+ return;
+ }
+ } else if (field_0xB6A == 0 && !fn_177_8C20(mRotation.y)) {
+ fn_177_6B10(false, 0);
+
+ if (fn_177_75E0()) {
+ mTargetPosition.set(mRef1.get()->mPosition);
+ fn_177_7040(2, 0.8f);
+ } else {
+ fn_177_7040(0, 0.8f);
+ }
+ } else {
+ sLib::addCalcScaled(&mSpeed, 0.7f, 3.f + _weird_zero);
+ fn_177_7040(0, 0.f);
+ if (mAng::absDiff2<mAng>(getXZAngleToPlayer(), mRotation.y) < 0x400 && !fn_177_6B10(false, -1000)) {
+ changeState(StateID_Wait);
+ mMdl.setAnm("RemlyWaitSitCry", m3d::PLAY_MODE_4, 4.f);
+ field_0xB60 = 2;
+ }
+ return;
+ }
+
+ if (field_0xB60 == 3 && mMdl.getAnm().isStop()) {
+ field_0xB67 = 0;
+ mMdl.setAnm("RemlyWalk", m3d::PLAY_MODE_4, 2.f);
+ field_0xB60 = 4;
+ }
+
+ if (fn_177_8F90()) {
+ return;
+ }
+}
void dAcEremly_c::finalizeState_Walk() {}
-void dAcEremly_c::initializeState_Run() {}
-void dAcEremly_c::executeState_Run() {}
+
+void dAcEremly_c::initializeState_Run() {
+ mMdl.setAnm("RemlyRun", m3d::PLAY_MODE_4, 2.f);
+ field_0xB60 = 5;
+ mMdl.setRate(1.5f);
+ field_0xB66 = 1;
+}
+void dAcEremly_c::executeState_Run() {
+ adjustHeadRotation(true);
+ fn_177_6B10(false, 0);
+ if (fn_177_86C0()) {
+ return;
+ }
+ if (shouldBeScared()) {
+ if (isWithinPlayerRadius(600.f)) {
+ changeState(StateID_Escape);
+ field_0xB6A = 1;
+ } else {
+ changeState(StateID_Walk);
+ }
+ return;
+ }
+ if (fn_177_75E0()) {
+ mTargetPosition.set(mRef1.get()->mPosition);
+ fn_177_7040(2, 5.f);
+ } else {
+ fn_177_7040(0, 5.f);
+ }
+ if (fn_177_8F90()) {
+ return;
+ }
+}
void dAcEremly_c::finalizeState_Run() {}
-void dAcEremly_c::initializeState_Escape() {}
-void dAcEremly_c::executeState_Escape() {}
+
+void dAcEremly_c::initializeState_Escape() {
+ field_0xB6E = 0;
+ mAcceleration = -3.f;
+ mMdl.setAnm("RemlyRun", m3d::PLAY_MODE_4, 4.f);
+ field_0xB60 = 5;
+ mMdl.setRate(2.f);
+ field_0xB66 = 1;
+ field_0xB6A = 0;
+ field_0xB69 = 0;
+ field_0xB48 = 0;
+ field_0xB18 = 0;
+}
+void dAcEremly_c::executeState_Escape() {
+ s32 _weird_zero = 0;
+
+ adjustHeadRotation(false);
+ if (0 == sLib::calcTimer(&field_0xB48)) {
+ fn_177_7040(1, 20.f);
+ } else {
+ sLib::addCalcScaledDiff(&mSpeed, 20.f, 0.7f, 3.f);
+ }
+
+ if (fn_177_8C20(mRotation.y) || fn_177_8980(140.f)) {
+ field_0xB6E = 1;
+ if (field_0xB64 == 0) {
+ changeState(StateID_Scared);
+ } else {
+ field_0xB69 = 0;
+ changeState(StateID_Walk);
+ }
+ return;
+ }
+
+ if (field_0xB6A != 0) {
+ f32 f = (_weird_zero + 400.f);
+ field_0xB6C = 1;
+ if (!fn_177_7510(600.f + f) && !mNearbyBombRef.isLinked()) {
+ field_0xB69 = 0;
+ changeState(StateID_Walk);
+ }
+ }
+}
void dAcEremly_c::finalizeState_Escape() {}
-void dAcEremly_c::initializeState_EscapeDash() {}
-void dAcEremly_c::executeState_EscapeDash() {}
+
+void dAcEremly_c::initializeState_EscapeDash() {
+ mMdl.setAnm("RemlyRun", m3d::PLAY_MODE_4, 4.f);
+ field_0xB60 = 5;
+ mMdl.setRate(2.f);
+ field_0xB66 = 1;
+ field_0xB6A = 0;
+ field_0xB6B = 0;
+ field_0xB18 = 0;
+}
+void dAcEremly_c::executeState_EscapeDash() {
+ adjustHeadRotation(false);
+
+ // Idk
+ s32 a = getXZAngleToPlayer() + 0x8000;
+ if (field_0xB6B == 0) {
+ if (mAng::absDiff2<mAng>(a, mAngle.y) > 0x1000) {
+ sLib::addCalcAngle(mAngle.y.ref(), a, 1, 0x1000);
+ } else {
+ field_0xB6B = 1;
+ mAngle.y = a;
+ }
+ }
+
+ if (field_0xB6B != 0) {
+ mVec3_c v;
+ sLib::addCalcScaledDiff(&mSpeed, (v = mPosition, 30.f), 0.7f, 3.f);
+
+ if (fn_177_8C20(mRotation.y)) {
+ changeState(StateID_Scared);
+ } else if (fn_177_8980(200.f)) {
+ changeState(StateID_Scared);
+ }
+ }
+}
void dAcEremly_c::finalizeState_EscapeDash() {}
-void dAcEremly_c::initializeState_Wind() {}
-void dAcEremly_c::executeState_Wind() {}
+
+void dAcEremly_c::initializeState_Wind() {
+ if (field_0xB60 != 10 && field_0xB60 != 9) {
+ if (field_0xB60 == 21 || mAng::absDiff2<mAng>(getXZAngleToPlayer(), mRotation.y + 0x8000) < 0x6000) {
+ mMdl.setAnm("RemlyWindBack", m3d::PLAY_MODE_4, 4.f);
+ field_0xB60 = 10;
+ } else {
+ mMdl.setAnm("RemlyWind", m3d::PLAY_MODE_4, 4.f);
+ field_0xB60 = 9;
+ }
+ field_0xB4E = 11;
+ }
+ field_0xB48 = 11;
+}
+void dAcEremly_c::executeState_Wind() {
+ adjustHeadRotation(false);
+ sLib::addCalcScaled(&mSpeed, 0.7f, 5.f);
+ if (field_0xB60 == 9) {
+ fn_177_7040(0, 0.f);
+ sLib::addCalcAngle(mRotation.y.ref(), mAngle.y, 2, 0x800);
+ }
+
+ if (0 != sLib::calcTimer(&field_0xB48)) {
+ return;
+ }
+
+ if (field_0xB64 == 0) {
+ changeState(StateID_EscapeDash);
+ return;
+ }
+
+ if (!isScary()) {
+ field_0xB66 = 1;
+ changeState(StateID_Wait);
+
+ mMdl.setAnm("RemlyWaitStand", m3d::PLAY_MODE_4, 10.f);
+ field_0xB60 = 0;
+ return;
+ }
+
+ if (fn_177_9370(100.f)) {
+ changeState(StateID_NightRun);
+ } else {
+ changeState(StateID_NightRet);
+ }
+}
void dAcEremly_c::finalizeState_Wind() {}
-void dAcEremly_c::initializeState_Hold() {}
-void dAcEremly_c::executeState_Hold() {}
+
+void dAcEremly_c::initializeState_Hold() {
+ s32 _weird_zero = 0;
+
+ mMdl.setAnm("RemlyHold", m3d::PLAY_MODE_4, 4.f);
+
+ field_0xB60 = 11;
+ mSph.ClrCoSet();
+ field_0xB3C = 0.f;
+ field_0xB38 = mPosition.y;
+
+ field_0xB6A = 0;
+ field_0xB6C = 0;
+ field_0xB56 = 0;
+ field_0xB6E = 0;
+
+ mStts.SetRank(5);
+ field_0xB1E.clear();
+ field_0xB26 = 0;
+ field_0xB24 = 0;
+ if (isScary() || field_0xB68) {
+ mMdl.setAnm("RemlyHoldBata", m3d::PLAY_MODE_4, 4.f);
+ field_0xB60 = 13;
+ }
+
+ if (isScary()) {
+ field_0xB64 = 2;
+ field_0xB68 = 0;
+ }
+
+ mLinkage.field_0x90 = 13.f + _weird_zero;
+ mLinkage.field_0x8C = 13.f + _weird_zero;
+ if (field_0xB61 == 1) {
+ mLinkage.field_0x90 = 26.f + _weird_zero;
+ mLinkage.field_0x8C = 13.f + _weird_zero;
+ }
+
+ mAcceleration = -1.75f + _weird_zero;
+ field_0xB48 = 64.f + cM::rndF(64.f);
+ field_0xB4E = 90;
+}
+void dAcEremly_c::executeState_Hold() {
+ adjustHeadRotation(false);
+ field_0xB4E = 90;
+
+ mRotation.y = mAngle.y = getXZAngleToPlayer();
+
+ if (field_0xB60 == 12 && mMdl.getAnm().isStop()) {
+ mMdl.setAnm("RemlyHold", m3d::PLAY_MODE_4, 4.f);
+ field_0xB60 = 11;
+ }
+
+ if (0 == sLib::calcTimer(&field_0xB48)) {
+ if (field_0xB60 == 11) {
+ mMdl.setAnm("RemlyHoldMozo", m3d::PLAY_MODE_4, 4.f);
+ field_0xB60 = 12;
+ }
+ field_0xB48 = 64.f + cM::rndF(64.f);
+ }
+
+ if (mLinkage.checkConnection(dLinkage_c::CONNECTION_1)) {
+ return;
+ }
+
+ if (mLinkage.checkState(dLinkage_c::STATE_2)) {
+ mAngle.y = getXZAngleToPlayer();
+ mAngle.y += 0x8000;
+ changeState(StateID_Jump);
+ return;
+ }
+
+ if (isScary()) {
+ mAcceleration = -3.f;
+ changeState(StateID_NightFoo);
+ } else if (field_0xB68 == 0) {
+ mAcceleration = -3.f;
+ field_0xB48 = 0;
+ changeState(StateID_Wait);
+ } else {
+ mAcceleration = -3.f;
+ changeState(StateID_EscapeDash);
+ }
+}
void dAcEremly_c::finalizeState_Hold() {}
-void dAcEremly_c::initializeState_Jump() {}
-void dAcEremly_c::executeState_Jump() {}
+
+void dAcEremly_c::initializeState_Jump() {
+ field_0xB14 = 0;
+ unsetActorProperty(AC_PROP_0x1);
+ field_0xB50 = 90;
+ mMdl.setAnm("RemlyHoldJumpStart", m3d::PLAY_MODE_4, 0.f);
+ field_0xB60 = 14;
+ field_0xB4E = 90;
+}
+void dAcEremly_c::executeState_Jump() {
+ s32 _weird_zero = 0;
+
+ field_0xB4E = 90;
+ if (field_0xB60 == 14 && !fn_177_8980(100.f) && (mAcch.ChkGndHit() || mVelocity.y < 0.f)) {
+ mMdl.setAnm("RemlyHoldJumpEnd", m3d::PLAY_MODE_4, 0.f + _weird_zero);
+ field_0xB60 = 15;
+ return;
+ }
+
+ sLib::addCalcScaled(&mSpeed, 0.3f, 0.2f);
+ if (mSpeed && mAcch.ChkGndHit()) {
+ fn_177_8600();
+ mSpeed = 0.f;
+ }
+
+ if (mAcch.ChkGndHit() && mMdl.getAnm().isStop()) {
+ mAngle.y = mRotation.y;
+ setActorProperty(AC_PROP_0x1);
+ mAcceleration = -3.f;
+
+ if (isScary()) {
+ changeState(StateID_NightFoo);
+ } else if (field_0xB68 == 0) {
+ changeState(StateID_Wait);
+ } else {
+ changeState(StateID_EscapeDash);
+ }
+ }
+}
void dAcEremly_c::finalizeState_Jump() {}
-void dAcEremly_c::initializeState_Fly() {}
-void dAcEremly_c::executeState_Fly() {}
+
+void dAcEremly_c::initializeState_Fly() {
+ s32 _weird_zero = 0;
+
+ mAcch.ClrGndThinCellingOff();
+ field_0xB5C = 0;
+ field_0xB5E = 0;
+ field_0xB58 = 0;
+ unsetActorProperty(AC_PROP_0x1);
+
+ field_0xB6B = 0;
+ mMdl.setAnm("RemlyFly", m3d::PLAY_MODE_4, 4.f);
+ field_0xB60 = 16;
+ mMdl.setRate(1.3f);
+ field_0xB66 = 1;
+ field_0xB6A = 0;
+ field_0xB14 = 0;
+ field_0xB68 = 0;
+
+ if (isScary()) {
+ field_0xB64 = 2;
+ } else {
+ field_0xB64 = 1;
+ }
+
+ mAcch.ClrRoofNone();
+
+ f32 f = 200.f + _weird_zero;
+
+ field_0xB3C = 0.f;
+ field_0xB65 = 0;
+
+ mAcch.SetField_0xD4(f);
+
+ mVelocity.x = mVelocity.z = 0.f;
+ mSpeed = 0.f;
+}
+void dAcEremly_c::executeState_Fly() {
+ s32 _weird_zero = 0;
+
+ if (field_0xB61 == 1 && !fn_177_75E0() && EventManager::isInEvent()) {
+ setActorProperty(AC_PROP_0x1);
+ mPosition.set(mStartingPos.x, mStartingPos.y, mStartingPos.z);
+ mAngle.y = mRotation.y = mStartingRot.y;
+ changeState(StateID_Sleep);
+ return;
+ }
+
+ adjustHeadRotation(false);
+
+ if (field_0xB60 == 17 && mMdl.getAnm().isStop()) {
+ mMdl.setAnm("RemlyFly", m3d::PLAY_MODE_4, 4.f);
+ field_0xB60 = 16;
+ mMdl.setRate(1.3f);
+ }
+
+ if (mAcch.ChkWallHit(nullptr) || mAcch.ChkRoofHit()) {
+ mAng a;
+ if (mAcch.ChkWallHit(nullptr)) {
+ a = mAcchCir.GetWallAngleY() + 0x8000;
+ } else {
+ a = mAngle.y + 0x8000;
+ }
+
+ field_0xB14++;
+ mVec3_c v(0.f, 0.f, 0.f);
+
+ v.offsetWithAngle(a, -10.f + _weird_zero);
+
+ field_0xAF8.set(v);
+ }
+
+ mAng toStartingPosAngle = cLib::targetAngleY(mPosition, mStartingPos);
+
+ switch (field_0xB65) {
+ default: {
+ sLib::addCalcScaledDiff(&mVelocity.y, 8.f, 0.7f, 2.f);
+ sLib::addCalcScaled(&mAcceleration, 0.7f, 2.f);
+ sLib::addCalcAngle(mAngle.y.ref(), getXZAngleToPlayer(), 2, 0x800);
+ sLib::addCalcAngle(mRotation.y.ref(), mAngle.y, 2, 0x800);
+ if (mStartingPos.y + 300.f < mPosition.y) {
+ mAcceleration = 0.f;
+ mVelocity.y = 0.f;
+ field_0xB65++;
+ }
+ } break;
+ case 1: {
+ if (field_0xB14 < 120 && fn_177_7650(false)) {
+ changeState(StateID_BirthWait);
+ return;
+ }
+
+ f32 targetSpeed;
+ if (field_0xB14 < 120 && mStartingPos.squareDistanceToXZ(mPosition) > 2500.f) {
+ u32 angle = ++field_0xB5C * 1000;
+ targetSpeed = mAng(angle).sin();
+ targetSpeed *= _weird_zero + 30.f;
+ } else {
+ targetSpeed = 0.f;
+ }
+ sLib::addCalcScaledDiff(&field_0xB3C, targetSpeed, 0.5f, 10.f);
+
+ if (field_0xB14 < 120 && mStartingPos.squareDistanceToXZ(mPosition) > 2500.f) {
+ s32 angle = ++field_0xB5E * 300;
+ f32 tmp = mAng(angle).cos();
+ tmp *= 10000.f + _weird_zero;
+
+ sLib::addCalcAngle(mAngle.y.ref(), toStartingPosAngle + tmp, 2, 0x800);
+ sLib::addCalcAngle(mRotation.y.ref(), toStartingPosAngle, 2, 0x800);
+
+ if (mAcch.ChkWallHit(nullptr)) {
+ sLib::addCalcScaledDiff(&mVelocity.y, 8.f, 0.7f, 2.f);
+ if (std::abs(mPosition.y - field_0xAA4.y) < 4.f) {
+ field_0xB14++;
+ }
+ } else {
+ mAcceleration = 0.f;
+ mVelocity.y = 0.f;
+ field_0xB14 = 0;
+ }
+ targetSpeed = 8.f;
+ } else {
+ sLib::addCalcScaledDiff(&mVelocity.y, -8.f, 0.7f, 2.f);
+
+ targetSpeed = 0.f;
+
+ if (field_0xB14 >= 120 && fn_177_8980(100.f) && !d3d::isOnScreen(mPosition)) {
+ changeState(StateID_BirthWait);
+ return;
+ }
+ if (mAcch.ChkGndHit()) {
+ field_0xB3C = 0.f;
+ mAcceleration = -3.f;
+ mSpeed = 0.f;
+ field_0xB65++;
+ mAcch.SetRoofNone();
+
+ setActorProperty(AC_PROP_0x1);
+ if (field_0xB14 >= 120) {
+ field_0xB64 = 0;
+ changeState(StateID_Scared);
+ } else {
+ if (isScary()) {
+ changeState(StateID_NightWait);
+ } else {
+ mMdl.setAnm("RemlyWakeUp", m3d::PLAY_MODE_4, 4.f);
+ mMdl.setFrame(mMdl.getAnm().getEndFrame() - 1.f);
+ mMdl.setRate(-1.f);
+ field_0xB60 = 20;
+ }
+ }
+ return;
+ }
+ }
+ sLib::addCalcScaledDiff(&mSpeed, targetSpeed, 0.7f, 3.f);
+ } break;
+ case 2: {
+ if (mMdl.getAnm().checkFrame(0.f)) {
+ setActorProperty(AC_PROP_0x1);
+ mAngle.y = mRotation.y;
+ changeState(StateID_Sleep);
+ }
+
+ } break;
+ }
+}
void dAcEremly_c::finalizeState_Fly() {}
-void dAcEremly_c::initializeState_Damage() {}
-void dAcEremly_c::executeState_Damage() {}
+
+void dAcEremly_c::initializeState_Damage() {
+ field_0xB14 = 0;
+ mAcceleration = -3.f;
+ if (field_0xB60 == 21) {
+ field_0xB14 = 1;
+ }
+
+ if (!isScary()) {
+ mSpeed = 7.f;
+ } else {
+ mSpeed = 15.f;
+ }
+
+ f32 blend = 10.f;
+ if (field_0xB6B != 0) {
+ blend = 0.f;
+ mSpeed = 0.f;
+ }
+ mStts.SetRank(5);
+ field_0xB6B = 0;
+ if (mAcch.ChkGndHit()) {
+ field_0xB6B = 1;
+ }
+ mMdl.setAnm("RemlyDamage", m3d::PLAY_MODE_4, blend);
+ field_0xB60 = 18;
+ mAngle.y = getXZAngleToPlayer() + 0x8000;
+}
+void dAcEremly_c::executeState_Damage() {
+ if (mAcch.ChkGndHit()) {
+ sLib::addCalcScaled(&mSpeed, 0.5f, 1.f);
+ if (field_0xB6B == 0) {
+ fn_177_8600();
+ field_0xB6B = 1;
+ }
+ }
+
+ if (field_0xB14 != 0) {
+ field_0xB4E = 8;
+ s32 targetAngle = getXZAngleToPlayer() + 0x8000;
+ if (mAng::absDiff2<mAng>(targetAngle, mAngle.y) > 0x1000) {
+ sLib::addCalcAngle(mRotation.y.ref(), targetAngle, 1, 0x1000);
+ } else {
+ mRotation.y = targetAngle;
+ }
+ }
+
+ if (mSpeed < 0.1f && mMdl.getAnm().isStop()) {
+ if (field_0xB14) {
+ changeState(StateID_EscapeDash);
+ field_0xB6B = 1;
+ } else {
+ mAngle.y = mRotation.y;
+ if (isScary() && field_0xB64 != 0) {
+ if (fn_177_9370(100.f)) {
+ changeState(StateID_NightRun);
+ } else {
+ changeState(StateID_NightRet);
+ }
+ } else {
+ changeState(StateID_EscapeDash);
+ }
+ }
+ }
+}
void dAcEremly_c::finalizeState_Damage() {}
-void dAcEremly_c::initializeState_Sleep() {}
-void dAcEremly_c::executeState_Sleep() {}
+
+void dAcEremly_c::initializeState_Sleep() {
+ mMdl.setAnm("RemlySleep", m3d::PLAY_MODE_4, 4.f);
+ field_0xB60 = 19;
+ mTexPat.setFrame(2.f, 0);
+ mMdlCallback.mHeadRotation.clear();
+}
+void dAcEremly_c::executeState_Sleep() {
+ if (field_0xB60 == 20) {
+ if (mMdl.getAnm().isStop()) {
+ changeState(StateID_Wait);
+ }
+ } else if (fn_177_86C0() || fn_177_8F90() || mSph.ChkCoHit()) {
+ if (field_0xB60 != 20) {
+ mMdl.setAnm("RemlyWakeUp", m3d::PLAY_MODE_4, 4.f);
+ field_0xB60 = 20;
+ }
+ }
+}
void dAcEremly_c::finalizeState_Sleep() {}
-void dAcEremly_c::initializeState_Scared() {}
-void dAcEremly_c::executeState_Scared() {}
+
+void dAcEremly_c::initializeState_Scared() {
+ mMdl.setAnm("RemlyScared", m3d::PLAY_MODE_4, 4.f);
+ field_0xB60 = 21;
+ field_0xB66 = 1;
+ mSpeed = 0.f;
+ field_0xB14 = 0;
+ mStts.SetRank(11);
+}
+void dAcEremly_c::executeState_Scared() {
+ if (isScary()) {
+ return;
+ }
+
+ fn_177_86C0();
+ if (mMdl.getAnm().getRate()) {
+ adjustHeadRotation(false);
+ } else if (field_0xB64) {
+ sLib::addCalcAngle(mMdlCallback.mHeadRotation.z.ref(), 8000, 20, 0x100);
+ if (field_0xB14 > 80 && !shouldBeScared()) {
+ field_0xB68 = 0;
+ field_0xB66 = 1;
+ changeState(StateID_Wait);
+ }
+ }
+
+ sLib::addCalcScaled(&mSpeed, 0.7f, 3.f);
+
+ if (!field_0xB64) {
+ return;
+ }
+
+ if (!shouldBeScared()) {
+ if (++field_0xB14 > 30) {
+ mMdl.setRate(0.f);
+ }
+ } else {
+ field_0xB14 = 0;
+ mMdl.setRate(1.f);
+ }
+}
void dAcEremly_c::finalizeState_Scared() {}
-void dAcEremly_c::initializeState_Stun() {}
-void dAcEremly_c::executeState_Stun() {}
+
+void dAcEremly_c::initializeState_Stun() {
+ field_0xB6B = 0;
+ mAcceleration = -3.f;
+ if (field_0xB60 != 22 && field_0xB60 != 23) {
+ mMdl.setAnm("RemlyPiyo1", m3d::PLAY_MODE_4, 4.f);
+ field_0xB60 = 22;
+ } else {
+ mMdl.setAnm("RemlyPiyo1", m3d::PLAY_MODE_4, 4.f);
+ field_0xB60 = 22;
+ mMdl.setFrame(11.f);
+ field_0xB6B = 1;
+ }
+
+ if (!isScary()) {
+ field_0xB64 = 0;
+ }
+
+ mStts.SetRank(11);
+ fn_177_8520(true);
+ field_0xB6A = 0;
+ mSph.ClrAtSet();
+ field_0xB68 = 1;
+}
+void dAcEremly_c::executeState_Stun() {
+ switch (field_0xB60) {
+ default: {
+ if (mMdl.getAnm().isStop()) {
+ mMdl.setAnm("RemlyPiyo2", m3d::PLAY_MODE_4, 4.f);
+ field_0xB60 = 23;
+ field_0xB48 = 300;
+ fn_177_8520(true);
+ }
+ } break;
+ case 23: {
+ if (sLib::calcTimer(&field_0xB48)) {
+ field_0xB6B = 1;
+ } else {
+ mMdl.setAnm("RemlyPiyo3", m3d::PLAY_MODE_4, 4.f);
+ field_0xB60 = 24;
+ }
+ } break;
+ case 24: {
+ if (mMdl.getAnm().checkFrame(36.f)) {
+ mSpeed = 15.f;
+ }
+ if (mMdl.getAnm().isStop()) {
+ mStts.SetRank(5);
+ if (isScary()) {
+ if (fn_177_9370(100.f)) {
+ changeState(StateID_NightRun);
+ } else {
+ changeState(StateID_NightRet);
+ }
+ } else {
+ changeState(StateID_Escape);
+ }
+ }
+ } break;
+ }
+ if (field_0xB60 != 23 && field_0xB60 != 24) {}
+
+ sLib::addCalcScaled(&mSpeed, 0.5f, 1.f);
+ if (field_0xB6B) {
+ mVec3_c pos, scale;
+ pos.set(mPosition);
+ pos.y += 50.f;
+
+ scale.set(mScale);
+ scale *= 0.5f;
+ mEmitters[0].holdEffect(PARTICLE_RESOURCE_ID_MAPPING_309_, pos, &mRotation, &scale, nullptr, nullptr);
+ holdSound(SE_E_PIYORI_LV);
+ }
+}
void dAcEremly_c::finalizeState_Stun() {}
-void dAcEremly_c::initializeState_Water() {}
-void dAcEremly_c::executeState_Water() {}
+
+void dAcEremly_c::initializeState_Water() {
+ mMdl.setAnm("RemlySwim", m3d::PLAY_MODE_4, 4.f);
+ field_0xB60 = 6;
+ field_0xB6B = 0;
+ mAcceleration = 0.f;
+ mSpeed = 0.f;
+ mSph.ClrAtSet();
+ field_0xB68 = 0;
+
+ if (!isScary()) {
+ field_0xB64 = 1;
+ } else {
+ field_0xB64 = 2;
+ }
+
+ mStts.SetRank(11);
+ field_0xB6E = 0;
+ field_0xB6A = 0;
+ startSound(SE_ERemly_DIVE_WATER);
+ field_0xB6F = 0;
+ field_0xB66 = 1;
+}
+void dAcEremly_c::executeState_Water() {
+ s32 _weird_zero = 0;
+
+ adjustHeadRotation(false);
+ if (field_0xB6B) {
+ mVec3_c out(mVec3_c::Zero);
+ mVec3_c pos;
+ pos.set(mPosition);
+ pos.y = field_0xB0C;
+ if (dTgStream_c::getForce(pos, out)) {
+ mAngle.y = out.atan2sX_Z();
+ sLib::addCalcScaledDiff(&mSpeed, out.absXZ(), 0.2f, 0.2f);
+ field_0xB6F = 1;
+ } else if (field_0xB6F) {
+ mStts.SetRank(5);
+ mAcceleration = -3.f;
+
+ if ((s32)++field_0xB58 > 30) {
+ changeState(StateID_Fly);
+ }
+ } else {
+ mSpeed = 0.f;
+ mAcceleration = -3.f;
+ mStts.SetRank(5);
+
+ if (field_0xB60 != 8 && field_0xB60 != 7) {
+ mMdl.setAnm("RemlyWater", m3d::PLAY_MODE_4, 4.f);
+ field_0xB60 = 7;
+
+ } else if (field_0xB60 == 8 || mMdl.getAnm().isStop()) {
+ if (isScary()) {
+ field_0xB6E = 1;
+ changeState(StateID_Fly);
+ } else {
+ changeState(StateID_Walk);
+ }
+ }
+ }
+ } else {
+ if (field_0xB60 == 8 && mMdl.getAnm().isStop()) {
+ mMdl.setAnm("RemlySwim", m3d::PLAY_MODE_4, 10.f);
+ field_0xB60 = 6;
+ }
+ field_0xB5A++;
+ f32 yOffset = -35.f + _weird_zero;
+ if (field_0xB4E != 0) {
+ yOffset -= 10.f + _weird_zero;
+ }
+ fn_177_7040(0, 0.8f);
+ (void)dAcPy_c::GetLink()->mPosition.absXZTo(mPosition);
+ if (fn_177_7510(220.f)) {
+ mSpeed = 0.f;
+ }
+ f32 yTarget = field_0xB0C + yOffset + mAng(field_0xB5A * 2000).sin() * 3.f;
+ sLib::addCalcScaledDiff(&mPosition.y, yTarget, 0.7f, 3.f);
+ sLib::addCalcScaled(&mVelocity.y, 0.8f, 10.f);
+ }
+}
void dAcEremly_c::finalizeState_Water() {}
-void dAcEremly_c::initializeState_Hear() {}
-void dAcEremly_c::executeState_Hear() {}
+
+void dAcEremly_c::initializeState_Hear() {
+ field_0xB14 = 0;
+ field_0xB65 = 0;
+ switch (field_0xB60) {
+ default: {
+ mMdl.setAnm("RemlyWaitSit", m3d::PLAY_MODE_4, 4.f);
+ field_0xB60 = 1;
+ field_0xB66 = 0;
+ } // fallthrough
+ case 1: {
+ field_0xB65 = 1;
+ } break;
+ case 3:
+ case 4:
+ case 5: {
+ mMdl.setAnm("RemlyWaitStand", m3d::PLAY_MODE_4, 4.f);
+ field_0xB60 = 0;
+ field_0xB66 = 1;
+ field_0xB48 = 24.f + cM::rndF(24.f);
+ }
+ }
+}
+void dAcEremly_c::executeState_Hear() {
+ sLib::addCalcScaled(&mSpeed, 0.7f, 5.f);
+ switch (field_0xB65) {
+ case 0: {
+ if (mSpeed < 0.2f && 0 == sLib::calcTimer(&field_0xB48)) {
+ mMdl.setAnm("RemlyWaitSit", m3d::PLAY_MODE_4, 10.f);
+ field_0xB60 = 1;
+ field_0xB66 = 0;
+ field_0xB65++;
+ }
+ } break;
+ case 1: {
+ if (!fn_177_6B10(false, 0) && fn_177_86C0()) {
+ if (field_0xB60 == 2 && mMdl.getAnm().isStop()) {
+ mMdl.setAnm("RemlyWaitSit", m3d::PLAY_MODE_4, 20.f);
+ field_0xB60 = 1;
+ } else {
+ if (field_0xB4C > 50) {
+ field_0xB4C = 50;
+ if (field_0xB60 == 1) {
+ mMdl.setAnm("RemlyWaitSitCry", m3d::PLAY_MODE_4, 10.f);
+ field_0xB60 = 2;
+ }
+ }
+ fn_177_6EA0(false);
+ }
+ } else if (shouldBeScared()) {
+ changeState(StateID_Escape);
+ field_0xB6A = 1;
+ } else {
+ if (field_0xB60 != 1) {
+ mMdl.setAnm("RemlyWaitSit", m3d::PLAY_MODE_4, 10.f);
+ field_0xB60 = 1;
+ }
+ fn_177_8F90();
+ adjustHeadRotation(true);
+ }
+ } break;
+ }
+}
void dAcEremly_c::finalizeState_Hear() {}
-void dAcEremly_c::initializeState_NightSleepDemo() {}
-void dAcEremly_c::executeState_NightSleepDemo() {}
+
+void dAcEremly_c::initializeState_NightSleepDemo() {
+ mMdl.setAnm("RemlySleep", m3d::PLAY_MODE_4, 4.f);
+ field_0xB60 = 25;
+ mSph.ClrAtSet();
+ mSph.ClrTgSet();
+ mSph.ClrCoSet();
+}
+void dAcEremly_c::executeState_NightSleepDemo() {
+ nightSleepDemoImpl();
+}
void dAcEremly_c::finalizeState_NightSleepDemo() {}
-void dAcEremly_c::initializeState_NightFoo() {}
-void dAcEremly_c::executeState_NightFoo() {}
+
+void dAcEremly_c::initializeState_NightFoo() {
+ mMdl.setAnm("RemlyFoo", m3d::PLAY_MODE_4, 4.f);
+ field_0xB60 = 28;
+ field_0xB48 = 12.f + cM::rndF(12.f);
+ field_0xB6D = 0;
+ field_0xB6E = 0;
+ field_0xB6B = 0;
+ mSph.ClrAtSet();
+}
+void dAcEremly_c::executeState_NightFoo() {
+ const dAcPy_c *pPlayer = dAcPy_c::GetLink();
+
+ adjustHeadRotation(false);
+ sLib::addCalcScaled(&mSpeed, 0.7f, 5.f);
+ sLib::addCalcAngle(mAngle.y.ref(), getXZAngleToPlayer(), 2, 0x1000);
+ sLib::addCalcAngle(mRotation.y.ref(), mAngle.y, 2, 0x1000);
+ if (field_0xB6D == 0) {
+ if (0 != sLib::calcTimer(&field_0xB48)) {
+ return;
+ }
+ if (mAng::absDiff2<s32>(getXZAngleToPlayer(), mRotation.y) > 0x400) {
+ return;
+ }
+ } else {
+ if (!mNearbyBombRef.isLinked()) {
+ changeState(StateID_NightWait);
+ return;
+ }
+ if (pPlayer->getPosition().absXZTo(mPosition) > mNearbyBombRef.get()->mPosition.absXZTo(mPosition)) {
+ sLib::addCalcAngle(
+ mAngle.y.ref(), cLib::targetAngleY(mPosition, mNearbyBombRef.get()->mPosition), 2, 0x800
+ );
+ return;
+ }
+ }
+ if (field_0xB6E != 0) {
+ changeState(StateID_Fly);
+ return;
+ }
+
+ if (field_0xB6B != 0 || pPlayer->mPosition.absXZTo(mStartingPos) > field_0xB08 + 500.f) {
+ changeState(StateID_NightRet);
+ return;
+ }
+
+ if (mAng::absDiff2<s32>(getXZAngleToPlayer(), mRotation.y) < 0x1000) {
+ changeState(StateID_NightJumpAttack);
+ if (!mAcch.ChkWallHit(nullptr) && fn_800301b0(mPositionCopy2, mRotation.y, true, 120.f) == 0) {
+ return;
+ }
+ field_0xB6E = 1;
+ }
+}
void dAcEremly_c::finalizeState_NightFoo() {}
-void dAcEremly_c::initializeState_NightReflectionFoo() {}
-void dAcEremly_c::executeState_NightReflectionFoo() {}
+
+void dAcEremly_c::initializeState_NightReflectionFoo() {
+ mMdl.setAnm("RemlyFoo", m3d::PLAY_MODE_4, 4.f);
+ field_0xB60 = 28;
+ mMdl.setRate(0.f);
+ mSpeed *= -1.f;
+ field_0xB48 = 24.f + cM::rndF(24.f);
+ field_0xB6B = 0;
+ if (mAcch.ChkGndHit()) {
+ field_0xB6B = 1;
+ }
+ mSph.ClrAtSet();
+}
+void dAcEremly_c::executeState_NightReflectionFoo() {
+ const dAcPy_c *pPlayer = dAcPy_c::GetLink();
+ adjustHeadRotation(false);
+ if (mAcch.ChkGndHit()) {
+ sLib::addCalcScaled(&mSpeed, 0.5f, 2.f);
+ if (field_0xB6B == 0) {
+ fn_177_8600();
+ field_0xB6B = 1;
+ }
+ }
+
+ if (!mMdl.getAnm().getRate()) {
+ if (mSpeed < 0.1f) {
+ mMdl.setRate(1.f);
+ }
+ return;
+ }
+
+ if (pPlayer->isRecovering() || sLib::calcTimer(&field_0xB48)) {
+ return;
+ }
+
+ if (pPlayer->mPosition.absXZTo(mStartingPos) > field_0xB08 + 500.f || !fn_177_9370(100.f)) {
+ changeState(StateID_NightRet);
+ } else {
+ changeState(StateID_NightRun);
+ field_0xB48 = 24.f + cM::rndF(24.f);
+ }
+}
void dAcEremly_c::finalizeState_NightReflectionFoo() {}
-void dAcEremly_c::initializeState_NightWait() {}
-void dAcEremly_c::executeState_NightWait() {}
+
+void dAcEremly_c::initializeState_NightWait() {
+ fn_177_8520(true);
+ mMdl.setAnm("RemlyWaitStandNight", m3d::PLAY_MODE_4, 4.f);
+ field_0xB48 = 24.f + cM::rndF(24.f);
+ mSph.ClrAtSet();
+}
+void dAcEremly_c::executeState_NightWait() {
+ if (mNearbyBombRef.isLinked()) {
+ changeState(StateID_NightRet);
+ return;
+ }
+
+ if (fn_177_9370(0.f)) {
+ changeState(StateID_NightRun);
+ return;
+ }
+
+ if (fn_177_86C0()) {
+ changeState(StateID_NightFoo);
+ field_0xB6D = 1;
+ return;
+ }
+
+ if (0 == sLib::calcTimer(&field_0xB48)) {
+ changeState(StateID_NightWalk);
+ return;
+ }
+
+ sLib::addCalcScaled(&mSpeed, 0.5f, 5.f);
+}
void dAcEremly_c::finalizeState_NightWait() {}
-void dAcEremly_c::initializeState_NightWalk() {}
-void dAcEremly_c::executeState_NightWalk() {}
+
+// ???
+inline bool compareDistance(const mVec3_c &v0, const mVec3_c &v1, f32 f) {
+ return v0.squareDistanceToXZ(v1) > f * f;
+}
+void dAcEremly_c::initializeState_NightWalk() {
+ mMdl.setAnm("RemlyWalkNight", m3d::PLAY_MODE_4, 4.f);
+ field_0xB60 = 29;
+
+ mTargetPosition.set(mStartingPos);
+
+ // odd
+ if (!compareDistance(mPosition, mStartingPos, field_0xB08)) {
+ mTargetPosition.x += cM::rndFX(field_0xB08 * 0.5f);
+ mTargetPosition.z += cM::rndFX(field_0xB08 * 0.5f);
+ }
+}
+void dAcEremly_c::executeState_NightWalk() {
+ fn_177_6B10(true, 0);
+ if (mNearbyBombRef.isLinked()) {
+ changeState(StateID_NightRet);
+ return;
+ }
+
+ s32 idk = fn_800301b0(mPositionCopy2, mRotation.y, true, 120.f);
+ if (idk != 0) {
+ mTargetPosition.set(getStartingPosition());
+ if (idk == 1) {
+ mAng a = cLib::targetAngleY(mPosition, getStartingPosition());
+ if (mAng::absDiff2<mAng>(mRotation.y, a) < 0x400) {
+ field_0xB6E = 1;
+ changeState(StateID_Fly);
+ return;
+ }
+ }
+ }
+
+ if (fn_177_7040(2, 0.8f)) {
+ mTargetPosition.set(mStartingPos);
+ if (idk == 0) {
+ mTargetPosition.x += cM::rndFX(field_0xB08 * 0.5f);
+ mTargetPosition.z += cM::rndFX(field_0xB08 * 0.5f);
+ }
+ }
+
+ if (fn_177_9370(0.f)) {
+ changeState(StateID_NightRun);
+ } else if (fn_177_86C0()) {
+ changeState(StateID_NightFoo);
+ field_0xB6D = 1;
+ }
+}
void dAcEremly_c::finalizeState_NightWalk() {}
-void dAcEremly_c::initializeState_NightRun() {}
-void dAcEremly_c::executeState_NightRun() {}
+
+void dAcEremly_c::initializeState_NightRun() {
+ mMdl.setAnm("RemlyRunFast", m3d::PLAY_MODE_4, 4.f);
+ field_0xB60 = 30;
+ field_0xB18 = 0;
+ field_0xB6B = 0;
+ mSph.ClrAtSet();
+ mAcceleration = -3.f;
+ mMdl.setRate(1.5f);
+ field_0xB48 = 0;
+ fn_177_77C0();
+}
+void dAcEremly_c::executeState_NightRun() {
+ const dAcPy_c *pPlayer = dAcPy_c::GetLink();
+ fn_177_6B10(false, 0);
+
+ mMtx_c m;
+ mVec3_c in, out;
+ mVec3_c stuffs0, stuffs1;
+
+ if (field_0xB6B == 0) {
+ // What...
+ const mVec3_c &target = dScGame_c::getCamera()->getTarget();
+ f32 z = target.z;
+ f32 y = target.y;
+ f32 x = target.x;
+ stuffs0.x = x;
+ stuffs0.y = y;
+ stuffs1.z = z;
+
+ if (fn_177_7040(2, 10.f)) {
+ field_0xB32 += field_0xB34;
+ }
+
+ if (fn_177_8C20(mRotation.y)) {
+ changeState(StateID_NightFoo);
+ return;
+ }
+
+ m.YrotS(field_0xB32);
+ in.set(0.f, 0.f, 320.f);
+ m.multVec(in, out);
+ out += pPlayer->mPosition;
+ mTargetPosition.set(out);
+ }
+
+ if (mNearbyBombRef.isLinked()) {
+ changeState(StateID_NightRet);
+ return;
+ }
+
+ if (!fn_177_9370(100.f)) {
+ changeState(StateID_NightFoo);
+ field_0xB6B = 1;
+ return;
+ }
+
+ if (0 == sLib::calcTimer(&field_0xB48) && isWithinPlayerRadius(400.f) && d3d::isOnScreen(mPosition)) {
+ field_0xB6B = 1;
+ }
+
+ if (field_0xB6B) {
+ fn_177_7040(0, 5.0f);
+ if (field_0xB48 == 0) {
+ if (mAng::absDiff2<mAng>(getXZAngleToPlayer(), mRotation.y) < mAng(4608.f + cM::rndF(4096.f))) {
+ changeState(StateID_NightFoo);
+ }
+ }
+ }
+}
void dAcEremly_c::finalizeState_NightRun() {}
-void dAcEremly_c::initializeState_NightRet() {}
-void dAcEremly_c::executeState_NightRet() {}
+
+void dAcEremly_c::initializeState_NightRet() {
+ mMdl.setAnm("RemlyRunFast", m3d::PLAY_MODE_4, 4.f);
+ field_0xB60 = 30;
+ mTargetPosition.set(mStartingPos);
+ field_0xB6B = 0;
+ field_0xB18 = 0;
+}
+void dAcEremly_c::executeState_NightRet() {
+ adjustHeadRotation(true);
+ if (mNearbyBombRef.isLinked()) {
+ mSpeed = 10.f;
+ f32 radius = 500.f;
+ mAngle.y = cLib::targetAngleY(mNearbyBombRef.get()->mPosition, mPosition);
+ sLib::addCalcAngle(mRotation.y.ref(), mAngle.y, 2, 0x800);
+
+ if (mNearbyBombRef.get()->mPosition.squareDistanceToXZ(mPosition) > radius * radius) {
+ changeState(StateID_NightFoo);
+ field_0xB6D = 1;
+ }
+ return;
+ }
+
+ if (fn_177_8C20(mRotation.y)) {
+ changeState(StateID_NightFoo);
+ field_0xB6E = 1;
+ return;
+ }
+
+ if (fn_177_7040(2, 10.f)) {
+ changeState(StateID_NightWait);
+ }
+}
void dAcEremly_c::finalizeState_NightRet() {}
-void dAcEremly_c::initializeState_NightJumpAttack() {}
-void dAcEremly_c::executeState_NightJumpAttack() {}
+
+void dAcEremly_c::initializeState_NightJumpAttack() {
+ mSpeed = 20.f;
+ mVelocity.y = 27.f + cM::rndF(3.f);
+ mSph.OnAtSet();
+ mMdl.setAnm("RemlyJump", m3d::PLAY_MODE_4, 0.f);
+ field_0xB60 = 31;
+ field_0xB6E = 0;
+ field_0xB32 = 0;
+ field_0xB6B = 0;
+}
+void dAcEremly_c::executeState_NightJumpAttack() {
+ adjustHeadRotation(false);
+ if (mSph.ChkAtHit()) {
+ if (mSph.GetAtFlag0x8()) {
+ setBattleBgmRelated(0);
+ mSpeed = -20.f;
+ changeState(StateID_Stun);
+ return;
+ }
+
+ if (mSph.GetAtFlag0x2()) {
+ changeState(StateID_NightReflectionFoo);
+ return;
+ }
+ }
+
+ if (mAcch.ChkGndHit()) {
+ fn_177_8600();
+ if (field_0xB6E != 0 &&
+ (mAcch.ChkWallHit(nullptr) || fn_800301b0(mPositionCopy2, mRotation.y, true, 120.f) != 0)) {
+ changeState(StateID_NightFoo);
+ field_0xB6B = 1;
+ return;
+ }
+ changeState(StateID_NightRun);
+ field_0xB48 = 24.f + cM::rndF(24.f);
+ }
+}
void dAcEremly_c::finalizeState_NightJumpAttack() {}
-void dAcEremly_c::initializeState_BirthWait() {}
-void dAcEremly_c::executeState_BirthWait() {}
+
+void dAcEremly_c::initializeState_BirthWait() {
+ field_0xB48 = 300;
+ unsetActorProperty(AC_PROP_0x1);
+ field_0xB64 = 2;
+ field_0xB68 = 0;
+ mMdl.setAnm("RemlyWaitStand", m3d::PLAY_MODE_4, 4.f);
+ field_0xB60 = 0;
+}
+void dAcEremly_c::executeState_BirthWait() {
+ if (!sLib::calcTimer(&field_0xB48) && fn_177_7650(true)) {
+ mPosition.set(mStartingPos.x, mStartingPos.y, mStartingPos.z);
+ mOldPosition.set(mStartingPos.x, mStartingPos.y, mStartingPos.z);
+ mPosition.y += 10.f;
+ mVelocity.set(0.f, 0.f, 0.f);
+ mSpeed = 0.f;
+ mAcceleration = -3.f;
+ setActorProperty(AC_PROP_0x1);
+
+ if (isScary()) {
+ changeState(StateID_NightWait);
+ } else if (field_0xB61 == 1 && fn_177_75E0()) {
+ changeState(StateID_Wait);
+ } else {
+ changeState(StateID_Sleep);
+ }
+ }
+}
void dAcEremly_c::finalizeState_BirthWait() {}
+
+void dAcEremly_c::playWink() {
+ if (isState(StateID_Sleep)) {
+ return;
+ }
+
+ if (sLib::calcTimer(&mWinkTimer)) {
+ mTexPat.play();
+ } else {
+ mWinkTimer = 40.f + cM::rndF(120.f);
+ mTexPat.setFrame(0.f, 0);
+ }
+}
+
+// NONMATCHING
+bool dAcEremly_c::fn_177_6B10(bool lookAtTarget, const mAng &range) {
+ const dAcPy_c *pPlayer = dAcPy_c::GetLink();
+
+ mAng angleTargetX, angleTargetY;
+ if (lookAtTarget) {
+ angleTargetX = cLib::targetAngleX(mPosition, mTargetPosition) * 0.7f;
+
+ angleTargetY = (mAng)cLib::targetAngleY(mPosition, mTargetPosition);
+ angleTargetY -= mRotation.y;
+ } else {
+ angleTargetX = cLib::targetAngleX(mPosition, pPlayer->getHeadTranslation()) * 0.7f;
+
+ angleTargetY = getXZAngleToPlayer();
+ angleTargetY -= mRotation.y;
+ }
+
+ mVec3_c outpos;
+ if (!dLightEnv_c::GetPInstance()->check_BPM8(&mPosition, &outpos)) {
+ // TODO - Return type pPlayer->vt_0x1C0()
+ dAcBase_c *pActor = static_cast<dAcBase_c *>(pPlayer->vt_0x1C0());
+ if (pActor) {
+ field_0xA50.set(pActor->mPosition);
+ field_0xB56 = 30;
+ }
+ }
+
+ if (sLib::calcTimer(&field_0xB56)) {
+ angleTargetX = cLib::targetAngleX(mPosition, field_0xA50) * 0.7f;
+ angleTargetY = (mAng)cLib::targetAngleY(mPosition, field_0xA50);
+ angleTargetY -= mRotation.y;
+ }
+
+ if (fn_177_75E0()) {
+ outpos.set(mRef1.get()->mPosition);
+ outpos.y += 100.f;
+
+ angleTargetX = cLib::targetAngleX(mPosition, outpos) * 0.7f;
+ angleTargetY = (mAng)cLib::targetAngleY(mPosition, outpos);
+ angleTargetY -= mRotation.y;
+ fn_177_79D0(true);
+ }
+
+ if (angleTargetX < 0) {
+ angleTargetY = 0;
+ } else if (angleTargetX > 2500) {
+ angleTargetX = 2500;
+ }
+ sLib::addCalcAngle(mMdlCallback.mHeadRotation.z.ref(), angleTargetX, 2, 0x800);
+ if (field_0xB60 == 2) {
+ return false;
+ }
+
+ bool b = false;
+ s32 t0 = range + 8000;
+ if (isState(StateID_Wait) || isState(StateID_Walk)) {
+ t0 = range + 6000;
+ }
+ s16 t = t0;
+
+ if (angleTargetY < -t) {
+ angleTargetY = -t;
+ b = true;
+ } else if (angleTargetY > t) {
+ angleTargetY = t;
+ b = true;
+ }
+ sLib::addCalcAngle(mMdlCallback.mHeadRotation.y.ref(), angleTargetY, 2, 0x800);
+ return b;
+}
+
+void dAcEremly_c::fn_177_6EA0(bool b) {
+ if (!b && shouldBeScared()) {
+ return;
+ }
+
+ if (!sLib::calcTimer(&field_0xB4C)) {
+ field_0xB4C = 100.f + cM::rndF(100.f);
+ if (cM::rnd() < 0.3f) {
+ field_0xB30 = 0;
+ } else if (field_0xB30 == 0) {
+ if (cM::rnd() < 0.5f) {
+ field_0xB30 = 5000;
+ } else {
+ field_0xB30 = -5000;
+ }
+ } else {
+ field_0xB30 *= -1;
+ field_0xB4C = 50.f + cM::rndF(100.f);
+ }
+ }
+ sLib::addCalcAngle(mMdlCallback.mHeadRotation.x.ref(), field_0xB30, 10, 0x200);
+}
+
+void dAcEremly_c::adjustHeadRotation(bool bOnlyRotX) {
+ sLib::addCalcAngle(mMdlCallback.mHeadRotation.x.ref(), 0, 2, 0x400);
+ if (!bOnlyRotX) {
+ sLib::addCalcAngle(mMdlCallback.mHeadRotation.y.ref(), 0, 2, 0x400);
+ sLib::addCalcAngle(mMdlCallback.mHeadRotation.z.ref(), 0, 2, 0x400);
+ }
+}
+
+// I do not like how this is written and somehow it matches
+bool dAcEremly_c::fn_177_7040(u32 param0, f32 f) {
+ const dAcPy_c *pPlayer = dAcPy_c::GetLink();
+
+ f32 f0;
+ s16 targetAngle;
+ s16 targetRatio;
+ s16 targetStepSize;
+
+ targetAngle = getXZAngleToPlayer();
+ if (param0 != 2) {
+ mTargetPosition.set(pPlayer->mPosition);
+ }
+
+ if (param0 == 1) {
+ targetAngle += 0x8000;
+ } else if (param0 == 2) {
+ targetAngle = cLib::targetAngleY(mPosition, mTargetPosition);
+ }
+
+ f0 = mAng(mAng::abs(mAngle.y - targetAngle)).sin();
+ targetRatio = 4.f - std::abs(f0 * 2.f);
+
+ f0 = mAng(mAng::abs(mAngle.y - targetAngle)).sin();
+ targetStepSize = 2048.f + std::abs(f0 * 512.f);
+
+ if (field_0xB60 == 29 || field_0xB60 == 4) {
+ f32 f = mAng(mAng::abs(mAngle.y - targetAngle)).sin();
+ mMdl.setRate(f * 4.f + 1.f);
+ targetRatio = 10;
+ targetStepSize = 0x400;
+ }
+
+ if (field_0xB60 == 4) {
+ f32 f = mAng(mAng::abs(mAngle.y - targetAngle)).sin();
+ mMdl.setRate(f + 1.f);
+ targetRatio = 5;
+ targetStepSize = 0x400;
+ }
+
+ if (field_0xB60 == 9 || mNearbyBombRef.isLinked()) {
+ targetRatio = 1;
+ targetStepSize = 0x2000;
+ }
+
+ sLib::addCalcAngle(mAngle.y.ref(), targetAngle, targetRatio, targetStepSize);
+ f0 = 1.5f;
+ f0 -= std::abs(mAng(mAng::abs(mAngle.y - targetAngle)).sin());
+ sLib::addCalcScaledDiff(&mSpeed, f * f0, 0.7f, 3.f);
+ if (mTargetPosition.squareDistanceToXZ(mPosition) < 10000.f) {
+ return true;
+ } else {
+ return false;
+ }
+}
+
+bool dAcEremly_c::isScary() {
+ if (StoryflagManager::sInstance->getFlag(STORYFLAG_GRATITUDE_QUEST_FINISHED) &&
+ (dScGame_c::isCurrentStage("F000") || dScGame_c::isCurrentStage("D000"))) {
+ return false;
+ }
+
+ if (dScGame_c::currentSpawnInfo.isNight()) {
+ return true;
+ }
+
+ return false;
+}
+
+bool dAcEremly_c::shouldBeScared() {
+ if (isState(StateID_Sleep) || isScary() || field_0xB68) {
+ return false;
+ }
+
+ dAcPy_c *pPlayer = dAcPy_c::GetLinkM();
+ if (pPlayer->isUsingSword() || pPlayer->checkActionFlagsCont(0x2) || pPlayer->checkActionFlagsCont(0x80) ||
+ pPlayer->isCarryingBomb() || pPlayer->isUsingWhip() || pPlayer->checkActionFlagsCont(0x4) ||
+ pPlayer->checkActionFlagsCont(0x100) || pPlayer->checkActionFlagsCont(0x10)) {
+ return true;
+ }
+
+ if (mNearbyBombRef.isLinked()) {
+ return true;
+ }
+
+ field_0xB6C = 0;
+ return false;
+}
+
+bool dAcEremly_c::fn_177_7510(f32 radius) {
+ if (fn_177_75E0()) {
+ mTargetPosition.set(mRef1.get()->getPosition());
+ if (mTargetPosition.squareDistanceToXZ(mPosition) < radius * radius) {
+ return true;
+ }
+ }
+
+ if (isWithinPlayerRadius(radius)) {
+ return true;
+ }
+
+ return false;
+}
+
+bool dAcEremly_c::fn_177_75E0() {
+ if (mRef1.isLinked() && mSleepDemoPlayedSceneflag != 0xFF) {
+ if (SceneflagManager::sInstance->checkBoolFlag(mRoomID, mSleepDemoPlayedSceneflag)) {
+ return true;
+ }
+ }
+ return false;
+}
+
+bool dAcEremly_c::fn_177_7650(bool comparePlayer) const {
+ f32 radius = 0.f;
+ mVec3_c pos = mPosition;
+
+ if (comparePlayer) {
+ pos.set(mStartingPos);
+ }
+
+ if (d3d::isOnScreen(pos)) {
+ return false;
+ }
+
+ radius = 40.f;
+ radius *= 100.f;
+ if (comparePlayer) {
+ const dAcPy_c *pPlayer = dAcPy_c::GetLink();
+ return pPlayer->mPosition.squareDistanceToXZ(pos) > radius * radius;
+ } else {
+ mVec3_c camPos = dScGame_c::getCamera()->getPosition();
+ return camPos.squareDistanceToXZ(pos) > radius * radius;
+ }
+}
+
+// NONMATCHING
+void dAcEremly_c::fn_177_77C0() {
+ const dAcPy_c *pPlayer = dAcPy_c::GetLink();
+ s32 a0 = getXZAngleToPlayer().mVal + -(s32)(0x7800);
+ mAng a1 = getXZAngleToPlayer() + 0x7800;
+
+ field_0xB32 = getXZAngleToPlayer() + 0x8000;
+ field_0xB32 += cM::rndFX(12288.f);
+
+ if (mAng::abs(a0 - pPlayer->mRotation.y) < mAng::abs(a1 - pPlayer->mRotation.y)) {
+ field_0xB34 = mAng(0x800);
+ } else {
+ field_0xB34 = mAng(0xf800);
+ }
+
+ field_0xB32 += field_0xB34;
+}
+
+void dAcEremly_c::fn_177_78D0() {
+ mWinkTimer = 0;
+ nw4r::g3d::ResFile fil = mMdl.getMdlFile();
+ nw4r::g3d::ResMdl mdl = fil.GetResMdl("Remly");
+ mMdl.getModel().setCullMode(m3d::getMatID(mdl, "mouth"), GX_CULL_BACK, false);
+ mMdl.getModel().setCullMode(m3d::getMatID(mdl, "eye_scary"), GX_CULL_BACK, false);
+ mMdl.getModel().setCullMode(m3d::getMatID(mdl, "night_set"), GX_CULL_BACK, false);
+
+ mTexPat.setAnm(mMdl.getModel(), fil.GetResAnmTexPat("RemlyScaryFace"), 0, m3d::PLAY_MODE_4);
+}
+
+// NONMATCHING
+void dAcEremly_c::fn_177_79D0(bool b) {
+ mMtx_c m;
+ mVec3_c in, out;
+ if (mRef1.isLinked()) {
+ m.YrotS(mRef1.get()->mRotationCopy.y + 0x5000);
+ in.set(0.f, 0.f, 120.f);
+ m.multVec(in, out);
+ out += mRef1.get()->getPosition();
+
+ if (!b) {
+ setPosition(out);
+ setOldPosition(getStartingPosition());
+ field_0xB38 = out.y;
+ setStartingRotation(mRotation);
+ }
+ setStartingPosition(out);
+ mTargetPosition.set(out);
+ }
+}
+
+bool dAcEremly_c::fn_177_7B10() {
+ s32 _weird_zero = 0;
+
+ if (dBgS_WtrChk::CheckPos(&mPosition, true, 600.f + _weird_zero, -100.f + _weird_zero)) {
+ field_0xB0C = dBgS_WtrChk::GetWaterHeight();
+
+ if (mPosition.y < dBgS_WtrChk::GetWaterHeight() && mAcch.GetGroundH() < dBgS_WtrChk::GetWaterHeight()) {
+ if (mAcch.GetGroundH() < -8.f + field_0xB0C) {
+ if (isState(StateID_Hold)) {
+ mLinkage.fn_80050EA0(this);
+ }
+ if (isState(StateID_Jump)) {
+ mAngle.y = mRotation.y;
+ }
+ if (!isState(StateID_Water)) {
+ changeState(StateID_Water);
+ }
+ }
+ return true;
+ }
+ }
+ return false;
+}
+
+void dAcEremly_c::nightSleepDemoImpl() {
+ s32 _weird_zero = 0;
+
+ if (mSleepDemoPlayedSceneflag == 0xFF ||
+ SceneflagManager::sInstance->checkBoolFlag(mRoomID, mSleepDemoPlayedSceneflag)) {
+ return;
+ }
+
+ dAcPy_c *pPlayer = dAcPy_c::GetLinkM();
+ dCamera_c *pCamera = dScGame_c::getCamera();
+
+ f32 x, y, z;
+ mVec3_c v, v2;
+ mMtx_c m, m2;
+ mAng a = mAngle.y - 0x4000;
+
+ switch (field_0xB63) {
+ case 0: {
+ if (!isWithinPlayerRadius(1500.f)) {
+ break;
+ }
+ field_0xB63++;
+ } // fallthrough
+ case 1: {
+ {
+ Event e("dAcEremly_c_nightRemly", 100, Event::makeEventFlag(1, 0x100001), nullptr, nullptr);
+ EventManager::alsoSetAsCurrentEvent(this, &e, nullptr);
+ }
+ if (!EventManager::isInEvent(this, "dAcEremly_c_nightRemly")) {
+ break;
+ }
+ mStartingRot = mRotation;
+ EventManager::fn_8009FA10(this, EventManager::getSkipOnlyEvent(), nullptr);
+ pPlayer->vt_0x2AC();
+ field_0xB63++;
+ } // fallthrough
+ case 2: {
+ mMdl.setAnm("RemlyDemo", m3d::PLAY_MODE_4, 0.f);
+ field_0xB60 = 26;
+
+ z = _weird_zero + -160.f;
+ y = _weird_zero + 80.f;
+ x = _weird_zero + 410.f;
+ v.set(x, y, z);
+ m.YrotS(a + 0x8000);
+ m.multVec(v, field_0xAB0);
+
+ field_0xAB0 += mStartingPos;
+ field_0xAC8 = field_0xAB0;
+ field_0xAE0 = field_0xAB0;
+
+ x = _weird_zero + 30.f;
+ y = _weird_zero + 30.f;
+ z = _weird_zero + 30.f;
+ v.set(z, y, x);
+
+ m.YrotS(a);
+ m.multVec(v, field_0xABC);
+
+ field_0xABC += mStartingPos;
+ field_0xAD4 = field_0xABC;
+ field_0xAEC = field_0xABC;
+
+ x = _weird_zero + -370.f;
+ y = 0.f;
+ z = 250.f;
+ v.set(x, y, z);
+
+ m.YrotS(a);
+ m.multVec(v, v2);
+ v2 += mStartingPos;
+
+ mAng3_c rot(0, getXZAngleToPlayer() + 0x8000, 0);
+ dAcPy_c::GetLinkM()->setPosRot(&v2, &rot, true, 0, 0);
+ dAcPy_c::GetLinkM()->triggerMoveEventMaybe(13, 1, 0, 0, 0, 0, 0);
+ field_0xB63++;
+ } // fallthrough
+ case 3: {
+ if (sLib::calcTimer(&field_0xB48)) {
+ break;
+ }
+ field_0xB48 = 60;
+ field_0xB63++;
+ } // fallthrough
+ case 4: {
+ if (sLib::calcTimer(&field_0xB48)) {
+ if (field_0xB48 == 58) {
+ z = _weird_zero + 170.f;
+ x = _weird_zero + -120.f;
+ v.set(x, 0.f, z);
+ m.YrotS(a);
+ m.multVec(v, v2);
+ v2 += mStartingPos;
+ dAcPy_c::GetLinkM()->triggerMoveEventMaybe(2, 0, 0, &v2, 0, 0, 0);
+ }
+ break;
+ }
+ field_0xB48 = 100;
+ field_0xB63++;
+ } // fallthrough
+ case 5: {
+ a = cLib::targetAngleY(field_0xAD4, field_0xAC8);
+ m.YrotS(a);
+ z = _weird_zero + -330.f;
+ y = _weird_zero;
+ x = _weird_zero;
+ v.set(x, y, z);
+ m.multVec(v, field_0xAE0);
+ field_0xAE0 += field_0xAC8;
+ if (sLib::calcTimer(&field_0xB48)) {
+ break;
+ }
+ field_0xB63++;
+ } // fallthrough
+ case 6: {
+ if (mMdl.getAnm().checkFrame(320.f)) {
+ mMtx_c m3, m4;
+ s32 scale = 95;
+ m2.transS(0.5f, 0.5f, 0.f);
+ y = scale / 100.f;
+ x = scale / 100.f;
+ m3.scaleS(x, y, 0.f);
+ m2 += m3;
+ m4.transS(-0.5f, -0.5f, 0.f);
+ m2 += m4;
+ dStageMgr_c::GetInstance()->procfn_800192F0(150, m2, 100);
+ dRumble_c::start(dRumble_c::sRumblePreset1, 1);
+ }
+ if (mMdl.getAnm().isStop()) {
+ mMdl.setRate(0.f);
+ field_0xB63 = 10;
+ }
+ break;
+ }
+ case 10: {
+ mSph.OnTgSet();
+ mSph.OnCoSet();
+ EventManager::finishEvent(this, nullptr);
+ dScGame_c::getCamera()->fn_8019EA70(true);
+ field_0xB48 = 3;
+ field_0xB63 = 11;
+ break;
+ }
+ case 11: {
+ if (0 == sLib::calcTimer(&field_0xB48)) {
+ changeState(StateID_NightWait);
+ mMdl.setAnm("RemlyWaitStandNight", m3d::PLAY_MODE_4, 0.f);
+ mAngle.y = mStartingRot.y + -30000;
+ mRotation.y = mAngle.y;
+ if (mSleepDemoPlayedSceneflag != 0xFF) {
+ SceneflagManager::sInstance->setFlag(mRoomID, mSleepDemoPlayedSceneflag);
+ }
+ }
+ }
+ }
+
+ if (field_0xB63 == 5) {
+ cLib::addCalcPos2(&field_0xAB0, field_0xAE0, 0.3f, 10.f);
+ }
+ if (field_0xB63 == 2 || field_0xB63 == 3 || field_0xB63 == 4 || field_0xB63 == 5 || field_0xB63 == 6 ||
+ field_0xB63 == 7 || field_0xB63 == 8 || field_0xB63 == 9) {
+ pCamera->setEventCamView(field_0xABC, field_0xAB0, 50.f, 0.f);
+ if (EventManager::fn_800A0B80()) {
+ mMdl.setRate(0.f);
+ field_0xB63 = 10;
+ }
+ }
+}
+
+void dAcEremly_c::fn_177_8520(bool b) {
+ s32 _weird_zero = 0;
+ if (!b && !mSpeed) {
+ return;
+ }
+
+ if ((++field_0xB28 & 3) == 0) {
+ fn_80030030(mPosition, field_0xB24, field_0xB26, 4.f + _weird_zero);
+ if ((u16)(field_0xB24 + 0x1800) > 0x3000U) {
+ field_0xB24 = 0;
+ } else if ((u16)(field_0xB26 + 0x1800) > 0x3000U) {
+ field_0xB26 = 0;
+ }
+ }
+}
+
+void dAcEremly_c::fn_177_8600() {
+ mMtx_c m;
+ mVec3_c in, out;
+ m.YrotS(mRotation.y);
+ in.set(0.f, 0.f, 15.f);
+ m.multVec(in, out);
+ out += mPosition;
+
+ dJEffManager_c::spawnGroundEffect(out, mPolyAttr0, mPolyAttr1, field_0x1B4, 1, mScale.x * 0.7f, field_0x1B0);
+}
+
+bool dAcEremly_c::fn_177_86C0() {
+ mVec3_c outpos;
+ if (dLightEnv_c::GetPInstance()->check_BPM8(&mPosition, &outpos)) {
+ field_0xA50.set(outpos);
+
+ if (!isScary()) {
+ if (isState(StateID_Hear) || isState(StateID_Sleep)) {
+ return true;
+ }
+
+ if (!dAcPy_c::GetLinkM()->isUsingHarp()) {
+ if (!isState(StateID_Scared) && field_0xB60 != 32) {
+ mMdl.setAnm("RemlySound", m3d::PLAY_MODE_4, 4.f);
+ field_0xB60 = 32;
+ mSpeed = 0.f;
+ }
+ } else if (isState(StateID_Scared) ||
+ (isState(StateID_Wait) && mAng::absDiff2(getXZAngleToPlayer(), mRotation.y) < 0x400)) {
+ if (field_0xB60 == 21) {
+ if (++field_0xB2C > 40) {
+ field_0xB64 = 1;
+ field_0xB14++;
+ }
+ return true;
+ }
+ changeState(StateID_Hear);
+ return true;
+ }
+ return false;
+ }
+ }
+
+ if (field_0xB2C > 0) {
+ field_0xB2C--;
+ }
+ return false;
+}
+
+bool dAcEremly_c::fn_177_8980(f32 f) {
+ dBgS_ObjGndChk gndChk;
+ mVec3_c v(mPosition);
+
+ v.y += 100.f;
+
+ getXZCirclePoint(v, mRotation.y, f);
+
+ gndChk.SetPos(&v);
+
+ f32 cross = dBgS::GetInstance()->GroundCross(&gndChk);
+ if (cross < mPosition.y - 1000.f || cross == -1e9f || dBgS::GetInstance()->GetGroundCode(gndChk) == 4) {
+ return true;
+ }
+ return false;
+}
+
+// NONMATCHING
+bool dAcEremly_c::fn_177_8AC0() {
+ bool b = (isState(STATE_16)) || (isState(STATE_17)) || (isState(STATE_13)) || (isState(STATE_14)) ||
+ (isState(STATE_15)) || (isState(STATE_5)) || (isState(STATE_21)) || (isState(STATE_6)) ||
+ (isState(STATE_8)) || (isState(STATE_7)) || (isState(STATE_10)) || (isState(STATE_22)) ||
+ (isState(STATE_23)) || (isState(STATE_24));
+ if (b) {
+ return true;
+ } else {
+ return false;
+ }
+}
+
+bool dAcEremly_c::fn_177_8C20(mAng a) {
+ s32 _weird_zero = 0;
+ if (fn_800301b0(mPositionCopy2, a, true, mSpeed + (120.f + _weird_zero)) == 2) {
+ if (std::abs(mPosition.y - field_0xAA4.y) < 4.f) {
+ field_0xB14++;
+ }
+ mStts.SetRank(11);
+ return true;
+ }
+
+ if (field_0xB6C || field_0xB6A || isState(StateID_Escape) || isState(StateID_EscapeDash)) {
+ mVec3_c v(mPosition);
+ f32 f = 150.f + _weird_zero;
+ getXZCirclePoint(v, mAngle.y, f);
+ if (dBgS_WtrChk::CheckPos(&v, true, 600.f + _weird_zero, -100.f + _weird_zero)) {
+ if (mPosition.y < dBgS_WtrChk::GetWaterHeight() && mAcch.GetGroundH() < dBgS_WtrChk::GetWaterHeight()) {
+ return true;
+ }
+ }
+ }
+
+ if (fn_800301b0(mPositionCopy2, mRotation.y, true, 120.f) == 1 ||
+ (mAcch.ChkWallHit(nullptr) && (mAng::abs(mAcchCir.GetWallAngleY() - mAng(mRotation.y + 0x8000)) < 0x800 ||
+ (mSpeed && std::abs(mPosition.y - field_0xAA4.y) < 4.f)))) {
+ if (mAng::absDiff2<mAng>(mRotation.y, cLib::targetAngleY(mPosition, mTargetPosition) < 0x200)) {
+ if ((++field_0xB18 & 7) == 0) {
+ field_0xB18 = 1;
+ return true;
+ }
+ }
+ } else {
+ field_0xB18 = 0;
+ }
+ return false;
+}
+
+bool dAcEremly_c::fn_177_8F90() {
+ if (field_0xB6A != 0) {
+ return false;
+ }
+ if (sLib::calcTimer(&field_0xB50)) {
+ return false;
+ }
+ const dAcPy_c *pPlayer = dAcPy_c::GetLink();
+
+ if (isState(StateID_Sleep)) {
+ if (fn_177_7510(400.f) && std::abs(mPosition.y - pPlayer->mPosition.y) < 100.f) {
+ return true;
+ }
+ } else if (isState(StateID_Walk)) {
+ if (!fn_177_7510(300.f)) {
+ changeState(StateID_Run);
+ return true;
+ }
+
+ if (!fn_177_6B10(false, -1000) && field_0xB69 == 0 && fn_177_7510(120.f)) {
+ sLib::addCalcScaled(&mSpeed, 0.7f, 5.f);
+ if (++field_0xB14 < 20) {
+ return false;
+ }
+ changeState(StateID_Wait);
+ return true;
+ }
+ } else if (isState(StateID_Run)) {
+ if (fn_177_7510(200.f)) {
+ field_0xB67 = 1;
+ changeState(StateID_Walk);
+ return true;
+ }
+
+ if (fn_177_8C20(mRotation.y)) {
+ changeState(StateID_Wait);
+ mMdl.setAnm("RemlyWaitSitCry", m3d::PLAY_MODE_4, 4.f);
+ field_0xB60 = 2;
+ return true;
+ }
+ } else if (field_0xB6E == 0 && field_0xB6C == 0) {
+ if (fn_177_8C20(getXZAngleToPlayer())) {
+ return false;
+ }
+
+ if (field_0xB18 == 0) {
+ (void)pPlayer->mPosition.absXZTo(mPosition);
+ if (!fn_177_7510(220.f)) {
+ field_0xB67 = 1;
+ changeState(StateID_Walk);
+ return true;
+ }
+ }
+
+ if (fn_177_6B10(false, 0)) {
+ field_0xB67 = 1;
+ changeState(StateID_Walk);
+ return true;
+ }
+ }
+ return false;
+}
+
+bool dAcEremly_c::fn_177_9370(f32 f) {
+ const dAcPy_c *pPlayer = dAcPy_c::GetLink();
+
+ if (!pPlayer->isRecovering() && pPlayer->mPosition.absXZTo(mStartingPos) < field_0xB08 &&
+ std::abs(mPosition.y - pPlayer->mPosition.y) < f + 200.f) {
+ return true;
+ }
+
+ return false;
+}
diff --git a/src/REL/d/a/e/d_a_e_sm.cpp b/src/REL/d/a/e/d_a_e_sm.cpp
index 195289f9..fec93ee2 100644
--- a/src/REL/d/a/e/d_a_e_sm.cpp
+++ b/src/REL/d/a/e/d_a_e_sm.cpp
@@ -512,7 +512,7 @@ int dAcEsm_c::actorExecute() {
mHitPos.set(0.f, 0.f, 0.f);
if (0 == sLib::calcTimer(&mDamageTimer)) {
- field_0xB94 = fn_8002fde0(mSph, nullptr);
+ field_0xB94 = fn_8002FDE0(mSph, nullptr);
if (field_0xB94 != 0) {
if (mSph.ChkTgHit()) {
if (field_0xB94 == 7) {