Skip to content

Commit

Permalink
phase: replace GF_PHASE_BREAK with PHASE_CONTROL
Browse files Browse the repository at this point in the history
Removes `GF_PHASE_BREAK` enum member in favor of a new struct,
`PHASE_CONTROL` that controls phasers alone.
  • Loading branch information
rr- committed Sep 2, 2024
1 parent 2767944 commit f4dd3fb
Show file tree
Hide file tree
Showing 12 changed files with 178 additions and 103 deletions.
2 changes: 2 additions & 0 deletions src/game/gameflow.c
Original file line number Diff line number Diff line change
Expand Up @@ -1075,6 +1075,7 @@ GameFlow_InterpretSequence(int32_t level_num, GAMEFLOW_LEVEL_TYPE level_type)

GAMEFLOW_SEQUENCE *seq = g_GameFlow.levels[level_num].sequence;
GAMEFLOW_COMMAND command = { .action = GF_EXIT_TO_TITLE };

while (seq->type != GFS_END) {
LOG_INFO("seq %d %d", seq->type, seq->data);

Expand Down Expand Up @@ -1327,6 +1328,7 @@ GameFlow_StorySoFar(int32_t level_num, int32_t savegame_level)

GAMEFLOW_SEQUENCE *seq = g_GameFlow.levels[level_num].sequence;
GAMEFLOW_COMMAND command = { .action = GF_EXIT_TO_TITLE };

while (seq->type != GFS_END) {
LOG_INFO("seq %d %d", seq->type, seq->data);

Expand Down
27 changes: 13 additions & 14 deletions src/game/phase/phase.c
Original file line number Diff line number Diff line change
Expand Up @@ -25,24 +25,24 @@ static bool m_Running = false;
static PHASE m_PhaseToSet = PHASE_NULL;
static void *m_PhaseToSetArg = NULL;

static GAMEFLOW_COMMAND Phase_Control(int32_t nframes);
static PHASE_CONTROL Phase_Control(int32_t nframes);
static void Phase_Draw(void);
static int32_t Phase_Wait(void);
static void Phase_SetUnconditionally(const PHASE phase, void *arg);

static GAMEFLOW_COMMAND Phase_Control(int32_t nframes)
static PHASE_CONTROL Phase_Control(int32_t nframes)
{
if (g_GameInfo.override_gf_command.action != GF_CONTINUE_SEQUENCE) {
const GAMEFLOW_COMMAND override = g_GameInfo.override_gf_command;
g_GameInfo.override_gf_command =
(GAMEFLOW_COMMAND) { .action = GF_CONTINUE_SEQUENCE };
return override;
return (PHASE_CONTROL) { .end = true, .command = override };
}

if (m_Phaser && m_Phaser->control) {
return m_Phaser->control(nframes);
}
return (GAMEFLOW_COMMAND) { .action = GF_CONTINUE_SEQUENCE };
return (PHASE_CONTROL) { .end = false };
}

static void Phase_Draw(void)
Expand Down Expand Up @@ -134,12 +134,13 @@ static int32_t Phase_Wait(void)
GAMEFLOW_COMMAND Phase_Run(void)
{
int32_t nframes = Clock_SyncTicks();
GAMEFLOW_COMMAND command = { .action = GF_CONTINUE_SEQUENCE };
PHASE_CONTROL control = { .end = false };

m_Running = true;
LOG_DEBUG("phase start, phase=%d", m_Phase);

while (1) {
command = Phase_Control(nframes);
control = Phase_Control(nframes);

if (m_PhaseToSet != PHASE_NULL) {
Interpolation_SetRate(1.0);
Expand All @@ -148,7 +149,7 @@ GAMEFLOW_COMMAND Phase_Run(void)
Phase_SetUnconditionally(m_PhaseToSet, m_PhaseToSetArg);
m_PhaseToSet = PHASE_NULL;
m_PhaseToSetArg = NULL;
if (command.action != GF_CONTINUE_SEQUENCE) {
if (control.end) {
Phase_Draw();
break;
}
Expand All @@ -157,7 +158,7 @@ GAMEFLOW_COMMAND Phase_Run(void)
continue;
}

if (command.action != GF_CONTINUE_SEQUENCE) {
if (control.end) {
Phase_Draw();
break;
}
Expand All @@ -173,13 +174,11 @@ GAMEFLOW_COMMAND Phase_Run(void)
nframes = Phase_Wait();
}

if (command.action == GF_PHASE_BREAK) {
command.action = GF_CONTINUE_SEQUENCE;
}

m_Running = false;
Phase_Set(PHASE_NULL, NULL);

LOG_DEBUG("phase end, action=%d, param=%d", command.action, command.param);
return command;
LOG_DEBUG(
"phase end, action=%d, param=%d", control.command.action,
control.command.param);
return control.command;
}
17 changes: 16 additions & 1 deletion src/game/phase/phase.h
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,21 @@

#include <stdint.h>

// Status returned upon every logical frame by the control routine.
// - Set .end = false to keep the phase loop spinning.
// - Set .end = true to end the current phase.
//
// To continue executing current game sequence, .command.action member should
// be set to GF_CONTINUE_SEQUENCE. To break out of the current sequence and
// switch to a different game flow action, .command.action should be set to
// the action to run.
//
// It does not make sense to return both .end = false and .command.
typedef struct {
bool end;
GAMEFLOW_COMMAND command;
} PHASE_CONTROL;

typedef enum PHASE {
PHASE_NULL,
PHASE_GAME,
Expand All @@ -18,7 +33,7 @@ typedef enum PHASE {
typedef struct PHASER {
void (*start)(void *arg);
void (*end)();
GAMEFLOW_COMMAND (*control)(int32_t nframes);
PHASE_CONTROL (*control)(int32_t nframes);
void (*draw)(void);
int32_t (*wait)(void);
} PHASER;
Expand Down
24 changes: 15 additions & 9 deletions src/game/phase/phase_cutscene.c
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ static void Phase_Cutscene_InitialiseHair(int32_t level_num);

static void Phase_Cutscene_Start(void *arg);
static void Phase_Cutscene_End(void);
static GAMEFLOW_COMMAND Phase_Cutscene_Control(int32_t nframes);
static PHASE_CONTROL Phase_Cutscene_Control(int32_t nframes);
static void Phase_Cutscene_Draw(void);

static void Phase_Cutscene_InitialiseHair(int32_t level_num)
Expand Down Expand Up @@ -97,16 +97,19 @@ static void Phase_Cutscene_End(void)
Sound_StopAllSamples();
}

static GAMEFLOW_COMMAND Phase_Cutscene_Control(int32_t nframes)
static PHASE_CONTROL Phase_Cutscene_Control(int32_t nframes)
{
Interpolation_Remember();

for (int i = 0; i < nframes; i++) {
if (g_CineFrame >= g_NumCineFrames - 1) {
g_LevelComplete = true;
return (GAMEFLOW_COMMAND) {
.action = GF_LEVEL_COMPLETE,
.param = g_CurrentLevel,
return (PHASE_CONTROL) {
.end = true,
.command = {
.action = GF_LEVEL_COMPLETE,
.param = g_CurrentLevel,
},
};
}

Expand All @@ -116,9 +119,12 @@ static GAMEFLOW_COMMAND Phase_Cutscene_Control(int32_t nframes)

if (g_InputDB.menu_confirm || g_InputDB.menu_back) {
g_LevelComplete = true;
return (GAMEFLOW_COMMAND) {
.action = GF_LEVEL_COMPLETE,
.param = g_CurrentLevel,
return (PHASE_CONTROL) {
.end = true,
.command = {
.action = GF_LEVEL_COMPLETE,
.param = g_CurrentLevel,
},
};
}

Expand All @@ -130,7 +136,7 @@ static GAMEFLOW_COMMAND Phase_Cutscene_Control(int32_t nframes)
g_CineFrame++;
}

return (GAMEFLOW_COMMAND) { .action = GF_CONTINUE_SEQUENCE };
return (PHASE_CONTROL) { .end = false };
}

static void Phase_Cutscene_Draw(void)
Expand Down
40 changes: 24 additions & 16 deletions src/game/phase/phase_demo.c
Original file line number Diff line number Diff line change
Expand Up @@ -56,9 +56,9 @@ static int32_t Phase_Demo_ChooseLevel(void);

static void Phase_Demo_Start(void *arg);
static void Phase_Demo_End(void);
static GAMEFLOW_COMMAND Phase_Demo_Run(int32_t nframes);
static GAMEFLOW_COMMAND Phase_Demo_FadeOut(void);
static GAMEFLOW_COMMAND Phase_Demo_Control(int32_t nframes);
static PHASE_CONTROL Phase_Demo_Run(int32_t nframes);
static PHASE_CONTROL Phase_Demo_FadeOut(void);
static PHASE_CONTROL Phase_Demo_Control(int32_t nframes);
static void Phase_Demo_Draw(void);

static bool Phase_Demo_ProcessInput(void)
Expand Down Expand Up @@ -221,7 +221,7 @@ static void Phase_Demo_End(void)
g_Config.fix_bear_ai = m_oldFixBearAI;
}

static GAMEFLOW_COMMAND Phase_Demo_Run(int32_t nframes)
static PHASE_CONTROL Phase_Demo_Run(int32_t nframes)
{
Interpolation_Remember();
CLAMPG(nframes, MAX_FRAMES);
Expand All @@ -230,12 +230,12 @@ static GAMEFLOW_COMMAND Phase_Demo_Run(int32_t nframes)
Lara_Cheat_Control();
if (g_LevelComplete) {
m_State = STATE_FADE_OUT;
return (GAMEFLOW_COMMAND) { .action = GF_CONTINUE_SEQUENCE };
goto end;
}

if (!Phase_Demo_ProcessInput()) {
m_State = STATE_FADE_OUT;
return (GAMEFLOW_COMMAND) { .action = GF_CONTINUE_SEQUENCE };
goto end;
}
Game_ProcessInput();

Expand All @@ -256,33 +256,38 @@ static GAMEFLOW_COMMAND Phase_Demo_Run(int32_t nframes)
Input_Update();
if (g_InputDB.any) {
m_State = STATE_FADE_OUT;
return (GAMEFLOW_COMMAND) { .action = GF_CONTINUE_SEQUENCE };
goto end;
}
}

return (GAMEFLOW_COMMAND) {
.action = GF_CONTINUE_SEQUENCE,
};
end:
return (PHASE_CONTROL) { .end = false };
}

static GAMEFLOW_COMMAND Phase_Demo_FadeOut(void)
static PHASE_CONTROL Phase_Demo_FadeOut(void)
{
Text_Flash(m_DemoModeText, 0, 0);
Input_Update();
Output_FadeToBlack(true);
if (g_InputDB.menu_confirm || g_InputDB.menu_back
|| !Output_FadeIsAnimating()) {
Output_FadeResetToBlack();
return (GAMEFLOW_COMMAND) { .action = GF_EXIT_TO_TITLE };
return (PHASE_CONTROL) {
.end = true,
.command = { .action = GF_EXIT_TO_TITLE },
};
}
return (GAMEFLOW_COMMAND) { .action = GF_CONTINUE_SEQUENCE };
return (PHASE_CONTROL) { .end = false };
}

static GAMEFLOW_COMMAND Phase_Demo_Control(int32_t nframes)
static PHASE_CONTROL Phase_Demo_Control(int32_t nframes)
{
switch (m_State) {
case STATE_INVALID:
return (GAMEFLOW_COMMAND) { .action = GF_EXIT_TO_TITLE };
return (PHASE_CONTROL) {
.end = true,
.command = { .action = GF_EXIT_TO_TITLE },
};

case STATE_RUN:
return Phase_Demo_Run(nframes);
Expand All @@ -292,7 +297,10 @@ static GAMEFLOW_COMMAND Phase_Demo_Control(int32_t nframes)
}

assert(false);
return (GAMEFLOW_COMMAND) { .action = GF_PHASE_BREAK };
return (PHASE_CONTROL) {
.end = true,
.command = { .action = GF_CONTINUE_SEQUENCE },
};
}

static void Phase_Demo_Draw(void)
Expand Down
17 changes: 10 additions & 7 deletions src/game/phase/phase_game.c
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@

static void Phase_Game_Start(void *arg);
static void Phase_Game_End(void);
static GAMEFLOW_COMMAND Phase_Game_Control(int32_t nframes);
static PHASE_CONTROL Phase_Game_Control(int32_t nframes);
static void Phase_Game_Draw(void);

static void Phase_Game_Start(void *arg)
Expand All @@ -44,7 +44,7 @@ static void Phase_Game_End(void)
{
}

static GAMEFLOW_COMMAND Phase_Game_Control(int32_t nframes)
static PHASE_CONTROL Phase_Game_Control(int32_t nframes)
{
Interpolation_Remember();
Stats_UpdateTimer();
Expand All @@ -53,7 +53,10 @@ static GAMEFLOW_COMMAND Phase_Game_Control(int32_t nframes)
for (int32_t i = 0; i < nframes; i++) {
Lara_Cheat_Control();
if (g_LevelComplete) {
return (GAMEFLOW_COMMAND) { .action = GF_PHASE_BREAK };
return (PHASE_CONTROL) {
.end = true,
.command = { .action = GF_CONTINUE_SEQUENCE },
};
}

Input_Update();
Expand All @@ -67,7 +70,7 @@ static GAMEFLOW_COMMAND Phase_Game_Control(int32_t nframes)
if (g_OverlayFlag == 2) {
g_OverlayFlag = 1;
Inv_Display(INV_DEATH_MODE);
return (GAMEFLOW_COMMAND) { .action = GF_CONTINUE_SEQUENCE };
return (PHASE_CONTROL) { .end = false };
} else {
g_OverlayFlag = 2;
}
Expand Down Expand Up @@ -96,13 +99,13 @@ static GAMEFLOW_COMMAND Phase_Game_Control(int32_t nframes)
}

g_OverlayFlag = 1;
return (GAMEFLOW_COMMAND) { .action = GF_CONTINUE_SEQUENCE };
return (PHASE_CONTROL) { .end = false };
}
}

if (!g_Lara.death_timer && g_InputDB.pause) {
Phase_Set(PHASE_PAUSE, NULL);
return (GAMEFLOW_COMMAND) { .action = GF_CONTINUE_SEQUENCE };
return (PHASE_CONTROL) { .end = false };
} else {
Item_Control();
Effect_Control();
Expand All @@ -123,7 +126,7 @@ static GAMEFLOW_COMMAND Phase_Game_Control(int32_t nframes)
g_GameInfo.ask_for_save = false;
}

return (GAMEFLOW_COMMAND) { .action = GF_CONTINUE_SEQUENCE };
return (PHASE_CONTROL) { .end = false };
}

static void Phase_Game_Draw(void)
Expand Down
Loading

0 comments on commit f4dd3fb

Please sign in to comment.