Skip to content

Commit

Permalink
tr1/game-flow: merge Game_Start_Legacy to GFS_LOAD_LEVEL
Browse files Browse the repository at this point in the history
  • Loading branch information
rr- committed Jan 29, 2025
1 parent 0ef4254 commit 86fdeed
Show file tree
Hide file tree
Showing 4 changed files with 114 additions and 124 deletions.
3 changes: 0 additions & 3 deletions src/tr1/game/game.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,6 @@

#include <libtrx/game/game.h>

bool Game_Start_Legacy(const GF_LEVEL *level, GF_SEQUENCE_CONTEXT seq_ctx);
GF_COMMAND Game_Stop_Legacy(void);

void Game_ProcessInput(void);

GF_COMMAND Game_MainMenu(void);
116 changes: 7 additions & 109 deletions src/tr1/game/game/game.c
Original file line number Diff line number Diff line change
Expand Up @@ -69,115 +69,6 @@ void Game_ProcessInput(void)
}
}

bool Game_Start_Legacy(
const GF_LEVEL *const level, const GF_SEQUENCE_CONTEXT seq_ctx)
{
const GF_LEVEL *const prev_level = GF_GetLevelBefore(level);
switch (seq_ctx) {
case GFSC_SAVED:
// reset current info to the defaults so that we do not do
// Item_GlobalReplace in the inventory initialization routines too early
Savegame_InitCurrentInfo();

if (!Level_Initialise(level)) {
Game_SetCurrentLevel(NULL);
GF_SetCurrentLevel(NULL);
return false;
}
if (!Savegame_Load(g_GameInfo.current_save_slot)) {
LOG_ERROR("Failed to load save file!");
return false;
}
break;

case GFSC_RESTART:
if (level <= GF_GetGymLevel() || level == GF_GetFirstLevel()) {
Savegame_InitCurrentInfo();
} else {
Savegame_ResetCurrentInfo(level);
// Use previous level's ending info to start current level.
Savegame_CarryCurrentInfoToNextLevel(prev_level, level);
Savegame_ApplyLogicToCurrentInfo(level);
}
if (!Level_Initialise(level)) {
Game_SetCurrentLevel(NULL);
GF_SetCurrentLevel(NULL);
return false;
}
break;

case GFSC_SELECT:
if (g_GameInfo.current_save_slot != -1) {
// select level feature
Savegame_InitCurrentInfo();
if (level->num > GF_GetFirstLevel()->num) {
Savegame_LoadOnlyResumeInfo(
g_GameInfo.current_save_slot, &g_GameInfo);
const GF_LEVEL *tmp_level = level;
while (tmp_level != NULL) {
Savegame_ResetCurrentInfo(tmp_level);
tmp_level = GF_GetLevelAfter(tmp_level);
}
// Use previous level's ending info to start current level.
Savegame_CarryCurrentInfoToNextLevel(
GF_GetLevelBefore(level), level);
Savegame_ApplyLogicToCurrentInfo(level);
}
} else {
// console /play level feature
Savegame_InitCurrentInfo();
const GF_LEVEL *tmp_level = GF_GetLevelAfter(GF_GetFirstLevel());
while (tmp_level != NULL) {
Savegame_CarryCurrentInfoToNextLevel(
GF_GetLevelBefore(tmp_level), tmp_level);
Savegame_ApplyLogicToCurrentInfo(tmp_level);
if (tmp_level == level) {
break;
}
tmp_level = GF_GetLevelAfter(tmp_level);
}
}
if (!Level_Initialise(level)) {
return false;
}
break;

default:
if (level->type == GFL_GYM) {
Savegame_ResetCurrentInfo(level);
Savegame_ApplyLogicToCurrentInfo(level);
} else if (level->type == GFL_BONUS) {
Savegame_CarryCurrentInfoToNextLevel(
GF_GetLevelBefore(level), level);
Savegame_ApplyLogicToCurrentInfo(level);
}
if (!Level_Initialise(level)) {
return false;
}
break;
}

// LaraGun() expects request_gun_type to be set only when it
// really is needed, not at all times.
// https://github.com/LostArtefacts/TRX/issues/36
g_Lara.request_gun_type = LGT_UNARMED;

g_OverlayFlag = 1;
Camera_Initialise();

Stats_CalculateStats();
GF_GetResumeInfo(level)->stats.max_pickup_count = Stats_GetPickups();
GF_GetResumeInfo(level)->stats.max_kill_count = Stats_GetKillables();
GF_GetResumeInfo(level)->stats.max_secret_count = Stats_GetSecrets();

g_GameInfo.ask_for_save = g_Config.gameplay.enable_save_crystals
&& (level->type == GFL_NORMAL || level->type == GFL_BONUS)
&& level != GF_GetFirstLevel() && level != GF_GetGymLevel();

Interpolation_Remember();
return true;
}

