From 49c7ba0239c2504c6515c0d87fc6972adfea4c9d Mon Sep 17 00:00:00 2001 From: dark-samus Date: Wed, 21 Oct 2020 20:07:00 -0400 Subject: [PATCH] add list types and fix code that uses them --- include/common_structs.h | 13 +++++++++++++ include/macros.h | 6 ++++++ include/variables.h | 37 +++++++++++++++++++------------------ src/code_a5dd0_len_114e0.c | 16 ++++++++-------- src/code_dbd70_len_700.c | 17 +++++++++-------- 5 files changed, 55 insertions(+), 34 deletions(-) diff --git a/include/common_structs.h b/include/common_structs.h index 4e1d121026..f5b8e5dd1c 100644 --- a/include/common_structs.h +++ b/include/common_structs.h @@ -115,6 +115,8 @@ typedef struct Npc { /* 0x0AB */ char unk_AB[661]; } Npc; // size = 0x340 +typedef Npc* NpcList[MAX_NPCS]; + typedef struct PlayerData { /* 0x000 */ s8 bootsLevel; /* 0x001 */ s8 hammerLevel; @@ -204,6 +206,8 @@ typedef struct Trigger { /* 0x34 */ ScriptID runningScriptID; } Trigger; // size = 0x38 +typedef Trigger* TriggerList[MAX_TRIGGERS]; + typedef struct ScriptInstance { /* 0x000 */ u8 state; /* 0x001 */ u8 currentArgc; @@ -271,6 +275,10 @@ typedef struct Entity { /* 0xB1 */ char unk_B1[71]; } Entity; // size = 0xF8 +typedef Entity* EntityList[MAX_ENTITIES]; + +typedef UNK_TYPE* DynamicEntityList[MAX_DYNAMIC_ENTITIES]; + typedef struct StaticEntityData { /* 0x00 */ s16 flags; /* 0x02 */ s16 argSize; @@ -364,6 +372,7 @@ typedef struct UiStatus { /* 0x68 */ s32 iconIndex13; /* 0x6C */ s8 unk_6C[4]; } UiStatus; // size = 0x70 + typedef struct Collider { /* 0x00 */ s32 flags; /* 0x04 */ s16 nextSibling; @@ -672,6 +681,8 @@ typedef struct Model { /* 0xAA */ char unk_AA[6]; } Model; // size = 0xB0 +typedef Model* ModelList[MAX_MODELS]; + typedef struct AnimatedMesh { /* 0x000 */ s32 flags; /* 0x004 */ u8 renderMode; @@ -921,6 +932,8 @@ typedef struct Shadow { /* 0x28 */ char unk_28[80]; } Shadow; // size = 0x78 +typedef Shadow* ShadowList[MAX_SHADOWS]; + typedef struct PushBlockGrid { /* 0x00 */ s8* cells; /* 0x04 */ u8 numCellsX; diff --git a/include/macros.h b/include/macros.h index bcea849bbc..318da49bcd 100644 --- a/include/macros.h +++ b/include/macros.h @@ -23,7 +23,13 @@ #define MAX_MAPVARS 16 #define MAX_MAPFLAGS 3 +#define MAX_MODELS 256 #define MAX_SCRIPTS 128 +#define MAX_NPCS 64 +#define MAX_TRIGGERS 64 +#define MAX_SHADOWS 60 +#define MAX_ENTITIES 30 +#define MAX_DYNAMIC_ENTITIES 16 //NOTE: SCRIPT_ALLOC is probably not quite correct, but this is the closest thing to matching for the functions its used in. Needs more work. #define SCRIPT_ALLOC(new, index) \ diff --git a/include/variables.h b/include/variables.h index acdf8f3fd4..62b185a0b0 100644 --- a/include/variables.h +++ b/include/variables.h @@ -38,30 +38,31 @@ extern s32 gScriptIndexList[MAX_SCRIPTS]; extern s32 gMoveScriptTable[][4]; -extern Model* gWorldModelList[256]; -extern Model* gBattleModelList[256]; -extern Model** gCurrentModelListPtr[256]; +extern ModelList gWorldModelList; +extern ModelList gBattleModelList; +extern ModelList* gCurrentModelListPtr; +// TODO: potentially a display list, figure this out extern u32* gWorldModelSpecialDls[32]; extern u32* gBattleModelSpecialDls[32]; extern u32** gCurrentModelSpecialDlsPtr[32]; -extern Entity* gWorldEntityList[30]; -extern Entity* gBattleEntityList[30]; -extern Entity** gCurrentEntityListPtr[30]; +extern EntityList gWorldEntityList; +extern EntityList gBattleEntityList; +extern EntityList* gCurrentEntityListPtr; extern s32 gLastCreatedEntityIndex; -extern UNK_TYPE* gWorldDynamicEntityList[16]; -extern UNK_TYPE* gBattleDynamicEntityList[16]; -extern UNK_TYPE*** gCurrentDynamicEntityListPtr; +extern DynamicEntityList gWorldDynamicEntityList; +extern DynamicEntityList gBattleDynamicEntityList; +extern DynamicEntityList* gCurrentDynamicEntityListPtr; -extern Npc* gWorldNpcList[64]; -extern Npc* gBattleNpcList[64]; -extern Npc** gCurrentNpcListPtr[64]; +extern NpcList gWorldNpcList; +extern NpcList gBattleNpcList; +extern NpcList* gCurrentNpcListPtr; -extern Shadow* gWorldShadowList[60]; -extern Shadow* gBattleShadowList[60]; -extern Shadow** gCurrentShadowListPtr[60]; +extern ShadowList gWorldShadowList; +extern ShadowList gBattleShadowList; +extern ShadowList* gCurrentShadowListPtr; extern Camera gCameras[4]; extern s32 gCurrentCameraID; @@ -89,9 +90,9 @@ extern PrintContext* D_802DB268; // Triggers extern s16 gTriggerCount; -extern Trigger* gTriggerList1[64]; -extern Trigger* gTriggerList2[64]; -extern Trigger** gCurrentTriggerListPtr[64]; +extern TriggerList gTriggerList1; +extern TriggerList gTriggerList2; +extern TriggerList* gCurrentTriggerListPtr; // Map transition data. Should probably be a struct extern u16 gMapTransitionAlpha; diff --git a/src/code_a5dd0_len_114e0.c b/src/code_a5dd0_len_114e0.c index 3c67595af5..26d7166ec7 100644 --- a/src/code_a5dd0_len_114e0.c +++ b/src/code_a5dd0_len_114e0.c @@ -34,24 +34,24 @@ Shadow* get_shadow_by_index(s32 index) { return (*gCurrentShadowListPtr)[index & 0xFFF]; } -Entity** get_entity_list(void) { - Entity** ret; +EntityList* get_entity_list(void) { + EntityList* ret; if (!GAME_STATUS->isBattle) { - ret = gWorldEntityList; + ret = &gWorldEntityList; } else { - ret = gBattleEntityList; + ret = &gBattleEntityList; } return ret; } -Shadow** get_shadow_list(void) { - Shadow** ret; +ShadowList* get_shadow_list(void) { + ShadowList* ret; if (!GAME_STATUS->isBattle) { - ret = gWorldShadowList; + ret = &gWorldShadowList; } else { - ret = gBattleShadowList; + ret = &gBattleShadowList; } return ret; } diff --git a/src/code_dbd70_len_700.c b/src/code_dbd70_len_700.c index 9045c95c38..e5c36c58ce 100644 --- a/src/code_dbd70_len_700.c +++ b/src/code_dbd70_len_700.c @@ -8,9 +8,9 @@ INCLUDE_ASM(s32, "code_dbd70_len_700", clear_trigger_data); void init_trigger_list(void) { if (!GAME_STATUS->isBattle) { - *gCurrentTriggerListPtr = gTriggerList1; + gCurrentTriggerListPtr = &gTriggerList1; } else { - *gCurrentTriggerListPtr = gTriggerList2; + gCurrentTriggerListPtr = &gTriggerList2; } gTriggerCount = 0; @@ -22,16 +22,17 @@ INCLUDE_ASM(s32, "code_dbd70_len_700", update_triggers); void delete_trigger(Trigger* toDelete) { s32 i; + TriggerList** currentTriggerListPtr = &gCurrentTriggerListPtr; - for (i = 0; i < ARRAY_COUNT(gCurrentTriggerListPtr); i++) { - if ((*gCurrentTriggerListPtr)[i] == toDelete) { + for (i = 0; i < MAX_TRIGGERS; i++) { + if ((**currentTriggerListPtr)[i] == toDelete) { break; } } - if (i < ARRAY_COUNT(gCurrentTriggerListPtr)) { - heap_free((*gCurrentTriggerListPtr)[i]); - (*gCurrentTriggerListPtr)[i] = NULL; + if (i < MAX_TRIGGERS) { + heap_free((**currentTriggerListPtr)[i]); + (**currentTriggerListPtr)[i] = NULL; } } @@ -48,7 +49,7 @@ s32 func_80145CE8(s32 arg0) { return 0; } - for (i = 0; i < ARRAY_COUNT(gCurrentTriggerListPtr); i++) { + for (i = 0; i < MAX_TRIGGERS; i++) { Trigger* trigger = (*gCurrentTriggerListPtr)[i]; if ((trigger != NULL) &&