mirror of
https://github.com/zeldaret/ss
synced 2026-05-25 07:23:00 -04:00
Expand dAcBase work
This commit is contained in:
@@ -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
|
||||
|
||||
|
||||
+25
-25
@@ -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
|
||||
|
||||
@@ -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"),
|
||||
|
||||
@@ -15,6 +15,7 @@ extern "C" {
|
||||
#endif
|
||||
|
||||
int abs(int);
|
||||
int labs(int);
|
||||
double acos(double);
|
||||
float acosf(float);
|
||||
double asin(double);
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
|
||||
+27
-22
@@ -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();
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -0,0 +1,12 @@
|
||||
#ifndef D_PLAYER_H
|
||||
#define D_PLAYER_H
|
||||
|
||||
#include <common.h>
|
||||
#include "d/a/obj/d_a_obj_base.h"
|
||||
|
||||
class dPlayer: public dAcObjBase_c {
|
||||
public:
|
||||
static dPlayer *LINK;
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -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) {}
|
||||
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
#ifndef EVENT_H
|
||||
#define EVENT_H
|
||||
|
||||
#include <common.h>
|
||||
|
||||
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
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -0,0 +1,79 @@
|
||||
#ifndef MISC_FLAG_MANAGERS_H
|
||||
#define MISC_FLAG_MANAGERS_H
|
||||
|
||||
#include <common.h>
|
||||
#include <toBeSorted/bitwise_flag_helper.h>
|
||||
#include <toBeSorted/flag_space.h>
|
||||
|
||||
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
|
||||
@@ -3,16 +3,80 @@
|
||||
|
||||
#include "d/d_base.h"
|
||||
#include <common.h>
|
||||
#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
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
#ifndef SCGAME_H
|
||||
#define SCGAME_H
|
||||
|
||||
#include <common.h>
|
||||
|
||||
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
|
||||
@@ -0,0 +1,20 @@
|
||||
#ifndef SPECIAL_ITEM_DROP_MGR_H
|
||||
#define SPECIAL_ITEM_DROP_MGR_H
|
||||
|
||||
#include <common.h>
|
||||
|
||||
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
|
||||
+444
-59
@@ -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<f32>::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();
|
||||
}
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
#include "d/d_player.h";
|
||||
|
||||
dPlayer* dPlayer::LINK;
|
||||
@@ -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) {}
|
||||
|
||||
|
||||
@@ -1,26 +1,10 @@
|
||||
#include <common.h>
|
||||
#include <libc.h>
|
||||
#include <toBeSorted/misc_flag_managers.h>
|
||||
#include <toBeSorted/bitwise_flag_helper.h>
|
||||
#include <toBeSorted/file_manager.h>
|
||||
#include <toBeSorted/flag_space.h>
|
||||
|
||||
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] = {};
|
||||
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
#include "toBeSorted/scgame.h"
|
||||
|
||||
SpawnInfo ScGame::currentSpawnInfo = {};
|
||||
SpawnInfo ScGame::nextSpawnInfo = {};
|
||||
ScGame* ScGame::sInstance = nullptr;
|
||||
@@ -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() {}
|
||||
Reference in New Issue
Block a user