GF_COMMAND Game_Stop_Legacy(void)
{
Sound_StopAll();
Expand Down Expand Up @@ -257,6 +148,13 @@ GF_COMMAND Game_Stop_Legacy(void)
bool Game_Start(const GF_LEVEL *const level, const GF_SEQUENCE_CONTEXT seq_ctx)
{
Game_SetCurrentLevel(level);

// LaraGun() expects request_gun_type to be set only when it
// really is needed, not at all times.
// https://github.com/LostArtefacts/TRX/issues/36
g_Lara.request_gun_type = LGT_UNARMED;
g_OverlayFlag = 1;
Camera_Initialise();
Interpolation_Remember();
Stats_StartTimer();
return true;
Expand Down
111 changes: 102 additions & 9 deletions src/tr1/game/game_flow/sequencer.c
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@
#include "game/level.h"
#include "game/music.h"
#include "game/objects/creatures/bacon_lara.h"
#include "game/savegame.h"
#include "game/stats.h"
#include "global/vars.h"

#include <libtrx/config.h>
Expand Down Expand Up @@ -73,27 +75,118 @@ static DECLARE_EVENT_HANDLER(M_HandleExitToTitle)
static DECLARE_EVENT_HANDLER(M_HandleLoadLevel)
{
GF_COMMAND gf_cmd = { .action = GF_NOOP };
if (seq_ctx == GFSC_STORY) {
const GF_LEVEL *const prev_level = GF_GetLevelBefore(level);

switch (seq_ctx) {
case GFSC_STORY:
const int32_t savegame_level_num = (int32_t)(intptr_t)seq_ctx_arg;
if (savegame_level_num == level->num) {
gf_cmd = (GF_COMMAND) { .action = GF_EXIT_TO_TITLE };
}
break;

case GFSC_SAVED:
// reset current info to the defaults so that we do not do
// Item_GlobalReplace in the inventory initialization routines too early
Savegame_InitCurrentInfo();

if (!Level_Initialise(level)) {
Game_SetCurrentLevel(NULL);
GF_SetCurrentLevel(NULL);
return (GF_COMMAND) { .action = GF_EXIT_TO_TITLE };
}
} else if (level->type == GFL_DEMO) {
} else if (level->type == GFL_CUTSCENE) {
if (!Savegame_Load(g_GameInfo.current_save_slot)) {
LOG_ERROR("Failed to load save file!");
Game_SetCurrentLevel(NULL);
GF_SetCurrentLevel(NULL);
return (GF_COMMAND) { .action = GF_EXIT_TO_TITLE };
}
break;

case GFSC_RESTART:
if (level == GF_GetGymLevel() || level == GF_GetFirstLevel()) {
Savegame_InitCurrentInfo();
} else {
Savegame_ResetCurrentInfo(level);
Savegame_CarryCurrentInfoToNextLevel(prev_level, level);
Savegame_ApplyLogicToCurrentInfo(level);
}
if (!Level_Initialise(level)) {
Game_SetCurrentLevel(NULL);
GF_SetCurrentLevel(NULL);
return (GF_COMMAND) { .action = GF_EXIT_TO_TITLE };
}
break;

case GFSC_SELECT:
if (g_GameInfo.current_save_slot != -1) {
// select level feature
Savegame_InitCurrentInfo();
if (level->num > GF_GetFirstLevel()->num) {
Savegame_LoadOnlyResumeInfo(
g_GameInfo.current_save_slot, &g_GameInfo);
const GF_LEVEL *tmp_level = level;
while (tmp_level != NULL) {
Savegame_ResetCurrentInfo(tmp_level);
tmp_level = GF_GetLevelAfter(tmp_level);
}
Savegame_CarryCurrentInfoToNextLevel(prev_level, level);
Savegame_ApplyLogicToCurrentInfo(level);
}
} else {
// console /play level feature
Savegame_InitCurrentInfo();
const GF_LEVEL *tmp_level = GF_GetLevelAfter(GF_GetFirstLevel());
while (tmp_level != NULL) {
Savegame_CarryCurrentInfoToNextLevel(
GF_GetLevelBefore(tmp_level), tmp_level);
Savegame_ApplyLogicToCurrentInfo(tmp_level);
if (tmp_level == level) {
break;
}
tmp_level = GF_GetLevelAfter(tmp_level);
}
}
if (!Level_Initialise(level)) {
Game_SetCurrentLevel(NULL);
GF_SetCurrentLevel(NULL);
return (GF_COMMAND) { .action = GF_EXIT_TO_TITLE };
}
break;

default:
if (level->type == GFL_GYM) {
Savegame_ResetCurrentInfo(level);
Savegame_ApplyLogicToCurrentInfo(level);
} else if (level->type == GFL_BONUS) {
Savegame_CarryCurrentInfoToNextLevel(prev_level, level);
Savegame_ApplyLogicToCurrentInfo(level);
}

if (!Level_Initialise(level)) {
Game_SetCurrentLevel(NULL);
GF_SetCurrentLevel(NULL);
if (level->type == GFL_TITLE) {
gf_cmd = (GF_COMMAND) { .action = GF_EXIT_GAME };
} else {
gf_cmd = (GF_COMMAND) { .action = GF_EXIT_TO_TITLE };
}
}
} else {
const bool result = Game_Start_Legacy(level, seq_ctx);
if (!result) {
Game_SetCurrentLevel(NULL);
return (GF_COMMAND) { .action = GF_EXIT_TO_TITLE };
}
break;
}

Stats_CalculateStats();
RESUME_INFO *const resume = GF_GetResumeInfo(level);
if (resume != NULL) {
resume->stats.max_pickup_count = Stats_GetPickups();
resume->stats.max_kill_count = Stats_GetKillables();
resume->stats.max_secret_count = Stats_GetSecrets();
}

g_GameInfo.ask_for_save = g_Config.gameplay.enable_save_crystals
&& (level->type == GFL_NORMAL || level->type == GFL_BONUS)
&& level != GF_GetFirstLevel() && level != GF_GetGymLevel();

return gf_cmd;
}

Expand Down
8 changes: 5 additions & 3 deletions src/tr1/game/stats/common.c
Original file line number Diff line number Diff line change
Expand Up @@ -197,9 +197,11 @@ void Stats_CalculateStats(void)
M_TraverseFloor();

const GF_LEVEL *const current_level = Game_GetCurrentLevel();
m_LevelPickups -= current_level->unobtainable.pickups;
m_LevelKillables -= current_level->unobtainable.kills;
m_LevelSecrets -= current_level->unobtainable.secrets;
if (current_level != nullptr) {
m_LevelPickups -= current_level->unobtainable.pickups;
m_LevelKillables -= current_level->unobtainable.kills;
m_LevelSecrets -= current_level->unobtainable.secrets;
}
}

int32_t Stats_GetPickups(void)
Expand Down

0 comments on commit 86fdeed

Please sign in to comment.