diff --git a/src/cmddroid.cpp b/src/cmddroid.cpp index 4e7152fd57a..1a9e37b5523 100644 --- a/src/cmddroid.cpp +++ b/src/cmddroid.cpp @@ -36,6 +36,7 @@ #include "console.h" #include "objmem.h" #include "droid.h" +#include "hci.h" /**This represents the current selected player, which is the client's player.*/ extern UDWORD selectedPlayer; @@ -88,6 +89,8 @@ bool cmdDroidAddDroid(DROID *psCommander, DROID *psDroid) ASSERT_OR_RETURN(false, psCommander != nullptr, "psCommander is null?"); ASSERT_OR_RETURN(false, psDroid != nullptr, "psDroid is null?"); + auto initialDroidGroup = psDroid->group; + if (psCommander->psGroup == nullptr) { psGroup = grpCreate(); @@ -120,6 +123,11 @@ bool cmdDroidAddDroid(DROID *psCommander, DROID *psDroid) } } + if (initialDroidGroup != psDroid->group) + { + intGroupsChanged(); + } + return addedToGroup; } diff --git a/src/droid.cpp b/src/droid.cpp index db8c6a954d1..e672b5d0612 100644 --- a/src/droid.cpp +++ b/src/droid.cpp @@ -288,9 +288,16 @@ int32_t droidDamage(DROID *psDroid, unsigned damage, WEAPON_CLASS weaponClass, W relativeDamage = objDamage(psDroid, damage, psDroid->originalBody, weaponClass, weaponSubClass, isDamagePerSecond, minDamage, empRadiusHit); - if (relativeDamage != 0 && psDroid->player == selectedPlayer && psDroid->group != UBYTE_MAX && psDroid->timeLastHit == gameTime) + if (relativeDamage != 0 && psDroid->player == selectedPlayer && psDroid->timeLastHit == gameTime) { - intGroupDamaged(psDroid->group, (relativeDamage > 0) ? static_cast(relativeDamage) : 0, (relativeDamage < 0)); // update UI information + if (psDroid->group != UBYTE_MAX) + { + intGroupDamaged(psDroid->group, (relativeDamage > 0) ? static_cast(relativeDamage) : 0, (relativeDamage < 0)); // update UI information + } + else if (psDroid->psGroup && psDroid->psGroup->psCommander) + { + intCommanderGroupDamaged(psDroid->psGroup->psCommander, (relativeDamage > 0) ? static_cast(relativeDamage) : 0, (relativeDamage < 0)); // update UI information + } } if (relativeDamage > 0) diff --git a/src/group.cpp b/src/group.cpp index 9914e0a5769..46a0356874e 100644 --- a/src/group.cpp +++ b/src/group.cpp @@ -31,6 +31,7 @@ #include "group.h" #include "droid.h" #include "order.h" +#include "hci.h" #include // Group system variables: grpGlobalManager enables to remove all the groups to Shutdown the system @@ -150,6 +151,11 @@ void DROID_GROUP::add(DROID *psDroid) syncDebug("Droid %d joining command group %d", psDroid->id, psCommander != nullptr ? psCommander->id : 0); } } + + if (type == GT_COMMAND && psCommander) + { + intCommanderGroupChanged(psCommander); + } } // remove a droid from a group @@ -222,6 +228,11 @@ void DROID_GROUP::remove(DROID *psDroid) grpGlobalManager.erase(id); delete this; } + + if (type == GT_COMMAND && psCommander) + { + intCommanderGroupChanged(psCommander); + } } // count the members of a group diff --git a/src/hci.cpp b/src/hci.cpp index 9ea80c4bc23..8afa0bac89b 100644 --- a/src/hci.cpp +++ b/src/hci.cpp @@ -2044,6 +2044,19 @@ void intGroupDamaged(UBYTE group, uint64_t additionalDamage, bool unitKilled) } } +void intCommanderGroupChanged(const DROID *psCommander) +{ + intGroupsChanged(); // just trigger full group change event +} + +void intCommanderGroupDamaged(const DROID *psCommander, uint64_t additionalDamage, bool unitKilled) +{ + if (groupsUI) + { + groupsUI->addCommanderGroupDamageForCurrentTick(psCommander, additionalDamage, unitKilled); + } +} + bool intShowGroupSelectionMenu() { bool isSpectator = (bMultiPlayer && selectedPlayer < NetPlay.players.size() && NetPlay.players[selectedPlayer].isSpectator); diff --git a/src/hci.h b/src/hci.h index 33c460f0bf7..5b60d976a85 100644 --- a/src/hci.h +++ b/src/hci.h @@ -312,6 +312,10 @@ void intAlliedResearchChanged(); void intGroupsChanged(optional selectedGroup = nullopt); void intGroupDamaged(UBYTE group, uint64_t additionalDamage, bool unitKilled); +/* Tell the interface that commander groups have changed */ +void intCommanderGroupChanged(const DROID *psCommander); +void intCommanderGroupDamaged(const DROID *psCommander, uint64_t additionalDamage, bool unitKilled); + /* Sync the interface to an object */ void intObjectSelected(BASE_OBJECT *psObj); diff --git a/src/hci/groups.cpp b/src/hci/groups.cpp index a8f41ab3525..1a27ab68e6b 100644 --- a/src/hci/groups.cpp +++ b/src/hci/groups.cpp @@ -77,6 +77,15 @@ class GroupsUIController: public std::enable_shared_from_thisgroup >= groupInfo.size()) + { + return; + } + addGroupDamageForCurrentTick(psCommander->group, additionalDamage, unitKilled); + } + void selectGroup(size_t groupNumber) { // select the group @@ -315,6 +324,11 @@ void GroupsForum::addGroupDamageForCurrentTick(size_t group, uint64_t additional groupsUIController->addGroupDamageForCurrentTick(group, additionalDamage, unitKilled); } +void GroupsForum::addCommanderGroupDamageForCurrentTick(const DROID *psCommander, uint64_t additionalDamage, bool unitKilled) +{ + groupsUIController->addCommanderGroupDamageForCurrentTick(psCommander, additionalDamage, unitKilled); +} + void GroupsForum::addTabList() { attach(groupsList = IntListTabWidget::make(TabAlignment::RightAligned)); diff --git a/src/hci/groups.h b/src/hci/groups.h index 316a805c2fc..66b1eba1ec9 100644 --- a/src/hci/groups.h +++ b/src/hci/groups.h @@ -54,6 +54,7 @@ class GroupsForum: public IntFormAnimated void updateData(); void updateSelectedGroup(size_t group); void addGroupDamageForCurrentTick(size_t group, uint64_t additionalDamage, bool unitKilled); + void addCommanderGroupDamageForCurrentTick(const DROID *psCommander, uint64_t additionalDamage, bool unitKilled); private: std::shared_ptr makeGroupButton(size_t groupNumber); void addTabList();