Skip to content

Commit

Permalink
tr1/game-flow/sequencer: match variable naming with tr2
Browse files Browse the repository at this point in the history
  • Loading branch information
rr- committed Jan 25, 2025
1 parent b868f37 commit 5e4ae99
Show file tree
Hide file tree
Showing 3 changed files with 101 additions and 100 deletions.
40 changes: 20 additions & 20 deletions src/tr1/game/game_flow/reader.c
Original file line number Diff line number Diff line change
Expand Up @@ -82,30 +82,30 @@ static GAME_FLOW_LEVEL_SETTINGS m_DefaultSettings = {
static M_SEQUENCE_EVENT_HANDLER m_SequenceEventHandlers[] = {
// clang-format off
// Events without arguments
{ GFS_FLIP_MAP, NULL, NULL },
{ GFS_REMOVE_WEAPONS, NULL, NULL },
{ GFS_REMOVE_SCIONS, NULL, NULL },
{ GFS_REMOVE_AMMO, NULL, NULL },
{ GFS_REMOVE_MEDIPACKS, NULL, NULL },
{ GFS_EXIT_TO_TITLE, NULL, NULL },
{ GFS_FLIP_MAP, NULL, NULL },
{ GFS_REMOVE_WEAPONS, NULL, NULL },
{ GFS_REMOVE_SCIONS, NULL, NULL },
{ GFS_REMOVE_AMMO, NULL, NULL },
{ GFS_REMOVE_MEDIPACKS, NULL, NULL },
{ GFS_EXIT_TO_TITLE, NULL, NULL },

// Events with integer arguments
{ GFS_LOAD_LEVEL, M_HandleIntEvent, "level_id" },
{ GFS_PLAY_LEVEL, M_HandleIntEvent, "level_id" },
{ GFS_PLAY_FMV, M_HandleIntEvent, "fmv_id" },
{ GFS_LEVEL_STATS, M_HandleIntEvent, "level_id" },
{ GFS_EXIT_TO_LEVEL, M_HandleIntEvent, "level_id" },
{ GFS_EXIT_TO_CINE, M_HandleIntEvent, "level_id" },
{ GFS_SET_CAMERA_ANGLE, M_HandleIntEvent, "value" },
{ GFS_PLAY_SYNCED_AUDIO, M_HandleIntEvent, "audio_id" },
{ GFS_SETUP_BACON_LARA, M_HandleIntEvent, "anchor_room" },
{ GFS_LOAD_LEVEL, M_HandleIntEvent, "level_id" },
{ GFS_PLAY_LEVEL, M_HandleIntEvent, "level_id" },
{ GFS_PLAY_FMV, M_HandleIntEvent, "fmv_id" },
{ GFS_LEVEL_STATS, M_HandleIntEvent, "level_id" },
{ GFS_EXIT_TO_LEVEL, M_HandleIntEvent, "level_id" },
{ GFS_EXIT_TO_CINE, M_HandleIntEvent, "level_id" },
{ GFS_SET_CAMERA_ANGLE, M_HandleIntEvent, "value" },
{ GFS_PLAY_SYNCED_AUDIO, M_HandleIntEvent, "audio_id" },
{ GFS_SETUP_BACON_LARA, M_HandleIntEvent, "anchor_room" },

// Special cases with custom handlers
{ GFS_LOADING_SCREEN, M_HandlePictureEvent, NULL },
{ GFS_DISPLAY_PICTURE, M_HandlePictureEvent, NULL },
{ GFS_TOTAL_STATS, M_HandleTotalStatsEvent, NULL },
{ GFS_ADD_ITEM, M_HandleAddItemEvent, NULL },
{ GFS_MESH_SWAP, M_HandleMeshSwapEvent, NULL },
{ GFS_LOADING_SCREEN, M_HandlePictureEvent, NULL },
{ GFS_DISPLAY_PICTURE, M_HandlePictureEvent, NULL },
{ GFS_TOTAL_STATS, M_HandleTotalStatsEvent, NULL },
{ GFS_ADD_ITEM, M_HandleAddItemEvent, NULL },
{ GFS_MESH_SWAP, M_HandleMeshSwapEvent, NULL },

// Sentinel to mark the end of the table
{ (GAME_FLOW_SEQUENCE_EVENT_TYPE)-1, NULL, NULL },
Expand Down
123 changes: 62 additions & 61 deletions src/tr1/game/game_flow/sequencer.c
Original file line number Diff line number Diff line change
Expand Up @@ -14,29 +14,33 @@
#include "global/vars.h"

#include <libtrx/config.h>
#include <libtrx/enum_map.h>
#include <libtrx/game/phase.h>
#include <libtrx/log.h>

static GAME_FLOW_COMMAND M_StorySoFar(
const GAME_FLOW_LEVEL *level, int32_t savegame_level);

GAME_FLOW_COMMAND
GF_InterpretSequence(int32_t level_num, GAME_FLOW_LEVEL_TYPE level_type)
GF_InterpretSequence(const int32_t level_num, const GAME_FLOW_LEVEL_TYPE type)
{
LOG_INFO("level_num=%d level_type=%d", level_num, level_type);
LOG_DEBUG("running sequence for level=%d type=%d", level_num, type);

g_GameInfo.remove_guns = false;
g_GameInfo.remove_scions = false;
g_GameInfo.remove_ammo = false;
g_GameInfo.remove_medipacks = false;

GAME_FLOW_COMMAND command = { .action = GF_EXIT_TO_TITLE };
GAME_FLOW_COMMAND gf_cmd = { .action = GF_EXIT_TO_TITLE };

const GAME_FLOW_LEVEL *const level = GF_GetLevel(level_num, level_type);
const GAME_FLOW_LEVEL *const level = GF_GetLevel(level_num, type);
const GAME_FLOW_SEQUENCE *const sequence = &level->sequence;
for (int32_t i = 0; i < sequence->length; i++) {
const GAME_FLOW_SEQUENCE_EVENT *const event = &sequence->events[i];
LOG_INFO("event %d %d", event->type, event->data);
LOG_DEBUG(
"event type=%s(%d) data=0x%x",
ENUM_MAP_TO_STRING(GAME_FLOW_SEQUENCE_EVENT_TYPE, event->type),
event->type, event->data);

if (!g_Config.gameplay.enable_cine && level->type == GFL_CUTSCENE) {
bool skip;
Expand All @@ -61,17 +65,17 @@ GF_InterpretSequence(int32_t level_num, GAME_FLOW_LEVEL_TYPE level_type)
switch (event->type) {
case GFS_LOAD_LEVEL: {
const int32_t num = (int32_t)(intptr_t)event->data;
if (level_type == GFL_DEMO) {
if (type == GFL_DEMO) {
break;
}
if (level->type == GFL_CUTSCENE) {
command = GF_LoadLevel(level_num, GFL_CUTSCENE);
if (command.action != GF_NOOP
&& command.action != GF_LEVEL_COMPLETE) {
return command;
gf_cmd = GF_LoadLevel(level_num, GFL_CUTSCENE);
if (gf_cmd.action != GF_NOOP
&& gf_cmd.action != GF_LEVEL_COMPLETE) {
return gf_cmd;
}
} else {
const bool result = Game_Start_Legacy(num, level_type);
const bool result = Game_Start_Legacy(num, type);
if (!result) {
g_CurrentLevel = -1;
return (GAME_FLOW_COMMAND) { .action = GF_EXIT_TO_TITLE };
Expand All @@ -82,31 +86,31 @@ GF_InterpretSequence(int32_t level_num, GAME_FLOW_LEVEL_TYPE level_type)

case GFS_PLAY_LEVEL:
if (level->type == GFL_CUTSCENE) {
if (level_type != GFL_SAVED) {
command = GF_RunCutscene((int32_t)(intptr_t)event->data);
if (command.action != GF_NOOP
&& command.action != GF_LEVEL_COMPLETE) {
return command;
if (type != GFL_SAVED) {
gf_cmd = GF_RunCutscene((int32_t)(intptr_t)event->data);
if (gf_cmd.action != GF_NOOP
&& gf_cmd.action != GF_LEVEL_COMPLETE) {
return gf_cmd;
}
}
} else if (level_type == GFL_DEMO) {
} else if (type == GFL_DEMO) {
return GF_RunDemo(level_num);
} else {
if (level_type != GFL_SAVED
if (type != GFL_SAVED
&& level_num != g_GameFlow.first_level_num) {
Lara_RevertToPistolsIfNeeded();
}
command = GF_RunGame(level_num, level_type);
if (command.action != GF_NOOP
&& command.action != GF_LEVEL_COMPLETE) {
return command;
gf_cmd = GF_RunGame(level_num, type);
if (gf_cmd.action != GF_NOOP
&& gf_cmd.action != GF_LEVEL_COMPLETE) {
return gf_cmd;
}
}
break;

case GFS_PLAY_FMV: {
const int16_t fmv_id = (int16_t)(intptr_t)event->data;
if (level_type != GFL_SAVED) {
if (type != GFL_SAVED) {
if (fmv_id < 0 || fmv_id >= g_GameFlow.fmv_count) {
LOG_ERROR("Invalid FMV number: %d", fmv_id);
} else {
Expand All @@ -124,28 +128,27 @@ GF_InterpretSequence(int32_t level_num, GAME_FLOW_LEVEL_TYPE level_type)
.show_final_stats = false,
.use_bare_style = true,
});
command = PhaseExecutor_Run(phase);
gf_cmd = PhaseExecutor_Run(phase);
Phase_Stats_Destroy(phase);
if (command.action != GF_NOOP) {
return command;
if (gf_cmd.action != GF_NOOP) {
return gf_cmd;
}
break;
}

case GFS_TOTAL_STATS:
if (g_Config.gameplay.enable_total_stats
&& level_type != GFL_SAVED) {
if (g_Config.gameplay.enable_total_stats && type != GFL_SAVED) {
PHASE *const phase = Phase_Stats_Create((PHASE_STATS_ARGS) {
.background_type = BK_IMAGE,
.background_path = event->data,
.level_num = level_num,
.show_final_stats = true,
.use_bare_style = false,
});
command = PhaseExecutor_Run(phase);
gf_cmd = PhaseExecutor_Run(phase);
Phase_Stats_Destroy(phase);
if (command.action != GF_NOOP) {
return command;
if (gf_cmd.action != GF_NOOP) {
return gf_cmd;
}
}
break;
Expand All @@ -157,7 +160,7 @@ GF_InterpretSequence(int32_t level_num, GAME_FLOW_LEVEL_TYPE level_type)
break;
}

if (level_type == GFL_SAVED) {
if (type == GFL_SAVED) {
break;
}

Expand All @@ -173,10 +176,10 @@ GF_InterpretSequence(int32_t level_num, GAME_FLOW_LEVEL_TYPE level_type)
.fade_out_time = 1.0,
.display_time_includes_fades = false,
});
command = PhaseExecutor_Run(phase);
gf_cmd = PhaseExecutor_Run(phase);
Phase_Picture_Destroy(phase);
if (command.action != GF_NOOP) {
return command;
if (gf_cmd.action != GF_NOOP) {
return gf_cmd;
}
break;

Expand Down Expand Up @@ -213,7 +216,7 @@ GF_InterpretSequence(int32_t level_num, GAME_FLOW_LEVEL_TYPE level_type)
break;

case GFS_ADD_ITEM:
if (level_type != GFL_SAVED) {
if (type != GFL_SAVED) {
const GAME_FLOW_ADD_ITEM_DATA *add_item_data =
(const GAME_FLOW_ADD_ITEM_DATA *)event->data;
Inv_AddItemNTimes(
Expand All @@ -222,27 +225,25 @@ GF_InterpretSequence(int32_t level_num, GAME_FLOW_LEVEL_TYPE level_type)
break;

case GFS_REMOVE_WEAPONS:
if (level_type != GFL_SAVED
&& !(g_GameInfo.bonus_flag & GBF_NGPLUS)) {
if (type != GFL_SAVED && !(g_GameInfo.bonus_flag & GBF_NGPLUS)) {
g_GameInfo.remove_guns = true;
}
break;

case GFS_REMOVE_SCIONS:
if (level_type != GFL_SAVED) {
if (type != GFL_SAVED) {
g_GameInfo.remove_scions = true;
}
break;

case GFS_REMOVE_AMMO:
if (level_type != GFL_SAVED
&& !(g_GameInfo.bonus_flag & GBF_NGPLUS)) {
if (type != GFL_SAVED && !(g_GameInfo.bonus_flag & GBF_NGPLUS)) {
g_GameInfo.remove_ammo = true;
}
break;

case GFS_REMOVE_MEDIPACKS:
if (level_type != GFL_SAVED) {
if (type != GFL_SAVED) {
g_GameInfo.remove_medipacks = true;
}
break;
Expand All @@ -267,13 +268,13 @@ GF_InterpretSequence(int32_t level_num, GAME_FLOW_LEVEL_TYPE level_type)
}
}

return command;
return gf_cmd;
}

static GAME_FLOW_COMMAND M_StorySoFar(
const GAME_FLOW_LEVEL *const level, const int32_t savegame_level)
{
GAME_FLOW_COMMAND command = { .action = GF_EXIT_TO_TITLE };
GAME_FLOW_COMMAND gf_cmd = { .action = GF_EXIT_TO_TITLE };

const GAME_FLOW_SEQUENCE *const sequence = &level->sequence;
for (int32_t i = 0; i < sequence->length; i++) {
Expand All @@ -298,10 +299,10 @@ static GAME_FLOW_COMMAND M_StorySoFar(
if (level_num == savegame_level) {
return (GAME_FLOW_COMMAND) { .action = GF_EXIT_TO_TITLE };
} else if (level->type == GFL_CUTSCENE) {
command = GF_LoadLevel(level_num, GFL_CUTSCENE);
if (command.action != GF_NOOP
&& command.action != GF_LEVEL_COMPLETE) {
return command;
gf_cmd = GF_LoadLevel(level_num, GFL_CUTSCENE);
if (gf_cmd.action != GF_NOOP
&& gf_cmd.action != GF_LEVEL_COMPLETE) {
return gf_cmd;
}
}
break;
Expand All @@ -310,10 +311,10 @@ static GAME_FLOW_COMMAND M_StorySoFar(
case GFS_PLAY_LEVEL: {
const int32_t level_num = (int32_t)(intptr_t)event->data;
if (level->type == GFL_CUTSCENE) {
command = GF_RunCutscene((int32_t)(intptr_t)event->data);
if (command.action != GF_NOOP
&& command.action != GF_LEVEL_COMPLETE) {
return command;
gf_cmd = GF_RunCutscene((int32_t)(intptr_t)event->data);
if (gf_cmd.action != GF_NOOP
&& gf_cmd.action != GF_LEVEL_COMPLETE) {
return gf_cmd;
}
}
break;
Expand Down Expand Up @@ -367,22 +368,22 @@ static GAME_FLOW_COMMAND M_StorySoFar(
}
}

return command;
return gf_cmd;
}

GAME_FLOW_COMMAND GF_PlayAvailableStory(int32_t slot_num)
{
GAME_FLOW_COMMAND command = {
GAME_FLOW_COMMAND gf_cmd = {
.action = GF_START_GAME,
.param = g_GameFlow.first_level_num,
};

const int32_t savegame_level = Savegame_GetLevelNumber(slot_num);
while (1) {
command = M_StorySoFar(
GF_GetLevel(command.param, GFL_NORMAL), savegame_level);
if (command.action == GF_EXIT_TO_TITLE
|| command.action == GF_EXIT_GAME) {
gf_cmd =
M_StorySoFar(GF_GetLevel(gf_cmd.param, GFL_NORMAL), savegame_level);
if (gf_cmd.action == GF_EXIT_TO_TITLE
|| gf_cmd.action == GF_EXIT_GAME) {
break;
}
}
Expand All @@ -391,10 +392,10 @@ GAME_FLOW_COMMAND GF_PlayAvailableStory(int32_t slot_num)
}

GAME_FLOW_COMMAND GF_LoadLevel(
const int32_t level_num, const GAME_FLOW_LEVEL_TYPE level_type)
const int32_t level_num, const GAME_FLOW_LEVEL_TYPE type)
{
if (!Level_Initialise(GF_GetLevel(level_num, level_type))) {
return (GAME_FLOW_COMMAND) { .action = level_type == GFL_TITLE
if (!Level_Initialise(GF_GetLevel(level_num, type))) {
return (GAME_FLOW_COMMAND) { .action = type == GFL_TITLE
? GF_EXIT_GAME
: GF_EXIT_TO_TITLE };
}
Expand Down
38 changes: 19 additions & 19 deletions src/tr1/global/enum_map.def
Original file line number Diff line number Diff line change
Expand Up @@ -34,26 +34,26 @@ ENUM_MAP_DEFINE(MUSIC_LOAD_CONDITION, MUSIC_LOAD_NEVER, "never")
ENUM_MAP_DEFINE(MUSIC_LOAD_CONDITION, MUSIC_LOAD_NON_AMBIENT, "non-ambient")
ENUM_MAP_DEFINE(MUSIC_LOAD_CONDITION, MUSIC_LOAD_ALWAYS, "always")

ENUM_MAP_DEFINE(GAME_FLOW_SEQUENCE_EVENT_TYPE, GFS_LOAD_LEVEL, "load_level")
ENUM_MAP_DEFINE(GAME_FLOW_SEQUENCE_EVENT_TYPE, GFS_PLAY_FMV, "play_fmv")
ENUM_MAP_DEFINE(GAME_FLOW_SEQUENCE_EVENT_TYPE, GFS_PLAY_LEVEL, "play_level")
ENUM_MAP_DEFINE(GAME_FLOW_SEQUENCE_EVENT_TYPE, GFS_LOADING_SCREEN, "loading_screen")
ENUM_MAP_DEFINE(GAME_FLOW_SEQUENCE_EVENT_TYPE, GFS_DISPLAY_PICTURE, "display_picture")
ENUM_MAP_DEFINE(GAME_FLOW_SEQUENCE_EVENT_TYPE, GFS_LEVEL_STATS, "level_stats")
ENUM_MAP_DEFINE(GAME_FLOW_SEQUENCE_EVENT_TYPE, GFS_TOTAL_STATS, "total_stats")
ENUM_MAP_DEFINE(GAME_FLOW_SEQUENCE_EVENT_TYPE, GFS_EXIT_TO_TITLE, "exit_to_title")
ENUM_MAP_DEFINE(GAME_FLOW_SEQUENCE_EVENT_TYPE, GFS_EXIT_TO_LEVEL, "exit_to_level")
ENUM_MAP_DEFINE(GAME_FLOW_SEQUENCE_EVENT_TYPE, GFS_EXIT_TO_CINE, "exit_to_cine")
ENUM_MAP_DEFINE(GAME_FLOW_SEQUENCE_EVENT_TYPE, GFS_SET_CAMERA_ANGLE, "set_cutscene_angle")
ENUM_MAP_DEFINE(GAME_FLOW_SEQUENCE_EVENT_TYPE, GFS_FLIP_MAP, "flip_map")
ENUM_MAP_DEFINE(GAME_FLOW_SEQUENCE_EVENT_TYPE, GFS_REMOVE_WEAPONS, "remove_weapons")
ENUM_MAP_DEFINE(GAME_FLOW_SEQUENCE_EVENT_TYPE, GFS_REMOVE_SCIONS, "remove_scions")
ENUM_MAP_DEFINE(GAME_FLOW_SEQUENCE_EVENT_TYPE, GFS_REMOVE_AMMO, "remove_ammo")
ENUM_MAP_DEFINE(GAME_FLOW_SEQUENCE_EVENT_TYPE, GFS_REMOVE_MEDIPACKS, "remove_medipacks")
ENUM_MAP_DEFINE(GAME_FLOW_SEQUENCE_EVENT_TYPE, GFS_ADD_ITEM, "give_item")
ENUM_MAP_DEFINE(GAME_FLOW_SEQUENCE_EVENT_TYPE, GFS_LOAD_LEVEL, "load_level")
ENUM_MAP_DEFINE(GAME_FLOW_SEQUENCE_EVENT_TYPE, GFS_PLAY_FMV, "play_fmv")
ENUM_MAP_DEFINE(GAME_FLOW_SEQUENCE_EVENT_TYPE, GFS_PLAY_LEVEL, "play_level")
ENUM_MAP_DEFINE(GAME_FLOW_SEQUENCE_EVENT_TYPE, GFS_LOADING_SCREEN, "loading_screen")
ENUM_MAP_DEFINE(GAME_FLOW_SEQUENCE_EVENT_TYPE, GFS_DISPLAY_PICTURE, "display_picture")
ENUM_MAP_DEFINE(GAME_FLOW_SEQUENCE_EVENT_TYPE, GFS_LEVEL_STATS, "level_stats")
ENUM_MAP_DEFINE(GAME_FLOW_SEQUENCE_EVENT_TYPE, GFS_TOTAL_STATS, "total_stats")
ENUM_MAP_DEFINE(GAME_FLOW_SEQUENCE_EVENT_TYPE, GFS_EXIT_TO_TITLE, "exit_to_title")
ENUM_MAP_DEFINE(GAME_FLOW_SEQUENCE_EVENT_TYPE, GFS_EXIT_TO_LEVEL, "exit_to_level")
ENUM_MAP_DEFINE(GAME_FLOW_SEQUENCE_EVENT_TYPE, GFS_EXIT_TO_CINE, "exit_to_cine")
ENUM_MAP_DEFINE(GAME_FLOW_SEQUENCE_EVENT_TYPE, GFS_SET_CAMERA_ANGLE, "set_cutscene_angle")
ENUM_MAP_DEFINE(GAME_FLOW_SEQUENCE_EVENT_TYPE, GFS_FLIP_MAP, "flip_map")
ENUM_MAP_DEFINE(GAME_FLOW_SEQUENCE_EVENT_TYPE, GFS_REMOVE_WEAPONS, "remove_weapons")
ENUM_MAP_DEFINE(GAME_FLOW_SEQUENCE_EVENT_TYPE, GFS_REMOVE_SCIONS, "remove_scions")
ENUM_MAP_DEFINE(GAME_FLOW_SEQUENCE_EVENT_TYPE, GFS_REMOVE_AMMO, "remove_ammo")
ENUM_MAP_DEFINE(GAME_FLOW_SEQUENCE_EVENT_TYPE, GFS_REMOVE_MEDIPACKS, "remove_medipacks")
ENUM_MAP_DEFINE(GAME_FLOW_SEQUENCE_EVENT_TYPE, GFS_ADD_ITEM, "give_item")
ENUM_MAP_DEFINE(GAME_FLOW_SEQUENCE_EVENT_TYPE, GFS_PLAY_SYNCED_AUDIO, "play_synced_audio")
ENUM_MAP_DEFINE(GAME_FLOW_SEQUENCE_EVENT_TYPE, GFS_MESH_SWAP, "mesh_swap")
ENUM_MAP_DEFINE(GAME_FLOW_SEQUENCE_EVENT_TYPE, GFS_SETUP_BACON_LARA, "setup_bacon_lara")
ENUM_MAP_DEFINE(GAME_FLOW_SEQUENCE_EVENT_TYPE, GFS_MESH_SWAP, "mesh_swap")
ENUM_MAP_DEFINE(GAME_FLOW_SEQUENCE_EVENT_TYPE, GFS_SETUP_BACON_LARA, "setup_bacon_lara")

ENUM_MAP_DEFINE(GAME_FLOW_LEVEL_TYPE, GFL_TITLE, "title")
ENUM_MAP_DEFINE(GAME_FLOW_LEVEL_TYPE, GFL_NORMAL, "normal")
Expand Down

0 comments on commit 5e4ae99

Please sign in to comment.