papermario/src/game_states.c

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

190 lines
5.0 KiB
C
Raw Normal View History

#include "common.h"
#include "game_modes.h"
BSS GameMode gMainGameMode[2];
BSS s32 D_80151730[4]; // unused? or probably a part of GameMode?
void mode_default_nop(void) {
}
void clear_game_modes(void) {
GameMode* gameMode;
s32 i;
for (gameMode = gMainGameMode, i = 0; i < ARRAY_COUNT(gMainGameMode); i++, gameMode++) {
gameMode->flags = MODE_FLAG_NONE;
}
}
// Function is unused.
GameMode* set_next_game_mode(GameMode* mode) {
GameMode* gameMode;
s32 i;
for (gameMode = gMainGameMode, i = 0; i < ARRAY_COUNT(gMainGameMode); i++, gameMode++) {
if (gameMode->flags == MODE_FLAG_NONE) {
break;
}
}
ASSERT(i < ARRAY_COUNT(gMainGameMode));
gameMode->flags = MODE_FLAG_INITIALIZED | MODE_FLAG_STEP_NOT_DONE;
gameMode->init = mode->init;
gameMode->step = mode->step;
gameMode->render = mode->render;
gameMode->unusedFunc = NULL;
if (gameMode->init == NULL) {
gameMode->init = mode_default_nop;
}
if (gameMode->step == NULL) {
gameMode->step = mode_default_nop;
}
if (gameMode->unusedFunc == NULL) {
gameMode->unusedFunc = mode_default_nop;
}
if (gameMode->render == NULL) {
gameMode->render = mode_default_nop;
}
gameMode->renderAux = mode_default_nop;
gameMode->init();
return gameMode;
}
GameMode* set_game_mode_slot(s32 i, GameMode* mode) {
GameMode* gameMode = &gMainGameMode[i];
ASSERT(i < ARRAY_COUNT(gMainGameMode));
gameMode->flags = MODE_FLAG_INITIALIZED | MODE_FLAG_STEP_NOT_DONE;
gameMode->init = mode->init;
gameMode->step = mode->step;
gameMode->render = mode->render;
gameMode->unusedFunc = NULL;
if (gameMode->init == NULL) gameMode->init = mode_default_nop;
if (gameMode->step == NULL) gameMode->step = mode_default_nop;
if (gameMode->unusedFunc == NULL) gameMode->unusedFunc = mode_default_nop;
if (gameMode->render == NULL) gameMode->render = mode_default_nop;
gameMode->renderAux = mode_default_nop;
gameMode->init();
return gameMode;
}
void game_mode_set_fpDrawAuxUI(s32 i, void (*fn)(void)) {
GameMode* gameMode = &gMainGameMode[i];
ASSERT(i < ARRAY_COUNT(gMainGameMode));
gameMode->renderAux = fn;
gameMode->flags |= MODE_FLAG_RENDER_AUX_SET;
if (fn == NULL) {
gameMode->renderAux = mode_default_nop;
}
}
// Unused
void set_game_mode_flag_4(s32 i) {
gMainGameMode[i].flags |= MODE_FLAG_4;
}
// Unused
void set_game_mode_flag_8(s32 i) {
gMainGameMode[i].flags |= MODE_FLAG_8;
}
// Unused
void clear_game_mode_unk_flags(s32 i) {
gMainGameMode[i].flags &= ~(MODE_FLAG_4 | MODE_FLAG_8 | MODE_FLAG_10);
}
// Unused
void set_game_mode_flag_10(s32 i) {
gMainGameMode[i].flags &= ~(MODE_FLAG_4 | MODE_FLAG_8);
gMainGameMode[i].flags |= MODE_FLAG_10;
}
void step_current_game_mode(void) {
GameMode* gameMode = gMainGameMode;
s32 i;
for (i = 0; i < ARRAY_COUNT(gMainGameMode); i++, gameMode++) {
if (gameMode->flags != MODE_FLAG_NONE) {
if (!(gameMode->flags & MODE_FLAG_4)) {
if (!(gameMode->flags & MODE_FLAG_8)) {
gameMode->flags &= ~MODE_FLAG_STEP_NOT_DONE;
gameMode->step();
}
}
}
}
}
// Unused
void state_do_unk(void) {
GameMode* gameMode = gMainGameMode;
s32 i;
for (i = 0; i < ARRAY_COUNT(gMainGameMode); i++, gameMode++) {
if (gameMode->flags != MODE_FLAG_NONE) {
if (!(gameMode->flags & MODE_FLAG_4)) {
if (!(gameMode->flags & MODE_FLAG_10)) {
gameMode->unusedFunc();
}
}
}
}
}
void state_render_backUI(void) {
GameMode* gameMode = gMainGameMode;
s32 i;
for (i = 0; i < ARRAY_COUNT(gMainGameMode); i++, gameMode++) {
if (gameMode->flags != MODE_FLAG_NONE) {
if (!(gameMode->flags & MODE_FLAG_4)) {
if (!(gameMode->flags & MODE_FLAG_10)) {
gameMode->render();
}
}
}
}
}
void state_render_frontUI(void) {
GameMode* gameMode = gMainGameMode;
s32 i;
for (i = 0; i < ARRAY_COUNT(gMainGameMode); i++, gameMode++) {
if (gameMode->flags != MODE_FLAG_NONE) {
if (!(gameMode->flags & MODE_FLAG_4)) {
if (!(gameMode->flags & MODE_FLAG_STEP_NOT_DONE)) {
if (gameMode->flags & MODE_FLAG_RENDER_AUX_SET) {
gameMode->renderAux();
}
}
}
}
}
// re-initialization needed - evidence of inlining? or just copy/pasting?
gameMode = &gMainGameMode[0];
for (i = 0; i < ARRAY_COUNT(gMainGameMode); i++, gameMode++) {
if (gameMode->flags != MODE_FLAG_NONE) {
if (!(gameMode->flags & MODE_FLAG_4)) {
if (!(gameMode->flags & MODE_FLAG_STEP_NOT_DONE)) {
if (gameMode->flags & MODE_FLAG_10) {
gameMode->render();
}
}
}
}
}
}