Skip to content

Commit

Permalink
Refactor groups UI state handling, throttle updates to only when chan…
Browse files Browse the repository at this point in the history
…ges occur
  • Loading branch information
past-due committed Aug 29, 2023
1 parent 0e03ef0 commit 9956f9b
Show file tree
Hide file tree
Showing 6 changed files with 174 additions and 30 deletions.
31 changes: 31 additions & 0 deletions src/droid.cpp
Expand Up @@ -288,6 +288,11 @@ 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)
{
intGroupDamaged(psDroid->group, (relativeDamage > 0) ? static_cast<uint64_t>(relativeDamage) : 0, (relativeDamage < 0)); // update UI information
}

if (relativeDamage > 0)
{
// reset the attack level
Expand Down Expand Up @@ -563,6 +568,11 @@ bool removeDroidBase(DROID *psDel)
}
}

if (psDel->group != UBYTE_MAX)
{
intGroupsChanged();
}

if (psDel->player == selectedPlayer)
{
intRefreshScreen();
Expand Down Expand Up @@ -1821,6 +1831,7 @@ void assignDroidsToGroup(UDWORD playerNumber, UDWORD groupNumber, bool clearGrou
{
DROID *psDroid;
bool bAtLeastOne = false;
size_t numCleared = 0;
FLAG_POSITION *psFlagPos;

ASSERT_OR_RETURN(, playerNumber < MAX_PLAYERS, "Invalid player: %" PRIu32 "", playerNumber);
Expand All @@ -1834,6 +1845,7 @@ void assignDroidsToGroup(UDWORD playerNumber, UDWORD groupNumber, bool clearGrou
if (clearGroup && psDroid->group == groupNumber)
{
psDroid->group = UBYTE_MAX;
++numCleared;
}

/* Only assign the currently selected ones */
Expand All @@ -1857,6 +1869,10 @@ void assignDroidsToGroup(UDWORD playerNumber, UDWORD groupNumber, bool clearGrou
groupConsoleInformOfCreation(groupNumber);
secondarySetAverageGroupState(selectedPlayer, groupNumber);
}
if (bAtLeastOne || numCleared > 0)
{
intGroupsChanged();
}
}


Expand All @@ -1878,13 +1894,15 @@ void removeDroidsFromGroup(UDWORD playerNumber)
if (removedCount)
{
groupConsoleInformOfRemoval();
intGroupsChanged();
}
}

bool activateGroupAndMove(UDWORD playerNumber, UDWORD groupNumber)
{
DROID *psDroid, *psCentreDroid = nullptr;
bool selected = false;
size_t numDeselected = 0;
FLAG_POSITION *psFlagPos;

ASSERT_OR_RETURN(false, playerNumber < MAX_PLAYERS, "Invalid player: %" PRIu32 "", playerNumber);
Expand All @@ -1897,6 +1915,7 @@ bool activateGroupAndMove(UDWORD playerNumber, UDWORD groupNumber)
if (psDroid->selected && psDroid->group != groupNumber)
{
DeSelectDroid(psDroid);
++numDeselected;
}
/* Get the right ones */
if (psDroid->group == groupNumber)
Expand Down Expand Up @@ -1940,6 +1959,11 @@ bool activateGroupAndMove(UDWORD playerNumber, UDWORD groupNumber)
groupConsoleInformOfCentering(groupNumber);
}

if (selected || numDeselected > 0)
{
intGroupsChanged(true);
}

return selected;
}

Expand Down Expand Up @@ -1974,6 +1998,7 @@ bool activateNoGroup(UDWORD playerNumber, const SELECTIONTYPE selectionType, con
psFlagPos->selected = false;
}
}
intGroupsChanged(true);
CONPRINTF(ngettext("%u unit selected", "%u units selected", selectionCount), selectionCount);
return selected;
}
Expand All @@ -1982,6 +2007,7 @@ bool activateGroup(UDWORD playerNumber, UDWORD groupNumber)
{
DROID *psDroid;
bool selected = false;
size_t numDeselected = 0;
FLAG_POSITION *psFlagPos;

ASSERT_OR_RETURN(false, playerNumber < MAX_PLAYERS, "Invalid player: %" PRIu32 "", playerNumber);
Expand All @@ -1994,6 +2020,7 @@ bool activateGroup(UDWORD playerNumber, UDWORD groupNumber)
if (psDroid->selected && psDroid->group != groupNumber)
{
DeSelectDroid(psDroid);
++numDeselected;
}
/* Get the right ones */
if (psDroid->group == groupNumber)
Expand All @@ -2015,6 +2042,10 @@ bool activateGroup(UDWORD playerNumber, UDWORD groupNumber)
}
groupConsoleInformOfSelection(groupNumber);
}
if (selected || numDeselected > 0)
{
intGroupsChanged(true);
}
return selected;
}

Expand Down
32 changes: 31 additions & 1 deletion src/hci.cpp
Expand Up @@ -990,6 +990,7 @@ void interfaceShutDown()
}

static bool IntRefreshPending = false;
static bool IntGroupsRefreshPending = false;

// Set widget refresh pending flag.
//
Expand All @@ -1003,6 +1004,11 @@ bool intIsRefreshing()
return Refreshing;
}

void intRefreshGroupsUI()
{
IntGroupsRefreshPending = true;
}


// see if a delivery point is selected
static FLAG_POSITION *intFindSelectedDelivPoint()
Expand All @@ -1027,6 +1033,16 @@ static FLAG_POSITION *intFindSelectedDelivPoint()
//
void intDoScreenRefresh()
{
if (IntGroupsRefreshPending && getGroupButtonEnabled())
{
GroupsForum* groupsForum = (GroupsForum*)widgGetFromID(psWScreen, IDOBJ_GROUP);
if (groupsForum)
{
groupsForum->updateData();
}
IntGroupsRefreshPending = false;
}

if (!IntRefreshPending)
{
return;
Expand Down Expand Up @@ -2010,6 +2026,19 @@ void intAlliedResearchChanged()
}
}

void intGroupsChanged(bool selectionOnly)
{
if (getGroupButtonEnabled())
{
intRefreshGroupsUI();
}
}

void intGroupDamaged(UBYTE group, uint64_t additionalDamage, bool unitKilled)
{
// FUTURE TODO: Could update the groups UI with group damage lastTime, severity, etc
}

bool intShowGroupSelectionMenu()
{
if (getGroupButtonEnabled())
Expand All @@ -2020,7 +2049,8 @@ bool intShowGroupSelectionMenu()
auto newGroupsForum = GroupsForum::make();
psWScreen->psForm->attach(newGroupsForum);
}
} else
}
else
{
widgDelete(psWScreen, IDOBJ_GROUP);
}
Expand Down
4 changes: 4 additions & 0 deletions src/hci.h
Expand Up @@ -304,6 +304,10 @@ void intSetMapPos(UDWORD x, UDWORD y);
void intResearchFinished(STRUCTURE *psBuilding);
void intAlliedResearchChanged();

/* Tell the interface that groups have changed */
void intGroupsChanged(bool selectionOnly = false);
void intGroupDamaged(UBYTE group, uint64_t additionalDamage, bool unitKilled);

/* Sync the interface to an object */
void intObjectSelected(BASE_OBJECT *psObj);

Expand Down

0 comments on commit 9956f9b

Please sign in to comment.