Added a std::list<DROID_GROUP *> grpGlobalManager; to replace the 'firstgroup' to avoid every DROID_GROUP object having previous and next DROID_GROUP object to erase all at end shutdown.
DROID_GROUP became class. grpJoin function was made a method of DROID_GROUP, DROID_GROUP::Add(DROID*psDroid) and every instance of grpJoin(DROID_GROUP*, DROID*) was replaced by DROID_GROUP*->Add(DROID). Code was tested both compile and run, and everything is working as supposed, including Initialization and ShutDown of a game.master
parent
9a0933f823
commit
75e8001219
|
@ -89,13 +89,13 @@ void cmdDroidAddDroid(DROID *psCommander, DROID *psDroid)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
grpJoin(psGroup, psCommander);
|
psGroup->Add(psCommander);
|
||||||
psDroid->group = UBYTE_MAX;
|
psDroid->group = UBYTE_MAX;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (grpNumMembers(psCommander->psGroup) < cmdDroidMaxGroup(psCommander))
|
if (grpNumMembers(psCommander->psGroup) < cmdDroidMaxGroup(psCommander))
|
||||||
{
|
{
|
||||||
grpJoin(psCommander->psGroup, psDroid);
|
psCommander->psGroup->Add(psDroid);
|
||||||
psDroid->group = UBYTE_MAX;
|
psDroid->group = UBYTE_MAX;
|
||||||
|
|
||||||
// set the secondary states for the unit
|
// set the secondary states for the unit
|
||||||
|
|
|
@ -2229,7 +2229,7 @@ DROID *reallyBuildDroid(DROID_TEMPLATE *pTemplate, UDWORD x, UDWORD y, UDWORD pl
|
||||||
delete psDroid;
|
delete psDroid;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
grpJoin(psGrp, psDroid);
|
psGrp->Add(psDroid);
|
||||||
}
|
}
|
||||||
|
|
||||||
psDroid->lastFrustratedTime = -UINT16_MAX; // make sure we do not start the game frustrated
|
psDroid->lastFrustratedTime = -UINT16_MAX; // make sure we do not start the game frustrated
|
||||||
|
|
|
@ -5660,7 +5660,7 @@ BOOL loadSaveDroidV(char *pFileData, UDWORD filesize, UDWORD numDroids, UDWORD v
|
||||||
psDroid->psGroup = NULL;
|
psDroid->psGroup = NULL;
|
||||||
psDroid->psGrpNext = NULL;
|
psDroid->psGrpNext = NULL;
|
||||||
ASSERT( psCurrentTransGroup != NULL,"loadSaveUnitV9; Transporter unit without group " );
|
ASSERT( psCurrentTransGroup != NULL,"loadSaveUnitV9; Transporter unit without group " );
|
||||||
grpJoin(psCurrentTransGroup, psDroid);
|
psCurrentTransGroup->Add(psDroid);
|
||||||
}
|
}
|
||||||
else if (psDroid->droidType == DROID_TRANSPORTER)
|
else if (psDroid->droidType == DROID_TRANSPORTER)
|
||||||
{
|
{
|
||||||
|
|
113
src/group.cpp
113
src/group.cpp
|
@ -28,14 +28,15 @@
|
||||||
#include "lib/netplay/netplay.h"
|
#include "lib/netplay/netplay.h"
|
||||||
|
|
||||||
#include "multiplay.h"
|
#include "multiplay.h"
|
||||||
|
#include <list>
|
||||||
|
|
||||||
static DROID_GROUP *firstGroup = NULL;
|
static std::list<DROID_GROUP *> grpGlobalManager;
|
||||||
static BOOL grpInitialized = false;
|
static bool grpInitialized = false;
|
||||||
|
|
||||||
// initialise the group system
|
// initialise the group system
|
||||||
BOOL grpInitialise(void)
|
bool grpInitialise(void)
|
||||||
{
|
{
|
||||||
firstGroup = NULL;
|
grpGlobalManager.clear();
|
||||||
grpInitialized = true;
|
grpInitialized = true;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -45,20 +46,27 @@ void grpShutDown(void)
|
||||||
{
|
{
|
||||||
/* Since we are not very diligent removing groups after we have
|
/* Since we are not very diligent removing groups after we have
|
||||||
* created them; we need this hack to remove them on level end. */
|
* created them; we need this hack to remove them on level end. */
|
||||||
DROID_GROUP *iter = firstGroup, *psDel;
|
std::list<DROID_GROUP *>::iterator iter;
|
||||||
|
|
||||||
while (iter != NULL)
|
for(iter = grpGlobalManager.begin(); iter != grpGlobalManager.end(); iter++)
|
||||||
{
|
{
|
||||||
psDel = iter;
|
free(*iter);
|
||||||
iter = iter->psNext;
|
|
||||||
free(psDel);
|
|
||||||
}
|
}
|
||||||
firstGroup = NULL;
|
grpGlobalManager.clear();
|
||||||
grpInitialized = false;
|
grpInitialized = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Initialize new group
|
||||||
|
void DROID_GROUP::Init()
|
||||||
|
{
|
||||||
|
type = GT_NORMAL;
|
||||||
|
refCount = 0;
|
||||||
|
psList = NULL;
|
||||||
|
psCommander = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
// create a new group
|
// create a new group
|
||||||
BOOL grpCreate(DROID_GROUP **ppsGroup)
|
bool grpCreate(DROID_GROUP **ppsGroup)
|
||||||
{
|
{
|
||||||
ASSERT(grpInitialized, "Group code not initialized yet");
|
ASSERT(grpInitialized, "Group code not initialized yet");
|
||||||
*ppsGroup = (DROID_GROUP *)calloc(1, sizeof(DROID_GROUP));
|
*ppsGroup = (DROID_GROUP *)calloc(1, sizeof(DROID_GROUP));
|
||||||
|
@ -68,79 +76,59 @@ BOOL grpCreate(DROID_GROUP **ppsGroup)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add node to beginning of list
|
grpGlobalManager.push_back(*ppsGroup);
|
||||||
if (firstGroup != NULL)
|
(*ppsGroup)->Init();
|
||||||
{
|
|
||||||
(*ppsGroup)->psNext = firstGroup;
|
|
||||||
(*ppsGroup)->psPrev = NULL;
|
|
||||||
firstGroup->psPrev = *ppsGroup;
|
|
||||||
firstGroup = *ppsGroup;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
firstGroup = *ppsGroup;
|
|
||||||
(*ppsGroup)->psPrev = NULL;
|
|
||||||
(*ppsGroup)->psNext = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
(*ppsGroup)->type = GT_NORMAL;
|
|
||||||
(*ppsGroup)->refCount = 0;
|
|
||||||
(*ppsGroup)->psList = NULL;
|
|
||||||
(*ppsGroup)->psCommander = NULL;
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// add a droid to a group
|
// add a droid to a group
|
||||||
void grpJoin(DROID_GROUP *psGroup, DROID *psDroid)
|
void DROID_GROUP::Add(DROID *psDroid)
|
||||||
{
|
{
|
||||||
ASSERT(grpInitialized, "Group code not initialized yet");
|
ASSERT(grpInitialized, "Group code not initialized yet");
|
||||||
|
|
||||||
ASSERT_OR_RETURN(, psGroup != NULL,
|
refCount += 1;
|
||||||
"grpJoin: invalid group pointer" );
|
|
||||||
|
|
||||||
psGroup->refCount += 1;
|
|
||||||
// if psDroid == NULL just increase the refcount don't add anything to the list
|
// if psDroid == NULL just increase the refcount don't add anything to the list
|
||||||
if (psDroid != NULL)
|
if (psDroid != NULL)
|
||||||
{
|
{
|
||||||
if (psGroup->psList && psDroid->player != psGroup->psList->player)
|
if (psList && psDroid->player != psList->player)
|
||||||
{
|
{
|
||||||
ASSERT( false,"grpJoin: Cannot have more than one players droids in a group" );
|
ASSERT( false,"grpJoin: Cannot have more than one players droids in a group" );
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (psDroid->psGroup != NULL)
|
if (psDroid->psGroup != NULL)
|
||||||
{
|
{
|
||||||
grpLeave(psDroid->psGroup, psDroid);
|
grpLeave(psDroid->psGroup, psDroid);
|
||||||
}
|
}
|
||||||
|
|
||||||
psDroid->psGroup = psGroup;
|
psDroid->psGroup = this;
|
||||||
|
|
||||||
if (psDroid->droidType == DROID_TRANSPORTER)
|
if (psDroid->droidType == DROID_TRANSPORTER)
|
||||||
{
|
{
|
||||||
ASSERT_OR_RETURN(, (psGroup->type == GT_NORMAL),
|
ASSERT_OR_RETURN(, (type == GT_NORMAL),
|
||||||
"grpJoin: Cannot have two transporters in a group" );
|
"grpJoin: Cannot have two transporters in a group" );
|
||||||
psGroup->type = GT_TRANSPORTER;
|
type = GT_TRANSPORTER;
|
||||||
psDroid->psGrpNext = psGroup->psList;
|
psDroid->psGrpNext = psList;
|
||||||
psGroup->psList = psDroid;
|
psList = psDroid;
|
||||||
}
|
}
|
||||||
else if ((psDroid->droidType == DROID_COMMAND) &&
|
else if ((psDroid->droidType == DROID_COMMAND) &&
|
||||||
(psGroup->type != GT_TRANSPORTER))
|
(type != GT_TRANSPORTER))
|
||||||
{
|
{
|
||||||
ASSERT_OR_RETURN(, (psGroup->type == GT_NORMAL) && (psGroup->psCommander == NULL),
|
ASSERT_OR_RETURN(, (type == GT_NORMAL) && (psCommander == NULL),
|
||||||
"grpJoin: Cannot have two command droids in a group" );
|
"grpJoin: Cannot have two command droids in a group" );
|
||||||
psGroup->type = GT_COMMAND;
|
type = GT_COMMAND;
|
||||||
psGroup->psCommander = psDroid;
|
psCommander = psDroid;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
psDroid->psGrpNext = psGroup->psList;
|
psDroid->psGrpNext = psList;
|
||||||
psGroup->psList = psDroid;
|
psList = psDroid;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (psGroup->type == GT_COMMAND)
|
if (type == GT_COMMAND)
|
||||||
{
|
{
|
||||||
syncDebug("Droid %d joining command group %d", psDroid->id, psGroup->psCommander != NULL? psGroup->psCommander->id : 0);
|
syncDebug("Droid %d joining command group %d", psDroid->id, psCommander != NULL? psCommander->id : 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -215,18 +203,7 @@ void grpLeave(DROID_GROUP *psGroup, DROID *psDroid)
|
||||||
// free the group structure if necessary
|
// free the group structure if necessary
|
||||||
if (psGroup->refCount <= 0)
|
if (psGroup->refCount <= 0)
|
||||||
{
|
{
|
||||||
if (firstGroup == psGroup)
|
grpGlobalManager.remove(psGroup);
|
||||||
{
|
|
||||||
firstGroup = psGroup->psNext;
|
|
||||||
}
|
|
||||||
if (psGroup->psNext)
|
|
||||||
{
|
|
||||||
psGroup->psNext->psPrev = psGroup->psPrev;
|
|
||||||
}
|
|
||||||
if (psGroup->psPrev)
|
|
||||||
{
|
|
||||||
psGroup->psPrev->psNext = psGroup->psNext;
|
|
||||||
}
|
|
||||||
free(psGroup);
|
free(psGroup);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
13
src/group.h
13
src/group.h
|
@ -33,8 +33,12 @@ enum GROUP_TYPE
|
||||||
GT_TRANSPORTER, // transporter group
|
GT_TRANSPORTER, // transporter group
|
||||||
};
|
};
|
||||||
|
|
||||||
struct DROID_GROUP
|
class DROID_GROUP
|
||||||
{
|
{
|
||||||
|
public:
|
||||||
|
void Init();
|
||||||
|
void Add(DROID *psDroid);
|
||||||
|
void Remove();
|
||||||
SWORD type;
|
SWORD type;
|
||||||
SWORD refCount;
|
SWORD refCount;
|
||||||
DROID *psList; // list of droids in the group
|
DROID *psList; // list of droids in the group
|
||||||
|
@ -44,16 +48,13 @@ struct DROID_GROUP
|
||||||
};
|
};
|
||||||
|
|
||||||
// initialise the group system
|
// initialise the group system
|
||||||
BOOL grpInitialise(void);
|
bool grpInitialise(void);
|
||||||
|
|
||||||
// shutdown the group system
|
// shutdown the group system
|
||||||
void grpShutDown(void);
|
void grpShutDown(void);
|
||||||
|
|
||||||
// create a new group
|
// create a new group
|
||||||
BOOL grpCreate(DROID_GROUP **ppsGroup);
|
bool grpCreate(DROID_GROUP **ppsGroup);
|
||||||
|
|
||||||
// add a droid to a group
|
|
||||||
void grpJoin(DROID_GROUP *psGroup, DROID *psDroid);
|
|
||||||
|
|
||||||
// remove a droid from a group
|
// remove a droid from a group
|
||||||
void grpLeave(DROID_GROUP *psGroup, DROID *psDroid);
|
void grpLeave(DROID_GROUP *psGroup, DROID *psDroid);
|
||||||
|
|
|
@ -1131,7 +1131,7 @@ void saveCampaignData(void)
|
||||||
{
|
{
|
||||||
if (droidRemove(psSafeDroid, mission.apsDroidLists))
|
if (droidRemove(psSafeDroid, mission.apsDroidLists))
|
||||||
{
|
{
|
||||||
grpJoin(psDroid->psGroup, psSafeDroid);
|
psDroid->psGroup->Add(psSafeDroid);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -1880,7 +1880,7 @@ void unloadTransporter(DROID *psTransporter, UDWORD x, UDWORD y, BOOL goingHome)
|
||||||
{
|
{
|
||||||
if (grpCreate(&psGroup))
|
if (grpCreate(&psGroup))
|
||||||
{
|
{
|
||||||
grpJoin(psGroup, psDroid);
|
psGroup->Add(psDroid);
|
||||||
}
|
}
|
||||||
clearCommandDroidFactory(psDroid);
|
clearCommandDroidFactory(psDroid);
|
||||||
}
|
}
|
||||||
|
|
|
@ -250,7 +250,7 @@ BOOL recvDroidEmbark(NETQUEUE queue)
|
||||||
if (bDroidRemoved)
|
if (bDroidRemoved)
|
||||||
{
|
{
|
||||||
// and now we need to add it to their transporter group!
|
// and now we need to add it to their transporter group!
|
||||||
grpJoin(psTransporterDroid->psGroup, psDroid);
|
psTransporterDroid->psGroup->Add(psDroid);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -395,7 +395,7 @@ void addDroid(DROID *psDroidToAdd, DROID *pList[MAX_PLAYERS])
|
||||||
grpCreate(&psGroup);
|
grpCreate(&psGroup);
|
||||||
if (psGroup)
|
if (psGroup)
|
||||||
{
|
{
|
||||||
grpJoin(psGroup, psDroidToAdd);
|
psGroup->Add(psDroidToAdd);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -80,7 +80,7 @@ BOOL scrGroupAddDroid(void)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
grpJoin(psGroup, psDroid);
|
psGroup->Add(psDroid);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -118,7 +118,7 @@ BOOL scrGroupAddArea(void)
|
||||||
psDroid->droidType != DROID_TRANSPORTER )
|
psDroid->droidType != DROID_TRANSPORTER )
|
||||||
|
|
||||||
{
|
{
|
||||||
grpJoin(psGroup, psDroid);
|
psGroup->Add(psDroid);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -156,7 +156,7 @@ BOOL scrGroupAddAreaNoGroup(void)
|
||||||
psDroid->droidType != DROID_TRANSPORTER &&
|
psDroid->droidType != DROID_TRANSPORTER &&
|
||||||
psDroid->psGroup == NULL)
|
psDroid->psGroup == NULL)
|
||||||
{
|
{
|
||||||
grpJoin(psGroup, psDroid);
|
psGroup->Add(psDroid);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -183,7 +183,7 @@ BOOL scrGroupAddGroup(void)
|
||||||
for(psDroid=psFrom->psList; psDroid; psDroid=psNext)
|
for(psDroid=psFrom->psList; psDroid; psDroid=psNext)
|
||||||
{
|
{
|
||||||
psNext = psDroid->psGrpNext;
|
psNext = psDroid->psGrpNext;
|
||||||
grpJoin(psTo, psDroid);
|
psTo->Add(psDroid);
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -646,8 +646,7 @@ BOOL scrCBTransporterLanded( void )
|
||||||
psNext = psDroid->psGrpNext;
|
psNext = psDroid->psGrpNext;
|
||||||
if ( psDroid != psTransporter )
|
if ( psDroid != psTransporter )
|
||||||
{
|
{
|
||||||
grpLeave( psTransporter->psGroup, psDroid );
|
psGroup->Add(psDroid);
|
||||||
grpJoin(psGroup, psDroid);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -699,8 +698,7 @@ BOOL scrCBTransporterLandedB( void )
|
||||||
psNext = psDroid->psGrpNext;
|
psNext = psDroid->psGrpNext;
|
||||||
if ( psDroid != psTransporter )
|
if ( psDroid != psTransporter )
|
||||||
{
|
{
|
||||||
grpLeave( psTransporter->psGroup, psDroid );
|
psGroup->Add(psDroid);
|
||||||
grpJoin(psGroup, psDroid);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//}
|
//}
|
||||||
|
|
|
@ -1144,7 +1144,7 @@ BOOL scrAddDroidToTransporter(void)
|
||||||
{
|
{
|
||||||
if (droidRemove(psDroid, mission.apsDroidLists))
|
if (droidRemove(psDroid, mission.apsDroidLists))
|
||||||
{
|
{
|
||||||
grpJoin(psTransporter->psGroup, psDroid);
|
psTransporter->psGroup->Add(psDroid);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1268,7 +1268,7 @@ BOOL scrValDefLoad(SDWORD version, INTERP_VAL *psVal, char *pBuffer, UDWORD size
|
||||||
abort();
|
abort();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
grpJoin(tmp, NULL);
|
tmp->Add(NULL);
|
||||||
psVal->v.oval = tmp;
|
psVal->v.oval = tmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1339,7 +1339,7 @@ BOOL scrValDefLoad(SDWORD version, INTERP_VAL *psVal, char *pBuffer, UDWORD size
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
grpJoin((DROID_GROUP*)(psVal->v.oval), psCDroid);
|
((DROID_GROUP*)(psVal->v.oval))->Add(psCDroid);
|
||||||
}
|
}
|
||||||
|
|
||||||
pPos += sizeof(UDWORD);
|
pPos += sizeof(UDWORD);
|
||||||
|
|
|
@ -155,7 +155,7 @@ BOOL scrvNewGroup(INTERP_VAL *psVal)
|
||||||
}
|
}
|
||||||
|
|
||||||
// increment the refcount so the group doesn't get automatically freed when empty
|
// increment the refcount so the group doesn't get automatically freed when empty
|
||||||
grpJoin(psGroup, NULL);
|
psGroup->Add(NULL);
|
||||||
|
|
||||||
psVal->v.oval = psGroup;
|
psVal->v.oval = psGroup;
|
||||||
|
|
||||||
|
|
|
@ -2023,7 +2023,7 @@ static BOOL setFunctionality(STRUCTURE *psBuilding, STRUCTURE_TYPE functionType)
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Add NULL droid to the group
|
// Add NULL droid to the group
|
||||||
grpJoin(psRepairFac->psGroup, NULL);
|
psRepairFac->psGroup->Add(NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Take advantage of upgrades
|
// Take advantage of upgrades
|
||||||
|
|
|
@ -1356,7 +1356,7 @@ void transporterRemoveDroid(UDWORD id)
|
||||||
{
|
{
|
||||||
if (grpCreate(&psGroup))
|
if (grpCreate(&psGroup))
|
||||||
{
|
{
|
||||||
grpJoin(psGroup, psDroid);
|
psGroup->Add(psDroid);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
psDroid->selected = true;
|
psDroid->selected = true;
|
||||||
|
@ -1437,7 +1437,7 @@ void transporterAddDroid(DROID *psTransporter, DROID *psDroidToAdd)
|
||||||
if (bDroidRemoved)
|
if (bDroidRemoved)
|
||||||
{
|
{
|
||||||
// adding to transporter unit's group list
|
// adding to transporter unit's group list
|
||||||
grpJoin(psTransporter->psGroup, psDroidToAdd);
|
psTransporter->psGroup->Add(psDroidToAdd);
|
||||||
|
|
||||||
if (bMultiMessages)
|
if (bMultiMessages)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue