diff --git a/config/SOUE01/rels/d_a_obj_windmillNP/symbols.txt b/config/SOUE01/rels/d_a_obj_windmillNP/symbols.txt index 42e9ce53f..d067506e7 100644 --- a/config/SOUE01/rels/d_a_obj_windmillNP/symbols.txt +++ b/config/SOUE01/rels/d_a_obj_windmillNP/symbols.txt @@ -79,8 +79,13 @@ lbl_374_data_178 = .data:0x00000178; // type:object size:0x18 scope:local lbl_374_data_190 = .data:0x00000190; // type:object size:0x198 scope:local __vt__29sFStateID_c<14dAcOwindmill_c> = .data:0x00000328; // type:object size:0x34 __global_destructor_chain = .bss:0x00000000; // type:object size:0x4 scope:global -lbl_374_bss_8 = .bss:0x00000008; // type:object size:0x10 scope:local data:4byte -AcOwindmill__STATE_WAIT = .bss:0x00000018; // type:object size:0x40 data:4byte -AcOwindmill__STATE_CAMERA_MOVE = .bss:0x00000058; // type:object size:0x40 data:4byte -AcOwindmill__STATE_MOVE = .bss:0x00000098; // type:object size:0x80 data:4byte -AcOwindmill__STATE_COLLECT_STICK = .bss:0x00000118; // type:object size:0x30 data:4byte +@25601 = .bss:0x00000008; // type:object size:0xC scope:local data:4byte +StateID_Wait__14dAcOwindmill_c = .bss:0x00000018; // type:object size:0x30 data:4byte +@25609 = .bss:0x00000048; // type:object size:0xC scope:local data:4byte +StateID_CameraMove__14dAcOwindmill_c = .bss:0x00000058; // type:object size:0x30 data:4byte +@25613 = .bss:0x00000088; // type:object size:0xC scope:local data:4byte +StateID_Move__14dAcOwindmill_c = .bss:0x00000098; // type:object size:0x30 data:4byte +@25613 = .bss:0x000000C8; // type:object size:0xC scope:local data:4byte +StateID_Collect__14dAcOwindmill_c = .bss:0x000000D8; // type:object size:0x30 data:4byte +@25617 = .bss:0x00000108; // type:object size:0xC scope:local data:4byte +StateID_CollectStick__14dAcOwindmill_c = .bss:0x00000118; // type:object size:0x30 data:4byte diff --git a/config/SOUE01/splits.txt b/config/SOUE01/splits.txt index 92bd82609..0395d3d76 100644 --- a/config/SOUE01/splits.txt +++ b/config/SOUE01/splits.txt @@ -1461,7 +1461,7 @@ d/a/obj/d_a_obj_boomerang.cpp: .sdata start:0x805739D8 end:0x80573A30 .sbss start:0x80575900 end:0x80575908 .sdata2 start:0x8057C0F8 end:0x8057C180 - .bss start:0x805B4BF0 end:0x805B4DD8 + .bss start:0x805B4BE0 end:0x805B4DD8 d/a/obj/d_a_obj_fairy.cpp: .text start:0x80265620 end:0x80268598 align:16 diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index 497938d6c..e397f9ec6 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -3522,7 +3522,7 @@ ActorEventRelated__somethingUpdate = .text:0x8009CCC0; // type:function size:0x1 ActorEventRelated__cutEnd = .text:0x8009CEB0; // type:function size:0x30 ActorEventRelated__getCurrentStepIndex = .text:0x8009CEE0; // type:function size:0x30 getCurrentEventCommand__17ActorEventRelatedCFv = .text:0x8009CF10; // type:function size:0x84 -ActorEventRelated__getSomeEventRelatedNumber = .text:0x8009CFA0; // type:function size:0x80 +getSomeEventRelatedNumber__17ActorEventRelatedFv = .text:0x8009CFA0; // type:function size:0x80 isAdvance__17ActorEventRelatedFv = .text:0x8009D020; // type:function size:0x34 advanceNext__17ActorEventRelatedFv = .text:0x8009D060; // type:function size:0x50 ActorEventRelated__getSingleIntData2 = .text:0x8009D0B0; // type:function size:0x8C @@ -10722,7 +10722,7 @@ fn_8019E200 = .text:0x8019E200; // type:function size:0x18C fn_8019E390 = .text:0x8019E390; // type:function size:0xC getCameraYRot = .text:0x8019E3A0; // type:function size:0x8 fn_8019E3B0__9dCamera_cCFv = .text:0x8019E3B0; // type:function size:0xC -fn_8019E3C0 = .text:0x8019E3C0; // type:function size:0x44 +fn_8019E3C0__9dCamera_cCFv = .text:0x8019E3C0; // type:function size:0x44 fn_8019E410__9dCamera_cFv = .text:0x8019E410; // type:function size:0x1C fn_8019E430__9dCamera_cFv = .text:0x8019E430; // type:function size:0x18 fn_8019E450 = .text:0x8019E450; // type:function size:0x7C @@ -11965,7 +11965,7 @@ fn_801E2DD0 = .text:0x801E2DD0; // type:function size:0x38 fn_801E2E10 = .text:0x801E2E10; // type:function size:0x54 fn_801E2E70 = .text:0x801E2E70; // type:function size:0x74 fn_801E2EF0 = .text:0x801E2EF0; // type:function size:0xD0 -fn_801E2FC0 = .text:0x801E2FC0; // type:function size:0x1A0 +spawnItemHitEffect__7dAcPy_cFRC7mVec3_cRC13cBgS_PolyInfof = .text:0x801E2FC0; // type:function size:0x1A0 isBWheelItemNotRestricted = .text:0x801E3160; // type:function size:0xB0 hasUsableItem = .text:0x801E3210; // type:function size:0x40 fn_801E3250 = .text:0x801E3250; // type:function size:0x78 @@ -12359,7 +12359,7 @@ fn_80202270 = .text:0x80202270; // type:function size:0x170 ActorLink__pushingLog = .text:0x802023E0; // type:function size:0x12C fn_80202510 = .text:0x80202510; // type:function size:0x1A8 ActorLink__logPushed = .text:0x802026C0; // type:function size:0x298 -isObjectFromBeetle = .text:0x80202960; // type:function size:0x13C +Regist__13dReferenceArrFP12dAcObjBase_c = .text:0x80202960; // type:function size:0x13C fn_80202AA0 = .text:0x80202AA0; // type:function size:0x13C fn_80202BE0 = .text:0x80202BE0; // type:function size:0x10 ActorLink__checkBeetleActorReferenceAtIndex = .text:0x80202BF0; // type:function size:0x20 @@ -12411,7 +12411,7 @@ getHeightStateForHeldItem = .text:0x80204920; // type:function size:0x30 ActorLink__canThrowObject = .text:0x80204950; // type:function size:0x4C ActorLink__canRollObject = .text:0x802049A0; // type:function size:0x4C fn_802049F0 = .text:0x802049F0; // type:function size:0x20 -fn_80204A10 = .text:0x80204A10; // type:function size:0x178 +setGuide__7dAcPy_cFP12dAcObjBase_c = .text:0x80204A10; // type:function size:0x178 fn_80204B90 = .text:0x80204B90; // type:function size:0xC ActorLink__relatedToThrowing = .text:0x80204BA0; // type:function size:0x164 fn_80204D10 = .text:0x80204D10; // type:function size:0xA8 @@ -12732,39 +12732,39 @@ fn_8021A970 = .text:0x8021A970; // type:function size:0xFC ActorLink__equipBeetle = .text:0x8021AA70; // type:function size:0x270 fn_8021ACE0 = .text:0x8021ACE0; // type:function size:0x2D8 ActorLink__equipSpawnBeetle = .text:0x8021AFC0; // type:function size:0x80 -fn_8021B040 = .text:0x8021B040; // type:function size:0x20 -getBeetleHeldActor = .text:0x8021B060; // type:function size:0x1C -getBeetleActor = .text:0x8021B080; // type:function size:0x8 -getBeetleFlightTime = .text:0x8021B090; // type:function size:0x50 -getBettleAngle0 = .text:0x8021B0E0; // type:function size:0x28 -getBettleAngle1 = .text:0x8021B110; // type:function size:0x28 -getBeetleWingAngleActive = .text:0x8021B140; // type:function size:0x8 -getBeetleWingAngleInactive = .text:0x8021B150; // type:function size:0x8 -getBeetleNormalSpeed = .text:0x8021B160; // type:function size:0x8 -getBeetleQuickSpeed = .text:0x8021B170; // type:function size:0x8 -getBeetleMaxRange = .text:0x8021B180; // type:function size:0x8 -getBeetleLargeRadius = .text:0x8021B190; // type:function size:0x8 -getBeetleSmallRadius = .text:0x8021B1A0; // type:function size:0x8 -getBeetleMaxHeightOffset = .text:0x8021B1B0; // type:function size:0x8 -getBeetleSmallAngle0 = .text:0x8021B1C0; // type:function size:0x28 -getBeetleSmallAngle1 = .text:0x8021B1F0; // type:function size:0x28 -getBeetleBonkRecoilAngle = .text:0x8021B220; // type:function size:0x28 -getBeetleSmallAngle2 = .text:0x8021B250; // type:function size:0x28 -fn_8021B280 = .text:0x8021B280; // type:function size:0x8 -fn_8021B290 = .text:0x8021B290; // type:function size:0x8 -fn_8021B2A0 = .text:0x8021B2A0; // type:function size:0x8 -getBeetleWarningTimeLeft__7dAcPy_cFv = .text:0x8021B2B0; // type:function size:0x8 -fn_8021B2C0 = .text:0x8021B2C0; // type:function size:0x8 +unkBeetle_8021B040__7dAcPy_cFP12dAcObjBase_c = .text:0x8021B040; // type:function size:0x20 +getBeetleHeldActor__7dAcPy_cCFv = .text:0x8021B060; // type:function size:0x1C +getBeetleActor__7dAcPy_cCFv = .text:0x8021B080; // type:function size:0x8 +getBeetleFlightTime__7dAcPy_cCFv = .text:0x8021B090; // type:function size:0x50 +getBeetleAngle0__7dAcPy_cCFv = .text:0x8021B0E0; // type:function size:0x28 +getBeetleAngle1__7dAcPy_cCFv = .text:0x8021B110; // type:function size:0x28 +getBeetleWingAngleActive__7dAcPy_cCFv = .text:0x8021B140; // type:function size:0x8 +getBeetleWingAngleInactive__7dAcPy_cCFv = .text:0x8021B150; // type:function size:0x8 +getBeetleNormalSpeed__7dAcPy_cCFv = .text:0x8021B160; // type:function size:0x8 +getBeetleQuickSpeed__7dAcPy_cCFv = .text:0x8021B170; // type:function size:0x8 +getBeetleMaxRange__7dAcPy_cCFv = .text:0x8021B180; // type:function size:0x8 +getBeetleLargeRadius__7dAcPy_cCFv = .text:0x8021B190; // type:function size:0x8 +getBeetleSmallRadius__7dAcPy_cCFv = .text:0x8021B1A0; // type:function size:0x8 +getBeetleMaxHeightOffset__7dAcPy_cCFv = .text:0x8021B1B0; // type:function size:0x8 +getBeetleSmallAngle0__7dAcPy_cCFv = .text:0x8021B1C0; // type:function size:0x28 +getBeetleSmallAngle1__7dAcPy_cCFv = .text:0x8021B1F0; // type:function size:0x28 +getBeetleBonkRecoilAngle__7dAcPy_cCFv = .text:0x8021B220; // type:function size:0x28 +getBeetleSmallAngle2__7dAcPy_cCFv = .text:0x8021B250; // type:function size:0x28 +getBeetle_8021B280__7dAcPy_cCFv = .text:0x8021B280; // type:function size:0x8 +getBeetle_8021B290__7dAcPy_cCFv = .text:0x8021B290; // type:function size:0x8 +getBeetle_8021B2A0__7dAcPy_cCFv = .text:0x8021B2A0; // type:function size:0x8 +getBeetleWarningTimeLeft__7dAcPy_cCFv = .text:0x8021B2B0; // type:function size:0x8 +getBeetleUnkTimeLeft__7dAcPy_cCFv = .text:0x8021B2C0; // type:function size:0x8 checkBeetleItemRetrieve = .text:0x8021B2D0; // type:function size:0xAC setBeetleFlashClr__7dAcPy_cFRC6mColor = .text:0x8021B380; // type:function size:0x48 setBeetleBackAnim__7dAcPy_cFv = .text:0x8021B3D0; // type:function size:0x48 -setBeetleReleasedObject = .text:0x8021B420; // type:function size:0x38 +setBeetleReleasedObject__7dAcPy_cFP12dAcObjBase_c = .text:0x8021B420; // type:function size:0x38 getBeetleActorPtr = .text:0x8021B460; // type:function size:0x7C strippedBeetleFunction = .text:0x8021B4E0; // type:function size:0x4 checkUsingBeetleAnim = .text:0x8021B4F0; // type:function size:0x50 startUseBeetle = .text:0x8021B540; // type:function size:0x10 setBeetleMove = .text:0x8021B550; // type:function size:0xA0 -retrieveBeetle = .text:0x8021B5F0; // type:function size:0x90 +retrieveBeetle__7dAcPy_cFv = .text:0x8021B5F0; // type:function size:0x90 shootBeetle = .text:0x8021B680; // type:function size:0x2B8 useBeetle = .text:0x8021B940; // type:function size:0x44 updateBeetle = .text:0x8021B990; // type:function size:0x114 @@ -13131,7 +13131,7 @@ fn_8023B4D0 = .text:0x8023B4D0; // type:function size:0x4C fn_8023B520 = .text:0x8023B520; // type:function size:0x6C fn_8023B590 = .text:0x8023B590; // type:function size:0x70 moveLinkToCoordinatesMaybe = .text:0x8023B600; // type:function size:0x438 -fn_8023BA40 = .text:0x8023BA40; // type:function size:0xAC +fn_8023BA40__7dAcPy_cCF4mAng4mAng = .text:0x8023BA40; // type:function size:0xAC fn_8023BAF0 = .text:0x8023BAF0; // type:function size:0x6C checkMinigameStateBitset = .text:0x8023BB60; // type:function size:0x13C checkInsectCaptureGameState = .text:0x8023BCA0; // type:function size:0x4 @@ -14113,17 +14113,17 @@ retrieve__14dAcBoomerang_cFv = .text:0x80261C20; // type:function size:0x88 doDelete__14dAcBoomerang_cFv = .text:0x80261CB0; // type:function size:0x8 setRoomId__14dAcBoomerang_cFv = .text:0x80261CC0; // type:function size:0x68 placeOnArm__14dAcBoomerang_cFv = .text:0x80261D30; // type:function size:0xDC -fn_80261E10 = .text:0x80261E10; // type:function size:0x338 -fn_80262150 = .text:0x80262150; // type:function size:0x54 -calcBeetleVelocity_y = .text:0x802621B0; // type:function size:0x12C -fn_802622E0 = .text:0x802622E0; // type:function size:0xA4 -fn_80262390 = .text:0x80262390; // type:function size:0x64 -fn_80262400 = .text:0x80262400; // type:function size:0x48C -fn_80262890 = .text:0x80262890; // type:function size:0x22C -fn_80262AC0 = .text:0x80262AC0; // type:function size:0x120 -fn_80262BE0 = .text:0x80262BE0; // type:function size:0x1E0 -fn_80262DC0 = .text:0x80262DC0; // type:function size:0x13C -bonk__14dAcBoomerang_cFv = .text:0x80262F00; // type:function size:0x2C +fn_80261E10__14dAcBoomerang_cFv = .text:0x80261E10; // type:function size:0x338 +fn_80262150__14dAcBoomerang_cFv = .text:0x80262150; // type:function size:0x54 +calcVelocity__14dAcBoomerang_cFv = .text:0x802621B0; // type:function size:0x12C +playFlySound__14dAcBoomerang_cFv = .text:0x802622E0; // type:function size:0xA4 +startHitEffect__14dAcBoomerang_cFRC7mVec3_cRC13cBgS_PolyInfo = .text:0x80262390; // type:function size:0x64 +fn_80262400__14dAcBoomerang_cFv = .text:0x80262400; // type:function size:0x48C +getCollidingPolyInfo__14dAcBoomerang_cFR7mVec3_c = .text:0x80262890; // type:function size:0x22C +tryGrabObject__14dAcBoomerang_cFP12dAcObjBase_c = .text:0x80262AC0; // type:function size:0x120 +deleteCheck__14dAcBoomerang_cFv = .text:0x80262BE0; // type:function size:0x1E0 +fn_80262DC0__14dAcBoomerang_cFv = .text:0x80262DC0; // type:function size:0x13C +startRumble__14dAcBoomerang_cFv = .text:0x80262F00; // type:function size:0x2C setChrAnimation__14dAcBoomerang_cFQ214dAcBoomerang_c14ChrAnimation_e = .text:0x80262F30; // type:function size:0x154 setFlyChrAnimation__14dAcBoomerang_cFQ214dAcBoomerang_c14FlyAnimation_e = .text:0x80263090; // type:function size:0xE4 setRemainingFlightTime__14dAcBoomerang_cFs = .text:0x80263180; // type:function size:0x50 @@ -14148,7 +14148,7 @@ actorExecute__14dAcBoomerang_cFv = .text:0x80264870; // type:function size:0x45C executeState__83sStateMgr_c<14dAcBoomerang_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x80264CD0; // type:function size:0x10 draw__14dAcBoomerang_cFv = .text:0x80264CE0; // type:function size:0x160 create__18dAcBoomerangProc_cFPQ23m3d5mdl_c6mColoriP12mAllocator_c = .text:0x80264E40; // type:function size:0x88 -fn_80264ED0 = .text:0x80264ED0; // type:function size:0x80 +drawOpa__18dAcBoomerangProc_cFv = .text:0x80264ED0; // type:function size:0x80 build__30sFStateFct_c<14dAcBoomerang_c>FRC12sStateIDIf_c = .text:0x80264F50; // type:function size:0x60 dispose__30sFStateFct_c<14dAcBoomerang_c>FRP10sStateIf_c = .text:0x80264FB0; // type:function size:0xC initialize__27sFState_c<14dAcBoomerang_c>Fv = .text:0x80264FC0; // type:function size:0x1C @@ -17863,7 +17863,7 @@ fn_802F25E0 = .text:0x802F25E0; // type:function size:0x19C fn_802F2780__7mQuat_cFRC7mQuat_c = .text:0x802F2780; // type:function size:0x198 fn_802F2920 = .text:0x802F2920; // type:function size:0x48 createProjectionXZ__7mVec3_cFRC7mAng3_cf = .text:0x802F2970; // type:function size:0x110 -mVec__fromXY = .text:0x802F2A80; // type:function size:0xF0 +fromXY__7mVec3_cFRC4mAngRC4mAngf = .text:0x802F2A80; // type:function size:0xF0 normalize__7mVec3_cFv = .text:0x802F2B70; // type:function size:0x78 normalizeRS__7mVec3_cFv = .text:0x802F2BF0; // type:function size:0x84 rotX__7mVec3_cFRC4mAng = .text:0x802F2C80; // type:function size:0xA8 @@ -19795,7 +19795,7 @@ Init__15dBgS_Acch_0x1A8Fv = .text:0x80359B40; // type:function size:0x28 CalcPos__15dBgS_Acch_0x1A8FP7mVec3_c = .text:0x80359B70; // type:function size:0x4C fn_80359BC0 = .text:0x80359BC0; // type:function size:0x84 fn_80359C50 = .text:0x80359C50; // type:function size:0x1C -fn_80359C70 = .text:0x80359C70; // type:function size:0x8 +GetField_0x1C__15dBgS_Acch_0x1A8CFv = .text:0x80359C70; // type:function size:0x8 fn_80359C80 = .text:0x80359C80; // type:function size:0xA0 __ct__9dSndMgr_cFv = .text:0x80359D20; // type:function size:0x9C setup__9dSndMgr_cFPQ23EGG4HeapUl = .text:0x80359DC0; // type:function size:0xEC @@ -36169,7 +36169,7 @@ lbl_805348F8 = .data:0x805348F8; // type:object size:0x30 lbl_80534928 = .data:0x80534928; // type:object size:0x18 lbl_80534940 = .data:0x80534940; // type:object size:0x15C lbl_80534A9C = .data:0x80534A9C; // type:object size:0x34 -AcBoomerang__colliderInit = .data:0x80534AD0; // type:object size:0x30 +sSphSrc__14dAcBoomerang_c = .data:0x80534AD0; // type:object size:0x30 g_profile_BOOMERANG = .data:0x80534B00; // type:object size:0x10 lbl_80534B10 = .data:0x80534B10; // type:object size:0xC data:string lbl_80534B1C = .data:0x80534B1C; // type:object size:0x1C data:string @@ -36179,9 +36179,10 @@ lbl_80534B50 = .data:0x80534B50; // type:object size:0xB data:string __vt__14dAcBoomerang_c = .data:0x80534B60; // type:object size:0x80 __vt__53sFStateMgr_c<14dAcBoomerang_c,20sStateMethodUsr_FI_c> = .data:0x80534BE0; // type:object size:0x30 __vt__83sStateMgr_c<14dAcBoomerang_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c> = .data:0x80534C10; // type:object size:0x30 -__vt__30sFStateFct_c<14dAcBoomerang_c> = .data:0x80534C40; // type:object size:0x18 +__vt__30sFStateFct_c<14dAcBoomerang_c> = .data:0x80534C40; // type:object size:0x14 __vt__27sFState_c<14dAcBoomerang_c> = .data:0x80534C58; // type:object size:0x18 -__vt__18dAcBoomerangProc_c = .data:0x80534C70; // type:object size:0x1D0 +__vt__18dAcBoomerangProc_c = .data:0x80534C70; // type:object size:0x2C +lbl_80534C9C = .data:0x80534C9C; // type:object size:0x1A4 lbl_80534E40 = .data:0x80534E40; // type:object size:0x38 g_profile_OBJ_FAIRY = .data:0x80534E78; // type:object size:0x10 ...data.0 = .data:0x80534E78; // type:label scope:local @@ -52041,13 +52042,20 @@ AcArrow__STATE_MOVE = .bss:0x805B4AE0; // type:object size:0x80 data:4byte AcArrow__STATE_BG_STOP = .bss:0x805B4B60; // type:object size:0x40 data:4byte AcArrow__STATE_BOUND = .bss:0x805B4BA0; // type:object size:0x30 data:4byte lbl_805B4BD0 = .bss:0x805B4BD0; // type:object size:0x10 align:4 data:float -lbl_805B4BE0 = .bss:0x805B4BE0; // type:object size:0x10 -lbl_805B4BF0 = .bss:0x805B4BF0; // type:object size:0xA8 -StateID_Wait__14dAcBoomerang_c = .bss:0x805B4C98; // type:object size:0x40 data:4byte -StateID_Move__14dAcBoomerang_c = .bss:0x805B4CD8; // type:object size:0x40 data:4byte -StateID_MoveCancelWait__14dAcBoomerang_c = .bss:0x805B4D18; // type:object size:0x40 data:4byte -StateID_ReturnWait__14dAcBoomerang_c = .bss:0x805B4D58; // type:object size:0x40 data:4byte -StateID_EventReturnWait__14dAcBoomerang_c = .bss:0x805B4D98; // type:object size:0x40 data:4byte +...bss.0 = .bss:0x805B4BE0; // type:label scope:local +@25908 = .bss:0x805B4BE0; // type:object size:0xC scope:local +sLinChk__14dAcBoomerang_c = .bss:0x805B4BF0; // type:object size:0x98 +@25916 = .bss:0x805B4C88; // type:object size:0xC scope:local +StateID_Wait__14dAcBoomerang_c = .bss:0x805B4C98; // type:object size:0x30 data:4byte +@25920 = .bss:0x805B4CC8; // type:object size:0xC scope:local +StateID_Move__14dAcBoomerang_c = .bss:0x805B4CD8; // type:object size:0x30 data:4byte +@25924 = .bss:0x805B4D08; // type:object size:0xC scope:local +StateID_MoveCancelWait__14dAcBoomerang_c = .bss:0x805B4D18; // type:object size:0x30 data:4byte +@25928 = .bss:0x805B4D48; // type:object size:0xC scope:local +StateID_ReturnWait__14dAcBoomerang_c = .bss:0x805B4D58; // type:object size:0x30 data:4byte +@25932 = .bss:0x805B4D88; // type:object size:0xC scope:local +StateID_EventReturnWait__14dAcBoomerang_c = .bss:0x805B4D98; // type:object size:0x30 data:4byte +@LOCAL@draw__14dAcBoomerang_cFv@shadow = .bss:0x805B4DC8; // type:object size:0x10 scope:local data:4byte @25786 = .bss:0x805B4DD8; // type:object size:0xC scope:local ...bss.0 = .bss:0x805B4DD8; // type:label scope:local StateID_Wait__11dAcOFairy_c = .bss:0x805B4DE8; // type:object size:0x30 data:4byte diff --git a/configure.py b/configure.py index 3062629d1..a288393c3 100644 --- a/configure.py +++ b/configure.py @@ -2437,7 +2437,7 @@ def MatchingFor(*versions): Rel(NonMatching, "d_a_obj_D3_dummy", "REL/d/a/obj/d_a_obj_D3_dummy.cpp"), Rel(NonMatching, "d_a_obj_daynight", "REL/d/a/obj/d_a_obj_daynight.cpp"), Rel(NonMatching, "d_a_obj_decoA", "REL/d/a/obj/d_a_obj_decoA.cpp"), - Rel(NonMatching, "d_a_obj_decoB", "REL/d/a/obj/d_a_obj_decoB.cpp"), + Rel(Matching, "d_a_obj_decoB", "REL/d/a/obj/d_a_obj_decoB.cpp"), Rel(NonMatching, "d_a_obj_desert", "REL/d/a/obj/d_a_obj_desert.cpp"), Rel(NonMatching, "d_a_obj_desert_ago", "REL/d/a/obj/d_a_obj_desert_ago.cpp"), Rel(Matching, "d_a_obj_desert_debris", "REL/d/a/obj/d_a_obj_desert_debris.cpp"), diff --git a/include/d/a/d_a_base.h b/include/d/a/d_a_base.h index 97e33e471..3bf17413b 100644 --- a/include/d/a/d_a_base.h +++ b/include/d/a/d_a_base.h @@ -65,7 +65,7 @@ class dAcBase_c : public dBase_c { AC_PROP_0x100 = (1 << 8), AC_PROP_0x400 = (1 << 10), AC_PROP_0x800 = (1 << 11), - AC_PROP_0x2000000 = (1 << 25), + AC_PROP_0x2000000 = (1 << 25), //< Force Loaded AC_PROP_0x4000000 = (1 << 26), AC_PROP_0x8000000 = (1 << 27), AC_PROP_0x10000000 = (1 << 28), @@ -166,10 +166,14 @@ class dAcBase_c : public dBase_c { return mPosition.distance(to); } - bool checkBeyondRadius(const mVec3_c &point, f32 radius) { + bool checkBeyondRadius(const mVec3_c &point, f32 radius) const { return getSquareDistanceTo(point) > radius; } + bool checkWithinRadius(const mVec3_c &point, f32 radius) const { + return (mPosition - point).squareMagXZ() < radius * radius; + } + u32 getRoomId() { return mRoomID; } diff --git a/include/d/a/d_a_player.h b/include/d/a/d_a_player.h index 04c95e2cc..4c83606c7 100644 --- a/include/d/a/d_a_player.h +++ b/include/d/a/d_a_player.h @@ -4,6 +4,7 @@ #include "common.h" #include "d/a/d_a_base.h" #include "d/a/d_a_item.h" +#include "d/a/obj/d_a_obj_base.h" #include "d/col/c/c_bg_s_poly_info.h" #include "d/d_player_mdl.h" #include "m/m_angle.h" @@ -12,6 +13,14 @@ #include "toBeSorted/file_manager.h" #include "toBeSorted/minigame_mgr.h" +class dReferenceArr { +public: + /** Returns true if pObj is already present or if it was added */ + bool Regist(dAcObjBase_c *pObj); + + dAcRef_c mObjRefs[16]; +}; + // See Below for some info // https://github.com/lepelog/skywardsword-tools/wiki/Player-Actor @@ -33,36 +42,53 @@ class dAcPy_c : public daPlayerModelBase_c { /* vt 0x318 */ virtual void vt_0x318(); protected: - /* 0x137C */ u8 _0x137C[0x16F0 - 0x137C]; + /* 0x137C */ dReferenceArr mOwnedObjects; //< Made up name + /* 0x143C */ u8 _0x143C[0x16F0 - 0x143C]; /* 0x16F0 */ nw4r::g3d::ResFile mHeldResFile; /* 0x16F4 */ u8 _0x16F4[0x4564 - 0x16F4]; /* 0x4564 */ f32 field_0x4564; public: // Beetle Functions [0x8021AA70 - 0x8021BE20] - s16 getBeetleFlightTime(); - mAng getBeetleAngle0(); - mAng getBeetleAngle1(); - f32 getBeetleWingAngleActive(); - f32 getBeetleWingAngleInactive(); - f32 getBeetleNormalSpeed(); - f32 getBeetleQuickSpeed(); - f32 getBeetleMaxRange(); - f32 getBeetleLargeRadius(); - f32 getBeetleSmallRadius(); - f32 getBeetleMaxHeightOffset(); - mAng getBeetleSmallAngle0(); - mAng getBeetleSmallAngle1(); - mAng getBeetleBonkRecoilAngle(); - mAng getBeetleSmallAngle2(); + mAng fn_8023BA40(mAng p1, mAng p2) const; + bool unkBeetle_8021B040(dAcObjBase_c *); + s16 getBeetleFlightTime() const; + mAng getBeetleAngle0() const; + mAng getBeetleAngle1() const; + f32 getBeetleWingAngleActive() const; + f32 getBeetleWingAngleInactive() const; + f32 getBeetleNormalSpeed() const; + f32 getBeetleQuickSpeed() const; + f32 getBeetleMaxRange() const; + f32 getBeetleLargeRadius() const; + f32 getBeetleSmallRadius() const; + f32 getBeetleMaxHeightOffset() const; + mAng getBeetleSmallAngle0() const; + mAng getBeetleSmallAngle1() const; + mAng getBeetleBonkRecoilAngle() const; + mAng getBeetleSmallAngle2() const; + f32 getBeetle_8021B280() const; + f32 getBeetle_8021B290() const; + u8 getBeetle_8021B2A0() const; void setBeetleFlashClr(const mColor &); void setBeetleBackAnim(); - s32 getBeetleWarningTimeLeft(); + int getBeetleWarningTimeLeft() const; + s16 getBeetleUnkTimeLeft() const; + void setBeetleReleasedObject(dAcObjBase_c *pObj); + bool retrieveBeetle(); + + // Responsible for taking in some collision Poly Info and playing the related effect. + // Used on Impact + static void spawnItemHitEffect(const mVec3_c &position, const cBgS_PolyInfo &polyInfo, f32 scale); // Item select/equip/use functions [0x801E3160 - 0x801E7AD0] ? static s32 calcItemWheelSelection(bool reset, s32 numOptions); public: + dReferenceArr &getOwnedObjects() { + return mOwnedObjects; + } + f32 getField_0x4564() const { return field_0x4564; } @@ -128,6 +154,7 @@ class dAcPy_c : public daPlayerModelBase_c { static u32 getCurrentHealthCapacity(); + void setGuide(dAcObjBase_c *); bool canDowseProbably() const; mAng fn_8023B520() const; diff --git a/include/d/a/obj/d_a_obj_base.h b/include/d/a/obj/d_a_obj_base.h index 3deba1ae1..d6e5ac76b 100644 --- a/include/d/a/obj/d_a_obj_base.h +++ b/include/d/a/obj/d_a_obj_base.h @@ -29,7 +29,7 @@ class dAcObjBase_c : public dAcBase_c { enum ObjProperties_e { OBJ_PROP_0x1 = (1 << 0), OBJ_PROP_0x2 = (1 << 1), - OBJ_PROP_0x4 = (1 << 2), + OBJ_PROP_0x4 = (1 << 2), //< Attached to Clawshot OBJ_PROP_0x8 = (1 << 3), OBJ_PROP_0x10 = (1 << 4), OBJ_PROP_0x20 = (1 << 5), @@ -39,7 +39,7 @@ class dAcObjBase_c : public dAcBase_c { OBJ_PROP_0x200 = (1 << 9), OBJ_PROP_0x400 = (1 << 10), OBJ_PROP_0x800 = (1 << 11), - OBJ_PROP_0x1000 = (1 << 12), + OBJ_PROP_0x1000 = (1 << 12), //< Attached to Whip OBJ_PROP_0x2000 = (1 << 13), OBJ_PROP_0x4000 = (1 << 14), OBJ_PROP_0x8000 = (1 << 15), diff --git a/include/d/a/obj/d_a_obj_bomb.h b/include/d/a/obj/d_a_obj_bomb.h index 02c95f3c0..5f02010e2 100644 --- a/include/d/a/obj/d_a_obj_bomb.h +++ b/include/d/a/obj/d_a_obj_bomb.h @@ -46,10 +46,10 @@ class dAcBomb_c : public dAcObjBase_c { void setTransformFromFlower(const mMtx_c &); - void Off_0xA3C(u32 mask) { + void unsetField0xA3C(u32 mask) { field_0xA3C &= ~mask; } - void On_0xA3C(u32 mask) { + void setField0xA3C(u32 mask) { field_0xA3C |= mask; } diff --git a/include/d/a/obj/d_a_obj_boomerang.h b/include/d/a/obj/d_a_obj_boomerang.h index f1658c810..1a726282b 100644 --- a/include/d/a/obj/d_a_obj_boomerang.h +++ b/include/d/a/obj/d_a_obj_boomerang.h @@ -6,12 +6,14 @@ #include "d/a/obj/d_a_obj_base.h" #include "d/col/bg/d_bg_s_acch.h" #include "d/col/bg/d_bg_s_lin_chk.h" +#include "d/col/c/c_bg_s_poly_info.h" #include "d/col/cc/d_cc_d.h" #include "d/d_shadow.h" #include "d/lyt/d_lyt_fader.h" #include "m/m3d/m_anmchr.h" #include "m/m3d/m_anmchrblend.h" #include "m/m3d/m_mdl.h" +#include "m/m_angle.h" #include "m/m_color.h" #include "m/m_fader.h" #include "m/m_vec.h" @@ -105,34 +107,33 @@ class dAcBoomerang_c : public dAcObjBase_c { RB_FLY_FAST = 1, RB_FLY_MAX = 2, }; - static const char *sFlyChrAnims[RB_FLY_MAX]; enum Flags_e { /* 0x00000001 */ FLAG_CANCEL_1 = 1 << 0, /* 0x00000002 */ FLAG_CANCEL_2 = 1 << 1, /* 0x00000003 */ FLAG_CANCEL = FLAG_CANCEL_1 | FLAG_CANCEL_2, - /* 0x00000004 */ FLAG_RELEASE_ITEM = 1 << 2, - /* 0x00000008 */ FLAG_0x8 = (0x8), - /* 0x00000010 */ FLAG_0x10 = (0x10), - /* 0x00000020 */ FLAG_0x20 = (0x20), - /* 0x00000040 */ FLAG_0x40 = (0x40), - /* 0x00000080 */ FLAG_0x80 = (0x80), - /* 0x00000100 */ FLAG_STOP_TIMER_ACTIVE = (0x100), - /* 0x00000200 */ FLAG_DROP_ITEM = (0x200), // related to 0x400 - /* 0x00000400 */ FLAG_REQUEST_0x400 = (0x400), // related to 0x200 - /* 0x00000800 */ FLAG_REQUEST_MOVE = (0x800), - /* 0x00001000 */ FLAG_CONTROLLABLE = (0x1000), - /* 0x00002000 */ FLAG_0x2000 = (0x2000), - /* 0x00004000 */ FLAG_RUMBLE_ACTIVE = (0x4000), - /* 0x00008000 */ FLAG_WING_EFFECT_ACTIVE = (0x8000), - /* 0x00010000 */ FLAG_0x10000 = (0x10000), - /* 0x00020000 */ FLAG_0x20000 = (0x40000), - /* 0x00040000 */ FLAG_0x40000 = (0x40000), - /* 0x00080000 */ FLAG_0x80000 = (0x80000), - - /* 0x0001A117 */ FLAG_COMMON_INIT = FLAG_0x10000 | FLAG_WING_EFFECT_ACTIVE | FLAG_0x2000 | - FLAG_STOP_TIMER_ACTIVE | FLAG_0x10 | FLAG_RELEASE_ITEM | FLAG_CANCEL, + /* 0x00000004 */ FLAG_RELEASE_OBJECT = 1 << 2, + /* 0x00000008 */ FLAG_0x8 = 1 << 3, + /* 0x00000010 */ FLAG_0x10 = 1 << 4, + /* 0x00000020 */ FLAG_0x20 = 1 << 5, + /* 0x00000040 */ FLAG_0x40 = 1 << 6, + /* 0x00000080 */ FLAG_0x80 = 1 << 7, + /* 0x00000100 */ FLAG_STOP_TIMER_ACTIVE = 1 << 8, + /* 0x00000200 */ FLAG_DROP_ITEM = 1 << 9, // related to 0x400 + /* 0x00000400 */ FLAG_REQUEST_0x400 = 1 << 10, // related to 0x200 + /* 0x00000800 */ FLAG_REQUEST_MOVE = 1 << 11, + /* 0x00001000 */ FLAG_CONTROLLABLE = 1 << 12, + /* 0x00002000 */ FLAG_0x2000 = 1 << 13, + /* 0x00004000 */ FLAG_RUMBLE_ACTIVE = 1 << 14, + /* 0x00008000 */ FLAG_SPEED_UP = 1 << 15, + /* 0x00010000 */ FLAG_0x10000 = 1 << 16, + /* 0x00020000 */ FLAG_0x20000 = 1 << 17, + /* 0x00040000 */ FLAG_0x40000 = 1 << 18, + /* 0x00080000 */ FLAG_0x80000 = 1 << 19, + + /* 0x0001A117 */ FLAG_COMMON_INIT = FLAG_0x10000 | FLAG_SPEED_UP | FLAG_0x2000 | FLAG_STOP_TIMER_ACTIVE | + FLAG_0x10 | FLAG_RELEASE_OBJECT | FLAG_CANCEL, }; public: // INLINES @@ -149,6 +150,10 @@ class dAcBoomerang_c : public dAcObjBase_c { return mStateMgr.isState(StateID_Move); } + static const s32 getSrcFlags() { + return 0x209B; + } + public: // FUNCTIONS void areaCallback(mVec3_c *param1, u32 param2); void atHitCallback(cCcD_Obj *i_objInfA, dAcObjBase_c *i_actorB, cCcD_Obj *i_objInfB); @@ -171,8 +176,35 @@ class dAcBoomerang_c : public dAcObjBase_c { /** Updates the position based on where links wrist is */ void placeOnArm(); + /** */ + void fn_80261E10(); + + /** */ + void fn_80262150(); + + /** */ + void calcVelocity(); + + /** */ + void playFlySound(); + + /** */ + void startHitEffect(const mVec3_c &position, const cBgS_PolyInfo &polyInfo); + + /** */ + bool fn_80262400(); + + /** Gets the colliding position and the poly info of where collision happened. Returns a nullptr on no collision */ + cBgS_PolyInfo *getCollidingPolyInfo(mVec3_c &position); + + /** */ + void fn_80262BE0(); + + /** */ + void fn_80262DC0(); + /** Sets the assuming bonk flag and plays the rumble feedback */ - void bonk(); + void startRumble(); /** Applies the selected animation to the beetle */ void setChrAnimation(ChrAnimation_e requestedAnimation); @@ -190,8 +222,8 @@ class dAcBoomerang_c : public dAcObjBase_c { /* 0x0330 */ nw4r::g3d::ResFile mResFile; /* 0x0334 */ m3d::mdl_c mMdl; /* 0x0358 */ m3d::anmChrBlend_c mAnmChrBlend; -#define BOOMERANG_ANIM_PINCERS (0) -#define BOOMERANG_ANIM_WINGS (1) +#define BOOMERANG_ANIM_PINCERS 0 +#define BOOMERANG_ANIM_WINGS 1 /* 0x0380 */ m3d::anmChr_c mAnmChr[2]; /* 0 - Pincers, 1 - Wings*/ /* 0x03F0 */ dAcBoomerangProc_c mProc; /* 0x0410 */ dShadowCircle_c mShadow; @@ -208,19 +240,16 @@ class dAcBoomerang_c : public dAcObjBase_c { /* 0x08B5 */ u8 mWindNodeID; /* 0x08B6 */ u8 mLeftWingNodeID; /* 0x08B7 */ u8 mRightWingNodeID; - /* 0x08B8 */ mAng field_0x8B8; - /* 0x08BA */ mAng field_0x8BA; - /* 0x08BC */ mAng field_0x8BC; - /* 0x08BE */ mAng field_0x8BE; - /* 0x08C0 */ u8 _0x8C0[0x8C8 - 0x8C0]; - /* 0x08CA */ mAng field_0x8C8; + /* 0x08B8 */ mAng3_c field_0x8B8; + /* 0x08BE */ mAng3_c field_0x8BE; + /* 0x08C4 */ mAng3_c field_0x8C4; /* 0x08CA */ u16 mRemainingFlightTime; /* 0x08CC */ u32 field_0x8CC; /* 0x08D0 */ f32 field_0x8D0; /* 0x08D4 */ f32 field_0x8D4; /* 0x08D8 */ mVec3_c field_0x8D8; /* 0x08E4 */ mVec3_c field_0x8E4; - /* 0x08F0 */ mVec3_c field_0x8F0; + /* 0x08F0 */ mVec3_c mBounceVelocity; /* 0x08FC */ dCcD_Sph mSph0; /* 0x0A4C */ dCcD_Sph mSph1; /* 0x0B9C */ dEmitter_c mEff0; @@ -232,10 +261,8 @@ class dAcBoomerang_c : public dAcObjBase_c { /* 0x1150 */ u8 _0x1150[0x115C - 0x1150]; /* 0x115C */ STATE_MGR_DECLARE(dAcBoomerang_c); - static const u32 BoomerangAtFlags; - static dCcD_SrcSph sSphSrc; + static const dCcD_SrcSph sSphSrc; static dBgS_BeetleLinChk sLinChk; - static const u32 sSrcAtType; }; #endif diff --git a/include/d/col/bg/d_bg_s_acch.h b/include/d/col/bg/d_bg_s_acch.h index 0d12de5dc..d04f7e5f9 100644 --- a/include/d/col/bg/d_bg_s_acch.h +++ b/include/d/col/bg/d_bg_s_acch.h @@ -9,6 +9,8 @@ #include "d/col/c/c_m3d_g_cyl.h" #include "d/col/c/c_m3d_g_lin.h" #include "d/col/c/c_m3d_g_pla.h" +#include "m/m_angle.h" +#include "m/m_vec.h" class dAcObjBase_c; @@ -107,11 +109,13 @@ struct dBgS_Acch_0x1A8 { u8 field_0x00; mVec3_c field_0x04; mVec3_c field_0x10; + mVec3_c field_0x1C; dBgS_Acch_0x1A8(); void Init(); void CalcPos(mVec3_c *); + const mVec3_c &GetField_0x1C() const; }; class dBgS; @@ -568,7 +572,6 @@ class dBgS_Acch : public cBgS_Chk, public dBgS_Chk { /* 0x0E8 */ f32 field_0x0E8; /* 0x0EC */ dBgS_SphChk mSph; /* 0x1A8 */ dBgS_Acch_0x1A8 field_0x1A8; - /* 0x1C4 */ u8 _0[0x1D0 - 0x1C4]; /* 0x1D0 */ f32 field_0x1D0; /* 0x1D4 */ dBgS_GndChk mGnd; /* 0x264 */ dBgS_RoofChk mRoof; diff --git a/include/d/d_camera.h b/include/d/d_camera.h index ef2cf73d4..b0816f956 100644 --- a/include/d/d_camera.h +++ b/include/d/d_camera.h @@ -55,6 +55,7 @@ class dCamera_c : public dBase_c { bool isUnderwater() const; f32 getUnderwaterDepth() const; + bool fn_8019E3C0() const; void fn_8019E430(); void fn_8019E410(); diff --git a/include/d/d_linkage.h b/include/d/d_linkage.h index fd6fcc39f..dd2ac187f 100644 --- a/include/d/d_linkage.h +++ b/include/d/d_linkage.h @@ -19,15 +19,15 @@ class dLinkage_c { public: enum ConnectionType_e { CONNECTION_0 = 0, - CONNECTION_1 = 1, + CONNECTION_1 = 1, // Standard CONNECTION_2 = 2, CONNECTION_3 = 3, - CONNECTION_4 = 4, - CONNECTION_5 = 5, - CONNECTION_6 = 6, - CONNECTION_7 = 7, - CONNECTION_8 = 8, - CONNECTION_9 = 9, + CONNECTION_4 = 4, // clawshot + CONNECTION_5 = 5, // Beetle + CONNECTION_6 = 6, // From Sword Swing? + CONNECTION_7 = 7, // Whip + CONNECTION_8 = 8, // Arrow/Heartf + CONNECTION_9 = 9, // Chandelier/lotus flower }; enum State_e { STATE_0 = 0, @@ -71,9 +71,9 @@ class dLinkage_c { public: void set(u32 flags, f32, f32, f32, void *unk); bool tryAttach(dAcObjBase_c *, dAcObjBase_c *, dAcRefBase_c *, ConnectionType_e, bool); - void fn_80050DC0(dAcObjBase_c *, f32, f32, mAng); - void fn_80050E00(dAcObjBase_c *, f32, f32, mAng); - void fn_80050E40(dAcObjBase_c *, f32, f32, mAng); + void fn_80050DC0(dAcObjBase_c *, f32 speed, f32 velocityY, mAng rotY); + void fn_80050E00(dAcObjBase_c *, f32 speed, f32 velocityY, mAng rotY); + void fn_80050E40(dAcObjBase_c *, f32 speed, f32 velocityY, mAng rotY); void fn_80050EA0(dAcObjBase_c *); void fn_800511E0(dAcObjBase_c *); void bushTpFunc(dBgS_Acch &); @@ -88,8 +88,8 @@ class dLinkage_c { /* 0x14 */ ConnectionType_e mType; /* 0x18 */ u16 field_0x18; /* 0x1A */ u16 field_0x1A; - /* 0x1C */ f32 field_0x1C; - /* 0x20 */ f32 field_0x20; + /* 0x1C */ f32 field_0x1C; // Used as Y + /* 0x20 */ f32 field_0x20; // Used as Z /* 0x24 */ f32 field_0x24; /* 0x28 */ mMtx_c carryTransMtx; /* 0x58 */ mMtx_c field_0x58; diff --git a/include/d/d_pad.h b/include/d/d_pad.h index 9c20a6c94..d6815679d 100644 --- a/include/d/d_pad.h +++ b/include/d/d_pad.h @@ -189,11 +189,11 @@ class ex_c { return mFSStickMaskChanged && (mFSStickMask & 0xFF) != 0; } - const mVec3_c& getMPLSVelocity() const { + const mVec3_c &getMPLSVelocity() const { return mMPLSVelocity; } - const mVec2_c& getDpdPosScreen() const { + const mVec2_c &getDpdPosScreen() const { return mDpdPosScreen; } diff --git a/include/d/d_player_act.h b/include/d/d_player_act.h index cf1c92364..af340eef1 100644 --- a/include/d/d_player_act.h +++ b/include/d/d_player_act.h @@ -251,8 +251,8 @@ class daPlayerActBase_c : public daPlBase_c { /* vt 0x1C0 */ virtual void *vt_0x1C0() const { return nullptr; } - /* vt 0x1C4 */ virtual UNKWORD getActorInActorRef1() { - return 0; + /* vt 0x1C4 */ virtual dAcObjBase_c *getActorInActorRef1() { + return nullptr; } /* vt 0x1C8 */ virtual bool doesActorRef1Exist() { return false; diff --git a/include/m/m_angle.h b/include/m/m_angle.h index 3fb0ca39f..a3e27fe18 100644 --- a/include/m/m_angle.h +++ b/include/m/m_angle.h @@ -17,11 +17,14 @@ struct mAng { mVal = val; return *this; } - void setF(const f32 &f) { mVal = f; } + mAng &operator=(const mAng &val) { + mVal = val.mVal; + return *this; + } static mAng atan2s(f32 a, f32 b) { return mAng(cM::atan2s(a, b)); } @@ -62,13 +65,25 @@ struct mAng { return *this; } - s32 absDiff(const mAng &other) const { - return sLib::absDiff(mVal, other.mVal); + mAng operator*(const mAng &ang) const { + return mVal * ang.mVal; + } + mAng operator*(const f32 f) const { + return mVal * f; + } + mAng operator*(const s32 ang) const { + return mVal * ang; } static s32 abs(const mAng b) { return labs(b); } + s32 abs() const { + return mAng::abs(*this); + } + s32 absDiff(const mAng &other) const { + return sLib::absDiff(mVal, other.mVal); + } s32 step(s16 target, s32 steps, s16 max, s16 min); @@ -202,6 +217,11 @@ class mAng3_c { void addY(f32 val) { y.mVal += (s16)val; } + // TODO - This is the only way I could get the regswap to be fixed.. + // Found with the pattern mAng3_c.z += cM::rnd() + void addZ(f32 val) { + z.mVal += (s16)val; + } void addX(const s32 &fx) { x += fx; diff --git a/include/m/m_fader.h b/include/m/m_fader.h index afa508d73..5825afb3d 100644 --- a/include/m/m_fader.h +++ b/include/m/m_fader.h @@ -20,6 +20,10 @@ class mFader_c { return isStatus(mFaderBase_c::FADED_IN) || isStatus(mFaderBase_c::FADED_OUT); } + bool isActive() const { + return isStatus(mFaderBase_c::FADING_IN) || isStatus(mFaderBase_c::FADING_OUT); + } + mFaderBase_c::EStatus getStatus() const { return mpFader->getStatus(); } @@ -31,6 +35,9 @@ class mFader_c { void fadeIn() { mpFader->fadeIn(); } + void fadeOut() { + mpFader->fadeOut(); + } bool calc() { return mpFader->calc(); } diff --git a/src/JSystem/JParticle/JPAResource.cpp b/src/JSystem/JParticle/JPAResource.cpp index d678396e7..0048a8a27 100644 --- a/src/JSystem/JParticle/JPAResource.cpp +++ b/src/JSystem/JParticle/JPAResource.cpp @@ -1114,8 +1114,8 @@ void JPAResource::calcWorkData_c(JPAEmitterWorkData* work) { Mtx local_scl_mtx, local_rot_mtx, global_mtx; MTXScale(local_scl_mtx, work->mpEmtr->mLocalScl.x, work->mpEmtr->mLocalScl.y, work->mpEmtr->mLocalScl.z); - JPAGetXYZRotateMtx(work->mpEmtr->mLocalRot.x * 182, work->mpEmtr->mLocalRot.y * 182, - work->mpEmtr->mLocalRot.z * 182, local_rot_mtx); + JPAGetXYZRotateMtx(work->mpEmtr->mLocalRot.x * (s32)182, work->mpEmtr->mLocalRot.y * (s32)182, + work->mpEmtr->mLocalRot.z * (s32)182, local_rot_mtx); MTXScale(global_mtx, work->mpEmtr->mGlobalScl.x, work->mpEmtr->mGlobalScl.y, work->mpEmtr->mGlobalScl.z); MTXConcat(work->mpEmtr->mGlobalRot, global_mtx, global_mtx); @@ -1137,8 +1137,8 @@ void JPAResource::calcWorkData_c(JPAEmitterWorkData* work) { * calcWorkData_d__11JPAResourceFP18JPAEmitterWorkData */ void JPAResource::calcWorkData_d(JPAEmitterWorkData* work) { Mtx mtx; - JPAGetXYZRotateMtx(work->mpEmtr->mLocalRot.x * 0xB6, work->mpEmtr->mLocalRot.y * 0xB6, - work->mpEmtr->mLocalRot.z * 0xB6, mtx); + JPAGetXYZRotateMtx(work->mpEmtr->mLocalRot.x * (s32)182, work->mpEmtr->mLocalRot.y * (s32)182, + work->mpEmtr->mLocalRot.z * (s32)182, mtx); MTXConcat(work->mpEmtr->mGlobalRot, mtx, work->mGlobalRot); MTXMultVecSR(work->mGlobalRot, work->mpEmtr->mLocalDir, work->mGlobalEmtrDir); } 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 4d22b39e0..af2259e50 100644 --- a/src/REL/d/a/e/d_a_e_sm.cpp +++ b/src/REL/d/a/e/d_a_e_sm.cpp @@ -1094,8 +1094,8 @@ bool dAcEsm_c::fn_187_4B50() { if (mBombRef.isLinked()) { dAcBomb_c *pBomb = mBombRef.get(); if (pBomb) { - pBomb->On_0xA3C(0x4); - pBomb->Off_0xA3C(0x800000); + pBomb->setField0xA3C(0x4); + pBomb->unsetField0xA3C(0x800000); mBombRef.unlink(); } diff --git a/src/REL/d/a/obj/d_a_obj_decoB.cpp b/src/REL/d/a/obj/d_a_obj_decoB.cpp index d707da2cc..063923f9b 100644 --- a/src/REL/d/a/obj/d_a_obj_decoB.cpp +++ b/src/REL/d/a/obj/d_a_obj_decoB.cpp @@ -3,6 +3,7 @@ #include "common.h" #include "d/a/d_a_player.h" #include "f/f_base.h" +#include "m/m_angle.h" #include "m/m_vec.h" #include "nw4r/g3d/res/g3d_resfile.h" #include "nw4r/g3d/res/g3d_resmdl.h" @@ -53,17 +54,19 @@ f32 dAcODecoB_c::lbl_611_data_34 = 0.95f; void dAcODecoB_c::executeState_Wait() { if (dAcPy_c::GetLink() != nullptr && dAcPy_c::GetLink()->checkFlags0x350(0x2000)) { - mVec3_c deltaPosition = dAcPy_c::GetLink()->mPosition - mPosition; - f32 distance = EGG::Math::sqrt(deltaPosition.squareMagXZ()); + f32 distance = (dAcPy_c::GetLink()->mPosition - mPosition).absXZ(); distance = (2000.0f - distance) / 2000.0f; if (distance < 0.0f) { distance = 0.0f; } - field_0x38E = distance * 2048.0f; + field_0x38E = distance * 2048.f; } - field_0x38E -= mRotation.x * 0.05f; - field_0x38E = field_0x38E * lbl_611_data_34; - mRotation.x += field_0x38E; + + mAng rot = mRotation.x; + + field_0x38E -= s32(0.05f * rot); + field_0x38E *= lbl_611_data_34; + mRotation.x = rot + field_0x38E; } const f32 dAcODecoB_c::lbl_611_rodata_30 = 2000.0f; diff --git a/src/REL/d/t/d_t_action.cpp b/src/REL/d/t/d_t_action.cpp index 0bab0b68a..357ada996 100644 --- a/src/REL/d/t/d_t_action.cpp +++ b/src/REL/d/t/d_t_action.cpp @@ -52,7 +52,7 @@ int dTgAction_c::actorExecute() { } if (pObj->mProfileName == fProfile::BOMB) { if (checkIfVec3fInMatrix(mActiveMtx, pObj->getPosition())) { - reinterpret_cast(pObj)->On_0xA3C(0x20000000); + reinterpret_cast(pObj)->setField0xA3C(0x20000000); } } } diff --git a/src/d/a/obj/d_a_obj_boomerang.cpp b/src/d/a/obj/d_a_obj_boomerang.cpp index fa9018936..d7f0a26aa 100644 --- a/src/d/a/obj/d_a_obj_boomerang.cpp +++ b/src/d/a/obj/d_a_obj_boomerang.cpp @@ -2,43 +2,59 @@ #include "c/c_math.h" #include "common.h" +#include "d/a/d_a_item.h" #include "d/a/d_a_player.h" #include "d/a/obj/d_a_obj_base.h" +#include "d/a/obj/d_a_obj_bomb.h" #include "d/col/bg/d_bg_s.h" #include "d/col/bg/d_bg_s_lin_chk.h" +#include "d/col/c/c_bg_s_poly_info.h" #include "d/col/c/c_cc_d.h" +#include "d/col/cc/d_cc_s.h" #include "d/d_pad.h" -#include "d/d_player_act.h" +#include "d/d_room.h" #include "d/d_rumble.h" +#include "d/d_sc_game.h" +#include "d/d_stage.h" #include "d/snd/d_snd_wzsound.h" +#include "egg/gfx/eggDrawGX.h" #include "f/f_base.h" #include "f/f_profile_name.h" #include "m/m3d/m_anmchr.h" #include "m/m3d/m_fanm.h" +#include "m/m_angle.h" #include "m/m_color.h" #include "m/m_fader_base.h" #include "m/m_mtx.h" #include "m/m_quat.h" #include "m/m_vec.h" #include "nw4r/g3d/g3d_anmchr.h" +#include "nw4r/g3d/g3d_obj.h" #include "nw4r/g3d/res/g3d_resanmchr.h" #include "nw4r/g3d/res/g3d_resmdl.h" #include "nw4r/g3d/res/g3d_resshp.h" +#include "nw4r/math/math_triangular.h" +#include "rvl/GX/GXLight.h" +#include "rvl/GX/GXPixel.h" #include "rvl/GX/GXTypes.h" #include "s/s_Math.h" #include "s/s_State.hpp" #include "toBeSorted/d_emitter.h" #include "toBeSorted/event_manager.h" +// copy from d_a_obj_fairy - TODO move it to a shared file +inline static void vecCylCalc(mVec3_c &target, const mAng &rot, f32 factor) { + target.x += factor * rot.sin(); + target.z += factor * rot.cos(); +} + dBgS_BeetleLinChk dAcBoomerang_c::sLinChk; -dCcD_SrcSph dAcBoomerang_c::sSphSrc = { - {{AT_TYPE_BEETLE, BoomerangAtFlags, {4, 0, 0}, 0, 1, 0, 0, 0}, - {~AT_TYPE_COMMON0, 0x291, {0, 0, 0x407}, 0, 0}, - {0x28}}, +const dCcD_SrcSph dAcBoomerang_c::sSphSrc = { + {/* mObjAt */ {AT_TYPE_BEETLE, dAcBoomerang_c::getSrcFlags(), {4, 0, 0}, 0, 1, 0, 0, 0}, + /* mObjTg */ {~AT_TYPE_COMMON0, 0x291, {0, 0, 0x407}, 0, 0}, + /* mObjCo */ {0x28}}, {15.f} }; -const u32 dAcBoomerang_c::BoomerangAtFlags = 0x209B; -; SPECIAL_ACTOR_PROFILE(BOOMERANG, dAcBoomerang_c, fProfile::BOOMERANG, 0x125, 0, 0x4); @@ -100,7 +116,7 @@ void dAcBoomerang_c::atHitCallback(cCcD_Obj *i_objInfA, dAcObjBase_c *i_actorB, setChrAnimation(RB_CUT); // I think this plays the vibration and drops the object - bonk(); + startRumble(); } } @@ -261,7 +277,7 @@ int dAcBoomerang_c::doDelete() { } void dAcBoomerang_c::setRoomId() { - if (mAcch.GetGroundH() != 1e-9f) { + if (mAcch.GetGroundH() != -1e9f) { mRoomID = dBgS::GetInstance()->GetRoomId(mAcch.GetGnd()); } else if (mRoomID == -1) { mRoomID = dAcPy_c::GetLink2()->mRoomID; @@ -288,16 +304,332 @@ const dAcBoomerang_c::ChrAnimation_t dAcBoomerang_c::sChrAnims[dAcBoomerang_c::R { "RB_Back", 3.f}, }; -// ... +void dAcBoomerang_c::fn_80261E10() { + mWorldMtx.transS(mPosition); + if (checkField_0x8CC(FLAG_CANCEL_1)) { + mWorldMtx.YrotM(field_0x8C4.y); + mWorldMtx.XrotM(field_0x8C4.x); + mWorldMtx.YrotM(-field_0x8C4.y); + } + if (!cM::isZero(field_0x8D0)) { + mVec3_c z = mVec3_c::Ez * field_0x8D0; + z.rotY(field_0x8BE.z); + z += mVec3_c::Ey; + + mMtx_c m; + m.makeRotationFromVecs(mVec3_c::Ey, z, 1.f); + field_0x8D0 *= dAcPy_c::GetLink2()->getBeetle_8021B290(); + + field_0x8BE.addZ(6372.f + cM::rndF(2731.f)); + + mWorldMtx += m; + } + + mWorldMtx.ZXYrotM(mRotation); + mMdl.setLocalMtx(mWorldMtx); + + mSph1.OffAt_0x40(); + if (mSph1.ChkAtHit() || mSph0.ChkAtHit()) { + dLightEnv_c::GetPInstance()->setBPM8_Type6(&mPosition); + } + + dAcObjBase_c *pActor = mGrabbedActor.get(); + if (pActor != nullptr) { + mWorldMtx.multVec(mVec3_c(0.f, 0.f, pActor->getLinkage().field_0x20), pActor->mPosition); + + f32 f = pActor->getLinkage().field_0x1C; // TODO Maybe Inline + pActor->mPosition.y -= f; + pActor->mRotation.y = mRotation.y + field_0x8BE.y; + + mMtx_c m; + m.ZXYrotS(mRotation); + m.YrotM(-mRotation.y); + pActor->getLinkage().carryTransMtx = m; + + if (pActor->mProfileName == fProfile::BOMB) { + if (mSph1.ChkAtHit()) { + static_cast(pActor)->setField0xA3C(0x4); + static_cast(pActor)->unsetField0xA3C(0x800000); + } + mSph1.OnAt_0x40(); + } + } +} + +void dAcBoomerang_c::fn_80262150() { + unsetField_0x8CC(FLAG_CONTROLLABLE | FLAG_0x80000 | FLAG_0x20000); + mRemainingFlightTime = 0; + mFlashTimer = 0; + deleteCheck(); + executeTimeWarning(); +} + +void dAcBoomerang_c::calcVelocity() { + dAcPy_c *player = dAcPy_c::GetLink2(); + + f32 speed; + if (checkField_0x8CC(FLAG_SPEED_UP)) { + speed = player->getBeetleQuickSpeed(); + } else { + speed = player->getBeetleNormalSpeed(); + } + + if (!EventManager::isInEvent() && player->hasBeetleVariantOrBetter(HOOK_BEETLE) && dPad::getDownZ()) { + speed *= 0.7f; + } + + sLib::addCalc(&mSpeed, speed, 0.5f, 30.f, 3.f); + + field_0x8E4.copyFrom(mVelocity); // Idk why this inline was used + mVelocity.fromXY(mAngle.x, mAngle.y, mSpeed); + + if (mVelocity.y > 0.f) { + mVelocity *= 0.7f; + } +} + +void dAcBoomerang_c::playFlySound() { + dAcPy_c *player = dAcPy_c::GetLink2(); + + f32 param = cM::minMaxLimit( + (mSpeed - player->getBeetleNormalSpeed()) / (player->getBeetleQuickSpeed() - player->getBeetleNormalSpeed()), + 0.f, 1.f + ); + + holdSoundWithFloatParam(SE_BE_FLY_LV, param); +} + +void dAcBoomerang_c::startHitEffect(const mVec3_c &position, const cBgS_PolyInfo &polyInfo) { + dAcPy_c::spawnItemHitEffect(position, polyInfo, 0.8f); + startBgHitSound(SE_BE_HIT, polyInfo, &position); +} + +bool dAcBoomerang_c::fn_80262400() { + dAcPy_c *player = dAcPy_c::GetLink2(); + + mVec3_c collidingPosition; + cBgS_PolyInfo *pCollidingPolyInfo = getCollidingPolyInfo(collidingPosition); + + s16 warningTimeAmount = player->getBeetleWarningTimeLeft(); + if (!checkField_0x8CC(FLAG_STOP_TIMER_ACTIVE) || (checkField_0x8CC(FLAG_0x80) && mRemainingFlightTime > 60)) { + if (checkField_0x8CC(FLAG_0x20 | FLAG_0x80)) { + field_0x8B4++; + + s16 time; + if (checkField_0x8CC(FLAG_0x20)) { + time = 30; + mRemainingFlightTime -= 5; + } else { + time = 60; + } + + if (field_0x8B4 >= player->getBeetleUnkTimeLeft()) { + mRemainingFlightTime = time; + mFlashTimer = time; + } + + } else { + field_0x8B4 = 0; + } + } + + // My assumption here is checking to see if it enters an unloaded room. + dRoom_c *pRoom = dStage_c::GetInstance()->getRoom(mRoomID); + if (pRoom != nullptr && pRoom->checkFlag(0x4)) { + if (mRemainingFlightTime > 60) { + mRemainingFlightTime = 60; + mFlashTimer = 60; + } + } + + // Deal Stage collision Check + if (pCollidingPolyInfo != nullptr && dBgS::GetInstance()->ChkPolySafe(*pCollidingPolyInfo)) { + bool through = dBgS::GetInstance()->GetPolyObjectThrough(*pCollidingPolyInfo); + + mVec3_c normal = dBgS_GetN(*pCollidingPolyInfo); + mVec3_c invVel = mVelocity * -1.f; + invVel.normalize(); + + if (through) { + if (mRemainingFlightTime > warningTimeAmount) { + mRemainingFlightTime -= 5; + if (mRemainingFlightTime < warningTimeAmount) { + mRemainingFlightTime = warningTimeAmount; + } + } + } else if (invVel.dot(normal) < nw4r::math::CosIdx(0x2000) /* 45 deg*/ && + dBgS::GetInstance()->GetSpecialCode(*pCollidingPolyInfo) != POLY_ATTR_LAVA && + (!mAcch.ChkGndHit() || !mAcch.ChkRoofHit())) { + if (field_0x8D0 < 0.1f) { + // 0.35f + field_0x8D0 = player->getBeetle_8021B280(); + + startHitEffect(collidingPosition, *pCollidingPolyInfo); + + mBounceVelocity = normal * 8.f; + field_0x8D4 = 1.f; + + startRumble(); + if (mRemainingFlightTime > 200) { + mRemainingFlightTime -= 200; + } else { + mRemainingFlightTime = 0; + } + } + } else { + field_0x8D8 = normal; + startHitEffect(collidingPosition, *pCollidingPolyInfo); + setField_0x8CC(FLAG_CANCEL); + + mStateMgr.changeState(StateID_MoveCancelWait); + // Ends the Flight + return true; + } + } + + // Deal with Object Collision ? + if (mSph1.ChkTgHit()) { + mVec3_c &hitPos = mSph1.GetTgHitPos(); + + // Calculate Object Hit direction + field_0x8D8 = mOldPosition - hitPos; + field_0x8D8.y = 0.f; + + // Use Rotation if just a tap + if (cM::isZero(field_0x8D8.normalize())) { + field_0x8D8.set(-mAngle.y.sin(), 0.f, -mAngle.y.cos()); + } + + field_0x8D8 *= mVelocity.absXZ(); + field_0x8D8.y = -mVelocity.y; + field_0x8D8.normalize(); + + setField_0x8CC(FLAG_CANCEL); + + mStateMgr.changeState(StateID_MoveCancelWait); + // Ends the Flight + return true; + } + + // Do not End the flight + return false; +} + +cBgS_PolyInfo *dAcBoomerang_c::getCollidingPolyInfo(mVec3_c &outPos) { + if (mAcch.ChkWallHit(nullptr)) { + mVec3_c dir = mVec3_c::Zero; + + vecCylCalc(dir, mAcchCir.GetWallAngleY(), 1.f); + + mVec3_c end = mPosition; + end -= dir * 100.f; + + sLinChk.Set(&mPosition, &end, nullptr); + + if (dBgS::GetInstance()->LineCross(&sLinChk)) { + outPos = sLinChk.GetLinEnd(); + return &sLinChk; + } else { + outPos = mPosition; + return &mAcchCir; + } + } + + if (mAcch.ChkGndHit()) { + outPos.set(mPosition.x, mAcch.GetGroundH(), mPosition.z); + return &mAcch.mGnd; + } + + if (mAcch.ChkRoofHit()) { + outPos.set(mPosition.x, mAcch.GetRoofHeight(), mPosition.z); + return &mAcch.mRoof; + } + + if (mAcch.field_0x1A8.field_0x00 != 0) { + const mVec3_c &v = mAcch.field_0x1A8.GetField_0x1C(); + outPos.set(v.x, v.y, v.z); + return &mAcch.mSph; + } + + return nullptr; +} bool dAcBoomerang_c::tryGrabObject(dAcObjBase_c *pObj) { dAcPy_c *player = dAcPy_c::GetLink2(); - if (checkField_0x8CC(FLAG_CONTROLLABLE) && getLinkage().checkFlag(0x80)) {} + + // Check Controllable and some other flag + if ((checkField_0x8CC(FLAG_CONTROLLABLE) && pObj->getLinkage().checkFlag(0x80)) + // Check Active status - Not active or has Connection 9 + && (!pObj->getLinkage().checkState(dLinkage_c::STATE_ACTIVE) || + pObj->getLinkage().checkConnection(dLinkage_c::CONNECTION_9)) + // Check to make sure there is no obnject linked and is not related to player + && (!mGrabbedActor.isLinked() && pObj != player->getActorInActorRef1()) && + pObj->getLinkage().tryAttach(pObj, this, &mGrabbedActor, dLinkage_c::CONNECTION_5, true)) { + field_0x8BE.y = pObj->mRotation.y - mRotation.y; + player->setGuide(pObj); + unsetField_0x8CC(FLAG_SPEED_UP); + setField_0x8CC(FLAG_DROP_ITEM); + startSound(SE_BE_CATCH_OBJECT); + setFlyChrAnimation(RB_FLY); + return true; + } + + return false; +} + +void dAcBoomerang_c::deleteCheck() { + if (checkField_0x8CC(FLAG_DROP_ITEM)) { + setField_0x8CC(FLAG_REQUEST_0x400); + return; + } + + dAcObjBase_c *pObj = mGrabbedActor.get(); + if (pObj == nullptr) { + return; + } + + dAcPy_c *player = dAcPy_c::GetLink2(); + player->getOwnedObjects().Regist(pObj); + if (dBgS_ObjLinChk::LineCross(&mOldPosition, &pObj->mPosition, nullptr)) { + mVec3_c diff = mOldPosition - pObj->mPosition; + diff.normalize(); + + pObj->mPosition = dBgS_ObjLinChk::GetInstance().GetLinEnd() + diff * 15.f; + pObj->mOldPosition = pObj->mPosition + diff * 15.f; + } else { + pObj->mOldPosition.x = mOldPosition.x; + pObj->mOldPosition.z = mOldPosition.z; + } + + pObj->getLinkage().fn_80050DC0(pObj, 20.f, 0.f, mRotation.y); + dRoom_c *pRoom = dStage_c::GetInstance()->getRoom(mRoomID); + if (pRoom && pRoom->checkFlag(0x4) && pObj->getConnectParent() == pRoom) { + pObj->deleteRequest(); + } } -// ... +void dAcBoomerang_c::fn_80262DC0() { + dAcPy_c *player = dAcPy_c::GetLink2(); + + if (EventManager::isInEvent()) { + mStateMgr.changeState(StateID_EventReturnWait); + } else if (player->retrieveBeetle()) { + fn_80261E10(); + if (mStateMgr.isState(StateID_Move)) { + startSound(SE_BE_CATCH); + mStateMgr.changeState(StateID_Wait); + } else { + mStateMgr.changeState(StateID_ReturnWait); + } + } else { + deleteRequest(); + } + + player->unlinkActorRef1(); + deleteCheck(); +} -void dAcBoomerang_c::bonk() { +void dAcBoomerang_c::startRumble() { if (checkField_0x8CC(FLAG_RUMBLE_ACTIVE)) { return; } @@ -333,9 +665,8 @@ void dAcBoomerang_c::setChrAnimation(dAcBoomerang_c::ChrAnimation_e requestedAni mMdl.setAnm(mAnmChrBlend, sChrAnims[requestedAnimation].mRate); } -// HELP: I need this to be const to fix the load, but I cant do that without ruining sdata -const char *dAcBoomerang_c::sFlyChrAnims[RB_FLY_MAX] = {"RB_Fly", "RB_FlyFast"}; void dAcBoomerang_c::setFlyChrAnimation(FlyAnimation_e requestedAnimation) { + static const char *sFlyChrAnims[dAcBoomerang_c::RB_FLY_MAX] = {"RB_Fly", "RB_FlyFast"}; nw4r::g3d::ResAnmChr resAnmChr = mResFile.GetResAnmChr(sFlyChrAnims[requestedAnimation]); mAnmChr[BOOMERANG_ANIM_WINGS].setAnm(mMdl, resAnmChr, m3d::PLAY_MODE_4); nw4r::g3d::AnmObjChr *pAnmObj = static_cast(mAnmChr[BOOMERANG_ANIM_WINGS].getAnimObj()); @@ -406,7 +737,7 @@ void dAcBoomerang_c::initializeState_Move() { mAnmChrBlend.setWeight(1, 1.f); setFlyChrAnimation(RB_FLY); field_0x8B1 = 45; // 1.5 seconds if that means anything - field_0x8C8 = 0; + field_0x8C4.z = 0; dAcPy_c *player = dAcPy_c::GetLink2(); mSpeed = player->getBeetleNormalSpeed(); @@ -417,38 +748,375 @@ void dAcBoomerang_c::initializeState_Move() { mRemainingFlightTime = player->getBeetleFlightTime(); mFlashTimer = player->getBeetleWarningTimeLeft(); - unsetField_0x8CC(FLAG_REQUEST_MOVE | FLAG_WING_EFFECT_ACTIVE | FLAG_0x10000); + unsetField_0x8CC(FLAG_REQUEST_MOVE | FLAG_SPEED_UP | FLAG_0x10000); setField_0x8CC(FLAG_CONTROLLABLE | FLAG_0x80000); mAngle.x = 2000 - player->vt_0x198(); - - mRotation.x.set(-mAngle.x); - mRotation.y.set(mAngle.y); - mRotation.z.set(0); + mRotation.set(-mAngle.x, mAngle.y, mAng(0)); // wtf? field_0x8B2 = 0; - mOldPosition = mPosition; + mOldPosition = player->mPosition; mOldPosition.y += 60.f; - field_0x8BC = dPad::ex_c::m_current_ex->mMPLS.getVerticalAngle(); - field_0x8BA = dPad::ex_c::m_current_ex->mMPLS.getHorizontalAngle(); - field_0x8B8 = daPlayerActBase_c::fn_8005BAA0(); - - // TODO regswap - field_0x8BE = mAngle.x - dPad::ex_c::m_current_ex->mMPLS.getVerticalAngle(); + field_0x8B8.z = dPad::ex_c::getInstance()->mMPLS.getVerticalAngle(); + field_0x8B8.y = dPad::ex_c::getInstance()->mMPLS.getHorizontalAngle(); + field_0x8B8.x = dAcPy_c::fn_8005BAA0(); + field_0x8BE.x = (mAngle.x - dPad::ex_c::getInstance()->mMPLS.getVerticalAngle()); field_0x8E4.fromXY(mAngle.x, mAngle.y, mSpeed); startSound(SE_BE_THROW); dJEffManager_c::spawnUIEffect(PARTICLE_RESOURCE_ID_MAPPING_3_, mVec3_c::Zero, nullptr, nullptr, nullptr, nullptr); - field_0x8F0 = mVec3_c::Zero; + mBounceVelocity = mVec3_c::Zero; field_0x8D4 = 0.0f; } -void dAcBoomerang_c::executeState_Move() {} + +void dAcBoomerang_c::executeState_Move() { + dAcPy_c *player = dAcPy_c::GetLink2(); + + // Check for collision and adjust flight time as needed + // If it collides with something and stops, the function will return true + if (fn_80262400()) { + return; + } + + // Reset the Pincer Animation when complete + if (mAnmChr[BOOMERANG_ANIM_PINCERS].isStop() && (mCurrentAnimation == RB_HOLD_ED || mCurrentAnimation == RB_CUT)) { + setChrAnimation(RB_DEFAULT); + } + + // Reset the Animation in the case of no longer holding an object + if (mCurrentAnimation == RB_HOLD && !mGrabbedActor.isLinked()) { + setChrAnimation(RB_DEFAULT); + } + + // Reduce the flught time (1 per frame). The Collision check may reduce further + if (mRemainingFlightTime != 0) { + mRemainingFlightTime--; + } + + if (field_0x8B1 != 0) { + if (--field_0x8B1 == 0) { + field_0x8B4 = 0; + } + } + + if (checkField_0x8CC(FLAG_CONTROLLABLE)) { + if (!EventManager::isInEvent()) { + // Check for dropping item -> No longer moving + if (mGrabbedActor.isLinked() && dPad::getDownZ() && dPad::getDownTrigA()) { + setField_0x8CC(FLAG_RELEASE_OBJECT); + player->setBeetleReleasedObject(mGrabbedActor.get()); + startSound(SE_BE_RELEASE_OBJECT); + mStateMgr.changeState(StateID_MoveCancelWait); + return; + } + + setField_0x8CC(FLAG_0x40000); + if (checkField_0x8CC(FLAG_SPEED_UP)) { + // Any condition that will prevent the beetle from speeding up + if (!dPad::getDownA() || mGrabbedActor.isLinked() || dPad::getDownZ()) { + startSound(SE_BE_SPEED_DOWN); + unsetField_0x8CC(FLAG_SPEED_UP); + setFlyChrAnimation(RB_FLY); + } + } else { + if (player->hasBeetleVariantOrBetter(QUICK_BEETLE) && !mGrabbedActor.isLinked() && !dPad::getDownZ() && + dScGame_c::getCamera(0)->fn_8019E3C0() && dPad::getDownA()) { + startSound(SE_BE_SPEED_UP); + setField_0x8CC(FLAG_SPEED_UP); + setFlyChrAnimation(RB_FLY_FAST); + mEff1.startEffect( + PARTICLE_RESOURCE_ID_MAPPING_4_, mVec3_c::Zero, nullptr, nullptr, nullptr, nullptr + ); + } + } + } + } else { + // In the case of no longer being controlled Stop speed up + unsetField_0x8CC(FLAG_SPEED_UP); + } + + const f32 maxRange = player->getBeetleMaxRange(); + const f32 heightDiff = mPosition.y - player->mPosition.y; + + // In range is within collection range for beetle to return to player + bool inRange = field_0x8B1 == 0; + if (inRange) { + inRange = player->checkWithinRadius(mPosition, mSph0.GetR()); + } + if (inRange) { + f32 r = mSph0.GetR(); + inRange = heightDiff > -r; + } + if (inRange) { + f32 r = mSph0.GetR(); + inRange = heightDiff < r + 3500.f; + } + + if (checkField_0x8CC(FLAG_CONTROLLABLE)) { + if ( + mRemainingFlightTime == 0 // Check End of Flight + || inRange // Change In Range of player + || !player->hasvt_0x1C0() // ?? + || checkField_0x8CC(FLAG_0x20000) // ?? + || (EventManager::isInEvent() && !checkField_0x8CC(FLAG_0x40)) // ?? + || (mPosition.squareDistance(player->mPosition) > maxRange * maxRange) // Outside of Max Range + || (!EventManager::isInEvent() && dPad::getDownTrigB()) // Pressing B while not in Event + ) { + if (inRange || EventManager::isInEvent() || checkField_0x8CC(FLAG_0x20000)) { + if (inRange) { + dAcObjBase_c *pObj = mGrabbedActor.get(); + if (pObj != nullptr) { + if (pObj->mProfileName == fProfile::ITEM) { + static_cast(pObj)->getItemFromBWheelItem(); + } else if (pObj->getLinkage().checkFlag(0x8000)) { + player->unkBeetle_8021B040(pObj); + } + } + } + fn_80262150(); + fn_80262DC0(); + } else { + if (!EventManager::isInEvent() && dPad::getDownTrigB()) { + startSound(SE_BE_CALL_BACK); + } + setField_0x8CC(FLAG_CANCEL_2); + mStateMgr.changeState(StateID_MoveCancelWait); + } + return; + } + } + + if (checkField_0x8CC(FLAG_CONTROLLABLE)) { + mAng ang0Min, ang0Max; + mAng ang1Min, ang1Max; + mAng3_c angTmp; + u32 maxFlightTime; + s32 usedTime; + + ang0Min = ang0Max = player->getBeetleAngle0(); + ang1Min = ang1Max = player->getBeetleAngle1(); + maxFlightTime = player->getBeetleFlightTime(); + + usedTime = (maxFlightTime - mRemainingFlightTime) - 5; + + mAng angle, rotation; + if (usedTime <= 0) { + setField_0x8CC(FLAG_0x80000); + } else { + unsetField_0x8CC(FLAG_0x80000); + f32 f = nw4r::ut::Min(usedTime * (1.f / 60.f), 1.f); + + if (EventManager::isInEvent()) { + angle = mAngle.x; + rotation = mRotation.z; + } else { + // HELPPPPP + mAng a = -player->fn_8023BA40(field_0x8B8.x, field_0x8B8.y); + mAng b = player->getBeetleSmallAngle0(); + if (mAng::abs(a) < b) { + a = 0; + } else if (a > 0) { + a = b - a; + } else { + a = b + a; + } + rotation = a; + + a = angTmp.x = dPad::ex_c::getInstance()->mMPLS.mZ.atan2sY_XZ(); + a += field_0x8BE.x; + b = player->getBeetleSmallAngle1(); + if (mAng::abs(a) < b) { + a = 0; + } else if (a > 0) { + a = b - a; + } else { + a = b + a; + } + angle = a; + } + + sLib::addCalcAngle( + mAngle.x.ref(), cM::minMaxLimit(angle, -ang0Min, ang0Max), 5, f * 2000.f, f * 100.f + ); + sLib::addCalcAngle( + mRotation.z.ref(), cM::minMaxLimit(rotation, -ang1Min, ang1Max), 5, f * 2000.f, f * 100.f + ); + + f32 f2; + if (checkField_0x8CC(FLAG_SPEED_UP)) { + f2 = player->getBeetleWingAngleActive(); + } else { + f2 = player->getBeetleWingAngleInactive(); + } + mAngle.y -= f2 * mRotation.z; + + mRotation.x = -mAngle.x; + mRotation.y = mAngle.y; + + s32 tmp; + tmp = rotation.abs(); + if (tmp > 0x400) { + sLib::addCalcAngle(field_0x8B8.x.ref(), 0, 5, tmp >> 2, tmp >> 8); + sLib::addCalcAngle(field_0x8B8.y.ref(), 0, 5, tmp >> 2, tmp >> 8); + } + tmp = mAng(field_0x8B8.z - angTmp.x).abs(); + if (tmp > 0x400) { + sLib::addCalcAngle(field_0x8BE.x.ref(), 0, 5, tmp >> 2, tmp >> 8); + } + } + executeTimeWarning(); + } + + calcVelocity(); + playFlySound(); + + mPosition += (mVelocity * (1.f - field_0x8D4)) + (mBounceVelocity * field_0x8D4); + + if (mPosition.y > player->mPosition.y + player->getBeetleMaxHeightOffset()) { + setRemainingFlightTime(-1); + } + + fn_80261E10(); + + if (!EventManager::isInEvent()) { + mSph0.SetR(player->getBeetleLargeRadius()); + mVec3_c dir = mPosition - mOldPosition; + mSph0.setCenterAndAtVec(mPosition, dir); + mSph1.setCenterAndAtVec(mPosition, dir); + if (mRemainingFlightTime < player->getBeetleFlightTime() - 2) { + if (!mGrabbedActor.isLinked()) { + dCcS::GetInstance()->Set(&mSph0); + } else { + mSph0.ClrAtHit(); + } + dCcS::GetInstance()->GetMassMng().SetObj(&mSph0, 1); + dCcS::GetInstance()->GetMassMng().SetArea(&mSph0, 1, dAcBoomerang_areaCallback); + } + player->registMassObj(&mSph1, 1); + } else { + mSph0.ClrAtHit(); + mSph1.ClrAtHit(); + } +} void dAcBoomerang_c::finalizeState_Move() {} -void dAcBoomerang_c::initializeState_MoveCancelWait() {} -void dAcBoomerang_c::executeState_MoveCancelWait() {} +void dAcBoomerang_c::initializeState_MoveCancelWait() { + dAcPy_c *player = dAcPy_c::GetLink2(); + + playFlySound(); + unsetField_0x8CC(FLAG_SPEED_UP); + setChrAnimation(RB_HOLD_ED); + + // If canceling due to bonk + if (checkField_0x8CC(FLAG_CANCEL_1)) { + f32 mult = (0.5f * mVelocity.mag()); + mVelocity = field_0x8D8 * mult; + field_0x8C4.y = mVelocity.atan2sX_Z(); + field_0x8C4.x = field_0x8C4.z = player->getBeetleBonkRecoilAngle(); + + startRumble(); + } + + // I think the below function is responsible for giving the item to link + deleteCheck(); + + // Set Fly Animation + if (checkField_0x8CC(FLAG_CANCEL)) { + setFlyChrAnimation(RB_FLY_FAST); + } else { + setFlyChrAnimation(RB_FLY); + } + + if (field_0x8B2 == 0) { + if (mAcch.ChkGndHit() && mAcch.ChkRoofHit() && + (dBgS::GetInstance()->ChkMoveBG(mAcch.GetGnd(), true) || + dBgS::GetInstance()->ChkMoveBG(mAcch.GetRoof(), true))) { + field_0x8B2 = 0; + } else { + field_0x8B2 = player->getBeetle_8021B2A0(); + } + } + if (checkField_0x8CC(FLAG_CANCEL_2)) { + // 0.35f + field_0x8D0 = player->getBeetle_8021B280(); + field_0x8BE.z = mVelocity.atan2sX_Z(); + } + + fn_80261E10(); +} +void dAcBoomerang_c::executeState_MoveCancelWait() { + executeTimeWarning(); + + dAcPy_c *player = dAcPy_c::GetLink2(); + if (mAnmChr[BOOMERANG_ANIM_PINCERS].isStop()) { + setChrAnimation(RB_DEFAULT); + } + + mPosition += (1.f - field_0x8D4) * mVelocity + field_0x8D4 * mBounceVelocity; + + if (checkField_0x8CC(FLAG_CANCEL_2)) { + mVelocity *= 0.9f; + holdSound(SE_BE_FLY_TOTTER_LV); + } else { + playFlySound(); + s32 r; + if (mRotation.z >= 0) { + r = player->getBeetleAngle1(); + } else { + r = player->getBeetleAngle1(); + r = -r; // Ok + } + + sLib::addCalcAngle(mRotation.z.ref(), r, 5, 2000, 100); + + mAngle.y -= mRotation.z * player->getBeetleWingAngleActive(); + + sLib::addCalc(&mSpeed, player->getBeetleNormalSpeed(), 0.5f, 30.f, 3.f); + calcVelocity(); + + if (fn_80262400()) { + return; + } + } + + if (field_0x8C4.z > player->getBeetleSmallAngle2()) { + field_0x8C4.z -= player->getBeetleSmallAngle2(); + } else { + field_0x8C4.z = 0; + } + + field_0x8C4.x += field_0x8C4.z; + fn_80261E10(); + + bool fadedOut = false; + if (field_0x8B2 == 0 || (!player->doesActorRef1Exist() && checkField_0x8CC(FLAG_RELEASE_OBJECT))) { + if (mFader.isStatus(mFaderBase_c::FADED_OUT)) { + fadedOut = true; + } else if (!mFader.isActive()) { + if (EventManager::isInEvent()) { + fn_80262150(); + fn_80262DC0(); + } else { + mFader.setFrame(5); + mFader.fadeOut(); + } + } + } + + if (fadedOut || !player->hasvt_0x1C0() || checkField_0x8CC(FLAG_0x20000)) { + fn_80262150(); + fn_80262DC0(); + return; + } + + if (checkField_0x8CC(FLAG_0x10 | FLAG_CANCEL_1) || !checkField_0x8CC(FLAG_RELEASE_OBJECT)) { + if (field_0x8B2 != 0) { + field_0x8B2--; + } + } +} void dAcBoomerang_c::finalizeState_MoveCancelWait() {} void dAcBoomerang_c::initializeState_EventReturnWait() { @@ -459,11 +1127,17 @@ void dAcBoomerang_c::initializeState_EventReturnWait() { unsetField_0x8CC(FLAG_COMMON_INIT); } -void dAcBoomerang_c::executeState_EventReturnWait() {} +void dAcBoomerang_c::executeState_EventReturnWait() { + if (EventManager::isInEvent()) { + return; + } + fn_80262DC0(); +} void dAcBoomerang_c::finalizeState_EventReturnWait() {} void dAcBoomerang_c::executeTimeWarning() { s16 timeLimit = dAcPy_c::GetLink2()->getBeetleWarningTimeLeft(); + mColor flashClr(0, 0, 0, 0xFF); if (mRemainingFlightTime <= timeLimit) { @@ -501,11 +1175,12 @@ int dAcBoomerang_c::actorExecute() { if (checkField_0x8CC(FLAG_REQUEST_0x400)) { unsetField_0x8CC(FLAG_REQUEST_0x400); + deleteCheck(); } if (player->checkModelUpdateFlag(0x10000 | 0x80)) { deleteRequest(); - unsetField_0x8CC(FLAG_REQUEST_0x400); + unsetField_0x8CC(FLAG_DROP_ITEM); return SUCCEEDED; } @@ -531,12 +1206,12 @@ int dAcBoomerang_c::actorExecute() { mMdl.getNodeWorldMtxMultVecZero(0, mPositionCopy2); mPositionCopy3 = mPositionCopy2; - if (checkField_0x8CC(FLAG_WING_EFFECT_ACTIVE)) { + if (checkField_0x8CC(FLAG_SPEED_UP)) { mEff0.holdEffect(PARTICLE_RESOURCE_ID_MAPPING_6_, mWorldMtx, nullptr, nullptr); mEff1.setTransform(mWorldMtx); f32 ang = field_0x8E4.angle(mVelocity); - ang = 10.f - mAng::fromRad(ang) * (7.f / 256.f); + ang = 10.f - ((f32)mAng::fromRad(ang) * (7.f / 256.f)); ang = nw4r::ut::Max(ang, 3.f); mEff1.setAwayFromCenterSpeed(ang); } else { @@ -544,9 +1219,7 @@ int dAcBoomerang_c::actorExecute() { } if (field_0x8B1 == 0 && (mStateMgr.isState(StateID_Move) || mStateMgr.isState(StateID_MoveCancelWait))) { - mEff2.holdEffect( - PARTICLE_RESOURCE_ID_MAPPING_5_, player->getPosition(), nullptr, nullptr, nullptr, nullptr - ); + mEff2.holdEffect(PARTICLE_RESOURCE_ID_MAPPING_5_, player->getPosition(), nullptr, nullptr, nullptr, nullptr); } else { mEff2.remove(true); } @@ -584,3 +1257,12 @@ bool dAcBoomerangProc_c::create(m3d::mdl_c *mdl, mColor clr, int prioOpa, mAlloc mClr = clr; return true; } + +void dAcBoomerangProc_c::drawOpa() { + EGG::DrawGX::ResetMaterial(EGG::DrawGX::COLORCHAN_1); + GXSetZMode(GX_TRUE, GX_GREATER, GX_FALSE); + GXSetChanMatColor(GX_COLOR0A0, mClr); + + u32 info = nw4r::g3d::RESMDL_DRAWMODE_IGNORE_MATERIAL | nw4r::g3d::RESMDL_DRAWMODE_FORCE_LIGHTOFF; + mpMdl->getG3dObject()->G3dProc(nw4r::g3d::G3dObj::G3DPROC_DRAW_OPA, 0, &info); +} diff --git a/src/d/d_player_mdl.cpp b/src/d/d_player_mdl.cpp index 06ebc427a..680c1dc24 100644 --- a/src/d/d_player_mdl.cpp +++ b/src/d/d_player_mdl.cpp @@ -1222,10 +1222,10 @@ void daPlayerModelBase_c::adjustMainModelWorldMtx(PlayerMainModelNode_e nodeId, } else if (nodeId == PLAYER_MAIN_NODE_BACKBONE_1) { transformBackbone1(result); applyWorldRotationMaybe( - result, field_0x1268 >> 1, field_0x126A * 0.4f + getArmZRot(2), field_0x126C, nullptr, false + result, field_0x1268 >> 1, 0.4f * field_0x126A + getArmZRot(2), field_0x126C, nullptr, false ); } else if (nodeId == PLAYER_MAIN_NODE_BACKBONE_2) { - applyWorldRotationMaybe(result, field_0x1268 >> 1, field_0x126A * 0.6f + getArmZRot(2), 0, nullptr, false); + applyWorldRotationMaybe(result, field_0x1268 >> 1, 0.6f * field_0x126A + getArmZRot(2), 0, nullptr, false); } else if (nodeId == PLAYER_MAIN_NODE_FSKIRT_L1 && *field_0x136C != 0) { mVec3_c v; vt_0x30C(v);