From 6683eb5f581626b0ec4d81f6b2383ffc1c7a10be Mon Sep 17 00:00:00 2001 From: Karjala22 <78927981+Karjala22@users.noreply.github.com> Date: Wed, 9 Apr 2025 00:28:31 -0400 Subject: [PATCH 01/19] Fix for remaster darkpilo.cfg which is not located in the game folder. --- TheForceEngine/TFE_DarkForces/agent.cpp | 17 +++++++++++---- TheForceEngine/TFE_FileSystem/paths.cpp | 29 +++++++++++++++++++++++++ TheForceEngine/TFE_FileSystem/paths.h | 3 +++ TheForceEngine/main.cpp | 1 + 4 files changed, 46 insertions(+), 4 deletions(-) diff --git a/TheForceEngine/TFE_DarkForces/agent.cpp b/TheForceEngine/TFE_DarkForces/agent.cpp index 1a0a22396..58f7c268a 100644 --- a/TheForceEngine/TFE_DarkForces/agent.cpp +++ b/TheForceEngine/TFE_DarkForces/agent.cpp @@ -541,10 +541,19 @@ namespace TFE_DarkForces } else { - // Finally generate a new one. - TFE_System::logWrite(LOG_WARNING, "DarkForcesMain", "Cannot find 'DARKPILO.CFG' at '%s'. Creating a new file for save data.", sourcePath); -newpilo: - createDarkPilotConfig(documentsPath); + // Also check the remaster documents path. + TFE_Paths::appendPath(PATH_REMASTER_DOCS, "DARKPILO.CFG", sourcePath); + if (FileUtil::exists(sourcePath)) + { + FileUtil::copyFile(sourcePath, documentsPath); + } + else + { + // Finally generate a new one. + TFE_System::logWrite(LOG_WARNING, "DarkForcesMain", "Cannot find 'DARKPILO.CFG' at '%s'. Creating a new file for save data.", sourcePath); + newpilo: + createDarkPilotConfig(documentsPath); + } } } } diff --git a/TheForceEngine/TFE_FileSystem/paths.cpp b/TheForceEngine/TFE_FileSystem/paths.cpp index 2a688bcd7..774cac56c 100644 --- a/TheForceEngine/TFE_FileSystem/paths.cpp +++ b/TheForceEngine/TFE_FileSystem/paths.cpp @@ -123,6 +123,35 @@ namespace TFE_Paths return false; } + // This is the path to the Remaster documents folder. + bool setRemasterDocsPath(GameID game) + { + #ifdef _WIN32 + char path[TFE_MAX_PATH]; + + if (SUCCEEDED(SHGetFolderPath(NULL, CSIDL_PROFILE, NULL, 0, path))) + { + // Append product-specific path + if (game == Game_Dark_Forces) + { + PathAppend(path, "Saved Games\\Nightdive Studios\\Dark Forces Remaster"); + } + else if (game == Game_Outlaws) + { + PathAppend(path, "Saved Games\\Nightdive Studios\\Outlaws Remaster"); + } + else + { + return false; + } + s_paths[PATH_REMASTER_DOCS] = path; + s_paths[PATH_REMASTER_DOCS] += "\\"; + } + return !s_paths[PATH_REMASTER_DOCS].empty(); + #endif + return false; + } + bool setProgramPath() { char path[TFE_MAX_PATH]; diff --git a/TheForceEngine/TFE_FileSystem/paths.h b/TheForceEngine/TFE_FileSystem/paths.h index 786419d28..9eadc8384 100644 --- a/TheForceEngine/TFE_FileSystem/paths.h +++ b/TheForceEngine/TFE_FileSystem/paths.h @@ -1,6 +1,7 @@ #pragma once #include "fileutil.h" #include +#include enum TFE_PathType { @@ -10,6 +11,7 @@ enum TFE_PathType PATH_SOURCE_DATA, // This is the location of the source data, such as maps, textures, etc. PATH_EMULATOR, // Path to the dosbox exe (for the editor). PATH_MOD, // Use this to reference mods. + PATH_REMASTER_DOCS, // Path for Remaster Document Folder. PATH_COUNT }; @@ -34,6 +36,7 @@ namespace TFE_Paths bool setProgramDataPath(const char* append); bool setUserDocumentsPath(const char* append); // Platform specific executable path. + bool setRemasterDocsPath(GameID game); bool setProgramPath(); // find a relative path in a TFE system directory. true if mapping was done. bool mapSystemPath(char *path); diff --git a/TheForceEngine/main.cpp b/TheForceEngine/main.cpp index 1582757a3..b06e47ebe 100644 --- a/TheForceEngine/main.cpp +++ b/TheForceEngine/main.cpp @@ -547,6 +547,7 @@ int main(int argc, char* argv[]) const TFE_GameHeader* gameHeader = TFE_Settings::getGameHeader(game->game); TFE_Paths::setPath(PATH_SOURCE_DATA, gameHeader->sourcePath); TFE_Paths::setPath(PATH_EMULATOR, gameHeader->emulatorPath); + TFE_Paths::setRemasterDocsPath(game->id); // Validate the current game path. validatePath(); From 85b21947e6fcf5f8e35d1866185b66dcb51ae702 Mon Sep 17 00:00:00 2001 From: Karjala22 <78927981+Karjala22@users.noreply.github.com> Date: Wed, 9 Apr 2025 00:56:24 -0400 Subject: [PATCH 02/19] Add for linux compatibility --- TheForceEngine/TFE_FileSystem/paths-posix.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/TheForceEngine/TFE_FileSystem/paths-posix.cpp b/TheForceEngine/TFE_FileSystem/paths-posix.cpp index 02a79f8d6..1e8079199 100644 --- a/TheForceEngine/TFE_FileSystem/paths-posix.cpp +++ b/TheForceEngine/TFE_FileSystem/paths-posix.cpp @@ -130,6 +130,18 @@ namespace TFE_Paths return true; } + bool setRemasterDocsPath(GameID game) + { + if (isPortableInstall()) + { + s_paths[PATH_REMASTER_DOCS] = s_paths[PATH_PROGRAM]; + return true; + } + + // TO DO - find out where (if?) the remaster docs are available on Linux + return false; + } + bool setProgramPath(void) { char p[TFE_MAX_PATH]; From d3ed1cb152c97dc2edebc33e9a27cd615373a8d8 Mon Sep 17 00:00:00 2001 From: Karjala22 <78927981+Karjala22@users.noreply.github.com> Date: Wed, 9 Apr 2025 14:24:29 -0400 Subject: [PATCH 03/19] Update Linux pathing. --- TheForceEngine/TFE_FileSystem/paths-posix.cpp | 21 +++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/TheForceEngine/TFE_FileSystem/paths-posix.cpp b/TheForceEngine/TFE_FileSystem/paths-posix.cpp index 1e8079199..a4906954a 100644 --- a/TheForceEngine/TFE_FileSystem/paths-posix.cpp +++ b/TheForceEngine/TFE_FileSystem/paths-posix.cpp @@ -3,6 +3,7 @@ #include "paths.h" #include "fileutil.h" #include "filestream.h" +#include #include #include #include @@ -130,6 +131,8 @@ namespace TFE_Paths return true; } + // There is no official remaster support on linux + // Lets approximate proton save locations. bool setRemasterDocsPath(GameID game) { if (isPortableInstall()) @@ -137,9 +140,23 @@ namespace TFE_Paths s_paths[PATH_REMASTER_DOCS] = s_paths[PATH_PROGRAM]; return true; } + + string id = to_string(c_steamRemasterProductId[game]); + string append = "steamapps/compatdata/" + id + "/pfx/drive_c/users/steamuser/Saved Games/Nightdive Studios"; - // TO DO - find out where (if?) the remaster docs are available on Linux - return false; + if (id == Game_Dark_Forces) + { + append += "/Dark Forces Remaster/"; + } + else if (id == Game_Outlaws) + { + append += "/Outlaws Remaster/"; + } + { + return false; + } + s_paths[PATH_REMASTER_DOCS] = append; + return !s_paths[PATH_REMASTER_DOCS].empty(); } bool setProgramPath(void) From 8241d5f5d150a23f3b686e8cc875e8dfceacb192 Mon Sep 17 00:00:00 2001 From: Karjala22 <78927981+Karjala22@users.noreply.github.com> Date: Wed, 9 Apr 2025 14:44:26 -0400 Subject: [PATCH 04/19] fix for nix paths --- TheForceEngine/TFE_FileSystem/paths-posix.cpp | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/TheForceEngine/TFE_FileSystem/paths-posix.cpp b/TheForceEngine/TFE_FileSystem/paths-posix.cpp index a4906954a..dfcabcfea 100644 --- a/TheForceEngine/TFE_FileSystem/paths-posix.cpp +++ b/TheForceEngine/TFE_FileSystem/paths-posix.cpp @@ -140,15 +140,14 @@ namespace TFE_Paths s_paths[PATH_REMASTER_DOCS] = s_paths[PATH_PROGRAM]; return true; } - - string id = to_string(c_steamRemasterProductId[game]); - string append = "steamapps/compatdata/" + id + "/pfx/drive_c/users/steamuser/Saved Games/Nightdive Studios"; + string strId = to_string((int)TFE_Settings::c_steamRemasterProductId[game]); + string append = "steamapps/compatdata/" + strId + "/pfx/drive_c/users/steamuser/Saved Games/Nightdive Studios"; - if (id == Game_Dark_Forces) + if (game == Game_Dark_Forces) { append += "/Dark Forces Remaster/"; } - else if (id == Game_Outlaws) + else if (game == Game_Outlaws) { append += "/Outlaws Remaster/"; } From 1babf9159ca44c51f76a96e821c81327476dac66 Mon Sep 17 00:00:00 2001 From: Karjala22 <78927981+Karjala22@users.noreply.github.com> Date: Wed, 9 Apr 2025 20:16:20 -0400 Subject: [PATCH 05/19] change the path path based on testing on proton. --- TheForceEngine/TFE_FileSystem/paths-posix.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/TheForceEngine/TFE_FileSystem/paths-posix.cpp b/TheForceEngine/TFE_FileSystem/paths-posix.cpp index dfcabcfea..1901010b9 100644 --- a/TheForceEngine/TFE_FileSystem/paths-posix.cpp +++ b/TheForceEngine/TFE_FileSystem/paths-posix.cpp @@ -141,7 +141,7 @@ namespace TFE_Paths return true; } string strId = to_string((int)TFE_Settings::c_steamRemasterProductId[game]); - string append = "steamapps/compatdata/" + strId + "/pfx/drive_c/users/steamuser/Saved Games/Nightdive Studios"; + string append = "~/.steam/steam/steamapps/compatdata/" + strId + "/pfx/drive_c/users/steamuser/Saved Games/Nightdive Studios"; if (game == Game_Dark_Forces) { @@ -151,6 +151,7 @@ namespace TFE_Paths { append += "/Outlaws Remaster/"; } + else { return false; } From 9de83ee3fe04160a2be5ab20aae12a04fbd9de89 Mon Sep 17 00:00:00 2001 From: Karjala22 <78927981+Karjala22@users.noreply.github.com> Date: Sun, 1 Jun 2025 23:49:21 -0400 Subject: [PATCH 06/19] Adding option to show key usage messages. --- TheForceEngine/TFE_FrontEndUI/frontEndUi.cpp | 6 +++ .../TFE_Jedi/InfSystem/infSystem.cpp | 54 +++++++++++++------ TheForceEngine/TFE_Settings/settings.cpp | 1 + TheForceEngine/TFE_Settings/settings.h | 3 +- 4 files changed, 48 insertions(+), 16 deletions(-) diff --git a/TheForceEngine/TFE_FrontEndUI/frontEndUi.cpp b/TheForceEngine/TFE_FrontEndUI/frontEndUi.cpp index 9212ae21c..8fe24e76d 100644 --- a/TheForceEngine/TFE_FrontEndUI/frontEndUi.cpp +++ b/TheForceEngine/TFE_FrontEndUI/frontEndUi.cpp @@ -1230,6 +1230,12 @@ namespace TFE_FrontEndUI gameSettings->df_autoEndMission = autoEndMission; } + bool showKeysUsed = gameSettings->df_showKeyUsed; + if (ImGui::Checkbox("Show Key Used messages when opening doors", &showKeysUsed)) + { + gameSettings->df_showKeyUsed = showKeysUsed; + } + ImGui::Separator(); ImGui::PushFont(s_versionFont); diff --git a/TheForceEngine/TFE_Jedi/InfSystem/infSystem.cpp b/TheForceEngine/TFE_Jedi/InfSystem/infSystem.cpp index f58afbd74..cbd6e579c 100644 --- a/TheForceEngine/TFE_Jedi/InfSystem/infSystem.cpp +++ b/TheForceEngine/TFE_Jedi/InfSystem/infSystem.cpp @@ -2786,26 +2786,50 @@ namespace TFE_Jedi // Does the player have the key? KeyItem key = elev->key; - if (key == KEY_RED && !s_playerInfo.itemRedKey) + if (key == KEY_RED) { - // "You need the red key." - hud_sendTextMessage(6); - sound_play(s_needKeySoundId); - return; + if (TFE_Settings::getGameSettings()->df_showKeyUsed && s_playerInfo.itemRedKey) + { + string msg = "Using the Red Key"; + TFE_DarkForces::hud_sendTextMessage(msg.c_str(), 1, false); + } + else if (!s_playerInfo.itemRedKey) + { + // "You need the red key." + hud_sendTextMessage(6); + sound_play(s_needKeySoundId); + return; + } } - else if (key == KEY_YELLOW && !s_playerInfo.itemYellowKey) + else if (key == KEY_YELLOW) { - // "You need the yellow key." - hud_sendTextMessage(7); - sound_play(s_needKeySoundId); - return; + if (TFE_Settings::getGameSettings()->df_showKeyUsed && s_playerInfo.itemYellowKey) + { + string msg = "Using the Yellow Key"; + TFE_DarkForces::hud_sendTextMessage(msg.c_str(), 1, false); + } + else if (!s_playerInfo.itemYellowKey) + { + // "You need the yellow key." + hud_sendTextMessage(7); + sound_play(s_needKeySoundId); + return; + } } - else if (key == KEY_BLUE && !s_playerInfo.itemBlueKey) + else if (key == KEY_BLUE) { - // "You need the blue key." - hud_sendTextMessage(8); - sound_play(s_needKeySoundId); - return; + if (TFE_Settings::getGameSettings()->df_showKeyUsed && s_playerInfo.itemBlueKey) + { + string msg = "Using the Blue Key"; + TFE_DarkForces::hud_sendTextMessage(msg.c_str(), 1, false); + } + else if (!s_playerInfo.itemBlueKey) + { + // "You need the blue key." + hud_sendTextMessage(8); + sound_play(s_needKeySoundId); + return; + } } } diff --git a/TheForceEngine/TFE_Settings/settings.cpp b/TheForceEngine/TFE_Settings/settings.cpp index ae08a57d9..407c5bbf0 100644 --- a/TheForceEngine/TFE_Settings/settings.cpp +++ b/TheForceEngine/TFE_Settings/settings.cpp @@ -545,6 +545,7 @@ namespace TFE_Settings writeKeyValue_Bool(settings, "df_enableRecordingAll", s_gameSettings.df_enableRecordingAll); writeKeyValue_Bool(settings, "df_demologging", s_gameSettings.df_demologging); writeKeyValue_Bool(settings, "df_autoNextMission", s_gameSettings.df_autoEndMission); + writeKeyValue_Bool(settings, "df_showKeyUsed", s_gameSettings.df_showKeyUsed); } void writePerGameSettings(FileStream& settings) diff --git a/TheForceEngine/TFE_Settings/settings.h b/TheForceEngine/TFE_Settings/settings.h index f65d8d1d3..c400289a6 100644 --- a/TheForceEngine/TFE_Settings/settings.h +++ b/TheForceEngine/TFE_Settings/settings.h @@ -227,9 +227,10 @@ struct TFE_Settings_Game bool df_enableReplay = false; // Enable replay of gameplay. bool df_showReplayCounter = false; // Show the replay counter on the HUD. bool df_demologging = false; // Log the record/playback logging - bool df_autoEndMission = false; // Automatically skip to the next mission + bool df_autoEndMission = false; // Automatically skip to the next mission s32 df_recordFrameRate = 4; // Recording Framerate value s32 df_playbackFrameRate = 2; // Playback Framerate value + bool df_showKeyUsed = false; // Show a message when a key is used. PitchLimit df_pitchLimit = PITCH_VANILLA_PLUS; }; From c55af94a7ae6d44418e020b0529d8df2fbf4caf1 Mon Sep 17 00:00:00 2001 From: Karjala22 <78927981+Karjala22@users.noreply.github.com> Date: Sun, 8 Jun 2025 13:44:20 -0400 Subject: [PATCH 07/19] Put the door colors into tfe messages. --- TheForceEngine/TFE_FrontEndUI/frontEndUi.cpp | 12 ++++++------ .../TFE_Jedi/InfSystem/infSystem.cpp | 19 +++++++++++++------ TheForceEngine/TFE_Settings/settings.h | 2 +- TheForceEngine/TFE_System/tfeMessage.h | 3 +++ TheForceEngine/UI_Text/TfeMessages.txt | 5 ++++- 5 files changed, 27 insertions(+), 14 deletions(-) diff --git a/TheForceEngine/TFE_FrontEndUI/frontEndUi.cpp b/TheForceEngine/TFE_FrontEndUI/frontEndUi.cpp index 8fe24e76d..b8368fefe 100644 --- a/TheForceEngine/TFE_FrontEndUI/frontEndUi.cpp +++ b/TheForceEngine/TFE_FrontEndUI/frontEndUi.cpp @@ -1200,6 +1200,12 @@ namespace TFE_FrontEndUI gameSettings->df_showSecretFoundMsg = showSecretMsg; } + bool showKeysUsed = gameSettings->df_showKeyUsed; + if (ImGui::Checkbox("Show Key Used messages", &showKeysUsed)) + { + gameSettings->df_showKeyUsed = showKeysUsed; + } + bool autorun = gameSettings->df_autorun; if (ImGui::Checkbox("Autorun", &autorun)) { @@ -1230,12 +1236,6 @@ namespace TFE_FrontEndUI gameSettings->df_autoEndMission = autoEndMission; } - bool showKeysUsed = gameSettings->df_showKeyUsed; - if (ImGui::Checkbox("Show Key Used messages when opening doors", &showKeysUsed)) - { - gameSettings->df_showKeyUsed = showKeysUsed; - } - ImGui::Separator(); ImGui::PushFont(s_versionFont); diff --git a/TheForceEngine/TFE_Jedi/InfSystem/infSystem.cpp b/TheForceEngine/TFE_Jedi/InfSystem/infSystem.cpp index cbd6e579c..39c5bd946 100644 --- a/TheForceEngine/TFE_Jedi/InfSystem/infSystem.cpp +++ b/TheForceEngine/TFE_Jedi/InfSystem/infSystem.cpp @@ -22,6 +22,7 @@ #include #include #include +#include #include #include // TODO: This will make adding Outlaws harder, fix the abstraction. @@ -2741,6 +2742,11 @@ namespace TFE_Jedi } } + void showDoorUsedMessage(KeyItem key) + { + + } + void infElevatorMessageInternal(MessageType msgType) { u32 event = s_msgEvent; @@ -2786,12 +2792,13 @@ namespace TFE_Jedi // Does the player have the key? KeyItem key = elev->key; + char keyBuffer[100]; if (key == KEY_RED) { if (TFE_Settings::getGameSettings()->df_showKeyUsed && s_playerInfo.itemRedKey) { - string msg = "Using the Red Key"; - TFE_DarkForces::hud_sendTextMessage(msg.c_str(), 1, false); + sprintf(keyBuffer, "Using the %s Key", TFE_System::getMessage(TFE_MSG_RED)); + TFE_DarkForces::hud_sendTextMessage(keyBuffer, 1, false); } else if (!s_playerInfo.itemRedKey) { @@ -2805,8 +2812,8 @@ namespace TFE_Jedi { if (TFE_Settings::getGameSettings()->df_showKeyUsed && s_playerInfo.itemYellowKey) { - string msg = "Using the Yellow Key"; - TFE_DarkForces::hud_sendTextMessage(msg.c_str(), 1, false); + sprintf(keyBuffer, "Using the %s Key", TFE_System::getMessage(TFE_MSG_YELLOW)); + TFE_DarkForces::hud_sendTextMessage(keyBuffer, 1, false); } else if (!s_playerInfo.itemYellowKey) { @@ -2820,8 +2827,8 @@ namespace TFE_Jedi { if (TFE_Settings::getGameSettings()->df_showKeyUsed && s_playerInfo.itemBlueKey) { - string msg = "Using the Blue Key"; - TFE_DarkForces::hud_sendTextMessage(msg.c_str(), 1, false); + sprintf(keyBuffer, "Using the %s Key", TFE_System::getMessage(TFE_MSG_BLUE)); + TFE_DarkForces::hud_sendTextMessage(keyBuffer, 1, false); } else if (!s_playerInfo.itemBlueKey) { diff --git a/TheForceEngine/TFE_Settings/settings.h b/TheForceEngine/TFE_Settings/settings.h index c400289a6..348bc2e56 100644 --- a/TheForceEngine/TFE_Settings/settings.h +++ b/TheForceEngine/TFE_Settings/settings.h @@ -230,7 +230,7 @@ struct TFE_Settings_Game bool df_autoEndMission = false; // Automatically skip to the next mission s32 df_recordFrameRate = 4; // Recording Framerate value s32 df_playbackFrameRate = 2; // Playback Framerate value - bool df_showKeyUsed = false; // Show a message when a key is used. + bool df_showKeyUsed = true; // Show a message when a key is used. PitchLimit df_pitchLimit = PITCH_VANILLA_PLUS; }; diff --git a/TheForceEngine/TFE_System/tfeMessage.h b/TheForceEngine/TFE_System/tfeMessage.h index 6de5d0c2d..5d55449ba 100644 --- a/TheForceEngine/TFE_System/tfeMessage.h +++ b/TheForceEngine/TFE_System/tfeMessage.h @@ -22,6 +22,9 @@ enum TFE_Message TFE_MSG_HARDCORE, TFE_MSG_FULLBRIGHT, TFE_MSG_HD, + TFE_MSG_RED, + TFE_MSG_BLUE, + TFE_MSG_YELLOW, TFE_MSG_COUNT }; diff --git a/TheForceEngine/UI_Text/TfeMessages.txt b/TheForceEngine/UI_Text/TfeMessages.txt index 280397b4e..de107f5b0 100644 --- a/TheForceEngine/UI_Text/TfeMessages.txt +++ b/TheForceEngine/UI_Text/TfeMessages.txt @@ -11,4 +11,7 @@ "One-Hit Kill Toggle." // TFE_MSG_ONEHITKILL "Hardcore Mode Toggle." // TFE_MSG_HARDCORE "Full-Bright Toggle." // TFE_MSG_FULLBRIGHT -"HD Assets Toggle." // TFE_MSG_HD \ No newline at end of file +"HD Assets Toggle." // TFE_MSG_HD +"Red" //TFE_MSG_RED +"Blue" //TFE_MSG_BLUE +"Yellow" //TFE_MSG_YELLOW \ No newline at end of file From 4833752239783a31072ccb08ca1dcbf65e1a1100 Mon Sep 17 00:00:00 2001 From: Karjala22 <78927981+Karjala22@users.noreply.github.com> Date: Fri, 20 Jun 2025 18:53:20 -0400 Subject: [PATCH 08/19] 1. Enable custom TFE Messages for mods 2. Add Message Serialization 3. Fix an issue with saves --- .../TFE_DarkForces/darkForcesMain.cpp | 22 ++++ TheForceEngine/TFE_DarkForces/mission.cpp | 6 ++ TheForceEngine/TFE_FrontEndUI/frontEndUi.cpp | 23 +++- TheForceEngine/TFE_Game/saveSystem.cpp | 6 ++ TheForceEngine/TFE_Game/saveSystem.h | 1 + .../TFE_Jedi/InfSystem/infSystem.cpp | 7 +- .../TFE_Jedi/Serialization/serialization.h | 3 +- TheForceEngine/TFE_System/tfeMessage.cpp | 100 +++++++++++++++--- TheForceEngine/TFE_System/tfeMessage.h | 5 + 9 files changed, 148 insertions(+), 25 deletions(-) diff --git a/TheForceEngine/TFE_DarkForces/darkForcesMain.cpp b/TheForceEngine/TFE_DarkForces/darkForcesMain.cpp index ac01d1454..8124f1b36 100644 --- a/TheForceEngine/TFE_DarkForces/darkForcesMain.cpp +++ b/TheForceEngine/TFE_DarkForces/darkForcesMain.cpp @@ -1049,6 +1049,26 @@ namespace TFE_DarkForces } } } + + else if (strcasecmp(zext, "txt") == 0) + { + char fname[TFE_MAX_PATH]; + FileUtil::getFileNameFromPath(name, fname, true); + + if (strcasecmp(fname, "tfemessages.txt") == 0) + { + char* buffer = extractTextFileFromZip(*zipArchive, i); + int bufferLen = zipArchive->getFileLength(i); + + // Load Mod TFE Messages + if (!TFE_System::loadMessagesBuffer(buffer, bufferLen, true)) + { + TFE_System::logWrite(LOG_ERROR, "Main", "Cannot load mod TFE messages."); + } + + free(buffer); + } + } } // If there is only 1 LFD, assume it is mission briefings. @@ -1598,6 +1618,8 @@ namespace TFE_DarkForces serialization_setVersion(curVersion); TFE_ForceScript::serialize(stream); + TFE_System::messages_serialize(stream); + if (!writeState) { agent_restartEndLevelTask(); diff --git a/TheForceEngine/TFE_DarkForces/mission.cpp b/TheForceEngine/TFE_DarkForces/mission.cpp index 69b423310..6b5b54fa8 100644 --- a/TheForceEngine/TFE_DarkForces/mission.cpp +++ b/TheForceEngine/TFE_DarkForces/mission.cpp @@ -515,6 +515,12 @@ namespace TFE_DarkForces endRecording(); } + // Restore the default messages if you are exiting a mod. + if (TFE_System::modMessagesLoaded()) + { + TFE_System::restoreDefaultMessages(); + } + s_exitLevel = JTRUE; } diff --git a/TheForceEngine/TFE_FrontEndUI/frontEndUi.cpp b/TheForceEngine/TFE_FrontEndUI/frontEndUi.cpp index b8368fefe..93e736e26 100644 --- a/TheForceEngine/TFE_FrontEndUI/frontEndUi.cpp +++ b/TheForceEngine/TFE_FrontEndUI/frontEndUi.cpp @@ -28,6 +28,7 @@ #include #include #include +#include #include #include #include @@ -526,6 +527,12 @@ namespace TFE_FrontEndUI TFE_ExternalData::clearExternalEffects(); // clear effects TFE_ExternalData::clearExternalPickups(); // clear pickups + // Restore the default messages if you are exiting a mod. + if (TFE_System::modMessagesLoaded()) + { + TFE_System::restoreDefaultMessages(); + } + if (TFE_Settings::getSystemSettings()->returnToModLoader && s_modLoaded) { menuItem_Mods(); @@ -1786,7 +1793,21 @@ namespace TFE_FrontEndUI s_selectedSaveSlot = (s32)s_saveDir.size(); // If no quicksave exists, skip over it when generating the name. const s32 saveIndex = s_selectedSaveSlot + (s_hasQuicksave ? 0 : 1); - TFE_SaveSystem::getSaveFilenameFromIndex(saveIndex, s_fileName); + + // Make sure you save to a feil that doesn't already exist unless you are overwriting. + char * gameDir = TFE_SaveSystem::getSaveDir(); + TFE_Paths::fixupPathAsDirectory(gameDir); + for (int i = saveIndex; i >= 0; i--) + { + TFE_SaveSystem::getSaveFilenameFromIndex(i, s_fileName); + char saveFilePath[TFE_MAX_PATH]; + sprintf(saveFilePath, "%s%s", gameDir, s_fileName); + + if (!FileUtil::exists(saveFilePath)) + { + break; + } + } s_newSaveName[0] = 0; openSaveNameEditPopup(s_newSaveName); diff --git a/TheForceEngine/TFE_Game/saveSystem.cpp b/TheForceEngine/TFE_Game/saveSystem.cpp index 2e59d1e76..a6ad620de 100644 --- a/TheForceEngine/TFE_Game/saveSystem.cpp +++ b/TheForceEngine/TFE_Game/saveSystem.cpp @@ -388,4 +388,10 @@ namespace TFE_SaveSystem lastState = 0; } } + + char * getSaveDir() + { + return s_gameSavePath; + } + } \ No newline at end of file diff --git a/TheForceEngine/TFE_Game/saveSystem.h b/TheForceEngine/TFE_Game/saveSystem.h index 4a647fdcf..dc366a78b 100644 --- a/TheForceEngine/TFE_Game/saveSystem.h +++ b/TheForceEngine/TFE_Game/saveSystem.h @@ -52,4 +52,5 @@ namespace TFE_SaveSystem void getSaveFilenameFromIndex(s32 index, char* name); void populateSaveDirectory(std::vector& dir); + char* getSaveDir(); } \ No newline at end of file diff --git a/TheForceEngine/TFE_Jedi/InfSystem/infSystem.cpp b/TheForceEngine/TFE_Jedi/InfSystem/infSystem.cpp index 39c5bd946..99920a29b 100644 --- a/TheForceEngine/TFE_Jedi/InfSystem/infSystem.cpp +++ b/TheForceEngine/TFE_Jedi/InfSystem/infSystem.cpp @@ -2742,11 +2742,6 @@ namespace TFE_Jedi } } - void showDoorUsedMessage(KeyItem key) - { - - } - void infElevatorMessageInternal(MessageType msgType) { u32 event = s_msgEvent; @@ -2792,7 +2787,7 @@ namespace TFE_Jedi // Does the player have the key? KeyItem key = elev->key; - char keyBuffer[100]; + char keyBuffer[50]; if (key == KEY_RED) { if (TFE_Settings::getGameSettings()->df_showKeyUsed && s_playerInfo.itemRedKey) diff --git a/TheForceEngine/TFE_Jedi/Serialization/serialization.h b/TheForceEngine/TFE_Jedi/Serialization/serialization.h index a74f8591c..189bc3da2 100644 --- a/TheForceEngine/TFE_Jedi/Serialization/serialization.h +++ b/TheForceEngine/TFE_Jedi/Serialization/serialization.h @@ -21,7 +21,8 @@ namespace TFE_Jedi SaveVersionLevelScriptV1, SaveVersionHitEffectTaskUpdate, SaveVersionSmoothDeltatime, - SaveVersionCur = SaveVersionSmoothDeltatime, + SavVersionTFEMessages, + SaveVersionCur = SavVersionTFEMessages, }; enum SerializationMode diff --git a/TheForceEngine/TFE_System/tfeMessage.cpp b/TheForceEngine/TFE_System/tfeMessage.cpp index 07fc19410..13135f5ae 100644 --- a/TheForceEngine/TFE_System/tfeMessage.cpp +++ b/TheForceEngine/TFE_System/tfeMessage.cpp @@ -1,12 +1,15 @@ #include "tfeMessage.h" #include "parser.h" #include +#include #include #include namespace TFE_System { static char* s_tfeMessage[TFE_MSG_COUNT]; + static char* s_tfeMessageOrig[TFE_MSG_COUNT]; + static bool s_modMessagesLoaded = false; static bool s_messagesLoaded = false; const char* getMessage(TFE_Message msg) @@ -27,25 +30,26 @@ namespace TFE_System s_messagesLoaded = false; } - bool loadMessages(const char* path) + bool modMessagesLoaded() { - FileStream file; - if (!file.open(path, Stream::MODE_READ)) - { - return false; - } + return s_modMessagesLoaded; + } - // Read the file into memory. - const size_t len = file.getSize(); - char* contents = new char[len + 1]; - if (!contents) + void restoreDefaultMessages() + { + if (s_modMessagesLoaded) { - file.close(); - return false; + for (s32 i = 0; i < TFE_MSG_COUNT; i++) + { + free(s_tfeMessage[i]); + s_tfeMessage[i] = _strdup(s_tfeMessageOrig[i]); + } + s_modMessagesLoaded = false; } - file.readBuffer(contents, (u32)len); - file.close(); + } + bool loadMessagesBuffer(char* contents, int len, bool isMod) + { TFE_Parser parser; parser.init(contents, len); parser.addCommentString(";"); @@ -68,8 +72,70 @@ namespace TFE_System strcpy(s_tfeMessage[index], item); index++; } - s_messagesLoaded = (index == TFE_MSG_COUNT); - assert(s_messagesLoaded); - return s_messagesLoaded; + if (isMod) + { + s_modMessagesLoaded = true; + return s_modMessagesLoaded; + } + else + { + s_messagesLoaded = (index == TFE_MSG_COUNT); + assert(s_messagesLoaded); + return s_messagesLoaded; + } + } + + bool loadMessages(const char* path) + { + FileStream file; + if (!file.open(path, Stream::MODE_READ)) + { + return false; + } + + // Read the file into memory. + const size_t len = file.getSize(); + char* contents = new char[len + 1]; + if (!contents) + { + file.close(); + return false; + } + file.readBuffer(contents, (u32)len); + file.close(); + + // Store default results + if (loadMessagesBuffer(contents, len)) + { + for (s32 i = 0; i < TFE_MSG_COUNT; i++) + { + s_tfeMessageOrig[i] = _strdup(s_tfeMessage[i]); + if (!s_tfeMessageOrig[i]) + { + freeMessages(); + return false; + } + } + } + return true; + } + + void messages_serialize(Stream* stream) + { + // Don't bother serializing older versions. + if (SaveVersionCur < SavVersionTFEMessages) + { + return; + } + SERIALIZE(SavVersionTFEMessages, s_modMessagesLoaded, false); + + // Serialize s_tfeMessage + for (s32 i = 0; i < TFE_MSG_COUNT; i++) + { + int len = strlen(s_tfeMessage[i]); + SERIALIZE(SavVersionTFEMessages, len, 0); + SERIALIZE_BUF(SavVersionTFEMessages, s_tfeMessage[i], len); + + } } } \ No newline at end of file diff --git a/TheForceEngine/TFE_System/tfeMessage.h b/TheForceEngine/TFE_System/tfeMessage.h index 5d55449ba..a5d8a2e2b 100644 --- a/TheForceEngine/TFE_System/tfeMessage.h +++ b/TheForceEngine/TFE_System/tfeMessage.h @@ -5,6 +5,7 @@ #include "types.h" #include "system.h" +#include enum TFE_Message { @@ -32,5 +33,9 @@ namespace TFE_System { const char* getMessage(TFE_Message msg); bool loadMessages(const char* path); + bool modMessagesLoaded(); + bool loadMessagesBuffer(char* contents, int len, bool isMod = false); + void restoreDefaultMessages(); void freeMessages(); + void messages_serialize(Stream* stream); } \ No newline at end of file From af6615fbf827d56b9167353b4d737ba525e4d472 Mon Sep 17 00:00:00 2001 From: Karjala22 <78927981+Karjala22@users.noreply.github.com> Date: Sat, 21 Jun 2025 14:22:24 -0400 Subject: [PATCH 09/19] Revert save bugs fix - putting in separate branch --- TheForceEngine/TFE_FrontEndUI/frontEndUi.cpp | 16 +--------------- TheForceEngine/TFE_Game/saveSystem.cpp | 5 ----- TheForceEngine/TFE_Game/saveSystem.h | 1 - 3 files changed, 1 insertion(+), 21 deletions(-) diff --git a/TheForceEngine/TFE_FrontEndUI/frontEndUi.cpp b/TheForceEngine/TFE_FrontEndUI/frontEndUi.cpp index 93e736e26..54a04fcdd 100644 --- a/TheForceEngine/TFE_FrontEndUI/frontEndUi.cpp +++ b/TheForceEngine/TFE_FrontEndUI/frontEndUi.cpp @@ -1793,21 +1793,7 @@ namespace TFE_FrontEndUI s_selectedSaveSlot = (s32)s_saveDir.size(); // If no quicksave exists, skip over it when generating the name. const s32 saveIndex = s_selectedSaveSlot + (s_hasQuicksave ? 0 : 1); - - // Make sure you save to a feil that doesn't already exist unless you are overwriting. - char * gameDir = TFE_SaveSystem::getSaveDir(); - TFE_Paths::fixupPathAsDirectory(gameDir); - for (int i = saveIndex; i >= 0; i--) - { - TFE_SaveSystem::getSaveFilenameFromIndex(i, s_fileName); - char saveFilePath[TFE_MAX_PATH]; - sprintf(saveFilePath, "%s%s", gameDir, s_fileName); - - if (!FileUtil::exists(saveFilePath)) - { - break; - } - } + TFE_SaveSystem::getSaveFilenameFromIndex(saveIndex, s_fileName); s_newSaveName[0] = 0; openSaveNameEditPopup(s_newSaveName); diff --git a/TheForceEngine/TFE_Game/saveSystem.cpp b/TheForceEngine/TFE_Game/saveSystem.cpp index a6ad620de..ed979180c 100644 --- a/TheForceEngine/TFE_Game/saveSystem.cpp +++ b/TheForceEngine/TFE_Game/saveSystem.cpp @@ -389,9 +389,4 @@ namespace TFE_SaveSystem } } - char * getSaveDir() - { - return s_gameSavePath; - } - } \ No newline at end of file diff --git a/TheForceEngine/TFE_Game/saveSystem.h b/TheForceEngine/TFE_Game/saveSystem.h index dc366a78b..4a647fdcf 100644 --- a/TheForceEngine/TFE_Game/saveSystem.h +++ b/TheForceEngine/TFE_Game/saveSystem.h @@ -52,5 +52,4 @@ namespace TFE_SaveSystem void getSaveFilenameFromIndex(s32 index, char* name); void populateSaveDirectory(std::vector& dir); - char* getSaveDir(); } \ No newline at end of file From 1d400bf1bca064216266ae15bd5919700a2941b0 Mon Sep 17 00:00:00 2001 From: Karjala22 <78927981+Karjala22@users.noreply.github.com> Date: Sat, 21 Jun 2025 14:24:14 -0400 Subject: [PATCH 10/19] spurious space --- TheForceEngine/TFE_Game/saveSystem.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/TheForceEngine/TFE_Game/saveSystem.cpp b/TheForceEngine/TFE_Game/saveSystem.cpp index ed979180c..2e59d1e76 100644 --- a/TheForceEngine/TFE_Game/saveSystem.cpp +++ b/TheForceEngine/TFE_Game/saveSystem.cpp @@ -388,5 +388,4 @@ namespace TFE_SaveSystem lastState = 0; } } - } \ No newline at end of file From abe69d2544090a37f0a4dfb43c48489f8556389e Mon Sep 17 00:00:00 2001 From: Karjala22 <78927981+Karjala22@users.noreply.github.com> Date: Sat, 21 Jun 2025 16:08:47 -0400 Subject: [PATCH 11/19] fix for linux --- TheForceEngine/TFE_System/tfeMessage.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/TheForceEngine/TFE_System/tfeMessage.cpp b/TheForceEngine/TFE_System/tfeMessage.cpp index 13135f5ae..aa329aef0 100644 --- a/TheForceEngine/TFE_System/tfeMessage.cpp +++ b/TheForceEngine/TFE_System/tfeMessage.cpp @@ -5,6 +5,10 @@ #include #include +#ifdef _WIN32 +#define strdup _strdup +#endif + namespace TFE_System { static char* s_tfeMessage[TFE_MSG_COUNT]; @@ -42,7 +46,7 @@ namespace TFE_System for (s32 i = 0; i < TFE_MSG_COUNT; i++) { free(s_tfeMessage[i]); - s_tfeMessage[i] = _strdup(s_tfeMessageOrig[i]); + s_tfeMessage[i] = strdup(s_tfeMessageOrig[i]); } s_modMessagesLoaded = false; } From 94c81b934f6f53974e43e9d4afbeae6a15e7c565 Mon Sep 17 00:00:00 2001 From: Karjala22 <78927981+Karjala22@users.noreply.github.com> Date: Sat, 21 Jun 2025 16:16:15 -0400 Subject: [PATCH 12/19] fix second stdrup --- TheForceEngine/TFE_System/tfeMessage.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TheForceEngine/TFE_System/tfeMessage.cpp b/TheForceEngine/TFE_System/tfeMessage.cpp index aa329aef0..720bf5789 100644 --- a/TheForceEngine/TFE_System/tfeMessage.cpp +++ b/TheForceEngine/TFE_System/tfeMessage.cpp @@ -113,7 +113,7 @@ namespace TFE_System { for (s32 i = 0; i < TFE_MSG_COUNT; i++) { - s_tfeMessageOrig[i] = _strdup(s_tfeMessage[i]); + s_tfeMessageOrig[i] = strdup(s_tfeMessage[i]); if (!s_tfeMessageOrig[i]) { freeMessages(); From 4f1cd7a71da59728bc69f4aec5d98576b7c8a43c Mon Sep 17 00:00:00 2001 From: Karjala22 <78927981+Karjala22@users.noreply.github.com> Date: Sat, 21 Jun 2025 23:45:07 -0400 Subject: [PATCH 13/19] Split off TFE messages for mods for a separate PR --- .../TFE_DarkForces/darkForcesMain.cpp | 462 +++++++++--------- TheForceEngine/TFE_DarkForces/mission.cpp | 6 - .../TFE_Jedi/Serialization/serialization.h | 3 +- TheForceEngine/TFE_System/tfeMessage.cpp | 104 +--- TheForceEngine/TFE_System/tfeMessage.h | 4 - TheForceEngine/UI_Text/TfeMessages.txt | 8 +- 6 files changed, 242 insertions(+), 345 deletions(-) diff --git a/TheForceEngine/TFE_DarkForces/darkForcesMain.cpp b/TheForceEngine/TFE_DarkForces/darkForcesMain.cpp index 8124f1b36..9e2ea8f3a 100644 --- a/TheForceEngine/TFE_DarkForces/darkForcesMain.cpp +++ b/TheForceEngine/TFE_DarkForces/darkForcesMain.cpp @@ -81,12 +81,12 @@ namespace TFE_DarkForces { "enhanced.gob", }; - + enum GameConstants { MAX_MOD_LFD = 16, }; - + enum GameState { GSTATE_STARTUP_CUTSCENES = 0, @@ -111,7 +111,7 @@ namespace TFE_DarkForces GameMode nextGameMode; s32 cutscene; }; - + static CutsceneData s_cutsceneData[] = { { 1, GMODE_CUTSCENE, 100 }, @@ -197,12 +197,12 @@ namespace TFE_DarkForces char* args[64] = { 0 }; JBool cutscenesEnabled = JTRUE; - JBool localMsgLoaded = JFALSE; - s32 startLevel = 0; - GameState state = GSTATE_STARTUP_CUTSCENES; - s32 levelIndex = 0; - s32 cutsceneIndex = 0; - JBool abortLevel = JFALSE; + JBool localMsgLoaded = JFALSE; + s32 startLevel = 0; + GameState state = GSTATE_STARTUP_CUTSCENES; + s32 levelIndex = 0; + s32 cutsceneIndex = 0; + JBool abortLevel = JFALSE; }; struct SharedGameState { @@ -222,7 +222,7 @@ namespace TFE_DarkForces }; static RunGameState s_runGameState = {}; static SharedGameState s_sharedState = {}; - + ///////////////////////////////////////////// // Forward Declarations ///////////////////////////////////////////// @@ -244,7 +244,7 @@ namespace TFE_DarkForces ///////////////////////////////////////////// // API ///////////////////////////////////////////// - + // This is the equivalent of the initial part of main() in Dark Forces DOS. // This part loads and sets up the game. bool DarkForces::runGame(s32 argCount, const char* argv[], Stream* stream) @@ -316,7 +316,7 @@ namespace TFE_DarkForces // Handle start level setInitialLevel(startLevel); - + // TFE Specific agentMenu_load(&s_sharedState.langKeys); escapeMenu_load(&s_sharedState.langKeys); @@ -360,7 +360,7 @@ namespace TFE_DarkForces cutsceneFilm_reset(); lsystem_destroy(); bitmap_clearAll(); - + // Clear paths and archives. TFE_Paths::clearSearchPaths(); TFE_Paths::clearLocalArchives(); @@ -382,7 +382,7 @@ namespace TFE_DarkForces vue_resetState(); lsystem_destroy(); hud_reset(); - + // TFE TFE_Sprite_Jedi::freeAll(); TFE_Model_Jedi::freeAll(); @@ -425,7 +425,7 @@ namespace TFE_DarkForces ImReintializeMidi(); gameMusic_setState(MUS_STATE_STALK); } - + void handleLevelComplete() { s32 completedLevelIndex = agent_getLevelIndex(); @@ -524,7 +524,7 @@ namespace TFE_DarkForces } // Then do some init setup for the next level ahead of time; the actual loading will happen after the cutscenes and mission briefing. setLevelByIndex(levelIndex); - + // The inner most loop - this cycles through the cutscene entries, each of which lists the game mode. // TFE: Again this becomes a game state, where each iteration through this loop is from a single function call into loopGame(). while (!s_invalidLevelIndex && !s_abortLevel) @@ -566,156 +566,156 @@ namespace TFE_DarkForces void DarkForces::loopGame() { updateTime(); - + switch (s_runGameState.state) { - case GSTATE_STARTUP_CUTSCENES: + case GSTATE_STARTUP_CUTSCENES: + { + s_runGameState.state = GSTATE_CUTSCENE; + s_invalidLevelIndex = JTRUE; + + // Always force cutscenes off for demo playbac for cutscenes. + if (isDemoPlayback()) { - s_runGameState.state = GSTATE_CUTSCENE; - s_invalidLevelIndex = JTRUE; + s_runGameState.cutscenesEnabled = JFALSE; + } - // Always force cutscenes off for demo playbac for cutscenes. - if (isDemoPlayback()) + if (s_runGameState.cutscenesEnabled && !s_runGameState.startLevel) + { + cutscene_play(10); + } + else + { + startNextMode(); + } + } break; + case GSTATE_AGENT_MENU: + { + bool levelSelected = false; + if (s_runGameState.startLevel) + { + s_runGameState.abortLevel = JFALSE; + s_runGameState.levelIndex = s_runGameState.startLevel; + s_runGameState.startLevel = 0; + levelSelected = true; + } + else if (!agentMenu_update(&s_runGameState.levelIndex)) + { + agent_updateAgentSavedData(); + levelSelected = true; + } + + if (levelSelected) + { + s_invalidLevelIndex = JTRUE; + for (s32 i = 0; i < TFE_ARRAYSIZE(s_cutsceneData); i++) { - s_runGameState.cutscenesEnabled = JFALSE; + if (s_cutsceneData[i].levelIndex >= 0 && s_cutsceneData[i].levelIndex == s_runGameState.levelIndex) + { + s_runGameState.cutsceneIndex = i; + s_invalidLevelIndex = JFALSE; + break; + } } - if (s_runGameState.cutscenesEnabled && !s_runGameState.startLevel) + lmusic_reset(); + s_runGameState.abortLevel = JFALSE; + agent_setNextLevelByIndex(s_runGameState.levelIndex); + startNextMode(); + } + } break; + case GSTATE_CUTSCENE: + { + if (cutscene_update()) + { + if (TFE_A11Y::cutsceneCaptionsEnabled()) { TFE_A11Y::drawCaptions(); } + } + else + { + s_runGameState.cutsceneIndex++; + if (s_cutsceneData[s_runGameState.cutsceneIndex].nextGameMode == GMODE_END) { - cutscene_play(10); + s_runGameState.state = GSTATE_AGENT_MENU; + s_invalidLevelIndex = JTRUE; } else { startNextMode(); } - } break; - case GSTATE_AGENT_MENU: + TFE_A11Y::clearActiveCaptions(); + } + } break; + case GSTATE_BRIEFING: + { + s32 skill; + JBool abort; + lmusic_reset(); // Fix a Dark Forces bug where music won't play when entering a cutscene again without restarting. + if (!missionBriefing_update(&skill, &abort)) { - bool levelSelected = false; - if (s_runGameState.startLevel) - { - s_runGameState.abortLevel = JFALSE; - s_runGameState.levelIndex = s_runGameState.startLevel; - s_runGameState.startLevel = 0; - levelSelected = true; - } - else if (!agentMenu_update(&s_runGameState.levelIndex)) - { - agent_updateAgentSavedData(); - levelSelected = true; - } + missionBriefing_cleanup(); + TFE_Input::clearAccumulatedMouseMove(); - if (levelSelected) + if (abort) { s_invalidLevelIndex = JTRUE; - for (s32 i = 0; i < TFE_ARRAYSIZE(s_cutsceneData); i++) - { - if (s_cutsceneData[i].levelIndex >= 0 && s_cutsceneData[i].levelIndex == s_runGameState.levelIndex) - { - s_runGameState.cutsceneIndex = i; - s_invalidLevelIndex = JFALSE; - break; - } - } - - lmusic_reset(); - s_runGameState.abortLevel = JFALSE; - agent_setNextLevelByIndex(s_runGameState.levelIndex); - startNextMode(); - } - } break; - case GSTATE_CUTSCENE: - { - if (cutscene_update()) - { - if (TFE_A11Y::cutsceneCaptionsEnabled()) { TFE_A11Y::drawCaptions(); } + s_runGameState.cutsceneIndex--; } else { + s_agentData[s_agentId].difficulty = skill; s_runGameState.cutsceneIndex++; - if (s_cutsceneData[s_runGameState.cutsceneIndex].nextGameMode == GMODE_END) - { - s_runGameState.state = GSTATE_AGENT_MENU; - s_invalidLevelIndex = JTRUE; - } - else - { - startNextMode(); - } - TFE_A11Y::clearActiveCaptions(); } - } break; - case GSTATE_BRIEFING: + startNextMode(); + } + } break; + case GSTATE_MISSION: + { + // At this point the mission has already been launched. + // The task system will take over. Basically every frame we just check to see if there are any tasks running. + if (task_getCount()) + { + if (!s_gamePaused && TFE_A11Y::gameplayCaptionsEnabled()) { TFE_A11Y::drawCaptions(); } + } + else { - s32 skill; - JBool abort; + // We have returned from the mission tasks. + renderer_reset(); + gameMusic_stop(); + sound_levelStop(); + agent_levelEndTask(); lmusic_reset(); // Fix a Dark Forces bug where music won't play when entering a cutscene again without restarting. - if (!missionBriefing_update(&skill, &abort)) - { - missionBriefing_cleanup(); - TFE_Input::clearAccumulatedMouseMove(); + pda_cleanup(); - if (abort) - { - s_invalidLevelIndex = JTRUE; - s_runGameState.cutsceneIndex--; - } - else - { - s_agentData[s_agentId].difficulty = skill; - s_runGameState.cutsceneIndex++; - } - startNextMode(); - } - } break; - case GSTATE_MISSION: - { - // At this point the mission has already been launched. - // The task system will take over. Basically every frame we just check to see if there are any tasks running. - if (task_getCount()) + // Reset + TFE_Jedi::renderer_setType(RENDERER_SOFTWARE); + TFE_Jedi::render_setResolution(); + TFE_Jedi::renderer_setLimits(); + + // TFE + reticle_enable(false); + // TFE - Script system. + TFE_ScriptInterface::reset(); + + if (!s_levelComplete) { - if (!s_gamePaused && TFE_A11Y::gameplayCaptionsEnabled()) { TFE_A11Y::drawCaptions(); } + s_runGameState.abortLevel = JTRUE; + s_runGameState.cutsceneIndex--; } else { - // We have returned from the mission tasks. - renderer_reset(); - gameMusic_stop(); - sound_levelStop(); - agent_levelEndTask(); - lmusic_reset(); // Fix a Dark Forces bug where music won't play when entering a cutscene again without restarting. - pda_cleanup(); - - // Reset - TFE_Jedi::renderer_setType(RENDERER_SOFTWARE); - TFE_Jedi::render_setResolution(); - TFE_Jedi::renderer_setLimits(); - - // TFE - reticle_enable(false); - // TFE - Script system. - TFE_ScriptInterface::reset(); - - if (!s_levelComplete) - { - s_runGameState.abortLevel = JTRUE; - s_runGameState.cutsceneIndex--; - } - else - { - s_runGameState.cutsceneIndex++; - handleLevelComplete(); - } - - startNextMode(); - - region_clear(s_levelRegion); - bitmap_clearLevelData(); - bitmap_setAllocator(s_gameRegion); - level_freeAllAssets(); - TFE_A11Y::clearActiveCaptions(); + s_runGameState.cutsceneIndex++; + handleLevelComplete(); } - } break; + + startNextMode(); + + region_clear(s_levelRegion); + bitmap_clearLevelData(); + bitmap_setAllocator(s_gameRegion); + level_freeAllAssets(); + TFE_A11Y::clearActiveCaptions(); + } + } break; } } @@ -724,7 +724,7 @@ namespace TFE_DarkForces s_sharedState.cutsceneList = cutsceneList_load("cutscene.lst"); cutscene_init(s_sharedState.cutsceneList); } - + void freeAllMidi() { gameMusic_stop(); @@ -758,93 +758,93 @@ namespace TFE_DarkForces GameMode mode = s_cutsceneData[s_runGameState.cutsceneIndex].nextGameMode; switch (mode) { - case GMODE_END: + case GMODE_END: + { + s_runGameState.cutsceneIndex = 0; + s_invalidLevelIndex = JTRUE; + startNextMode(); + } break; + case GMODE_CUTSCENE: + { + if (s_runGameState.cutscenesEnabled && cutscene_play(s_cutsceneData[s_runGameState.cutsceneIndex].cutscene)) { - s_runGameState.cutsceneIndex = 0; - s_invalidLevelIndex = JTRUE; - startNextMode(); - } break; - case GMODE_CUTSCENE: + s_runGameState.state = GSTATE_CUTSCENE; + } + else { - if (s_runGameState.cutscenesEnabled && cutscene_play(s_cutsceneData[s_runGameState.cutsceneIndex].cutscene)) - { - s_runGameState.state = GSTATE_CUTSCENE; - } - else - { - s_runGameState.cutsceneIndex++; - startNextMode(); - } - } break; - case GMODE_BRIEFING: + s_runGameState.cutsceneIndex++; + startNextMode(); + } + } break; + case GMODE_BRIEFING: + { + BriefingInfo* brief = nullptr; + if (s_runGameState.cutscenesEnabled) { - BriefingInfo* brief = nullptr; - if (s_runGameState.cutscenesEnabled) + const char* levelName = agent_getLevelName(); + s32 briefingIndex = 0; + for (s32 i = 0; i < s_sharedState.briefingList.count; i++) { - const char* levelName = agent_getLevelName(); - s32 briefingIndex = 0; - for (s32 i = 0; i < s_sharedState.briefingList.count; i++) + if (strcasecmp(levelName, s_sharedState.briefingList.briefing[i].mission) == 0) { - if (strcasecmp(levelName, s_sharedState.briefingList.briefing[i].mission) == 0) - { - briefingIndex = i; - break; - } - } - - s32 skill = (s32)s_agentData[s_agentId].difficulty; - brief = &s_sharedState.briefingList.briefing[briefingIndex]; - if (brief) - { - missionBriefing_start(brief->archive, brief->bgAnim, levelName, brief->palette, skill, &s_sharedState.langKeys); - s_runGameState.state = GSTATE_BRIEFING; + briefingIndex = i; + break; } } - if (!brief) + s32 skill = (s32)s_agentData[s_agentId].difficulty; + brief = &s_sharedState.briefingList.briefing[briefingIndex]; + if (brief) { - s_runGameState.cutsceneIndex++; - startNextMode(); + missionBriefing_start(brief->archive, brief->bgAnim, levelName, brief->palette, skill, &s_sharedState.langKeys); + s_runGameState.state = GSTATE_BRIEFING; } - } break; - case GMODE_MISSION: + } + + if (!brief) { - sound_levelStart(); + s_runGameState.cutsceneIndex++; + startNextMode(); + } + } break; + case GMODE_MISSION: + { + sound_levelStart(); - bitmap_setAllocator(s_levelRegion); - actor_clearState(); + bitmap_setAllocator(s_levelRegion); + actor_clearState(); - task_reset(); - inf_clearState(); + task_reset(); + inf_clearState(); - TFE_Settings_Game* gameSettings = TFE_Settings::getGameSettings(); + TFE_Settings_Game* gameSettings = TFE_Settings::getGameSettings(); - // Entry point to replay a demo - if (gameSettings->df_enableReplay && !isDemoPlayback()) - { - loadReplay(); - } + // Entry point to replay a demo + if (gameSettings->df_enableReplay && !isDemoPlayback()) + { + loadReplay(); + } - // Entry point to recording a demo - if (gameSettings->df_enableRecording && !isRecording()) - { - startRecording(); - } + // Entry point to recording a demo + if (gameSettings->df_enableRecording && !isRecording()) + { + startRecording(); + } - s_sharedState.loadMissionTask = createTask("start mission", mission_startTaskFunc, JTRUE); - mission_setLoadMissionTask(s_sharedState.loadMissionTask); + s_sharedState.loadMissionTask = createTask("start mission", mission_startTaskFunc, JTRUE); + mission_setLoadMissionTask(s_sharedState.loadMissionTask); - s32 levelIndex = agent_getLevelIndex(); - gameMusic_start(levelIndex); + s32 levelIndex = agent_getLevelIndex(); + gameMusic_start(levelIndex); - agent_setLevelComplete(JFALSE); - agent_readSavedDataForLevel(s_agentId, levelIndex); + agent_setLevelComplete(JFALSE); + agent_readSavedDataForLevel(s_agentId, levelIndex); - // The load mission task should begin immediately once the Task System updates, - // so launchCurrentTask() is not required here. - // In the original, the task system would simply loop here. - s_runGameState.state = GSTATE_MISSION; - } + // The load mission task should begin immediately once the Task System updates, + // so launchCurrentTask() is not required here. + // In the original, the task system would simply loop here. + s_runGameState.state = GSTATE_MISSION; + } } } @@ -914,7 +914,7 @@ namespace TFE_DarkForces TFE_Paths::fixupPathAsDirectory(path); TFE_Paths::addAbsoluteSearchPath(path); TFE_System::logWrite(LOG_MSG, "DarkForces", "Drag and Drop Mod File: '%s'; Path: '%s'", fileName, path); - + loadCustomGob(fileName); } } @@ -1049,26 +1049,6 @@ namespace TFE_DarkForces } } } - - else if (strcasecmp(zext, "txt") == 0) - { - char fname[TFE_MAX_PATH]; - FileUtil::getFileNameFromPath(name, fname, true); - - if (strcasecmp(fname, "tfemessages.txt") == 0) - { - char* buffer = extractTextFileFromZip(*zipArchive, i); - int bufferLen = zipArchive->getFileLength(i); - - // Load Mod TFE Messages - if (!TFE_System::loadMessagesBuffer(buffer, bufferLen, true)) - { - TFE_System::logWrite(LOG_ERROR, "Main", "Cannot load mod TFE messages."); - } - - free(buffer); - } - } } // If there is only 1 LFD, assume it is mission briefings. @@ -1168,7 +1148,7 @@ namespace TFE_DarkForces FileUtil::readDirectory(modPath, "lfd", fileList); const size_t count = fileList.size(); const std::string* file = fileList.data(); - + for (size_t i = 0; i < count; i++, file++) { const size_t len = file->length(); @@ -1310,7 +1290,7 @@ namespace TFE_DarkForces TFE_Paths::addLocalSearchPath(""); TFE_Paths::addLocalSearchPath("LFD/"); // Dark Forces also adds C:/ and C:/LFD but TFE won't be doing that for obvious reasons... - + // Add some extra directories, if they exist. // Obviously these were not in the original code. TFE_Paths::addLocalSearchPath("Mods/"); @@ -1320,7 +1300,7 @@ namespace TFE_DarkForces const char* programData = TFE_Paths::getPath(PATH_PROGRAM_DATA); const char* programDir = TFE_Paths::getPath(PATH_PROGRAM); char path[TFE_MAX_PATH]; - + sprintf(path, "%sMods/", programData); TFE_Paths::addAbsoluteSearchPath(path); @@ -1372,7 +1352,7 @@ namespace TFE_DarkForces } return true; } - + void loadMapNumFont() { FilePath filePath; @@ -1399,7 +1379,7 @@ namespace TFE_DarkForces c = toupper(m->text[0]); if ((c >= 'A') && (c <= 'Z')) { - *dest = (KeyboardCode)((u32)(KEY_A) + (c - 'A')); + *dest = (KeyboardCode)((u32)(KEY_A)+(c - 'A')); } } } @@ -1411,18 +1391,18 @@ namespace TFE_DarkForces TFE_Paths::getFilePath("HOTKEYS.MSG", &fp); parseMessageFile(&msgs, &fp, 1); - parseKey(&msgs, 160, &s_sharedState.langKeys.k_yes, KEY_Y); - parseKey(&msgs, 350, &s_sharedState.langKeys.k_quit, KEY_Q); - parseKey(&msgs, 330, &s_sharedState.langKeys.k_cont, KEY_R); - parseKey(&msgs, 340, &s_sharedState.langKeys.k_conf, KEY_C); + parseKey(&msgs, 160, &s_sharedState.langKeys.k_yes, KEY_Y); + parseKey(&msgs, 350, &s_sharedState.langKeys.k_quit, KEY_Q); + parseKey(&msgs, 330, &s_sharedState.langKeys.k_cont, KEY_R); + parseKey(&msgs, 340, &s_sharedState.langKeys.k_conf, KEY_C); parseKey(&msgs, 110, &s_sharedState.langKeys.k_agdel, KEY_R); parseKey(&msgs, 130, &s_sharedState.langKeys.k_begin, KEY_B); - parseKey(&msgs, 240, &s_sharedState.langKeys.k_easy, KEY_E); - parseKey(&msgs, 250, &s_sharedState.langKeys.k_med, KEY_M); - parseKey(&msgs, 260, &s_sharedState.langKeys.k_hard, KEY_H); - parseKey(&msgs, 230, &s_sharedState.langKeys.k_canc, KEY_C); + parseKey(&msgs, 240, &s_sharedState.langKeys.k_easy, KEY_E); + parseKey(&msgs, 250, &s_sharedState.langKeys.k_med, KEY_M); + parseKey(&msgs, 260, &s_sharedState.langKeys.k_hard, KEY_H); + parseKey(&msgs, 230, &s_sharedState.langKeys.k_canc, KEY_C); } - + void gameStartup() { hud_loadGraphics(); @@ -1507,7 +1487,7 @@ namespace TFE_DarkForces TFE_System::logWrite(LOG_ERROR, "DarkForcesMain", "Failed to load diskerr image."); } } - + void startMissionFromSave(s32 levelIndex) { // We have returned from the mission tasks. @@ -1618,8 +1598,6 @@ namespace TFE_DarkForces serialization_setVersion(curVersion); TFE_ForceScript::serialize(stream); - TFE_System::messages_serialize(stream); - if (!writeState) { agent_restartEndLevelTask(); diff --git a/TheForceEngine/TFE_DarkForces/mission.cpp b/TheForceEngine/TFE_DarkForces/mission.cpp index 6b5b54fa8..69b423310 100644 --- a/TheForceEngine/TFE_DarkForces/mission.cpp +++ b/TheForceEngine/TFE_DarkForces/mission.cpp @@ -515,12 +515,6 @@ namespace TFE_DarkForces endRecording(); } - // Restore the default messages if you are exiting a mod. - if (TFE_System::modMessagesLoaded()) - { - TFE_System::restoreDefaultMessages(); - } - s_exitLevel = JTRUE; } diff --git a/TheForceEngine/TFE_Jedi/Serialization/serialization.h b/TheForceEngine/TFE_Jedi/Serialization/serialization.h index 189bc3da2..a74f8591c 100644 --- a/TheForceEngine/TFE_Jedi/Serialization/serialization.h +++ b/TheForceEngine/TFE_Jedi/Serialization/serialization.h @@ -21,8 +21,7 @@ namespace TFE_Jedi SaveVersionLevelScriptV1, SaveVersionHitEffectTaskUpdate, SaveVersionSmoothDeltatime, - SavVersionTFEMessages, - SaveVersionCur = SavVersionTFEMessages, + SaveVersionCur = SaveVersionSmoothDeltatime, }; enum SerializationMode diff --git a/TheForceEngine/TFE_System/tfeMessage.cpp b/TheForceEngine/TFE_System/tfeMessage.cpp index 720bf5789..07fc19410 100644 --- a/TheForceEngine/TFE_System/tfeMessage.cpp +++ b/TheForceEngine/TFE_System/tfeMessage.cpp @@ -1,19 +1,12 @@ #include "tfeMessage.h" #include "parser.h" #include -#include #include #include -#ifdef _WIN32 -#define strdup _strdup -#endif - namespace TFE_System { static char* s_tfeMessage[TFE_MSG_COUNT]; - static char* s_tfeMessageOrig[TFE_MSG_COUNT]; - static bool s_modMessagesLoaded = false; static bool s_messagesLoaded = false; const char* getMessage(TFE_Message msg) @@ -34,26 +27,25 @@ namespace TFE_System s_messagesLoaded = false; } - bool modMessagesLoaded() + bool loadMessages(const char* path) { - return s_modMessagesLoaded; - } + FileStream file; + if (!file.open(path, Stream::MODE_READ)) + { + return false; + } - void restoreDefaultMessages() - { - if (s_modMessagesLoaded) + // Read the file into memory. + const size_t len = file.getSize(); + char* contents = new char[len + 1]; + if (!contents) { - for (s32 i = 0; i < TFE_MSG_COUNT; i++) - { - free(s_tfeMessage[i]); - s_tfeMessage[i] = strdup(s_tfeMessageOrig[i]); - } - s_modMessagesLoaded = false; + file.close(); + return false; } - } + file.readBuffer(contents, (u32)len); + file.close(); - bool loadMessagesBuffer(char* contents, int len, bool isMod) - { TFE_Parser parser; parser.init(contents, len); parser.addCommentString(";"); @@ -76,70 +68,8 @@ namespace TFE_System strcpy(s_tfeMessage[index], item); index++; } - if (isMod) - { - s_modMessagesLoaded = true; - return s_modMessagesLoaded; - } - else - { - s_messagesLoaded = (index == TFE_MSG_COUNT); - assert(s_messagesLoaded); - return s_messagesLoaded; - } - } - - bool loadMessages(const char* path) - { - FileStream file; - if (!file.open(path, Stream::MODE_READ)) - { - return false; - } - - // Read the file into memory. - const size_t len = file.getSize(); - char* contents = new char[len + 1]; - if (!contents) - { - file.close(); - return false; - } - file.readBuffer(contents, (u32)len); - file.close(); - - // Store default results - if (loadMessagesBuffer(contents, len)) - { - for (s32 i = 0; i < TFE_MSG_COUNT; i++) - { - s_tfeMessageOrig[i] = strdup(s_tfeMessage[i]); - if (!s_tfeMessageOrig[i]) - { - freeMessages(); - return false; - } - } - } - return true; - } - - void messages_serialize(Stream* stream) - { - // Don't bother serializing older versions. - if (SaveVersionCur < SavVersionTFEMessages) - { - return; - } - SERIALIZE(SavVersionTFEMessages, s_modMessagesLoaded, false); - - // Serialize s_tfeMessage - for (s32 i = 0; i < TFE_MSG_COUNT; i++) - { - int len = strlen(s_tfeMessage[i]); - SERIALIZE(SavVersionTFEMessages, len, 0); - SERIALIZE_BUF(SavVersionTFEMessages, s_tfeMessage[i], len); - - } + s_messagesLoaded = (index == TFE_MSG_COUNT); + assert(s_messagesLoaded); + return s_messagesLoaded; } } \ No newline at end of file diff --git a/TheForceEngine/TFE_System/tfeMessage.h b/TheForceEngine/TFE_System/tfeMessage.h index a5d8a2e2b..dc4ce2534 100644 --- a/TheForceEngine/TFE_System/tfeMessage.h +++ b/TheForceEngine/TFE_System/tfeMessage.h @@ -33,9 +33,5 @@ namespace TFE_System { const char* getMessage(TFE_Message msg); bool loadMessages(const char* path); - bool modMessagesLoaded(); - bool loadMessagesBuffer(char* contents, int len, bool isMod = false); - void restoreDefaultMessages(); void freeMessages(); - void messages_serialize(Stream* stream); } \ No newline at end of file diff --git a/TheForceEngine/UI_Text/TfeMessages.txt b/TheForceEngine/UI_Text/TfeMessages.txt index de107f5b0..f3361df9e 100644 --- a/TheForceEngine/UI_Text/TfeMessages.txt +++ b/TheForceEngine/UI_Text/TfeMessages.txt @@ -11,7 +11,7 @@ "One-Hit Kill Toggle." // TFE_MSG_ONEHITKILL "Hardcore Mode Toggle." // TFE_MSG_HARDCORE "Full-Bright Toggle." // TFE_MSG_FULLBRIGHT -"HD Assets Toggle." // TFE_MSG_HD -"Red" //TFE_MSG_RED -"Blue" //TFE_MSG_BLUE -"Yellow" //TFE_MSG_YELLOW \ No newline at end of file +"HD Assets Toggle." // TFE_MSG_HD +"Red" //TFE_MSG_RED +"Blue" //TFE_MSG_BLUE +"Yellow" //TFE_MSG_YELLOW \ No newline at end of file From e821e970c9dcdd9aa0eadb5c5633765e95329d91 Mon Sep 17 00:00:00 2001 From: Karjala22 <78927981+Karjala22@users.noreply.github.com> Date: Sat, 21 Jun 2025 23:50:53 -0400 Subject: [PATCH 14/19] fix formatting --- .../TFE_DarkForces/darkForcesMain.cpp | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/TheForceEngine/TFE_DarkForces/darkForcesMain.cpp b/TheForceEngine/TFE_DarkForces/darkForcesMain.cpp index 9e2ea8f3a..309bb6980 100644 --- a/TheForceEngine/TFE_DarkForces/darkForcesMain.cpp +++ b/TheForceEngine/TFE_DarkForces/darkForcesMain.cpp @@ -197,12 +197,12 @@ namespace TFE_DarkForces char* args[64] = { 0 }; JBool cutscenesEnabled = JTRUE; - JBool localMsgLoaded = JFALSE; - s32 startLevel = 0; - GameState state = GSTATE_STARTUP_CUTSCENES; - s32 levelIndex = 0; - s32 cutsceneIndex = 0; - JBool abortLevel = JFALSE; + JBool localMsgLoaded = JFALSE; + s32 startLevel = 0; + GameState state = GSTATE_STARTUP_CUTSCENES; + s32 levelIndex = 0; + s32 cutsceneIndex = 0; + JBool abortLevel = JFALSE; }; struct SharedGameState { @@ -1379,7 +1379,7 @@ namespace TFE_DarkForces c = toupper(m->text[0]); if ((c >= 'A') && (c <= 'Z')) { - *dest = (KeyboardCode)((u32)(KEY_A)+(c - 'A')); + *dest = (KeyboardCode)((u32)(KEY_A) + (c - 'A')); } } } @@ -1391,16 +1391,16 @@ namespace TFE_DarkForces TFE_Paths::getFilePath("HOTKEYS.MSG", &fp); parseMessageFile(&msgs, &fp, 1); - parseKey(&msgs, 160, &s_sharedState.langKeys.k_yes, KEY_Y); - parseKey(&msgs, 350, &s_sharedState.langKeys.k_quit, KEY_Q); - parseKey(&msgs, 330, &s_sharedState.langKeys.k_cont, KEY_R); - parseKey(&msgs, 340, &s_sharedState.langKeys.k_conf, KEY_C); + parseKey(&msgs, 160, &s_sharedState.langKeys.k_yes, KEY_Y); + parseKey(&msgs, 350, &s_sharedState.langKeys.k_quit, KEY_Q); + parseKey(&msgs, 330, &s_sharedState.langKeys.k_cont, KEY_R); + parseKey(&msgs, 340, &s_sharedState.langKeys.k_conf, KEY_C); parseKey(&msgs, 110, &s_sharedState.langKeys.k_agdel, KEY_R); parseKey(&msgs, 130, &s_sharedState.langKeys.k_begin, KEY_B); - parseKey(&msgs, 240, &s_sharedState.langKeys.k_easy, KEY_E); - parseKey(&msgs, 250, &s_sharedState.langKeys.k_med, KEY_M); - parseKey(&msgs, 260, &s_sharedState.langKeys.k_hard, KEY_H); - parseKey(&msgs, 230, &s_sharedState.langKeys.k_canc, KEY_C); + parseKey(&msgs, 240, &s_sharedState.langKeys.k_easy, KEY_E); + parseKey(&msgs, 250, &s_sharedState.langKeys.k_med, KEY_M); + parseKey(&msgs, 260, &s_sharedState.langKeys.k_hard, KEY_H); + parseKey(&msgs, 230, &s_sharedState.langKeys.k_canc, KEY_C); } void gameStartup() From 813567c5123c4e5d91df3dcbc5dc71a07d6ec57f Mon Sep 17 00:00:00 2001 From: Karjala22 <78927981+Karjala22@users.noreply.github.com> Date: Sat, 21 Jun 2025 23:53:42 -0400 Subject: [PATCH 15/19] Remove message references from frontendui --- TheForceEngine/TFE_FrontEndUI/frontEndUi.cpp | 7 ------- 1 file changed, 7 deletions(-) diff --git a/TheForceEngine/TFE_FrontEndUI/frontEndUi.cpp b/TheForceEngine/TFE_FrontEndUI/frontEndUi.cpp index 54a04fcdd..b8368fefe 100644 --- a/TheForceEngine/TFE_FrontEndUI/frontEndUi.cpp +++ b/TheForceEngine/TFE_FrontEndUI/frontEndUi.cpp @@ -28,7 +28,6 @@ #include #include #include -#include #include #include #include @@ -527,12 +526,6 @@ namespace TFE_FrontEndUI TFE_ExternalData::clearExternalEffects(); // clear effects TFE_ExternalData::clearExternalPickups(); // clear pickups - // Restore the default messages if you are exiting a mod. - if (TFE_System::modMessagesLoaded()) - { - TFE_System::restoreDefaultMessages(); - } - if (TFE_Settings::getSystemSettings()->returnToModLoader && s_modLoaded) { menuItem_Mods(); From bb4f679d346808be09957b2ddd1418b73ac17547 Mon Sep 17 00:00:00 2001 From: Karjala22 <78927981+Karjala22@users.noreply.github.com> Date: Mon, 7 Jul 2025 11:28:09 -0400 Subject: [PATCH 16/19] Revert spurious commit. --- .../TFE_DarkForces/darkForcesMain.cpp | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/TheForceEngine/TFE_DarkForces/darkForcesMain.cpp b/TheForceEngine/TFE_DarkForces/darkForcesMain.cpp index 309bb6980..f62aa7ad8 100644 --- a/TheForceEngine/TFE_DarkForces/darkForcesMain.cpp +++ b/TheForceEngine/TFE_DarkForces/darkForcesMain.cpp @@ -197,12 +197,12 @@ namespace TFE_DarkForces char* args[64] = { 0 }; JBool cutscenesEnabled = JTRUE; - JBool localMsgLoaded = JFALSE; - s32 startLevel = 0; - GameState state = GSTATE_STARTUP_CUTSCENES; - s32 levelIndex = 0; - s32 cutsceneIndex = 0; - JBool abortLevel = JFALSE; + JBool localMsgLoaded = JFALSE; + s32 startLevel = 0; + GameState state = GSTATE_STARTUP_CUTSCENES; + s32 levelIndex = 0; + s32 cutsceneIndex = 0; + JBool abortLevel = JFALSE; }; struct SharedGameState { @@ -1379,7 +1379,7 @@ namespace TFE_DarkForces c = toupper(m->text[0]); if ((c >= 'A') && (c <= 'Z')) { - *dest = (KeyboardCode)((u32)(KEY_A) + (c - 'A')); + *dest = (KeyboardCode)((u32)(KEY_A)+(c - 'A')); } } } @@ -1391,16 +1391,16 @@ namespace TFE_DarkForces TFE_Paths::getFilePath("HOTKEYS.MSG", &fp); parseMessageFile(&msgs, &fp, 1); - parseKey(&msgs, 160, &s_sharedState.langKeys.k_yes, KEY_Y); - parseKey(&msgs, 350, &s_sharedState.langKeys.k_quit, KEY_Q); - parseKey(&msgs, 330, &s_sharedState.langKeys.k_cont, KEY_R); - parseKey(&msgs, 340, &s_sharedState.langKeys.k_conf, KEY_C); + parseKey(&msgs, 160, &s_sharedState.langKeys.k_yes, KEY_Y); + parseKey(&msgs, 350, &s_sharedState.langKeys.k_quit, KEY_Q); + parseKey(&msgs, 330, &s_sharedState.langKeys.k_cont, KEY_R); + parseKey(&msgs, 340, &s_sharedState.langKeys.k_conf, KEY_C); parseKey(&msgs, 110, &s_sharedState.langKeys.k_agdel, KEY_R); parseKey(&msgs, 130, &s_sharedState.langKeys.k_begin, KEY_B); - parseKey(&msgs, 240, &s_sharedState.langKeys.k_easy, KEY_E); - parseKey(&msgs, 250, &s_sharedState.langKeys.k_med, KEY_M); - parseKey(&msgs, 260, &s_sharedState.langKeys.k_hard, KEY_H); - parseKey(&msgs, 230, &s_sharedState.langKeys.k_canc, KEY_C); + parseKey(&msgs, 240, &s_sharedState.langKeys.k_easy, KEY_E); + parseKey(&msgs, 250, &s_sharedState.langKeys.k_med, KEY_M); + parseKey(&msgs, 260, &s_sharedState.langKeys.k_hard, KEY_H); + parseKey(&msgs, 230, &s_sharedState.langKeys.k_canc, KEY_C); } void gameStartup() @@ -1611,4 +1611,4 @@ namespace TFE_DarkForces } return true; } -} +} \ No newline at end of file From 29b82ada13d141cf661ceb3b6161dedd0e6695e1 Mon Sep 17 00:00:00 2001 From: Karjala22 <78927981+Karjala22@users.noreply.github.com> Date: Wed, 9 Jul 2025 09:50:06 -0400 Subject: [PATCH 17/19] fix spacing --- .../TFE_DarkForces/darkForcesMain.cpp | 442 +++++++++--------- 1 file changed, 221 insertions(+), 221 deletions(-) diff --git a/TheForceEngine/TFE_DarkForces/darkForcesMain.cpp b/TheForceEngine/TFE_DarkForces/darkForcesMain.cpp index f62aa7ad8..ac01d1454 100644 --- a/TheForceEngine/TFE_DarkForces/darkForcesMain.cpp +++ b/TheForceEngine/TFE_DarkForces/darkForcesMain.cpp @@ -81,12 +81,12 @@ namespace TFE_DarkForces { "enhanced.gob", }; - + enum GameConstants { MAX_MOD_LFD = 16, }; - + enum GameState { GSTATE_STARTUP_CUTSCENES = 0, @@ -111,7 +111,7 @@ namespace TFE_DarkForces GameMode nextGameMode; s32 cutscene; }; - + static CutsceneData s_cutsceneData[] = { { 1, GMODE_CUTSCENE, 100 }, @@ -197,12 +197,12 @@ namespace TFE_DarkForces char* args[64] = { 0 }; JBool cutscenesEnabled = JTRUE; - JBool localMsgLoaded = JFALSE; - s32 startLevel = 0; - GameState state = GSTATE_STARTUP_CUTSCENES; - s32 levelIndex = 0; - s32 cutsceneIndex = 0; - JBool abortLevel = JFALSE; + JBool localMsgLoaded = JFALSE; + s32 startLevel = 0; + GameState state = GSTATE_STARTUP_CUTSCENES; + s32 levelIndex = 0; + s32 cutsceneIndex = 0; + JBool abortLevel = JFALSE; }; struct SharedGameState { @@ -222,7 +222,7 @@ namespace TFE_DarkForces }; static RunGameState s_runGameState = {}; static SharedGameState s_sharedState = {}; - + ///////////////////////////////////////////// // Forward Declarations ///////////////////////////////////////////// @@ -244,7 +244,7 @@ namespace TFE_DarkForces ///////////////////////////////////////////// // API ///////////////////////////////////////////// - + // This is the equivalent of the initial part of main() in Dark Forces DOS. // This part loads and sets up the game. bool DarkForces::runGame(s32 argCount, const char* argv[], Stream* stream) @@ -316,7 +316,7 @@ namespace TFE_DarkForces // Handle start level setInitialLevel(startLevel); - + // TFE Specific agentMenu_load(&s_sharedState.langKeys); escapeMenu_load(&s_sharedState.langKeys); @@ -360,7 +360,7 @@ namespace TFE_DarkForces cutsceneFilm_reset(); lsystem_destroy(); bitmap_clearAll(); - + // Clear paths and archives. TFE_Paths::clearSearchPaths(); TFE_Paths::clearLocalArchives(); @@ -382,7 +382,7 @@ namespace TFE_DarkForces vue_resetState(); lsystem_destroy(); hud_reset(); - + // TFE TFE_Sprite_Jedi::freeAll(); TFE_Model_Jedi::freeAll(); @@ -425,7 +425,7 @@ namespace TFE_DarkForces ImReintializeMidi(); gameMusic_setState(MUS_STATE_STALK); } - + void handleLevelComplete() { s32 completedLevelIndex = agent_getLevelIndex(); @@ -524,7 +524,7 @@ namespace TFE_DarkForces } // Then do some init setup for the next level ahead of time; the actual loading will happen after the cutscenes and mission briefing. setLevelByIndex(levelIndex); - + // The inner most loop - this cycles through the cutscene entries, each of which lists the game mode. // TFE: Again this becomes a game state, where each iteration through this loop is from a single function call into loopGame(). while (!s_invalidLevelIndex && !s_abortLevel) @@ -566,156 +566,156 @@ namespace TFE_DarkForces void DarkForces::loopGame() { updateTime(); - + switch (s_runGameState.state) { - case GSTATE_STARTUP_CUTSCENES: - { - s_runGameState.state = GSTATE_CUTSCENE; - s_invalidLevelIndex = JTRUE; - - // Always force cutscenes off for demo playbac for cutscenes. - if (isDemoPlayback()) - { - s_runGameState.cutscenesEnabled = JFALSE; - } - - if (s_runGameState.cutscenesEnabled && !s_runGameState.startLevel) - { - cutscene_play(10); - } - else - { - startNextMode(); - } - } break; - case GSTATE_AGENT_MENU: - { - bool levelSelected = false; - if (s_runGameState.startLevel) - { - s_runGameState.abortLevel = JFALSE; - s_runGameState.levelIndex = s_runGameState.startLevel; - s_runGameState.startLevel = 0; - levelSelected = true; - } - else if (!agentMenu_update(&s_runGameState.levelIndex)) - { - agent_updateAgentSavedData(); - levelSelected = true; - } - - if (levelSelected) + case GSTATE_STARTUP_CUTSCENES: { + s_runGameState.state = GSTATE_CUTSCENE; s_invalidLevelIndex = JTRUE; - for (s32 i = 0; i < TFE_ARRAYSIZE(s_cutsceneData); i++) + + // Always force cutscenes off for demo playbac for cutscenes. + if (isDemoPlayback()) { - if (s_cutsceneData[i].levelIndex >= 0 && s_cutsceneData[i].levelIndex == s_runGameState.levelIndex) - { - s_runGameState.cutsceneIndex = i; - s_invalidLevelIndex = JFALSE; - break; - } + s_runGameState.cutscenesEnabled = JFALSE; } - lmusic_reset(); - s_runGameState.abortLevel = JFALSE; - agent_setNextLevelByIndex(s_runGameState.levelIndex); - startNextMode(); - } - } break; - case GSTATE_CUTSCENE: - { - if (cutscene_update()) - { - if (TFE_A11Y::cutsceneCaptionsEnabled()) { TFE_A11Y::drawCaptions(); } - } - else - { - s_runGameState.cutsceneIndex++; - if (s_cutsceneData[s_runGameState.cutsceneIndex].nextGameMode == GMODE_END) + if (s_runGameState.cutscenesEnabled && !s_runGameState.startLevel) { - s_runGameState.state = GSTATE_AGENT_MENU; - s_invalidLevelIndex = JTRUE; + cutscene_play(10); } else { startNextMode(); } - TFE_A11Y::clearActiveCaptions(); - } - } break; - case GSTATE_BRIEFING: - { - s32 skill; - JBool abort; - lmusic_reset(); // Fix a Dark Forces bug where music won't play when entering a cutscene again without restarting. - if (!missionBriefing_update(&skill, &abort)) + } break; + case GSTATE_AGENT_MENU: { - missionBriefing_cleanup(); - TFE_Input::clearAccumulatedMouseMove(); + bool levelSelected = false; + if (s_runGameState.startLevel) + { + s_runGameState.abortLevel = JFALSE; + s_runGameState.levelIndex = s_runGameState.startLevel; + s_runGameState.startLevel = 0; + levelSelected = true; + } + else if (!agentMenu_update(&s_runGameState.levelIndex)) + { + agent_updateAgentSavedData(); + levelSelected = true; + } - if (abort) + if (levelSelected) { s_invalidLevelIndex = JTRUE; - s_runGameState.cutsceneIndex--; + for (s32 i = 0; i < TFE_ARRAYSIZE(s_cutsceneData); i++) + { + if (s_cutsceneData[i].levelIndex >= 0 && s_cutsceneData[i].levelIndex == s_runGameState.levelIndex) + { + s_runGameState.cutsceneIndex = i; + s_invalidLevelIndex = JFALSE; + break; + } + } + + lmusic_reset(); + s_runGameState.abortLevel = JFALSE; + agent_setNextLevelByIndex(s_runGameState.levelIndex); + startNextMode(); + } + } break; + case GSTATE_CUTSCENE: + { + if (cutscene_update()) + { + if (TFE_A11Y::cutsceneCaptionsEnabled()) { TFE_A11Y::drawCaptions(); } } else { - s_agentData[s_agentId].difficulty = skill; s_runGameState.cutsceneIndex++; + if (s_cutsceneData[s_runGameState.cutsceneIndex].nextGameMode == GMODE_END) + { + s_runGameState.state = GSTATE_AGENT_MENU; + s_invalidLevelIndex = JTRUE; + } + else + { + startNextMode(); + } + TFE_A11Y::clearActiveCaptions(); } - startNextMode(); - } - } break; - case GSTATE_MISSION: - { - // At this point the mission has already been launched. - // The task system will take over. Basically every frame we just check to see if there are any tasks running. - if (task_getCount()) - { - if (!s_gamePaused && TFE_A11Y::gameplayCaptionsEnabled()) { TFE_A11Y::drawCaptions(); } - } - else + } break; + case GSTATE_BRIEFING: { - // We have returned from the mission tasks. - renderer_reset(); - gameMusic_stop(); - sound_levelStop(); - agent_levelEndTask(); + s32 skill; + JBool abort; lmusic_reset(); // Fix a Dark Forces bug where music won't play when entering a cutscene again without restarting. - pda_cleanup(); - - // Reset - TFE_Jedi::renderer_setType(RENDERER_SOFTWARE); - TFE_Jedi::render_setResolution(); - TFE_Jedi::renderer_setLimits(); - - // TFE - reticle_enable(false); - // TFE - Script system. - TFE_ScriptInterface::reset(); + if (!missionBriefing_update(&skill, &abort)) + { + missionBriefing_cleanup(); + TFE_Input::clearAccumulatedMouseMove(); - if (!s_levelComplete) + if (abort) + { + s_invalidLevelIndex = JTRUE; + s_runGameState.cutsceneIndex--; + } + else + { + s_agentData[s_agentId].difficulty = skill; + s_runGameState.cutsceneIndex++; + } + startNextMode(); + } + } break; + case GSTATE_MISSION: + { + // At this point the mission has already been launched. + // The task system will take over. Basically every frame we just check to see if there are any tasks running. + if (task_getCount()) { - s_runGameState.abortLevel = JTRUE; - s_runGameState.cutsceneIndex--; + if (!s_gamePaused && TFE_A11Y::gameplayCaptionsEnabled()) { TFE_A11Y::drawCaptions(); } } else { - s_runGameState.cutsceneIndex++; - handleLevelComplete(); - } - - startNextMode(); + // We have returned from the mission tasks. + renderer_reset(); + gameMusic_stop(); + sound_levelStop(); + agent_levelEndTask(); + lmusic_reset(); // Fix a Dark Forces bug where music won't play when entering a cutscene again without restarting. + pda_cleanup(); + + // Reset + TFE_Jedi::renderer_setType(RENDERER_SOFTWARE); + TFE_Jedi::render_setResolution(); + TFE_Jedi::renderer_setLimits(); + + // TFE + reticle_enable(false); + // TFE - Script system. + TFE_ScriptInterface::reset(); + + if (!s_levelComplete) + { + s_runGameState.abortLevel = JTRUE; + s_runGameState.cutsceneIndex--; + } + else + { + s_runGameState.cutsceneIndex++; + handleLevelComplete(); + } + + startNextMode(); - region_clear(s_levelRegion); - bitmap_clearLevelData(); - bitmap_setAllocator(s_gameRegion); - level_freeAllAssets(); - TFE_A11Y::clearActiveCaptions(); - } - } break; + region_clear(s_levelRegion); + bitmap_clearLevelData(); + bitmap_setAllocator(s_gameRegion); + level_freeAllAssets(); + TFE_A11Y::clearActiveCaptions(); + } + } break; } } @@ -724,7 +724,7 @@ namespace TFE_DarkForces s_sharedState.cutsceneList = cutsceneList_load("cutscene.lst"); cutscene_init(s_sharedState.cutsceneList); } - + void freeAllMidi() { gameMusic_stop(); @@ -758,93 +758,93 @@ namespace TFE_DarkForces GameMode mode = s_cutsceneData[s_runGameState.cutsceneIndex].nextGameMode; switch (mode) { - case GMODE_END: - { - s_runGameState.cutsceneIndex = 0; - s_invalidLevelIndex = JTRUE; - startNextMode(); - } break; - case GMODE_CUTSCENE: - { - if (s_runGameState.cutscenesEnabled && cutscene_play(s_cutsceneData[s_runGameState.cutsceneIndex].cutscene)) - { - s_runGameState.state = GSTATE_CUTSCENE; - } - else + case GMODE_END: { - s_runGameState.cutsceneIndex++; + s_runGameState.cutsceneIndex = 0; + s_invalidLevelIndex = JTRUE; startNextMode(); - } - } break; - case GMODE_BRIEFING: - { - BriefingInfo* brief = nullptr; - if (s_runGameState.cutscenesEnabled) + } break; + case GMODE_CUTSCENE: + { + if (s_runGameState.cutscenesEnabled && cutscene_play(s_cutsceneData[s_runGameState.cutsceneIndex].cutscene)) + { + s_runGameState.state = GSTATE_CUTSCENE; + } + else + { + s_runGameState.cutsceneIndex++; + startNextMode(); + } + } break; + case GMODE_BRIEFING: { - const char* levelName = agent_getLevelName(); - s32 briefingIndex = 0; - for (s32 i = 0; i < s_sharedState.briefingList.count; i++) + BriefingInfo* brief = nullptr; + if (s_runGameState.cutscenesEnabled) { - if (strcasecmp(levelName, s_sharedState.briefingList.briefing[i].mission) == 0) + const char* levelName = agent_getLevelName(); + s32 briefingIndex = 0; + for (s32 i = 0; i < s_sharedState.briefingList.count; i++) + { + if (strcasecmp(levelName, s_sharedState.briefingList.briefing[i].mission) == 0) + { + briefingIndex = i; + break; + } + } + + s32 skill = (s32)s_agentData[s_agentId].difficulty; + brief = &s_sharedState.briefingList.briefing[briefingIndex]; + if (brief) { - briefingIndex = i; - break; + missionBriefing_start(brief->archive, brief->bgAnim, levelName, brief->palette, skill, &s_sharedState.langKeys); + s_runGameState.state = GSTATE_BRIEFING; } } - s32 skill = (s32)s_agentData[s_agentId].difficulty; - brief = &s_sharedState.briefingList.briefing[briefingIndex]; - if (brief) + if (!brief) { - missionBriefing_start(brief->archive, brief->bgAnim, levelName, brief->palette, skill, &s_sharedState.langKeys); - s_runGameState.state = GSTATE_BRIEFING; + s_runGameState.cutsceneIndex++; + startNextMode(); } - } - - if (!brief) + } break; + case GMODE_MISSION: { - s_runGameState.cutsceneIndex++; - startNextMode(); - } - } break; - case GMODE_MISSION: - { - sound_levelStart(); + sound_levelStart(); - bitmap_setAllocator(s_levelRegion); - actor_clearState(); + bitmap_setAllocator(s_levelRegion); + actor_clearState(); - task_reset(); - inf_clearState(); + task_reset(); + inf_clearState(); - TFE_Settings_Game* gameSettings = TFE_Settings::getGameSettings(); + TFE_Settings_Game* gameSettings = TFE_Settings::getGameSettings(); - // Entry point to replay a demo - if (gameSettings->df_enableReplay && !isDemoPlayback()) - { - loadReplay(); - } + // Entry point to replay a demo + if (gameSettings->df_enableReplay && !isDemoPlayback()) + { + loadReplay(); + } - // Entry point to recording a demo - if (gameSettings->df_enableRecording && !isRecording()) - { - startRecording(); - } + // Entry point to recording a demo + if (gameSettings->df_enableRecording && !isRecording()) + { + startRecording(); + } - s_sharedState.loadMissionTask = createTask("start mission", mission_startTaskFunc, JTRUE); - mission_setLoadMissionTask(s_sharedState.loadMissionTask); + s_sharedState.loadMissionTask = createTask("start mission", mission_startTaskFunc, JTRUE); + mission_setLoadMissionTask(s_sharedState.loadMissionTask); - s32 levelIndex = agent_getLevelIndex(); - gameMusic_start(levelIndex); + s32 levelIndex = agent_getLevelIndex(); + gameMusic_start(levelIndex); - agent_setLevelComplete(JFALSE); - agent_readSavedDataForLevel(s_agentId, levelIndex); + agent_setLevelComplete(JFALSE); + agent_readSavedDataForLevel(s_agentId, levelIndex); - // The load mission task should begin immediately once the Task System updates, - // so launchCurrentTask() is not required here. - // In the original, the task system would simply loop here. - s_runGameState.state = GSTATE_MISSION; - } + // The load mission task should begin immediately once the Task System updates, + // so launchCurrentTask() is not required here. + // In the original, the task system would simply loop here. + s_runGameState.state = GSTATE_MISSION; + } } } @@ -914,7 +914,7 @@ namespace TFE_DarkForces TFE_Paths::fixupPathAsDirectory(path); TFE_Paths::addAbsoluteSearchPath(path); TFE_System::logWrite(LOG_MSG, "DarkForces", "Drag and Drop Mod File: '%s'; Path: '%s'", fileName, path); - + loadCustomGob(fileName); } } @@ -1148,7 +1148,7 @@ namespace TFE_DarkForces FileUtil::readDirectory(modPath, "lfd", fileList); const size_t count = fileList.size(); const std::string* file = fileList.data(); - + for (size_t i = 0; i < count; i++, file++) { const size_t len = file->length(); @@ -1290,7 +1290,7 @@ namespace TFE_DarkForces TFE_Paths::addLocalSearchPath(""); TFE_Paths::addLocalSearchPath("LFD/"); // Dark Forces also adds C:/ and C:/LFD but TFE won't be doing that for obvious reasons... - + // Add some extra directories, if they exist. // Obviously these were not in the original code. TFE_Paths::addLocalSearchPath("Mods/"); @@ -1300,7 +1300,7 @@ namespace TFE_DarkForces const char* programData = TFE_Paths::getPath(PATH_PROGRAM_DATA); const char* programDir = TFE_Paths::getPath(PATH_PROGRAM); char path[TFE_MAX_PATH]; - + sprintf(path, "%sMods/", programData); TFE_Paths::addAbsoluteSearchPath(path); @@ -1352,7 +1352,7 @@ namespace TFE_DarkForces } return true; } - + void loadMapNumFont() { FilePath filePath; @@ -1379,7 +1379,7 @@ namespace TFE_DarkForces c = toupper(m->text[0]); if ((c >= 'A') && (c <= 'Z')) { - *dest = (KeyboardCode)((u32)(KEY_A)+(c - 'A')); + *dest = (KeyboardCode)((u32)(KEY_A) + (c - 'A')); } } } @@ -1391,18 +1391,18 @@ namespace TFE_DarkForces TFE_Paths::getFilePath("HOTKEYS.MSG", &fp); parseMessageFile(&msgs, &fp, 1); - parseKey(&msgs, 160, &s_sharedState.langKeys.k_yes, KEY_Y); - parseKey(&msgs, 350, &s_sharedState.langKeys.k_quit, KEY_Q); - parseKey(&msgs, 330, &s_sharedState.langKeys.k_cont, KEY_R); - parseKey(&msgs, 340, &s_sharedState.langKeys.k_conf, KEY_C); + parseKey(&msgs, 160, &s_sharedState.langKeys.k_yes, KEY_Y); + parseKey(&msgs, 350, &s_sharedState.langKeys.k_quit, KEY_Q); + parseKey(&msgs, 330, &s_sharedState.langKeys.k_cont, KEY_R); + parseKey(&msgs, 340, &s_sharedState.langKeys.k_conf, KEY_C); parseKey(&msgs, 110, &s_sharedState.langKeys.k_agdel, KEY_R); parseKey(&msgs, 130, &s_sharedState.langKeys.k_begin, KEY_B); - parseKey(&msgs, 240, &s_sharedState.langKeys.k_easy, KEY_E); - parseKey(&msgs, 250, &s_sharedState.langKeys.k_med, KEY_M); - parseKey(&msgs, 260, &s_sharedState.langKeys.k_hard, KEY_H); - parseKey(&msgs, 230, &s_sharedState.langKeys.k_canc, KEY_C); + parseKey(&msgs, 240, &s_sharedState.langKeys.k_easy, KEY_E); + parseKey(&msgs, 250, &s_sharedState.langKeys.k_med, KEY_M); + parseKey(&msgs, 260, &s_sharedState.langKeys.k_hard, KEY_H); + parseKey(&msgs, 230, &s_sharedState.langKeys.k_canc, KEY_C); } - + void gameStartup() { hud_loadGraphics(); @@ -1487,7 +1487,7 @@ namespace TFE_DarkForces TFE_System::logWrite(LOG_ERROR, "DarkForcesMain", "Failed to load diskerr image."); } } - + void startMissionFromSave(s32 levelIndex) { // We have returned from the mission tasks. @@ -1611,4 +1611,4 @@ namespace TFE_DarkForces } return true; } -} \ No newline at end of file +} From b67b3c4797ebf97c382fcd7cc96dbfac8c452e15 Mon Sep 17 00:00:00 2001 From: Karjala22 <78927981+Karjala22@users.noreply.github.com> Date: Fri, 18 Jul 2025 15:16:12 -0400 Subject: [PATCH 18/19] Place a wrapper key msg so you can customize the message as well. Instead of "Using the %s key" you can say "Inserted the %s datacard" --- TheForceEngine/TFE_Jedi/InfSystem/infSystem.cpp | 9 ++++++--- TheForceEngine/TFE_Settings/settings.cpp | 4 ++++ TheForceEngine/TFE_System/tfeMessage.h | 1 + TheForceEngine/UI_Text/TfeMessages.txt | 7 ++++--- 4 files changed, 15 insertions(+), 6 deletions(-) diff --git a/TheForceEngine/TFE_Jedi/InfSystem/infSystem.cpp b/TheForceEngine/TFE_Jedi/InfSystem/infSystem.cpp index 99920a29b..d4c5dc994 100644 --- a/TheForceEngine/TFE_Jedi/InfSystem/infSystem.cpp +++ b/TheForceEngine/TFE_Jedi/InfSystem/infSystem.cpp @@ -2788,11 +2788,14 @@ namespace TFE_Jedi // Does the player have the key? KeyItem key = elev->key; char keyBuffer[50]; + char keyBufferWrapper[50]; + sprintf(keyBufferWrapper, "%s", TFE_System::getMessage(TFE_MSG_KEY)); + if (key == KEY_RED) { if (TFE_Settings::getGameSettings()->df_showKeyUsed && s_playerInfo.itemRedKey) { - sprintf(keyBuffer, "Using the %s Key", TFE_System::getMessage(TFE_MSG_RED)); + sprintf(keyBuffer, keyBufferWrapper, TFE_System::getMessage(TFE_MSG_RED)); TFE_DarkForces::hud_sendTextMessage(keyBuffer, 1, false); } else if (!s_playerInfo.itemRedKey) @@ -2807,7 +2810,7 @@ namespace TFE_Jedi { if (TFE_Settings::getGameSettings()->df_showKeyUsed && s_playerInfo.itemYellowKey) { - sprintf(keyBuffer, "Using the %s Key", TFE_System::getMessage(TFE_MSG_YELLOW)); + sprintf(keyBuffer, keyBufferWrapper, TFE_System::getMessage(TFE_MSG_YELLOW)); TFE_DarkForces::hud_sendTextMessage(keyBuffer, 1, false); } else if (!s_playerInfo.itemYellowKey) @@ -2822,7 +2825,7 @@ namespace TFE_Jedi { if (TFE_Settings::getGameSettings()->df_showKeyUsed && s_playerInfo.itemBlueKey) { - sprintf(keyBuffer, "Using the %s Key", TFE_System::getMessage(TFE_MSG_BLUE)); + sprintf(keyBuffer, keyBufferWrapper, TFE_System::getMessage(TFE_MSG_BLUE)); TFE_DarkForces::hud_sendTextMessage(keyBuffer, 1, false); } else if (!s_playerInfo.itemBlueKey) diff --git a/TheForceEngine/TFE_Settings/settings.cpp b/TheForceEngine/TFE_Settings/settings.cpp index 407c5bbf0..293d10115 100644 --- a/TheForceEngine/TFE_Settings/settings.cpp +++ b/TheForceEngine/TFE_Settings/settings.cpp @@ -1207,6 +1207,10 @@ namespace TFE_Settings { s_gameSettings.df_autoEndMission = parseBool(value); } + else if (strcasecmp("df_showKeyUsed", key) == 0) + { + s_gameSettings.df_showKeyUsed = parseBool(value); + } } void parseOutlawsSettings(const char* key, const char* value) diff --git a/TheForceEngine/TFE_System/tfeMessage.h b/TheForceEngine/TFE_System/tfeMessage.h index dc4ce2534..3c332eb1e 100644 --- a/TheForceEngine/TFE_System/tfeMessage.h +++ b/TheForceEngine/TFE_System/tfeMessage.h @@ -26,6 +26,7 @@ enum TFE_Message TFE_MSG_RED, TFE_MSG_BLUE, TFE_MSG_YELLOW, + TFE_MSG_KEY, TFE_MSG_COUNT }; diff --git a/TheForceEngine/UI_Text/TfeMessages.txt b/TheForceEngine/UI_Text/TfeMessages.txt index f3361df9e..df001f0f2 100644 --- a/TheForceEngine/UI_Text/TfeMessages.txt +++ b/TheForceEngine/UI_Text/TfeMessages.txt @@ -12,6 +12,7 @@ "Hardcore Mode Toggle." // TFE_MSG_HARDCORE "Full-Bright Toggle." // TFE_MSG_FULLBRIGHT "HD Assets Toggle." // TFE_MSG_HD -"Red" //TFE_MSG_RED -"Blue" //TFE_MSG_BLUE -"Yellow" //TFE_MSG_YELLOW \ No newline at end of file +"Red" // TFE_MSG_RED +"Blue" // TFE_MSG_BLUE +"Yellow" // TFE_MSG_YELLOW +"Using the %s key" // TFE_MSG_KEY \ No newline at end of file From 0f4d1f724a40967371daf8db48e4e68490180e69 Mon Sep 17 00:00:00 2001 From: Karjala22 <78927981+Karjala22@users.noreply.github.com> Date: Mon, 8 Sep 2025 23:14:51 -0400 Subject: [PATCH 19/19] Limit to 50 chars --- TheForceEngine/TFE_Jedi/InfSystem/infSystem.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TheForceEngine/TFE_Jedi/InfSystem/infSystem.cpp b/TheForceEngine/TFE_Jedi/InfSystem/infSystem.cpp index d4c5dc994..42af9b36a 100644 --- a/TheForceEngine/TFE_Jedi/InfSystem/infSystem.cpp +++ b/TheForceEngine/TFE_Jedi/InfSystem/infSystem.cpp @@ -2789,7 +2789,7 @@ namespace TFE_Jedi KeyItem key = elev->key; char keyBuffer[50]; char keyBufferWrapper[50]; - sprintf(keyBufferWrapper, "%s", TFE_System::getMessage(TFE_MSG_KEY)); + snprintf(keyBufferWrapper, 50, "%s", TFE_System::getMessage(TFE_MSG_KEY)); if (key == KEY_RED) {