From d9e22fe76db024e8f6b9ecddf174892147ad493a Mon Sep 17 00:00:00 2001 From: CovenEsme <84377742+CovenEsme@users.noreply.github.com> Date: Fri, 24 May 2024 14:37:17 +0100 Subject: [PATCH] Expand dAcBase work --- config/SOUE01/splits.txt | 4 + config/SOUE01/symbols.txt | 50 +- configure.py | 1 + include/MSL_C/math.h | 1 + include/UnknownTypeBelongings.h | 2 +- include/d/a/d_a_base.h | 49 +- include/d/a/obj/d_a_obj_base.h | 15 + include/d/d_player.h | 12 + include/m/m_angle.h | 2 + include/toBeSorted/event.h | 22 + include/toBeSorted/file_manager.h | 2 +- include/toBeSorted/misc_flag_managers.h | 79 ++++ include/toBeSorted/room_manager.h | 86 +++- include/toBeSorted/scgame.h | 25 + include/toBeSorted/special_item_drop_mgr.h | 20 + src/d/a/d_a_base.cpp | 503 ++++++++++++++++++--- src/d/d_player.cpp | 3 + src/toBeSorted/file_manager.cpp | 2 +- src/toBeSorted/misc_flag_managers.cpp | 72 +-- src/toBeSorted/scgame.cpp | 5 + src/toBeSorted/special_item_drop_mgr.cpp | 114 +++++ 21 files changed, 882 insertions(+), 187 deletions(-) create mode 100644 include/d/d_player.h create mode 100644 include/toBeSorted/event.h create mode 100644 include/toBeSorted/misc_flag_managers.h create mode 100644 include/toBeSorted/scgame.h create mode 100644 include/toBeSorted/special_item_drop_mgr.h create mode 100644 src/d/d_player.cpp create mode 100644 src/toBeSorted/scgame.cpp create mode 100644 src/toBeSorted/special_item_drop_mgr.cpp diff --git a/config/SOUE01/splits.txt b/config/SOUE01/splits.txt index fdd52647..12e7156d 100644 --- a/config/SOUE01/splits.txt +++ b/config/SOUE01/splits.txt @@ -145,6 +145,10 @@ toBeSorted/skipflag_manager.cpp: .sbss start:0x80575408 end:0x8057540C .bss start:0x805A9C68 end:0x805A9C88 +toBeSorted/special_item_drop_mgr.cpp: + .text start:0x800C7B60 end:0x800C82B0 + .sbss start:0x80575438 end:0x80575440 + toBeSorted/counters/counter.cpp: .text start:0x8016CC40 end:0x8016CD94 diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index 5250ad05..dfe6eb41 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -1030,12 +1030,12 @@ createHeap__9dAcBase_cFv = .text:0x8002C3A0; // type:function size:0x8 __ct__9dAcBase_cFv = .text:0x8002C3B0; // type:function size:0x178 __dt__7dBase_cFv = .text:0x8002C530; // type:function size:0x58 __dt__9dAcBase_cFv = .text:0x8002C590; // type:function size:0xB4 -setTempCreateParams__9dAcBase_cFP7mVec3_cP7mAng3_cP7mVec3_ciUlP9dAcBase_cUcsUcP7ObjInfo = .text:0x8002C650; // type:function size:0x34 +setTempCreateParams__9dAcBase_cFP7mVec3_cP7mAng3_cP7mVec3_clUlP9dAcBase_cUcsUcP7ObjInfo = .text:0x8002C650; // type:function size:0x34 FUN_8002c690__9dAcBase_cFv = .text:0x8002C690; // type:function size:0x78 initAllocatorWork1Heap__9dAcBase_cFiPci = .text:0x8002C710; // type:function size:0xC initAllocator__9dAcBase_cFiPcPQ23EGG4Heapi = .text:0x8002C720; // type:function size:0x8C -addActorToRoom__9dAcBase_cFi = .text:0x8002C7B0; // type:function size:0x88 -setBit_field_0xE8__9dAcBase_cFi = .text:0x8002C840; // type:function size:0x18 +addActorToRoom__9dAcBase_cFl = .text:0x8002C7B0; // type:function size:0x88 +setBit_field_0xE8__9dAcBase_cFl = .text:0x8002C840; // type:function size:0x18 actorCreate__9dAcBase_cFv = .text:0x8002C860; // type:function size:0x8 actorPostCreate__9dAcBase_cFv = .text:0x8002C870; // type:function size:0x8 create__9dAcBase_cFv = .text:0x8002C880; // type:function size:0x70 @@ -1049,20 +1049,20 @@ postExecute__9dAcBase_cFQ27fBase_c12MAIN_STATE_e = .text:0x8002CCC0; // type:fun unkVirtFunc_0x5C__9dAcBase_cFv = .text:0x8002CE90; // type:function size:0x4 unkVirtFunc_0x60__9dAcBase_cFv = .text:0x8002CEA0; // type:function size:0x4 restorePosRotFromCopy__9dAcBase_cFv = .text:0x8002CEB0; // type:function size:0x58 -itemDroppingAndGivingRelated__9dAcBase_cFP5Vec3fi = .text:0x8002CF10; // type:function size:0x80 +itemDroppingAndGivingRelated__9dAcBase_cFP7mVec3_ci = .text:0x8002CF10; // type:function size:0x80 fillUpperParams2Byte__9dAcBase_cFv = .text:0x8002CF90; // type:function size:0x10 getParams2_ignoreLower__9dAcBase_cFv = .text:0x8002CFA0; // type:function size:0xC setParams2Upper_ignoreLower__9dAcBase_cFUl = .text:0x8002CFB0; // type:function size:0xC getParams2UpperByte__9dAcBase_cFv = .text:0x8002CFC0; // type:function size:0xC setParams2UpperByte__9dAcBase_cFUl = .text:0x8002CFD0; // type:function size:0x14 -buildParams2__9dAcBase_cFUlUc = .text:0x8002CFF0; // type:function size:0x1C +buildParams2__9dAcBase_cFUlUl = .text:0x8002CFF0; // type:function size:0x1C getParams2Lower__9dAcBase_cFv = .text:0x8002D010; // type:function size:0xC findActor__9dAcBase_cFPcP9dAcBase_c = .text:0x8002D020; // type:function size:0x74 -searchActor__9dAcBase_cFR9dAcBase_c = .text:0x8002D0A0; // type:function size:0x88 -forEachActor__9dAcBase_cFPvR9dAcBase_c = .text:0x8002D130; // type:function size:0x5C -getXZAngleToPlayer__9dAcBase_cFv = .text:0x8002D190; // type:function size:0x3C -getDistanceToActor__9dAcBase_cFR9dAcBase_cfPf = .text:0x8002D1D0; // type:function size:0xB8 -getDistanceAndAngleToActor__9dAcBase_cFR9dAcBase_cfssPfPsPs = .text:0x8002D290; // type:function size:0x148 +searchActor__9dAcBase_cFP9dAcBase_c = .text:0x8002D0A0; // type:function size:0x88 +forEveryActor__9dAcBase_cFPFP9dAcBase_cP9dAcBase_c_PvP9dAcBase_c = .text:0x8002D130; // type:function size:0x5C +getXZAngleToPlayer__9dAcBase_cFPs = .text:0x8002D190; // type:function size:0x3C +getDistanceToActor__9dAcBase_cFP9dAcBase_cfPf = .text:0x8002D1D0; // type:function size:0xB8 +getDistanceAndAngleToActor__9dAcBase_cFP9dAcBase_cfssPfPsPs = .text:0x8002D290; // type:function size:0x148 isWithinPlayerRadius__9dAcBase_cFf = .text:0x8002D3E0; // type:function size:0x5C getDistanceAndAngleToPlayer__9dAcBase_cFfssPfPsPs = .text:0x8002D440; // type:function size:0x2C getDistToPlayer__9dAcBase_cFv = .text:0x8002D470; // type:function size:0x30 @@ -1084,17 +1084,17 @@ FUN_8002d7f0__9dAcBase_cFv = .text:0x8002D7F0; // type:function size:0x20 FUN_8002d810__9dAcBase_cFv = .text:0x8002D810; // type:function size:0x20 FUN_8002d830__9dAcBase_cFv = .text:0x8002D830; // type:function size:0x28 FUN_8002d860__9dAcBase_cFv = .text:0x8002D860; // type:function size:0x20 -FUN_8002d880__9dAcBase_cFv = .text:0x8002D880; // type:function size:0x8 +getSoundSource__9dAcBase_cFv = .text:0x8002D880; // type:function size:0x8 FUN_8002d890__9dAcBase_cFv = .text:0x8002D890; // type:function size:0x88 setActorRef__9dAcBase_cFP7dBase_c = .text:0x8002D920; // type:function size:0x8 -setUnkFlag__9dAcBase_cFv = .text:0x8002D930; // type:function size:0x10 -FUN_8002d940__9dAcBase_cFv = .text:0x8002D940; // type:function size:0x14 -FUN_8002d960__9dAcBase_cFv = .text:0x8002D960; // type:function size:0x14 -createActor__9dAcBase_cFUsUlP5Vec3fP5Vec3sP5Vec3fUliP7dBase_c = .text:0x8002D980; // type:function size:0xF4 -createActorUnkGroup3__9dAcBase_cFUsUlP5Vec3fP5Vec3sP5Vec3fUliP7dBase_c = .text:0x8002DA80; // type:function size:0xF4 +setEnemyDefeatFlag__9dAcBase_cFv = .text:0x8002D930; // type:function size:0x10 +changeLoadedEntitiesWithSet__9dAcBase_cFv = .text:0x8002D940; // type:function size:0x14 +changeLoadedEntitiesNoSet__9dAcBase_cFv = .text:0x8002D960; // type:function size:0x14 +createActor__9dAcBase_cFUsUlP7mVec3_cP7mAng3_cP7mVec3_cUllP7dBase_c = .text:0x8002D980; // type:function size:0xF4 +createActorStage__9dAcBase_cFUsUlP7mVec3_cP7mAng3_cP7mVec3_cUllP7dBase_c = .text:0x8002DA80; // type:function size:0xF4 getCurrentEventActor__9dAcBase_cFv = .text:0x8002DB80; // type:function size:0x4 unkVirtFunc_0x6C__9dAcBase_cFv = .text:0x8002DB90; // type:function size:0x4 -doInteraction__9dAcBase_cFi = .text:0x8002DBA0; // type:function size:0x80 +doInteraction__9dAcBase_cFl = .text:0x8002DBA0; // type:function size:0x80 FUN_8002dc20__9dAcBase_cFPsPs = .text:0x8002DC20; // type:function size:0x28 incrementKillCounter__9dAcBase_cFv = .text:0x8002DC50; // type:function size:0x7C FUN_8002dcd0__9dAcBase_cFv = .text:0x8002DCD0; // type:function size:0x3C @@ -4413,15 +4413,15 @@ fn_800C7A00 = .text:0x800C7A00; // type:function size:0x8 fn_800C7A10 = .text:0x800C7A10; // type:function size:0x8 fn_800C7A20 = .text:0x800C7A20; // type:function size:0x130 fn_800C7B50 = .text:0x800C7B50; // type:function size:0x8 -fn_800C7B60 = .text:0x800C7B60; // type:function size:0x14 +__ct__18SpecialItemDropMgrFv = .text:0x800C7B60; // type:function size:0x14 fn_800C7B80 = .text:0x800C7B80; // type:function size:0x30 -fn_800C7BB0 = .text:0x800C7BB0; // type:function size:0x150 -fn_800C7D00 = .text:0x800C7D00; // type:function size:0x1C -fn_800C7D20 = .text:0x800C7D20; // type:function size:0x1C -fn_800C7D40 = .text:0x800C7D40; // type:function size:0x1A8 -fn_800C7EF0 = .text:0x800C7EF0; // type:function size:0x2D8 -fn_800C81D0 = .text:0x800C81D0; // type:function size:0x98 -fn_800C8270 = .text:0x800C8270; // type:function size:0x40 +fn_800C7BB0__FP18SpecialItemDropMgri = .text:0x800C7BB0; // type:function size:0x150 +fn_800C7D00__FP18SpecialItemDropMgri = .text:0x800C7D00; // type:function size:0x1C +fn_800C7D20__FP18SpecialItemDropMgri = .text:0x800C7D20; // type:function size:0x1C +giveSpecialDropItem__FP18SpecialItemDropMgriiP7mVec3_ciPsi = .text:0x800C7D40; // type:function size:0x1A8 +spawnSpecialDropItem__FP18SpecialItemDropMgriiP7mVec3_ciPs = .text:0x800C7EF0; // type:function size:0x2D8 +fn_800C81D0__Fsss = .text:0x800C81D0; // type:function size:0x98 +__dt__18SpecialItemDropMgrFv = .text:0x800C8270; // type:function size:0x40 fn_800C82B0 = .text:0x800C82B0; // type:function size:0x18 fn_800C82D0 = .text:0x800C82D0; // type:function size:0x18 fn_800C82F0 = .text:0x800C82F0; // type:function size:0xB0 diff --git a/configure.py b/configure.py index 38b302df..f423f3f7 100644 --- a/configure.py +++ b/configure.py @@ -278,6 +278,7 @@ config.libs = [ Object(NonMatching, "toBeSorted/misc_flag_managers.cpp"), Object(Matching, "toBeSorted/dungeonflag_manager.cpp"), Object(Matching, "toBeSorted/skipflag_manager.cpp"), + Object(NonMatching, "toBeSorted/special_item_drop_mgr.cpp"), Object(Matching, "c/c_list.cpp"), Object(Matching, "c/c_tree.cpp"), Object(Matching, "d/d_base.cpp"), diff --git a/include/MSL_C/math.h b/include/MSL_C/math.h index ca14879f..f09c6fdd 100644 --- a/include/MSL_C/math.h +++ b/include/MSL_C/math.h @@ -15,6 +15,7 @@ extern "C" { #endif int abs(int); +int labs(int); double acos(double); float acosf(float); double asin(double); diff --git a/include/UnknownTypeBelongings.h b/include/UnknownTypeBelongings.h index 58fcd52a..572059c0 100644 --- a/include/UnknownTypeBelongings.h +++ b/include/UnknownTypeBelongings.h @@ -21,7 +21,7 @@ struct ObjInfo { /* 0x04 */ u16 obj_id; /* 0x06 */ u16 obj_id2; /* 0x08 */ u16 fiTextEntryId; - /* 0x0A */ u8 unk_0xA; + /* 0x0A */ s8 unk_0xA; /* 0x0B */ u8 subtype; }; diff --git a/include/d/a/d_a_base.h b/include/d/a/d_a_base.h index 5ae0efe0..66333274 100644 --- a/include/d/a/d_a_base.h +++ b/include/d/a/d_a_base.h @@ -12,9 +12,14 @@ #include "toBeSorted/room_manager.h" class dAcBase_c; + +struct SoundSource { + // TODO +}; + struct SoundInfo { dAcBase_c *actor; - void *obj_sound; + SoundSource *sound_source; mVec3_c *obj_pos; SoundInfo *next; SoundInfo *prev; @@ -29,13 +34,13 @@ public: /* 0x88 */ void *sound_info_tail; /* 0x8c */ void *sound_info_next; /* 0x90 */ int count; - /* 0x94 */ void *obj_sound; + /* 0x94 */ SoundSource *sound_source; /* 0x9C */ mVec3_c *obj_pos; /* 0x9c */ mVec3_c pos_copy; /* 0xa8 */ u32 params2; /* 0xAC */ mAng3_c rot_copy; /* 0xB2 */ u16 obj_id; // enemydefeat flag / id on obj-map - /* 0xB4 */ u8 room_id_copy; + /* 0xB4 */ s8 room_id_copy; /* 0xB5 */ u8 viewclip_index; /* 0xB6 */ u8 subtype; /* 0xB8 */ mAng3_c rotation; @@ -44,7 +49,7 @@ public: /* 0xD8 */ u32 actor_properties; /* 0xDC */ fLiNdBa_c actor_node; /* 0xE8 */ u32 field_0xe8; - /* 0xEC */ u8 roomid; + /* 0xEC */ s8 roomid; /* 0xED */ u8 actor_subtype; /* 0xF0 */ u32 JStudio_actor; /* 0xF4 */ char someStr[4]; @@ -101,29 +106,29 @@ public: /* 8002c650 */ static void setTempCreateParams(mVec3_c *pos, mAng3_c *rot, mVec3_c *scale, s32 roomId, u32 params2, dAcBase_c *parent, u8 subtype, s16 unkFlag, u8 viewClipIdx, ObjInfo *objInfo); - /* 8002c690 */ void *FUN_8002c690(); + /* 8002c690 */ SoundSource *FUN_8002c690(); /* 8002c710 */ int initAllocatorWork1Heap(int size, char *name, int align); /* 8002c720 */ int initAllocator(int size, char *name, EGG::Heap *heap, int align); /* 8002c7b0 */ bool addActorToRoom(s32 roomId); /* 8002c840 */ void setBit_field_0xE8(s32); - /* 8002cf10 */ u32 itemDroppingAndGivingRelated(Vec3f *spawnPos, int subtype); + /* 8002cf10 */ u32 itemDroppingAndGivingRelated(mVec3_c *spawnPos, int subtype); /* 8002cf90 */ void fillUpperParams2Byte(); /* 8002cfa0 */ u32 getParams2_ignoreLower(); /* 8002cfb0 */ void setParams2Upper_ignoreLower(u32 val); /* 8002cfc0 */ u8 getParams2UpperByte(); /* 8002cfd0 */ void setParams2UpperByte(u32 val); - /* 8002cff0 */ static u32 buildParams2(u32 lower, u8 upper); + /* 8002cff0 */ static u32 buildParams2(u32 lower, u32 upper); /* 8002d010 */ u32 getParams2Lower(); /* 8002d020 */ static dAcBase_c *findActor(char *objName, dAcBase_c *parent); - /* 8002d0a0 */ static dAcBase_c *searchActor(dAcBase_c &optionalParent); + /* 8002d0a0 */ static dAcBase_c *searchActor(dAcBase_c *parent); // Kinda performs the code of the first param on every actor (second param is optional parent) - /* 8002d130 */ static void forEachActor(void *, dAcBase_c &); + /* 8002d130 */ static void forEveryActor(void *func(dAcBase_c *, dAcBase_c *), dAcBase_c *parent); // Not really static, but we currently dont have a type for the return (not just simply a s16) - /* 8002d190 */ mAng getXZAngleToPlayer(); + /* 8002d190 */ void getXZAngleToPlayer(s16 *angle); // returns true if under the distThresh, False if not. the actual distance is returned in outDist - /* 8002d1d0 */ bool getDistanceToActor(dAcBase_c &actor, f32 distThresh, f32 *outDist); + /* 8002d1d0 */ bool getDistanceToActor(dAcBase_c *actor, f32 distThresh, f32 *outDist); // same concept as above - /* 8002d290 */ bool getDistanceAndAngleToActor(dAcBase_c &actor, f32 distThresh, s16 yAngle, s16 xAngle, + /* 8002d290 */ bool getDistanceAndAngleToActor(dAcBase_c *actor, f32 distThresh, s16 yAngle, s16 xAngle, f32 *outDist, s16 *outDiffAngleY, s16 *outDiffAngleX); /* 8002d3e0 */ bool isWithinPlayerRadius(f32 radius); /* 8002d440 */ bool getDistanceAndAngleToPlayer(f32 distThresh, s16 yAngle, s16 xAngle, f32 *outDist, @@ -132,7 +137,8 @@ public: /* 8002d4a0 */ f32 getSquareDistToPlayer(); /* 8002d4b0 */ void updateRoomId(f32 yOffs); /* 8002d540 */ bool isRoomFlags_0x6_Set(); - // Begin Sound Effect Related + + // Start of SoundSource stuff /* 8002d590 */ void FUN_8002d590(); /* 8002d5b0 */ void FUN_8002d5b0(); /* 8002d5d0 */ void playSound(); @@ -148,20 +154,19 @@ public: /* 8002d810 */ void FUN_8002d810(); /* 8002d830 */ void FUN_8002d830(); /* 8002d860 */ void FUN_8002d860(); - /* 8002d880 */ void FUN_8002d880(); - // End Sound Effect Related + /* 8002d880 */ SoundSource *getSoundSource(); + // End of SoundSource stuff + /* 8002d890 */ void FUN_8002d890(); /* 8002d920 */ void setActorRef(dBase_c *); // next three funcs are related - /* 8002d930 */ void setUnkFlag(); - /* 8002d940 */ void FUN_8002d940(); - /* 8002d960 */ void FUN_8002d960(); + /* 8002d930 */ void setEnemyDefeatFlag(); + /* 8002d940 */ void changeLoadedEntitiesWithSet(); + /* 8002d960 */ void changeLoadedEntitiesNoSet(); - /* 8002d980 */ static dAcBase_c createActor(ProfileName actorId, u32 params1, Vec3f *pos, Vec3s *rot, Vec3f *scale, - u32 params2, s32 roomId, dBase_c *ref); + /* 8002d980 */ dAcBase_c *createActor(ProfileName actorId, u32 params1, mVec3_c *pos, mAng3_c *rot, mVec3_c *scale, u32 params2, s32 roomId, dBase_c *ref); - /* 8002da80 */ static dAcBase_c createActorUnkGroup3(ProfileName actorId, u32 params1, Vec3f *pos, Vec3s *rot, - Vec3f *scale, u32 params2, s32 roomId, dBase_c *ref); + /* 8002da80 */ dAcBase_c *createActorStage(ProfileName actorId, u32 params1, mVec3_c *pos, mAng3_c *rot, mVec3_c *scale, u32 params2, s32 roomId, dBase_c *ref); /* 8002dc20 */ void FUN_8002dc20(s16 *, s16 *); /* 8002dc50 */ void incrementKillCounter(); diff --git a/include/d/a/obj/d_a_obj_base.h b/include/d/a/obj/d_a_obj_base.h index c4467825..37153e07 100644 --- a/include/d/a/obj/d_a_obj_base.h +++ b/include/d/a/obj/d_a_obj_base.h @@ -11,6 +11,20 @@ class dAcObjBase_c : public dAcBase_c { public: // Data Members + f32 yoffset; + char _0[4]; + f32 unkfloat; + char _1[12]; + s16 targetFiTextId; + u8 unkByteTargetFiRelated; + mVec3_c poscopy1; + mVec3_c poscopy2; + mVec3_c poscopy3; + mAng3_c rotcopy1; + f32 forwardSpeed; + f32 forwardAccel; + f32 forwardMaxSpeed; + // TODO: add the rest public: // could be their own thing? @@ -72,4 +86,5 @@ public: /* 8002f260 */ static dAcBase_c createActorUnkGroup3(char *name, u32 roomId, u32 params1, mVec3_c *pos, mAng3_c *rot, mVec3_c *scale, u32 params2, u16 id, u8 viewclipId); }; + #endif diff --git a/include/d/d_player.h b/include/d/d_player.h new file mode 100644 index 00000000..28f737b0 --- /dev/null +++ b/include/d/d_player.h @@ -0,0 +1,12 @@ +#ifndef D_PLAYER_H +#define D_PLAYER_H + +#include +#include "d/a/obj/d_a_obj_base.h" + +class dPlayer: public dAcObjBase_c { +public: + static dPlayer *LINK; +}; + +#endif diff --git a/include/m/m_angle.h b/include/m/m_angle.h index 37fca394..832800a8 100644 --- a/include/m/m_angle.h +++ b/include/m/m_angle.h @@ -14,6 +14,8 @@ struct mAng { class mAng3_c { public: + mAng3_c() {} + s16 x, y, z; mAng3_c(s16 fx, s16 fy, s16 fz) : x(fx), y(fy), z(fz) {} diff --git a/include/toBeSorted/event.h b/include/toBeSorted/event.h new file mode 100644 index 00000000..0260693c --- /dev/null +++ b/include/toBeSorted/event.h @@ -0,0 +1,22 @@ +#ifndef EVENT_H +#define EVENT_H + +#include + +class Event { +public: + void *unk; + u32 eventFlags; + s32 roomid; + s32 toolDataid; + char eventName[32]; + void *eventZevData; + void *callback1; + void *callback2; + +public: + Event(char *eventName, u32 unk, u32 eventFlags, void *callback1, void *callback2); + virtual ~Event(); +}; + +#endif diff --git a/include/toBeSorted/file_manager.h b/include/toBeSorted/file_manager.h index 282cfc4b..858de5a4 100644 --- a/include/toBeSorted/file_manager.h +++ b/include/toBeSorted/file_manager.h @@ -163,7 +163,7 @@ public: /* 8000BA70 */ void setBeaconPos(u32 beaconArea, u32 beaconNum, mVec3_c *pos); /* 8000BB80 */ mVec3_c *getBeaconPos(u32 beaconArea, u32 beaconNum); /* 8000BC70 */ void setEnemyKillCount(u32 enemy, u16 killCount); - /* 8000BCE0 */ u16 getEnemyKillCount(u32 enemy); + /* 8000BCE0 */ s16 getEnemyKillCount(u32 enemy); /* 8000BD60 */ void setHitCountFromEnemy(u32 enemy, u16 hitCount); /* 8000BDD0 */ u16 getHitCountFromEnemy(u32 enemy); diff --git a/include/toBeSorted/misc_flag_managers.h b/include/toBeSorted/misc_flag_managers.h new file mode 100644 index 00000000..0904c13b --- /dev/null +++ b/include/toBeSorted/misc_flag_managers.h @@ -0,0 +1,79 @@ +#ifndef MISC_FLAG_MANAGERS_H +#define MISC_FLAG_MANAGERS_H + +#include +#include +#include + +class CommittableFlagManager { +public: + bool mNeedsCommit; + + virtual void doCommit() = 0; + bool commitIfNecessary(); + void setNeedsCommit(bool commit) { + mNeedsCommit = commit; + } + CommittableFlagManager() { + mNeedsCommit = false; + } + CommittableFlagManager(bool commit) { + mNeedsCommit = commit; + } +}; + +class TBoxFlagManager : public CommittableFlagManager { +public: + FlagSpace mFlagSpace; + u16 mSceneIndex; + BitwiseFlagHelper mFlagHelper; + + static u16 sTBoxFlags[2]; + + static TBoxFlagManager *sInstance; + + virtual void doCommit() override; + bool checkUncommittedFlag(u16 flag); + TBoxFlagManager(); + virtual ~TBoxFlagManager() {} + void init(); + void copyFromSave(s16 sceneIndex); + bool checkFlag(u16 sceneIndex, u16 flag); + virtual u16 getFlagCount() const; + void setFlag(u16 flag); + bool checkUncommittedFlag(u16 sceneIndex, u16 flag); + u16 checkUncommittedFlag2(u16 flag) { + return checkUncommittedFlag(flag); + } +}; + +// NOTE: Not actually Enemy Defeat. +// This is a little more than that, it keeps track of live objects based on their id as a whole +class EnemyDefeatManager : public CommittableFlagManager { +public: + FlagSpace mFlagSpace; + BitwiseFlagHelper mFlagHelper; + u16 mSceneIndex; + + static u16 sEnemyDefeatFlags[4096]; + + static EnemyDefeatManager *sInstance; + + void clearSavedFlags(); + bool checkUncommittedFlag(u16 flag); + u16 checkUncommittedFlag2(u16 flag) { + return checkUncommittedFlag(flag); + } + EnemyDefeatManager(); + void init(); + void copyFromSave(u16 sceneIndex); + void updateFlagIndex(u16 sceneIndex); + void clearAll(); + bool checkIsValidFlag(u16 flag); + bool checkFlag(u16 flag); + virtual ~EnemyDefeatManager() {} + virtual u16 getFlagCount() const; + void setFlag(u16 flag); +}; + +#endif diff --git a/include/toBeSorted/room_manager.h b/include/toBeSorted/room_manager.h index a010d185..fb7a0f66 100644 --- a/include/toBeSorted/room_manager.h +++ b/include/toBeSorted/room_manager.h @@ -3,16 +3,80 @@ #include "d/d_base.h" #include +#include "m/m_allocator.h" +#include "m/types_m.h" #define MAX_ROOM_NUMBER 64 -class dRoom; -class RoomTable { - RoomTable(); - virtual ~RoomTable(); +class dRoomModel { + char mainModel[28]; // Actually smdl_c + nw4r::math::AABB *roomBounds; + m3d::anmMatClr_c *anmMatClr; + m3d::anmTexPat_c *anmTexPat; + m3d::anmTexSrt_c *anmTexSrt; + m3d::anmVis_c *anmVis; +}; + +class dRoomCollision { + char todo[352]; +}; + +class dRoom : dBase_c { +public: + mAllocator_c allocator; + nw4r::g3d::ResFile *roomRes; + char unkWithWater[24]; + dRoomModel roomModels[8]; + dRoomCollision roomCollisions[2]; + char stateMgr[60]; + char _0[4]; + void *SCEN; + void *PLY; + void *CAM; + void *EVNT; + void *PATH; + void *PNT; + void *BPNT; + void *SPTH; + void *_1; + void *_2; + void *AREA; + char _3[4]; + short plyCount; + short camCount; + short evntCount; + short pathCount; + short pntCount; + short bpntCount; + short spthCount; + short _4; + short _5; + short areaCount; + char _6[4]; + u8 flags; + void *BZS; + s8 roomid; + char _7[3]; + bool hasAnmTexPat; + bool didAlreadyInit; +}; + +class dRoomTable { + /* 801b4670 */ dRoomTable(dRoomTable *roomTable); + virtual ~dRoomTable(); dRoom *rooms[MAX_ROOM_NUMBER - 1]; }; +class MapRelated { +public: + mAllocator_c allocator; + char unk[472]; + +public: + /* 801b4780 */ void init(MapRelated *); + /* 801b4900 */ void fn_801b4900(); +}; + // OBJ NAME: STAGE // Ghidra: RoomManager // size: 0x239c @@ -20,9 +84,9 @@ class RoomTable { class RoomManager : public dBase_c { public: /* 0068 */ char field_0x68[0x7C - 0x68]; - /* 007C */ RoomTable rooms; - /* 017c */ char fader[0x1a0 - 0x17c]; // size unk - /* 01a0 */ char mapRelated[0x39c - 0x1a0]; // size unk + /* 007C */ dRoomTable rooms; + /* 017c */ char fader[0x1a0 - 0x174]; // size unk + /* 01a0 */ MapRelated mapRelated; /* 039c */ u32 loaded_entities[2047]; /* 2398 */ u8 curr_room_id; @@ -31,6 +95,14 @@ public: public: /* 801b42b0 */ static dBase_c *getRoom(int roomid); + /* 801b42d0 */ static void bindStageResToFile(nw4r::g3d::ResFile *); + /* 801b4320 */ static void bindSkyCmnToResFile(nw4r::g3d::ResFile *); + /* 801b4380 */ static bool getMA0AnmTexSrt(nw4r::g3d::ResAnmTexSrt *, char *); + /* 801b4420 */ static bool getMA0IndirectSrt(nw4r::g3d::ResAnmTexSrt *, char *); + /* 801b44c0 */ static void changeLoadedEntities(RoomManager *mgr, u32 index_shift, bool set); + /* 801b4510 */ static u32 checkRoomFlag(RoomManager *mgr, u32 flag); + /* 801b4550 */ static bool checkEnemyDefeatFlag(RoomManager *mgr, u32 flag); + /* 801b45c0 */ static bool fn_801B45C0(RoomManager *mgr /* plus others */); }; #endif diff --git a/include/toBeSorted/scgame.h b/include/toBeSorted/scgame.h new file mode 100644 index 00000000..aa465d4a --- /dev/null +++ b/include/toBeSorted/scgame.h @@ -0,0 +1,25 @@ +#ifndef SCGAME_H +#define SCGAME_H + +#include + +struct SpawnInfo { + /* 0x00 */ char stageName[32]; + /* 0x20 */ s16 transitionFadeFrames; + /* 0x22 */ s8 room; + /* 0x23 */ s8 layer; + /* 0x24 */ s8 entrance; + /* 0x25 */ s8 night; + /* 0x26 */ s8 trial; + /* 0x27 */ s8 transitionType; + /* 0x28 */ s32 unk; +}; + +class ScGame { +public: + static SpawnInfo currentSpawnInfo; + static SpawnInfo nextSpawnInfo; + static ScGame *sInstance; +}; + +#endif diff --git a/include/toBeSorted/special_item_drop_mgr.h b/include/toBeSorted/special_item_drop_mgr.h new file mode 100644 index 00000000..3fc1c7d8 --- /dev/null +++ b/include/toBeSorted/special_item_drop_mgr.h @@ -0,0 +1,20 @@ +#ifndef SPECIAL_ITEM_DROP_MGR_H +#define SPECIAL_ITEM_DROP_MGR_H + +#include + +class SpecialItemDropMgr { +public: + static SpecialItemDropMgr *sInstance; + + SpecialItemDropMgr(); + static int fn_800C7BB0(SpecialItemDropMgr *mgr, int specialItemId); + static short fn_800C7D00(SpecialItemDropMgr *mgr, int specialItemId); + static short fn_800C7D20(SpecialItemDropMgr *mgr, int specialItemId); + static int giveSpecialDropItem(SpecialItemDropMgr *mgr, int specialItemId, int roomid, mVec3_c *pos, int subtype, s16 *rot, s32 unused); + static bool spawnSpecialDropItem(SpecialItemDropMgr *mgr, int specialItemId, int roomid, mVec3_c *pos, int subtype, s16 *rot); + static void fn_800C81D0(s16, s16, s16); + ~SpecialItemDropMgr(); +}; + +#endif diff --git a/src/d/a/d_a_base.cpp b/src/d/a/d_a_base.cpp index 51705bd2..f103ca01 100644 --- a/src/d/a/d_a_base.cpp +++ b/src/d/a/d_a_base.cpp @@ -1,6 +1,13 @@ #include "d/a/d_a_base.h" +#include "m/m_vec.h" +#include "d/d_player.h" +#include "f/f_list_nd.h" +#include "toBeSorted/misc_flag_managers.h" +#include "toBeSorted/special_item_drop_mgr.h" +#include "toBeSorted/scgame.h" +#include "toBeSorted/event.h" +#include "toBeSorted/file_manager.h" -// RoomManager* RoomManager::m_Instance; // .sdata u32 dAcBase_c::s_Create_RoomId = -1; @@ -17,8 +24,15 @@ ObjInfo *dAcBase_c::s_Create_ObjInfo; u8 dAcBase_c::s_Create_Subtype; extern "C" ObjInfo *getObjByActorIdAndSubtype_unkNamespace(ProfileName, u8); +extern "C" ObjInfo *getObjByActorName_unkNamespace(char *name); extern "C" char *getObjectName_8006a730(ObjInfo *); -extern "C" void *soundForActorInitRelated_803889c0(s8, fBase_c *, char *, u8); +extern "C" SoundSource *soundForActorInitRelated_803889c0(s8, fBase_c *, char *, u8); +extern "C" short targetAngleY(mVec3_c *, mVec3_c *); +extern "C" short targetAngleX(mVec3_c *, mVec3_c *); +extern "C" bool checkCollision(mVec3_c *pos); +extern "C" s8 collisionCheckGetRoom(); +extern "C" dRoom *getRoomByIndex(RoomManager *mgr, s8 roomid); +extern "C" bool alsoSetAsCurrentEvent(dAcBase_c*, Event*, void *); bool dAcBase_c::createHeap() { return true; @@ -27,27 +41,30 @@ bool dAcBase_c::createHeap() { // Doesnt Match Yet dAcBase_c::dAcBase_c() : heap_allocator(), obj_info(s_Create_ObjInfo), sound_info_tail(&heap_allocator.mHeap), - sound_info_next(&heap_allocator.mHeap), count(0), obj_sound(nullptr), obj_pos(&position), - params2(s_Create_Params2), obj_id(s_Create_UnkFlags), viewclip_index(s_Create_ViewClipIdx), actor_node(), + sound_info_next(&heap_allocator.mHeap), count(0), sound_source(nullptr), obj_pos(&position), + params2(s_Create_Params2), obj_id(s_Create_UnkFlags), viewclip_index(s_Create_ViewClipIdx), actor_node(nullptr), roomid(s_Create_RoomId), actor_subtype(s_Create_Subtype) { JStudio_actor = 0; someStr[0] = 0; + if (s_Create_Position != nullptr) { - // void set(f32 fx, f32 fy, f32 fz) { x = fx; y = fy; z = fz; } position.set(s_Create_Position->x, s_Create_Position->y, s_Create_Position->z); - // position = *s_Create_Position; } - if (s_Create_Rotation != 0) { + + if (s_Create_Rotation != nullptr) { rotation = *(s_Create_Rotation); } - if (s_Create_Scale != 0) { + + if (s_Create_Scale != nullptr) { setScale(s_Create_Scale->x, s_Create_Scale->y, s_Create_Scale->z); } else { setScale(1.0, 1.0, 1.0); } - if (s_Create_Parent != 0) { + + if (s_Create_Parent != nullptr) { setActorRef(s_Create_Parent); } + fProfile::fActorProfile_c *profile = (fProfile::fActorProfile_c *)((*fProfile::sProfileList)[profile_name]); actor_properties = profile->mActorProperties; if (obj_info == nullptr) { @@ -56,9 +73,14 @@ dAcBase_c::dAcBase_c() someStr[0] = '\0'; } -/* 8002c530 */ dBase_c::~dBase_c() {} +// 8002c530 +dBase_c::~dBase_c() {} -dAcBase_c::~dAcBase_c() {} +dAcBase_c::~dAcBase_c() { + if (sound_source != nullptr) { + // call obj_sound dtor once defined + } +} void dAcBase_c::setTempCreateParams(mVec3_c *pos, mAng3_c *rot, mVec3_c *scale, s32 roomId, u32 params2, dAcBase_c *parent, u8 subtype, s16 unkFlag, u8 viewClipIdx, ObjInfo *objInfo) { @@ -75,14 +97,16 @@ void dAcBase_c::setTempCreateParams(mVec3_c *pos, mAng3_c *rot, mVec3_c *scale, } // has regswap -void *dAcBase_c::FUN_8002c690() { +SoundSource *dAcBase_c::FUN_8002c690() { if (obj_info == nullptr) { return nullptr; } - s8 unk_val = obj_info->unk_0xA; + + s32 unk_val = obj_info->unk_0xA; if (unk_val == -1) { return nullptr; } + char *objName = getObjectName_8006a730(obj_info); return soundForActorInitRelated_803889c0(unk_val, this, objName, subtype); } @@ -96,7 +120,7 @@ int dAcBase_c::initAllocator(int size, char *name, EGG::Heap *heap, int align) { if (fn_802EE510(&heap_allocator, size, heap, name, 0x20, 0) == 0) { return 0; } - obj_sound = FUN_8002c690(); + sound_source = FUN_8002c690(); int success = createHeap(); heap_allocator.adjustFrmHeapRestoreCurrent(); return success; @@ -117,15 +141,19 @@ bool dAcBase_c::addActorToRoom(s32 roomId) { } return false; } + void dAcBase_c::setBit_field_0xE8(s32 shift) { field_0xe8 |= (1 << shift); } + int dAcBase_c::actorCreate() { return SUCCEEDED; } + int dAcBase_c::actorPostCreate() { return SUCCEEDED; } + int dAcBase_c::create() { if (actor_properties & 0x8000000) { return actorPostCreate(); @@ -138,6 +166,8 @@ int dAcBase_c::create() { return success; } +// 8002c8f0 +// loads f2 before f0 instead of f0 then f2 void dAcBase_c::postCreate(fBase_c::MAIN_STATE_e state) { if (state == SUCCESS) { pos_copy = position; @@ -147,8 +177,10 @@ void dAcBase_c::postCreate(fBase_c::MAIN_STATE_e state) { dBase_c::postCreate(state); } +// 8002c940 int dAcBase_c::preDelete() {} +// 8002cb10 int dAcBase_c::preExecute() { if (dBase_c::preExecute() == NOT_READY) { return NOT_READY; @@ -161,44 +193,260 @@ int dAcBase_c::preExecute() { } return SUCCEEDED; } + +// 8002cc10 int dAcBase_c::execute() {} -int dAcBase_c::actorExecute() {} -int dAcBase_c::actorExecuteInEvent() {} + +// 8002cca0 +int dAcBase_c::actorExecute() { + return 1; +} + +// 8002ccb0 +int dAcBase_c::actorExecuteInEvent() { + return actorExecute(); +} + +// 8002ccc0 void dAcBase_c::postExecute(fBase_c::MAIN_STATE_e state) {} + +// 8002ce90 void dAcBase_c::unkVirtFunc_0x5C() { return; } + +// 8002cea0 void dAcBase_c::unkVirtFunc_0x60() { return; } -bool dAcBase_c::restorePosRotFromCopy() {} -u32 dAcBase_c::itemDroppingAndGivingRelated(Vec3f *spawnPos, int subtype) {} -void dAcBase_c::fillUpperParams2Byte() {} -u32 dAcBase_c::getParams2_ignoreLower() {} -void dAcBase_c::setParams2Upper_ignoreLower(u32 val) {} -u8 dAcBase_c::getParams2UpperByte() {} -void dAcBase_c::setParams2UpperByte(u32 val) {} -u32 dAcBase_c::buildParams2(u32 lower, u8 upper) {} -u32 dAcBase_c::getParams2Lower() {} -dAcBase_c *dAcBase_c::findActor(char *objName, dAcBase_c *parent) {} -// searches for actor based on groupType -dAcBase_c *dAcBase_c::searchActor(dAcBase_c &optionalParent) {} -void dAcBase_c::forEachActor(void *, dAcBase_c &) {} -mAng dAcBase_c::getXZAngleToPlayer() {} -bool dAcBase_c::getDistanceToActor(dAcBase_c &actor, f32 distThresh, f32 *outDist) {} -bool dAcBase_c::getDistanceAndAngleToActor(dAcBase_c &actor, f32 distThresh, s16 yAngle, s16 xAngle, f32 *outDist, - s16 *outDiffAngleY, s16 *outDiffAngleX) {} -bool dAcBase_c::isWithinPlayerRadius(f32 radius) {} -bool dAcBase_c::getDistanceAndAngleToPlayer(f32 distThresh, s16 yAngle, s16 xAngle, f32 *outDist, s16 *outDiffAngleY, - s16 *outDiffAngleX) { - // return getDistanceAndAngleToActor(PLAYER, distThresh, yAngle, xAngle, outDist, outDiffAngleY, outDiffAngleX); +// 8002ceb0 +// loads f2 before f0 instead of f0 then f2 +bool dAcBase_c::restorePosRotFromCopy() { + if (roomid != room_id_copy) { + return 0; + } + position = pos_copy; + rotation = rot_copy; + return 1; } -f32 dAcBase_c::getDistToPlayer() {} -f32 dAcBase_c::getSquareDistToPlayer() {} -void dAcBase_c::updateRoomId(f32 yOffs) {} -bool dAcBase_c::isRoomFlags_0x6_Set() {} +// 8002cf10 +u32 dAcBase_c::itemDroppingAndGivingRelated(mVec3_c *spawnPos, int subtype) { + if (ScGame::currentSpawnInfo.trial == 1) { + return 0; + } + + if (spawnPos == nullptr) { + spawnPos = &position; + } + + u32 param2Copy = params2; + params2 = param2Copy | 0xFF000000; + // mAng3_c rot = {}; + s16 rot = 0; + return SpecialItemDropMgr::giveSpecialDropItem(SpecialItemDropMgr::sInstance, param2Copy >> 0x18, roomid, spawnPos, subtype, &rot, -1); +} + +// 8002cf90 +void dAcBase_c::fillUpperParams2Byte() { + params2 |= 0xFF000000; +} + +// 8002cfa0 +u32 dAcBase_c::getParams2_ignoreLower() { + return params2 | 0xFFFF; +} + +// 8002cfb0 +void dAcBase_c::setParams2Upper_ignoreLower(u32 val) { + params2 = val | 0xFFFF; +} + +// 8002cfc0 +u8 dAcBase_c::getParams2UpperByte() { + return params2 >> 0x18; +} + +// 8002cfd0 +void dAcBase_c::setParams2UpperByte(u32 val) { + params2 = (params2 & 0xFFFFFF) | val << 0x18; +} + +// 8002cff0 +u32 dAcBase_c::buildParams2(u32 lower, u32 upper) { + return ((upper & 0xFFFF) | 0xFFFF0000) & ((lower << 0x18) | 0xFFFFFF); +} + +// 8002d010 +u32 dAcBase_c::getParams2Lower() { + return params2 & 0xFFFF; +} + +// 8002d020 +dAcBase_c *dAcBase_c::findActor(char *objName, dAcBase_c *parent) { + ObjInfo *objInfo = getObjByActorName_unkNamespace(objName); + if (objInfo == nullptr) { + return nullptr; + } else { + do { + parent = (dAcBase_c *)fManager_c::searchBaseByProfName(objInfo->obj_id, parent); + if (parent == nullptr) { + break; + } + } while (parent->actor_subtype != objInfo->subtype); + } + return parent; +} + +// searches for actor based on groupType +// 8002d0a0 +dAcBase_c *dAcBase_c::searchActor(dAcBase_c *parent) { + dAcBase_c *foundActor = nullptr; + + if (parent == nullptr) { + foundActor = (dAcBase_c *)fManager_c::searchBaseByGroupType(ACTOR, nullptr); + } else if (parent->group_type == 2) { + foundActor = (dAcBase_c *)fManager_c::searchBaseByGroupType(ACTOR, parent); + parent = foundActor; + } + + if (foundActor == nullptr) { + return (dAcBase_c *)fManager_c::searchBaseByGroupType(STAGE, parent); + } + + return foundActor; +} + +// 8002d130 +void dAcBase_c::forEveryActor(void *func(dAcBase_c *, dAcBase_c *), dAcBase_c *parent) { + dAcBase_c *foundActor = searchActor(nullptr); + + while (foundActor != nullptr) { + dAcBase_c *nextActor = (dAcBase_c *)func(foundActor, parent); + foundActor = searchActor(nextActor); + } +} + +// 8002d190 +void dAcBase_c::getXZAngleToPlayer(s16 *angle) { + *angle = targetAngleY(&this->position, &dPlayer::LINK->position); +} + +// The "distSquared > dist" bit is misbehaving. +// Trying different operators doesn't work so I'm leaving it as the most simple wrong choice. +// 8002d1d0 +bool dAcBase_c::getDistanceToActor(dAcBase_c *actor, f32 distThresh, f32 *outDist) { + f32 distSquared = 3.402823e+38; + bool isWithinThreshhold = false; + + if (actor != nullptr) { + distSquared = PSVECSquareDistance(position, actor->position); + + if (distSquared <= distThresh*distThresh) { + isWithinThreshhold = true; + } + } + + if (outDist != nullptr) { + f32 dist = 0.0; + // TODO: make this not sad :( + if (distSquared <= dist) { + dist = nw4r::math::FrSqrt(distSquared) * distSquared; + } + *outDist = dist; + } + return isWithinThreshhold; +} + +// Similar weirdness as the above function. Also, r29->31 are initted in the wrong order? +// 8002d290 +bool dAcBase_c::getDistanceAndAngleToActor(dAcBase_c *actor, f32 distThresh, s16 yAngle, s16 xAngle, f32 *outDist, s16 *outDiffAngleY, s16 *outDiffAngleX) { + f32 distSquared = 3.402823e+38; + s16 angleToActorY = 0; + s16 angleToActorX = 0; + bool isWithinRange = false; + + if (actor != nullptr) { + distSquared = PSVECSquareDistance(position, actor->position); + angleToActorY = targetAngleY(&position, &actor->position); + angleToActorX = targetAngleX(&position, &actor->position); + + if ((distSquared <= distThresh*distThresh) + && (labs(rotation.y - angleToActorY) <= yAngle) + && (labs(rotation.x - angleToActorX) <= xAngle) + ) { + isWithinRange = true; + } + } + + if (outDist != nullptr) { + f32 dist = 0.0; + if (distSquared <= dist) { + dist = nw4r::math::FrSqrt(distSquared); + dist *= distSquared; + } + *outDist = dist; + } + + if (outDiffAngleY != nullptr) { + *outDiffAngleY = angleToActorY; + } + + if (outDiffAngleX != nullptr) { + *outDiffAngleX = angleToActorX; + } + + return isWithinRange; +} + +// Very notmatching +// 8002d3e0 +bool dAcBase_c::isWithinPlayerRadius(f32 radius) { + f32 zDist = position.z - dPlayer::LINK->position.z; + f32 xDist = position.x - dPlayer::LINK->position.x; + return (xDist*xDist + zDist*zDist) < radius*radius; +} + +// 8002d440 +bool dAcBase_c::getDistanceAndAngleToPlayer(f32 distThresh, s16 yAngle, s16 xAngle, f32 *outDist, s16 *outDiffAngleY, s16 *outDiffAngleX) { + return getDistanceAndAngleToActor(dPlayer::LINK, distThresh, yAngle, xAngle, outDist, outDiffAngleY, outDiffAngleX); +} + +// 8002d470 +f32 dAcBase_c::getDistToPlayer() { + return EGG::Math::sqrt(PSVECSquareDistance(position, dPlayer::LINK->position)); +} + +// 8002d4a0 +f32 dAcBase_c::getSquareDistToPlayer() { + return PSVECSquareDistance(position, dPlayer::LINK->position); +} + +// Some weirdness with the float registers being used +// 8002d4b0 +void dAcBase_c::updateRoomId(f32 yOffset) { + if (getConnectParent()->profile_name != 701 /* fProfile::PROFILE_NAME_e::ROOM */) { + mVec3_c actorPos; + actorPos.x = position.x; + actorPos.y = position.y + yOffset; + actorPos.z = position.z; + + if (checkCollision(&actorPos)) { + roomid = collisionCheckGetRoom(); + } else { + roomid = RoomManager::m_Instance->curr_room_id; + } + } +} + +// 8002d540 +bool dAcBase_c::isRoomFlags_0x6_Set() { + dRoom *room = getRoomByIndex(RoomManager::m_Instance, roomid); + return (room->flags & 6) != 0; +} + +// Start of SoundSource stuff void dAcBase_c::FUN_8002d590() {} void dAcBase_c::FUN_8002d5b0() {} void dAcBase_c::playSound() {} @@ -215,31 +463,168 @@ void dAcBase_c::FUN_8002d7f0() {} void dAcBase_c::FUN_8002d810() {} void dAcBase_c::FUN_8002d830() {} void dAcBase_c::FUN_8002d860() {} -void dAcBase_c::FUN_8002d880() {} + +// 8002d880 +SoundSource *dAcBase_c::getSoundSource() { + return sound_source; +} +// End of SoundSource stuff + // first param is not dAcBase_c +// 8002d890 void dAcBase_c::FUN_8002d890() {} + // current name is Global__setActorRef -void dAcBase_c::setActorRef(dBase_c *) {} +void dAcBase_c::setActorRef(dBase_c *ref) { + actor_node.link(ref); +} + // May not be only purpose -void dAcBase_c::setUnkFlag() {} -void dAcBase_c::FUN_8002d940() {} -void dAcBase_c::FUN_8002d960() {} +void dAcBase_c::setEnemyDefeatFlag() { + EnemyDefeatManager::sInstance->setFlag(obj_id); +} + +// 8002d940 +void dAcBase_c::changeLoadedEntitiesWithSet() { + RoomManager::m_Instance->changeLoadedEntities(RoomManager::m_Instance, obj_id, true); +} + +// 8002d960 +void dAcBase_c::changeLoadedEntitiesNoSet() { + RoomManager::m_Instance->changeLoadedEntities(RoomManager::m_Instance, obj_id, false); +} // spawns GroupType2 (ACTOR) -dAcBase_c dAcBase_c::createActor(ProfileName actorId, u32 params1, Vec3f *pos, Vec3s *rot, Vec3f *scale, u32 params2, - s32 roomId, dBase_c *ref) {} +// 8002d980 +dAcBase_c *dAcBase_c::createActor(ProfileName actorId, u32 actorParams1, mVec3_c *actorPosition, mAng3_c *actorRotation, mVec3_c *actorScale, u32 actorParams2, s32 actorRoomid, dBase_c *actorRef) { + if (actorPosition == nullptr) { + actorPosition = &position; + } -dAcBase_c dAcBase_c::createActorUnkGroup3(ProfileName actorId, u32 params1, Vec3f *pos, Vec3s *rot, Vec3f *scale, - u32 params2, s32 roomId, dBase_c *ref) {} + if (actorRotation == nullptr) { + actorRotation = &rotation; + } + if (actorScale == nullptr) { + actorScale = &scale; + } + + if (actorRoomid == 63) { + actorRoomid = roomid; + } + + u32 newParams2 = -1; + if (actorParams2 != 0) { + newParams2 = getParams2_ignoreLower(); + } + + setTempCreateParams(actorPosition, actorRotation, actorScale, actorRoomid, newParams2, (dAcBase_c *)actorRef, 0, -1, 0xFF, nullptr); + dBase_c *room = RoomManager::getRoom(roomid); + return (dAcBase_c *)dBase_c::createBase(actorId, room, actorParams1, ACTOR); +} + +// spawns GroupType2 (STAGE) +// 8002da80 +dAcBase_c *dAcBase_c::createActorStage(ProfileName actorId, u32 actorParams1, mVec3_c *actorPosition, mAng3_c *actorRotation, mVec3_c *actorScale, u32 actorParams2, s32 actorRoomid, dBase_c *actorRef) { + if (actorPosition == nullptr) { + actorPosition = &position; + } + + if (actorRotation == nullptr) { + actorRotation = &rotation; + } + + if (actorScale == nullptr) { + actorScale = &scale; + } + + if (actorRoomid == 63) { + actorRoomid = roomid; + } + + u32 newParams2 = -1; + if (actorParams2 != 0) { + newParams2 = getParams2_ignoreLower(); + } + + setTempCreateParams(actorPosition, actorRotation, actorScale, actorRoomid, newParams2, (dAcBase_c *)actorRef, 0, -1, 0xFF, nullptr); + dBase_c *room = RoomManager::getRoom(roomid); + return (dAcBase_c *)dBase_c::createBase(actorId, room, actorParams1, STAGE); +} + +// 8002db80 void *dAcBase_c::getCurrentEventActor() {} + +// 8002db90 void dAcBase_c::unkVirtFunc_0x6C() {} -void dAcBase_c::doInteraction(s32) {} -void dAcBase_c::FUN_8002dc20(s16 *, s16 *) {} -void dAcBase_c::incrementKillCounter() {} -void dAcBase_c::FUN_8002dcd0() {} -void dAcBase_c::FUN_8002dd10() {} -void dAcBase_c::FUN_8002dd50() {} -void dAcBase_c::FUN_8002dd90() {} -void dAcBase_c::FUN_8002ddd0() {} -void dAcBase_c::FUN_8002de30() {} + +// 8002dba0 +void dAcBase_c::doInteraction(s32 param) { + if (param == 4 || param == 5 || param == 12) { + Event *event = &Event("DefaultTalk", 400, 0x100001, nullptr, nullptr); + alsoSetAsCurrentEvent(this, event, nullptr); + event->~Event(); + } +} + +// Only called by dPlayer::dig and that function fails to decomp in ghidra? +// 8002dc20 +void dAcBase_c::FUN_8002dc20(s16 *, s16 *) { + +} + +// This whole function gets compiled to just a `blr` +// Not sure how to make this work as expected +// 8002dc50 +void dAcBase_c::incrementKillCounter() { + dAcObjBase_c *object = (dAcObjBase_c *)this; // Probably wrong + + FileManager *fileMgr = FileManager::sInstance; + + if (group_type == ACTOR && object->unkByteTargetFiRelated == 1) { + s16 killCounterId = object->targetFiTextId; + + if (killCounterId < 91 && killCounterId & 0x300 == 0) { + s16 killCount = fileMgr->getEnemyKillCount(killCounterId & 0xFF); + fileMgr->setEnemyKillCount(killCounterId, killCount); + } + } +} + +// 8002dcd0 +void dAcBase_c::FUN_8002dcd0() { + fillUpperParams2Byte(); + fBase_c::deleteRequest(); + incrementKillCounter(); +} + +// 8002dd10 +void dAcBase_c::FUN_8002dd10() { + setEnemyDefeatFlag(); + fBase_c::deleteRequest(); + incrementKillCounter(); +} + +// 8002dd50 +void dAcBase_c::FUN_8002dd50() { + fillUpperParams2Byte(); + FUN_8002dd10(); +} + +// 8002dd90 +void dAcBase_c::FUN_8002dd90() { + fillUpperParams2Byte(); + setEnemyDefeatFlag(); + fBase_c::deleteRequest(); +} + +// Some collision related thing +// 8002ddd0 +void dAcBase_c::FUN_8002ddd0() { + +} + +// 8002de30 +void dAcBase_c::FUN_8002de30() { + FUN_8002ddd0(); +} diff --git a/src/d/d_player.cpp b/src/d/d_player.cpp new file mode 100644 index 00000000..a2aebf0c --- /dev/null +++ b/src/d/d_player.cpp @@ -0,0 +1,3 @@ +#include "d/d_player.h"; + +dPlayer* dPlayer::LINK; diff --git a/src/toBeSorted/file_manager.cpp b/src/toBeSorted/file_manager.cpp index 84bd84b4..d027a931 100644 --- a/src/toBeSorted/file_manager.cpp +++ b/src/toBeSorted/file_manager.cpp @@ -211,7 +211,7 @@ inline void strnsth(char *dest, const char *src, size_t max_len) { /* 8000BA70 */ void FileManager::setBeaconPos(u32 beaconArea, u32 beaconNum, mVec3_c *pos) {} /* 8000BB80 */ mVec3_c *FileManager::getBeaconPos(u32 beaconArea, u32 beaconNum) {} /* 8000BC70 */ void FileManager::setEnemyKillCount(u32 enemy, u16 killCount) {} -/* 8000BCE0 */ u16 FileManager::getEnemyKillCount(u32 enemy) {} +/* 8000BCE0 */ s16 FileManager::getEnemyKillCount(u32 enemy) {} /* 8000BD60 */ void FileManager::setHitCountFromEnemy(u32 enemy, u16 hitCount) {} /* 8000BDD0 */ u16 FileManager::getHitCountFromEnemy(u32 enemy) {} diff --git a/src/toBeSorted/misc_flag_managers.cpp b/src/toBeSorted/misc_flag_managers.cpp index a3e8f264..1d941aa2 100644 --- a/src/toBeSorted/misc_flag_managers.cpp +++ b/src/toBeSorted/misc_flag_managers.cpp @@ -1,26 +1,10 @@ #include #include +#include #include #include #include -class CommittableFlagManager { -public: - bool mNeedsCommit; - - virtual void doCommit() = 0; - bool commitIfNecessary(); - void setNeedsCommit(bool commit) { - mNeedsCommit = commit; - } - CommittableFlagManager() { - mNeedsCommit = false; - } - CommittableFlagManager(bool commit) { - mNeedsCommit = commit; - } -}; - /* 0x800BE7B0 */ bool CommittableFlagManager::commitIfNecessary() { if (mNeedsCommit) { @@ -32,31 +16,6 @@ bool CommittableFlagManager::commitIfNecessary() { } } -class TBoxFlagManager : public CommittableFlagManager { -public: - FlagSpace mFlagSpace; - u16 mSceneIndex; - BitwiseFlagHelper mFlagHelper; - - static u16 sTBoxFlags[2]; - - static TBoxFlagManager *sInstance; - - virtual void doCommit() override; - bool checkUncommittedFlag(u16 flag); - TBoxFlagManager(); - virtual ~TBoxFlagManager() {} - void init(); - void copyFromSave(s16 sceneIndex); - bool checkFlag(u16 sceneIndex, u16 flag); - virtual u16 getFlagCount() const; - void setFlag(u16 flag); - bool checkUncommittedFlag(u16 sceneIndex, u16 flag); - u16 checkUncommittedFlag2(u16 flag) { - return checkUncommittedFlag(flag); - } -}; - TBoxFlagManager *TBoxFlagManager::sInstance = nullptr; u16 TBoxFlagManager::sTBoxFlags[2] = {}; @@ -108,35 +67,6 @@ void TBoxFlagManager::setFlag(u16 flag) { } } -// NOTE: Not actually Enemy Defeat. -// This is a little more than that, it keeps track of live objects based on their id as a whole -class EnemyDefeatManager : public CommittableFlagManager { -public: - FlagSpace mFlagSpace; - BitwiseFlagHelper mFlagHelper; - u16 mSceneIndex; - - static u16 sEnemyDefeatFlags[4096]; - - static EnemyDefeatManager *sInstance; - - void clearSavedFlags(); - bool checkUncommittedFlag(u16 flag); - u16 checkUncommittedFlag2(u16 flag) { - return checkUncommittedFlag(flag); - } - EnemyDefeatManager(); - void init(); - void copyFromSave(u16 sceneIndex); - void updateFlagIndex(u16 sceneIndex); - void clearAll(); - bool checkIsValidFlag(u16 flag); - bool checkFlag(u16 flag); - virtual ~EnemyDefeatManager() {} - virtual u16 getFlagCount() const; - void setFlag(u16 flag); -}; - EnemyDefeatManager *EnemyDefeatManager::sInstance = nullptr; u16 EnemyDefeatManager::sEnemyDefeatFlags[4096] = {}; diff --git a/src/toBeSorted/scgame.cpp b/src/toBeSorted/scgame.cpp new file mode 100644 index 00000000..47c8875e --- /dev/null +++ b/src/toBeSorted/scgame.cpp @@ -0,0 +1,5 @@ +#include "toBeSorted/scgame.h" + +SpawnInfo ScGame::currentSpawnInfo = {}; +SpawnInfo ScGame::nextSpawnInfo = {}; +ScGame* ScGame::sInstance = nullptr; diff --git a/src/toBeSorted/special_item_drop_mgr.cpp b/src/toBeSorted/special_item_drop_mgr.cpp new file mode 100644 index 00000000..b73b8839 --- /dev/null +++ b/src/toBeSorted/special_item_drop_mgr.cpp @@ -0,0 +1,114 @@ +#include "m/m_vec.h" +#include "m/m_Angle.h" +#include "d/d_player.h" +#include "toBeSorted/special_item_drop_mgr.h" + +SpecialItemDropMgr* SpecialItemDropMgr::sInstance = nullptr; + +extern "C" short targetAngleY(mVec3_c *, mVec3_c *); +extern "C" int rndInt(int); +extern "C" void spawnItem1(s16 itemid, u32 roomid, mVec3_c *pos, mAng3_c *rot, u32 param2, u32 unk); +extern "C" void spawnItem2(s16 itemid, u32 roomid, mVec3_c *pos, mAng3_c *rot, u32 param2, u32 unk); +extern "C" void spawnItem3(s16 itemid, u32 roomid, mVec3_c *pos, mAng3_c *rot, u32 param2, u32 unk); +extern "C" void spawnItem4(s16 itemid, u32 roomid, mVec3_c *pos, mAng3_c *rot, u32 param2, u32 unk); +extern "C" void spawnItem5(s16 itemid, u32 roomid, mVec3_c *pos, mAng3_c *rot, u32 param2, u32 unk); +extern "C" void spawnItem6(s16 itemid, u32 roomid, mVec3_c *pos, mAng3_c *rot, u32 param2, u32 unk); +extern "C" void spawnItem7(s16 itemid, u32 roomid, mVec3_c *pos, mAng3_c *rot, u32 param2, u32 unk); +extern "C" void spawnItem8(s16 itemid, u32 roomid, mVec3_c *pos, mAng3_c *rot, u32 param2, u32 unk); +extern "C" void spawnItem9(s16 itemid, u32 roomid, mVec3_c *pos, mAng3_c *rot, u32 param2, u32 unk); + +// 800c7b80 +SpecialItemDropMgr::SpecialItemDropMgr() { + SpecialItemDropMgr::sInstance = this; +} + +// TODO: Convert to enum once work on items has started +int SPECIAL_ITEM_ARRAY[28] = {0, 6, 6, 2, 3, 4, 0x2b, 0x28, 0x29, 7, 8, 0x39, 0, 0, 0x1c, 0xa5, 58, 59, 183, 184, 185, 72, 72, 1, 34, 0, 0, 0}; +int RAND_RUPEE_ARRAY[4] = {2, 3, 4, 0}; + +// 800c7bb0 +int fn_800C7BB0(SpecialItemDropMgr *mgr, int specialItemId) {} + +// 800c7d00 +short fn_800C7D00(SpecialItemDropMgr *mgr, int specialItemId) {} + +// 800c7d20 +short fn_800C7D20(SpecialItemDropMgr *mgr, int specialItemId) {} + +// 800c7d40 +int giveSpecialDropItem(SpecialItemDropMgr *mgr, int specialItemId, int roomid, mVec3_c *pos, int subtype, s16 *rot, s32 unused) {} + +// 800c7ef0 +// Very unmatching. Just here as a starting point +bool spawnSpecialDropItem(SpecialItemDropMgr *mgr, int specialItemId, int roomid, mVec3_c *pos, int subtype, s16 *rot) { + u32 unk = fn_800C7BB0(mgr, specialItemId); + if (unk == 0) { + return false; + } + + s8 itemCount = 1; + if (unk == 2) { + itemCount = 3; + } else if (unk == 12) { + itemCount = 10; + } else if (unk == 13) { + itemCount = 5; + } else if (unk == 22) { + itemCount = 2; + } + + s16 currentRot; + s16 tempOther; + u16 itemid = SPECIAL_ITEM_ARRAY[unk]; + mAng3_c itemRot = {0, 0, 0}; + + if (subtype == 2 || subtype == 6) { + currentRot = *rot; + tempOther = -0xe39; + } else { + currentRot = targetAngleY(&(dPlayer::LINK->position), pos); + tempOther = -0x8000; + currentRot += 0x4000; + } + s16 angleDecrement = tempOther / itemCount; + tempOther = angleDecrement / 2; + currentRot += tempOther; + tempOther /= 2; + + for (s8 currentItemIndex = 0; currentItemIndex < itemCount; currentItemIndex++) { + s16 out; + SpecialItemDropMgr::fn_800C81D0(out, tempOther, -tempOther); + + itemRot.y = currentRot + out; + if (unk < 15) { + itemid = RAND_RUPEE_ARRAY[rndInt(3)]; + spawnItem1(itemid, roomid, pos, &itemRot, 0xFFFFFFFF, 0); + } else if (subtype == 2) { + spawnItem2(itemid, roomid, pos, &itemRot, 0xFFFFFFFF, 0); + } else { + if (subtype == 1) { + spawnItem3(itemid, roomid, pos, &itemRot, 0xFFFFFFFF, 0); + } else if (subtype == 4) { + spawnItem4(itemid, roomid, pos, &itemRot, 0xFFFFFFFF, 0); + } else if (subtype == 3) { + spawnItem5(itemid, roomid, pos, &itemRot, 0xFFFFFFFF, 0); + } else if (subtype == 5) { + spawnItem6(itemid, roomid, pos, &itemRot, 0xFFFFFFFF, 0); + } else if (subtype == 6) { + spawnItem7(itemid, roomid, pos, &itemRot, 0xFFFFFFFF, 0); + } else if (subtype == 7) { + spawnItem8(itemid, roomid, pos, &itemRot, 0xFFFFFFFF, 0); + } else { + spawnItem9(itemid, roomid, pos, &itemRot, 0xFFFFFFFF, 0); + } + } + currentRot -= angleDecrement; + } + return true; +} + +// 800c81d0 +void fn_800C81D0(s16, s16, s16) {}; + +// 800c8270 +SpecialItemDropMgr::~SpecialItemDropMgr() {}