From d8330877b97ca904b3bf6a3d964709984e7ad9cb Mon Sep 17 00:00:00 2001 From: Dan Crosby Date: Fri, 3 Jul 2026 16:19:47 -0700 Subject: [PATCH] Preserve custom battle starting morale --- src/main/cpp/net/eagle0/common/UnitConversions.cpp | 2 ++ .../eagle0/shardok/library/fb_helpers/GameStateHelpers.cpp | 7 ++++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/main/cpp/net/eagle0/common/UnitConversions.cpp b/src/main/cpp/net/eagle0/common/UnitConversions.cpp index 8fb039611a..184427327c 100644 --- a/src/main/cpp/net/eagle0/common/UnitConversions.cpp +++ b/src/main/cpp/net/eagle0/common/UnitConversions.cpp @@ -9,6 +9,7 @@ namespace shardok { using Coords = net::eagle0::shardok::storage::fb::Coords; constexpr double kDefaultMorale = 50.0; +constexpr float kExplicitMoraleSentinel = -1.0f; auto ConvertBattalion(const net::eagle0::common::CommonBattalion &battalion) -> Battalion { Battalion shardokBattalion{}; @@ -19,6 +20,7 @@ auto ConvertBattalion(const net::eagle0::common::CommonBattalion &battalion) -> static_cast(battalion.type())); shardokBattalion.mutate_morale( static_cast(battalion.has_morale() ? battalion.morale() : kDefaultMorale)); + if (battalion.has_morale()) { shardokBattalion.mutate_base_morale(kExplicitMoraleSentinel); } shardokBattalion.mutate_armament(static_cast(battalion.armament())); shardokBattalion.mutate_training(static_cast(battalion.training())); diff --git a/src/main/cpp/net/eagle0/shardok/library/fb_helpers/GameStateHelpers.cpp b/src/main/cpp/net/eagle0/shardok/library/fb_helpers/GameStateHelpers.cpp index 299209ef3f..3fa909b807 100644 --- a/src/main/cpp/net/eagle0/shardok/library/fb_helpers/GameStateHelpers.cpp +++ b/src/main/cpp/net/eagle0/shardok/library/fb_helpers/GameStateHelpers.cpp @@ -17,6 +17,8 @@ namespace shardok::fb { +constexpr float kExplicitMoraleSentinel = -1.0f; + using flatbuffers::FlatBufferBuilder; using flatbuffers::Offset; using net::eagle0::shardok::storage::fb::AlliedPlayer; @@ -200,8 +202,11 @@ auto SetupInitialGameState( RequiredMonthlyFood(modifiedUnit, settings) * foodPercentByPid[modifiedUnit.player_id()]); auto baseMorale = BaseMorale(modifiedUnit); + auto startingMorale = modifiedUnit.battalion().base_morale() == kExplicitMoraleSentinel + ? modifiedUnit.battalion().morale() + : baseMorale; modifiedUnit.mutable_battalion().mutate_base_morale(baseMorale); - modifiedUnit.mutable_battalion().mutate_morale(baseMorale); + modifiedUnit.mutable_battalion().mutate_morale(startingMorale); if (modifiedUnit.status() != net::eagle0::shardok::storage::fb::UnitStatus_PENDING_REINFORCEMENT) {