From dd1c27782506066ceac6bc4a68512eb6175e0b54 Mon Sep 17 00:00:00 2001 From: Marcin Kurczewski Date: Thu, 29 Aug 2024 14:27:07 +0200 Subject: [PATCH] console: use the new string functions --- CHANGELOG.md | 1 + src/game/console.c | 5 +- src/game/console_cmd.c | 232 +++++++++++++++++------------------------ subprojects/libtrx | 2 +- 4 files changed, 100 insertions(+), 140 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 358ebbbf2..fe5b7effd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ - fixed cameras with glide values sometimes moving in the wrong direction (#1451, regression from 4.3) - fixed `/give` console command giving duplicate items under some circumstances (#1463, regression from 3.0) - fixed `/give` console command confusing logging around mismatched items (#1463, regression from 3.0) +- fixed `/flip` console command misreporting an already enabled flipmap as off (regression from 4.0) - fixed console commands causing improper ring shutdown with selected inventory item (#1460, regression from 3.0) - improved logs module names readability - improved crash debug information on Windows diff --git a/src/game/console.c b/src/game/console.c index 44bf89a16..c58d10ec1 100644 --- a/src/game/console.c +++ b/src/game/console.c @@ -15,6 +15,7 @@ #include #include +#include #include #include #include @@ -74,7 +75,7 @@ static COMMAND_RESULT Console_Eval(const char *const cmdline) const CONSOLE_COMMAND *matching_cmd = NULL; for (CONSOLE_COMMAND *cur_cmd = &g_ConsoleCommands[0]; - cur_cmd->proc != NULL; cur_cmd++) { + cur_cmd->prefix != NULL; cur_cmd++) { if (strstr(cmdline, cur_cmd->prefix) != cmdline) { continue; } @@ -96,7 +97,9 @@ static COMMAND_RESULT Console_Eval(const char *const cmdline) return CR_BAD_INVOCATION; } + assert(matching_cmd->proc != NULL); const COMMAND_RESULT result = matching_cmd->proc(args); + switch (result) { case CR_BAD_INVOCATION: Console_Log(GS(OSD_COMMAND_BAD_INVOCATION), cmdline); diff --git a/src/game/console_cmd.c b/src/game/console_cmd.c index ac8b21bb1..088872c39 100644 --- a/src/game/console_cmd.c +++ b/src/game/console_cmd.c @@ -54,7 +54,7 @@ static COMMAND_RESULT Console_Cmd_SaveGame(const char *args); static COMMAND_RESULT Console_Cmd_StartDemo(const char *args); static COMMAND_RESULT Console_Cmd_ExitToTitle(const char *args); static COMMAND_RESULT Console_Cmd_EndLevel(const char *args); -static COMMAND_RESULT Console_Cmd_Level(const char *args); +static COMMAND_RESULT Console_Cmd_StartLevel(const char *args); static COMMAND_RESULT Console_Cmd_Abortion(const char *args); static COMMAND_RESULT Console_Cmd_Set(const char *const args); @@ -224,7 +224,7 @@ static COMMAND_RESULT Console_Cmd_SetHealth(const char *const args) return CR_UNAVAILABLE; } - if (strcmp(args, "") == 0) { + if (String_Equivalent(args, "")) { Console_Log(GS(OSD_CURRENT_HEALTH_GET), g_LaraItem->hit_points); return CR_SUCCESS; } @@ -267,7 +267,7 @@ static COMMAND_RESULT Console_Cmd_Fly(const char *const args) static COMMAND_RESULT Console_Cmd_Speed(const char *const args) { - if (strcmp(args, "") == 0) { + if (String_Equivalent(args, "")) { Console_Log(GS(OSD_SPEED_GET), Clock_GetTurboSpeed()); return CR_SUCCESS; } @@ -283,26 +283,19 @@ static COMMAND_RESULT Console_Cmd_Speed(const char *const args) static COMMAND_RESULT Console_Cmd_VSync(const char *const args) { - if (String_Equivalent(args, "off")) { - g_Config.rendering.enable_vsync = false; - Config_Write(); - Output_ApplyRenderSettings(); - Console_Log(GS(OSD_VSYNC_OFF)); - return CR_SUCCESS; - } - - if (String_Equivalent(args, "on")) { - g_Config.rendering.enable_vsync = true; - Config_Write(); - Output_ApplyRenderSettings(); - Console_Log(GS(OSD_VSYNC_ON)); - return CR_SUCCESS; + bool enable; + if (!String_ParseBool(args, &enable)) { + return CR_BAD_INVOCATION; } - return CR_BAD_INVOCATION; + g_Config.rendering.enable_vsync = enable; + Config_Write(); + Output_ApplyRenderSettings(); + Console_Log(enable ? GS(OSD_VSYNC_ON) : GS(OSD_VSYNC_OFF)); + return CR_SUCCESS; } -static const char *Console_Cmd_Set_Resolve(const char *option_name) +static const char *Console_Cmd_Set_Resolve(const char *const option_name) { const char *dot = strrchr(option_name, '.'); if (dot) { @@ -457,59 +450,41 @@ static COMMAND_RESULT Console_Cmd_Set(const char *const args) static COMMAND_RESULT Console_Cmd_Braid(const char *const args) { - if (String_Equivalent(args, "off")) { - g_Config.enable_braid = false; - Config_Write(); - Console_Log(GS(OSD_BRAID_OFF)); - return CR_SUCCESS; - } - - if (String_Equivalent(args, "on")) { - g_Config.enable_braid = true; - Config_Write(); - Console_Log(GS(OSD_BRAID_ON)); - return CR_SUCCESS; + bool enable; + if (!String_ParseBool(args, &enable)) { + return CR_BAD_INVOCATION; } - return CR_BAD_INVOCATION; + g_Config.enable_braid = enable; + Config_Write(); + Console_Log(enable ? GS(OSD_BRAID_ON) : GS(OSD_BRAID_OFF)); + return CR_SUCCESS; } static COMMAND_RESULT Console_Cmd_Wireframe(const char *const args) { - if (String_Equivalent(args, "off")) { - g_Config.rendering.enable_wireframe = false; - Config_Write(); - Console_Log(GS(OSD_WIREFRAME_OFF)); - return CR_SUCCESS; - } - - if (String_Equivalent(args, "on")) { - g_Config.rendering.enable_wireframe = true; - Config_Write(); - Console_Log(GS(OSD_WIREFRAME_ON)); - return CR_SUCCESS; + bool enable; + if (!String_ParseBool(args, &enable)) { + return CR_BAD_INVOCATION; } - return CR_BAD_INVOCATION; + g_Config.rendering.enable_wireframe = enable; + Config_Write(); + Console_Log(enable ? GS(OSD_WIREFRAME_ON) : GS(OSD_WIREFRAME_OFF)); + return CR_SUCCESS; } static COMMAND_RESULT Console_Cmd_Cheats(const char *const args) { - if (String_Equivalent(args, "off")) { - g_Config.enable_cheats = false; - Config_Write(); - Console_Log(GS(OSD_CHEATS_OFF)); - return CR_SUCCESS; - } - - if (String_Equivalent(args, "on")) { - g_Config.enable_cheats = true; - Config_Write(); - Console_Log(GS(OSD_CHEATS_ON)); - return CR_SUCCESS; + bool enable; + if (!String_ParseBool(args, &enable)) { + return CR_BAD_INVOCATION; } - return CR_BAD_INVOCATION; + g_Config.enable_cheats = enable; + Config_Write(); + Console_Log(enable ? GS(OSD_CHEATS_ON) : GS(OSD_CHEATS_OFF)); + return CR_SUCCESS; } static COMMAND_RESULT Console_Cmd_GiveItem(const char *args) @@ -540,7 +515,7 @@ static COMMAND_RESULT Console_Cmd_GiveItem(const char *args) args++; } - if (strcmp(args, "") == 0) { + if (String_Equivalent(args, "")) { return CR_BAD_INVOCATION; } @@ -570,40 +545,23 @@ static COMMAND_RESULT Console_Cmd_GiveItem(const char *args) static COMMAND_RESULT Console_Cmd_FlipMap(const char *args) { - bool flip = false; - if (String_Equivalent(args, "on")) { - if (g_FlipStatus) { - Console_Log(GS(OSD_FLIPMAP_FAIL_ALREADY_OFF)); - return CR_SUCCESS; - } else { - flip = true; - } - } - - if (String_Equivalent(args, "off")) { - if (!g_FlipStatus) { - Console_Log(GS(OSD_FLIPMAP_FAIL_ALREADY_OFF)); - return CR_SUCCESS; - } else { - flip = true; - } - } - - if (strcmp(args, "") == 0) { - flip = true; + bool new_state; + if (String_Equivalent(args, "")) { + new_state = !g_FlipStatus; + } else if (!String_ParseBool(args, &new_state)) { + return CR_BAD_INVOCATION; } - if (flip) { - Room_FlipMap(); - if (g_FlipStatus) { - Console_Log(GS(OSD_FLIPMAP_ON)); - } else { - Console_Log(GS(OSD_FLIPMAP_OFF)); - } + if (g_FlipStatus == new_state) { + Console_Log( + new_state ? GS(OSD_FLIPMAP_FAIL_ALREADY_ON) + : GS(OSD_FLIPMAP_FAIL_ALREADY_OFF)); return CR_SUCCESS; } - return CR_FAILURE; + Room_FlipMap(); + Console_Log(new_state ? GS(OSD_FLIPMAP_ON) : GS(OSD_FLIPMAP_OFF)); + return CR_SUCCESS; } static COMMAND_RESULT Console_Cmd_Kill(const char *args) @@ -617,19 +575,20 @@ static COMMAND_RESULT Console_Cmd_Kill(const char *args) num++; } } - if (num > 0) { - Sound_Effect(SFX_EXPLOSION_CHEAT, &g_LaraItem->pos, SPM_NORMAL); - Console_Log(GS(OSD_KILL_ALL), num); - return CR_SUCCESS; - } else { + + if (num == 0) { Console_Log(GS(OSD_KILL_ALL_FAIL), num); return CR_FAILURE; } + + Sound_Effect(SFX_EXPLOSION_CHEAT, &g_LaraItem->pos, SPM_NORMAL); + Console_Log(GS(OSD_KILL_ALL), num); + return CR_SUCCESS; } // kill all the enemies around Lara within one tile, or a single nearest // enemy - if (strcmp(args, "") == 0) { + if (String_Equivalent(args, "")) { bool found = false; while (true) { const int16_t best_item_num = Lara_GetNearestEnemy(); @@ -645,13 +604,13 @@ static COMMAND_RESULT Console_Cmd_Kill(const char *args) } } - if (found) { - Console_Log(GS(OSD_KILL)); - return CR_SUCCESS; - } else { + if (!found) { Console_Log(GS(OSD_KILL_FAIL)); return CR_FAILURE; } + + Console_Log(GS(OSD_KILL)); + return CR_SUCCESS; } // kill a single enemy type @@ -675,19 +634,16 @@ static COMMAND_RESULT Console_Cmd_Kill(const char *args) } Memory_FreePointer(&matching_objs); - if (matched) { - if (num > 0) { - Console_Log(GS(OSD_KILL_ALL), num); - return CR_SUCCESS; - } else { - Console_Log(GS(OSD_KILL_ALL_FAIL)); - return CR_FAILURE; - } + if (!matched) { + return CR_BAD_INVOCATION; } - return CR_BAD_INVOCATION; + if (num == 0) { + Console_Log(GS(OSD_KILL_ALL_FAIL)); + return CR_FAILURE; + } + Console_Log(GS(OSD_KILL_ALL), num); + return CR_SUCCESS; } - - return CR_BAD_INVOCATION; } static COMMAND_RESULT Console_Cmd_StartDemo(const char *args) @@ -757,27 +713,24 @@ static COMMAND_RESULT Console_Cmd_SaveGame(const char *args) return CR_SUCCESS; } -static COMMAND_RESULT Console_Cmd_EndLevel(const char *args) +static COMMAND_RESULT Console_Cmd_EndLevel(const char *const args) { - if (strcmp(args, "") == 0) { - Lara_Cheat_EndLevel(); - return CR_SUCCESS; + if (!String_Equivalent(args, "")) { + return CR_BAD_INVOCATION; } - return CR_FAILURE; + + Lara_Cheat_EndLevel(); + return CR_SUCCESS; } -static COMMAND_RESULT Console_Cmd_Level(const char *args) +static COMMAND_RESULT Console_Cmd_StartLevel(const char *const args) { - int32_t level_to_load = -1; - - if (level_to_load == -1) { - int32_t num = 0; - if (sscanf(args, "%d", &num) == 1) { - level_to_load = num; - } + if (String_Equivalent(args, "")) { + return CR_BAD_INVOCATION; } - if (level_to_load == -1 && strlen(args) >= 2) { + int32_t level_to_load = -1; + if (!String_ParseInteger(args, &level_to_load)) { for (int i = 0; i < g_GameFlow.level_count; i++) { if (String_CaseSubstring(g_GameFlow.levels[i].level_title, args) != NULL) { @@ -785,10 +738,17 @@ static COMMAND_RESULT Console_Cmd_Level(const char *args) break; } } + if (level_to_load == -1 && String_Equivalent(args, "gym")) { + level_to_load = g_GameFlow.gym_level_num; + } + if (level_to_load == -1) { + Console_Log(GS(OSD_INVALID_LEVEL)); + return CR_FAILURE; + } } - if (level_to_load == -1 && String_Equivalent(args, "gym")) { - level_to_load = g_GameFlow.gym_level_num; + if (level_to_load == -1) { + return CR_BAD_INVOCATION; } if (level_to_load >= g_GameFlow.level_count) { @@ -796,17 +756,13 @@ static COMMAND_RESULT Console_Cmd_Level(const char *args) return CR_FAILURE; } - if (level_to_load != -1) { - g_GameInfo.override_gf_command = (GAMEFLOW_COMMAND) { - .command = GF_SELECT_GAME, - .param = level_to_load, - }; - Console_Log( - GS(OSD_PLAY_LEVEL), g_GameFlow.levels[level_to_load].level_title); - return CR_SUCCESS; - } - - return CR_BAD_INVOCATION; + g_GameInfo.override_gf_command = (GAMEFLOW_COMMAND) { + .command = GF_SELECT_GAME, + .param = level_to_load, + }; + Console_Log( + GS(OSD_PLAY_LEVEL), g_GameFlow.levels[level_to_load].level_title); + return CR_SUCCESS; } static COMMAND_RESULT Console_Cmd_Abortion(const char *args) @@ -846,8 +802,8 @@ CONSOLE_COMMAND g_ConsoleCommands[] = { { .prefix = "flipmap", .proc = Console_Cmd_FlipMap }, { .prefix = "kill", .proc = Console_Cmd_Kill }, { .prefix = "endlevel", .proc = Console_Cmd_EndLevel }, - { .prefix = "play", .proc = Console_Cmd_Level }, - { .prefix = "level", .proc = Console_Cmd_Level }, + { .prefix = "play", .proc = Console_Cmd_StartLevel }, + { .prefix = "level", .proc = Console_Cmd_StartLevel }, { .prefix = "load", .proc = Console_Cmd_LoadGame }, { .prefix = "save", .proc = Console_Cmd_SaveGame }, { .prefix = "demo", .proc = Console_Cmd_StartDemo }, diff --git a/subprojects/libtrx b/subprojects/libtrx index c89eb53b7..5553faeff 160000 --- a/subprojects/libtrx +++ b/subprojects/libtrx @@ -1 +1 @@ -Subproject commit c89eb53b7e9c87ad5236ff56df2b323305f3d3bd +Subproject commit 5553faeffe4917913d92d7892f36a4792add8ada