summaryrefslogtreecommitdiff
path: root/src/code
diff options
context:
space:
mode:
authorAnghelo Carvajal <angheloalf95@gmail.com>2023-08-12 11:44:35 -0400
committerGitHub <noreply@github.com>2023-08-12 11:44:35 -0400
commit656fd08ee828024f5a0e888f293ca95b7a83cd64 (patch)
tree394a0e9870c1eb946187ef388b23596fcccde1c1 /src/code
parent138dd55662181b7de82f003c6b46ba3d0611b258 (diff)
Gamestate table (#1354)
* gamestate_table.h * move macros * bss * format
Diffstat (limited to 'src/code')
-rw-r--r--src/code/graph.c30
-rw-r--r--src/code/z_game_dlftbls.c50
2 files changed, 43 insertions, 37 deletions
diff --git a/src/code/graph.c b/src/code/graph.c
index 24a554dc2..fe1542f66 100644
--- a/src/code/graph.c
+++ b/src/code/graph.c
@@ -75,27 +75,17 @@ void Graph_SetNextGfxPool(GraphicsContext* gfxCtx) {
GameStateOverlay* Graph_GetNextGameState(GameState* gameState) {
GameStateFunc gameStateInit = GameState_GetInit(gameState);
- if (gameStateInit == Setup_Init) {
- return &gGameStateOverlayTable[0];
- }
- if (gameStateInit == MapSelect_Init) {
- return &gGameStateOverlayTable[1];
- }
- if (gameStateInit == ConsoleLogo_Init) {
- return &gGameStateOverlayTable[2];
- }
- if (gameStateInit == Play_Init) {
- return &gGameStateOverlayTable[3];
- }
- if (gameStateInit == TitleSetup_Init) {
- return &gGameStateOverlayTable[4];
- }
- if (gameStateInit == FileSelect_Init) {
- return &gGameStateOverlayTable[5];
- }
- if (gameStateInit == DayTelop_Init) {
- return &gGameStateOverlayTable[6];
+ // Generates code to match gameStateInit to a gamestate entry and returns it if found
+#define DEFINE_GAMESTATE_INTERNAL(typeName, enumName) \
+ if (gameStateInit == typeName##_Init) { \
+ return &gGameStateOverlayTable[enumName]; \
}
+#define DEFINE_GAMESTATE(typeName, enumName, name) DEFINE_GAMESTATE_INTERNAL(typeName, enumName)
+
+#include "tables/gamestate_table.h"
+
+#undef DEFINE_GAMESTATE
+#undef DEFINE_GAMESTATE_INTERNAL
return NULL;
}
diff --git a/src/code/z_game_dlftbls.c b/src/code/z_game_dlftbls.c
index 7336b01f6..cb3aee317 100644
--- a/src/code/z_game_dlftbls.c
+++ b/src/code/z_game_dlftbls.c
@@ -6,22 +6,38 @@
#include "overlays/gamestates/ovl_title/z_title.h"
#include "z_title_setup.h"
-#define GAMESTATE_OVERLAY(name, init, destroy, size) \
- { \
- NULL, SEGMENT_ROM_START(ovl_##name), SEGMENT_ROM_END(ovl_##name), SEGMENT_START(ovl_##name), \
- SEGMENT_END(ovl_##name), 0, init, destroy, 0, 0, 0, size \
- }
-#define GAMESTATE_OVERLAY_INTERNAL(init, destroy, size) \
- { NULL, 0, 0, NULL, NULL, 0, init, destroy, 0, 0, 0, size }
-
-GameStateOverlay gGameStateOverlayTable[] = {
- GAMESTATE_OVERLAY_INTERNAL(Setup_Init, Setup_Destroy, sizeof(SetupState)),
- GAMESTATE_OVERLAY(select, MapSelect_Init, MapSelect_Destroy, sizeof(MapSelectState)),
- GAMESTATE_OVERLAY(title, ConsoleLogo_Init, ConsoleLogo_Destroy, sizeof(ConsoleLogoState)),
- GAMESTATE_OVERLAY_INTERNAL(Play_Init, Play_Destroy, sizeof(PlayState)),
- GAMESTATE_OVERLAY(opening, TitleSetup_Init, TitleSetup_Destroy, sizeof(TitleSetupState)),
- GAMESTATE_OVERLAY(file_choose, FileSelect_Init, FileSelect_Destroy, sizeof(FileSelectState)),
- GAMESTATE_OVERLAY(daytelop, DayTelop_Init, DayTelop_Destroy, sizeof(DayTelopState)),
+// Linker symbol declarations (used in the table below)
+#define DEFINE_GAMESTATE(_typeName, _enumName, segmentName) DECLARE_OVERLAY_SEGMENT(segmentName)
+#define DEFINE_GAMESTATE_INTERNAL(_typeName, _enumName)
+
+#include "tables/gamestate_table.h"
+
+#undef DEFINE_GAMESTATE
+#undef DEFINE_GAMESTATE_INTERNAL
+
+// Gamestate Overlay Table definition
+#define DEFINE_GAMESTATE_INTERNAL(typeName, _enumName) \
+ { NULL, 0, 0, NULL, NULL, NULL, typeName##_Init, typeName##_Destroy, NULL, NULL, 0, sizeof(typeName##State) },
+
+#define DEFINE_GAMESTATE(typeName, _enumName, segmentName) \
+ { NULL, \
+ (uintptr_t)SEGMENT_ROM_START(ovl_##segmentName), \
+ (uintptr_t)SEGMENT_ROM_END(ovl_##segmentName), \
+ SEGMENT_START(ovl_##segmentName), \
+ SEGMENT_END(ovl_##segmentName), \
+ NULL, \
+ typeName##_Init, \
+ typeName##_Destroy, \
+ NULL, \
+ NULL, \
+ 0, \
+ sizeof(typeName##State) },
+
+GameStateOverlay gGameStateOverlayTable[GAMESTATE_ID_MAX] = {
+#include "tables/gamestate_table.h"
};
-s32 gGraphNumGameStates = ARRAY_COUNT(gGameStateOverlayTable);
+#undef DEFINE_GAMESTATE
+#undef DEFINE_GAMESTATE_INTERNAL
+
+GameStateId gGraphNumGameStates = GAMESTATE_ID_MAX;