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
littlepig 2011-01-20 12:01:07 +00:00
parent 9a0933f823
commit 75e8001219
15 changed files with 73 additions and 97 deletions

View File

@ -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

View File

@ -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

View File

@ -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)
{ {

View File

@ -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);
} }
} }

View File

@ -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);

View File

@ -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);
} }

View File

@ -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
{ {

View File

@ -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);
} }
} }
} }

View File

@ -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;

View File

@ -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);
} }
} }
//} //}

View File

@ -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);
} }
} }

View File

@ -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);

View File

@ -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;

View File

@ -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

View File

@ -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)
{ {