From ab58921974f378335e053ac8c2e42876685d1113 Mon Sep 17 00:00:00 2001 From: Coronia <2217891145@qq.com> Date: Thu, 23 Jul 2026 16:16:12 +0800 Subject: [PATCH 1/6] show game time --- CREDITS.md | 1 + docs/User-Interface.md | 13 ++++++++++ docs/Whats-New.md | 1 + src/Misc/Hooks.Timers.cpp | 50 +++++++++++++++++++++++++++++++++++++++ src/Phobos.INI.cpp | 4 ++++ src/Phobos.h | 2 ++ 6 files changed, 71 insertions(+) diff --git a/CREDITS.md b/CREDITS.md index a88c246cce..1292404afc 100644 --- a/CREDITS.md +++ b/CREDITS.md @@ -390,6 +390,7 @@ This page lists all the individual contributions to the project by their author. - Fix Ares' InitialPayload for teams spawned by trigger actions - Allow Reveal Crate to take effect when picking up by another player controlled house in campaign - Misc code refactor & maintenance, CN doc fixes, bugfixes + - Show game time - **FlyStar**: - Campaign load screen PCX support - New condition for automatic self-destruction logic when TechnoTypes exist/don't exist diff --git a/docs/User-Interface.md b/docs/User-Interface.md index 26fc2b8418..d14a4b461d 100644 --- a/docs/User-Interface.md +++ b/docs/User-Interface.md @@ -399,6 +399,19 @@ In `RA2MD.INI`: ShowDesignatorRange=false ; boolean ``` +### Show game time +- A timer can be displayed to show how many time has passed since game starts. + - The timer will be shown in the format of `TXT_GAMETIME hh:mm:ss`. For localization add `TXT_GAMETIME` into your `.csf` file. + - `ShowGameTime.BoardOpacity` can be used to set the opacitiy of background for game time display. + - Observer can't see this timer since they've already gotten one on the top of sidebar. + +In `RA2MD.INI`: +```ini +[Phobos] +ShowGameTime=false ; boolean +ShowGameTime.BoardOpacity=40 ; integer +``` + ### SuperWeapon ShowTimer sorting - You can now sort the timers of superweapons in ascending order from top to bottom according to a given priority value. diff --git a/docs/Whats-New.md b/docs/Whats-New.md index 105d3cc8ee..8dd4587c37 100644 --- a/docs/Whats-New.md +++ b/docs/Whats-New.md @@ -621,6 +621,7 @@ HideShakeEffects=false ; boolean - [New exception handler with a crash dialog, crash report and minidumps](Miscellanous.md#turning-offon-in-game-exception-handling) (by ZivDero, ported from Vinifera) - [Common Controls v6 visual styles for the game process](Miscellanous.md#visual-styles) (by ZivDero) - Global default value for `LeptonMindControlOffset` and `MindControlRingOffset` (by Noble_Fish) +- [Show game time](User-Interface.md#show-game-time) (by Trsdy) #### Vanilla fixes: - Fixed sidebar not updating queued unit numbers when adding or removing units when the production is on hold (by CrimRecya) diff --git a/src/Misc/Hooks.Timers.cpp b/src/Misc/Hooks.Timers.cpp index 68e5f9028d..aaf0c99998 100644 --- a/src/Misc/Hooks.Timers.cpp +++ b/src/Misc/Hooks.Timers.cpp @@ -109,3 +109,53 @@ DEFINE_HOOK(0x6D4CD9, PrintTimerOnTactical_BlinkColor, 0x6) return SkipGameCode; } + +#pragma region ShowGameTime + +static const wchar_t* GetUIName() +{ + return GeneralUtils::LoadStringUnlessMissing("TXT_GAMETIME", L"Time"); +} + +DEFINE_HOOK(0x4F4573, GScreenClass_Draw_GameTime, 0x5) +{ + if (!Phobos::Config::ShowGameTime || HouseClass::CurrentPlayer->IsObserver()) // already has a timer + return 0; + + wchar_t buffer[0x20] {}; + const int total_seconds = Unsorted::CurrentFrame / 15; + + const int hours = total_seconds / 3600; + const int minutes = (total_seconds / 60) % 60; + const int seconds = total_seconds % 60; + + if (hours > 0) + { + swprintf(buffer, std::size(buffer), L"%ls %d:%02d:%02d", GetUIName(), hours, minutes, seconds); + } + else + { + swprintf(buffer, std::size(buffer), L"%ls %02d:%02d", GetUIName(), minutes, seconds); + } + + auto wanted = Drawing::GetTextDimensions(buffer, { 0,0 }, 0, 2, 0); + + RectangleStruct rect = { + DSurface::Composite->GetWidth() - wanted.Width - 30, + 0, + wanted.Width + 10, + wanted.Height + 10 + }; + + Point2D location { rect.X + 5 ,5 }; + ColorStruct color { 0x0, 0x0 ,0x0 }; + DSurface::Composite->FillRectTrans(&rect, &color, Phobos::Config::ShowGameTime_BoardOpacity); + //DSurface::Composite->DrawRect(&rect, COLOR_WHITE); + DSurface::Composite->DrawText(buffer, &location, COLOR_WHITE); + + //Phobos' extended tooltips interferred + R->ECX(*(int*)0x887640); + return 0x4F4589; +} + +#pragma endregion diff --git a/src/Phobos.INI.cpp b/src/Phobos.INI.cpp index ac9f7649b2..f4f1b2e47b 100644 --- a/src/Phobos.INI.cpp +++ b/src/Phobos.INI.cpp @@ -80,6 +80,8 @@ bool Phobos::Config::HideShakeEffects = true; bool Phobos::Config::ShowFlashOnSelecting = false; bool Phobos::Config::UnitPowerDrain = false; int Phobos::Config::SuperWeaponSidebar_RequiredSignificance = 0; +bool Phobos::Config::ShowGameTime = false; +int Phobos::Config::ShowGameTime_BoardOpacity = 40; bool Phobos::Misc::CustomGS = false; int Phobos::Misc::CustomGS_ChangeInterval[7] = { -1, -1, -1, -1, -1, -1, -1 }; @@ -115,6 +117,8 @@ DEFINE_HOOK(0x5FACDF, OptionsClass_LoadSettings_LoadPhobosSettings, 0x5) Phobos::Config::HideShakeEffects = CCINIClass::INI_RA2MD.ReadBool(phobosSection, "HideShakeEffects", false); Phobos::Config::ShowFlashOnSelecting = CCINIClass::INI_RA2MD.ReadBool(phobosSection, "ShowFlashOnSelecting", false); Phobos::Config::SuperWeaponSidebar_RequiredSignificance = CCINIClass::INI_RA2MD.ReadInteger(phobosSection, "SuperWeaponSidebar.RequiredSignificance", 0); + Phobos::Config::ShowGameTime = CCINIClass::INI_RA2MD.ReadBool(phobosSection, "ShowGameTime", false); + Phobos::Config::ShowGameTime_BoardOpacity = CCINIClass::INI_RA2MD.ReadInteger(phobosSection, "ShowGameTime.BoardOpacity", 0); // Custom game speeds, 6 - i so that GS6 is index 0, just like in the engine Phobos::Config::CampaignDefaultGameSpeed = 6 - CCINIClass::INI_RA2MD.ReadInteger(phobosSection, "CampaignDefaultGameSpeed", 4); diff --git a/src/Phobos.h b/src/Phobos.h index 6bdb4073ec..1aa1ec1185 100644 --- a/src/Phobos.h +++ b/src/Phobos.h @@ -116,6 +116,8 @@ class Phobos static bool ShowFlashOnSelecting; static bool UnitPowerDrain; static int SuperWeaponSidebar_RequiredSignificance; + static bool ShowGameTime; + static int ShowGameTime_BoardOpacity; }; class Misc From 524e1eec3b7173d2c36d73e79c029d775e855997 Mon Sep 17 00:00:00 2001 From: Coronia <2217891145@qq.com> Date: Thu, 23 Jul 2026 20:18:56 +0800 Subject: [PATCH 2/6] add a note for now --- docs/User-Interface.md | 4 ++++ src/Misc/Hooks.Timers.cpp | 14 +++----------- 2 files changed, 7 insertions(+), 11 deletions(-) diff --git a/docs/User-Interface.md b/docs/User-Interface.md index d14a4b461d..63bc06ff6c 100644 --- a/docs/User-Interface.md +++ b/docs/User-Interface.md @@ -412,6 +412,10 @@ ShowGameTime=false ; boolean ShowGameTime.BoardOpacity=40 ; integer ``` +```{note} +This will replace the Phobos version text on top right of the screen for Debug or DevBuild, if enabled, since they take the same place. +``` + ### SuperWeapon ShowTimer sorting - You can now sort the timers of superweapons in ascending order from top to bottom according to a given priority value. diff --git a/src/Misc/Hooks.Timers.cpp b/src/Misc/Hooks.Timers.cpp index aaf0c99998..a9c044e411 100644 --- a/src/Misc/Hooks.Timers.cpp +++ b/src/Misc/Hooks.Timers.cpp @@ -110,13 +110,6 @@ DEFINE_HOOK(0x6D4CD9, PrintTimerOnTactical_BlinkColor, 0x6) return SkipGameCode; } -#pragma region ShowGameTime - -static const wchar_t* GetUIName() -{ - return GeneralUtils::LoadStringUnlessMissing("TXT_GAMETIME", L"Time"); -} - DEFINE_HOOK(0x4F4573, GScreenClass_Draw_GameTime, 0x5) { if (!Phobos::Config::ShowGameTime || HouseClass::CurrentPlayer->IsObserver()) // already has a timer @@ -128,14 +121,15 @@ DEFINE_HOOK(0x4F4573, GScreenClass_Draw_GameTime, 0x5) const int hours = total_seconds / 3600; const int minutes = (total_seconds / 60) % 60; const int seconds = total_seconds % 60; + const auto text = GeneralUtils::LoadStringUnlessMissing("TXT_GAMETIME", L"Time"); if (hours > 0) { - swprintf(buffer, std::size(buffer), L"%ls %d:%02d:%02d", GetUIName(), hours, minutes, seconds); + swprintf(buffer, std::size(buffer), L"%ls %d:%02d:%02d", text, hours, minutes, seconds); } else { - swprintf(buffer, std::size(buffer), L"%ls %02d:%02d", GetUIName(), minutes, seconds); + swprintf(buffer, std::size(buffer), L"%ls %02d:%02d", text, minutes, seconds); } auto wanted = Drawing::GetTextDimensions(buffer, { 0,0 }, 0, 2, 0); @@ -157,5 +151,3 @@ DEFINE_HOOK(0x4F4573, GScreenClass_Draw_GameTime, 0x5) R->ECX(*(int*)0x887640); return 0x4F4589; } - -#pragma endregion From 6713ea90fa2f65d36f2c59f89247ccb1e29586fd Mon Sep 17 00:00:00 2001 From: Coronia <2217891145@qq.com> Date: Fri, 24 Jul 2026 00:50:14 +0800 Subject: [PATCH 3/6] make message stack on top right --- docs/User-Interface.md | 6 +---- src/Misc/Hooks.Timers.cpp | 42 -------------------------------- src/Phobos.cpp | 51 +++++++++++++++++++++++++++++++++++---- 3 files changed, 47 insertions(+), 52 deletions(-) diff --git a/docs/User-Interface.md b/docs/User-Interface.md index 63bc06ff6c..61fc65e561 100644 --- a/docs/User-Interface.md +++ b/docs/User-Interface.md @@ -400,7 +400,7 @@ ShowDesignatorRange=false ; boolean ``` ### Show game time -- A timer can be displayed to show how many time has passed since game starts. +- A timer can be displayed to show how many time has passed since game starts. This will show the ingame time instead of real time. - The timer will be shown in the format of `TXT_GAMETIME hh:mm:ss`. For localization add `TXT_GAMETIME` into your `.csf` file. - `ShowGameTime.BoardOpacity` can be used to set the opacitiy of background for game time display. - Observer can't see this timer since they've already gotten one on the top of sidebar. @@ -412,10 +412,6 @@ ShowGameTime=false ; boolean ShowGameTime.BoardOpacity=40 ; integer ``` -```{note} -This will replace the Phobos version text on top right of the screen for Debug or DevBuild, if enabled, since they take the same place. -``` - ### SuperWeapon ShowTimer sorting - You can now sort the timers of superweapons in ascending order from top to bottom according to a given priority value. diff --git a/src/Misc/Hooks.Timers.cpp b/src/Misc/Hooks.Timers.cpp index a9c044e411..68e5f9028d 100644 --- a/src/Misc/Hooks.Timers.cpp +++ b/src/Misc/Hooks.Timers.cpp @@ -109,45 +109,3 @@ DEFINE_HOOK(0x6D4CD9, PrintTimerOnTactical_BlinkColor, 0x6) return SkipGameCode; } - -DEFINE_HOOK(0x4F4573, GScreenClass_Draw_GameTime, 0x5) -{ - if (!Phobos::Config::ShowGameTime || HouseClass::CurrentPlayer->IsObserver()) // already has a timer - return 0; - - wchar_t buffer[0x20] {}; - const int total_seconds = Unsorted::CurrentFrame / 15; - - const int hours = total_seconds / 3600; - const int minutes = (total_seconds / 60) % 60; - const int seconds = total_seconds % 60; - const auto text = GeneralUtils::LoadStringUnlessMissing("TXT_GAMETIME", L"Time"); - - if (hours > 0) - { - swprintf(buffer, std::size(buffer), L"%ls %d:%02d:%02d", text, hours, minutes, seconds); - } - else - { - swprintf(buffer, std::size(buffer), L"%ls %02d:%02d", text, minutes, seconds); - } - - auto wanted = Drawing::GetTextDimensions(buffer, { 0,0 }, 0, 2, 0); - - RectangleStruct rect = { - DSurface::Composite->GetWidth() - wanted.Width - 30, - 0, - wanted.Width + 10, - wanted.Height + 10 - }; - - Point2D location { rect.X + 5 ,5 }; - ColorStruct color { 0x0, 0x0 ,0x0 }; - DSurface::Composite->FillRectTrans(&rect, &color, Phobos::Config::ShowGameTime_BoardOpacity); - //DSurface::Composite->DrawRect(&rect, COLOR_WHITE); - DSurface::Composite->DrawText(buffer, &location, COLOR_WHITE); - - //Phobos' extended tooltips interferred - R->ECX(*(int*)0x887640); - return 0x4F4589; -} diff --git a/src/Phobos.cpp b/src/Phobos.cpp index e5943a2c88..2c745a8353 100644 --- a/src/Phobos.cpp +++ b/src/Phobos.cpp @@ -1,6 +1,7 @@ #include "Phobos.h" #include +#include #include #include @@ -12,6 +13,7 @@ #include #include #include "Utilities/AresHelper.h" +#include "Utilities/GeneralUtils.h" #include "Utilities/Parser.h" #ifndef IS_RELEASE_VER @@ -301,14 +303,16 @@ DEFINE_HOOK(0x683E7F, ScenarioClass_Start_Optimizations, 0x7) return 0; } -#ifndef IS_RELEASE_VER DEFINE_HOOK(0x4F4583, GScreenClass_DrawText, 0x6) { + int coordY = 0; + +#ifndef IS_RELEASE_VER #ifndef STR_GIT_COMMIT if (!HideWarning) #endif // !STR_GIT_COMMIT { - auto wanted = Drawing::GetTextDimensions(Phobos::VersionDescription, { 0,0 }, 0, 2, 0); + auto wanted = Drawing::GetTextDimensions(Phobos::VersionDescription, { 0, 0 }, 0, 2, 0); RectangleStruct rect = { DSurface::Composite->GetWidth() - wanted.Width - 10, @@ -317,14 +321,51 @@ DEFINE_HOOK(0x4F4583, GScreenClass_DrawText, 0x6) wanted.Height + 10 }; - Point2D location { rect.X + 5,5 }; - + Point2D location { rect.X + 5, 5 }; DSurface::Composite->FillRect(&rect, COLOR_BLACK); DSurface::Composite->DrawText(Phobos::VersionDescription, &location, COLOR_RED); + + // add margin for next text + coordY = rect.Height; } +#endif // !IS_RELEASE_VER + + if (!Phobos::Config::ShowGameTime || HouseClass::CurrentPlayer->IsObserver()) // already has a timer + return 0; + + wchar_t buffer[0x20] {}; + const int total_seconds = Unsorted::CurrentFrame / 15; + + const int hours = total_seconds / 3600; + const int minutes = (total_seconds / 60) % 60; + const int seconds = total_seconds % 60; + const auto text = GeneralUtils::LoadStringUnlessMissing("TXT_GAMETIME", L"Time:"); + + if (hours > 0) + { + swprintf(buffer, std::size(buffer), L"%ls %d:%02d:%02d", text, hours, minutes, seconds); + } + else + { + swprintf(buffer, std::size(buffer), L"%ls %02d:%02d", text, minutes, seconds); + } + + auto wantedB = Drawing::GetTextDimensions(buffer, { 0, 0 }, 0, 2, 0); + + RectangleStruct rectB = { + DSurface::Composite->GetWidth() - wantedB.Width - 10, + coordY, + wantedB.Width + 10, + wantedB.Height + 10 + }; + + Point2D locationB { rectB.X + 5, rectB.Y + 5 }; + ColorStruct color { 0x0, 0x0 ,0x0 }; + DSurface::Composite->FillRectTrans(&rectB, &color, Phobos::Config::ShowGameTime_BoardOpacity); + DSurface::Composite->DrawText(buffer, &locationB, COLOR_WHITE); + return 0; } -#endif // Mainly used to disable hooks for optimization. // Called after loading saved game and at end of scenario start after all INI data etc has been initialized. From 84a368e61e6b90163f9d9ee99027430678896b08 Mon Sep 17 00:00:00 2001 From: Coronia <2217891145@qq.com> Date: Sat, 25 Jul 2026 14:58:45 +0800 Subject: [PATCH 4/6] use real time timer & fix --- docs/User-Interface.md | 2 +- src/Phobos.INI.cpp | 2 +- src/Phobos.cpp | 17 +++++++++++------ 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/docs/User-Interface.md b/docs/User-Interface.md index 61fc65e561..d14a4b461d 100644 --- a/docs/User-Interface.md +++ b/docs/User-Interface.md @@ -400,7 +400,7 @@ ShowDesignatorRange=false ; boolean ``` ### Show game time -- A timer can be displayed to show how many time has passed since game starts. This will show the ingame time instead of real time. +- A timer can be displayed to show how many time has passed since game starts. - The timer will be shown in the format of `TXT_GAMETIME hh:mm:ss`. For localization add `TXT_GAMETIME` into your `.csf` file. - `ShowGameTime.BoardOpacity` can be used to set the opacitiy of background for game time display. - Observer can't see this timer since they've already gotten one on the top of sidebar. diff --git a/src/Phobos.INI.cpp b/src/Phobos.INI.cpp index f4f1b2e47b..245a097931 100644 --- a/src/Phobos.INI.cpp +++ b/src/Phobos.INI.cpp @@ -118,7 +118,7 @@ DEFINE_HOOK(0x5FACDF, OptionsClass_LoadSettings_LoadPhobosSettings, 0x5) Phobos::Config::ShowFlashOnSelecting = CCINIClass::INI_RA2MD.ReadBool(phobosSection, "ShowFlashOnSelecting", false); Phobos::Config::SuperWeaponSidebar_RequiredSignificance = CCINIClass::INI_RA2MD.ReadInteger(phobosSection, "SuperWeaponSidebar.RequiredSignificance", 0); Phobos::Config::ShowGameTime = CCINIClass::INI_RA2MD.ReadBool(phobosSection, "ShowGameTime", false); - Phobos::Config::ShowGameTime_BoardOpacity = CCINIClass::INI_RA2MD.ReadInteger(phobosSection, "ShowGameTime.BoardOpacity", 0); + Phobos::Config::ShowGameTime_BoardOpacity = CCINIClass::INI_RA2MD.ReadInteger(phobosSection, "ShowGameTime.BoardOpacity", 40); // Custom game speeds, 6 - i so that GS6 is index 0, just like in the engine Phobos::Config::CampaignDefaultGameSpeed = 6 - CCINIClass::INI_RA2MD.ReadInteger(phobosSection, "CampaignDefaultGameSpeed", 4); diff --git a/src/Phobos.cpp b/src/Phobos.cpp index 2c745a8353..56e65bd90d 100644 --- a/src/Phobos.cpp +++ b/src/Phobos.cpp @@ -315,7 +315,7 @@ DEFINE_HOOK(0x4F4583, GScreenClass_DrawText, 0x6) auto wanted = Drawing::GetTextDimensions(Phobos::VersionDescription, { 0, 0 }, 0, 2, 0); RectangleStruct rect = { - DSurface::Composite->GetWidth() - wanted.Width - 10, + DSurface::Composite->GetWidth() - wanted.Width - 30, 0, wanted.Width + 10, wanted.Height + 10 @@ -334,11 +334,16 @@ DEFINE_HOOK(0x4F4583, GScreenClass_DrawText, 0x6) return 0; wchar_t buffer[0x20] {}; - const int total_seconds = Unsorted::CurrentFrame / 15; + const auto& timer = ScenarioClass::Instance->ElapsedTimer; + int currentTime = timer.TimeLeft; - const int hours = total_seconds / 3600; - const int minutes = (total_seconds / 60) % 60; - const int seconds = total_seconds % 60; + if (timer.StartTime != -1) + currentTime += SystemTimer::GetTime() - timer.StartTime; + + currentTime /= 60; + const int hours = currentTime / 3600; + const int minutes = (currentTime / 60) % 60; + const int seconds = currentTime % 60; const auto text = GeneralUtils::LoadStringUnlessMissing("TXT_GAMETIME", L"Time:"); if (hours > 0) @@ -353,7 +358,7 @@ DEFINE_HOOK(0x4F4583, GScreenClass_DrawText, 0x6) auto wantedB = Drawing::GetTextDimensions(buffer, { 0, 0 }, 0, 2, 0); RectangleStruct rectB = { - DSurface::Composite->GetWidth() - wantedB.Width - 10, + DSurface::Composite->GetWidth() - wantedB.Width - 30, coordY, wantedB.Width + 10, wantedB.Height + 10 From 0dfd56d571f51633d7acb5de5fc50a8b619cbc34 Mon Sep 17 00:00:00 2001 From: Coronia <2217891145@qq.com> Date: Sat, 25 Jul 2026 15:45:13 +0800 Subject: [PATCH 5/6] accomodate Message.DisplayInCenter --- src/Phobos.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/Phobos.cpp b/src/Phobos.cpp index 56e65bd90d..5ce137def6 100644 --- a/src/Phobos.cpp +++ b/src/Phobos.cpp @@ -305,6 +305,7 @@ DEFINE_HOOK(0x683E7F, ScenarioClass_Start_Optimizations, 0x7) DEFINE_HOOK(0x4F4583, GScreenClass_DrawText, 0x6) { + const int marginX = Phobos::Config::MessageDisplayInCenter ? 28 : 10; int coordY = 0; #ifndef IS_RELEASE_VER @@ -315,7 +316,7 @@ DEFINE_HOOK(0x4F4583, GScreenClass_DrawText, 0x6) auto wanted = Drawing::GetTextDimensions(Phobos::VersionDescription, { 0, 0 }, 0, 2, 0); RectangleStruct rect = { - DSurface::Composite->GetWidth() - wanted.Width - 30, + DSurface::Composite->GetWidth() - wanted.Width - marginX, 0, wanted.Width + 10, wanted.Height + 10 @@ -358,7 +359,7 @@ DEFINE_HOOK(0x4F4583, GScreenClass_DrawText, 0x6) auto wantedB = Drawing::GetTextDimensions(buffer, { 0, 0 }, 0, 2, 0); RectangleStruct rectB = { - DSurface::Composite->GetWidth() - wantedB.Width - 30, + DSurface::Composite->GetWidth() - wantedB.Width - marginX, coordY, wantedB.Width + 10, wantedB.Height + 10 From ef8cf8616cbc6de8d249b06e2b45d1c4956dee59 Mon Sep 17 00:00:00 2001 From: Coronia <2217891145@qq.com> Date: Sat, 25 Jul 2026 15:47:12 +0800 Subject: [PATCH 6/6] doc --- CREDITS.md | 1 + docs/Whats-New.md | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CREDITS.md b/CREDITS.md index 1292404afc..e6505c1079 100644 --- a/CREDITS.md +++ b/CREDITS.md @@ -737,6 +737,7 @@ This page lists all the individual contributions to the project by their author. - Allow `AuxBuilding` and Ares' `SW.Aux/NegBuildings` to count building upgrades - Dynamic team delays - Customize whether or not passenger can fire out when the transport is moving + - Show game time - **NaotoYuuki** - Vertical & meteor trajectory projectile prototypes - **handama**: - AI script action to `16005 Jump Back To Previous Script` diff --git a/docs/Whats-New.md b/docs/Whats-New.md index 8dd4587c37..beb18f53c7 100644 --- a/docs/Whats-New.md +++ b/docs/Whats-New.md @@ -621,7 +621,7 @@ HideShakeEffects=false ; boolean - [New exception handler with a crash dialog, crash report and minidumps](Miscellanous.md#turning-offon-in-game-exception-handling) (by ZivDero, ported from Vinifera) - [Common Controls v6 visual styles for the game process](Miscellanous.md#visual-styles) (by ZivDero) - Global default value for `LeptonMindControlOffset` and `MindControlRingOffset` (by Noble_Fish) -- [Show game time](User-Interface.md#show-game-time) (by Trsdy) +- [Show game time](User-Interface.md#show-game-time) (by Trsdy & Ollerus) #### Vanilla fixes: - Fixed sidebar not updating queued unit numbers when adding or removing units when the production is on hold (by CrimRecya)