summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorElijah Thomas <42302100+elijah-thomas774@users.noreply.github.com>2026-05-28 14:32:52 -0400
committerGitHub <noreply@github.com>2026-05-28 14:32:52 -0400
commit83f216dd37e56efddd1d19351836f3b03f074058 (patch)
tree8da270877638838dd70054bf5cd5eadac74bc934
parent45374694e7e33db110983312c3e2525a6993dc76 (diff)
parent1b61a62a004ceb93a60eb4192ccbb6b601494d5c (diff)
Merge pull request #312 from elijah-thomas774/d_a_e_ks
dAcEKs_c
-rw-r--r--config/SOUE01/rels/d_a_e_ksNP/symbols.txt174
-rw-r--r--config/SOUE01/symbols.txt20
-rw-r--r--configure.py2
-rw-r--r--include/c/c_lib.h1
-rw-r--r--include/d/a/d_a_player.h4
-rw-r--r--include/d/a/e/d_a_e_ks.h281
-rw-r--r--include/d/a/e/d_a_en_base.h19
-rw-r--r--include/d/a/obj/d_a_obj_base.h3
-rw-r--r--include/d/col/c/c_cc_d.h18
-rw-r--r--include/d/d_player_act.h8
-rw-r--r--include/d/d_pouch.h2
-rw-r--r--include/d/t/d_t_ks.h103
-rw-r--r--include/f/f_base.h3
-rw-r--r--include/toBeSorted/d_path.h34
-rw-r--r--src/REL/d/a/e/d_a_e_ks.cpp3162
-rw-r--r--src/REL/d/a/e/d_a_e_remly.cpp3
-rw-r--r--src/REL/d/a/e/d_a_e_sm.cpp12
-rw-r--r--src/REL/d/a/obj/d_a_obj_dungeon_ship.cpp20
-rw-r--r--src/REL/d/t/d_t_beetle.cpp2
-rw-r--r--src/d/a/d_a_item.cpp16
-rw-r--r--src/d/col/c/c_cc_d.cpp2
-rw-r--r--src/d/d_pad.cpp2
-rw-r--r--src/d/lyt/meter/d_lyt_meter.cpp13
-rw-r--r--src/d/lyt/meter/d_lyt_meter_ganbari_gauge.cpp4
-rw-r--r--src/d/snd/d_snd_sound_equipment_callbacks.cpp2
-rw-r--r--src/toBeSorted/d_path.cpp23
26 files changed, 3724 insertions, 209 deletions
diff --git a/config/SOUE01/rels/d_a_e_ksNP/symbols.txt b/config/SOUE01/rels/d_a_e_ksNP/symbols.txt
index 0737e933..0ff7baa8 100644
--- a/config/SOUE01/rels/d_a_e_ksNP/symbols.txt
+++ b/config/SOUE01/rels/d_a_e_ksNP/symbols.txt
@@ -3,76 +3,75 @@ _epilog = .text:0x00000030; // type:function size:0x2C scope:global
_unresolved = .text:0x00000060; // type:function size:0x4 scope:global
__register_global_object = .text:0x00000070; // type:function size:0x1C scope:global
__destroy_global_chain = .text:0x00000090; // type:function size:0x54 scope:global
-fn_155_F0 = .text:0x000000F0; // type:function size:0x40
+__dt__7mVec3_cFv = .text:0x000000F0; // type:function size:0x40
dAcEKs_c_classInit__Fv = .text:0x00000130; // type:function size:0x190
-fn_155_2C0 = .text:0x000002C0; // type:function size:0x58
+__dt__15dShadowCircle_cFv = .text:0x000002C0; // type:function size:0x58
__dt__20sFState_c<8dAcEKs_c>Fv = .text:0x00000320; // type:function size:0x58
__dt__23sFStateFct_c<8dAcEKs_c>Fv = .text:0x00000380; // type:function size:0x6C
__dt__76sStateMgr_c<8dAcEKs_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x000003F0; // type:function size:0xA0
__dt__46sFStateMgr_c<8dAcEKs_c,20sStateMethodUsr_FI_c>Fv = .text:0x00000490; // type:function size:0xA4
-fn_155_540 = .text:0x00000540; // type:function size:0x5C
-fn_155_5A0 = .text:0x000005A0; // type:function size:0x4
-fn_155_5B0 = .text:0x000005B0; // type:function size:0x134
-fn_155_6F0 = .text:0x000006F0; // type:function size:0x8
-fn_155_700 = .text:0x00000700; // type:function size:0x1A8
+__dt__14dWaterEffect_cFv = .text:0x00000540; // type:function size:0x5C
+__ct__7mVec3_cFv = .text:0x000005A0; // type:function size:0x4
+restorePosRotFromCopy__8dAcEKs_cFv = .text:0x000005B0; // type:function size:0x134
+linkKiesuTag__8dAcEKs_cFP13dTgKiesuTag_c = .text:0x000006F0; // type:function size:0x8
+setStartingState__8dAcEKs_cFv = .text:0x00000700; // type:function size:0x1A8
changeState__76sStateMgr_c<8dAcEKs_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>FRC12sStateIDIf_c = .text:0x000008B0; // type:function size:0x10
-AcEKs__idleBasedOnSubtypeMaybe = .text:0x000008C0; // type:function size:0xCC
-fn_155_990 = .text:0x00000990; // type:function size:0xD0
-fn_155_A60 = .text:0x00000A60; // type:function size:0x6B0
+setIdleState__8dAcEKs_cFv = .text:0x000008C0; // type:function size:0xCC
+getLineCrossYRange__8dAcEKs_cFRC7mVec3_cf = .text:0x00000990; // type:function size:0xD0
+fn_155_A60__8dAcEKs_cFv = .text:0x00000A60; // type:function size:0x6B0
getStateID__76sStateMgr_c<8dAcEKs_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x00001110; // type:function size:0x10
-fn_155_1120 = .text:0x00001120; // type:function size:0x1C
-fn_155_1140 = .text:0x00001140; // type:function size:0x12C
-fn_155_1270 = .text:0x00001270; // type:function size:0x54
-fn_155_12D0 = .text:0x000012D0; // type:function size:0xA0
-fn_155_1370 = .text:0x00001370; // type:function size:0x58
-fn_155_13D0 = .text:0x000013D0; // type:function size:0x58
-fn_155_1430 = .text:0x00001430; // type:function size:0x38
-fn_155_1470 = .text:0x00001470; // type:function size:0x80C
-fn_155_1C80 = .text:0x00001C80; // type:function size:0x5E4
-fn_155_2270 = .text:0x00002270; // type:function size:0x754
-fn_155_29D0 = .text:0x000029D0; // type:function size:0x1A8
-fn_155_2B80 = .text:0x00002B80; // type:function size:0x1E0
-fn_155_2D60 = .text:0x00002D60; // type:function size:0x138
-fn_155_2EA0 = .text:0x00002EA0; // type:function size:0x118
-fn_155_2FC0 = .text:0x00002FC0; // type:function size:0x84
-fn_155_3050 = .text:0x00003050; // type:function size:0xAC
-fn_155_3100 = .text:0x00003100; // type:function size:0xF4
-fn_155_3200 = .text:0x00003200; // type:function size:0xA4
-fn_155_32B0 = .text:0x000032B0; // type:function size:0x94
-fn_155_3350 = .text:0x00003350; // type:function size:0x94
-fn_155_33F0 = .text:0x000033F0; // type:function size:0x68
-fn_155_3460 = .text:0x00003460; // type:function size:0x14
-fn_155_3480 = .text:0x00003480; // type:function size:0x34
-fn_155_34C0 = .text:0x000034C0; // type:function size:0x1A8
-AcEKs__setAnim = .text:0x00003670; // type:function size:0xA8
-fn_155_3720 = .text:0x00003720; // type:function size:0x30
-fn_155_3750 = .text:0x00003750; // type:function size:0x44
-fn_155_37A0 = .text:0x000037A0; // type:function size:0x50
-fn_155_37F0 = .text:0x000037F0; // type:function size:0x44
-fn_155_3840 = .text:0x00003840; // type:function size:0x4C
-fn_155_3890 = .text:0x00003890; // type:function size:0x40
-fn_155_38D0 = .text:0x000038D0; // type:function size:0x10
-fn_155_38E0 = .text:0x000038E0; // type:function size:0x10
-fn_155_38F0 = .text:0x000038F0; // type:function size:0x4
-fn_155_3900 = .text:0x00003900; // type:function size:0x268
-AcEKs__setAnglesToPoints = .text:0x00003B70; // type:function size:0x58
-fn_155_3BD0 = .text:0x00003BD0; // type:function size:0x10
-fn_155_3BE0 = .text:0x00003BE0; // type:function size:0x178
-fn_155_3D60 = .text:0x00003D60; // type:function size:0xA8
-fn_155_3E10 = .text:0x00003E10; // type:function size:0x1C
-fn_155_3E30 = .text:0x00003E30; // type:function size:0x24
-fn_155_3E60 = .text:0x00003E60; // type:function size:0x2C
-fn_155_3E90 = .text:0x00003E90; // type:function size:0x24
-fn_155_3EC0 = .text:0x00003EC0; // type:function size:0x24
-fn_155_3EF0 = .text:0x00003EF0; // type:function size:0x5C
-fn_155_3F50 = .text:0x00003F50; // type:function size:0x10C
-AcEKs__initModels = .text:0x00004060; // type:function size:0x120
-AcEKs__init1 = .text:0x00004180; // type:function size:0x57C
-AcEKs__init2 = .text:0x00004700; // type:function size:0x178
-AcEKs__destroy = .text:0x00004880; // type:function size:0x44
-AcEKs__update = .text:0x000048D0; // type:function size:0xCEC
+calcTimer<Uc>__4sLibFPUc_Uc = .text:0x00001120; // type:function size:0x1C
+kill__8dAcEKs_cFb = .text:0x00001140; // type:function size:0x12C
+chaseTargetY__8dAcEKs_cFff = .text:0x00001270; // type:function size:0x54
+playBlinkAnm__8dAcEKs_cFv = .text:0x000012D0; // type:function size:0xA0
+soundSqueak__8dAcEKs_cFv = .text:0x00001370; // type:function size:0x58
+soundStun__8dAcEKs_cFv = .text:0x000013D0; // type:function size:0x58
+fn_155_1430__8dAcEKs_cFv = .text:0x00001430; // type:function size:0x38
+fn_155_1470__8dAcEKs_cFv = .text:0x00001470; // type:function size:0x80C
+fn_155_1C80__8dAcEKs_cFv = .text:0x00001C80; // type:function size:0x5E4
+fn_155_2270__8dAcEKs_cFv = .text:0x00002270; // type:function size:0x754
+fn_155_29D0__8dAcEKs_cFl = .text:0x000029D0; // type:function size:0x1A8
+fn_155_2B80__8dAcEKs_cFbl = .text:0x00002B80; // type:function size:0x1E0
+fn_155_2D60__8dAcEKs_cFbl = .text:0x00002D60; // type:function size:0x138
+fn_155_2EA0__8dAcEKs_cFv = .text:0x00002EA0; // type:function size:0x118
+isOutsideRange__8dAcEKs_cFv = .text:0x00002FC0; // type:function size:0x84
+isNotWaitingNorDamage__8dAcEKs_cFv = .text:0x00003050; // type:function size:0xAC
+isTargeted__8dAcEKs_cFv = .text:0x00003100; // type:function size:0xF4
+checkWallCross__8dAcEKs_cFv = .text:0x00003200; // type:function size:0xA4
+adjustTargetGnd__8dAcEKs_cFv = .text:0x000032B0; // type:function size:0x94
+adjustTargetRoof__8dAcEKs_cFv = .text:0x00003350; // type:function size:0x94
+ChkHit__8dAcEKs_cFv = .text:0x000033F0; // type:function size:0x68
+fn_155_3460__8dAcEKs_cFv = .text:0x00003460; // type:function size:0x14
+fn_155_3480__8dAcEKs_cFv = .text:0x00003480; // type:function size:0x34
+transitionToNextState__8dAcEKs_cFv = .text:0x000034C0; // type:function size:0x1A8
+setAnim__8dAcEKs_cFPcfff = .text:0x00003670; // type:function size:0xA8
+fn_155_3720__8dAcEKs_cFff = .text:0x00003720; // type:function size:0x30
+fn_155_3750__8dAcEKs_cFUc = .text:0x00003750; // type:function size:0x44
+fn_155_37A0__8dAcEKs_cFv = .text:0x000037A0; // type:function size:0x50
+fn_155_37F0__8dAcEKs_cFv = .text:0x000037F0; // type:function size:0x44
+fn_155_3840__8dAcEKs_cFv = .text:0x00003840; // type:function size:0x4C
+fn_155_3890__8dAcEKs_cFv = .text:0x00003890; // type:function size:0x40
+on_lbl_155_bss_389__8dAcEKs_cFv = .text:0x000038D0; // type:function size:0x10
+setBlinkChecked__8dAcEKs_cFUc = .text:0x000038E0; // type:function size:0x14
+fn_155_3900__8dAcEKs_cFl = .text:0x00003900; // type:function size:0x268
+setPitchYawToPoint__8dAcEKs_cFRC7mVec3_c = .text:0x00003B70; // type:function size:0x58
+fn_155_3BD0__8dAcEKs_cFRC7mVec3_c = .text:0x00003BD0; // type:function size:0x10
+fn_155_3BE0__8dAcEKs_cFRC7mVec3_c = .text:0x00003BE0; // type:function size:0x178
+setBlink__8dAcEKs_cFUc = .text:0x00003D60; // type:function size:0xA8
+checkPathPntParam__8dAcEKs_cFUl = .text:0x00003E10; // type:function size:0x1C
+fn_155_3E30__8dAcEKs_cFv = .text:0x00003E30; // type:function size:0x24
+clampRotationX__8dAcEKs_cFv = .text:0x00003E60; // type:function size:0x2C
+fn_155_3E90__8dAcEKs_cFv = .text:0x00003E90; // type:function size:0x24
+fn_155_3EC0__8dAcEKs_cFv = .text:0x00003EC0; // type:function size:0x24
+fn_155_3EF0__8dAcEKs_cFv = .text:0x00003EF0; // type:function size:0x5C
+fn_155_3F50__8dAcEKs_cFv = .text:0x00003F50; // type:function size:0x10C
+createHeap__8dAcEKs_cFv = .text:0x00004060; // type:function size:0x120
+actorCreate__8dAcEKs_cFv = .text:0x00004180; // type:function size:0x57C
+actorPostCreate__8dAcEKs_cFv = .text:0x00004700; // type:function size:0x178
+doDelete__8dAcEKs_cFv = .text:0x00004880; // type:function size:0x44
+actorExecute__8dAcEKs_cFv = .text:0x000048D0; // type:function size:0xCEC
executeState__76sStateMgr_c<8dAcEKs_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x000055C0; // type:function size:0x10
-AcEKs__draw = .text:0x000055D0; // type:function size:0x1F4
+draw__8dAcEKs_cFv = .text:0x000055D0; // type:function size:0x1F4
initializeState_Wait__8dAcEKs_cFv = .text:0x000057D0; // type:function size:0x1EC
executeState_Wait__8dAcEKs_cFv = .text:0x000059C0; // type:function size:0x768
finalizeState_Wait__8dAcEKs_cFv = .text:0x00006130; // type:function size:0xA4
@@ -115,10 +114,10 @@ finalizeState_WindBlow__8dAcEKs_cFv = .text:0x000092E0; // type:function size:0x
initializeState_PathMove__8dAcEKs_cFv = .text:0x00009380; // type:function size:0x184
executeState_PathMove__8dAcEKs_cFv = .text:0x00009510; // type:function size:0x7A8
finalizeState_PathMove__8dAcEKs_cFv = .text:0x00009CC0; // type:function size:0xC
-fn_155_9CD0 = .text:0x00009CD0; // type:function size:0x8
-fn_155_9CE0 = .text:0x00009CE0; // type:function size:0x4
-fn_155_9CF0 = .text:0x00009CF0; // type:function size:0x4
-fn_155_9D00 = .text:0x00009D00; // type:function size:0x8
+vt_0x88__11dAcEnBase_cFi = .text:0x00009CD0; // type:function size:0x8
+vt_0x84__11dAcEnBase_cFv = .text:0x00009CE0; // type:function size:0x4
+vt_0x80__11dAcEnBase_cFv = .text:0x00009CF0; // type:function size:0x4
+getObjectListEntry__11dAcEnBase_cFv = .text:0x00009D00; // type:function size:0x8
__dt__8dAcEKs_cFv = .text:0x00009D10; // type:function size:0x16C
build__23sFStateFct_c<8dAcEKs_c>FRC12sStateIDIf_c = .text:0x00009E80; // type:function size:0x60
dispose__23sFStateFct_c<8dAcEKs_c>FRP10sStateIf_c = .text:0x00009EE0; // type:function size:0xC
@@ -175,28 +174,31 @@ lbl_155_data_188 = .data:0x00000188; // type:object size:0x7 data:string
lbl_155_data_190 = .data:0x00000190; // type:object size:0x8 data:string
lbl_155_data_198 = .data:0x00000198; // type:object size:0x4 data:4byte
lbl_155_data_19C = .data:0x0000019C; // type:object size:0x4 data:4byte
-AcEKs__vtable = .data:0x000001A0; // type:object size:0x90
-lbl_155_data_230 = .data:0x00000230; // type:object size:0x30
-lbl_155_data_260 = .data:0x00000260; // type:object size:0x30
-lbl_155_data_290 = .data:0x00000290; // type:object size:0x18
-lbl_155_data_2A8 = .data:0x000002A8; // type:object size:0x18
-lbl_155_data_2C0 = .data:0x000002C0; // type:object size:0xC
-lbl_155_data_2CC = .data:0x000002CC; // type:object size:0x388
+__vt__8dAcEKs_c = .data:0x000001A0; // type:object size:0x90
+__vt__46sFStateMgr_c<8dAcEKs_c,20sStateMethodUsr_FI_c> = .data:0x00000230; // type:object size:0x30
+__vt__76sStateMgr_c<8dAcEKs_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c> = .data:0x00000260; // type:object size:0x30
+__vt__23sFStateFct_c<8dAcEKs_c> = .data:0x00000290; // type:object size:0x18
+__vt__20sFState_c<8dAcEKs_c> = .data:0x000002A8; // type:object size:0x18
+__vt__14dWaterEffect_c = .data:0x000002C0; // type:object size:0xC
+__vt__15dShadowCircle_c = .data:0x000002CC; // type:object size:0x388
lbl_155_data_654 = .data:0x00000654; // type:object size:0x34
__global_destructor_chain = .bss:0x00000000; // type:object size:0x4 scope:global
lbl_155_bss_8 = .bss:0x00000008; // type:object size:0x10 data:4byte
-AcEKs__StateID_Wait = .bss:0x00000018; // type:object size:0x40 data:4byte
-AcEKs__StateID_WakeUp = .bss:0x00000058; // type:object size:0x40 data:4byte
-AcEKs__StateID_ReturnToWait = .bss:0x00000098; // type:object size:0x40 data:4byte
-AcEKs__StateID_WaitReady = .bss:0x000000D8; // type:object size:0x80 data:4byte
-AcEKs__StateID_Chase = .bss:0x00000158; // type:object size:0x40 data:4byte
-AcEKs__StateID_ChaseAttack = .bss:0x00000198; // type:object size:0x40 data:4byte
-AcEKs__StateID_Fighting = .bss:0x000001D8; // type:object size:0x40 data:4byte
-AcEKs__StateID_AttackReady = .bss:0x00000218; // type:object size:0x40 data:4byte
-AcEKs__StateID_Attack = .bss:0x00000258; // type:object size:0x40 data:4byte
-AcEKs__StateID_Damage = .bss:0x00000298; // type:object size:0x40 data:4byte
-AcEKs__StateID_Stun = .bss:0x000002D8; // type:object size:0xB0 data:4byte
-lbl_155_bss_388 = .bss:0x00000388; // type:object size:0x1 data:byte
-lbl_155_bss_389 = .bss:0x00000389; // type:object size:0x1 data:byte
+StateID_Wait__8dAcEKs_c = .bss:0x00000018; // type:object size:0x30 data:4byte
+StateID_WakeUp__8dAcEKs_c = .bss:0x00000058; // type:object size:0x30 data:4byte
+StateID_ReturnToWait__8dAcEKs_c = .bss:0x00000098; // type:object size:0x30 data:4byte
+StateID_WaitReady__8dAcEKs_c = .bss:0x000000D8; // type:object size:0x30 data:4byte
+StateID_Move__8dAcEKs_c = .bss:0x00000118; // type:object size:0x30 data:4byte
+StateID_Chase__8dAcEKs_c = .bss:0x00000158; // type:object size:0x30 data:4byte
+StateID_ChaseAttack__8dAcEKs_c = .bss:0x00000198; // type:object size:0x30 data:4byte
+StateID_Fighting__8dAcEKs_c = .bss:0x000001D8; // type:object size:0x30 data:4byte
+StateID_AttackReady__8dAcEKs_c = .bss:0x00000218; // type:object size:0x30 data:4byte
+StateID_Attack__8dAcEKs_c = .bss:0x00000258; // type:object size:0x30 data:4byte
+StateID_Damage__8dAcEKs_c = .bss:0x00000298; // type:object size:0x30 data:4byte
+StateID_Stun__8dAcEKs_c = .bss:0x000002D8; // type:object size:0x30 data:4byte
+StateID_WindBlow__8dAcEKs_c = .bss:0x00000318; // type:object size:0x30 data:4byte
+StateID_PathMove__8dAcEKs_c = .bss:0x00000358; // type:object size:0x30 data:4byte
+lbl_155_bss_388__8dAcEKs_c = .bss:0x00000388; // type:object size:0x1 data:byte
+lbl_155_bss_389__8dAcEKs_c = .bss:0x00000389; // type:object size:0x1 data:byte
lbl_155_bss_38A = .bss:0x0000038A; // type:object size:0x1 data:byte
lbl_155_bss_38C = .bss:0x0000038C; // type:object size:0x1C align:4 data:float
diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt
index ca7cffb4..954befa5 100644
--- a/config/SOUE01/symbols.txt
+++ b/config/SOUE01/symbols.txt
@@ -978,7 +978,7 @@ polyAttrsToGroundEffectIdx__14dJEffManager_cFll = .text:0x8002A380; // type:func
spawnGroundEffect__14dJEffManager_cFRC7mVec3_cUcUcRC7mVec3_clff = .text:0x8002A450; // type:function size:0x1C0
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
+getBeetleInFlight__17daPlayerActBase_cCFv = .text:0x8002B0F0; // type:function size:0x8
init__14dWaterEffect_cFP12dAcObjBase_cfff = .text:0x8002B100; // type:function size:0x14
execute__14dWaterEffect_cFff = .text:0x8002B120; // type:function size:0x1F4
drawAfter__18JPAEmitterCallBackFP14JPABaseEmitter = .text:0x8002B320; // type:function size:0x4
@@ -1159,8 +1159,8 @@ fn_8002F710 = .text:0x8002F710; // type:function size:0x110
checkRefArrayAtIndex__17daPlayerActBase_cFv = .text:0x8002F820; // type:function size:0x8
sizeOfActorRefs_16__17daPlayerActBase_cFv = .text:0x8002F830; // type:function size:0x8
fn_8002F840 = .text:0x8002F840; // type:function size:0x8
-fn_8002F850 = .text:0x8002F850; // type:function size:0x70
-fn_8002F8C0 = .text:0x8002F8C0; // type:function size:0x70
+playDeathEffect0__11dAcEnBase_cFRC7mVec3_cPC7mVec3_cb = .text:0x8002F850; // type:function size:0x70
+playDeathEffect1__11dAcEnBase_cFRC7mVec3_cPC7mVec3_cb = .text:0x8002F8C0; // type:function size:0x70
fn_8002F930 = .text:0x8002F930; // type:function size:0xB4
ActorEnemyBase__setEndat = .text:0x8002F9F0; // type:function size:0x88
fn_8002FA80 = .text:0x8002FA80; // type:function size:0xB4
@@ -1178,11 +1178,11 @@ checkSlope__11dAcEnBase_cFRC7mVec3_cRsRsf = .text:0x80030030; // type:function s
fn_800301b0__11dAcEnBase_cFRC7mVec3_c4mAngbf = .text:0x800301B0; // type:function size:0x1D4
fn_80030390 = .text:0x80030390; // type:function size:0x64
fn_80030400__11dAcEnBase_cFRQ23m3d5mdl_cUcbUc = .text:0x80030400; // type:function size:0x168
-fn_80030570 = .text:0x80030570; // type:function size:0x144
+fn_80030570__11dAcEnBase_cFRQ23m3d5mdl_cUcf = .text:0x80030570; // type:function size:0x144
fn_800306C0 = .text:0x800306C0; // type:function size:0x10
-fn_800306D0 = .text:0x800306D0; // type:function size:0x24
-fn_80030700 = .text:0x80030700; // type:function size:0x24
-fn_80030730 = .text:0x80030730; // type:function size:0xB0
+fn_800306D0__11dAcEnBase_cFv = .text:0x800306D0; // type:function size:0x24
+fn_80030700__11dAcEnBase_cFv = .text:0x80030700; // type:function size:0x24
+targetPlayerOrScrapper__11dAcEnBase_cFf = .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
@@ -3718,7 +3718,7 @@ fn_800A9860 = .text:0x800A9860; // type:function size:0x50
getRemainingDistanceOnSegment__15ActorOnRail_ExtCFv = .text:0x800A98B0; // type:function size:0x58
getNextPointIndex__15ActorOnRail_ExtCFl = .text:0x800A9910; // type:function size:0x48
getNextPointIndex__15ActorOnRail_ExtCFv = .text:0x800A9960; // type:function size:0x8
-fn_800A9970 = .text:0x800A9970; // type:function size:0x58
+getNextPointIndex2__15ActorOnRail_ExtCFv = .text:0x800A9970; // type:function size:0x58
getClosestXZPoint__15ActorOnRail_ExtCFRC7mVec3_c = .text:0x800A99D0; // type:function size:0xE0
setSegment__15ActorOnRail_ExtFlf = .text:0x800A9AB0; // type:function size:0x50
checkPosInAREA = .text:0x800A9B00; // type:function size:0xC4
@@ -10102,7 +10102,7 @@ fn_8018B1D0 = .text:0x8018B1D0; // type:function size:0x60
fn_8018B230 = .text:0x8018B230; // type:function size:0x74
ActorLink__handleHotPumpkinSoup = .text:0x8018B2B0; // type:function size:0xE4
fn_8018B3A0 = .text:0x8018B3A0; // type:function size:0x80
-shouldDropItemForChance = .text:0x8018B420; // type:function size:0x84
+tryDropItem__Ff = .text:0x8018B420; // type:function size:0x84
getMaxBeaconCount__Fv = .text:0x8018B4B0; // type:function size:0x44
doesStageForbidBeaconPlacement__Fv = .text:0x8018B500; // type:function size:0x40
getBeaconPosition__FUl = .text:0x8018B540; // type:function size:0x60
@@ -17268,7 +17268,7 @@ addCalcPos__4cLibFP7mVec3_cRC7mVec3_cfff = .text:0x802DFD90; // type:function si
addCalcPosXZ__4cLibFP7mVec3_cRC7mVec3_cfff = .text:0x802DFFD0; // type:function size:0x1B8
addCalcPos2__4cLibFP7mVec3_cRC7mVec3_cff = .text:0x802E0190; // type:function size:0x13C
cLib__addCalcPosXZ2 = .text:0x802E02D0; // type:function size:0xF8
-cLib__chasePos = .text:0x802E03D0; // type:function size:0x174
+chasePos__4cLibFR7mVec3_cR7mVec3_cf = .text:0x802E03D0; // type:function size:0x174
chasePosXZ__4cLibFR7mVec3_cR7mVec3_cf = .text:0x802E0550; // type:function size:0x124
targetAngleY__4cLibFRC7mVec3_cRC7mVec3_c = .text:0x802E0680; // type:function size:0x1C
targetAngleX__4cLibFRC7mVec3_cRC7mVec3_c = .text:0x802E06A0; // type:function size:0x68
diff --git a/configure.py b/configure.py
index 9cbb56eb..ddfc87ec 100644
--- a/configure.py
+++ b/configure.py
@@ -2118,7 +2118,7 @@ config.libs = [
Rel(NonMatching, "d_a_e_hp", "REL/d/a/e/d_a_e_hp.cpp"),
Rel(NonMatching, "d_a_e_hydra", "REL/d/a/e/d_a_e_hydra.cpp"),
Rel(NonMatching, "d_a_e_kg", "REL/d/a/e/d_a_e_kg.cpp"),
- Rel(NonMatching, "d_a_e_ks", "REL/d/a/e/d_a_e_ks.cpp"),
+ Rel(Matching, "d_a_e_ks", "REL/d/a/e/d_a_e_ks.cpp"),
Rel(NonMatching, "d_a_e_kumite_gira", "REL/d/a/e/d_a_e_kumite_gira.cpp"),
Rel(NonMatching, "d_a_e_lizarufos", "REL/d/a/e/d_a_e_lizarufos.cpp"),
Rel(NonMatching, "d_a_e_liza_tail", "REL/d/a/e/d_a_e_liza_tail.cpp"),
diff --git a/include/c/c_lib.h b/include/c/c_lib.h
index be7b0d5e..c31d9bf9 100644
--- a/include/c/c_lib.h
+++ b/include/c/c_lib.h
@@ -12,6 +12,7 @@ s16 offsetPos(mVec3_c &target, const mVec3_c &v1, s16 angle, const mVec3_c &v2);
void addCalcPos2(mVec3_c *src, const mVec3_c &target, f32 scale, f32 maxStep);
f32 addCalcPosXZ(mVec3_c *src, const mVec3_c &target, f32 scale, f32 maxStep, f32 minStep);
f32 addCalcPos(mVec3_c *src, const mVec3_c &target, f32 scale, f32 maxStep, f32 minStep);
+bool chasePos(mVec3_c &, mVec3_c &, f32);
bool chasePosXZ(mVec3_c &, mVec3_c &, f32);
// made up name
diff --git a/include/d/a/d_a_player.h b/include/d/a/d_a_player.h
index c1d45efd..e5e6669c 100644
--- a/include/d/a/d_a_player.h
+++ b/include/d/a/d_a_player.h
@@ -91,10 +91,6 @@ public:
return mHeldResFile;
}
- inline bool hasvt_0x1C0() const {
- return vt_0x1C0() != nullptr;
- }
-
inline bool isAffectedByStaminaPotion() const {
return FileManager::GetInstance()->hasStaminaPotionNormal() && getRidingActorType() != RIDING_BOAT;
}
diff --git a/include/d/a/e/d_a_e_ks.h b/include/d/a/e/d_a_e_ks.h
index 73fbc269..d63150e8 100644
--- a/include/d/a/e/d_a_e_ks.h
+++ b/include/d/a/e/d_a_e_ks.h
@@ -1,14 +1,35 @@
#ifndef D_A_E_KS_H
#define D_A_E_KS_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_light_env.h"
+#include "m/m3d/m_anmtexpat.h"
+#include "m/m_mtx.h"
+#include "m/m_vec.h"
+#include "nw4r/g3d/res/g3d_resfile.h"
#include "s/s_State.hpp"
+#include "toBeSorted/d_emitter.h"
+#include "toBeSorted/d_path.h"
+#include "toBeSorted/time_area_mgr.h"
+class dTgKiesuTag_c;
class dAcEKs_c : public dAcEnBase_c {
public:
dAcEKs_c() : mStateMgr(*this) {}
virtual ~dAcEKs_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;
+ virtual bool restorePosRotFromCopy() override;
+
STATE_FUNC_DECLARE(dAcEKs_c, Wait);
STATE_FUNC_DECLARE(dAcEKs_c, WakeUp);
STATE_FUNC_DECLARE(dAcEKs_c, ReturnToWait);
@@ -24,8 +45,266 @@ public:
STATE_FUNC_DECLARE(dAcEKs_c, WindBlow);
STATE_FUNC_DECLARE(dAcEKs_c, PathMove);
+ STATE_MGR_DEFINE_UTIL_CHANGESTATE(dAcEKs_c);
+ STATE_MGR_DEFINE_UTIL_ISSTATE(dAcEKs_c);
+
+ enum Type_e {
+ EKS_NORMAL,
+ EKS_FIRE,
+ EKS_ELECTRIC,
+ EKS_CURSED,
+ };
+ enum StartingStateParam_e {
+ EKS_STARTSTATE_Move = 0,
+ EKS_STARTSTATE_Wait = 1,
+ EKS_STARTSTATE_PathMove = 2,
+ };
+ enum State_e {
+ EKS_STATE_Move = 0,
+ EKS_STATE_Wait = 1,
+ EKS_STATE_PathMove = 2,
+ EKS_STATE_WakeUp = 4,
+ EKS_STATE_ReturnToWait = 5,
+ EKS_STATE_Chase = 6,
+ EKS_STATE_ChaseAttack = 7,
+ EKS_STATE_Fighting = 8,
+ EKS_STATE_AttackReady = 9,
+ EKS_STATE_Attack = 10,
+ EKS_STATE_Damage = 11,
+ EKS_STATE_Stun = 12,
+ EKS_STATE_WindBlow = 13,
+ };
+ enum AnmTexPat_e {
+ EKS_TEXPAT_BLINK1,
+ EKS_TEXPAT_BLINK2,
+ EKS_TEXPAT_BLINK3,
+ };
+
+public:
+ void linkKiesuTag(dTgKiesuTag_c *pTgKs);
+ void setStartingState();
+ void setIdleState();
+
+ void fn_155_A60();
+
+ f32 getLineCrossYRange(const mVec3_c &pos, f32 range);
+
+ void kill(bool dropItem);
+ void chaseTargetY(f32, f32);
+ void playBlinkAnm();
+ void soundSqueak();
+ void soundStun();
+ void fn_155_1430();
+
+ void fn_155_1470();
+
+ // Move impl?
+ void fn_155_1C80();
+
+ /* 0 -> blink_1, 1 -> blink_2, 2 -> blink_3*/
+ void setBlink(u8 blink);
+ void setBlinkChecked(u8 blink);
+
+ void fn_155_2270();
+ /* p1 = 0 -> just LineCross return check, 1 -> increment field_0xDCB till 10 then return check*/
+ bool fn_155_29D0(s32 p1);
+ bool fn_155_2B80(bool b, s32 p1);
+ bool fn_155_2D60(bool b, s32 p1);
+ bool fn_155_2EA0();
+ bool isOutsideRange();
+ bool isNotWaitingNorDamage();
+ bool isTargeted();
+ bool checkWallCross();
+ void adjustTargetGnd();
+ void adjustTargetRoof();
+ bool ChkHit();
+ void fn_155_3460();
+ void fn_155_3480();
+ bool transitionToNextState();
+ void setAnim(char *, f32, f32, f32);
+ void fn_155_3720(f32, f32);
+ void fn_155_3750(u8 state);
+ void fn_155_37A0();
+ void fn_155_37F0();
+ void fn_155_3840();
+ void fn_155_3890();
+ void on_lbl_155_bss_389();
+ /* 0: Checks states to set AC_PROP_0x1 - 1: Unset AC_PROP_0x1*/
+ void fn_155_3900(s32 p0);
+ void setPitchYawToPoint(const mVec3_c &pnt);
+ void fn_155_3BD0(const mVec3_c &);
+ void fn_155_3BE0(const mVec3_c &);
+ void clampRotationX();
+ bool checkPathPntParam(u32 param);
+ void fn_155_3E30();
+ void fn_155_3E90();
+ void fn_155_3EC0();
+
+ /* Some Timestone Check */
+ bool fn_155_3EF0();
+
+ void fn_155_3F50();
+
private:
- /* 0x??? */ STATE_MGR_DECLARE(dAcEKs_c);
+ /* 0x378 */ dAcRef_c<dTgKiesuTag_c> mTgRef;
+ /* 0x384 */ nw4r::g3d::ResFile mResFile;
+ /* 0x388 */ d3d::AnmMdlWrapper mMdl;
+ /* 0x3F8 */ m3d::anmTexPat_c mAnmTexPat;
+ /* 0x324 */ dShadowCircle_c mShadow;
+ /* 0x42C */ dBgS_AcchCir mAcchCir;
+ /* 0x488 */ dBgS_ObjAcch mAcch;
+ /* 0x838 */ dCcD_Sph mSph;
+ /* 0x988 */ STATE_MGR_DECLARE(dAcEKs_c);
+ /* 0x9C4 */ dEmitter_c mEmitter1;
+ /* 0x9F8 */ dEmitter_c mEmitter2;
+ /* 0xA2C */ dWaterEffect_c mWaterEmitter;
+ /* 0xA74 */ ActorOnRail_Ext mRail;
+ /* 0xAA8 */ TimeAreaStruct mTimeArea;
+ /* 0xAB4 */ mMtx_c mCenterWorldMtx;
+ /* 0xAE4 */ mMtx_c field_0xAE4;
+ /* 0xB14 */ mVec3_c mPnts[10];
+ /* 0xB8C */ mVec3_c field_0xB8C;
+ /* 0xB98 */ mVec3_c field_0xB98;
+ /* 0xBA4 */ mVec3_c field_0xBA4;
+ /* 0xBB0 */ mVec3_c mTargetPos;
+ /* 0xBBC */ mVec3_c field_0xBBC;
+ /* 0xBC8 */ mVec3_c field_0xBC8;
+ /* 0xBD4 */ mVec3_c field_0xBD4;
+ /* 0xBE0 */ mVec3_c field_0xBE0;
+ /* 0xBEC */ mVec3_c field_0xBEC;
+ /* 0xBF8 */ mVec3_c field_0xBF8;
+ /* 0xC04 */ mVec3_c field_0xC04;
+ /* 0xC10 */ mVec3_c field_0xC10;
+ /* 0xC1C */ mVec3_c field_0xC1C;
+ /* 0xC28 */ mVec3_c field_0xC28;
+ /* 0xC34 */ mAng mPitch_0xC34;
+ /* 0xC36 */ mAng mYaw_0xC36;
+ /* 0xC38 */ u8 _0xC38[0xC3C - 0xC38];
+ /* 0xC3C */ f32 field_0xC3C;
+ /* 0xC40 */ f32 field_0xC40;
+ /* 0xC44 */ f32 field_0xC44;
+ /* 0xC48 */ f32 field_0xC48;
+ /* 0xC4C */ u8 _0xC4C[0xC70 - 0xC4C];
+ /* 0xC70 */ f32 field_0xC70;
+ /* 0xC74 */ u8 _0xC74[0xC90 - 0xC74];
+ /* 0xC90 */ f32 field_0xC90;
+ /* 0xC94 */ u8 _0xC94[0xCE0 - 0xC94];
+ /* 0xCE0 */ f32 field_0xCE0;
+ /* 0xCE4 */ f32 field_0xCE4;
+ /* 0xCE8 */ u8 _0xCE8[0xCF8 - 0xCE8];
+ /* 0xCF8 */ f32 field_0xCF8;
+ /* 0xCFC */ f32 field_0xCFC;
+ /* 0xD00 */ f32 field_0xD00;
+ /* 0xD04 */ f32 field_0xD04;
+ /* 0xD08 */ f32 field_0xD08;
+ /* 0xD0C */ f32 field_0xD0C;
+ /* 0xD10 */ f32 field_0xD10;
+ /* 0xD14 */ f32 field_0xD14;
+ /* 0xD18 */ f32 field_0xD18;
+ /* 0xD1C */ f32 field_0xD1C;
+ /* 0xD20 */ f32 field_0xD20;
+ /* 0xD24 */ f32 field_0xD24;
+ /* 0xD28 */ f32 field_0xD28;
+ /* 0xD2C */ u32 mCenterNode;
+ /* 0xD30 */ u8 field_0xD30;
+ /* 0xD31 */ u8 field_0xD31;
+ /* 0xD32 */ u16 mTimer;
+ /* 0xD34 */ u8 _0xD34[0xD4A - 0xD34];
+ /* 0xD4A */ s16 field_0xD4A;
+ /* 0xD4C */ s16 field_0xD4C;
+ /* 0xD4E */ s16 field_0xD4E;
+ /* 0xD50 */ s16 field_0xD50;
+ /* 0xD52 */ s16 field_0xD52;
+ /* 0xD54 */ s16 field_0xD54;
+ /* 0xD56 */ s16 field_0xD56;
+ /* 0xD58 */ s16 field_0xD58;
+ /* 0xD5A */ s16 field_0xD5A;
+ /* 0xD5C */ s16 field_0xD5C;
+ /* 0xD5E */ s16 field_0xD5E;
+ /* 0xD60 */ s16 field_0xD60;
+ /* 0xD62 */ s16 field_0xD62;
+ /* 0xD64 */ s16 field_0xD64;
+ /* 0xD66 */ s16 field_0xD66;
+ /* 0xD68 */ s16 field_0xD68;
+ /* 0xD6A */ s16 field_0xD6A;
+ /* 0xD6C */ s16 field_0xD6C;
+ /* 0xD6E */ s16 field_0xD6E;
+ /* 0xD70 */ s16 field_0xD70;
+ /* 0xD72 */ s16 field_0xD72;
+ /* 0xD74 */ s16 field_0xD74;
+ /* 0xD76 */ s16 field_0xD76;
+ /* 0xD78 */ s16 mBlinkTimer;
+ /* 0xD7A */ u16 field_0xD7A;
+ /* 0xD7C */ s16 field_0xD7C;
+ /* 0xD7E */ s16 mSqueakSoundTimer;
+ /* 0xD80 */ s16 mStunSoundTimer;
+ /* 0xD82 */ s16 field_0xD82;
+ /* 0xD84 */ s16 field_0xD84;
+ /* 0xD86 */ s16 field_0xD86;
+ /* 0xD88 */ s16 field_0xD88;
+ /* 0xD8A */ s16 field_0xD8A;
+ /* 0xD8C */ s16 field_0xD8C;
+ /* 0xD8E */ u16 field_0xD8E;
+ /* 0xD90 */ s16 field_0xD90;
+ /* 0xD92 */ s16 field_0xD92;
+ /* 0xD94 */ s16 field_0xD94;
+ /* 0xD96 */ s16 field_0xD96;
+ /* 0xD98 */ s16 field_0xD98;
+ /* 0xD9A */ s16 field_0xD9A;
+ /* 0xD9C */ s16 field_0xD9C;
+ /* 0xD9E */ s16 field_0xD9E;
+ /* 0xDA0 */ s16 field_0xDA0;
+ /* 0xDA2 */ s16 field_0xDA2;
+ /* 0xDA4 */ u8 field_0xDA4;
+ /* 0xDA5 */ u8 field_0xDA5;
+ /* 0xDA6 */ u8 field_0xDA6;
+ /* 0xDA7 */ u8 field_0xDA7;
+ /* 0xDA8 */ u8 field_0xDA8;
+ /* 0xDA9 */ u8 field_0xDA9;
+ /* 0xDAA */ u8 field_0xDAA;
+ /* 0xDAB */ u8 field_0xDAB;
+ /* 0xDAC */ u8 field_0xDAC;
+ /* 0xDAD */ u8 field_0xDAD;
+ /* 0xDAE */ u8 field_0xDAE;
+ /* 0xDAF */ u8 field_0xDAF;
+ /* 0xDB0 */ u8 field_0xDB0;
+ /* 0xDB1 */ u8 field_0xDB1;
+ /* 0xDB2 */ u8 field_0xDB2;
+ /* 0xDB3 */ u8 field_0xDB3;
+ /* 0xDB4 */ u8 field_0xDB4;
+ /* 0xDB5 */ u8 field_0xDB5;
+ /* 0xDB6 */ u8 field_0xDB6;
+ /* 0xDB7 */ u8 field_0xDB7;
+ /* 0xDB8 */ u8 field_0xDB8;
+ /* 0xDB9 */ u8 field_0xDB9;
+ /* 0xDBA */ u8 field_0xDBA;
+ /* 0xDBB */ u8 field_0xDBB;
+ /* 0xDBC */ u8 mType;
+ /* 0xDBD */ u8 field_0xDBD;
+ /* 0xDBE */ u8 field_0xDBE;
+ /* 0xDBF */ u8 field_0xDBF;
+ /* 0xDC0 */ u8 mCurrentAnmTexPat; // blink
+ /* 0xDC1 */ u8 field_0xDC1;
+ /* 0xDC2 */ u8 mCurrentState;
+ /* 0xDC3 */ u8 mNextState;
+ /* 0xDC4 */ u8 field_0xDC4;
+ /* 0xDC5 */ u8 field_0xDC5;
+ /* 0xDC6 */ u8 field_0xDC6;
+ /* 0xDC7 */ u8 mStartingState;
+ /* 0xDC8 */ u8 field_0xDC8;
+ /* 0xDC9 */ u8 field_0xDC9;
+ /* 0xDCA */ u8 field_0xDCA;
+ /* 0xDCB */ u8 field_0xDCB;
+ /* 0xDCC */ u8 field_0xDCC;
+ /* 0xDCD */ u8 field_0xDCD;
+ /* 0xDCE */ u8 field_0xDCE;
+ /* 0xDCF */ u8 field_0xDCF;
+ /* 0xDD0 */ u8 field_0xDD0;
+ /* 0xDD4 */ LIGHT_INFLUENCE mLightInfluence;
+
+ // Controlled by dTgKiesuTag_c
+ static bool lbl_155_bss_388;
+ static bool lbl_155_bss_389;
};
#endif
diff --git a/include/d/a/e/d_a_en_base.h b/include/d/a/e/d_a_en_base.h
index 258cc9b7..adbc1d0c 100644
--- a/include/d/a/e/d_a_en_base.h
+++ b/include/d/a/e/d_a_en_base.h
@@ -51,12 +51,14 @@ public:
/* 0x33C */ u32 mInteractionFlags;
/* 0x340 */ u16 field_0x338;
/* 0x342 */ u16 mHealth;
- /* 0x344 */ u8 _344[0x358 - 0x344];
+ /* 0x344 */ u8 _0x344[0x346 - 0x344];
+ /* 0x346 */ u8 field_0x346;
+ /* 0x347 */ u8 _0x347[0x358 - 0x347];
/* 0x358 */ mVec3_c mFinalBlowPosition;
- /* 0x364 */ u8 _364[0x374 - 0x364];
+ /* 0x364 */ u8 _0x364[0x374 - 0x364];
/* 0x374 */ dAcEnData *mpEnemyData;
- bool checkInteractionFlags(u32 mask) {
+ bool checkInteractionFlags(u32 mask) const {
return mInteractionFlags & mask;
}
void setInteractionFlags(u32 flag) {
@@ -65,9 +67,15 @@ public:
void resetInteractionFlags(u32 flag) {
mInteractionFlags &= ~flag;
}
+ void setFinalBlowPosition(const mVec3_c &v) {
+ mFinalBlowPosition = v;
+ }
dAcBomb_c *getBombWithinRadius(f32 radius); // fn_8002f700
+ void playDeathEffect0(const mVec3_c &pos, const mVec3_c *pScale, bool skipKill);
+ void playDeathEffect1(const mVec3_c &pos, const mVec3_c *pScale, bool skipKill);
+
// Deals with dealing damage to Enemy
// Returns a value 0-13 (similar to mStts rank?)
int fn_8002FDE0(cCcD_Obj &mCc, u16 *pTgOut);
@@ -75,9 +83,10 @@ public:
// Returns 0-3 based on collision
int fn_800301b0(const mVec3_c &pos, mAng ang, bool, f32);
void fn_80030400(m3d::mdl_c &, u8, bool, u8);
- void fn_800306d0();
+ bool fn_80030570(m3d::mdl_c &, u8, f32); // lighting related
+ void fn_800306D0();
void fn_80030700();
-
+ dAcObjBase_c *targetPlayerOrScrapper(f32 biasToScrapper);
static void fn_80030980(m3d::mdl_c &, s32, bool markDirty);
void fn_80030c20(u32 flags, f32, f32, f32, f32);
diff --git a/include/d/a/obj/d_a_obj_base.h b/include/d/a/obj/d_a_obj_base.h
index b2ae203d..fab81e6d 100644
--- a/include/d/a/obj/d_a_obj_base.h
+++ b/include/d/a/obj/d_a_obj_base.h
@@ -101,6 +101,9 @@ public:
mVec3_c &getStartingPosition() {
return mStartingPos;
}
+ const mVec3_c &getStartingPos() const {
+ return mStartingPos;
+ }
void setStartingPosition(const mVec3_c &v) {
mStartingPos = v;
}
diff --git a/include/d/col/c/c_cc_d.h b/include/d/col/c/c_cc_d.h
index 384d253d..fa5fec03 100644
--- a/include/d/col/c/c_cc_d.h
+++ b/include/d/col/c/c_cc_d.h
@@ -680,6 +680,10 @@ public:
mSrc.mInfo.field_0x2 |= val;
}
+ void Set_0x50(u32 val) {
+ field_0x50 = val;
+ }
+
public:
/* 0x1C */ cCcD_SrcGObjTg mSrc;
/* 0x2C */ mVec3_c mAtHitDir;
@@ -809,7 +813,7 @@ public:
bool ChkTgBit23() const;
bool ChkTgBit24() const;
bool ChkTgBit25() const;
- u16 GetTgSoundID() const;
+ s32 GetTgSoundID() const;
s16 GetTg_0x6A() const;
bool ChkTgBit8() const;
u8 GetTg_0x4A() const;
@@ -1082,6 +1086,9 @@ public:
void OnTgInfo_0x2(u16 val) {
mTg.OnInfo_0x2(val);
}
+ void SetTg_0x50(u16 val) {
+ mTg.Set_0x50(val);
+ }
void SetTg_0x40000000() {
mTg.OnSPrm(0x40000000);
}
@@ -1108,9 +1115,18 @@ public:
void ClrCo_0x400() {
mCo.OffSPrm(0x400);
}
+ void OnCo_0x8000() {
+ mCo.OnSPrm(0x8000);
+ }
+ void ClrCo_0x8000() {
+ mCo.OffSPrm(0x8000);
+ }
void SetCo_0x400() {
mCo.OnSPrm(0x400);
}
+ void SetCo_0x8000() {
+ mCo.OnSPrm(0x8000);
+ }
void SetCo_0x40000000() {
mCo.OnSPrm(0x40000000);
}
diff --git a/include/d/d_player_act.h b/include/d/d_player_act.h
index 1d4a0096..a9a9a2b3 100644
--- a/include/d/d_player_act.h
+++ b/include/d/d_player_act.h
@@ -250,7 +250,9 @@ public:
/* vt 0x1BC */ virtual UNKWORD vt_0x1BC() {
return 0;
}
- /* vt 0x1C0 */ virtual void *vt_0x1C0() const {
+
+ // I believe this can only return the Beetle Actor in-flight (not on hand)
+ /* vt 0x1C0 */ virtual dAcObjBase_c *getBeetleInFlight() const {
return nullptr;
}
/* vt 0x1C4 */ virtual UNKWORD getActorInActorRef1() {
@@ -648,8 +650,8 @@ public:
return mSpecificAttackDirection;
}
- inline bool hasvt_0x1C0() const {
- return vt_0x1C0() != nullptr;
+ inline bool isBeetleInFlight() const {
+ return getBeetleInFlight() != nullptr;
}
static s32 getCurrentSwordTypeInline() {
diff --git a/include/d/d_pouch.h b/include/d/d_pouch.h
index 3b3ae555..1c10c91f 100644
--- a/include/d/d_pouch.h
+++ b/include/d/d_pouch.h
@@ -25,6 +25,8 @@ bool swapStockItems(s32 slot1, s32 slot2);
void sortStock();
+bool tryDropItem(f32 chance);
+
#define ITEM_CHECK_SLOT_NONE 60
u16 itemCheckFindItemSlot(ITEM_ID item);
diff --git a/include/d/t/d_t_ks.h b/include/d/t/d_t_ks.h
index e0b066c0..aedcf9dd 100644
--- a/include/d/t/d_t_ks.h
+++ b/include/d/t/d_t_ks.h
@@ -1,9 +1,16 @@
#ifndef D_T_KS_H
#define D_T_KS_H
+#include "d/a/d_a_base.h"
#include "d/t/d_tg.h"
+#include "m/m_angle.h"
+#include "m/m_mtx.h"
+#include "m/m_vec.h"
#include "s/s_State.hpp"
+#include "toBeSorted/d_path.h"
+#include "toBeSorted/time_area_mgr.h"
+class dAcEKs_c;
class dTgKiesuTag_c : public dTg_c {
public:
dTgKiesuTag_c() : mStateMgr(*this) {}
@@ -17,8 +24,102 @@ public:
STATE_FUNC_DECLARE(dTgKiesuTag_c, ControlPathMove);
STATE_FUNC_DECLARE(dTgKiesuTag_c, DoNothing);
+ /* fn_154_8B0 */
+ mVec3_c &getSpawnKsPosition();
+
+ void incrementField_0x456() {
+ field_0x456++;
+ }
+
+ void setField_0x47A() {
+ field_0x47A = true;
+ }
+
private:
- /* 0x??? */ STATE_MGR_DECLARE(dTgKiesuTag_c);
+ /* 0x0FC */ STATE_MGR_DECLARE(dTgKiesuTag_c);
+ /* 0x138 */ dAcRef_c<dAcEKs_c> mKsRefs[16];
+ /* 0x1F8 */ mMtx_c mAreaMtx;
+ /* 0x228 */ ActorOnRail_Ext mRail;
+ /* 0x25C */ TimeAreaStruct mTimeArea;
+ /* 0x268 */ mMtx_c field_0x268;
+
+ /* 0x298 */ u8 _0x298[0x31C - 0x298];
+
+ /* 0x31C */ mVec3_c field_0x31C;
+ /* 0x328 */ mVec3_c field_0x328;
+ /* 0x334 */ mVec3_c field_0x334;
+ /* 0x340 */ mVec3_c field_0x340;
+ /* 0x34C */ mVec3_c field_0x34C;
+
+ /* 0x358 */ u8 _0x358[0x37C - 0x358];
+
+ /* 0x37C */ mVec3_c mTargetPosition;
+ /* 0x388 */ mVec3_c mSpawnKsPosition;
+
+ /* 0x394 */ u8 _0x394[0x3A0 - 0x394];
+
+ /* 0x3A0 */ mAng3_c mSpawnKsAngle;
+ /* 0x3A8 */ mAng3_c field_0x3A8;
+ /* 0x3AC */ mAng field_0x3AC; // pitch
+ /* 0x3AE */ mAng field_0x3AE; // yaw
+
+ /* 0x3B0 */ u8 _0x3B0[0x3B4 - 0x3B0];
+
+ /* 0x3B4 */ f32 field_0x3B4;
+ /* 0x3B8 */ f32 field_0x3B8; // Y pos offset
+ /* 0x3BC */ f32 field_0x3BC; // X/Z scale
+ /* 0x3C0 */ f32 field_0x3C0; // Y scale
+
+ /* 0x3C4 */ u8 _0x3C4[0x3D8 - 0x3C4];
+
+ /* 0x3D8 */ f32 field_0x3D8; // Y scale
+ /* 0x3DC */ f32 field_0x3DC; // X/Z scale
+
+ /* 0x3E0 */ u8 _0x3E0[0x3EC - 0x3E0];
+
+ /* 0x3EC */ mVec3_c field_0x3EC;
+
+ /* 0x3F8 */ u8 _0x3F8[0x448 - 0x3F8];
+
+ /* 0x448 */ s16 field_0x448;
+
+ // Related to Control?
+ /* 0x44A */ s16 mNumKsControl;
+ /* 0x44C */ s16 field_0x44C;
+ /* 0x44E */ s16 field_0x44E;
+ /* 0x450 */ s16 field_0x450;
+
+ // Related to ControlFighting?
+ /* 0x452 */ s16 field_0x452;
+ /* 0x454 */ s16 field_0x454;
+ /* 0x456 */ s16 field_0x456;
+ /* 0x458 */ s16 field_0x458;
+ /* 0x45A */ s16 field_0x45A;
+ /* 0x45C */ s16 field_0x45C;
+ /* 0x45E */ s16 field_0x45E;
+
+ /* 0x460 */ s16 field_0x460;
+ /* 0x462 */ s16 mMaxKsToLink;
+
+ /* 0x464 */ u8 _0x464[0x468 - 0x464];
+
+ /* 0x468 */ s16 field_0x468;
+ /* 0x46A */ s16 field_0x46A;
+ /* 0x46C */ s16 mNumKsAlive;
+ /* 0x46E */ s16 field435_0x46e;
+
+ /* 0x470 */ u8 _0x470[0x474 - 0x470];
+
+ /* 0x474 */ bool field_0x474;
+
+ /* 0x475 */ u8 _0x475[0x47A - 0x475];
+
+ /* 0x47A */ bool field_0x47A;
+ /* 0x47E */ bool mbAllKsActive;
+
+ /* 0x48A */ u8 field_0x48A; // Related to getting spawnPos/ Type?
+
+ /* 0x48E */ u8 mNumKsActive;
};
#endif
diff --git a/include/f/f_base.h b/include/f/f_base.h
index 8ef5ac43..296fca1e 100644
--- a/include/f/f_base.h
+++ b/include/f/f_base.h
@@ -92,6 +92,9 @@ public:
u32 getFromParams(u8 shift, u32 mask) {
return (mParams >> shift) & mask;
}
+ f32 getFromParams(u8 shift, u32 mask, f32 scale) {
+ return ((mParams >> shift) & mask) * scale;
+ }
public:
fBase_c();
diff --git a/include/toBeSorted/d_path.h b/include/toBeSorted/d_path.h
index 56856008..1208c191 100644
--- a/include/toBeSorted/d_path.h
+++ b/include/toBeSorted/d_path.h
@@ -59,6 +59,11 @@ public:
return mpPathPtr->pointCount;
}
+ s32 getLastPointIdx() const {
+ s32 pnt = getNumPoints() - 1;
+ return pnt >= 0 ? pnt : 0;
+ }
+
bool initWithPathId(s32 pathId, s32 roomId, bool pathSubtype);
bool initWithPathIndex(s32 pathIndex, s32 roomId, bool pathSubtype);
@@ -118,18 +123,6 @@ public:
return mSegmentTime;
}
- bool CheckFlag(u32 flag) const {
- return (mFlags & flag) != 0;
- }
-
- void ClearFlag(u32 flag) {
- mFlags &= ~flag;
- }
-
- void SetFlag(u32 flag) {
- mFlags |= flag;
- }
-
const mVec3_c &getPosition() const {
return mPosition;
}
@@ -138,22 +131,35 @@ public:
mSpeed = speed;
}
+ f32 getSpeed() const {
+ return mSpeed;
+ }
+
void getDirection(mVec3_c &result) {
mPath.getDirection(mSegmentIndex, mSegmentTime, result);
}
+ const mVec3_c *getPoint(s32 idx) const {
+ return reinterpret_cast<const mVec3_c *>(mPath.getPoint(idx));
+ }
+
bool checkFlag(u32 flags) const {
return (mFlags & flags) != 0;
}
- void offFlag(u32 flags) {
+ void unsetFlag(u32 flags) {
mFlags &= ~flags;
}
- void onFlag(u32 flags) {
+ void setFlag(u32 flags) {
mFlags |= flags;
}
+ const dPath_c &getPath() const {
+ return mPath;
+ }
+ s32 getNextPointIndex2() const;
+
private:
s32 getNextPointIndex(s32 point) const;
s32 getNextPointIndex() const;
diff --git a/src/REL/d/a/e/d_a_e_ks.cpp b/src/REL/d/a/e/d_a_e_ks.cpp
index b9f2d8d1..baee6dfc 100644
--- a/src/REL/d/a/e/d_a_e_ks.cpp
+++ b/src/REL/d/a/e/d_a_e_ks.cpp
@@ -1,7 +1,137 @@
#include "d/a/e/d_a_e_ks.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_itembase.h"
+#include "d/a/d_a_player.h"
+#include "d/a/obj/d_a_obj_base.h"
+#include "d/col/bg/d_bg_pc.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_lin_chk.h"
+#include "d/col/bg/d_bg_s_roof_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_d.h"
+#include "d/col/cc/d_cc_s.h"
+#include "d/d_camera.h"
+#include "d/d_light_env.h"
+#include "d/d_pouch.h"
+#include "d/d_sc_game.h"
+#include "d/d_stage_mgr.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_ks.h"
+#include "f/f_base.h"
+#include "f/f_profile_name.h"
+#include "m/m3d/m_fanm.h"
+#include "m/m_angle.h"
+#include "m/m_color.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 "s/s_Math.h"
+#include "toBeSorted/attention.h"
+#include "toBeSorted/d_emitter.h"
+#include "toBeSorted/d_path.h"
+#include "toBeSorted/event_manager.h"
+#include "toBeSorted/time_area_mgr.h"
+
+struct dAcEKs_HIO_c {
+ f32 _0x00; // 400.0
+ s16 _0x04; // 0h
+ s16 _0x06; // FFh
+ s16 _0x08; // A0h
+ s16 _0x0A; // 50h
+ s16 _0x0C; // FFh
+ s16 _0x0E; // 64h
+ s16 _0x10; // FFh
+ s16 _0x12; // FFh
+ s16 _0x14; // FFh
+ f32 _0x18; // 1.2
+ f32 _0x1C; // 1.5
+ f32 _0x20; // 1.0
+ f32 _0x24; // 1.0
+ f32 _0x28; // -35.0
+ f32 _0x2C; // 30.0
+ f32 _0x30; // 1.0
+ s16 _0x34; // 71Ch
+ s16 _0x36; // 0h
+ f32 _0x38; // 30.0
+ f32 _0x3C; // 15.0
+ f32 _0x40; // 0.0
+ f32 _0x44; // 100.0
+ f32 _0x48; // 150.0
+ f32 _0x4C; // 250.0
+ f32 _0x50; // 150.0
+ f32 _0x54; // 120.0
+ f32 _0x58; // 3.5
+ f32 _0x5C; // 3.5
+ f32 _0x60; // 3.5
+ f32 _0x64; // 10.0
+ f32 _0x68; // 20.0
+ f32 _0x6C; // 35.0
+ f32 _0x70; // 7.0
+ f32 _0x74; // 200.0
+ f32 _0x78; // 10.0
+ f32 _0x7C; // 0.0
+ f32 _0x80; // 0.5
+ s16 _0x84; // 1555h
+ s16 _0x86; // 0h
+ f32 _0x88; // 500.0
+ f32 _0x8C; // 150.0
+ f32 _0x90; // 150.0
+ f32 _0x94; // 3000.0
+ f32 _0x98; // 120.0
+ f32 _0x9C; // 1.0
+ s16 _0xA0; // Fh
+ s16 _0xA2; // AABh
+ f32 _0xA4; // 1.0
+ s16 _0xA8; // 1Eh
+ s16 _0xAA; // AABh
+ f32 _0xAC; // 300.0
+ f32 _0xB0; // 3.0
+ s16 _0xB4; // 3h
+ s16 _0xB6; // 1h
+ f32 _0xB8; // 0.01
+ f32 _0xBC; // 100.0
+ s16 _0xC0; // AABh
+ s16 _0xC2; // 0h
+ f32 _0xC4; // -0.5
+
+ const s32 getZero() const {
+ s32 _weird_zero = 0;
+ return _0x04;
+ }
+ static const dAcEKs_HIO_c sInstance;
+};
+const dAcEKs_HIO_c dAcEKs_HIO_c::sInstance = {
+ 400.0, 0, 0xFF, 0xA0, 0x50, 0xFF, 0x64, 0xFF, 0xFF, 0xFF, 1.2, 1.5, 1.0, 1.0, -35.0,
+ 30.0, 1.0, 0x71C, 0, 30.0, 15.0, 0.0, 100.0, 150.0, 250.0, 150.0, 120.0, 3.5, 3.5, 3.5,
+ 10.0, 20.0, 35.0, 7.0, 200.0, 10.0, 0.0, 0.5, 0x1555, 0x0, 500.0, 150.0, 150.0, 3000.0, 120.0,
+ 1.0, 0xF, 0xAAB, 1.0, 0x1E, 0xAAB, 300.0, 3.0, 0x3, 0x1, 0.0099999998, 100.0, 0xAAB, 0, -0.5,
+};
+
SPECIAL_ACTOR_PROFILE(E_KS, dAcEKs_c, fProfile::E_KS, 0xFE, 0, 4099);
+static dCcD_SrcSph sSrcSph = {
+ {
+ /* mObjAt */ {AT_TYPE_DAMAGE, 0x1D, {0, 0, 0}, 2, 0, 0, 0, 0, 0},
+ /* mObjTg */
+ {~AT_TYPE_COMMON0, 0x200303, {0, 1, 0x40F}, 8, 0},
+ /* mObjCo*/ {0xE5},
+ },
+ {35.f}
+};
+
STATE_DEFINE(dAcEKs_c, Wait);
STATE_DEFINE(dAcEKs_c, WakeUp);
STATE_DEFINE(dAcEKs_c, ReturnToWait);
@@ -17,45 +147,2999 @@ STATE_DEFINE(dAcEKs_c, Stun);
STATE_DEFINE(dAcEKs_c, WindBlow);
STATE_DEFINE(dAcEKs_c, PathMove);
-void dAcEKs_c::initializeState_Wait() {}
-void dAcEKs_c::executeState_Wait() {}
-void dAcEKs_c::finalizeState_Wait() {}
-void dAcEKs_c::initializeState_WakeUp() {}
-void dAcEKs_c::executeState_WakeUp() {}
-void dAcEKs_c::finalizeState_WakeUp() {}
-void dAcEKs_c::initializeState_ReturnToWait() {}
-void dAcEKs_c::executeState_ReturnToWait() {}
-void dAcEKs_c::finalizeState_ReturnToWait() {}
-void dAcEKs_c::initializeState_WaitReady() {}
-void dAcEKs_c::executeState_WaitReady() {}
+bool dAcEKs_c::lbl_155_bss_388;
+bool dAcEKs_c::lbl_155_bss_389;
+
+bool dAcEKs_c::restorePosRotFromCopy() {
+ if (field_0xDCF == 0) {
+ if (dTimeAreaMgr_c::GetInstance()->fn_800B9B60(mRoomID, mPosition) != 0) {
+ mTimeArea.setField0x00(0);
+ mSph.ClrCoSet();
+ mSph.ClrTgSet();
+ mSph.ClrAtSet();
+ fn_800306D0();
+ if (mType == EKS_FIRE || mType == EKS_ELECTRIC) {
+ field_0xD20 = 0.f;
+ mLightInfluence.SetScale(0);
+ if (mEmitter1.hasEmitters()) {
+ mEmitter1.remove(true);
+ }
+ }
+ } else {
+ mTimeArea.setField0x00(1);
+ fn_80030700();
+ mSph.OnCoSet();
+ mSph.OnTgSet();
+ }
+ mMdl.getModel().setScale(mScale * mTimeArea.getDistMaybe());
+ }
+ return true;
+}
+
+void dAcEKs_c::linkKiesuTag(dTgKiesuTag_c *pTgKs) {
+ mTgRef.link(pTgKs);
+}
+
+void dAcEKs_c::setStartingState() {
+ mTimer = cM::rndInt(1000);
+ switch (mStartingState) {
+ case EKS_STARTSTATE_Move: {
+ changeState(StateID_Move);
+ mCurrentState = mStartingState;
+ mAcch.ClrRoofNone();
+ mAcch.SetField_0xD4(55.f);
+ mAcch.SetGroundUpY(30.f);
+ mAcchCir.SetWall(20.f, 60.f);
+ } break;
+ case EKS_STARTSTATE_Wait: {
+ changeState(StateID_Wait);
+ mCurrentState = mStartingState;
+ if ((s32)getFromParams(30, 0x3) == 1) {
+ field_0xDB1 = 1;
+ }
+ mAcch.ClrRoofHit();
+ mAcch.SetGroundUpY(0.f);
+ mAcch.SetField_0xD4(0.f);
+ mAcchCir.SetWall(0.f, 5.f);
+
+ } break;
+ case EKS_STARTSTATE_PathMove: {
+ mCurrentState = mStartingState;
+ mAcch.ClrRoofNone();
+ mAcch.SetField_0xD4(55.f);
+ mAcch.SetGroundUpY(30.f);
+ mAcchCir.SetWall(20.f, 60.f);
+ changeState(StateID_PathMove);
+ } break;
+ default: {
+ changeState(StateID_Move);
+ mCurrentState = mStartingState;
+ } break;
+ }
+
+ mCurrentState = mNextState;
+}
+
+void dAcEKs_c::setIdleState() {
+ switch (mStartingState) {
+ case EKS_STARTSTATE_Move: {
+ changeState(StateID_Move);
+ mCurrentState = EKS_STATE_Move;
+ } break;
+ case EKS_STARTSTATE_Wait: {
+ changeState(StateID_ReturnToWait);
+ mCurrentState = EKS_STATE_ReturnToWait;
+ } break;
+ case EKS_STARTSTATE_PathMove: {
+ changeState(StateID_PathMove);
+ mCurrentState = EKS_STATE_PathMove;
+ } break;
+ default: {
+ changeState(StateID_Move);
+ mCurrentState = EKS_STATE_Move;
+ } break;
+ }
+}
+
+f32 dAcEKs_c::getLineCrossYRange(const mVec3_c &pos, f32 range) {
+ dBgS_ObjLinChk linChk;
+
+ mVec3_c start, end;
+ start.set(pos);
+ start.y -= range;
+
+ end.set(pos);
+ end.y += range;
+
+ linChk.Set(&start, &end, nullptr);
+ if (dBgS::GetInstance()->LineCross(&linChk)) {
+ return linChk.GetLinEnd().y;
+ } else {
+ return getStartingPos().y;
+ }
+}
+
+void dAcEKs_c::fn_155_A60() {
+ if (sLib::calcTimer(&field_0xDBD)) {
+ return;
+ }
+
+ s32 s = fn_8002FDE0(mSph, nullptr);
+ if (s == 6 || s == 7) {
+ return;
+ }
+ switch (s) {
+ case 12:
+ case 13:
+ if (mSph.ChkTgHit() && mSph.ChkTgAtHitType(AT_TYPE_SWORD)) {
+ return;
+ }
+ default:
+ field_0xDBD = 5;
+ dJEffManager_c::spawnHitMarkEffect(0, mSph, nullptr, true);
+
+ if (!mSph.ChkTgHit()) {
+ return;
+ }
+
+ field_0xD96 = mSph.GetTgAtHitDir().atan2sX_Z();
+ field_0xD98 = mSph.GetTgAtHitDir().atan2sY_XZ();
+ field_0xD98 = -field_0xD98;
+
+ if (mSph.ChkTgAtHitType(AT_TYPE_SWORD)) {
+ s16 a = 0;
+ s16 x = -cLib::targetAngleX(mPosition, dAcPy_c::GetLink()->mPosition);
+
+ if (mSph.GetTgSoundID() == 0x01) {
+ x += 0x2000;
+ } else if (mSph.GetTgSoundID() == 0x80) {
+ a = 0x1000;
+ x += 0x1000;
+ } else if (mSph.GetTgSoundID() == 0x40) {
+ a = 0x2000;
+ } else if (mSph.GetTgSoundID() == 0x20) {
+ a = 0x1000;
+ x += -0x1000;
+ } else if (mSph.GetTgSoundID() == 0x10) {
+ x += -0x2000;
+ } else if (mSph.GetTgSoundID() == 0x08) {
+ a = -0x1000;
+ x += -0x1000;
+ } else if (mSph.GetTgSoundID() == 0x04) {
+ a = -0x2000;
+ } else if (mSph.GetTgSoundID() == 0x02) {
+ a = -0x1000;
+ x += 0x1000;
+ } else if (mSph.GetTgSoundID() == 0x100) {
+ x += -0x4000;
+ }
+
+ field_0xD92 = x * 0.5f;
+ field_0xD94 = a * 0.5f;
+
+ if (mHealth == 0) {
+ if (!isState(StateID_Wait)) {
+ mVelocity.y += 30.f;
+ }
+ changeState(StateID_Damage);
+ if (field_0xD86 > 0) {
+ field_0xDA9 = 1;
+ }
+ mSpeed = 65.f;
+ mAcchCir.SetWall(20.f, 60.f);
+ mAcceleration = -6.f;
+ field_0xD5E = 5;
+ mAcch.SetGroundUpY(0.f);
+
+ unsetActorProperty(AC_PROP_0x1);
+ mSph.ClrTgSet();
+ } else {
+ if (!isState(StateID_Wait)) {
+ mVelocity.y += 30.f;
+ }
+ changeState(StateID_Damage);
+ if (field_0xD86 > 0) {
+ field_0xDA9 = 1;
+ }
+ mRotation.x += field_0xD98 * 0.5f;
+ mRotation.y += field_0xD96 * 0.5f;
+ mSpeed = 30.f;
+ field_0xDC6 = 8;
+ field_0xDBF = 8;
+ }
+ } else {
+ if (mSph.ChkTgAtHitType(AT_TYPE_WHIP)) {
+ field_0xDB6 = 1;
+ }
+ mHealth = 0;
+ if (isState(StateID_Wait)) {
+ changeState(StateID_Damage);
+ if (field_0xD86 > 0) {
+ field_0xDA9 = 1;
+ }
+ if (mHealth == 0) {
+ mAcceleration = -4.f;
+ field_0xD92 = field_0xD98 * 0.2f;
+ field_0xD94 = field_0xD96 * 0.1f;
+ }
+ } else {
+ changeState(StateID_Damage);
+
+ if (field_0xD86 > 0) {
+ field_0xDA9 = 1;
+ }
+ if (mHealth == 0) {
+ mSpeed = 65.f;
+ mAcchCir.SetWall(20, 60);
+ mAcceleration = -6.f;
+ field_0xD5E = 5;
+ mAcch.SetGroundUpY(0);
+ unsetActorProperty(AC_PROP_0x1);
+ mSph.ClrTgSet();
+ }
+ field_0xD92 = field_0xD98 * 0.2f;
+ field_0xD94 = field_0xD96 * 0.1f;
+ mVelocity.y += 30.f;
+ }
+ }
+ break;
+ case 0: {
+ return;
+ }
+ }
+}
+
+// TODO (I dont want to mess with Item stuff with the other PR open)
+extern "C" void spawnDrop(ITEM_ID, s32 roomId, const mVec3_c &pos, const mAng3_c &rot);
+
+void dAcEKs_c::kill(bool dropItem) {
+ dLightEnv_c::GetPInstance()->setBPM8_Type4(&mPosition);
+ mTgRef.unlink();
+
+ if (field_0xDB6 != 0) {
+ killWithFlagNoItemDrop();
+ } else if (dropItem == true) {
+ if (mType == EKS_CURSED) {
+ if (tryDropItem(0.05f)) {
+ spawnDrop(ITEM_EVIL_CRYSTAL, mRoomID, mPosition, mAngle);
+ }
+ } else {
+ if (tryDropItem(0.05f)) {
+ spawnDrop(ITEM_MONSTER_CLAW, mRoomID, mPosition, mAngle);
+ }
+ }
+ } else {
+ killWithFlagNoItemDrop();
+ }
+
+ static mVec3_c deathEffectScale(0.8, 0.8, 0.8);
+ playDeathEffect0(mPosition, &deathEffectScale, false);
+}
+
+void dAcEKs_c::chaseTargetY(f32 ratio, f32 maxStepSize) {
+ sLib::addCalcScaledDiff(&mPosition.y, mTargetPos.y, ratio, maxStepSize);
+ sLib::addCalcAngle(mAngle.y.ref(), mYaw_0xC36, 10, 0x38E);
+}
+
+void dAcEKs_c::playBlinkAnm() {
+ mAnmTexPat.play();
+ if (mAnmTexPat.isStop(0)) {
+ if (mCurrentAnmTexPat == EKS_TEXPAT_BLINK3) {
+ setBlink(EKS_TEXPAT_BLINK1);
+ }
+
+ mBlinkTimer--;
+ if (mBlinkTimer <= 0) {
+ mAnmTexPat.setFrame(0, 0);
+ mBlinkTimer = cM::rndInt(75) + 15;
+ }
+ }
+}
+
+void dAcEKs_c::soundSqueak() {
+ if (mSqueakSoundTimer > 0) {
+ mSqueakSoundTimer--;
+ } else {
+ startSound(SE_EKs_V_NAKU);
+ mSqueakSoundTimer = cM::rndInt(20) + 20;
+ }
+}
+
+void dAcEKs_c::soundStun() {
+ if (mStunSoundTimer > 0) {
+ mStunSoundTimer--;
+ } else {
+ startSound(SE_EKs_V_FAINT);
+ mStunSoundTimer = cM::rndInt(20) + 20;
+ }
+}
+
+void dAcEKs_c::fn_155_1430() {
+ field_0xD6C = cM::rndInt(1) + 3;
+}
+
+void dAcEKs_c::fn_155_1470() {
+ field_0xD52--;
+
+ if (field_0xD54 > 0) {
+ field_0xD54--;
+ }
+
+ if (field_0xD90 > 0) {
+ field_0xD90--;
+ }
+
+ if (field_0xDA6 != 0) {
+ if (!transitionToNextState()) {
+ if (field_0xD54 <= 0) {
+ f32 yDiff = getStartingPos().y - mPosition.y;
+ if (yDiff >= 0.f && yDiff <= 150.f) {
+ field_0xDC1 = 0;
+ if (getStartingPos().squareDistanceToXZ(mPosition) < 6400.f) {
+ changeState(StateID_WaitReady);
+ mCurrentState = EKS_STATE_Wait;
+ return;
+ }
+ } else {
+ if (yDiff < 0.f) {
+ field_0xDC1 = 2;
+ }
+ }
+ }
+ adjustTargetGnd();
+ adjustTargetRoof();
+ setPitchYawToPoint(mTargetPos);
+ chaseTargetY(0.1f, 3.0f);
+ sLib::addCalcAngle(mRotation.y.ref(), mYaw_0xC36, 10, 0x38E);
+ sLib::addCalcAngle(mRotation.x.ref(), mPitch_0xC34, 12, 0xB6);
+ clampRotationX();
+ }
+ } else {
+ field_0xB8C.set(mPnts[field_0xD9E]);
+ f32 f = mPosition.squareDistance(field_0xB8C);
+
+ if (checkWallCross()) {
+ field_0xDB7++;
+ if (field_0xDB7 < 5) {
+ field_0xDC1 = 0;
+
+ mTargetPos.x = field_0xB8C.x + cM::rndFX(800);
+ mTargetPos.z = field_0xB8C.z + cM::rndFX(800);
+
+ adjustTargetGnd();
+ adjustTargetRoof();
+ } else if (field_0xDB7 < 10) {
+ field_0xDC1 = 1;
+
+ fn_155_3BD0(mVec3_c(cM::rndFX(300), cM::rndFX(300), -cM::rndF(300)));
+
+ field_0xD52 = cM::rndInt(20) + 20;
+
+ adjustTargetGnd();
+ adjustTargetRoof();
+ }
+ if (field_0xDB7 > 20) {
+ field_0xDB7 = 0;
+ }
+ }
+
+ if (field_0xD54 <= 0) {
+ f32 yDiff = getStartingPos().y - mPosition.y;
+ if (yDiff >= 0.f && yDiff <= 150.f) {
+ field_0xDC1 = 0;
+ if (field_0xD9E == 0) {
+ if (getStartingPos().squareDistanceToXZ(mPosition) < 6400.f) {
+ changeState(StateID_WaitReady);
+ return;
+ }
+ }
+ } else {
+ if (yDiff < 0.f) {
+ field_0xDC1 = 2;
+ }
+ }
+ }
+
+ if (!checkBeyondRadius(getStartingPos(), 490000) && field_0xD54 <= 0 && field_0xD90 <= 0) {
+ if (fn_155_2B80(true, 0)) {
+ changeState(StateID_Chase);
+ return;
+ }
+ field_0xD90 = 3;
+ }
+
+ if (field_0xDC1 == 0) {
+ if (checkBeyondRadius(getStartingPos(), 490000) && field_0xD52 <= 0) {
+ field_0xDA0++;
+ if (field_0xDA0 > 5) {
+ mTargetPos.x = field_0xB8C.x + cM::rndFX(800);
+ mTargetPos.y = field_0xB8C.y + cM::rndFX(30);
+ mTargetPos.z = field_0xB8C.z + cM::rndFX(800);
+ field_0xDA0 = 0;
+ } else {
+ mTargetPos.x = field_0xB8C.x + cM::rndFX(30);
+ mTargetPos.y = field_0xB8C.y + cM::rndFX(30);
+ mTargetPos.z = field_0xB8C.z + cM::rndFX(30);
+ }
+ field_0xD52 = cM::rndInt(20) + 20;
+ adjustTargetGnd();
+ adjustTargetRoof();
+ }
+ } else if (field_0xDC1 == 2) {
+ field_0xDBA++;
+ if (field_0xDBA < 20) {
+ if (field_0xDBA % 2) {
+ field_0xDC1 = 0;
+ fn_155_3BD0(mVec3_c(cM::rndFX(800), cM::rndFX(400), cM::rndFX(800)));
+ adjustTargetGnd();
+ adjustTargetRoof();
+ }
+ } else if (field_0xDBA < 40) {
+ if (field_0xDBA % 2) {
+ fn_155_3BD0(mVec3_c(cM::rndFX(800), -cM::rndF(400), cM::rndFX(800)));
+ field_0xD52 = cM::rndInt(20) + 20;
+ adjustTargetGnd();
+ adjustTargetRoof();
+ }
+ }
+
+ if (field_0xDBA > 60) {
+ field_0xDBA = 0;
+ field_0xDC1 = 0;
+ }
+ }
+
+ if (field_0xD52 <= 0) {
+ if (field_0xD9E > 0) {
+ mVec3_c startPos = mPosition;
+ for (s32 i = 0; i <= field_0xD9E; ++i) {
+ if (!dBgS_ObjLinChk::LineCross(&startPos, &mPnts[i], nullptr)) {
+ field_0xD9E = i;
+ field_0xB8C.set(mPnts[field_0xD9E]);
+ }
+ }
+ }
+
+ mTargetPos.x = field_0xB8C.x + cM::rndFX(800);
+ mTargetPos.y = field_0xB8C.y + cM::rndFX(400);
+ mTargetPos.z = field_0xB8C.z + cM::rndFX(800);
+
+ field_0xDC1 = 0;
+
+ field_0xD52 = cM::rndInt(20) + 20;
+
+ adjustTargetGnd();
+ adjustTargetRoof();
+ }
+
+ setPitchYawToPoint(mTargetPos);
+ chaseTargetY(0.1f, 3.0f);
+ sLib::addCalcAngle(mRotation.y.ref(), mYaw_0xC36, 10, 0x38E);
+ sLib::addCalcAngle(mRotation.x.ref(), mPitch_0xC34, 12, 0xB6);
+ clampRotationX();
+
+ if (field_0xD9E != 0 && f < 2500.f) {
+ field_0xD9E--;
+ }
+ }
+}
+
+void dAcEKs_c::fn_155_1C80() {
+ if (field_0xDC8 != 0) {
+ field_0xDC8--;
+ field_0xDA5 = 1;
+ } else {
+ field_0xDA5 = 0;
+ }
+
+ if (field_0xD52 > 0) {
+ field_0xD52--;
+ }
+
+ if (field_0xD90 > 0) {
+ field_0xD90--;
+ }
+
+ if (field_0xDA6 != 0) {
+ adjustTargetGnd();
+ adjustTargetRoof();
+ if (field_0xDC8 > 120 || !transitionToNextState()) {
+ setPitchYawToPoint(mTargetPos);
+ chaseTargetY(field_0xD00 + 0.1f, field_0xD04 + 3.0f);
+ sLib::addCalcAngle(mRotation.y.ref(), mYaw_0xC36, 10, 0x38E);
+ sLib::addCalcAngle(mRotation.x.ref(), mPitch_0xC34, 12, 0xB6);
+ clampRotationX();
+ }
+ } else {
+ if (field_0xD54 > 0) {
+ field_0xD54--;
+ }
+
+ field_0xB8C.set(mPnts[field_0xD9E]);
+
+ f32 f = mPosition.squareDistance(field_0xB8C);
+ if (checkWallCross()) {
+ field_0xDB7++;
+ if (field_0xDB7 < 5) {
+ field_0xDC1 = 0;
+
+ mTargetPos.x = field_0xB8C.x + cM::rndFX(800);
+ mTargetPos.y = field_0xB8C.y + cM::rndF(400);
+ mTargetPos.z = field_0xB8C.z + cM::rndFX(800);
+
+ adjustTargetGnd();
+ adjustTargetRoof();
+ } else if (field_0xDB7 < 10) {
+ field_0xDC1 = 1;
+
+ fn_155_3BD0(mVec3_c(cM::rndFX(200), cM::rndFX(200), cM::rndF(-300)));
+
+ field_0xD52 = cM::rndInt(20) + 20;
+
+ adjustTargetGnd();
+ adjustTargetRoof();
+ } else if (field_0xDB7 > 20) {
+ field_0xDB7 = 0;
+ }
+ }
+
+ if (field_0xDC1 == 0) {
+ if (checkBeyondRadius(getStartingPos(), 490000)) {
+ if (field_0xD52 <= 0) {
+ mTargetPos.x = field_0xB8C.x + cM::rndFX(800);
+ mTargetPos.y = field_0xB8C.y + cM::rndFX(400);
+ mTargetPos.z = field_0xB8C.z + cM::rndFX(800);
+ field_0xD52 = cM::rndInt(20) + 20;
+ adjustTargetGnd();
+ adjustTargetRoof();
+ }
+ } else {
+ if (field_0xDC8 <= 120 && field_0xD54 <= 0 && field_0xD90 <= 0) {
+ if (fn_155_2B80(true, 0)) {
+ changeState(StateID_Chase);
+ return;
+ }
+ field_0xD90 = 3;
+ }
+ }
+ }
+
+ if (field_0xD52 <= 0) {
+ if (field_0xD9E > 0) {
+ mVec3_c startPos = mPosition;
+ for (s32 i = 0; i <= field_0xD9E; ++i) {
+ if (!dBgS_ObjLinChk::LineCross(&startPos, &mPnts[i], nullptr)) {
+ field_0xD9E = i;
+ field_0xB8C.set(mPnts[field_0xD9E]);
+ }
+ }
+ }
+
+ field_0xDC1 = 0;
+
+ field_0xD52 = cM::rndInt(20) + 20;
+
+ mTargetPos.x = field_0xB8C.x + cM::rndFX(800);
+ mTargetPos.y = field_0xB8C.y + cM::rndFX(400);
+ mTargetPos.z = field_0xB8C.z + cM::rndFX(800);
+
+ field_0xD52 = cM::rndInt(20) + 20; // Set twice lol
+
+ adjustTargetGnd();
+ adjustTargetRoof();
+ }
+
+ if (mTargetPos.squareDistanceToXZ(mPosition) < 10000.f) {
+ mTargetPos.x = field_0xB8C.x + cM::rndFX(800);
+ mTargetPos.y = field_0xB8C.y + cM::rndFX(400);
+ mTargetPos.z = field_0xB8C.z + cM::rndFX(800);
+
+ adjustTargetGnd();
+ adjustTargetRoof();
+ }
+
+ setPitchYawToPoint(mTargetPos);
+ chaseTargetY(field_0xD00 + 0.1f, field_0xD04 + 3.0f);
+ sLib::addCalcAngle(mRotation.y.ref(), mYaw_0xC36, 10, 0x38E);
+ sLib::addCalcAngle(mRotation.x.ref(), mPitch_0xC34, 12, 0xB6);
+ clampRotationX();
+
+ if (field_0xD9E != 0 && f < 2500.f) {
+ field_0xD9E--;
+ }
+ }
+}
+
+void dAcEKs_c::fn_155_2270() {
+ if (field_0xD6A > 0) {
+ field_0xD6A--;
+ }
+
+ dAcObjBase_c *pTarget = targetPlayerOrScrapper(0.f);
+ field_0xBF8.set(pTarget->mPosition + field_0xBEC);
+
+ mAng yAngleDiff = cLib::targetAngleY(mPosition, mTargetPos);
+ yAngleDiff = yAngleDiff - mRotation.y;
+ if (field_0xDA6 != 0) {
+ if (transitionToNextState()) {
+ if (mType == EKS_ELECTRIC) {
+ fn_155_3EC0();
+ field_0xDA9 = 1;
+ }
+ } else {
+ if (field_0xDC5 != 0) {
+ field_0xDC5--;
+ } else {
+ if (field_0xDAF != 0 && dAcPy_c::GetLink()->checkCurrentAction(/* SHIELD_BASH*/ 73)) {
+ ;
+ mWorldMtx.multVecSR(mVec3_c(0, 0, -250), field_0xC1C);
+ mTargetPos += field_0xC1C;
+ field_0xDC5 = 20;
+ }
+ }
+
+ if (field_0xD6A <= 0) {
+ if (lbl_155_bss_389) {
+ field_0xC70 = 0.f;
+ if (field_0xD6A <= 0) {
+ field_0xC70 = 0.f;
+ if (isTargeted()) {
+ field_0xD6C -= 2;
+ } else {
+ field_0xD6C -= 1;
+ }
+
+ if (field_0xD6C <= 0) {
+ fn_155_3460();
+ if (mTgRef.isLinked()) {
+ mTgRef.get()->incrementField_0x456();
+ }
+ changeState(StateID_AttackReady);
+ mCurrentState = EKS_STATE_AttackReady;
+
+ if (mType == EKS_ELECTRIC) {
+ fn_155_3EC0();
+ field_0xDA9 = 1;
+ }
+ return;
+ }
+ }
+ }
+ fn_155_3BE0(field_0xBC8);
+ field_0xD6A = cM::rndInt(30) + 15;
+ adjustTargetGnd();
+ adjustTargetRoof();
+ }
+
+ if (field_0xD9A > 0) {
+ field_0xC70 = 0.f;
+ } else {
+ sLib::addCalcScaledDiff(&field_0xC70, 35, 1, 3);
+ }
+ cLib::addCalcPos2(&mPosition, mTargetPos, 0.1, field_0xC70);
+ setPitchYawToPoint(field_0xBF8);
+ sLib::addCalcAngle(mAngle.y.ref(), mYaw_0xC36, 12, 0x1555);
+ sLib::addCalcAngle(mRotation.y.ref(), mYaw_0xC36, 12, 0x1555);
+ sLib::addCalcAngle(mRotation.x.ref(), 0, 12, 0x1555);
+
+ s16 y;
+ if (u16(yAngleDiff + 0x3FFF) <= 0x7FFE) {
+ y = mRotation.x + 0xAAA;
+ } else {
+ y = mRotation.x - 0xAAA;
+ }
+ sLib::addCalcAngle(mRotation.x.ref(), y, 12, 0x1555);
+ }
+ } else {
+ if (field_0xD90 > 0) {
+ field_0xD90--;
+ }
+ if (field_0xDC5 != 0) {
+ field_0xDC5--;
+ } else {
+ if (dAcPy_c::GetLink()->checkCurrentAction(/* SHIELD_BASH*/ 73)) {
+ mWorldMtx.multVecSR(mVec3_c(0, 0, -250), field_0xC1C);
+ mTargetPos += field_0xC1C;
+ field_0xDC5 = 20;
+ }
+ }
+ f32 r = field_0xC44 + 1600.f;
+ if (checkBeyondRadius(getStartingPos(), r * r)) {
+ setIdleState();
+ } else {
+ if (field_0xD90 <= 0) {
+ if (!fn_155_2B80(true, 1)) {
+ setIdleState();
+ return;
+ }
+ field_0xD90 = 3;
+ }
+
+ if (dAcPy_c::GetLink()->checkFlags0x340(0x100)) {
+ if (isOutsideRange()) {
+ changeState(StateID_Chase);
+ return;
+ }
+ } else {
+ if (field_0xDB3 == 0 && dBgS_WtrChk::CheckPos(&mPosition, true, 100, -2000)) {
+ field_0xD10 = dBgS_WtrChk::GetWaterHeight();
+ field_0xDB3 = 1;
+ }
+ }
+ if (field_0xD6A <= 0) {
+ field_0xC70 = 0.f;
+ if (lbl_155_bss_388) {
+ fn_155_1430();
+ } else {
+ if (isTargeted()) {
+ field_0xD6C -= 2;
+ } else {
+ field_0xD6C -= 1;
+ }
+ if (field_0xD6C <= 0 && dAcPy_c::GetLink()->checkFlags0x340(0x100) &&
+ field_0xBF8.squareDistanceToXZ(mPosition) < 160000.f) {
+ fn_155_3460();
+ changeState(StateID_AttackReady);
+ return;
+ }
+ }
+ field_0xBC8.set(cM::rndFX(250), cM::rndF(150) + 100.f, cM::rndF(120) + 150.f);
+ fn_155_3BE0(field_0xBC8);
+
+ if (!dAcPy_c::GetLink()->checkFlags0x340(0x100)) {
+ mTargetPos.y = field_0xD10 + 50.f;
+ }
+ field_0xD6A = cM::rndInt(30) + 15;
+ adjustTargetGnd();
+ adjustTargetRoof();
+ }
+ if (field_0xD9A > 0) {
+ field_0xC70 = 0.f;
+ } else {
+ sLib::addCalcScaledDiff(&field_0xC70, 20, 1, 1);
+ }
+
+ cLib::addCalcPos2(&mPosition, mTargetPos, 0.1, field_0xC70);
+ setPitchYawToPoint(field_0xBF8);
+ sLib::addCalcAngle(mAngle.y.ref(), mYaw_0xC36, 12, 0x1555);
+ sLib::addCalcAngle(mRotation.y.ref(), mYaw_0xC36, 12, 0x1555);
+ sLib::addCalcAngle(mRotation.x.ref(), 0, 12, 0x1555);
+
+ s16 x;
+ if (u16(yAngleDiff + 0x3FFF) <= 0x7FFE) {
+ x = mRotation.x + 0xAAA;
+ } else {
+ x = mRotation.x - 0xAAA;
+ }
+ sLib::addCalcAngle(mRotation.x.ref(), x, 12, 0x1555);
+ }
+ }
+}
+
+bool dAcEKs_c::fn_155_29D0(s32 p1) {
+ dAcObjBase_c *pTarget = targetPlayerOrScrapper(0.f);
+ field_0xBF8.set(pTarget->mPosition);
+ field_0xBF8.y += 100.f;
+
+ dBgS_ObjLinChk linChk;
+ if (isState(StateID_Wait)) {
+ mVec3_c start = mPosition;
+ start.y -= 70.f;
+ linChk.Set(&start, &field_0xBF8, nullptr);
+ } else {
+ linChk.Set(&mPosition, &field_0xBF8, nullptr);
+ }
+ linChk.OnBackFlag();
+
+ switch (p1) {
+ case 0: {
+ if (dBgS::GetInstance()->LineCross(&linChk)) {
+ return true;
+ }
+ } break;
+ case 1: {
+ if (dBgS::GetInstance()->LineCross(&linChk)) {
+ field_0xDCB++;
+ } else {
+ field_0xDCB = 0;
+ }
+ if (field_0xDCB > 10) {
+ field_0xDCB = 0;
+
+ return true;
+ }
+ } break;
+ }
+ return false;
+}
+
+bool dAcEKs_c::fn_155_2B80(bool b, s32 p1) {
+ f32 f0 = field_0xDA5 != 0 ? field_0xC48 + 1200.f : 700.f;
+ dAcObjBase_c *pTarget = targetPlayerOrScrapper(0.f);
+ field_0xBF8.set(pTarget->mPosition);
+ if (field_0xBF8.squareDistanceToXZ(mPosition) < f0 * f0) {
+ f32 f2 = mPosition.y - field_0xBF8.y;
+ if (f2 >= -300.f && f2 <= 1500.f) {
+ if (dAcPy_c::GetLink()->isRecovering() ||
+ /* cannot be EventManager::isInEventOtherThan0Or7 */
+ (EventManager::isInEvent() && !EventManager::isInEvent0Or7())) {
+ return false;
+ }
+ if (fn_155_3EF0()) {
+ return false;
+ }
+ if (b) {
+ if (!fn_155_29D0(p1)) {
+ return true;
+ }
+ } else {
+ return true;
+ }
+ }
+ }
+ return false;
+}
+
+bool dAcEKs_c::fn_155_2D60(bool b, s32 p1) {
+ f32 f0 = field_0xC40 + 1500.f;
+ f32 f1 = field_0xC3C + 700.f;
+ dAcObjBase_c *pTarget = targetPlayerOrScrapper(0.f);
+ field_0xBF8.set(pTarget->mPosition);
+ if (field_0xBF8.squareDistanceToXZ(mPosition) < f1 * f1) {
+ f32 f2 = field_0xBF8.y - mPosition.y;
+ if (f2 <= 0.f && f2 > -f0) {
+ if (b) {
+ if (!fn_155_29D0(p1)) {
+ return true;
+ }
+ } else {
+ return true;
+ }
+ }
+ }
+ return false;
+}
+
+bool dAcEKs_c::fn_155_2EA0() {
+ f32 f0 = field_0xC40 + 1500.f;
+ f32 f1 = field_0xC3C + 700.f;
+ dAcObjBase_c *pTarget = dAcPy_c::GetLink()->getBeetleInFlight();
+ if (pTarget) {
+ field_0xC28.set(pTarget->mPosition);
+ field_0xD1C = field_0xC28.squareDistanceToXZ(mPosition);
+ if (field_0xD1C < f1 * f1) {
+ f32 f2 = field_0xC28.y - mPosition.y;
+ if (f2 <= 0.f && f2 > -f0) {
+ return true;
+ }
+ }
+ }
+ return false;
+}
+
+bool dAcEKs_c::isOutsideRange() {
+ return targetPlayerOrScrapper(0.f)->mPosition.squareDistanceToXZ(mPosition) > 360000.f;
+}
+
+bool dAcEKs_c::isNotWaitingNorDamage() {
+ if (!(isState(StateID_Wait) || isState(StateID_Damage))) {
+ return true;
+ }
+ return false;
+}
+
+bool dAcEKs_c::isTargeted() {
+ dAcObjBase_c *pTarget = AttentionManager::GetInstance()->getTargetedActor();
+ if (!pTarget) {
+ return false;
+ }
+
+ if (pTarget->mProfileName == fProfile::E_KS && pTarget == this) {
+ return true;
+ }
+ return false;
+}
+
+bool dAcEKs_c::checkWallCross() {
+ field_0xDBB++;
+ if (field_0xDBB > 5) {
+ field_0xDBB = 0;
+ mVec3_c offset(0, 0, 200.f);
+ mVec3_c pos;
+ mWorldMtx.multVec(offset, pos);
+ if (dBgS_ObjLinChk::LineCross(&mPosition, &pos, nullptr) && dBgS_ObjLinChk::ChkWall()) {
+ return true;
+ }
+ }
+ return false;
+}
+
+void dAcEKs_c::adjustTargetGnd() {
+ dBgS_ObjGndChk gndChk;
+ mVec3_c pos = mTargetPos;
+ pos.y += 150.f;
+ gndChk.SetPos(&pos);
+ f32 chk = dBgS::GetInstance()->GroundCross(&gndChk);
+ if (mTargetPos.y < chk + 120.f) {
+ mTargetPos.y = chk + 120.f;
+ }
+}
+
+void dAcEKs_c::adjustTargetRoof() {
+ dBgS_ObjRoofChk roofChk;
+ mVec3_c pos = mTargetPos;
+ pos.y -= 150.f;
+ roofChk.SetPos(&pos);
+ f32 chk = dBgS::GetInstance()->RoofChk(&roofChk);
+ if (mTargetPos.y > chk - 120.f) {
+ mTargetPos.y = chk - 120.f;
+ }
+}
+
+bool dAcEKs_c::ChkHit() {
+ if (mAcch.ChkWallHit(nullptr) || mAcch.ChkGndHit() || mAcch.ChkRoofHit()) {
+ return true;
+ } else {
+ return false;
+ }
+}
+
+void dAcEKs_c::fn_155_3460() {
+ lbl_155_bss_388 = true;
+ field_0xDA7 = true;
+}
+
+void dAcEKs_c::fn_155_3480() {
+ if (field_0xDA7) {
+ lbl_155_bss_388 = 0;
+ field_0xDA7 = 0;
+ if (field_0xDA6) {
+ lbl_155_bss_389 = 0;
+ }
+ }
+}
+
+bool dAcEKs_c::transitionToNextState() {
+ if (mCurrentState != mNextState) {
+ switch (mNextState) {
+ case EKS_STATE_Move: changeState(StateID_Move); break;
+ case EKS_STATE_Wait: changeState(StateID_Wait); break;
+ case EKS_STATE_WakeUp: changeState(StateID_WakeUp); break;
+ case EKS_STATE_ReturnToWait: changeState(StateID_ReturnToWait); break;
+ case EKS_STATE_Chase: changeState(StateID_Chase); break;
+ case EKS_STATE_ChaseAttack: changeState(StateID_ChaseAttack); break;
+ case EKS_STATE_Fighting: changeState(StateID_Fighting); break;
+ case EKS_STATE_AttackReady: changeState(StateID_AttackReady); break;
+ case EKS_STATE_Attack: changeState(StateID_Attack); break;
+ case EKS_STATE_Damage: changeState(StateID_Damage); break;
+ case EKS_STATE_Stun: changeState(StateID_Stun); break;
+ case EKS_STATE_WindBlow: changeState(StateID_WindBlow); break;
+ case EKS_STATE_PathMove: changeState(StateID_PathMove); break;
+ }
+ mCurrentState = mNextState;
+ return true;
+ }
+ return false;
+}
+
+void dAcEKs_c::setAnim(char *anm, f32 f0, f32 rate, f32 frame) {
+ mMdl.setAnm(anm, m3d::PLAY_MODE_4, f0);
+ mMdl.setRate(rate);
+ if (frame > 0.f) {
+ mMdl.setFrame(frame);
+ }
+}
+
+void dAcEKs_c::fn_155_3720(f32 scale, f32 rate) {
+ f32 a = rate + scale * 0.01f;
+ f32 endFrame = mMdl.getAnm().getEndFrame();
+ if (a > endFrame) {
+ a = endFrame;
+ }
+ mMdl.setRate(a);
+}
+
+void dAcEKs_c::fn_155_3750(u8 state) {
+ switch (state) {
+ case EKS_STATE_Move: mNextState = state; break;
+ case EKS_STATE_Wait: mNextState = EKS_STATE_ReturnToWait; break;
+ case EKS_STATE_PathMove: mNextState = state; break;
+ default: mNextState = EKS_STATE_Move; break;
+ }
+}
+
+void dAcEKs_c::fn_155_37A0() {
+ mSph.OnAtSet();
+ if (mType == EKS_ELECTRIC) {
+ fn_155_3E90();
+ field_0xDA9 = 0;
+ field_0xD60 = 0;
+ }
+}
+
+void dAcEKs_c::fn_155_37F0() {
+ if (mType == EKS_ELECTRIC) {
+ fn_155_3E90();
+ field_0xDA9 = 0;
+ field_0xD60 = 0;
+ }
+}
+
+void dAcEKs_c::fn_155_3840() {
+ mSph.ClrAtSet();
+ if (mType == EKS_ELECTRIC) {
+ fn_155_3EC0();
+ field_0xDA9 = 1;
+ }
+}
+
+void dAcEKs_c::fn_155_3890() {
+ if (mType == EKS_ELECTRIC) {
+ fn_155_3EC0();
+ field_0xDA9 = 1;
+ }
+}
+
+void dAcEKs_c::on_lbl_155_bss_389() {
+ lbl_155_bss_389 = true;
+}
+
+void dAcEKs_c::setBlinkChecked(u8 blink) {
+ if (blink == mCurrentAnmTexPat) {
+ return;
+ }
+ setBlink(blink);
+}
+
+void dAcEKs_c::fn_155_3900(s32 p0) {
+ switch (p0) {
+ case 0: {
+ if (!(isState(StateID_Stun) || isState(StateID_Damage) || isState(StateID_ReturnToWait) ||
+ isState(StateID_Chase) || isState(StateID_ChaseAttack) || isState(StateID_Fighting) ||
+ isState(StateID_AttackReady) || isState(StateID_Attack) || isState(StateID_WindBlow))) {
+ setActorProperty(AC_PROP_0x1);
+ } else {
+ field_0xDB2 = 1;
+ }
+ } break;
+ case 1: {
+ unsetActorProperty(AC_PROP_0x1);
+ } break;
+ }
+}
+
+void dAcEKs_c::setPitchYawToPoint(const mVec3_c &pnt) {
+ mPitch_0xC34 = -cLib::targetAngleX(mPosition, pnt);
+ mYaw_0xC36 = cLib::targetAngleY(mPosition, pnt);
+}
+
+void dAcEKs_c::fn_155_3BD0(const mVec3_c &pnt) {
+ mWorldMtx.multVec(pnt, mTargetPos);
+}
+
+void dAcEKs_c::fn_155_3BE0(const mVec3_c &pnt) {
+ if (isState(StateID_AttackReady) || isState(StateID_Attack)) {
+ dAcObjBase_c *pAttack = targetPlayerOrScrapper(0.f);
+ if (pAttack->isPlayer()) {
+ mVec3_c v = static_cast<dAcPy_c *>(pAttack)->getCenterTranslation();
+ pAttack->mWorldMtx.multVecSR(pnt, field_0xBBC);
+ field_0xBBC += v;
+ } else {
+ pAttack->mWorldMtx.multVec(pnt, field_0xBBC);
+ }
+ } else {
+ dAcObjBase_c *pAttack = targetPlayerOrScrapper(0.f);
+ pAttack->mWorldMtx.multVec(pnt, mTargetPos);
+ }
+}
+
+void dAcEKs_c::setBlink(u8 blink) {
+ nw4r::g3d::ResAnmTexPat pat(nullptr);
+ mCurrentAnmTexPat = blink;
+ switch (mCurrentAnmTexPat) {
+ case EKS_TEXPAT_BLINK1: pat = mResFile.GetResAnmTexPat("blink_1"); break;
+ case EKS_TEXPAT_BLINK2: pat = mResFile.GetResAnmTexPat("blink_2"); break;
+ case EKS_TEXPAT_BLINK3: pat = mResFile.GetResAnmTexPat("blink_3"); break;
+ }
+ mAnmTexPat.setAnm(mMdl.getModel(), pat, 0, m3d::PLAY_MODE_4);
+}
+
+bool dAcEKs_c::checkPathPntParam(u32 param) {
+ return param != 0 && param < 0xFF;
+}
+
+void dAcEKs_c::fn_155_3E30() {
+ if (field_0xDB2 != 0) {
+ setActorProperty(AC_PROP_0x1);
+ }
+ field_0xDB2 = 0;
+}
+
+void dAcEKs_c::clampRotationX() {
+ if (mRotation.x >= 0xE39) {
+ mRotation.x.set(0xE39);
+ } else if (mRotation.x <= -0xE39) {
+ mRotation.x.set(-0xE39);
+ }
+}
+
+void dAcEKs_c::fn_155_3E90() {
+ mSph.OnTgElectric();
+ mSph.SetTg_0x50(2);
+ mSph.OnCo_0x8000();
+}
+
+void dAcEKs_c::fn_155_3EC0() {
+ mSph.ClrTgElectric();
+ mSph.SetTg_0x50(0);
+ mSph.ClrCo_0x8000();
+}
+
+bool dAcEKs_c::fn_155_3EF0() {
+ if (field_0xDCF == 0 && dTimeAreaMgr_c::GetInstance()->fn_800B9B60(mRoomID, dAcPy_c::GetLink()->mPosition)) {
+ return true;
+ } else {
+ return false;
+ }
+}
+
+void dAcEKs_c::fn_155_3F50() {
+ if ((field_0xD9C & 1) == 0 && field_0xD9E < 9) {
+ mVec3_c end = mPosition;
+ if (dBgS_ObjLinChk::LineCross(&mPnts[field_0xD9E], &end, nullptr)) {
+ field_0xD9E++;
+ mPnts[field_0xD9E].set(end);
+ }
+ }
+
+ if (field_0xD9E != 0 && ((field_0xD9C + 4) & 7) == 0) {
+ mVec3_c end = mPosition;
+ if (!dBgS_ObjLinChk::LineCross(&mPnts[field_0xD9E - 1], &end, nullptr)) {
+ field_0xD9E--;
+ }
+ }
+}
+
+bool dAcEKs_c::createHeap() {
+ static const char *resFiles[] = {"Kiesu", "Kiesu_fire", "Kiesu_electric", "KiesuDevil"};
+ static const char *mdlNames[] = {"kiesu", "F_kiesu", "EKiesu", "DKiesu"};
+
+ mType = getFromParams(0, 0x7);
+ nw4r::g3d::ResFile mdlResFile(getOarcResFile(resFiles[mType]));
+ nw4r::g3d::ResFile anmResFile(getOarcResFile("Kiesu_anime"));
+
+ TRY_CREATE(mMdl.create3(*this, mdlResFile.ptr(), anmResFile.ptr(), mdlNames[mType], "fly", 0x133));
+
+ mResFile = mdlResFile;
+
+ nw4r::g3d::ResAnmTexPat anmTexPat(mResFile.GetResAnmTexPat("blink_1"));
+
+ TRY_CREATE(mAnmTexPat.create(mMdl.getModel().getResMdl(), anmTexPat, &mAllocator, nullptr, 1));
+
+ fn_80030980(mMdl.getModel(), 1, false);
+ mMdl.getModel().setAnm(mAnmTexPat);
+
+ return true;
+}
+
+int dAcEKs_c::actorCreate() {
+ if (StoryflagManager::sInstance->getFlag(STORYFLAG_GRATITUDE_QUEST_FINISHED)) {
+ if (dScGame_c::isCurrentStage("F000") || dScGame_c::isCurrentStage("D000")) {
+ return FAILED;
+ }
+ }
+
+ CREATE_ALLOCATOR(dAcEKs_c);
+
+ mAcch.Set(this, 1, &mAcchCir);
+ mAcchCir.SetWall(20, 60);
+
+ mStts.SetRank(2);
+
+ mSph.Set(sSrcSph);
+ mSph.SetStts(mStts);
+
+ mAcceleration = 0.f;
+ mMaxSpeed = -40.f;
+
+ setStartingPosition(mPosition);
+ field_0xBE0 = mPosition;
+ field_0xBEC.set(0, 100, 0);
+ field_0xC10.set(0, 0, 0);
+ field_0xCE4 = 500.f;
+
+ field_0xDB7 = 0;
+ field_0xDA5 = 0;
+ field_0xDA9 = 0;
+ field_0xDAA = 0;
+ field_0xDB6 = 0;
+ field_0xDAC = 1;
+ field_0xDBE = 45;
+ field_0xDBB = 0;
+ field_0xDC1 = 0;
+
+ mSph.ClrAtSet();
+ mHealth = 4;
+ field_0xD84 = 0;
+
+ mEmitter1.init(this);
+ mEmitter2.init(this);
+
+ field_0xDA7 = 0;
+ field_0xDAD = 0;
+ field_0xDAE = 0;
+ field_0xDC8 = 0;
+
+ field_0xD04 = 0.f;
+ field_0xD00 = 0.f;
+
+ field_0xD88 = mRotation.y;
+ field_0xD8A = mRotation.y - 0x8000;
+
+ field_0xDBF = 0;
+ field_0xD60 = 0;
+ field_0xD62 = 10 + cM::rndInt(5);
+ field_0xDB1 = 0;
+ field_0xDCF = (mRotation.z >> 12) & 1;
+ field_0xD9A = 0;
+ if (field_0xDCF == 0) {
+ field_0xDD0 = 0;
+ mTimeArea.setField0x08(1);
+ mTimeArea.setField0x00(1);
+
+ if (dScGame_c::isCurrentStage("D301")) {
+ setActorProperty(AC_PROP_0x400);
+ }
+ }
+ field_0xC3C = getFromParams(6, 0xF, 100);
+ field_0xC40 = getFromParams(10, 0xF, 100);
+ field_0xC44 = ((mRotation.z >> 0) & 0xF) * 100.f;
+ field_0xC48 = ((mRotation.z >> 4) & 0xF) * 100.f;
+
+ if (!mTgRef.isLinked() || ((mRotation.z >> 8) & 0xF) < 3) {
+ field_0xDA6 = 0;
+ }
+
+ mAngle.z = mRotation.z = 0;
+
+ lbl_155_bss_388 = 0;
+ lbl_155_bss_389 = 0;
+
+ field_0xDB0 = mRail.init(getFromParams(22, 0xFF), mRoomID, 1, 0, false, 0.f, 0.f, 0.01f);
+ if (field_0xDB0 != 0) {
+ mRail.setSpeed(15.f);
+ }
+ if (field_0xDB0 != 0) {
+ mStartingState = 2;
+ } else {
+ mStartingState = getFromParams(3, 0x7);
+ }
+
+ mVec3_c bboxMin(-250, -800, -250);
+ mVec3_c bboxMax(250, 250, 250);
+ mBoundingBox.Set(bboxMin, bboxMax);
+
+ field_0xD9C = cM::rndF(0x10000);
+ field_0xD9E = 0;
+ mScale.set(1.2, 1.2, 1.2);
+
+ mMdl.getModel().setScale(mScale);
+ mWaterEmitter.init(this, 30, 1, 0);
+ if (mType != EKS_NORMAL) {
+ field_0xDA4 = 1;
+ nw4r::g3d::ResNode node = mMdl.getModel().getResMdl().GetResNode("center");
+ mCenterNode = node.GetID();
+ } else {
+ field_0xDA4 = 0;
+ }
+
+ if (mType == EKS_FIRE) {
+ mSph.SetAtModifier(AT_MOD_FIRE);
+ mSph.SetCo_0x8000();
+ mTargetFiTextID = 0xE;
+ } else if (mType == EKS_ELECTRIC) {
+ mSph.SetAtModifier(AT_MOD_ELECTRIC);
+ field_0xDA9 = 1;
+ mTargetFiTextID = 0xD;
+ } else if (mType == EKS_CURSED) {
+ mSph.SetAtModifier(AT_MOD_CURSED);
+ mTargetFiTextID = 0xC;
+ }
+
+ if (mType == EKS_FIRE) {
+ mLightInfluence.mPos = mPosition;
+ mLightInfluence.mClr.Set(0xFF, 0xA0, 0x50, 0xFF);
+ mLightInfluence.SetScale(400);
+ field_0xD20 = 400.f;
+ field_0xD24 = 1.f;
+ field_0xD28 = 40.f;
+ dLightEnv_c::GetPInstance()->plight_set(&mLightInfluence);
+ } else if (mType == EKS_ELECTRIC) {
+ mLightInfluence.mPos = mPosition;
+ mLightInfluence.mClr.Set(0x64, 0xFF, 0xFF, 0xFF);
+ mLightInfluence.SetScale(300);
+ field_0xD20 = 400.f;
+ field_0xD24 = 1.f;
+ field_0xD28 = 40.f;
+ dLightEnv_c::GetPInstance()->plight_set(&mLightInfluence);
+ }
+ setStartingState();
+ mAcch.CrrPos(*dBgS::GetInstance());
+
+ return SUCCEEDED;
+}
+
+int dAcEKs_c::actorPostCreate() {
+ if (field_0xDCF == 0) {
+ if (dTimeAreaMgr_c::GetInstance()->fn_800B9B60(mRoomID, mPosition)) {
+ mTimeArea.setField0x00(0.f);
+ }
+ mMdl.getModel().setScale(mScale * mTimeArea.getDistMaybe());
+ }
+
+ if (isState(StateID_Wait)) {
+ mPosition.y = getLineCrossYRange(mPosition, 200);
+ setStartingPosition(mPosition);
+ }
+
+ mPnts[0].set(mStartingPos);
+
+ if (isState(StateID_Wait)) {
+ mPnts[0].y -= 20.f;
+ }
+
+ updateMatrix();
+
+ return SUCCEEDED;
+}
+
+int dAcEKs_c::doDelete() {
+ if (mType == EKS_FIRE || mType == EKS_ELECTRIC) {
+ dLightEnv_c::GetPInstance()->plight_cut(&mLightInfluence);
+ }
+ return SUCCEEDED;
+}
+
+int dAcEKs_c::actorExecute() {
+ s32 _weird_zero = 0;
+
+ mTimer++;
+
+ if (field_0xDCF == 0) {
+ int checkedTime = mTimeArea.check(mRoomID, mPosition, 0, 30, 0.2);
+ if (checkedTime != 0) {
+ if (checkedTime > 0) {
+ startSound(SE_TIMESLIP_TIMESLIP);
+ field_0xD9A = 15;
+ } else {
+ startSound(SE_TIMESLIP_TIMESLIP_REV);
+ mSph.OnCoSet();
+ mSph.OnTgSet();
+ }
+
+ static mVec3_c effScale(1, 1, 1);
+ dJEffManager_c::spawnEffect(
+ PARTICLE_RESOURCE_ID_MAPPING_464_, mPosition, nullptr, &effScale, nullptr, nullptr, 0, 0
+ );
+ fn_80030700();
+ }
+
+ if (mTimeArea.isNearZero()) {
+ mSph.ClrCoSet();
+ mSph.ClrTgSet();
+ mSph.ClrAtSet();
+
+ fn_800306D0();
+ if (mType == EKS_FIRE || mType == EKS_ELECTRIC) {
+ field_0xD20 = 0.f;
+ mLightInfluence.SetScale(0.f);
+ }
+
+ return SUCCEEDED;
+ }
+
+ if (field_0xD9A > 0) {
+ field_0xD9A--;
+ }
+ }
+ if (mHealth != 0) {
+ fn_155_A60();
+ }
+
+ mStateMgr.executeState();
+ field_0xD9C++;
+
+ if (isState(StateID_Chase) || isState(StateID_ChaseAttack) || isState(StateID_Fighting) ||
+ isState(StateID_AttackReady) || isState(StateID_Attack) || isState(StateID_WindBlow)) {
+ fn_155_3F50();
+ }
+
+ if (mType == EKS_FIRE) {
+ if (field_0xDA9 != 0 || isState(StateID_Wait)) {
+ field_0xD20 = 0.f;
+ mLightInfluence.SetScale(0.f);
+ } else {
+ if (field_0xD60 > 0) {
+ field_0xD20 = 0.f;
+ } else {
+ field_0xD20 = 400.f;
+ }
+ }
+
+ mLightInfluence.mClr.Set(0xFF, 0xA0, 0x50, 0xFF);
+ sLib::addCalcScaledDiff(&mLightInfluence.mScale, field_0xD20, field_0xD24, field_0xD28);
+ } else if (mType == EKS_ELECTRIC) {
+ if (field_0xDA9 != 0 || isState(StateID_Wait) || field_0xD60 > 0) {
+ field_0xD20 = 0.f;
+ mLightInfluence.SetScale(0.f);
+ } else {
+ if ((dScGame_c::getUpdateFrameCount() & 8) != 0) {
+ mLightInfluence.SetScale(300.f);
+ } else {
+ mLightInfluence.SetScale(200.f);
+ }
+ }
+ mLightInfluence.mClr.Set(0x64, 0xFF, 0xFF, 0xFF);
+ }
+
+ if (!isState(StateID_WindBlow)) {
+ if (mSph.ChkTgHit() && mSph.ChkTgAtHitType(AT_TYPE_BELLOWS) && mSph.GetTgDamageFlags() == 0x8) {
+ if (field_0xDA6 != 0) {
+ mCurrentState = EKS_STATE_WindBlow;
+ if (mTgRef.isLinked()) {
+ mTgRef.get()->setField_0x47A();
+ }
+ }
+ mVelocity.set(0, 0, 0);
+ mAngle.y = cLib::targetAngleY(dAcPy_c::GetLink()->mPositionCopy2, mPosition);
+ mAngle.x = cLib::targetAngleX(dAcPy_c::GetLink()->mPositionCopy2, mPosition);
+
+ // I Guess we funky
+ s32 t = 7281;
+ field_0xD66 = (cM::rndFX(0.25f + (0.01f * _weird_zero)) + (0.75f + (0.01f * _weird_zero))) * t;
+ field_0xD68 = (cM::rndFX(0.25f + (0.01f * _weird_zero)) + (0.65f + (0.01f * _weird_zero))) * t;
+
+ if (field_0xD66 < 0) {
+ field_0xD64 = -910;
+ } else {
+ field_0xD64 = 910;
+ }
+ if (isState(StateID_Wait)) {
+ mSpeed = 0.f;
+ mVelocity.set(0, 0, 0);
+ field_0xDAA = 1;
+ mPosition.y -= 30.f;
+ changeState(StateID_WindBlow);
+ } else {
+ mSpeed = 35.f;
+ if (mAngle.x > 0xAAB) {
+ mVelocity.y = 15.f;
+ } else if (mAngle.x < -0xAAB) {
+ mVelocity.y = -15.f;
+ }
+ changeState(StateID_WindBlow);
+ }
+ }
+ }
+
+ calcVelocity();
+
+ mPosition += mVelocity;
+ mPosition += mStts.GetCcMove();
+
+ if (!(isState(StateID_Wait) || isState(StateID_WaitReady))) {
+ mAcch.CrrPos(*dBgS::GetInstance());
+ mWaterEmitter.execute(mAcch.GetWtrGroundH(), mAcch.GetGroundH());
+ }
+
+ if (field_0xDCF == 0) {
+ mMdl.getModel().setScale(mScale * mTimeArea.getDistMaybe());
+ } else {
+ mMdl.getModel().setScale(mScale);
+ }
+
+ updateMatrix();
+ mMdl.getModel().setLocalMtx(mWorldMtx);
+ mMdl.getModel().calc(false);
+ mSph.SetC(mPosition + field_0xC10);
+ dCcS::GetInstance()->Set(&mSph);
+
+ if (isNotWaitingNorDamage()) {
+ mPositionCopy2.set(mPosition);
+ mPositionCopy3.set(mPosition);
+ if (!isState(StateID_Stun)) {
+ mPositionCopy3.y += 60.f;
+ } else {
+ mPositionCopy3.y += 40.f;
+ }
+ fn_80030c20(0x2, 700, 50, -500, 500);
+ }
+
+ fn_80030400(mMdl.getModel(), 100, false, field_0xDBF);
+
+ if (field_0xD30 != 0) {
+ if (checkObjectProperty(OBJ_PROP_0x1)) {
+ field_0xD31 = 0;
+ } else {
+ if ((mTimer % 12) == 0) {
+ mVec3_c start = mPosition;
+ mVec3_c end = dScGame_c::getCamera()->getPosition();
+ end.y += 100.f;
+ end += start;
+ end *= 0.5f;
+
+ if (dBgS_ObjLinChk::LineCross(&start, &end, nullptr)) {
+ field_0xD31 = 0;
+ } else {
+ field_0xD31 = 1;
+ }
+ }
+ }
+ } else {
+ field_0xD31 = 1;
+ if (checkObjectProperty(OBJ_PROP_0x1)) {
+ field_0xD31 = 0;
+ }
+ }
+
+ if (field_0xDA9 == 0) {
+ if (!isState(StateID_Wait) && field_0xDA4 != 0) {
+ if (mType == EKS_FIRE) {
+ if (field_0xD60 > 0) {
+ field_0xD60--;
+ } else {
+ if (field_0xD31 != 0) {
+ holdSound(SE_EKs_FIRE_LV);
+ mMdl.getModel().getNodeWorldMtx(mCenterNode, mCenterWorldMtx);
+ mCenterWorldMtx.getTranslation(field_0xB98);
+ mEmitter1.holdEffect(
+ PARTICLE_RESOURCE_ID_MAPPING_402_, field_0xB98, nullptr, &mScale, nullptr, nullptr
+ );
+ mLightInfluence.mPos = field_0xB98;
+ }
+ }
+ } else if (mType == EKS_ELECTRIC) {
+ if (field_0xD60 > 0) {
+ field_0xD60--;
+ } else {
+ if (field_0xD31 != 0) {
+ fn_155_3E90();
+ holdSound(SE_EKs_ELEC_LV);
+ mMdl.getModel().getNodeWorldMtx(mCenterNode, mCenterWorldMtx);
+ mCenterWorldMtx.getTranslation(field_0xB98);
+ mEmitter1.holdEffect(
+ PARTICLE_RESOURCE_ID_MAPPING_401_, field_0xB98, nullptr, &mScale, nullptr, nullptr
+ );
+ mLightInfluence.mPos = field_0xB98;
+ }
+ }
+ } else if (mType == EKS_CURSED) {
+ if (field_0xD60 > 0) {
+ field_0xD60--;
+ } else {
+ if (field_0xD31 != 0) {
+ holdSound(SE_EKs_MA_LV);
+ mMdl.getModel().getNodeWorldMtx(mCenterNode, mCenterWorldMtx);
+ mCenterWorldMtx.getTranslation(field_0xB98);
+ mEmitter1.holdEffect(
+ PARTICLE_RESOURCE_ID_MAPPING_400_, field_0xB98, nullptr, &mScale, nullptr, nullptr
+ );
+ mEmitter1.setGlobalAlpha(dStageMgr_c::GetInstance()->getGlobalAlpha());
+ }
+ }
+ }
+ }
+ }
+
+ return SUCCEEDED;
+}
+int dAcEKs_c::draw() {
+ if (field_0xDCF == 0 && mTimeArea.isNearZero()) {
+ return SUCCEEDED;
+ }
+
+ if (field_0xDA9 == 0 && !isState(StateID_Wait) && field_0xDA4 != 0) {
+ if (mType == EKS_FIRE || mType == EKS_ELECTRIC) {
+ mLightingInfo.mLightingCode = 0xF;
+ }
+ }
+
+ drawModelType1(&mMdl.getModel());
+
+ if (!isState(StateID_Wait)) {
+ field_0xD18 = mPosition.y - mAcch.GetGroundH();
+ // I hate this xD
+ mQuat_c shadowRot(
+ mVec3_c(0.f + dAcEKs_HIO_c::sInstance.getZero(), 5, 0.f + dAcEKs_HIO_c::sInstance.getZero()),
+ 50.f + dAcEKs_HIO_c::sInstance.getZero()
+ );
+ field_0xAE4.transS(mPosition);
+ drawShadow(mShadow, nullptr, field_0xAE4, &shadowRot, -1, -1, -1, -1, -1, field_0xD18);
+ }
+
+ return SUCCEEDED;
+}
+
+void dAcEKs_c::initializeState_Wait() {
+ // Float Ordering
+ static const f32 __f[1] = {0.f};
+
+ mAcchCir.SetWall(0, 5);
+ setAnim("wait", 4, 1, 0);
+ setBlink(EKS_TEXPAT_BLINK1);
+ mAnmTexPat.setFrame(3, 0);
+ mStts.SetRank(11);
+ mSpeed = 0.f;
+ field_0xC10.y = -35.f;
+ field_0xD4A = 30;
+ field_0xDA5 = 0;
+ field_0xDAA = 0;
+ field_0xDC4 = cM::rndInt(35);
+ field_0xD90 = 3;
+ field_0xDCE = 0;
+ field_0xDB4 = 0;
+ if (field_0xDB0 != 0) {
+ field_0xDB1 = 1;
+ field_0xD8E = field_0xDCA * 30;
+ } else if ((s32)getFromParams(30, 3) == 1) {
+ field_0xDB1 = 1;
+ field_0xD8E = (cM::rndInt(20) + 10) * 30;
+ }
+
+ mRotation.y = field_0xD8A;
+ mRotation.x = mAng(0);
+ mAcch.ClrRoofHit();
+ mAcch.SetField_0xD4(0);
+ mAcch.SetGroundUpY(0);
+ setBattleBgmRelated(0);
+
+ if (field_0xDA6 != 0) {
+ fn_155_3E30();
+ } else {
+ setActorProperty(AC_PROP_0x1);
+ }
+
+ if (mType == EKS_FIRE) {
+ mSph.ClrCo_0x8000();
+ field_0xD20 = 0.f;
+ mLightInfluence.SetScale(0.f);
+ } else if (mType == EKS_ELECTRIC) {
+ fn_155_3EC0();
+ field_0xD20 = 0.f;
+ mLightInfluence.SetScale(0.f);
+ }
+ mPosition.y = getLineCrossYRange(mPosition, 200);
+ setStartingPosition(mPosition);
+}
+
+void dAcEKs_c::executeState_Wait() {
+ mMdl.play();
+ u16 flag = getFromParams(14, 0xFF);
+ if (flag < 0xFF) {
+ if (SceneflagManager::sInstance->checkBoolFlag(mRoomID, flag)) {
+ if (field_0xDCE == 0) {
+ mStartingState = EKS_STARTSTATE_Move;
+ if (field_0xDA6 == 0) {
+ mMtx_c m;
+ m.YrotS(mRotation.y + 0x8000);
+ mVec3_c out, in(0, 0, 500);
+ m.multVecSR(in, out);
+
+ // TODO Fixup LineCross for Const References
+ if (!(dBgS_ObjLinChk::LineCross(
+ &(getStartingPos() + out), &(getStartingPos() + out * 2.0f), nullptr
+ ) &&
+ dBgS_ObjLinChk::ChkWall())) {
+ out *= 2.f;
+ }
+ setStartingPosition(getStartingPos() + out);
+ }
+ field_0xCF8 = 20.f;
+ field_0xDC8 = 150;
+ field_0xD04 = 0.9f;
+ field_0xD00 = 1.7f;
+ field_0xDCE = 1;
+
+ } else if (field_0xDCE == 1) {
+ changeState(StateID_WakeUp);
+ return;
+ }
+ } else if (field_0xDB4 != 0 && --field_0xD4A < 0xF) {
+ mAnmTexPat.play();
+ if (field_0xD4A < 0) {
+ mStartingState = EKS_STARTSTATE_Move;
+ field_0xDAA = 1;
+ dTgKiesuTag_c *pTg = mTgRef.get();
+ if (pTg) {
+ pTg->setField_0x47A();
+ }
+ changeState(StateID_WakeUp);
+ return;
+ }
+ }
+
+ if (fn_155_2EA0()) {
+ playBlinkAnm();
+ if (field_0xD62 > 0) {
+ field_0xD62--;
+ } else {
+ field_0xD62 = cM::rndInt(5) + 10;
+ f32 f = 800.f;
+ if (field_0xD1C < f * f && !dBgS_ObjLinChk::LineCross(&mPosition, &field_0xC28, nullptr)) {
+ field_0xDB4 = 1;
+ field_0xD4A = cM::rndInt(15);
+ }
+ }
+ } else if (field_0xDA5 == 0) {
+ mAnmTexPat.setFrame(3, 0);
+ }
+ return;
+ }
+
+ if (field_0xDA6 != 0) {
+ if (field_0xDA5 == 0) {
+ if (field_0xDAD != 0) {
+ if (field_0xDC4 != 0) {
+ field_0xDC4--;
+ } else {
+ field_0xDA5 = 1;
+ field_0xD4C = cLib::targetAngleY(mPosition, targetPlayerOrScrapper(0)->mPosition) - 0x8000;
+ }
+ }
+ } else {
+ sLib::addCalcAngle(mRotation.y.ref(), field_0xD4C, 5, 0xAAB);
+
+ if (--field_0xD4A < 15) {
+ mAnmTexPat.play();
+ if (field_0xD4A < 0) {
+ field_0xD4C = field_0xD4C + 0x8000;
+ changeState(StateID_WakeUp);
+ return;
+ }
+ }
+ }
+ if (field_0xDB4 != 0 || field_0xDAA != 0) {
+ if (--field_0xD4A < 15) {
+ mAnmTexPat.play();
+ if (field_0xD4A < 0) {
+ field_0xDAA = 1;
+ if (mTgRef.isLinked()) {
+ mTgRef.get()->setField_0x47A();
+ }
+ changeState(StateID_WakeUp);
+ return;
+ }
+ }
+ }
+ } else {
+ fn_155_3E30();
+ if (field_0xDA5 == 0) {
+ if (field_0xD90 > 0) {
+ field_0xD90--;
+ } else {
+ if (fn_155_2D60(true, 0)) {
+ field_0xDA5 = 1;
+ field_0xD4C = cLib::targetAngleY(mPosition, targetPlayerOrScrapper(0)->mPosition) - 0x8000;
+ } else {
+ field_0xD90 = 3;
+ }
+ }
+ } else {
+ sLib::addCalcAngle(mRotation.y.ref(), field_0xD4C, 5, 0xAAB);
+
+ if (--field_0xD4A < 15) {
+ mAnmTexPat.play();
+ if (field_0xD4A < 0) {
+ field_0xD4C = field_0xD4C + 0x8000;
+ changeState(StateID_WakeUp);
+ return;
+ }
+ }
+ }
+ if (field_0xDAA != 0 || field_0xDB4 != 0) {
+ if (--field_0xD4A < 15) {
+ mAnmTexPat.play();
+ if (field_0xD4A < 0) {
+ changeState(StateID_WakeUp);
+ return;
+ }
+ }
+ }
+ if (field_0xDB1 != 0) {
+ if (field_0xD8E != 0) {
+ field_0xD8E--;
+ } else {
+ field_0xDAA = 1;
+ changeState(StateID_WakeUp);
+ return;
+ }
+ }
+ }
+
+ if (dLightEnv_c::GetPInstance()->check_BPM8(&mPosition, nullptr) || field_0xDAE != 0) {
+ field_0xDAA = 1;
+ field_0xD4A = cM::rndInt(10);
+ }
+ if (fn_155_2EA0()) {
+ playBlinkAnm();
+ if (field_0xD62 > 0) {
+ field_0xD62--;
+ } else {
+ field_0xD62 = cM::rndInt(5) + 10;
+ f32 f = 800.f;
+ if (field_0xD1C < f * f && !dBgS_ObjLinChk::LineCross(&mPosition, &field_0xC28, nullptr)) {
+ field_0xDB4 = 1;
+ field_0xD4A = cM::rndInt(15);
+ }
+ }
+ } else {
+ if (field_0xDA5 == 0) {
+ mAnmTexPat.setFrame(3, 0);
+ }
+ }
+}
+void dAcEKs_c::finalizeState_Wait() {
+ mStts.SetRank(2);
+ field_0xC10.y = 0.f;
+ setBattleBgmRelated(2);
+
+ if (mType == EKS_FIRE) {
+ mSph.SetCo_0x8000();
+ field_0xD20 = 400.f;
+ field_0xD24 = 1.f;
+ field_0xD28 = 40.f;
+ } else if (mType == EKS_ELECTRIC) {
+ field_0xD20 = 400.f;
+ field_0xD24 = 1.f;
+ field_0xD28 = 40.f;
+ }
+}
+
+void dAcEKs_c::initializeState_WakeUp() {
+ setAnim("turn_st", 10, 1, 0);
+ setBlink(EKS_TEXPAT_BLINK1);
+ mBlinkTimer = cM::rndInt(75) + 15;
+ field_0xCFC = mPosition.y - 70.f;
+ field_0xD4E = 15;
+
+ if (field_0xDAA) {
+ field_0xDA5 = 0;
+ } else {
+ field_0xDA5 = 1;
+ }
+ mAcch.ClrRoofNone();
+ mAcchCir.SetWall(-20, 5);
+}
+void dAcEKs_c::executeState_WakeUp() {
+ mMdl.play();
+ playBlinkAnm();
+ sLib::addCalcScaledDiff(&mPosition.y, field_0xCFC, 0.1, 3);
+ sLib::addCalcAngle(mRotation.y.ref(), field_0xD4C, 12, 0xAAB);
+ sLib::addCalcAngle(mAngle.y.ref(), field_0xD4C, 12, 0xAAB);
+ if (field_0xDA6 != 0) {
+ if (--field_0xD4E < 0) {
+ if (transitionToNextState()) {
+ return;
+ }
+ }
+ } else if (--field_0xD4E < 0) {
+ if (field_0xDAA != 0) {
+ if (fn_155_2B80(true, 0)) {
+ changeState(StateID_Chase);
+ } else if (field_0xDB0) {
+ changeState(StateID_PathMove);
+ } else {
+ changeState(StateID_ReturnToWait);
+ }
+ } else if (field_0xDC8 != 0) {
+ changeState(StateID_Move);
+ } else {
+ changeState(StateID_Chase);
+ }
+ }
+}
+void dAcEKs_c::finalizeState_WakeUp() {
+ mAngle.y = mRotation.y;
+ mAcch.ClrRoofNone();
+ mAcchCir.SetWall(20, 60);
+ mAcch.SetField_0xD4(55);
+ mAcch.SetGroundUpY(30);
+}
+
+void dAcEKs_c::initializeState_ReturnToWait() {
+ field_0xD30 = 1;
+ setAnim("fly", 1.5, cM::rndFX(0.2) + 1.f, 0);
+ if (mCurrentAnmTexPat == EKS_TEXPAT_BLINK2) {
+ setBlink(EKS_TEXPAT_BLINK3);
+ } else {
+ setBlink(EKS_TEXPAT_BLINK1);
+ }
+
+ mBlinkTimer = cM::rndInt(75) + 15;
+ field_0xD52 = cM::rndInt(20) + 20;
+ field_0xD54 = cM::rndInt(30) + 30;
+
+ if (field_0xDA6 == 0) {
+ mTargetPos.x = getStartingPos().x + cM::rndFX(800);
+ mTargetPos.y = getStartingPos().y + cM::rndFX(400);
+ mTargetPos.z = getStartingPos().z + cM::rndFX(800);
+ }
+
+ setPitchYawToPoint(mTargetPos);
+ mSpeed = 15.f;
+ field_0xC70 = 0.f;
+ field_0xDB7 = 0;
+ field_0xDBA = 0;
+ field_0xDC1 = 0;
+ field_0xD90 = 3;
+ field_0xDA5 = 0;
+ mSqueakSoundTimer = cM::rndInt(20) + 20;
+ unsetActorProperty(AC_PROP_0x1);
+ field_0xD82 = 0;
+ field_0xDA0 = 0;
+}
+void dAcEKs_c::executeState_ReturnToWait() {
+ if ((s32)getFromParams(30, 0x3) == 2) {
+ if (field_0xD82 > 1) {
+ field_0xD82 = 0;
+ if (!checkBeyondRadius(getStartingPos(), 490000.f)) {
+ setActorProperty(AC_PROP_0x1);
+ }
+ } else {
+ field_0xD82++;
+ }
+ }
+ fn_155_3720(mSpeed, cM::rndFX(0.1) + 1.f);
+ mMdl.play();
+ playBlinkAnm();
+ soundSqueak();
+ if (field_0xD9A > 0) {
+ mSpeed = 0.f;
+ } else {
+ sLib::addCalcScaledDiff(&mSpeed, 15, 0.1, 0.1);
+ }
+ fn_155_1470();
+}
+void dAcEKs_c::finalizeState_ReturnToWait() {
+ mAngle.y = mRotation.y;
+ field_0xDAD = 0;
+ field_0xDAE = 0;
+ field_0xD30 = 0;
+}
+
+void dAcEKs_c::initializeState_WaitReady() {
+ setAnim("turn_ed", 1, 1, 0);
+ setBlink(EKS_TEXPAT_BLINK1);
+ mBlinkTimer = cM::rndInt(75) + 15;
+ mAcchCir.SetWall(0, 5);
+ mSpeed = 0.f;
+ field_0xDA5 = 0;
+ field_0xD50 = 30;
+ mAcch.ClrRoofHit();
+ mAcch.SetField_0xD4(0.f);
+ mAcch.SetGroundUpY(0.f);
+ field_0xDAD = 0;
+ field_0xDAE = 0;
+}
+void dAcEKs_c::executeState_WaitReady() {
+ mMdl.play();
+ playBlinkAnm();
+ if (field_0xD50 > 0) {
+ field_0xD50--;
+ }
+ sLib::addCalcAngle(mRotation.x.ref(), 0, 12, 0xAAB);
+ sLib::addCalcAngle(mRotation.y.ref(), field_0xD8A, 12, 0xAAB);
+ sLib::addCalcAngle(mAngle.y.ref(), field_0xD8A, 12, 0xAAB);
+
+ sLib::addCalcScaledDiff(&mPosition.x, getStartingPos().x, 0.1, 3);
+ sLib::addCalcScaledDiff(&mPosition.z, getStartingPos().z, 0.1, 3);
+ if (sLib::chase(&mPosition.y, getStartingPos().y, 6) || mAcch.ChkRoofHit()) {
+ if (field_0xD50 <= 0) {
+ changeState(StateID_Wait);
+ mCurrentState = EKS_STATE_Wait;
+ }
+ }
+}
void dAcEKs_c::finalizeState_WaitReady() {}
-void dAcEKs_c::initializeState_Move() {}
-void dAcEKs_c::executeState_Move() {}
-void dAcEKs_c::finalizeState_Move() {}
-void dAcEKs_c::initializeState_Chase() {}
-void dAcEKs_c::executeState_Chase() {}
+
+void dAcEKs_c::initializeState_Move() {
+ field_0xD30 = 1;
+ setAnim("fly", 1.5, cM::rndFX(0.2) + 1.f, 0);
+ if (mCurrentAnmTexPat == EKS_TEXPAT_BLINK2) {
+ setBlink(EKS_TEXPAT_BLINK3);
+ } else {
+ setBlink(EKS_TEXPAT_BLINK1);
+ }
+
+ mBlinkTimer = cM::rndInt(75) + 15;
+ field_0xD52 = cM::rndInt(20) + 20;
+ field_0xD54 = cM::rndInt(30) + 30;
+
+ if (field_0xDA6 == 0) {
+ mTargetPos.x = getStartingPos().x + cM::rndFX(800);
+ mTargetPos.y = getStartingPos().y + cM::rndFX(400);
+ mTargetPos.z = getStartingPos().z + cM::rndFX(800);
+ }
+
+ setPitchYawToPoint(mTargetPos);
+ mSpeed = field_0xCF8 + 15.f;
+ field_0xC70 = 0.f;
+ field_0xDB7 = 0;
+ field_0xDC1 = 0;
+ field_0xD90 = 3;
+ field_0xDA5 = 0;
+ mSqueakSoundTimer = cM::rndInt(20) + 20;
+ field_0xD82 = 0;
+}
+void dAcEKs_c::executeState_Move() {
+ if (field_0xD82 > 1) {
+ field_0xD82 = 0;
+ if (!checkBeyondRadius(getStartingPos(), 490000.f)) {
+ setActorProperty(AC_PROP_0x1);
+ }
+ } else {
+ field_0xD82++;
+ }
+
+ fn_155_3720(mSpeed, cM::rndFX(0.2) + 1.f);
+ mMdl.play();
+ playBlinkAnm();
+ soundSqueak();
+ if (field_0xD9A > 0) {
+ mSpeed = 0.f;
+ } else {
+ sLib::addCalcScaledDiff(&mSpeed, 15, 0.1, 0.1);
+ }
+
+ if (std::abs(field_0xD00) > 0.01f) {
+ sLib::addCalcScaled(&field_0xD00, 0.1, 1);
+ } else {
+ field_0xD00 = 0.f;
+ }
+ if (std::abs(field_0xD04) > 0.01f) {
+ sLib::addCalcScaled(&field_0xD04, 0.1, 1);
+ } else {
+ field_0xD04 = 0.f;
+ }
+ fn_155_1C80();
+}
+void dAcEKs_c::finalizeState_Move() {
+ field_0xD30 = 0;
+ field_0xCF8 = 0.f;
+ field_0xDC8 = 0;
+ field_0xD04 = 0.f;
+ field_0xD00 = 0.f;
+}
+
+void dAcEKs_c::initializeState_Chase() {
+ setAnim("fly", 1.5, cM::rndFX(0.2) + 1.f, 0);
+
+ if (mCurrentAnmTexPat == EKS_TEXPAT_BLINK2) {
+ setBlink(EKS_TEXPAT_BLINK3);
+ } else {
+ setBlink(EKS_TEXPAT_BLINK1);
+ }
+
+ mBlinkTimer = cM::rndInt(75) + 15;
+ field_0xD56 = 0;
+ field_0xD58 = cM::rndInt(20) + 20;
+
+ field_0xD90 = 3;
+ field_0xDB7 = 0;
+ field_0xDB8 = 0;
+ field_0xDB9 = 0;
+ field_0xDA5 = 1;
+
+ field_0xBC8.set(cM::rndFX(200), cM::rndF(100) + 100.f, cM::rndF(100) + 200.f);
+ fn_155_3BE0(field_0xBC8);
+
+ setPitchYawToPoint(targetPlayerOrScrapper(0)->mPosition + field_0xBEC);
+ mAngle.y = mRotation.y;
+ mSpeed = 0.f;
+ field_0xCE0 = 0.f;
+ mSqueakSoundTimer = cM::rndInt(20) + 20;
+ unsetActorProperty(AC_PROP_0x1);
+}
+void dAcEKs_c::executeState_Chase() {
+ fn_155_3720(field_0xCE0, cM::rndFX(0.1) + 1.f);
+ mMdl.play();
+ playBlinkAnm();
+ soundSqueak();
+
+ dAcObjBase_c *pTarget = targetPlayerOrScrapper(0);
+ dAcPy_c *pPlayer = nullptr;
+ if (pTarget->isPlayer()) {
+ pPlayer = static_cast<dAcPy_c *>(pTarget);
+ }
+ mVec3_c targetPos = pTarget->mPosition;
+ s16 targetRot = pTarget->mRotation.y;
+
+ if (pPlayer && !pPlayer->checkFlags0x340(0x100)) {
+ changeState(StateID_Fighting);
+ return;
+ }
+
+ if (field_0xD56 > 0) {
+ field_0xD56--;
+ }
+ if (field_0xD90 > 0) {
+ field_0xD90--;
+ }
+ targetRot = cLib::targetAngleY(targetPos, mPosition) - targetRot;
+ if (field_0xD56 <= 0) {
+ field_0xD56 = cM::rndInt(10) + 10;
+ if (u16(targetRot + 0x3FFF) <= 0x7FFE) {
+ field_0xBC8.set(cM::rndFX(200), cM::rndF(200), -200 - cM::rndF(150));
+ adjustTargetRoof();
+ adjustTargetGnd();
+ } else {
+ field_0xBC8.set(cM::rndFX(200), cM::rndF(200), cM::rndF(150) + 200.f);
+ adjustTargetRoof();
+ adjustTargetGnd();
+ }
+ fn_155_3BE0(field_0xBC8);
+
+ if (mAcch.ChkGndHit() || mAcch.ChkWallHit(0) || mAcch.ChkRoofHit()) {
+ if (field_0xCE0 >= 50.f) {
+ field_0xCE0 = 50.f;
+ }
+ if (++field_0xDB8 < 2) {
+ field_0xDB8 = 0;
+ field_0xD56 = cM::rndInt(10) + 10;
+ mVec3_c v(cM::rndFX(150), cM::rndFX(150), 0);
+ fn_155_3BD0(v);
+ adjustTargetRoof();
+ adjustTargetGnd();
+ }
+ }
+ }
+
+ setPitchYawToPoint(targetPos + field_0xBEC);
+ if (field_0xD9A > 0) {
+ field_0xCE0 = 0;
+ } else {
+ sLib::addCalcScaledDiff(&field_0xCE0, 30, 0.1, 1);
+ }
+
+ cLib::addCalcPos2(&mPosition, mTargetPos, 0.1, field_0xCE0);
+ sLib::addCalcAngle(mAngle.y.ref(), mYaw_0xC36, 10, 0x71C);
+ sLib::addCalcAngle(mRotation.y.ref(), mYaw_0xC36, 10, 0x71C);
+ sLib::addCalcAngle(mRotation.x.ref(), mPitch_0xC34, 12, 0xB6);
+ clampRotationX();
+ f32 r = field_0xC44 + 1600.f;
+ if (checkBeyondRadius(getStartingPos(), r * r)) {
+ setIdleState();
+ } else {
+ if (field_0xD90 <= 0) {
+ if (!fn_155_2B80(true, 1)) {
+ setIdleState();
+ return;
+ }
+ field_0xD90 = 3;
+ }
+ if (targetPos.squareDistanceToXZ(mPosition) < 90000.f) {
+ if (mTargetPos.squareDistanceToXZ(mPosition) < 90000.f) {
+ if (u16(targetRot + 0x3FFF) <= 0x7FFE) {
+ changeState(StateID_Fighting);
+ } else if (pPlayer && (pPlayer->checkCurrentAction(0x70) || pPlayer->checkActionFlags(0x20000))) {
+ changeState(StateID_Fighting);
+ }
+ } else if (--field_0xD58 <= 0) {
+ field_0xD58 = cM::rndInt(20) + 20;
+ changeState(StateID_ChaseAttack);
+ }
+ }
+ }
+}
void dAcEKs_c::finalizeState_Chase() {}
-void dAcEKs_c::initializeState_ChaseAttack() {}
-void dAcEKs_c::executeState_ChaseAttack() {}
-void dAcEKs_c::finalizeState_ChaseAttack() {}
-void dAcEKs_c::initializeState_Fighting() {}
-void dAcEKs_c::executeState_Fighting() {}
+
+void dAcEKs_c::initializeState_ChaseAttack() {
+ setBlink(EKS_TEXPAT_BLINK2);
+ field_0xDA5 = 1;
+ fn_155_3BE0(mVec3_c(0, 100, 200));
+ setPitchYawToPoint(mTargetPos);
+ field_0xD5A = 0;
+ field_0xDAB = 0;
+ startSound(SE_EKs_V_ATTACK);
+ field_0xD9C = cM::rndF(65536);
+ if (mType == EKS_ELECTRIC) {
+ fn_155_3E90();
+ field_0xDA9 = 0;
+ field_0xD60 = 0;
+ }
+}
+void dAcEKs_c::executeState_ChaseAttack() {
+ mMdl.play();
+ if (!mAnmTexPat.isStop(0)) {
+ mAnmTexPat.play();
+ }
+ fn_155_3BE0(mVec3_c(0, 100, 200));
+ adjustTargetGnd();
+ setPitchYawToPoint(mTargetPos);
+ if (field_0xD9A > 0) {
+ field_0xCE0 = 0.f;
+ } else {
+ sLib::addCalcScaledDiff(&field_0xCE0, 30, 0.1, 1);
+ }
+ cLib::addCalcPos2(&mPosition, mTargetPos, 0.1, field_0xCE0);
+ sLib::addCalcAngle(mAngle.y.ref(), mYaw_0xC36, 10, 0x71C);
+ sLib::addCalcAngle(mRotation.y.ref(), mYaw_0xC36, 10, 0x71C);
+ sLib::addCalcAngle(mRotation.x.ref(), mPitch_0xC34, 12, 0xB6);
+ clampRotationX();
+ field_0xD5A++;
+ if (field_0xDAB != 0) {
+ changeState(StateID_Chase);
+ } else if (field_0xD5A > 8) {
+ mSph.OnAtSet();
+ field_0xDAB = 1;
+ }
+}
+void dAcEKs_c::finalizeState_ChaseAttack() {
+ mSph.ClrAtSet();
+ field_0xDAB = 1;
+ if (mType == EKS_ELECTRIC) {
+ fn_155_3EC0();
+ field_0xDA9 = 1;
+ }
+}
+
+void dAcEKs_c::initializeState_Fighting() {
+ setAnim("hovering", 1, cM::rndFX(0.2) + 1.f, 0);
+ if (mCurrentAnmTexPat == EKS_TEXPAT_BLINK2) {
+ setBlink(EKS_TEXPAT_BLINK3);
+ field_0xD7A = 0;
+ } else {
+ setBlink(EKS_TEXPAT_BLINK1);
+ field_0xD7A = 17;
+ }
+ mBlinkTimer = cM::rndInt(75) + 15;
+ mSpeed = 0.f;
+ field_0xC70 = 0.f;
+ field_0xD6A = cM::rndInt(30) + 15;
+ if (field_0xDA6 == 0) {
+ field_0xBC8.set(cM::rndFX(250), cM::rndF(150) + 100.f, cM::rndF(120) + 150.f);
+ }
+ adjustTargetGnd();
+ adjustTargetRoof();
+ fn_155_3BE0(field_0xBC8);
+
+ setPitchYawToPoint(targetPlayerOrScrapper(0)->mPosition + field_0xBEC);
+ fn_155_1430();
+ field_0xDA5 = 1;
+ field_0xD90 = 3;
+ field_0xDC5 = 0;
+ mSqueakSoundTimer = cM::rndInt(20) + 20;
+ unsetActorProperty(AC_PROP_0x1);
+ if (dBgS_WtrChk::CheckPos(&mPosition, true, 100, -2000)) {
+ field_0xD10 = dBgS_WtrChk::GetWaterHeight();
+ field_0xDB3 = 1;
+ }
+}
+void dAcEKs_c::executeState_Fighting() {
+ fn_155_3720(field_0xC70, cM::rndFX(0.1) + 1.f);
+ mMdl.play();
+ if (field_0xD7A < (s16)17) {
+ field_0xD7A++;
+ } else if (field_0xDA6 != 0) {
+ if (mCurrentAnmTexPat == EKS_TEXPAT_BLINK2) {
+ mAnmTexPat.play();
+ } else {
+ playBlinkAnm();
+ }
+ } else {
+ playBlinkAnm();
+ }
+ soundSqueak();
+ fn_155_2270();
+}
void dAcEKs_c::finalizeState_Fighting() {}
-void dAcEKs_c::initializeState_AttackReady() {}
-void dAcEKs_c::executeState_AttackReady() {}
-void dAcEKs_c::finalizeState_AttackReady() {}
-void dAcEKs_c::initializeState_Attack() {}
-void dAcEKs_c::executeState_Attack() {}
-void dAcEKs_c::finalizeState_Attack() {}
-void dAcEKs_c::initializeState_Damage() {}
-void dAcEKs_c::executeState_Damage() {}
-void dAcEKs_c::finalizeState_Damage() {}
-void dAcEKs_c::initializeState_Stun() {}
-void dAcEKs_c::executeState_Stun() {}
-void dAcEKs_c::finalizeState_Stun() {}
-void dAcEKs_c::initializeState_WindBlow() {}
-void dAcEKs_c::executeState_WindBlow() {}
-void dAcEKs_c::finalizeState_WindBlow() {}
-void dAcEKs_c::initializeState_PathMove() {}
-void dAcEKs_c::executeState_PathMove() {}
-void dAcEKs_c::finalizeState_PathMove() {}
+
+void dAcEKs_c::initializeState_AttackReady() {
+ setBlink(EKS_TEXPAT_BLINK2);
+ mVec3_c v(0, 150, 200);
+ v += field_0xBC8;
+ fn_155_3BE0(v);
+
+ dAcObjBase_c *pTarget = AttentionManager::GetInstance()->getTargetedActor();
+ if (pTarget != this) {
+ const f32 y = (targetPlayerOrScrapper(0)->mPosition.y + 100.f);
+ if (field_0xBBC.y > y + 200.f) {
+ field_0xBBC.y = y + 200.f;
+ }
+ }
+ if (dBgS_ObjLinChk::LineCross(&mPosition, &field_0xBBC, nullptr)) {
+ field_0xBBC = dBgS_ObjLinChk::GetInstance().GetLinEnd();
+ }
+ mSpeed = 0.f;
+ field_0xD72 = cM::rndInt(15) + 15;
+ field_0xC90 = 100.f;
+ field_0xDA5 = 1;
+ fn_155_3720(0, 0.7);
+ if (mType == EKS_ELECTRIC) {
+ fn_155_3E90();
+ field_0xDA9 = 0;
+ field_0xD60 = 0;
+ }
+}
+void dAcEKs_c::executeState_AttackReady() {
+ f32 f = 10.f;
+ mMdl.play();
+ if (!mAnmTexPat.isStop(0)) {
+ mAnmTexPat.play();
+ }
+
+ if (dAcPy_c::GetLink()->isRecovering() || !dAcPy_c::GetLink()->checkFlags0x340(0x100) ||
+ (EventManager::isInEvent() && !EventManager::isInEvent0Or7())) {
+ if (mType == EKS_ELECTRIC) {
+ fn_155_3EC0();
+ field_0xDA9 = 1;
+ }
+ changeState(StateID_Fighting);
+ return;
+ }
+ if (fn_155_3EF0()) {
+ if (mType == EKS_ELECTRIC) {
+ fn_155_3EC0();
+ field_0xDA9 = 1;
+ }
+ changeState(StateID_Fighting);
+ return;
+ }
+ setPitchYawToPoint(targetPlayerOrScrapper(0)->mPosition + field_0xBEC);
+ sLib::addCalcAngle(mAngle.y.ref(), mYaw_0xC36, 0xc, 0x1555);
+ sLib::addCalcAngle(mRotation.y.ref(), mYaw_0xC36, 0xc, 0x1555);
+ sLib::addCalcAngle(mRotation.x.ref(), 0, 0xc, 0x1555);
+ if (field_0xD9A <= 0) {
+ sLib::addCalcScaled(&field_0xC90, 0.8, 6.5);
+ cLib::addCalcPos2(&mPosition, field_0xBBC, 0.1, field_0xC90);
+ if (std::abs(field_0xC90) < 0.01f) {
+ fn_155_3720(f, 1.3);
+ if (--field_0xD72 <= 0) {
+ changeState(StateID_Attack);
+ }
+ } else {
+ fn_155_3720(0, 0.7);
+ }
+ }
+}
+void dAcEKs_c::finalizeState_AttackReady() {
+ fn_155_3480();
+}
+
+void dAcEKs_c::initializeState_Attack() {
+ setAnim("fly", 1.5, cM::rndFX(0.2) + 1.f, 0);
+ setPitchYawToPoint(targetPlayerOrScrapper(0)->mPosition + field_0xBEC);
+ fn_155_3BE0(mVec3_c(0, 0, -50));
+
+ /* TODO Probably an inline, but I have no clue what to call it */
+ bool b = dAcPy_c::GetLink()->checkActionFlags(0x40000) != 0 && dAcPy_c::GetLink()->checkFlags0x340(0x100);
+ if (b) {
+ field_0xBBC.set(dAcPy_c::GetLink()->getHeadTranslation());
+ }
+
+ field_0xD74 = 15;
+ field_0xDA5 = 1;
+ mRotation.x = 0;
+ startSound(SE_EKs_V_ATTACK);
+ mSph.OnAtSet();
+ mSph.setCenter(mPosition);
+ if (mType == EKS_ELECTRIC) {
+ fn_155_3E90();
+ field_0xDA9 = 0;
+ field_0xD60 = 0;
+ }
+ field_0xDA2 = 0;
+}
+void dAcEKs_c::executeState_Attack() {
+ f32 scale = 25.f;
+ if (field_0xD9A > 0) {
+ scale = 0.f;
+ }
+ fn_155_3720(scale, cM::rndFX(0.1) + 1.f);
+ mMdl.play();
+ if (!mAnmTexPat.isStop(0)) {
+ mAnmTexPat.play();
+ }
+ if (dAcPy_c::GetLink()->isRecovering() || !dAcPy_c::GetLink()->checkFlags0x340(0x100) ||
+ (EventManager::isInEvent() && !EventManager::isInEvent0Or7())) {
+ changeState(StateID_Fighting);
+ return;
+ }
+ if (fn_155_3EF0()) {
+ changeState(StateID_Fighting);
+ return;
+ }
+
+ sLib::addCalcAngle(mRotation.x.ref(), mPitch_0xC34, 12, 0x38E);
+ if (mSph.ChkAtHit()) {
+ if (mSph.GetAtFlag0x8() != 0) {
+ changeState(StateID_Stun);
+ return;
+ }
+
+ if (mSph.GetAtActor()->isPlayer()) {
+ changeState(StateID_Fighting);
+ return;
+ }
+ }
+
+ if (cLib::chasePos(mPosition, field_0xBBC, scale)) {
+ changeState(StateID_Fighting);
+ return;
+ }
+
+ if (ChkHit() && --field_0xD74 <= 0) {
+ changeState(StateID_Fighting);
+ return;
+ }
+
+ if (++field_0xDA2 > 90) {
+ changeState(StateID_Fighting);
+ return;
+ }
+
+ mSph.OnAtSet();
+ mSph.moveCenter(mPosition);
+}
+void dAcEKs_c::finalizeState_Attack() {
+ mSph.ClrAtSet();
+ if (mType == EKS_ELECTRIC) {
+ fn_155_3EC0();
+ field_0xDA9 = 1;
+ }
+ field_0xD60 = 40;
+}
+
+void dAcEKs_c::initializeState_Damage() {
+ if (mHealth == 0) {
+ setAnim("dead", 4, 1, 0);
+ mAngle.y = field_0xD96;
+ mAngle.x = field_0xD98;
+ } else {
+ setAnim("hura2", 4, 1, 0);
+ }
+
+ if (mType == EKS_FIRE) {
+ field_0xD20 = 0.f;
+ field_0xD24 = 1.f;
+ field_0xD28 = mLightInfluence.mScale / (field_0xD5E * 2.f);
+ } else if (mType == EKS_ELECTRIC) {
+ field_0xD20 = 0.f;
+ field_0xD24 = 1.f;
+ field_0xD28 = mLightInfluence.mScale / (field_0xD5E * 2.f);
+ }
+ field_0xDB5 = 1;
+ field_0x346 = 1; // Part of dAcEnBase_c
+}
+void dAcEKs_c::executeState_Damage() {
+ mMdl.play();
+ if (mHealth == 0) {
+ if (field_0xD9A > 0) {
+ mSpeed = 0;
+ }
+
+ mRotation.x += field_0xD92;
+ mRotation.y += field_0xD94;
+
+ if (field_0xD60 > 0) {
+ field_0xD5E = 0;
+ field_0xDA9 = 1;
+ }
+ if (field_0xD5E > 0) {
+ field_0xD5E--;
+ } else {
+ field_0xDA9 = 1;
+ }
+
+ if (mAcch.ChkGroundLanding() && field_0xDB5 != 0) {
+ dJEffManager_c::spawnGroundEffect(mPosition, mPolyAttr0, mPolyAttr1, field_0x1B4, 1, 1, field_0x1B0);
+ field_0xDB5 = 0;
+ }
+
+ if (mAcch.ChkGndHit() || mAcch.ChkWallHit(nullptr)) {
+ field_0xDA9 = 1;
+ if (dBgS::GetInstance()->GetSpecialCode(mAcch.GetGnd()) == POLY_ATTR_LAVA) {
+ kill(false);
+ } else {
+ kill(true);
+ }
+ } else if (mAcch.ChkWaterIn()) {
+ field_0xDA9 = 1;
+ kill(false);
+ } else if (!sLib::calcTimer(&field_0xDBE)) {
+ field_0xDA9 = 1;
+ kill(false);
+ }
+
+ return;
+ }
+
+ if (std::abs(mSpeed) > 0.01f) {
+ sLib::addCalcScaled(&mSpeed, 1, 5);
+ } else {
+ mSpeed = 0.f;
+ }
+
+ if (std::abs(mVelocity.y) > 0.01f) {
+ sLib::addCalcScaled(&mVelocity.y, 1, 5);
+ } else {
+ mVelocity.y = 0.f;
+ }
+
+ if (field_0xDC6 != 0) {
+ field_0xDC6--;
+ } else {
+ field_0x346 = 0; // Part of dAcEnBase_c
+ changeState(StateID_Fighting);
+ }
+}
+void dAcEKs_c::finalizeState_Damage() {
+ mAngle.x = mRotation.x;
+ mAngle.y = mRotation.y;
+ field_0xDBF = 0;
+}
+void dAcEKs_c::initializeState_Stun() {
+ setAnim("chance", 1, 1, 0);
+ setBlink(EKS_TEXPAT_BLINK1);
+ field_0xD76 = 150;
+ field_0xDA5 = 0;
+ mAngle.y = cLib::targetAngleY(dAcPy_c::GetLink()->mPosition, mPosition);
+ mSpeed = 30.f;
+ mAcceleration = -2.5f;
+ field_0xD5C = 5;
+ mStunSoundTimer = cM::rndInt(20) + 20;
+ mAcch.SetGroundUpY(0);
+ field_0xC10.y = 20.f;
+ field_0xDCC = 0;
+ if (mType == EKS_FIRE) {
+ mSph.ClrCo_0x8000();
+ } else if (mType == EKS_ELECTRIC) {
+ fn_155_3EC0();
+ }
+
+ unsetActorProperty(AC_PROP_0x1);
+
+ if (mType == EKS_FIRE) {
+ field_0xD20 = 0.f;
+ field_0xD24 = 1.f;
+ field_0xD28 = mLightInfluence.mScale / (field_0xD5C * 2.f);
+ } else if (mType == EKS_ELECTRIC) {
+ field_0xD20 = 0.f;
+ field_0xD24 = 1.f;
+ field_0xD28 = mLightInfluence.mScale / (field_0xD5C * 2.f);
+ }
+ field_0xDB5 = 1;
+ startSound(SE_EKs_V_DAMAGE);
+ field_0x346 = 1; // Part of dAcEnBase_c
+}
+void dAcEKs_c::executeState_Stun() {
+ setFinalBlowPosition(mPosition);
+ switch (field_0xDCC) {
+ case 0: {
+ mMdl.play();
+ soundStun();
+ sLib::addCalcAngle(mRotation.x.ref(), 0, 12, 0x1555);
+ if (field_0xD5C > 0) {
+ field_0xD5C--;
+ } else {
+ field_0xDA9 = 1;
+ }
+ if (mAcch.ChkGndHit()) {
+ if (field_0xDB5 != 0) {
+ dJEffManager_c::spawnGroundEffect(
+ mPosition, mPolyAttr0, mPolyAttr1, field_0x1B4, 1, 1, field_0x1B0
+ );
+ field_0xDB5 = 0;
+ }
+ field_0xD5C = 0;
+ field_0xDA9 = 1;
+ if (dBgS::GetInstance()->GetSpecialCode(mAcch.GetGnd()) == POLY_ATTR_LAVA) {
+ dJEffManager_c::spawnGroundEffect(
+ mPosition, mPolyAttr0, mPolyAttr1, field_0x1B4, 1, 1, field_0x1B0
+ );
+ resetInteractionFlags(0x1);
+ startSound(SE_EKs_V_DEATH2);
+ unsetActorProperty(AC_PROP_0x1);
+ kill(false);
+ return;
+ }
+ if (std::abs(mSpeed) > 0.01f) {
+ sLib::addCalcScaled(&mSpeed, 1, 10);
+ } else {
+ mSpeed = 0.f;
+ setInteractionFlags(0x1);
+ }
+
+ mMdl.getModel().getNodeWorldMtx(mCenterNode, mCenterWorldMtx);
+ mCenterWorldMtx.getTranslation(field_0xBA4);
+ field_0xBA4.y += 50.f;
+
+ mEmitter2.holdEffect(
+ PARTICLE_RESOURCE_ID_MAPPING_309_, field_0xBA4, nullptr, &mScale, nullptr, nullptr
+ );
+ mEmitter2.setGlobalAlpha(dStageMgr_c::GetInstance()->getGlobalAlpha());
+ holdSound(SE_E_PIYORI_LV);
+ }
+ if (mAcch.ChkWaterIn()) {
+ resetInteractionFlags(0x1);
+ startSound(SE_EKs_V_DEATH2);
+ unsetActorProperty(AC_PROP_0x1);
+ kill(false);
+ } else {
+ if (!dAcPy_c::GetLink()->checkCurrentAction(/* FINAL_BLOW */ 96)) {
+ field_0xD76--;
+ mSph.OnCoSet();
+ } else {
+ mSph.ClrCoSet();
+ }
+ if (checkInteractionFlags(0x1000)) {
+ mSph.ClrCoSet();
+ field_0xDCC = 1;
+ mHealth = 0;
+ } else {
+ if (field_0xD76 <= 0) {
+ resetInteractionFlags(0x1);
+ mAcch.SetGroundUpY(30);
+ mAngle.y = mRotation.y;
+ if (mType == EKS_ELECTRIC) {
+ field_0xDA9 = 1;
+ } else {
+ field_0xDA9 = 0;
+ }
+ changeState(StateID_Fighting);
+ }
+ }
+ }
+ } break;
+ case 1: {
+ mSph.ClrTgSet();
+ mMdl.play();
+ field_0xDCC = 2;
+ mMdl.setRate(0.5f);
+ startSound(SE_EKs_V_DEATH2);
+ field_0xDCD = 5;
+ field_0xD0C = 1.f;
+ setAnim("Deliver", 4, 1, 0);
+ mHealth = 0;
+ resetInteractionFlags(0x1);
+ } break;
+ case 2: {
+ bool b = false;
+ if (field_0xDCD != 0) {
+ field_0xDCD--;
+ } else {
+ b = fn_80030570(mMdl.getModel(), 1, 1);
+ }
+ mMdl.play();
+ if (mMdl.getAnm().isStop() && b) {
+ kill(true);
+ }
+ } break;
+ }
+}
+void dAcEKs_c::finalizeState_Stun() {
+ field_0xC10.y = 0.f;
+ mAcceleration = 0.f;
+ mSph.OnCoSet();
+ resetInteractionFlags(0x1);
+ if (mType == EKS_FIRE) {
+ mSph.SetCo_0x8000();
+ field_0xD20 = 400.f;
+ field_0xD24 = 1.f;
+ field_0xD28 = 40.f;
+ } else if (mType == EKS_ELECTRIC) {
+ field_0xD60 = 0;
+ field_0xD20 = 400.f;
+ field_0xD24 = 1.f;
+ field_0xD28 = 40.f;
+ }
+ field_0x346 = 0; // Part of dAcEnBase_c
+}
+
+void dAcEKs_c::initializeState_WindBlow() {
+ setAnim("hura2", 1, 1, 0);
+ field_0xD86 = cM::rndInt(30) + 120;
+ field_0xDA9 = 1;
+
+ if (mType == EKS_FIRE) {
+ mSph.ClrCo_0x8000();
+ field_0xD20 = 0.f;
+ mLightInfluence.SetScale(0);
+ } else if (mType == EKS_ELECTRIC) {
+ fn_155_3EC0();
+ field_0xD20 = 0.f;
+ mLightInfluence.SetScale(0);
+ }
+ mAcceleration = -0.5f;
+ mAcch.ClrRoofNone();
+ mAcchCir.SetWall(20, 60);
+ mAcch.SetField_0xD4(55);
+ mAcch.SetGroundUpY(30);
+}
+void dAcEKs_c::executeState_WindBlow() {
+ s32 _weird_zero = 0;
+
+ mMdl.play();
+
+ if (field_0xD9A > 0) {
+ mSpeed = 0.f;
+ }
+
+ if (mAcch.ChkGroundLanding() && dBgS::GetInstance()->GetSpecialCode(mAcch.GetGnd()) == POLY_ATTR_LAVA) {
+ dJEffManager_c::spawnGroundEffect(mPosition, mPolyAttr0, mPolyAttr1, field_0x1B4, 1, 1, field_0x1B0);
+ startSound(SE_EKs_V_DEATH2);
+ unsetActorProperty(AC_PROP_0x1);
+ kill(false);
+ return;
+ }
+
+ if (mAcch.ChkWaterIn()) {
+ startSound(SE_EKs_V_DEATH2);
+ unsetActorProperty(AC_PROP_0x1);
+ kill(false);
+ return;
+ }
+
+ if (nw4r::math::FAbs(mSpeed) < 1.0f) {
+ if (mSph.ChkTgHit() && mSph.ChkTgAtHitType(AT_TYPE_BELLOWS) && mSph.GetTgDamageFlags() == 0x8) {
+ mAngle.y = cLib::targetAngleY(dAcPy_c::GetLink()->mPosition, mPosition);
+ mAngle.x = cLib::targetAngleX(dAcPy_c::GetLink()->mPosition, mPosition);
+ s32 t = 7281;
+ field_0xD66 = (cM::rndFX(0.25f + (0.01f * _weird_zero)) + (0.75f + (0.01f * _weird_zero))) * t;
+ field_0xD68 = (cM::rndFX(0.25f + (0.01f * _weird_zero)) + (0.65f + (0.01f * _weird_zero))) * t;
+
+ if (field_0xD66 < 0) {
+ field_0xD64 = -0x38E;
+ } else {
+ field_0xD64 = 0x38E;
+ }
+
+ if (mAngle.x > 0xAAB) {
+ mVelocity.y = 15.f;
+ } else if (mAngle.x < -0xAAB) {
+ mVelocity.y = -15.f;
+ }
+
+ if (field_0xD9A > 0) {
+ mSpeed = 0.f;
+ } else {
+ mSpeed = 35.f;
+ }
+ }
+ }
+
+ if (std::abs(mSpeed) > 0.01f) {
+ sLib::addCalcScaled(&mSpeed, 0.3, 1.5);
+ mRotation.x += field_0xD66;
+ mRotation.y += field_0xD68;
+ } else {
+ mSpeed = 0.f;
+ if (mRotation.x.abs() < 0x444) {
+ mRotation.x = 0;
+ } else {
+ mRotation.x += field_0xD64;
+ }
+ }
+
+ sLib::addCalcAngle(&field_0xD66, 0, 16, 0x16C);
+ sLib::addCalcAngle(&field_0xD68, 0, 16, 0x16C);
+
+ if (std::abs(mVelocity.y) > 0.01f + (_weird_zero * 0.1f)) {
+ sLib::addCalcScaled(&mVelocity.y, 0.3, 1.5);
+ } else {
+ mVelocity.y = -(_weird_zero * 0.1f);
+ }
+
+ if (field_0xD86 > 0) {
+ field_0xD86--;
+ } else if (field_0xDA6) {
+ if (transitionToNextState()) {
+ return;
+ }
+ } else {
+ changeState(StateID_Fighting);
+ }
+}
+void dAcEKs_c::finalizeState_WindBlow() {
+ mSpeed = 0.f;
+ mAcceleration = 0.f;
+ mVelocity.y = 0.f;
+ mRotation.x = 0;
+ mAngle.set(mRotation);
+ field_0xDA9 = 0;
+ if (mType == EKS_FIRE) {
+ mSph.SetCo_0x8000();
+ field_0xD20 = 400.f;
+ field_0xD24 = 1.f;
+ field_0xD28 = 40.f;
+ } else if (mType == EKS_ELECTRIC) {
+ field_0xDA9 = 1;
+ field_0xD20 = 400.f;
+ field_0xD24 = 1.f;
+ field_0xD28 = 40.f;
+ }
+}
+
+void dAcEKs_c::initializeState_PathMove() {
+ field_0xD30 = 1;
+ setAnim("fly", 1.5, cM::rndFX(0.2) + 1.f, 0);
+
+ if (mCurrentAnmTexPat == EKS_TEXPAT_BLINK2) {
+ setBlink(EKS_TEXPAT_BLINK3);
+ } else {
+ setBlink(EKS_TEXPAT_BLINK1);
+ }
+ mBlinkTimer = cM::rndInt(75) + 15;
+ mSpeed = 15.f;
+ if (field_0xDA6 != 0) {
+ field_0xDC9 = 3;
+ } else {
+ if (mRail.getSpeed() >= 0.f) {
+ mRail.setSpeed(15.f);
+ } else {
+ mRail.setSpeed(-15.f);
+ }
+ mTargetPos.set(mRail.getPosition());
+ field_0xDC9 = 0;
+ }
+ setPitchYawToPoint(mTargetPos);
+ field_0xD54 = cM::rndInt(30) + 30;
+ field_0xD90 = 3;
+ field_0xDA5 = 0;
+ field_0xDB1 = 0;
+
+ if (field_0xDA6 != 0) {
+ fn_155_3E30();
+ } else {
+ setActorProperty(AC_PROP_0x1);
+ }
+
+ mSqueakSoundTimer = cM::rndInt(20) + 20;
+ field_0xDB7 = 0;
+ field_0xDC1 = 0;
+ field_0xD52 = cM::rndInt(20) + 20;
+}
+void dAcEKs_c::executeState_PathMove() {
+ mMdl.play();
+ playBlinkAnm();
+ soundSqueak();
+
+ if (field_0xD54 > 0) {
+ field_0xD54--;
+ }
+ if (field_0xD90 > 0) {
+ field_0xD90--;
+ }
+
+ if (field_0xDA6 != 0) {
+ if (transitionToNextState()) {
+ if (mNextState == EKS_STATE_ReturnToWait) {
+ f32 y = getLineCrossYRange(mStartingPos, 300);
+ mStartingPos.set(mStartingPos.x + cM::rndFX(100), y, mStartingPos.z + cM::rndFX(100));
+ }
+ return;
+ }
+ } else {
+ if (field_0xDC9 == 3) {
+ field_0xDC9 = 0;
+ setActorProperty(AC_PROP_0x1);
+ mRail.setSegment(mRail.getClosestXZPoint(mPosition), 0.f);
+ setStartingPosition(mRail.getPosition());
+ mPnts[0].set(mRail.getPosition());
+ mRail.setSpeed(15);
+ }
+
+ if (!checkBeyondRadius(getStartingPos(), 490000.f)) {
+ field_0xDC9 = 0;
+ setStartingPosition(mRail.getPosition());
+ mPnts[0].set(mRail.getPosition());
+
+ if (field_0xD54 <= 0 && field_0xD90 <= 0) {
+ if (fn_155_2B80(true, 0)) {
+ changeState(StateID_Chase);
+ return;
+ }
+ field_0xD90 = 3;
+ }
+ u8 railStatus = mRail.execute();
+ if (railStatus != 0 && (railStatus != 3 || mRail.getSpeed() > 0.f)) {
+ s32 idx;
+ if (mRail.getSpeed() > 0.f) {
+ idx = mRail.getSegmentIndex();
+ } else if (mRail.getSpeed() < 0.f) {
+ idx = mRail.getNextPointIndex2();
+ }
+ field_0xDCA = mRail.getPath().getPointParam(idx, 0);
+ if (checkPathPntParam(field_0xDCA)) {
+ setStartingPosition(*mRail.getPoint(idx));
+ mStartingPos.y = getLineCrossYRange(getStartingPosition(), 300);
+ changeState(StateID_ReturnToWait);
+ return;
+ }
+ }
+ } else if (field_0xDC9 == 0) {
+ field_0xDC9 = 1;
+ }
+ if (field_0xDC9 == 1) {
+ field_0xDC9 = 2;
+ const s32 pntIdx = mRail.getClosestXZPoint(mPosition);
+
+ mVec3_c pnt = *mRail.getPoint(pntIdx);
+
+ if (mRail.getPosition().squareDistanceToXZ(mPosition) > pnt.squareDistanceToXZ(mPosition)) {
+ mRail.setSegment(pntIdx, 0.f);
+ setStartingPosition(mRail.getPosition());
+ mPnts[0].set(mRail.getPosition());
+ }
+ }
+ if (field_0xDC9 == 2) {
+ if (field_0xD52 > 0) {
+ field_0xD52--;
+ }
+ field_0xB8C.set(mPnts[field_0xD9E]);
+ f32 dist = mPosition.squareDistance(field_0xB8C);
+ if (checkWallCross()) {
+ field_0xDB7++;
+
+ if (field_0xDB7 < 5) {
+ field_0xDC1 = 0;
+ mTargetPos.x = field_0xB8C.x + cM::rndFX(800);
+ mTargetPos.y = field_0xB8C.y + cM::rndF(400);
+ mTargetPos.z = field_0xB8C.z + cM::rndFX(800);
+ adjustTargetGnd();
+ adjustTargetRoof();
+ } else if (field_0xDB7 < 10) {
+ field_0xDC1 = 1;
+
+ fn_155_3BD0(mVec3_c(cM::rndFX(200), cM::rndFX(200), cM::rndF(-300)));
+ field_0xD52 = cM::rndInt(20) + 20;
+
+ adjustTargetGnd();
+ adjustTargetRoof();
+ } else if (field_0xDB7 > 20) {
+ field_0xDB7 = 0;
+ }
+ }
+ if (field_0xD52 <= 0) {
+ if (field_0xD9E > 0) {
+ mVec3_c startPos = mPosition;
+ for (s32 i = 0; i <= field_0xD9E; ++i) {
+ if (!dBgS_ObjLinChk::LineCross(&startPos, &mPnts[i], nullptr)) {
+ field_0xD9E = i;
+ field_0xB8C.set(mPnts[field_0xD9E]);
+ }
+ }
+ }
+ field_0xDC1 = 0;
+ field_0xD52 = cM::rndInt(20) + 20;
+ mTargetPos.x = field_0xB8C.x + cM::rndFX(800);
+ mTargetPos.y = field_0xB8C.y + cM::rndFX(400);
+ mTargetPos.z = field_0xB8C.z + cM::rndFX(800);
+ adjustTargetGnd();
+ adjustTargetRoof();
+ }
+
+ chaseTargetY(0.1, 3);
+ sLib::addCalcAngle(mRotation.y.ref(), mYaw_0xC36, 10, 0x38E);
+ sLib::addCalcAngle(mRotation.x.ref(), mPitch_0xC34, 12, 0xB6);
+ clampRotationX();
+ if (field_0xD9E != 0 && dist < 2500.f) {
+ field_0xD9E--;
+ }
+
+ if (field_0xD9E == 0 && !checkBeyondRadius(getStartingPos(), 490000)) {
+ field_0xDC9 = 0;
+ }
+ } else {
+ mTargetPos.set(mRail.getPosition());
+ }
+ }
+ setPitchYawToPoint(mTargetPos);
+ chaseTargetY(0.5, 4);
+ sLib::addCalcAngle(mRotation.y.ref(), mYaw_0xC36, 10, 0x38E);
+ sLib::addCalcAngle(mRotation.x.ref(), mPitch_0xC34, 12, 0xB6);
+ clampRotationX();
+}
+void dAcEKs_c::finalizeState_PathMove() {
+ field_0xD30 = 0;
+}
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 5b363fa1..90ad9b28 100644
--- a/src/REL/d/a/e/d_a_e_remly.cpp
+++ b/src/REL/d/a/e/d_a_e_remly.cpp
@@ -1999,8 +1999,7 @@ bool dAcEremly_c::calcHeadRotation(bool lookAtTarget, const mAng &range) {
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());
+ dAcObjBase_c *pActor = pPlayer->getBeetleInFlight();
if (pActor) {
field_0xA50.set(pActor->mPosition);
field_0xB56 = 30;
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 fec93ee2..11c7d558 100644
--- a/src/REL/d/a/e/d_a_e_sm.cpp
+++ b/src/REL/d/a/e/d_a_e_sm.cpp
@@ -285,7 +285,7 @@ int dAcEsm_c::actorPostCreate() {
} else {
mTimeArea.setField0x00(0.f);
field_0xB8C = 0.f;
- fn_800306d0();
+ fn_800306D0();
}
} break;
case 2: {
@@ -293,7 +293,7 @@ int dAcEsm_c::actorPostCreate() {
if (dTimeAreaMgr_c::GetInstance()->fn_800B9B60(getRoomId(), getPosition())) {
field_0xB8C = 0.f;
mTimeArea.setField0x00(0.f);
- fn_800306d0();
+ fn_800306D0();
} else {
field_0xB8C = 1.f;
mTimeArea.setField0x00(1.f);
@@ -309,7 +309,7 @@ int dAcEsm_c::actorPostCreate() {
if (field_0xBBF == 1 || field_0xBBF == 3) {
unsetActorProperty(AC_PROP_0x1);
- fn_800306d0();
+ fn_800306D0();
setBattleBgmRelated(0);
}
@@ -370,7 +370,7 @@ int dAcEsm_c::actorExecute() {
if (timeCheck != 0) {
if (field_0xBBF == 3) {
if (checkInteractionFlags(INTERACT_0x4)) {
- fn_800306d0();
+ fn_800306D0();
}
return SUCCEEDED;
}
@@ -392,7 +392,7 @@ int dAcEsm_c::actorExecute() {
if (timeCheck > 0) {
startSound(SE_TIMESLIP_TIMESLIP);
- fn_800306d0();
+ fn_800306D0();
} else {
startSound(SE_TIMESLIP_TIMESLIP_REV);
fn_80030700();
@@ -401,7 +401,7 @@ int dAcEsm_c::actorExecute() {
if (field_0xBBF == 3 && mTimeArea.isNearZero()) {
if (checkInteractionFlags(INTERACT_0x4)) {
- fn_800306d0();
+ fn_800306D0();
}
return SUCCEEDED;
}
diff --git a/src/REL/d/a/obj/d_a_obj_dungeon_ship.cpp b/src/REL/d/a/obj/d_a_obj_dungeon_ship.cpp
index fdece84a..b82aef58 100644
--- a/src/REL/d/a/obj/d_a_obj_dungeon_ship.cpp
+++ b/src/REL/d/a/obj/d_a_obj_dungeon_ship.cpp
@@ -285,10 +285,10 @@ void dAcODungeonShip_c::executeState_Transparency() {
if (isWithinDist1 && field_0x868 == 0 && field_0x862 == 0 && tmp2) {
if (field_0x856 > 0) {
field_0x856 = 0xFF;
- mPath.SetFlag(0x40000000);
+ mPath.setFlag(0x40000000);
} else {
field_0x856 = 1;
- mPath.ClearFlag(0x40000000);
+ mPath.unsetFlag(0x40000000);
}
u16 idx = fn_485_1900();
@@ -302,7 +302,7 @@ void dAcODungeonShip_c::executeState_Transparency() {
field_0x858 = 50.0f;
}
- if (mPath.CheckFlag(0x40000000) && field_0x858 > 0.0f) {
+ if (mPath.checkFlag(0x40000000) && field_0x858 > 0.0f) {
field_0x858 *= -1;
}
}
@@ -433,26 +433,22 @@ void dAcODungeonShip_c::fn_485_1660() {
}
}
-static u32 rot_7fff = 0x7FFF;
-static u32 rot_4000 = 0x4000;
-
void dAcODungeonShip_c::fn_485_1720() {
mPath.setSpeed(mSpeed);
mPath.execute();
- // TODO
mPosition = mPath.getPosition();
mVec3_c tmp;
mPath.getDirection(tmp);
mRotation.y = cM::atan2s(tmp.x, tmp.z);
- if (mPath.CheckFlag(0x40000000)) {
- mRotation.y += rot_7fff;
+ if (mPath.checkFlag(0x40000000)) {
+ mRotation.y += 0x7FFF;
}
- mRotation.y += rot_4000;
+ mRotation.y += 0x4000;
mAngle.y = mRotation.y;
int factor = 0x12C;
- f32 tmp2 = nw4r::math::SinIdx((field_0x850 * 800));
+ f32 tmp2 = nw4r::math::SinIdx(field_0x850 * 800);
tmp2 *= factor;
field_0x84C = tmp2;
}
@@ -460,7 +456,7 @@ void dAcODungeonShip_c::fn_485_1720() {
bool dAcODungeonShip_c::fn_485_1830(s32 pathSegmentIndex, s32 direction, s32 *out) {}
u16 dAcODungeonShip_c::fn_485_1900() {
- s32 sign = mPath.CheckFlag(0x40000000) ? -1 : 1;
+ s32 sign = mPath.checkFlag(0x40000000) ? -1 : 1;
s32 result;
if (fn_485_1830(mPath.getSegmentIndex(), sign, &result)) {
return result;
diff --git a/src/REL/d/t/d_t_beetle.cpp b/src/REL/d/t/d_t_beetle.cpp
index dbd5432e..cc0c305c 100644
--- a/src/REL/d/t/d_t_beetle.cpp
+++ b/src/REL/d/t/d_t_beetle.cpp
@@ -56,7 +56,7 @@ int dTgBeetle_c::actorExecute() {
if (!SceneflagManager::sInstance->checkBoolFlag(mRoomID, mBeetleFlag) || mActorSubtype) {
dAcBoomerang_c *beetlePtr =
(dAcBoomerang_c *)dAcPy_c::GetLink()
- ->vt_0x1C0(); // boomerang pointer cast required because function currently returns void*
+ ->getBeetleInFlight(); // boomerang pointer cast required because function currently returns void*
if (mZoneShape == RectangularPrismShape) { // rectangular prism
if (beetlePtr && checkAreaBox(mMatrix1, beetlePtr->mPosition)) {
diff --git a/src/d/a/d_a_item.cpp b/src/d/a/d_a_item.cpp
index 1452dd69..3de0f79f 100644
--- a/src/d/a/d_a_item.cpp
+++ b/src/d/a/d_a_item.cpp
@@ -445,15 +445,13 @@ extern const UnkFloat f2(1.0f);
SPECIAL_ACTOR_PROFILE(ITEM, dAcItem_c, fProfile::ITEM, 0x2B, 0, 2);
const dAcItem_c::sStaticPtmf dAcItem_c::sStaticPtmfs1[] = {
- &dAcItem_c::fn_80248020, nullptr,
- &dAcItem_c::fn_80248010, nullptr,
- &dAcItem_c::fn_80255B30, &dAcItem_c::fn_80255BA0,
+ &dAcItem_c::fn_80248020, nullptr, &dAcItem_c::fn_80248010, nullptr, &dAcItem_c::fn_80255B30,
+ &dAcItem_c::fn_80255BA0,
};
const dAcItem_c::sStaticPtmf dAcItem_c::sStaticPtmfs2[] = {
- &dAcItem_c::fn_80248040, nullptr,
- &dAcItem_c::fn_80248030, nullptr,
- &dAcItem_c::fn_80255BD0, &dAcItem_c::fn_80255C40,
+ &dAcItem_c::fn_80248040, nullptr, &dAcItem_c::fn_80248030, nullptr, &dAcItem_c::fn_80255BD0,
+ &dAcItem_c::fn_80255C40,
};
fLiMgBa_c dAcItem_c::sItemList;
@@ -1429,7 +1427,7 @@ void dAcItem_c::executeState_Wait() {
if (fn_802574A0() && !tgBit1) {
// TODO weird double load of link
link = dAcPy_c::GetLinkM();
- if (!link->vt_0x1C0()) {
+ if (!link->getBeetleInFlight()) {
addToGetQueue();
if ((link->ifHasHealthAndSomethingElse() && this == sItemListHead.get() &&
@@ -1752,7 +1750,7 @@ void dAcItem_c::executeState_Carry() {
if (fn_802574A0()) {
// TODO weird double load
dAcPy_c *link = dAcPy_c::GetLinkM();
- if (!link->vt_0x1C0()) {
+ if (!link->getBeetleInFlight()) {
addToGetQueue();
if (link->ifHasHealthAndSomethingElse() && this == sItemListHead.get() &&
FileManager::sInstance->getCurrentHealth() != 0) {
@@ -1816,7 +1814,7 @@ void dAcItem_c::executeState_GetBeetle() {
if (link == nullptr) {
return;
}
- dAcBoomerang_c *beetlePtr = (dAcBoomerang_c *)link->vt_0x1C0();
+ dAcBoomerang_c *beetlePtr = (dAcBoomerang_c *)link->getBeetleInFlight();
if (beetlePtr == nullptr) {
if (link->ifHasHealthAndSomethingElse() && this == sItemListHead.get() &&
FileManager::sInstance->getCurrentHealth() != 0) {
diff --git a/src/d/col/c/c_cc_d.cpp b/src/d/col/c/c_cc_d.cpp
index e54f258e..ebf84503 100644
--- a/src/d/col/c/c_cc_d.cpp
+++ b/src/d/col/c/c_cc_d.cpp
@@ -486,7 +486,7 @@ bool cCcD_Obj::ChkTgBit25() const {
return mTg.MskAtHitSPrm(0x2000000);
}
-u16 cCcD_Obj::GetTgSoundID() const {
+s32 cCcD_Obj::GetTgSoundID() const {
return mTg.mAtHitSrc.field_0x10;
}
diff --git a/src/d/d_pad.cpp b/src/d/d_pad.cpp
index d20ec8f5..c49a6f0d 100644
--- a/src/d/d_pad.cpp
+++ b/src/d/d_pad.cpp
@@ -225,7 +225,7 @@ void beginPad_BR() {
if ((dCsGame_c::GetInstance() != nullptr && dCsGame_c::GetInstance()->shouldDraw() && !ex.field_0x22D0) ||
(dAcPy_c::GetLink() != nullptr &&
dAcPy_c::GetLink()->checkActionFlagsCont(0x400 | 0x100 | 0x80 | 0x40 | 0x10 | 0x4 | 0x2 | 0x1) &&
- !dAcPy_c::GetLink()->vt_0x1C0() && !dLytMeter_c::GetMain()->getField_0x1377F()) ||
+ !dAcPy_c::GetLink()->getBeetleInFlight() && !dLytMeter_c::GetMain()->getField_0x1377F()) ||
ex.field_0x22CF) {
if (dLytControlGame_c::getInstance() && dLytControlGame_c::getInstance()->isStateNormal()) {
if (!(dPadManager_c::GetInstance() && dPadManager_c::GetInstance()->getField_0x25())) {
diff --git a/src/d/lyt/meter/d_lyt_meter.cpp b/src/d/lyt/meter/d_lyt_meter.cpp
index 4de66635..25798d54 100644
--- a/src/d/lyt/meter/d_lyt_meter.cpp
+++ b/src/d/lyt/meter/d_lyt_meter.cpp
@@ -1179,8 +1179,9 @@ void dLytMeterMain_c::checkPaneVisibility() {
|| (MinigameManager::isInMinigameState(MinigameManager::TRIAL_TIME_ATTACK) &&
LytDoButtonRelated::get(LytDoButtonRelated::DO_BUTTON_B) == LytDoButtonRelated::ACT_IE_NONE) ||
- (dLytMeter_c::getField_0x13B66() || (shouldBeHiddenGeneral() && !mItemSelect.fn_800F02F0() && !isDoingSkyKeepPuzzle()) ||
- isInModeMap() || isInModePause())) {
+ (dLytMeter_c::getField_0x13B66() ||
+ (shouldBeHiddenGeneral() && !mItemSelect.fn_800F02F0() && !isDoingSkyKeepPuzzle()) || isInModeMap() ||
+ isInModePause())) {
mPanesVisible[METER_ANIM_ITEM_SELECT] = false;
}
@@ -1278,7 +1279,8 @@ void dLytMeterMain_c::checkPaneVisibility() {
MinigameManager::isInMinigameState(MinigameManager::TRIAL_TIME_ATTACK) ||
MinigameManager::isInMinigameState(MinigameManager::PUMPKIN_ARCHERY) ||
MinigameManager::isInMinigameState(MinigameManager::SPIRAL_CHARGE_TUTORIAL) ||
- MinigameManager::isInMinigameState(MinigameManager::ROLLERCOASTER) || shouldBeHiddenGeneral() || mIsInSwordDrawEvent)
+ MinigameManager::isInMinigameState(MinigameManager::ROLLERCOASTER) || shouldBeHiddenGeneral() ||
+ mIsInSwordDrawEvent)
|| (dLytMeter_c::getField_0x13B66() || fn_800D5420() ||
(dLytSimpleWindow_c::getInstance() != nullptr && dLytSimpleWindow_c::getInstance()->isOutputText()) ||
@@ -1352,7 +1354,7 @@ void dLytMeterMain_c::checkPaneVisibility() {
}
}
- if ((dAcPy_c::GetLink()->hasvt_0x1C0() || dAcPy_c::GetLink()->checkActionFlagsCont(0x10) ||
+ if ((dAcPy_c::GetLink()->isBeetleInFlight() || dAcPy_c::GetLink()->checkActionFlagsCont(0x10) ||
(shouldBeHiddenGeneral() && !mHelpOpen) || mGanbariGauge.fn_80104760() ||
MinigameManager::isInMinigameState(MinigameManager::FUN_FUN_ISLAND) ||
@@ -1490,7 +1492,8 @@ void dLytMeterMain_c::checkPaneVisibility() {
if (!field_0x137B2 || dLytAreaCaption_c::getVisible() || fn_800D5380(false) ||
MinigameManager::isInAnyMinigame() || mIsInSwordDrawEvent
- || shouldBeHiddenGeneral() || dLytMeter_c::getField_0x13B66() || fn_800D5420() || isInModeMap() || isInModePause()) {
+ || shouldBeHiddenGeneral() || dLytMeter_c::getField_0x13B66() || fn_800D5420() || isInModeMap() ||
+ isInModePause()) {
mDrinkVisible = false;
}
diff --git a/src/d/lyt/meter/d_lyt_meter_ganbari_gauge.cpp b/src/d/lyt/meter/d_lyt_meter_ganbari_gauge.cpp
index da100999..6a7d7618 100644
--- a/src/d/lyt/meter/d_lyt_meter_ganbari_gauge.cpp
+++ b/src/d/lyt/meter/d_lyt_meter_ganbari_gauge.cpp
@@ -600,7 +600,7 @@ bool dLytMeterGanbariGauge_c::execute() {
mAnm[GANBARI_ANIM_DRINK].setFrame(drinkFrame);
mAnm[GANBARI_ANIM_DRINK].setAnimEnable(true);
- if (!EventManager::isInEvent() && !dAcPy_c::GetLink()->hasvt_0x1C0() &&
+ if (!EventManager::isInEvent() && !dAcPy_c::GetLink()->isBeetleInFlight() &&
!dAcPy_c::GetLink()->checkActionFlagsCont(0x10) &&
(d3d::isOnScreen(dAcPy_c::GetLink()->mPositionCopy3) || fn_80104710(false) || isCrawling()) &&
*mStateMgrWheel.getStateID() != StateID_Full && *mStateMgrMain.getStateID() == StateID_InvisibleWait &&
@@ -609,7 +609,7 @@ bool dLytMeterGanbariGauge_c::execute() {
} else if (!EventManager::isInEvent() && *mStateMgrWheel.getStateID() == StateID_Full &&
*mStateMgrWheel.getOldStateID() != StateID_Full && *mStateMgrMain.getStateID() == StateID_Wait) {
mStateMgrMain.changeState(StateID_OutWait);
- } else if ((EventManager::isInEvent() || dAcPy_c::GetLink()->hasvt_0x1C0() ||
+ } else if ((EventManager::isInEvent() || dAcPy_c::GetLink()->isBeetleInFlight() ||
dAcPy_c::GetLink()->checkActionFlagsCont(0x10) ||
(!d3d::isOnScreen(dAcPy_c::GetLink()->mPositionCopy3) && !fn_80104710(false) && !isCrawling())) &&
*mStateMgrMain.getStateID() == StateID_Wait) {
diff --git a/src/d/snd/d_snd_sound_equipment_callbacks.cpp b/src/d/snd/d_snd_sound_equipment_callbacks.cpp
index d5260734..75d9e10f 100644
--- a/src/d/snd/d_snd_sound_equipment_callbacks.cpp
+++ b/src/d/snd/d_snd_sound_equipment_callbacks.cpp
@@ -27,7 +27,7 @@ void dSndSourceEquipment_c::cbBeFlyLv(dSndSeSound_c *sound, dSoundSource_c *sour
}
void dSndSourceEquipment_c::cbBeThrowRc(dSndSeSound_c *sound, dSoundSource_c *source, nw4r::snd::SoundHandle &handle) {
- if (dAcPy_c::GetLink() != nullptr && !dAcPy_c::GetLink()->hasvt_0x1C0()) {
+ if (dAcPy_c::GetLink() != nullptr && !dAcPy_c::GetLink()->isBeetleInFlight()) {
handle.Stop(10);
return;
}
diff --git a/src/toBeSorted/d_path.cpp b/src/toBeSorted/d_path.cpp
index 43b2b896..d68856b0 100644
--- a/src/toBeSorted/d_path.cpp
+++ b/src/toBeSorted/d_path.cpp
@@ -517,7 +517,7 @@ s32 ActorOnRail_Ext::execute() {
mSegmentDistance = 0.0f;
if (checkFlag(0x1)) {
ret = 3;
- offFlag(0x40000000);
+ unsetFlag(0x40000000);
mSpeed *= -1.0f;
}
break;
@@ -545,7 +545,7 @@ s32 ActorOnRail_Ext::execute() {
mSegmentDistance = segmentLength;
if (checkFlag(0x1)) {
ret = 3;
- onFlag(0x40000000);
+ setFlag(0x40000000);
mSpeed *= -1.0f;
}
break;
@@ -589,13 +589,28 @@ s32 ActorOnRail_Ext::getNextPointIndex() const {
return getNextPointIndex(mSegmentIndex);
}
+s32 ActorOnRail_Ext::getNextPointIndex2() const {
+ if (mSpeed >= 0.0f) {
+ return mSegmentIndex;
+ }
+
+ if (mSegmentIndex + 1 < mPath.getNumPoints()) {
+ return mSegmentIndex + 1;
+ }
+
+ if (mPath.isWrapping()) {
+ return 0;
+ }
+
+ return mPath.getLastPointIdx();
+}
+
s32 ActorOnRail_Ext::getClosestXZPoint(const mVec3_c &pos) const {
f32 max = EGG::Math<f32>::maxNumber();
s32 best = 0;
mVec3_c c;
for (s32 i = 0; i < mPath.getNumPoints(); i++) {
- const Vec *point = mPath.getPoint(i);
- c = *reinterpret_cast<const mVec3_c *>(point) - pos;
+ c = *getPoint(i) - pos;
f32 dist = c.squareMagXZ();
if (max > dist) {
best = i;