From c67ca2e8c3874b66373e513535b638d165d9b805 Mon Sep 17 00:00:00 2001 From: Marcin Kurczewski Date: Thu, 23 Jan 2025 23:25:36 +0100 Subject: [PATCH] tr2/game-flow: make demos use its own numbers --- data/tr2/ship/cfg/TR2X_gameflow.json5 | 6 +- src/tr2/game/game_flow/reader.c | 14 +++++ src/tr2/game/game_flow/sequencer.c | 5 +- src/tr2/game/level.c | 80 +++++++++++++++------------ src/tr2/game/music/music_main.c | 4 -- 5 files changed, 64 insertions(+), 45 deletions(-) diff --git a/data/tr2/ship/cfg/TR2X_gameflow.json5 b/data/tr2/ship/cfg/TR2X_gameflow.json5 index 7e68b60a1..229b26fc4 100644 --- a/data/tr2/ship/cfg/TR2X_gameflow.json5 +++ b/data/tr2/ship/cfg/TR2X_gameflow.json5 @@ -323,7 +323,7 @@ "music_track": -1, "sequence": [ {"type": "add_secret_reward", "item": "magnums_ammo", "qty": 4}, - {"type": "play_level", "level_num": 2}, + {"type": "play_level"}, {"type": "level_complete"}, ], }, @@ -335,7 +335,7 @@ "sequence": [ {"type": "add_secret_reward", "item": "grenade_launcher"}, {"type": "add_secret_reward", "item": "grenade_launcher_ammo", "qty": 2}, - {"type": "play_level", "level_num": 8}, + {"type": "play_level"}, {"type": "level_complete"}, ], "injections": [ @@ -351,7 +351,7 @@ "sequence": [ {"type": "give_item", "item": "puzzle_4"}, {"type": "add_secret_reward", "item": "uzis_ammo", "qty": 4}, - {"type": "play_level", "level_num": 11}, + {"type": "play_level"}, {"type": "level_complete"}, ], "injections": [ diff --git a/src/tr2/game/game_flow/reader.c b/src/tr2/game/game_flow/reader.c index d99c87161..687e75a0a 100644 --- a/src/tr2/game/game_flow/reader.c +++ b/src/tr2/game/game_flow/reader.c @@ -438,6 +438,13 @@ static bool M_LoadCutscenes(JSON_OBJECT *obj, GAME_FLOW *const gf) GAME_FLOW_LEVEL *const level = &gf->cutscenes[i]; level->num = i; level->type = GFL_CUTSCENE; + for (int32_t j = 0; j < level->sequence.length; j++) { + GAME_FLOW_SEQUENCE_EVENT *const event = &level->sequence.events[j]; + if (event->type == GFS_PLAY_LEVEL + && (int32_t)(intptr_t)event->data == -1) { + event->data = (void *)(intptr_t)i; + } + } } return result; } @@ -451,6 +458,13 @@ static bool M_LoadDemos(JSON_OBJECT *obj, GAME_FLOW *const gf) GAME_FLOW_LEVEL *const level = &gf->demos[i]; level->num = i; level->type = GFL_DEMO; + for (int32_t j = 0; j < level->sequence.length; j++) { + GAME_FLOW_SEQUENCE_EVENT *const event = &level->sequence.events[j]; + if (event->type == GFS_PLAY_LEVEL + && (int32_t)(intptr_t)event->data == -1) { + event->data = (void *)(intptr_t)i; + } + } } return result; } diff --git a/src/tr2/game/game_flow/sequencer.c b/src/tr2/game/game_flow/sequencer.c index c8b0ffd45..3ad6ffd06 100644 --- a/src/tr2/game/game_flow/sequencer.c +++ b/src/tr2/game/game_flow/sequencer.c @@ -91,10 +91,7 @@ GAME_FLOW_COMMAND GF_InterpretSequence( case GFS_PLAY_LEVEL: { const int16_t level_num = (int16_t)(intptr_t)event->data; - if (level_num < 0 || level_num > GF_GetLevelCount()) { - LOG_ERROR("Invalid level number: %d", level_num); - gf_cmd = (GAME_FLOW_COMMAND) { .action = GF_EXIT_TO_TITLE }; - } else if (type != GFL_STORY) { + if (type != GFL_STORY) { if (type == GFL_MID_STORY) { return (GAME_FLOW_COMMAND) { .action = GF_EXIT_TO_TITLE }; } diff --git a/src/tr2/game/level.c b/src/tr2/game/level.c index bf7596c28..f74e04afd 100644 --- a/src/tr2/game/level.c +++ b/src/tr2/game/level.c @@ -32,6 +32,8 @@ static int16_t *m_AnimFrameData = NULL; static int32_t m_AnimFrameDataLength = 0; +static GAME_FLOW_LEVEL *M_GetFromNumberAndType( + int32_t level_num, GAME_FLOW_LEVEL_TYPE level_type); static void M_LoadFromFile(const GAME_FLOW_LEVEL *level); static void M_LoadRooms(VFILE *file); static void M_LoadObjectMeshes(VFILE *file); @@ -55,6 +57,41 @@ static void M_LoadDemo(VFILE *file); static void M_LoadSamples(VFILE *file); static void M_CompleteSetup(void); +GAME_FLOW_LEVEL *M_GetFromNumberAndType( + const int32_t level_num, const GAME_FLOW_LEVEL_TYPE level_type) +{ + switch (level_type) { + case GFL_TITLE: + return g_GameFlow.title_level; + + case GFL_CUTSCENE: + if (level_num < 0 || level_num >= GF_GetCutsceneCount()) { + LOG_ERROR("Invalid cutscene number: %d", level_num); + return NULL; + } + return &g_GameFlow.cutscenes[level_num]; + + case GFL_DEMO: + if (level_num < 0 || level_num >= GF_GetDemoCount()) { + LOG_ERROR("Invalid demo number: %d", level_num); + return NULL; + } + return &g_GameFlow.demos[level_num]; + + case GFL_NORMAL: + case GFL_SAVED: + if (level_num < 0 || level_num >= GF_GetLevelCount()) { + LOG_ERROR("Invalid level number: %d", level_num); + return NULL; + } + return &g_GameFlow.levels[level_num]; + + default: + LOG_ERROR("Invalid level type: %d", level_type); + return NULL; + } +} + static void M_LoadTexturePages(VFILE *const file) { BENCHMARK *const benchmark = Benchmark_Start(); @@ -799,21 +836,15 @@ bool Level_Initialise( InitialiseGameFlags(); g_Lara.item_num = NO_ITEM; - bool result; - Level_Unload(); - if (level_type == GFL_TITLE) { - result = Level_Load(g_GameFlow.title_level); - } else if (level_type == GFL_CUTSCENE) { - if (level_num < 0 || level_num >= GF_GetCutsceneCount()) { - LOG_ERROR("Invalid cutscene number: %d", level_num); - return false; - } - result = Level_Load(&g_GameFlow.cutscenes[level_num]); - } else { - result = Level_Load(&g_GameFlow.levels[level_num]); + const GAME_FLOW_LEVEL *level = + M_GetFromNumberAndType(level_num, level_type); + if (level == NULL) { + return false; } - if (!result) { - return result; + + Level_Unload(); + if (!Level_Load(level)) { + return false; } if (g_Lara.item_num != NO_ITEM) { @@ -839,26 +870,7 @@ bool Level_Initialise( InitialiseFinalLevel(); } - const GAME_FLOW_LEVEL *level = NULL; - switch (level_type) { - case GFL_TITLE: - level = g_GameFlow.title_level; - break; - case GFL_DEMO: - level = &g_GameFlow.levels[level_num]; - break; - case GFL_CUTSCENE: - level = &g_GameFlow.cutscenes[level_num]; - break; - case GFL_NORMAL: - case GFL_SAVED: - level = &g_GameFlow.levels[level_num]; - break; - default: - level = NULL; - break; - } - if (level != NULL && level->music_track != MX_INACTIVE) { + if (level->music_track != MX_INACTIVE) { Music_Play( level->music_track, level_type == GFL_CUTSCENE ? MPM_ALWAYS : MPM_LOOPED); diff --git a/src/tr2/game/music/music_main.c b/src/tr2/game/music/music_main.c index 81a791a48..c4ed10130 100644 --- a/src/tr2/game/music/music_main.c +++ b/src/tr2/game/music/music_main.c @@ -131,10 +131,6 @@ void Music_Play(const MUSIC_TRACK_ID track_id, const MUSIC_PLAY_MODE mode) M_StopActiveStream(); - if (track_id == MX_INACTIVE) { - goto finish; - } - if (m_Backend == NULL) { LOG_DEBUG( "Not playing track %d because no backend is available", track_id);