d_a_b_lastboss WIP

This commit is contained in:
robojumper
2025-12-28 23:34:04 +01:00
parent cffba79e3f
commit 12c5c2862d
18 changed files with 1464 additions and 102 deletions
+61 -46
View File
@@ -3,36 +3,36 @@ _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_143_F0 = .text:0x000000F0; // type:function size:0x40
__dt__7mVec3_cFv = .text:0x000000F0; // type:function size:0x40
dAcBlastboss_c_classInit__Fv = .text:0x00000130; // type:function size:0x39C
fn_143_4D0 = .text:0x000004D0; // type:function size:0x58
fn_143_530 = .text:0x00000530; // type:function size:0x90
fn_143_5C0 = .text:0x000005C0; // type:function size:0x90
fn_143_650 = .text:0x00000650; // type:function size:0x40
__dt__Q214dAcBlastboss_c10callback_cFv = .text:0x000004D0; // type:function size:0x58
__dt__15dCcD_Linked_CylFv = .text:0x00000530; // type:function size:0x90
__dt__15dCcD_Linked_SphFv = .text:0x000005C0; // type:function size:0x90
__dt__14dScnCallback_cFv = .text:0x00000650; // type:function size:0x40
__dt__27sFState_c<14dAcBlastboss_c>Fv = .text:0x00000690; // type:function size:0x58
__dt__30sFStateFct_c<14dAcBlastboss_c>Fv = .text:0x000006F0; // type:function size:0x6C
__dt__83sStateMgr_c<14dAcBlastboss_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x00000760; // type:function size:0xA0
__dt__53sFStateMgr_c<14dAcBlastboss_c,20sStateMethodUsr_FI_c>Fv = .text:0x00000800; // type:function size:0xA4
fn_143_8B0 = .text:0x000008B0; // type:function size:0x4
fn_143_8C0 = .text:0x000008C0; // type:function size:0x84
fn_143_950 = .text:0x00000950; // type:function size:0x58
fn_143_9B0 = .text:0x000009B0; // type:function size:0x90
fn_143_A40 = .text:0x00000A40; // type:function size:0xCC
fn_143_B10 = .text:0x00000B10; // type:function size:0xC0
fn_143_BD0 = .text:0x00000BD0; // type:function size:0xDC
fn_143_CB0 = .text:0x00000CB0; // type:function size:0xC0
fn_143_D70 = .text:0x00000D70; // type:function size:0xDC
fn_143_E50 = .text:0x00000E50; // type:function size:0x324
fn_143_1180 = .text:0x00001180; // type:function size:0x3F8
fn_143_1580 = .text:0x00001580; // type:function size:0x8
__ct__7mVec3_cFv = .text:0x000008B0; // type:function size:0x4
__dt__26dSwordSwingEffectProcMgr_cFv = .text:0x000008C0; // type:function size:0x84
__ct__15dCcD_Linked_CpsFv = .text:0x00000950; // type:function size:0x58
__dt__15dCcD_Linked_CpsFv = .text:0x000009B0; // type:function size:0x90
__dt__16dEnemySwordMdl_cFv = .text:0x00000A40; // type:function size:0xCC
__ct__17UnkLastBossCcSph2Fv = .text:0x00000B10; // type:function size:0xC0
__dt__17UnkLastBossCcSph2Fv = .text:0x00000BD0; // type:function size:0xDC
__ct__17UnkLastBossCcSph1Fv = .text:0x00000CB0; // type:function size:0xC0
__dt__17UnkLastBossCcSph1Fv = .text:0x00000D70; // type:function size:0xDC
createHeap__14dAcBlastboss_cFv = .text:0x00000E50; // type:function size:0x324
create__14dAcBlastboss_cFv = .text:0x00001180; // type:function size:0x3F8
checkInBossRush__15MinigameManagerFv = .text:0x00001580; // type:function size:0x8
changeState__83sStateMgr_c<14dAcBlastboss_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>FRC12sStateIDIf_c = .text:0x00001590; // type:function size:0x10
fn_143_15A0 = .text:0x000015A0; // type:function size:0x34
fn_143_15E0 = .text:0x000015E0; // type:function size:0x17A8
doDelete__14dAcBlastboss_cFv = .text:0x000015A0; // type:function size:0x34
actorExecute__14dAcBlastboss_cFv = .text:0x000015E0; // type:function size:0x17A8
executeState__83sStateMgr_c<14dAcBlastboss_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x00002D90; // type:function size:0x10
getStateID__83sStateMgr_c<14dAcBlastboss_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x00002DA0; // type:function size:0x10
fn_143_2DB0 = .text:0x00002DB0; // type:function size:0x48
fn_143_2E00 = .text:0x00002E00; // type:function size:0x4C
fn_143_2E50 = .text:0x00002E50; // type:function size:0x85C
timingB__Q214dAcBlastboss_c10callback_cFUlPQ34nw4r3g3d13WorldMtxManipQ34nw4r3g3d6ResMdl = .text:0x00002E50; // type:function size:0x85C
initializeState_Fight__14dAcBlastboss_cFv = .text:0x000036B0; // type:function size:0xBC
executeState_Fight__14dAcBlastboss_cFv = .text:0x00003770; // type:function size:0x718
finalizeState_Fight__14dAcBlastboss_cFv = .text:0x00003E90; // type:function size:0x4
@@ -80,7 +80,7 @@ fn_143_72E0 = .text:0x000072E0; // type:function size:0x1C
fn_143_7300 = .text:0x00007300; // type:function size:0x58
fn_143_7360 = .text:0x00007360; // type:function size:0x50
fn_143_73B0 = .text:0x000073B0; // type:function size:0x10
fn_143_73C0 = .text:0x000073C0; // type:function size:0x60
draw__14dAcBlastboss_cFv = .text:0x000073C0; // type:function size:0x60
fn_143_7420 = .text:0x00007420; // type:function size:0x17C
fn_143_75A0 = .text:0x000075A0; // type:function size:0x218
fn_143_77C0 = .text:0x000077C0; // type:function size:0x338
@@ -92,10 +92,10 @@ fn_143_9420 = .text:0x00009420; // type:function size:0x148
fn_143_9570 = .text:0x00009570; // type:function size:0x9C
fn_143_9610 = .text:0x00009610; // type:function size:0xAF4
fn_143_A110 = .text:0x0000A110; // type:function size:0xBC
fn_143_A1D0 = .text:0x0000A1D0; // type:function size:0x8
fn_143_A1E0 = .text:0x0000A1E0; // type:function size:0x4
fn_143_A1F0 = .text:0x0000A1F0; // type:function size:0x4
fn_143_A200 = .text:0x0000A200; // type:function size:0x8
vt_0x88__11dAcEnBase_cFi = .text:0x0000A1D0; // type:function size:0x8
vt_0x84__11dAcEnBase_cFv = .text:0x0000A1E0; // type:function size:0x4
vt_0x80__11dAcEnBase_cFv = .text:0x0000A1F0; // type:function size:0x4
getObjectListEntry__11dAcEnBase_cFv = .text:0x0000A200; // type:function size:0x8
__dt__14dAcBlastboss_cFv = .text:0x0000A210; // type:function size:0x398
fn_143_A5B0 = .text:0x0000A5B0; // type:function size:0x4
fn_143_A5C0 = .text:0x0000A5C0; // type:function size:0x4
@@ -119,9 +119,9 @@ initializeState__29sFStateID_c<14dAcBlastboss_c>CFR14dAcBlastboss_c = .text:0x00
__sinit_\d_a_b_lastboss_cpp = .text:0x0000A7C0; // type:function size:0xA90 scope:local
__dt__29sFStateID_c<14dAcBlastboss_c>Fv = .text:0x0000B250; // type:function size:0x58
isSameName__29sFStateID_c<14dAcBlastboss_c>CFPCc = .text:0x0000B2B0; // type:function size:0x88
fn_143_B340 = .text:0x0000B340; // type:function size:0x8
fn_143_B350 = .text:0x0000B350; // type:function size:0x8
fn_143_B360 = .text:0x0000B360; // type:function size:0x8
@272@__dt__15dCcD_Linked_CpsFv = .text:0x0000B340; // type:function size:0x8
@272@__dt__15dCcD_Linked_SphFv = .text:0x0000B350; // type:function size:0x8
@272@__dt__15dCcD_Linked_CylFv = .text:0x0000B360; // type:function size:0x8
_ctors = .ctors:0x00000000; // type:label scope:global
_dtors = .dtors:0x00000000; // type:label scope:global
__destroy_global_chain_reference = .dtors:0x00000000; // type:object size:0x4 scope:global
@@ -141,7 +141,14 @@ lbl_143_rodata_1B8 = .rodata:0x000001B8; // type:object size:0x10 align:4 data:f
lbl_143_rodata_1C8 = .rodata:0x000001C8; // type:object size:0xC align:4 data:float
lbl_143_rodata_1D4 = .rodata:0x000001D4; // type:object size:0x3C align:4 data:float
lbl_143_rodata_210 = .rodata:0x00000210; // type:object size:0x90 align:4 data:float
g_profile_B_LASTBOSS = .data:0x00000000; // type:object size:0x1A0 data:4byte
g_profile_B_LASTBOSS = .data:0x00000000; // type:object size:0x10 data:4byte
sSrcCyl1 = .data:0x00000010; // type:object size:0x30
sSrcCyl2 = .data:0x00000040; // type:object size:0x30
sSrcCyl3 = .data:0x00000070; // type:object size:0x30
sSrcSph1 = .data:0x000000A0; // type:object size:0x2C
sSrcSph2 = .data:0x000000CC; // type:object size:0x2C
sSrcSph = .data:0x000000F8; // type:object size:0x2C
lbl_143_data_124 = .data:0x00000124; // type:object size:0x7C
lbl_143_data_1A0 = .data:0x000001A0; // type:object size:0x10 data:string
lbl_143_data_1B0 = .data:0x000001B0; // type:object size:0x28
lbl_143_data_1D8 = .data:0x000001D8; // type:object size:0x70
@@ -173,23 +180,31 @@ lbl_143_data_480 = .data:0x00000480; // type:object size:0xC data:string
lbl_143_data_48C = .data:0x0000048C; // type:object size:0x34
lbl_143_data_4C0 = .data:0x000004C0; // type:object size:0x4 data:4byte
lbl_143_data_4C4 = .data:0x000004C4; // type:object size:0x5C data:4byte
lbl_143_data_520 = .data:0x00000520; // type:object size:0x90
lbl_143_data_5B0 = .data:0x000005B0; // type:object size:0x30
lbl_143_data_5E0 = .data:0x000005E0; // type:object size:0x30
lbl_143_data_610 = .data:0x00000610; // type:object size:0x18
lbl_143_data_628 = .data:0x00000628; // type:object size:0x18
lbl_143_data_640 = .data:0x00000640; // type:object size:0x70
lbl_143_data_6B0 = .data:0x000006B0; // type:object size:0x18
lbl_143_data_6C8 = .data:0x000006C8; // type:object size:0x70
lbl_143_data_738 = .data:0x00000738; // type:object size:0x10
__vt__14dAcBlastboss_c = .data:0x00000520; // type:object size:0x90
__vt__53sFStateMgr_c<14dAcBlastboss_c,20sStateMethodUsr_FI_c> = .data:0x000005B0; // type:object size:0x30
__vt__83sStateMgr_c<14dAcBlastboss_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c> = .data:0x000005E0; // type:object size:0x30
__vt__30sFStateFct_c<14dAcBlastboss_c> = .data:0x00000610; // type:object size:0x18
__vt__27sFState_c<14dAcBlastboss_c> = .data:0x00000628; // type:object size:0x18
__vt__15dCcD_Linked_Cyl = .data:0x00000640; // type:object size:0x70
__vt__Q214dAcBlastboss_c10callback_c = .data:0x000006B0; // type:object size:0x18
__vt__15dCcD_Linked_Sph = .data:0x000006C8; // type:object size:0x70
__vt__16dEnemySwordMdl_c = .data:0x00000738; // type:object size:0x10
lbl_143_data_748 = .data:0x00000748; // type:object size:0x70
lbl_143_data_7B8 = .data:0x000007B8; // type:object size:0x410
lbl_143_data_BC8 = .data:0x00000BC8; // type:object size:0x34
__vt__26dSwordSwingEffectProcMgr_c = .data:0x000007B8; // type:object size:0x410
__vt__29sFStateID_c<14dAcBlastboss_c> = .data:0x00000BC8; // type:object size:0x34
__global_destructor_chain = .bss:0x00000000; // type:object size:0x4 scope:global
lbl_143_bss_8 = .bss:0x00000008; // type:object size:0x10 data:4byte
lbl_143_bss_18 = .bss:0x00000018; // type:object size:0x40 data:4byte
lbl_143_bss_58 = .bss:0x00000058; // type:object size:0x80 data:4byte
lbl_143_bss_D8 = .bss:0x000000D8; // type:object size:0x40 data:4byte
lbl_143_bss_118 = .bss:0x00000118; // type:object size:0x40 data:4byte
lbl_143_bss_158 = .bss:0x00000158; // type:object size:0x40 data:4byte
lbl_143_bss_198 = .bss:0x00000198; // type:object size:0x230 data:4byte
StateID_Fight__14dAcBlastboss_c = .bss:0x00000018; // type:object size:0x40 data:4byte
StateID_Guard__14dAcBlastboss_c = .bss:0x00000058; // type:object size:0x40 data:4byte
StateID_GuardBreak__14dAcBlastboss_c = .bss:0x00000098; // type:object size:0x40 data:4byte
StateID_Attack__14dAcBlastboss_c = .bss:0x000000D8; // type:object size:0x40 data:4byte
StateID_CounterAttack__14dAcBlastboss_c = .bss:0x00000118; // type:object size:0x40 data:4byte
StateID_PunchAttack__14dAcBlastboss_c = .bss:0x00000158; // type:object size:0x40 data:4byte
StateID_DashAttack__14dAcBlastboss_c = .bss:0x00000198; // type:object size:0x40 data:4byte
StateID_SmallAttack__14dAcBlastboss_c = .bss:0x000001D8; // type:object size:0x40 data:4byte
StateID_ThunderAttack__14dAcBlastboss_c = .bss:0x00000218; // type:object size:0x40 data:4byte
StateID_Damage__14dAcBlastboss_c = .bss:0x00000258; // type:object size:0x40 data:4byte
StateID_SitDamage__14dAcBlastboss_c = .bss:0x00000298; // type:object size:0x40 data:4byte
StateID_Down__14dAcBlastboss_c = .bss:0x000002D8; // type:object size:0x40 data:4byte
StateID_Stun__14dAcBlastboss_c = .bss:0x00000318; // type:object size:0x40 data:4byte
StateID_ThunderWait__14dAcBlastboss_c = .bss:0x00000358; // type:object size:0x40 data:4byte
+14 -6
View File
@@ -91,8 +91,13 @@ toBeSorted/d_shadow.cpp:
.sbss start:0x80575028 end:0x80575038
.sdata2 start:0x80576A78 end:0x80576B08
toBeSorted/d_unk_mdl_stuff_1.cpp:
.text start:0x8001BFA0 end:0x8001E444 align:16
toBeSorted/d_sword_swing_effect.cpp:
.text start:0x8001BFA0 end:0x8001CB9C align:16
.data start:0x80500AF0 end:0x80500B48
.sdata2 start:0x80576B08 end:0x80576B28
toBeSorted/d_unk_mdl_stuff_3.cpp:
.text start:0x8001CBA0 end:0x8001E444 align:16
.ctors start:0x804DB654 end:0x804DB658
.sbss start:0x80575038 end:0x80575058
@@ -396,11 +401,14 @@ toBeSorted/actor_info.cpp:
.rodata start:0x804E0FA8 end:0x804E3418
.sdata2 start:0x805779F8 end:0x80579210
toBeSorted/unk_vec_math.cpp:
.text start:0x8006A8D0 end:0x8006B3A4 align:16
toBeSorted/d_sword_swing_effect_mgr.cpp:
.text start:0x8006A8D0 end:0x8006B3C0 align:16
.sdata2 start:0x80579210 end:0x80579230
toBeSorted/unk_mdl_cc.cpp:
.text start:0x8006B3B0 end:0x8006BBD4 align:16
toBeSorted/d_enemy_sword_mdl.cpp:
.text start:0x8006B3C0 end:0x8006BBD4 align:16
.data start:0x8050E060 end:0x8050E090
.sdata2 start:0x80579230 end:0x80579238
toBeSorted/d_camera.cpp:
.text start:0x8006BBE0 end:0x80083370 align:16
+29 -29
View File
@@ -657,20 +657,20 @@ fn_8001BE90 = .text:0x8001BE90; // type:function size:0x60
fn_8001BEF0 = .text:0x8001BEF0; // type:function size:0x58
fn_8001BF50 = .text:0x8001BF50; // type:function size:0x40
fn_8001BF90 = .text:0x8001BF90; // type:function size:0x4
fn_8001BFA0 = .text:0x8001BFA0; // type:function size:0x54
fn_8001C000 = .text:0x8001C000; // type:function size:0x40
fn_8001C040 = .text:0x8001C040; // type:function size:0x30C
fn_8001C350 = .text:0x8001C350; // type:function size:0x14
fn_8001C370 = .text:0x8001C370; // type:function size:0x44
fn_8001C3C0 = .text:0x8001C3C0; // type:function size:0xCC
fn_8001C490 = .text:0x8001C490; // type:function size:0x18
fn_8001C4B0 = .text:0x8001C4B0; // type:function size:0x78
fn_8001C530 = .text:0x8001C530; // type:function size:0x94
fn_8001C5D0 = .text:0x8001C5D0; // type:function size:0x3E4
fn_8001C9C0 = .text:0x8001C9C0; // type:function size:0x60
fn_8001CA20 = .text:0x8001CA20; // type:function size:0x7C
fn_8001CAA0 = .text:0x8001CAA0; // type:function size:0x80
fn_8001CB20 = .text:0x8001CB20; // type:function size:0x7C
remove__27dSwordSwingEffectProcBase_cFv = .text:0x8001BFA0; // type:function size:0x54
__dt__Q227dSwordSwingEffectProcBase_c11swing_entryFv = .text:0x8001C000; // type:function size:0x40
drawXlu__27dSwordSwingEffectProcBase_cFv = .text:0x8001C040; // type:function size:0x30C
hasSwings__27dSwordSwingEffectProcBase_cCFv = .text:0x8001C350; // type:function size:0x14
entry__27dSwordSwingEffectProcBase_cFv = .text:0x8001C370; // type:function size:0x44
create__27dSwordSwingEffectProcBase_cFlP12mAllocator_c = .text:0x8001C3C0; // type:function size:0xCC
__ct__Q227dSwordSwingEffectProcBase_c11swing_entryFv = .text:0x8001C490; // type:function size:0x18
addSwing__27dSwordSwingEffectProcBase_cFRC7mVec3_c6mColorRC7mVec3_c6mColor = .text:0x8001C4B0; // type:function size:0x78
calc__27dSwordSwingEffectProcBase_cFf = .text:0x8001C530; // type:function size:0x94
drawXlu__23dSwordSwingEffectProc_cFv = .text:0x8001C5D0; // type:function size:0x3E4
create__23dSwordSwingEffectProc_cFlP12mAllocator_cPQ23EGG7ResTIMGf = .text:0x8001C9C0; // type:function size:0x60
set__Q227dSwordSwingEffectProcBase_c11swing_entryFRC7mVec3_c6mColorRC7mVec3_c6mColor = .text:0x8001CA20; // type:function size:0x7C
__dt__23dSwordSwingEffectProc_cFv = .text:0x8001CAA0; // type:function size:0x80
__dt__27dSwordSwingEffectProcBase_cFv = .text:0x8001CB20; // type:function size:0x7C
fn_8001CBA0 = .text:0x8001CBA0; // type:function size:0x20C
fn_8001CDB0 = .text:0x8001CDB0; // type:function size:0x308
fn_8001D0C0 = .text:0x8001D0C0; // type:function size:0x35C
@@ -1134,7 +1134,7 @@ fn_8002EA60 = .text:0x8002EA60; // type:function size:0xD0
fn_8002EB30 = .text:0x8002EB30; // type:function size:0x5C
ActorObjectBase__putInODesert = .text:0x8002EB90; // type:function size:0xD8
drawModelType1__12dAcObjBase_cFPQ23m3d6smdl_c = .text:0x8002EC70; // type:function size:0x60
fn_8002ECD0 = .text:0x8002ECD0; // type:function size:0x50
fn_8002ECD0__12dAcObjBase_cFPQ23m3d6smdl_ci = .text:0x8002ECD0; // type:function size:0x50
fn_8002ED20 = .text:0x8002ED20; // type:function size:0x88
fn_8002edb0__12dAcObjBase_cFRQ23m3d15mShadowCircle_cRQ23m3d6smdl_cPC7mQuat_cllf = .text:0x8002EDB0; // type:function size:0x8C
drawShadow__12dAcObjBase_cFRQ23m3d15mShadowCircle_cPvRC6mMtx_cPC7mQuat_clllllf = .text:0x8002EE40; // type:function size:0xFC
@@ -1146,7 +1146,7 @@ createInsectActor__12dAcObjBase_cFP9dAcBase_cQ28fProfile14PROFILE_NAME_eUlP7mVec
createActorUnkGroup3__12dAcObjBase_cFQ28fProfile14PROFILE_NAME_eUlUlP7mVec3_cP7mAng3_cP7mVec3_cUl = .text:0x8002F1C0; // type:function size:0x98
createActorUnkGroup3__12dAcObjBase_cFPCcUlUlPC7mVec3_cPC7mAng3_cPC7mVec3_cUlUsSc = .text:0x8002F260; // type:function size:0xA0
__ct__11dAcEnBase_cFv = .text:0x8002F300; // type:function size:0x74
ActorEnemyBase__dtor = .text:0x8002F380; // type:function size:0x74
__dt__11dAcEnBase_cFv = .text:0x8002F380; // type:function size:0x74
ActorEnemyBase__shouldUpdateMaybe = .text:0x8002F400; // type:function size:0xB4
ActorEnemyBase__postUpdate = .text:0x8002F4C0; // type:function size:0x7C
ActorEnemyBase__preDraw = .text:0x8002F540; // type:function size:0x74
@@ -3046,14 +3046,14 @@ getNameForProfileId__FUl = .text:0x8006A670; // type:function size:0xB8
getActorName__FPC9ActorInfo = .text:0x8006A730; // type:function size:0x18
getActorInfoByProfileAndSubtype__FUlUl = .text:0x8006A750; // type:function size:0x134
getSoundSourceTypeForName__FPCc = .text:0x8006A890; // type:function size:0x38
fn_8006A8D0 = .text:0x8006A8D0; // type:function size:0x1DC
fn_8006AAB0 = .text:0x8006AAB0; // type:function size:0x85C
fn_8006B310 = .text:0x8006B310; // type:function size:0x94
fn_8006B3B0 = .text:0x8006B3B0; // type:function size:0x10
fn_8006B3C0 = .text:0x8006B3C0; // type:function size:0x140
fn_8006B500 = .text:0x8006B500; // type:function size:0x13C
fn_8006B640 = .text:0x8006B640; // type:function size:0x20
fn_8006B660 = .text:0x8006B660; // type:function size:0xB4
fn_8006A8D0__FRC7mVec2_cRC7mVec2_cRC7mVec2_cRC7mVec2_cR7mVec2_c = .text:0x8006A8D0; // type:function size:0x1DC
createSwingEntries__26dSwordSwingEffectProcMgr_cFRC7mVec3_cRC7mVec3_c = .text:0x8006AAB0; // type:function size:0x85C
calc__26dSwordSwingEffectProcMgr_cFRC7mVec3_cRC7mVec3_c = .text:0x8006B310; // type:function size:0x94
entry__26dSwordSwingEffectProcMgr_cFv = .text:0x8006B3B0; // type:function size:0x10
create__16dEnemySwordMdl_cFP12mAllocator_cPvPCcUlRC7mVec3_cRC7mVec3_cR9cCcD_SttsPQ23EGG7ResTIMGiPUl = .text:0x8006B3C0; // type:function size:0x140
create__16dEnemySwordMdl_cFP12mAllocator_cQ34nw4r3g3d7ResFilePCcUlRC7mVec3_cRC7mVec3_cR9cCcD_SttsPQ23EGG7ResTIMGiPUl = .text:0x8006B500; // type:function size:0x13C
fn_8006B640__16dEnemySwordMdl_cFv = .text:0x8006B640; // type:function size:0x20
fn_8006B660__16dEnemySwordMdl_cFiiiiiiiiif = .text:0x8006B660; // type:function size:0xB4
fn_8006B720 = .text:0x8006B720; // type:function size:0x10
fn_8006B730 = .text:0x8006B730; // type:function size:0x5C
fn_8006B790 = .text:0x8006B790; // type:function size:0x10
@@ -3061,8 +3061,8 @@ fn_8006B7A0 = .text:0x8006B7A0; // type:function size:0x5C
fn_8006B800 = .text:0x8006B800; // type:function size:0x10
fn_8006B810 = .text:0x8006B810; // type:function size:0x5C
fn_8006B870 = .text:0x8006B870; // type:function size:0x10
fn_8006B880 = .text:0x8006B880; // type:function size:0x2A8
fn_8006BB30 = .text:0x8006BB30; // type:function size:0xA4
calc__16dEnemySwordMdl_cFRC6mMtx_cRC7mVec3_cb = .text:0x8006B880; // type:function size:0x2A8
entry__16dEnemySwordMdl_cFP12dAcObjBase_cP15dShadowCircle_cP7mQuat_c = .text:0x8006BB30; // type:function size:0xA4
fn_8006BBE0 = .text:0x8006BBE0; // type:function size:0x70
fn_8006BC50 = .text:0x8006BC50; // type:function size:0x18
fn_8006BC70 = .text:0x8006BC70; // type:function size:0xA8
@@ -29953,8 +29953,8 @@ __vt__Q23d3d13AnmMdlWrapper = .data:0x80500A20; // type:object size:0x50
@15227 = .data:0x80500AA8; // type:object size:0x10 scope:local data:string
__vt__14dScnCallback_c = .data:0x80500AB8; // type:object size:0x20
lbl_80500AD8 = .data:0x80500AD8; // type:object size:0x18
lbl_80500AF0 = .data:0x80500AF0; // type:object size:0x2C
lbl_80500B1C = .data:0x80500B1C; // type:object size:0x2C
__vt__23dSwordSwingEffectProc_c = .data:0x80500AF0; // type:object size:0x2C
__vt__27dSwordSwingEffectProcBase_c = .data:0x80500B1C; // type:object size:0x2C
lbl_80500B48 = .data:0x80500B48; // type:object size:0xA data:string
lbl_80500B54 = .data:0x80500B54; // type:object size:0xA data:string
lbl_80500B60 = .data:0x80500B60; // type:object size:0x40
@@ -42661,7 +42661,7 @@ l_lightMgr_pp__Q23m3d8internal = .sbss:0x80575BDC; // type:object size:0x4 data:
l_numFogMgr__Q23m3d8internal = .sbss:0x80575BE0; // type:object size:0x4 data:4byte
l_fogMgr_pp__Q23m3d8internal = .sbss:0x80575BE4; // type:object size:0x4 data:4byte
l_alignment__Q23m3d8internal = .sbss:0x80575BE8; // type:object size:0x4 data:4byte
lbl_80575BF0 = .sbss:0x80575BF0; // type:object size:0x4 data:4byte
sInstance__Q23m3d9mShadow_c = .sbss:0x80575BF0; // type:object size:0x4 data:4byte
lbl_80575BF4 = .sbss:0x80575BF4; // type:object size:0x4 data:4byte
lbl_80575BF8 = .sbss:0x80575BF8; // type:object size:0x4 data:4byte
@GUARD@draw__Q23m3d15mCustomShadow_cFRC6mMtx_c@nullMat = .sbss:0x80575BFC; // type:object size:0x1 data:byte
+4 -3
View File
@@ -427,7 +427,8 @@ config.libs = [
),
Object(NonMatching, "toBeSorted/d_unk_proc.cpp"),
Object(NonMatching, "toBeSorted/d_shadow.cpp"),
Object(NonMatching, "toBeSorted/d_unk_mdl_stuff_1.cpp"),
Object(Matching, "toBeSorted/d_sword_swing_effect.cpp"),
Object(NonMatching, "toBeSorted/d_unk_mdl_stuff_3.cpp"),
Object(NonMatching, "toBeSorted/d_unk_mdl_stuff_2.cpp"),
Object(Matching, "d/d_light_env.cpp"),
Object(NonMatching, "toBeSorted/d_emitter.cpp"),
@@ -481,8 +482,8 @@ config.libs = [
Object(Matching, "toBeSorted/arc_managers/layout_arc_manager.cpp"),
Object(NonMatching, "toBeSorted/arc_managers/layout_arc_control.cpp"),
Object(Matching, "toBeSorted/actor_info.cpp"),
Object(NonMatching, "toBeSorted/unk_vec_math.cpp"),
Object(NonMatching, "toBeSorted/unk_mdl_cc.cpp"),
Object(NonMatching, "toBeSorted/d_sword_swing_effect_mgr.cpp"),
Object(NonMatching, "toBeSorted/d_enemy_sword_mdl.cpp"),
Object(NonMatching, "toBeSorted/d_camera.cpp"),
Object(NonMatching, "toBeSorted/d_event_1.cpp"),
Object(NonMatching, "toBeSorted/unk_map_cam.cpp"),
+169 -3
View File
@@ -2,14 +2,60 @@
#define D_A_B_LASTBOSS_H
#include "d/a/e/d_a_en_base.h"
#include "d/d_cc.h"
#include "d/d_light_env.h"
#include "m/m3d/m_anmmatclr.h"
#include "m/m3d/m_anmtexsrt.h"
#include "m/m3d/m_mdl.h"
#include "m/m3d/m_smdl.h"
#include "s/s_State.hpp"
#include "s/s_StateMgr.hpp"
#include "toBeSorted/d_emitter.h"
#include "toBeSorted/d_enemy_sword_mdl.h"
#include "toBeSorted/stage_render_stuff.h"
class dTgSwordBattleGame_c;
// TODO this might be a template but what about the offset?
struct UnkLastBossCcSph1 {
/* 0x000 */ u8 _0x000[0x008 - 0x000];
/* 0x008 */ mVec3_c field_0x008[5];
/* 0x044 */ mVec3_c field_0x044[5];
/* 0x080 */ mVec3_c field_0x080[5];
/* 0x0BC */ dCcD_Linked_Sph mCc;
};
struct UnkLastBossCcSph2 {
/* 0x000 */ s16 field_0x000;
/* 0x002 */ s16 field_0x002;
/* 0x004 */ u8 _0x004[0x008 - 0x004];
/* 0x008 */ s16 field_0x008;
/* 0x00A */ u8 _0x00A[0x014 - 0x00A];
/* 0x014 */ mVec3_c field_0x014[10];
/* 0x08C */ mVec3_c field_0x08C[10];
/* 0x104 */ mVec3_c field_0x104[10];
/* 0x17C */ dCcD_Linked_Sph mCc;
};
class dAcBlastboss_c : public dAcEnBase_c {
class callback_c : public m3d::callback_c {
public:
virtual void timingB(u32, nw4r::g3d::WorldMtxManip *, nw4r::g3d::ResMdl) override;
/* 0x04 */ s16 field_0x04;
/* 0x06 */ u8 _0x06[0x34 - 0x06];
/* 0x34 */ dAcBlastboss_c *mpOwner;
};
public:
dAcBlastboss_c() : mStateMgr(*this, sStateID::null) {}
dAcBlastboss_c() : mStateMgr(*this, sStateID::null), mScnCallback(this) {}
virtual ~dAcBlastboss_c() {}
virtual bool createHeap() override;
int create() override;
int doDelete() override;
int actorExecute() override;
int draw() override;
STATE_FUNC_DECLARE(dAcBlastboss_c, Fight);
STATE_FUNC_DECLARE(dAcBlastboss_c, Guard);
STATE_FUNC_DECLARE(dAcBlastboss_c, GuardBreak);
@@ -26,7 +72,127 @@ public:
STATE_FUNC_DECLARE(dAcBlastboss_c, ThunderWait);
private:
/* 0x??? */ STATE_MGR_DECLARE(dAcBlastboss_c);
void fn_143_6720();
void fn_143_A110(s32);
void fn_143_7B00();
/* 0x0378 */ d3d::AnmMdlWrapper mMdl;
/* 0x03E8 */ m3d::anmTexSrt_c mAnmTexSrt;
/* 0x0414 */ m3d::anmMatClr_c mAnmMatClr1;
/* 0x0440 */ m3d::smdl_c mThunderMdl;
/* 0x045C */ m3d::anmMatClr_c mThunderAnmMatClr;
/* 0x0488 */ callback_c mMdlCallback;
/* 0x04C0 */ dCcD_Linked_Cyl mCc1;
/* 0x0620 */ dCcD_Linked_Cyl mCc2;
/* 0x0780 */ dCcD_Linked_Cyl mCc3;
/* 0x08E0 */ dCcD_Linked_Sph mCc4;
/* 0x0A40 */ dCcD_Linked_Sph mCc5;
/* 0x0BA0 */ dScnCallback_c mScnCallback;
/* 0x0BAC */ STATE_MGR_DECLARE(dAcBlastboss_c);
/* 0x0BE8 */ dColliderLinkedList mCcList;
/* 0x0BF4 */ dEnemySwordMdl_c mSwordMdl;
/* 0x1130 */ u8 field_0x1130;
/* 0x1131 */ u8 field_0x1131;
/* 0x1132 */ u8 field_0x1132;
/* 0x1133 */ u8 field_0x1133;
/* 0x1134 */ u8 _0x1134[0x113D - 0x1134];
/* 0x113D */ u8 field_0x113D;
/* 0x113E */ u8 field_0x113E;
/* 0x113F */ u8 field_0x113F;
/* 0x1140 */ u8 field_0x1140;
/* 0x1141 */ u8 field_0x1141;
/* 0x1142 */ u8 field_0x1142;
/* 0x1143 */ u8 field_0x1143;
/* 0x1144 */ u8 field_0x1144;
/* 0x1145 */ u8 field_0x1145;
/* 0x1146 */ bool mIsSwordEmpowered;
/* 0x1147 */ u8 _0x1147[0x114B - 0x1147];
/* 0x114B */ u8 field_0x114B;
/* 0x114C */ u8 field_0x114C;
/* 0x114D */ u8 field_0x114D;
/* 0x114E */ u8 field_0x114E;
/* 0x114F */ u8 field_0x114F;
/* 0x1150 */ u8 _0x1150[0x1156 - 0x1150];
/* 0x1156 */ u16 field_0x1156;
/* 0x1158 */ u16 field_0x1158;
/* 0x115A */ u16 field_0x115A;
/* 0x115C */ u16 field_0x115C;
/* 0x115E */ u16 field_0x115E;
/* 0x1160 */ u16 field_0x1160;
/* 0x1162 */ u8 _0x1162[0x1164 - 0x1162];
/* 0x1164 */ s16 field_0x1164;
/* 0x1166 */ u8 _0x1166[0x116A - 0x1166];
/* 0x116A */ s16 field_0x116A;
/* 0x116C */ u8 _0x116C[0x117C - 0x116C];
/* 0x117C */ s16 field_0x117C;
/* 0x1186 */ u8 _0x117E[0x1186 - 0x117E];
/* 0x1186 */ s16 field_0x1186;
/* 0x1188 */ u8 _0x1188[0x1190 - 0x1188];
/* 0x1190 */ f32 field_0x1190;
/* 0x1194 */ u8 _0x1194[0x119C - 0x1194];
/* 0x119C */ f32 field_0x119C;
/* 0x11A0 */ f32 field_0x11A0;
/* 0x11A4 */ f32 field_0x11A4;
/* 0x11A8 */ u8 _0x11A8[0x11B0 - 0x11A8];
/* 0x11B0 */ f32 field_0x11B0;
/* 0x11B4 */ u8 _0x11B4[0x11BC - 0x11B4];
/* 0x11BC */ f32 field_0x11BC;
/* 0x11C0 */ f32 field_0x11C0;
/* 0x11C4 */ u8 _0x11C4[0x11D4 - 0x11C4];
/* 0x11D4 */ s32 field_0x11D4;
/* 0x11D8 */ s32 field_0x11D8;
/* 0x11DC */ u8 _0x11DC[0x11E4 - 0x11DC];
/* 0x11E4 */ mVec3_c field_0x11E4;
/* 0x11F0 */ mVec3_c field_0x11F0;
/* 0x11FC */ mVec3_c field_0x11FC;
/* 0x1208 */ mVec3_c field_0x1208;
/* 0x1214 */ u8 _0x1214[0x1238 - 0x1214];
/* 0x1238 */ mVec3_c field_0x1238[2];
/* 0x1250 */ mVec3_c field_0x1250[2];
/* 0x1268 */ UnkLastBossCcSph2 field_0x1260[8];
/* 0x2948 */ UnkLastBossCcSph1 field_0x2948[1];
/* 0x2B64 */ dEmitter_c mEmitter1;
/* 0x2B98 */ dEmitter_c mEmitter2;
/* 0x2BCC */ dEmitter_c mEmitter3;
/* 0x2C00 */ dEmitter_c mEmitter4;
/* 0x2C34 */ dEmitter_c mEmitter5;
/* 0x2C68 */ dEmitter_c mEmitter6;
/* 0x2C9C */ dEmitter_c mEmitter7;
/* 0x2CD0 */ LIGHT_INFLUENCE mLightInfo;
/* 0x2CEC */ u16 field_0x2CEC;
/* 0x2CEE */ u8 _0x2CEE[0x2D20 - 0x2CEE];
/* 0x2D20 */ dTgSwordBattleGame_c *mpSwordBattleGame;
};
#endif
+14 -4
View File
@@ -197,6 +197,7 @@ public:
void fn_8002EA60(void *);
void fn_8002EB30(void *);
void putInODesert(f32 depth, mVec3_c *position);
void fn_8002ECD0(m3d::smdl_c *smdl, UNKWORD);
// Disabling makes Items and Link Disappear
void drawModelType1(m3d::smdl_c *smdl);
// Disabling make Lava and other objects Disappear
@@ -220,11 +221,11 @@ public:
fProfile::PROFILE_NAME_e actorId, u32 params1, mVec3_c *pos, mAng3_c *rot, mVec3_c *scale, u32 params2,
u32 roomId
);
// These may not belong here
static dAcBase_c* createInsectActor(
dAcBase_c* parent,
fProfile::PROFILE_NAME_e actorId, u32 params1, mVec3_c *pos, mAng3_c *rot, mVec3_c *scale, u32 params2, s32 roomId
static dAcBase_c *createInsectActor(
dAcBase_c *parent, fProfile::PROFILE_NAME_e actorId, u32 params1, mVec3_c *pos, mAng3_c *rot, mVec3_c *scale,
u32 params2, s32 roomId
);
static dAcBase_c *createActorUnkGroup3(
fProfile::PROFILE_NAME_e actorId, u32 roomId, u32 params1, mVec3_c *pos, mAng3_c *rot, mVec3_c *scale,
@@ -243,6 +244,15 @@ public:
if (!result) \
return result; \
} while (0)
// Actors' createHeap functions often have patterns that can be matched with this macro
#define TRY_CREATE2(thing) \
do { \
result = (thing); \
if (!result) \
return result; \
} while (0)
// Use this in actors' create functions
#define CREATE_ALLOCATOR(className) \
do { \
+1
View File
@@ -18,6 +18,7 @@ public:
virtual cCcD_ShapeAttr *GetShapeAttr() override;
using cM3dGCps::Set;
using cM3dGLin::Set;
void Set(const dCcD_SrcCps &src);
void unknownCalc();
};
+8 -10
View File
@@ -27,15 +27,14 @@ public:
/* 0x210 */ LinkedColliderNode mNode;
};
class dCcD_Linked_Cyl : public dCcD_Cyl {
class dCcD_Linked_Cps : public dCcD_Cps {
public:
dCcD_Linked_Cyl() : mNode(this) {}
virtual ~dCcD_Linked_Cyl() {
dCcD_Linked_Cps() : mNode(this) {}
virtual ~dCcD_Linked_Cps() {
mNode.remove();
}
/* 0x150 */ LinkedColliderNode mNode;
/* 0x170 */ LinkedColliderNode mNode;
};
class dCcD_Linked_Sph : public dCcD_Sph {
public:
dCcD_Linked_Sph() : mNode(this) {}
@@ -44,14 +43,13 @@ public:
}
/* 0x150 */ LinkedColliderNode mNode;
};
class dCcD_Linked_Cps : public dCcD_Cps {
class dCcD_Linked_Cyl : public dCcD_Cyl {
public:
dCcD_Linked_Cps() : mNode(this) {}
virtual ~dCcD_Linked_Cps() {
dCcD_Linked_Cyl() : mNode(this) {}
virtual ~dCcD_Linked_Cyl() {
mNode.remove();
}
/* 0x170 */ LinkedColliderNode mNode;
/* 0x150 */ LinkedColliderNode mNode;
};
class dColliderLinkedList {
+4
View File
@@ -172,6 +172,10 @@ public:
sUpdateFrameCount = 0;
}
static u32 getUpdateFrameCount() {
return sUpdateFrameCount;
}
bool savePromptFlag() const {
return mSavePromptFlag;
}
+59
View File
@@ -0,0 +1,59 @@
#ifndef D_ENEMY_SWORD_MDL_H
#define D_ENEMY_SWORD_MDL_H
#include "common.h"
#include "d/a/obj/d_a_obj_base.h"
#include "d/d_cc.h"
#include "d/d_shadow.h"
#include "egg/gfx/eggTexture.h"
#include "m/m3d/m_smdl.h"
#include "m/m_allocator.h"
#include "m/m_mtx.h"
#include "m/m_quat.h"
#include "m/m_vec.h"
#include "nw4r/types_nw4r.h"
#include "toBeSorted/d_sword_swing_effect_mgr.h"
class dEnemySwordMdl_c {
public:
/* 0x000 */ m3d::smdl_c mMdl;
/* 0x01C */ dSwordSwingEffectProcMgr_c mProc;
private:
/* 0x070 */ bool field_0x070;
/* 0x071 */ bool field_0x071;
/* 0x074 */ mVec3_c field_0x074;
/* 0x080 */ mVec3_c field_0x080;
/* 0x08C */ mVec3_c field_0x08C;
/* 0x098 */ mVec3_c field_0x098;
/* 0x0A4 */ f32 field_0x0A4;
/* 0x0A8 */ f32 field_0x0A8;
/* 0x0AC */ dCcD_Linked_Cps mCcs[3];
/* 0x52C */ dColliderLinkedList mCcList;
public:
dEnemySwordMdl_c() {}
virtual ~dEnemySwordMdl_c() {}
bool create(
mAllocator_c *alloc, void *pData, const char *mdlName, u32 bufferOption, const mVec3_c &v1, const mVec3_c &v2,
cCcD_Stts &stts, EGG::ResTIMG *pImg, int nView, u32 *pSize
);
bool create(
mAllocator_c *alloc, nw4r::g3d::ResFile resFile, const char *mdlName, u32 bufferOption, const mVec3_c &v1,
const mVec3_c &v2, cCcD_Stts &stts, EGG::ResTIMG *pImg, int nView, u32 *pSize
);
void calc(const mMtx_c &mtx, const mVec3_c &v1, bool mass);
bool entry(dAcObjBase_c *obj, dShadowCircle_c *shadow, mQuat_c *quat);
void fn_8006B640();
void fn_8006B660(UNKWORD, UNKWORD, UNKWORD, UNKWORD, UNKWORD, UNKWORD, UNKWORD, UNKWORD, UNKWORD, f32);
void setAttackActive(bool b) {
field_0x070 = b;
mProc.setActive(false);
}
};
#endif
+65
View File
@@ -0,0 +1,65 @@
#ifndef D_SWORD_SWING_EFFECT_H
#define D_SWORD_SWING_EFFECT_H
#include "common.h"
#include "egg/gfx/eggTexture.h"
#include "m/m3d/m_proc.h"
#include "m/m_allocator.h"
#include "m/m_color.h"
#include "m/m_vec.h"
class dSwordSwingEffectProcBase_c : public m3d::proc_c {
protected:
struct swing_entry {
swing_entry() {
mLifetime = 0.0f;
}
~swing_entry() {}
void set(const mVec3_c &pos1, const mColor &c1, const mVec3_c &pos2, const mColor &c2);
/* 0x00 */ f32 mLifetime;
/* 0x04 */ mVec3_c mv1;
/* 0x10 */ mVec3_c mv2;
/* 0x1C */ mColor mc1;
/* 0x20 */ mColor mc2;
};
public:
dSwordSwingEffectProcBase_c() : mpEntries(nullptr), mCount(0), mHead(0) {}
virtual ~dSwordSwingEffectProcBase_c() {
remove();
}
virtual int entry() override;
virtual void remove() override;
virtual void drawXlu() override;
bool create(s32 num, mAllocator_c *alloc);
void addSwing(const mVec3_c &pos1, const mColor c1, const mVec3_c &pos2, const mColor c2);
void calc(f32 f);
protected:
bool hasSwings() const;
/* 0x18 */ swing_entry *mpEntries;
/* 0x1C */ u16 mNum;
/* 0x1E */ u16 mCount;
/* 0x20 */ u16 mHead;
};
class dSwordSwingEffectProc_c : public dSwordSwingEffectProcBase_c {
public:
dSwordSwingEffectProc_c() : mpImg(nullptr) {}
virtual ~dSwordSwingEffectProc_c() {}
virtual void drawXlu() override;
bool create(s32 num, mAllocator_c *alloc, EGG::ResTIMG *pImg, f32 scale);
private:
/* 0x24 */ EGG::ResTIMG *mpImg;
/* 0x28 */ f32 mTexScale;
};
#endif
@@ -0,0 +1,43 @@
#ifndef D_SWORD_SWING_EFFECT_MGR_H
#define D_SWORD_SWING_EFFECT_MGR_H
#include "m/m_color.h"
#include "m/m_vec.h"
#include "toBeSorted/d_sword_swing_effect.h"
// TODO better name
class dSwordSwingEffectProcMgr_c {
private:
/* 0x00 */ dSwordSwingEffectProc_c mProc;
/* 0x2C */ bool mIsActive;
/* 0x30 */ mColor mC1;
/* 0x34 */ mColor mC2;
/* 0x38 */ mVec3_c field_0x38;
/* 0x44 */ mVec3_c field_0x44;
void createSwingEntries(const mVec3_c &v1, const mVec3_c &v2);
public:
dSwordSwingEffectProcMgr_c() : mC1(0xFF, 0xFF, 0xFF, 0x40), mC2(0xFF, 0xFF, 0xFF, 0x20) {}
virtual ~dSwordSwingEffectProcMgr_c() {}
void setColor1(mColor c1) {
mC1 = c1;
}
void setColor2(mColor c1) {
mC2 = c1;
}
void setActive(bool v) {
mIsActive = v;
}
bool create(s32 num, mAllocator_c *alloc, EGG::ResTIMG *pImg, f32 scale) {
return mProc.create(num, alloc, pImg, scale);
}
void calc(const mVec3_c &v1, const mVec3_c &v2);
void entry();
};
#endif
+446
View File
@@ -1,5 +1,27 @@
#include "d/a/b/d_a_b_lastboss.h"
#include "c/c_lib.h"
#include "c/c_math.h"
#include "common.h"
#include "d/a/d_a_player.h"
#include "d/a/obj/d_a_obj_base.h"
#include "d/d_base.h"
#include "d/d_light_env.h"
#include "d/d_sc_game.h"
#include "d/snd/d_snd_wzsound.h"
#include "d/t/d_t_sword_battle_game.h"
#include "f/f_base.h"
#include "f/f_manager.h"
#include "f/f_profile_name.h"
#include "m/m3d/m_fanm.h"
#include "m/m_mtx.h"
#include "m/m_vec.h"
#include "nw4r/g3d/res/g3d_resfile.h"
#include "nw4r/g3d/res/g3d_resmdl.h"
#include "s/s_Math.h"
#include "toBeSorted/d_emitter.h"
#include "toBeSorted/minigame_mgr.h"
SPECIAL_ACTOR_PROFILE(B_LASTBOSS, dAcBlastboss_c, fProfile::B_LASTBOSS, 0xBA, 0, 0);
STATE_DEFINE(dAcBlastboss_c, Fight);
@@ -17,6 +39,421 @@ STATE_DEFINE(dAcBlastboss_c, Down);
STATE_DEFINE(dAcBlastboss_c, Stun);
STATE_DEFINE(dAcBlastboss_c, ThunderWait);
static dCcD_SrcCyl sSrcCyl1 = {
/* mObjInf */
{/* mObjAt */ {0, 0, {0, 0, 0}, 0, 0, 0, 0, 0, 0},
/* mObjTg */
{~(AT_TYPE_BUGNET | AT_TYPE_0x80000 | AT_TYPE_BELLOWS | AT_TYPE_BEETLE | AT_TYPE_WIND | AT_TYPE_0x8000),
0x4103,
{0, 0x4, 0x407},
0x0,
0x0},
/* mObjCo */ {0x0}},
/* mCylInf */
{40.f, 300.f}
};
static dCcD_SrcCyl sSrcCyl2 = {
/* mObjInf */
{/* mObjAt */ {0, 0, {0, 0, 0}, 0, 0, 0, 0, 0, 0},
/* mObjTg */
{AT_TYPE_BELLOWS, 0x103, {0, 0x4, 0x407}, 0x0, 0x0},
/* mObjCo */ {0x0}},
/* mCylInf */
{70.f, 30.f}
};
static dCcD_SrcCyl sSrcCyl3 = {
/* mObjInf */
{/* mObjAt */ {0, 0, {0, 0, 0}, 0, 0, 0, 0, 0, 0},
/* mObjTg */
{0x0, 0x0, {0, 0x0, 0x407}, 0x0, 0x0},
/* mObjCo */ {0xE5}},
/* mCylInf */
{100.f, 250.f}
};
static dCcD_SrcSph sSrcSph1 = {
/* mObjInf */
{/* mObjAt */ {AT_TYPE_DAMAGE, 0x2008D, {0, 0, 0}, 4, 0, 0, 0, 0, 0},
/* mObjTg */
{0, 0, {0, 0x0, 0x407}, 0, 0},
/* mObjCo */ {0}},
/* mSphInf */
{100.0f}
};
static dCcD_SrcSph sSrcSph2 = {
/* mObjInf */
{/* mObjAt */ {AT_TYPE_DAMAGE, 0x22008D, {0, 0, 4}, 8, 0, 0, 0, 0, 0},
/* mObjTg */
{AT_TYPE_0x800000 | AT_TYPE_BUGNET, 0x103, {0, 0x19, 0x407}, 0, 0},
/* mObjCo */ {0}},
/* mSphInf */
{100.0f}
};
static dCcD_SrcSph sSrcSph = {
/* mObjInf */
{/* mObjAt */ {0, 0, {0, 0, 0}, 0, 0, 0, 0, 0, 0},
/* mObjTg */
{AT_TYPE_BELLOWS, 0x4103, {0, 0x0, 0x40F}, 0, 0},
/* mObjCo */ {0}},
/* mSphInf */
{30.0f}
};
s32 useUnused() {
static const f32 a1[] = {
0.95f,
1.05f,
0.0f,
};
return (s32)a1;
}
bool dAcBlastboss_c::createHeap() {
bool result;
void *pData = getOarcResFile("BLastBoss");
TRY_CREATE2(mMdl.create3(*this, pData, "LastBoss", "Wait", 0x334));
mScnCallback.attach(mMdl.getModel());
nw4r::g3d::ResFile res(pData);
TRY_CREATE2(mAnmTexSrt.create(mMdl.getModel().getResMdl(), res.GetResAnmTexSrt("Hair"), &mAllocator, nullptr, 1));
mMdl.getModel().setAnm(mAnmTexSrt);
TRY_CREATE2(mAnmMatClr1.create(mMdl.getModel().getResMdl(), res.GetResAnmClr("Wait"), &mAllocator, nullptr, 2));
mAnmMatClr1.setAnm(mMdl.getModel(), res.GetResAnmClr("Hair"), 1, m3d::PLAY_MODE_0);
mMdl.getModel().setAnm(mAnmMatClr1);
mMdl.getModel().setCallback(&mMdlCallback);
mMdlCallback.mpOwner = this;
TRY_CREATE2(mSwordMdl.create(
&mAllocator, pData, "LastBossSword", 0x130, mVec3_c(0.0f, 0.0f, 0.0f), mVec3_c(0.0f, -230.0f, 0.0f), mStts,
nullptr, 1, nullptr
));
// TODO I'm not going to try and make sense of this for now
mSwordMdl.fn_8006B660(4, 1, 0, 0x10000, 0, 0, 0, 0x400, 0xc, 60.0f);
mSwordMdl.mProc.setColor1(mColor(0xFF, 0xFF, 0xFF, 0x14));
mSwordMdl.mProc.setColor2(mColor(0xFF, 0xFF, 0xFF, 0x14));
TRY_CREATE2(mThunderMdl.create(res.GetResMdl("FX_LBThunder"), &mAllocator, 0x120));
TRY_CREATE2(
mThunderAnmMatClr.create(mThunderMdl.getResMdl(), res.GetResAnmClr("FX_LBThunder"), &mAllocator, nullptr, 1)
);
mThunderMdl.setAnm(mThunderAnmMatClr);
dBase_c::createBase(fProfile::LYT_BOSS_CAPTION, this, 0, OTHER);
return result;
}
int dAcBlastboss_c::create() {
field_0x1130 = getFromParams(0, 0xFF);
if (MinigameManager::GetInstance()->checkInBossRush()) {
field_0x114D = 1;
}
CREATE_ALLOCATOR(dAcBlastboss_c);
mStts.SetRank(10);
mCcList.addCc(mCc1, sSrcCyl1);
mCcList.addCc(mCc2, sSrcCyl2);
mCcList.addCc(mCc3, sSrcCyl3);
for (int i = 0; i < (int)ARRAY_LENGTH(field_0x1260); i++) {
field_0x1260[i].field_0x000 = i;
field_0x1260[i].field_0x002 = cM::rndF(65536.0f);
mCcList.addCc(field_0x1260[i].mCc, sSrcSph);
for (int j = 0; j < (int)ARRAY_LENGTH(field_0x1260[j].field_0x014); j++) {
field_0x1260[i].field_0x014[j] = mPosition;
}
field_0x1260[i].field_0x008 = i * 15000;
}
// TODO loop of length 1 might not exist
for (int i = 0; i < (int)ARRAY_LENGTH(field_0x2948); i++) {
mCcList.addCc(field_0x2948[i].mCc, sSrcSph);
for (int j = 0; j < (int)ARRAY_LENGTH(field_0x2948[j].field_0x008); j++) {
field_0x2948[i].field_0x008[j] = mPosition;
}
}
mCcList.SetStts(mStts);
mCc4.Set(sSrcSph1);
mCc4.SetStts(mStts);
mCc5.Set(sSrcSph2);
mCc5.mTg.Set_0x4C(-1);
mCc5.SetStts(mStts);
mAcceleration = -5.0f;
mMaxSpeed = -80.0f;
mBoundingBox.Set(mVec3_c(-200.0f, -300.0f, -200.0f), mVec3_c(200.0f, 300.0f, 200.0f));
mStateMgr.changeState(StateID_Fight);
field_0x1132 = 1;
field_0x1164 = cM::rndF(65536.0f);
mHealth = 400;
mPositionCopy3 = mPosition;
field_0x11D4 = field_0x11D8 = -1;
mEmitter1.init(this);
mEmitter2.init(this);
// mEmitter3.init(this); // TODO why not this one...
mEmitter4.init(this);
mEmitter5.init(this);
mEmitter6.init(this);
mEmitter7.init(this);
mLightInfo.SetPosition(mPosition);
mLightInfo.mClr.Set(100, 150, 255, 255);
dLightEnv_c::GetPInstance()->plight_set(&mLightInfo);
fn_143_A110(100);
if (!field_0x114D) {
field_0x2CEC = 200;
setActorProperty(AC_PROP_0x4);
}
return SUCCEEDED;
}
int dAcBlastboss_c::doDelete() {
dLightEnv_c::GetPInstance()->plight_cut(&mLightInfo);
return SUCCEEDED;
}
int dAcBlastboss_c::actorExecute() {
if (field_0x114D && mpSwordBattleGame == nullptr) {
mpSwordBattleGame = static_cast<dTgSwordBattleGame_c *>(
fManager_c::searchBaseByProfName(fProfile::TAG_SWORD_BATTLE_GAME, mpSwordBattleGame)
);
}
dAcPy_c *link = dAcPy_c::GetLinkM();
field_0x1164++;
field_0x1133 = 0;
field_0x1131 = 0;
field_0x1141 = 0;
field_0x114E = 0;
field_0x11A4 = 0.0f;
mLightInfo.mScale = 0.0f;
field_0x11B0 = 0.7f;
if (field_0x1156 != 0) {
field_0x1156--;
}
if (field_0x1158 != 0) {
field_0x1158--;
}
if (field_0x115A != 0) {
field_0x115A--;
}
if (field_0x115C != 0) {
field_0x115C--;
}
if (field_0x115E != 0) {
field_0x115E--;
}
if (field_0x1160 != 0) {
field_0x1160--;
}
if (mMdlCallback.field_0x04 != 0) {
mMdlCallback.field_0x04--;
}
if (field_0x117C != 0) {
field_0x117C--;
}
if (field_0x113D != 0) {
field_0x113D--;
}
if (field_0x113F != 0) {
field_0x113F--;
}
if (field_0x113E != 0) {
field_0x113E--;
}
mVec3_c linkPos = link->getPosition();
field_0x116A = cLib::targetAngleY(mPosition, linkPos);
// TODO maybe inline
mVec3_c posDiff = link->getPosition() - mPosition;
field_0x1190 = posDiff.absXZ();
field_0x1186 = field_0x116A - mRotation.y;
mSwordMdl.setAttackActive(false);
mCc4.ClrAtSet();
mCc5.ClrAtSet();
fn_143_6720();
if (mpSwordBattleGame == nullptr || mpSwordBattleGame->checkFightStarted() == true) {
mStateMgr.executeState();
}
mRotation.x = mRotationCopy.x;
mRotation.z = mRotationCopy.z;
sLib::addCalcAngle(&mRotation.y.mVal, mRotationCopy.y, 2, 0x800);
mMdl.play();
if (!field_0x114F) {
mAnmMatClr1.play();
}
calcVelocity();
mPosition += mVelocity;
mPosition += mStts.GetCcMove();
mPosition.x += field_0x119C;
mPosition.z += field_0x11A0;
field_0x119C *= 0.6f;
field_0x11A0 *= 0.6f;
f32 f5 = 0.0f;
if (mRotation.x != 0) {
f5 += field_0x11C0 * mRotation.x.sin();
}
field_0x1140 = 0;
if (mPosition.y <= f5) {
mPosition.y = f5;
field_0x11BC = mVelocity.y;
mVelocity.y = 0.0f;
field_0x1140 = 1;
}
fn_143_7B00();
mWorldMtx.transS(mPosition);
mWorldMtx.ZXYrotM(mRotation);
mScale.set(0.95f, 0.95f, 0.95f);
mMdl.getModel().setScale(mScale);
mMdl.getModel().setLocalMtx(mWorldMtx);
if (!field_0x114F) {
mAnmTexSrt.play();
}
mMdl.getModel().calc(false);
nw4r::g3d::ResMdl resMdl = mMdl.getModel().getResMdl();
mMtx_c nodeMtx;
mMdl.getModel().getNodeWorldMtx(resMdl.GetResNode("loc_sword01").GetID(), nodeMtx);
mMtx_c scaleMtx;
scaleMtx.scaleS(1.05f, 1.05f, 1.05f);
MTXConcat(nodeMtx, scaleMtx, nodeMtx);
// TODO - inline?
mVec3_c v(mRotation.y.sin(), 0.0f, mRotation.y.cos());
mSwordMdl.calc(nodeMtx, v, false);
mVec3_c vEff(0.0f, -120.0f, 0.0f);
if ((s32)field_0x1144 == 9) {
vEff.y = -80.0f;
if (field_0x1190 > 300.0f) {
vEff.y -= (field_0x1190 - 300.0f);
if (vEff.y < -280.0f) {
vEff.y = -280.0f;
}
}
}
MTXMultVec(nodeMtx, vEff, field_0x1208);
if (mIsSwordEmpowered) {
mEmitter4.holdEffect(PARTICLE_RESOURCE_ID_MAPPING_619_, nodeMtx, nullptr, nullptr);
mLightInfo.mPos = field_0x1208;
if (dScGame_c::getUpdateFrameCount() & 2) {
mLightInfo.SetScale(300.0f);
} else {
mLightInfo.SetScale(200.0f);
}
holdSound(SE_BLasBos_SwordEnpowered);
}
if (field_0x114B != 0) {
if (field_0x114B == 1) {
mEmitter7.holdEffect(PARTICLE_RESOURCE_ID_MAPPING_852_, nodeMtx, nullptr, nullptr);
mMdl.getModel().getNodeWorldMtx(resMdl.GetResNode("backbone2").GetID(), nodeMtx);
mEmitter6.holdEffect(PARTICLE_RESOURCE_ID_MAPPING_853_, nodeMtx, nullptr, nullptr);
holdSound(SE_BLasBos_UnderElecShock);
} else if (field_0x114B == 2) {
mMdl.getModel().getNodeWorldMtx(resMdl.GetResNode("backbone2").GetID(), nodeMtx);
dJEffManager_c::spawnEffect(PARTICLE_RESOURCE_ID_MAPPING_851_, nodeMtx, nullptr, nullptr, 0, 0);
mMtx_c transMtx;
transMtx.transS(0.0f, -100000.0f, 0.0f);
MTXConcat(nodeMtx, transMtx, nodeMtx);
mEmitter7.holdEffect(PARTICLE_RESOURCE_ID_MAPPING_852_, nodeMtx, nullptr, nullptr);
mEmitter6.holdEffect(PARTICLE_RESOURCE_ID_MAPPING_853_, nodeMtx, nullptr, nullptr);
holdSound(SE_BLasBos_KillOffElecShock);
}
mLightInfo.mPos = field_0x1208;
if (dScGame_c::getUpdateFrameCount() & 2) {
mLightInfo.SetScale(400.0f);
} else {
mLightInfo.SetScale(300.0f);
}
field_0x114B = 0;
}
// TODO NODE IDs
mMdl.getModel().getNodeWorldMtx(0x26, nodeMtx);
nodeMtx.getTranslation(field_0x11E4);
mMdl.getModel().getNodeWorldMtx(1, nodeMtx);
nodeMtx.getTranslation(field_0x11F0);
mMdl.getModel().getNodeWorldMtx(3, nodeMtx);
nodeMtx.getTranslation(field_0x11FC);
mMdl.getModel().getNodeWorldMtx(0x3C, nodeMtx);
nodeMtx.getTranslation(field_0x1238[0]);
mMdl.getModel().getNodeWorldMtx(0x40, nodeMtx);
nodeMtx.getTranslation(field_0x1238[1]);
mMdl.getModel().getNodeWorldMtx(5, nodeMtx);
mVec3_c tmp1(0.0f, 0.0f, 0.0f);
MTXMultVec(nodeMtx, tmp1, mPositionCopy2);
// TODO
mPositionCopy3 = mVec3_c(mPositionCopy2.x, mPositionCopy2.y + 50.0f, mPositionCopy2.z);
if (field_0x1132) {
fn_80030c20(0, 1500.0f, 50.0f, -200.0f, 200.0f);
}
nodeMtx.YrotS(mRotation.y);
mVec3_c tmpCc;
if (link->isAttacking() && *mStateMgr.getStateID() == StateID_Guard) {
if (field_0x1144 == 9) {
tmpCc.z = 100.0f;
// TODO - ...
}
}
MTXMultVec(nodeMtx, tmpCc, tmpCc);
tmpCc += mPosition;
return SUCCEEDED;
}
void dAcBlastboss_c::callback_c::timingB(u32 nodeId, nw4r::g3d::WorldMtxManip *manip, nw4r::g3d::ResMdl mdl) {}
void dAcBlastboss_c::initializeState_Fight() {}
void dAcBlastboss_c::executeState_Fight() {}
void dAcBlastboss_c::finalizeState_Fight() {}
@@ -59,3 +496,12 @@ void dAcBlastboss_c::finalizeState_Stun() {}
void dAcBlastboss_c::initializeState_ThunderWait() {}
void dAcBlastboss_c::executeState_ThunderWait() {}
void dAcBlastboss_c::finalizeState_ThunderWait() {}
int dAcBlastboss_c::draw() {
drawModelType1(&mMdl.getModel());
mSwordMdl.entry(this, nullptr, nullptr);
if (field_0x114C) {
drawModelType1(&mThunderMdl);
}
return SUCCEEDED;
}
+1 -1
View File
@@ -16,7 +16,7 @@ void cM3dGCps::SetR(f32 r) {
r = 0.0f;
}
mRadius = r;
field_0x1C = (double)r; // huh
field_0x1C = mRadius;
}
void cM3dGCps::Set_0x1C(f32 f) {
+131
View File
@@ -0,0 +1,131 @@
#include "toBeSorted/d_enemy_sword_mdl.h"
#include "common.h"
#include "d/col/cc/d_cc_s.h"
#include "d/d_sc_game.h"
#include "m/m3d/m_shadow.h"
#include "m/m_vec.h"
#include "nw4r/g3d/res/g3d_resfile.h"
#include "nw4r/g3d/res/g3d_resmdl.h"
dCcD_SrcCps sCcSrc = {
{
{0x400, 0x8D, {1, 0, 0}, 1, 0, 0, 0, 0, 0},
{0, 0, {0, 0, 0x407}, 0, 0},
{0},
},
{30.0f},
};
// Yeah these two functions do the same thing. Could've made one call the other...
bool dEnemySwordMdl_c::create(
mAllocator_c *alloc, void *pData, const char *mdlName, u32 bufferOption, const mVec3_c &v1, const mVec3_c &v2,
cCcD_Stts &stts, EGG::ResTIMG *pImg, int nView, u32 *pSize
) {
nw4r::g3d::ResMdl mdl = nw4r::g3d::ResFile(pData).GetResMdl(mdlName);
if (!mMdl.create(mdl, alloc, bufferOption, nView, pSize)) {
return false;
}
if (!mProc.create(100, alloc, pImg, 0.015f)) {
mMdl.remove();
return false;
}
field_0x074.set(v1.x, v1.y, v1.z);
field_0x080.set(v2.x, v2.y, v2.z);
for (int i = 0; i < 3; i++) {
mCcList.addCc(mCcs[i], sCcSrc);
}
mCcList.SetStts(stts);
mCcList.ClrAt();
return true;
}
bool dEnemySwordMdl_c::create(
mAllocator_c *alloc, nw4r::g3d::ResFile resFile, const char *mdlName, u32 bufferOption, const mVec3_c &v1,
const mVec3_c &v2, cCcD_Stts &stts, EGG::ResTIMG *pImg, int nView, u32 *pSize
) {
nw4r::g3d::ResMdl mdl = resFile.GetResMdl(mdlName);
if (!mMdl.create(mdl, alloc, bufferOption, nView, pSize)) {
return false;
}
if (!mProc.create(100, alloc, pImg, 0.015f)) {
mMdl.remove();
return false;
}
field_0x074.set(v1.x, v1.y, v1.z);
field_0x080.set(v2.x, v2.y, v2.z);
for (int i = 0; i < 3; i++) {
mCcList.addCc(mCcs[i], sCcSrc);
}
mCcList.SetStts(stts);
mCcList.ClrAt();
return true;
}
void dEnemySwordMdl_c::fn_8006B640() {
mCcs[0].OnAtSet();
field_0x070 = true;
field_0x071 = false;
}
// TODO - ...
void dEnemySwordMdl_c::calc(const mMtx_c &mtx, const mVec3_c &v1, bool mass) {
mMdl.setLocalMtx(mtx);
mMdl.calc(false);
MTXMultVec(mtx, field_0x074, field_0x08C);
MTXMultVec(mtx, field_0x080, field_0x098);
if (field_0x070) {
mVec3_c v = field_0x098 - field_0x08C;
v.normalize();
mVec3_c hi = field_0x098 + v * field_0x0A8;
mCcs[1].Set(mCcs[0].mEnd, hi);
mCcs[2].Set(mCcs[0].mStart, hi);
mCcs[0].Set(field_0x08C - v * field_0x0A4, hi);
mCcs[0].SetAtVec(v1);
mCcs[1].SetAtVec(v1);
mCcs[2].SetAtVec(v1);
if (field_0x071 && !mCcs[1].ChkAtSet()) {
mCcs[1].OnAtSet();
mCcs[2].OnAtSet();
} else {
field_0x071 = true;
}
mCcList.registerColliders();
if (mass) {
dCcS::GetInstance()->GetMassMng().SetObj(&mCcs[0], 2);
}
} else {
field_0x071 = false;
if (mCcs[0].ChkAtSet()) {
mCcList.ClrAt();
}
}
mProc.calc(field_0x098, field_0x08C);
}
bool dEnemySwordMdl_c::entry(dAcObjBase_c *obj, dShadowCircle_c *shadow, mQuat_c *quat) {
if (dScGame_c::currentSpawnInfo.getTrial() == SpawnInfo::TRIAL) {
obj->fn_8002ECD0(&mMdl, 7);
} else {
obj->drawModelType1(&mMdl);
}
mProc.entry();
if (shadow != nullptr && quat != nullptr) {
m3d::mShadow_c::GetInstance()->addMdlToCircle(shadow, mMdl, *quat);
}
return true;
}
+218
View File
@@ -0,0 +1,218 @@
#include "toBeSorted/d_sword_swing_effect.h"
#include "d/d_stage_mgr.h"
#include "egg/gfx/eggDrawGX.h"
#include "m/m3d/m3d.h"
#include "m/m3d/m_proc.h"
#include "m/m3d/m_scnleaf.h"
#include "nw4r/g3d/g3d_scnobj.h"
#include "nw4r/math/math_types.h"
void dSwordSwingEffectProcBase_c::remove() {
if (mpEntries != nullptr) {
delete[] mpEntries;
mpEntries = nullptr;
}
m3d::scnLeaf_c::remove();
}
void dSwordSwingEffectProcBase_c::drawXlu() {
m3d::resetMaterial();
GXSetNumChans(1);
GXSetChanCtrl(GX_COLOR0A0, GX_FALSE, GX_SRC_REG, GX_SRC_VTX, GX_LIGHT_NULL, GX_DF_NONE, GX_AF_NONE);
GXSetNumTexGens(0);
GXSetNumTevStages(1);
GXSetNumIndStages(0);
GXSetTevSwapMode(GX_TEVSTAGE0, GX_TEV_SWAP0, GX_TEV_SWAP0);
GXSetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD_NULL, GX_TEXMAP_NULL, GX_COLOR0A0);
GXSetTevColorIn(GX_TEVSTAGE0, GX_CC_ZERO, GX_CC_ZERO, GX_CC_ZERO, GX_CC_RASC);
GXSetTevColorOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, 1, GX_TEVPREV);
GXSetTevAlphaIn(GX_TEVSTAGE0, GX_CA_ZERO, GX_CA_ZERO, GX_CA_ZERO, GX_CA_RASA);
GXSetTevAlphaOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV);
GXSetZCompLoc(1);
GXSetBlendMode(GX_BM_BLEND, GX_BL_SRCALPHA, GX_BL_INVSRCALPHA, GX_LO_OR);
GXSetZMode(GX_TRUE, GX_LEQUAL, GX_FALSE);
GXSetAlphaCompare(GX_GREATER, 0, GX_AOP_OR, GX_GREATER, 0);
GXSetFog(GX_FOG_NONE, mColor(0), 0.0, 0.0, 0.0, 0.0);
GXSetFogRangeAdj(0, 0, 0);
GXSetCullMode(GX_CULL_NONE);
nw4r::math::MTX34 mtx;
nw4r::g3d::Camera cam = m3d::getCurrentCamera();
cam.GetCameraMtx(&mtx);
GXLoadPosMtxImm(mtx, 0);
GXSetCurrentMtx(0);
GXClearVtxDesc();
GXSetVtxDesc(GX_VA_POS, GX_DIRECT);
GXSetVtxDesc(GX_VA_CLR0, GX_DIRECT);
GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_POS_XYZ, GX_F32, 0);
GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_CLR0, GX_CLR_RGBA, GX_RGBA8, 0);
GXBegin(GX_TRIANGLESTRIP, GX_VTXFMT0, mCount * 2);
swing_entry *entry = &mpEntries[mHead];
for (u16 i = 0; i < mCount; i++) {
if (entry == &mpEntries[0]) {
entry = &mpEntries[mNum];
}
entry--;
GXPosition3f32(entry->mv1.x, entry->mv1.y, entry->mv1.z);
GXColor4u8(entry->mc1.r, entry->mc1.g, entry->mc1.b, entry->mc1.a * entry->mLifetime);
GXPosition3f32(entry->mv2.x, entry->mv2.y, entry->mv2.z);
GXColor4u8(entry->mc2.r, entry->mc2.g, entry->mc2.b, entry->mc2.a * entry->mLifetime);
}
GXEnd();
}
bool dSwordSwingEffectProcBase_c::hasSwings() const {
return mCount != 0;
}
int dSwordSwingEffectProcBase_c::entry() {
if (hasSwings()) {
return m3d::pushBack(mpScnLeaf);
}
return 0;
}
bool dSwordSwingEffectProcBase_c::create(s32 num, mAllocator_c *alloc) {
if (!m3d::proc_c::create(alloc, nullptr)) {
return false;
}
mpEntries = new (alloc->getHeap(), 4) swing_entry[num]();
if (mpEntries == nullptr) {
remove();
return false;
}
mNum = num;
setOption(nw4r::g3d::ScnObj::OPTION_DISABLE_DRAW_OPA, true);
return true;
}
void dSwordSwingEffectProcBase_c::addSwing(
const mVec3_c &pos1, mColor c1, const mVec3_c &pos2, mColor c2
) {
mpEntries[mHead].set(pos1, c1, pos2, c2);
mHead++;
if (mHead >= mNum) {
mHead = 0;
}
if (mCount < mNum) {
mCount++;
}
}
void dSwordSwingEffectProcBase_c::calc(f32 f) {
s32 count = mCount;
if (count == 0) {
return;
}
swing_entry *entry = &mpEntries[mHead];
for (u16 i = 0; i < mCount; i++) {
if (entry == &mpEntries[0]) {
entry = &mpEntries[mNum];
}
entry--;
entry->mLifetime -= f;
if (entry->mLifetime <= 0.0f) {
entry->mLifetime = 0.0f;
count--;
}
}
if (mCount != 0 && count == 0) {
mHead = 0;
}
mCount = count;
}
void dSwordSwingEffectProc_c::drawXlu() {
if (mpImg == nullptr) {
dSwordSwingEffectProcBase_c::drawXlu();
} else {
EGG::DrawGX::LoadTexture(mpImg, GX_TEXMAP0);
GXSetNumChans(1);
GXSetChanCtrl(GX_COLOR0A0, false, GX_SRC_REG, GX_SRC_VTX, GX_LIGHT_NULL, GX_DF_NONE, GX_AF_NONE);
GXSetNumTexGens(1);
GXSetTexCoordGen2(GX_TEXCOORD0, GX_TG_MTX2x4, GX_TG_TEX0, 0x3c, 0, 0x7d);
GXSetNumTevStages(1);
GXSetNumIndStages(0);
GXSetTevSwapMode(GX_TEVSTAGE0, GX_TEV_SWAP0, GX_TEV_SWAP0);
GXSetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD0, GX_TEXMAP0, GX_COLOR0A0);
GXSetTevColorIn(GX_TEVSTAGE0, GX_CC_ZERO, GX_CC_RASC, GX_CC_TEXC, GX_CC_ZERO);
GXSetTevColorOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, 1, GX_TEVPREV);
GXSetTevAlphaIn(GX_TEVSTAGE0, GX_CA_ZERO, GX_CA_RASA, GX_CA_TEXA, GX_CA_ZERO);
GXSetTevAlphaOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, true, GX_TEVPREV);
GXSetZCompLoc(0);
GXSetBlendMode(GX_BM_BLEND, GX_BL_SRCALPHA, GX_BL_INVSRCALPHA, GX_LO_OR);
GXSetZMode(true, GX_LEQUAL, false);
GXSetAlphaCompare(GX_GREATER, 0, GX_AOP_OR, GX_GREATER, 0);
GXSetFog(GX_FOG_NONE, mColor(0), 0.0, 0.0, 0.0, 0.0);
GXSetFogRangeAdj(0, 0, 0);
GXSetCullMode(GX_CULL_NONE);
nw4r::math::MTX34 mtx;
nw4r::g3d::Camera cam = m3d::getCurrentCamera();
cam.GetCameraMtx(&mtx);
GXLoadPosMtxImm(mtx, 0);
GXSetCurrentMtx(0);
GXClearVtxDesc();
GXSetVtxDesc(GX_VA_POS, GX_DIRECT);
GXSetVtxDesc(GX_VA_CLR0, GX_DIRECT);
GXSetVtxDesc(GX_VA_TEX0, GX_DIRECT);
GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_POS_XYZ, GX_F32, 0);
GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_CLR0, GX_CLR_RGBA, GX_RGBA8, 0);
GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_TEX0, GX_TEX_ST, GX_F32, 0);
GXBegin(GX_TRIANGLESTRIP, GX_VTXFMT0, mCount * 2);
u8 alpha = dStageMgr_c::GetInstance()->getGlobalAlpha();
f32 fAlpha = alpha * (1.0f / 255.0f);
s32 idx = mHead - mCount;
if (idx < 0) {
idx += mNum;
}
f32 texCoordOffset = mTexScale * idx;
swing_entry *entry = &mpEntries[idx];
swing_entry *last = &mpEntries[mNum];
for (u16 i = 0; i < mCount; i++) {
GXPosition3f32(entry->mv1.x, entry->mv1.y, entry->mv1.z);
GXColor4u8(entry->mc1.r, entry->mc1.g, entry->mc1.b, entry->mc1.a * entry->mLifetime * fAlpha);
GXTexCoord2f32(texCoordOffset, 0.0f);
GXPosition3f32(entry->mv2.x, entry->mv2.y, entry->mv2.z);
GXColor4u8(entry->mc2.r, entry->mc2.g, entry->mc2.b, entry->mc2.a * entry->mLifetime * fAlpha);
GXTexCoord2f32(texCoordOffset, 1.0f);
texCoordOffset += mTexScale;
entry++;
if (entry == last) {
entry = &mpEntries[0];
}
}
}
}
bool dSwordSwingEffectProc_c::create(s32 num, mAllocator_c *alloc, EGG::ResTIMG *pImg, f32 scale) {
if (!dSwordSwingEffectProcBase_c::create(num, alloc)) {
return false;
}
mpImg = pImg;
mTexScale = scale;
return true;
}
void dSwordSwingEffectProcBase_c::swing_entry::set(
const mVec3_c &pos1, const mColor &c1, const mVec3_c &pos2, const mColor &c2
) {
mLifetime = 1.0f;
mv1 = pos1;
mv2 = pos2;
mc1 = c1;
mc2 = c2;
}
+196
View File
@@ -0,0 +1,196 @@
#include "toBeSorted/d_sword_swing_effect_mgr.h"
#include "c/c_math.h"
#include "egg/math/eggMatrix.h"
#include "m/m_vec.h"
// TODO: can't use EGG::Vector3f::cross because the Vector3f -> mVec3_c conversion
// forces additional stack stores. An open-coded cross function works too in this
// file but maybe pattern comes up in more files and then we can move it to d_vec?
inline void cross(mVec3_c &result, const mVec3_c &left, const mVec3_c &right) {
result.set(
(left.y * right.z) - (left.z * right.y), (left.z * right.x) - (left.x * right.z),
(left.x * right.y) - (left.y * right.x)
);
}
static bool fn_8006A8D0(const mVec2_c &v1, const mVec2_c &v2, const mVec2_c &v3, const mVec2_c &v4, mVec2_c &result) {
mVec2_c t1 = v2 - v1;
mVec2_c t2 = v4 - v3;
if (cM::isZero(t1.x)) {
if (cM::isZero(t2.x)) {
return false;
} else {
result.x = v1.x;
result.y = v3.y + (t2.y / t2.x) * (v1.x - v3.x);
}
} else {
if (cM::isZero(t2.x)) {
result.x = v3.x;
} else {
f32 tmp = t1.y / t1.x - t2.y / t2.x;
if (cM::isZero(tmp)) {
return false;
}
result.x = (v3.x + (((t1.y / t1.x) * v1.x - v1.y) - (t2.y / t2.x) * v3.x)) / tmp;
}
result.y = v1.y + (t1.y / t1.x) * (result.x - v1.x);
}
mVec2_c diff = result - v1;
if (diff.x * t1.x + diff.y * t1.y >= 0.0f) {
return false;
}
diff = result - v3;
if (diff.x * t2.x + diff.y * t2.y >= 0.0f) {
return false;
}
return true;
}
void dSwordSwingEffectProcMgr_c::createSwingEntries(const mVec3_c &v1, const mVec3_c &v2) {
mVec3_c lastDiff = field_0x44 - field_0x38;
mVec3_c diff = v1 - v2;
mVec3_c cross_;
cross(cross_, lastDiff, diff);
f32 diffMag = diff.mag();
lastDiff.normalize();
diff /= diffMag;
cross_.normalize();
// Same code as in dowsing_target...
f32 dot = lastDiff.dot(diff);
dot = cM::minMaxLimit(dot, -1.0f, 1.0f);
f32 a = 1.0f - dot * dot <= 0.0f ? 0.0f : nw4r::math::FrSqrt(1.0f - dot * dot) * (1.0f - dot * dot);
EGG::Matrix34f mat;
mat.setAxisRotation(cross_, cM::atan2f(a, dot) * 0.1f);
mVec2_c p1, p2, p3, p4;
mVec2_c res1, res2, res3;
p1.set(field_0x38.x, field_0x38.y);
p2.set(field_0x44.x, field_0x44.y);
p3.set(v2.x, v2.y);
p4.set(v1.x, v1.y);
bool b1 = fn_8006A8D0(p1, p2, p3, p4, res1);
p1.set(field_0x38.y, field_0x38.z);
p2.set(field_0x44.y, field_0x44.z);
p3.set(v2.y, v2.z);
p4.set(v1.y, v1.z);
bool b2 = fn_8006A8D0(p1, p2, p3, p4, res2);
p1.set(field_0x38.z, field_0x38.x);
p2.set(field_0x44.z, field_0x44.x);
p3.set(v2.z, v2.x);
p4.set(v1.z, v1.x);
bool b3 = fn_8006A8D0(p1, p2, p3, p4, res3);
bool b;
mVec3_c local_124 = (v2 + field_0x38) * 0.5f;
mVec3_c diff1;
mVec3_c v;
f32 f_29;
f32 f_28;
EGG::Matrix34f mat2;
int i = 0;
if (!b1) {
i += 1;
}
if (!b2) {
i += 1;
}
if (!b3) {
i += 1;
}
if (i >= 2) {
v = (v2 - field_0x38) * 0.1f;
b = false;
} else {
if (b1 && b3) {
local_124.x = (res1.x + res3.y) * 0.5f;
} else if (b1) {
local_124.x = res1.x;
} else if (b3) {
local_124.x = res3.y;
}
if (b2 && b1) {
local_124.y = (res2.x + res1.y) * 0.5f;
} else if (b2) {
local_124.y = res2.x;
} else if (b1) {
local_124.y = res1.y;
}
if (b3 && b2) {
local_124.z = (res3.x + res2.y) * 0.5f;
} else if (b3) {
local_124.z = res3.x;
} else if (b2) {
local_124.z = res2.y;
}
diff1 = field_0x38 - local_124;
mVec3_c diff2 = v2 - local_124;
f_29 = diff1.mag();
f_28 = (diff2.mag() - f_29) * 0.1f;
diff2.normalize();
diff1.normalize();
cross(cross_, diff1, diff2);
cross_.normalize();
// Same code as in dowsing_target...
f32 dot = diff1.dot(diff2);
dot = cM::minMaxLimit(dot, -1.0f, 1.0f);
f32 a = 1.0f - dot * dot <= 0.0f ? 0.0f : nw4r::math::FrSqrt(1.0f - dot * dot) * (1.0f - dot * dot);
mat2.setAxisRotation(cross_, cM::atan2f(a, dot) * 0.1f);
b = true;
}
f32 blub = 0.1f;
for (int i = 1; i <= 10; i++) {
mVec3_c a;
mVec3_c t;
if (b) {
MTXMultVecSR(mat2.m, diff1, diff1);
t = local_124 + (diff1 * (f_29 + (f_28 * i)));
} else {
t = field_0x38 + v * i;
}
MTXMultVecSR(mat.m, lastDiff, lastDiff);
a = t + lastDiff * diffMag;
mProc.addSwing(a, mC1, t, mC2);
// Unused
blub += 0.1f;
}
}
void dSwordSwingEffectProcMgr_c::calc(const mVec3_c &v1, const mVec3_c &v2) {
mProc.calc(0.1f);
if (mIsActive) {
createSwingEntries(v1, v2);
}
field_0x44 = v1;
field_0x38 = v2;
}
void dSwordSwingEffectProcMgr_c::entry() {
mProc.entry();
}
+1
View File
@@ -174,6 +174,7 @@ DowsingTarget *DowsingTarget::getDowsingInfo(
targetDir.normalize();
// Same code as in d_sword_swing_effect_mgr...
f32 dot = dwsDir.dot(targetDir);
dot = cM::minMaxLimit(dot, -1.0f, 1.0f);
f32 a = 1.0f - dot * dot <= 0.0f ? 0.0f : nw4r::math::FrSqrt(1.0f - dot * dot) * (1.0f - dot * dot);