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;
}
grpJoin(psGroup, psCommander);
psGroup->Add(psCommander);
psDroid->group = UBYTE_MAX;
}
if (grpNumMembers(psCommander->psGroup) < cmdDroidMaxGroup(psCommander))
{
grpJoin(psCommander->psGroup, psDroid);
psCommander->psGroup->Add(psDroid);
psDroid->group = UBYTE_MAX;
// 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;
return NULL;
}
grpJoin(psGrp, psDroid);
psGrp->Add(psDroid);
}
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->psGrpNext = NULL;
ASSERT( psCurrentTransGroup != NULL,"loadSaveUnitV9; Transporter unit without group " );
grpJoin(psCurrentTransGroup, psDroid);
psCurrentTransGroup->Add(psDroid);
}
else if (psDroid->droidType == DROID_TRANSPORTER)
{

View File

@ -28,14 +28,15 @@
#include "lib/netplay/netplay.h"
#include "multiplay.h"
#include <list>
static DROID_GROUP *firstGroup = NULL;
static BOOL grpInitialized = false;
static std::list<DROID_GROUP *> grpGlobalManager;
static bool grpInitialized = false;
// initialise the group system
BOOL grpInitialise(void)
bool grpInitialise(void)
{
firstGroup = NULL;
grpGlobalManager.clear();
grpInitialized = true;
return true;
}
@ -45,20 +46,27 @@ void grpShutDown(void)
{
/* Since we are not very diligent removing groups after we have
* 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;
iter = iter->psNext;
free(psDel);
free(*iter);
}
firstGroup = NULL;
grpGlobalManager.clear();
grpInitialized = false;
}
// Initialize new group
void DROID_GROUP::Init()
{
type = GT_NORMAL;
refCount = 0;
psList = NULL;
psCommander = NULL;
}
// create a new group
BOOL grpCreate(DROID_GROUP **ppsGroup)
bool grpCreate(DROID_GROUP **ppsGroup)
{
ASSERT(grpInitialized, "Group code not initialized yet");
*ppsGroup = (DROID_GROUP *)calloc(1, sizeof(DROID_GROUP));
@ -68,79 +76,59 @@ BOOL grpCreate(DROID_GROUP **ppsGroup)
return false;
}
// Add node to beginning of list
if (firstGroup != NULL)
{
(*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;
grpGlobalManager.push_back(*ppsGroup);
(*ppsGroup)->Init();
return true;
}
// 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_OR_RETURN(, psGroup != NULL,
"grpJoin: invalid group pointer" );
psGroup->refCount += 1;
refCount += 1;
// if psDroid == NULL just increase the refcount don't add anything to the list
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" );
return;
}
if (psDroid->psGroup != NULL)
{
grpLeave(psDroid->psGroup, psDroid);
}
psDroid->psGroup = psGroup;
psDroid->psGroup = this;
if (psDroid->droidType == DROID_TRANSPORTER)
{
ASSERT_OR_RETURN(, (psGroup->type == GT_NORMAL),
"grpJoin: Cannot have two transporters in a group" );
psGroup->type = GT_TRANSPORTER;
psDroid->psGrpNext = psGroup->psList;
psGroup->psList = psDroid;
ASSERT_OR_RETURN(, (type == GT_NORMAL),
"grpJoin: Cannot have two transporters in a group" );
type = GT_TRANSPORTER;
psDroid->psGrpNext = psList;
psList = psDroid;
}
else if ((psDroid->droidType == DROID_COMMAND) &&
(psGroup->type != GT_TRANSPORTER))
(type != GT_TRANSPORTER))
{
ASSERT_OR_RETURN(, (psGroup->type == GT_NORMAL) && (psGroup->psCommander == NULL),
"grpJoin: Cannot have two command droids in a group" );
psGroup->type = GT_COMMAND;
psGroup->psCommander = psDroid;
ASSERT_OR_RETURN(, (type == GT_NORMAL) && (psCommander == NULL),
"grpJoin: Cannot have two command droids in a group" );
type = GT_COMMAND;
psCommander = psDroid;
}
else
{
psDroid->psGrpNext = psGroup->psList;
psGroup->psList = psDroid;
psDroid->psGrpNext = psList;
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
if (psGroup->refCount <= 0)
{
if (firstGroup == psGroup)
{
firstGroup = psGroup->psNext;
}
if (psGroup->psNext)
{
psGroup->psNext->psPrev = psGroup->psPrev;
}
if (psGroup->psPrev)
{
psGroup->psPrev->psNext = psGroup->psNext;
}
grpGlobalManager.remove(psGroup);
free(psGroup);
}
}

View File

@ -33,8 +33,12 @@ enum GROUP_TYPE
GT_TRANSPORTER, // transporter group
};
struct DROID_GROUP
class DROID_GROUP
{
public:
void Init();
void Add(DROID *psDroid);
void Remove();
SWORD type;
SWORD refCount;
DROID *psList; // list of droids in the group
@ -44,16 +48,13 @@ struct DROID_GROUP
};
// initialise the group system
BOOL grpInitialise(void);
bool grpInitialise(void);
// shutdown the group system
void grpShutDown(void);
// create a new group
BOOL grpCreate(DROID_GROUP **ppsGroup);
// add a droid to a group
void grpJoin(DROID_GROUP *psGroup, DROID *psDroid);
bool grpCreate(DROID_GROUP **ppsGroup);
// remove a droid from a group
void grpLeave(DROID_GROUP *psGroup, DROID *psDroid);

View File

@ -1131,7 +1131,7 @@ void saveCampaignData(void)
{
if (droidRemove(psSafeDroid, mission.apsDroidLists))
{
grpJoin(psDroid->psGroup, psSafeDroid);
psDroid->psGroup->Add(psSafeDroid);
}
}
else
@ -1880,7 +1880,7 @@ void unloadTransporter(DROID *psTransporter, UDWORD x, UDWORD y, BOOL goingHome)
{
if (grpCreate(&psGroup))
{
grpJoin(psGroup, psDroid);
psGroup->Add(psDroid);
}
clearCommandDroidFactory(psDroid);
}

View File

@ -250,7 +250,7 @@ BOOL recvDroidEmbark(NETQUEUE queue)
if (bDroidRemoved)
{
// and now we need to add it to their transporter group!
grpJoin(psTransporterDroid->psGroup, psDroid);
psTransporterDroid->psGroup->Add(psDroid);
}
else
{

View File

@ -395,7 +395,7 @@ void addDroid(DROID *psDroidToAdd, DROID *pList[MAX_PLAYERS])
grpCreate(&psGroup);
if (psGroup)
{
grpJoin(psGroup, psDroidToAdd);
psGroup->Add(psDroidToAdd);
}
}
}

View File

@ -80,7 +80,7 @@ BOOL scrGroupAddDroid(void)
return false;
}
grpJoin(psGroup, psDroid);
psGroup->Add(psDroid);
return true;
}
@ -118,7 +118,7 @@ BOOL scrGroupAddArea(void)
psDroid->droidType != DROID_TRANSPORTER )
{
grpJoin(psGroup, psDroid);
psGroup->Add(psDroid);
}
}
@ -156,7 +156,7 @@ BOOL scrGroupAddAreaNoGroup(void)
psDroid->droidType != DROID_TRANSPORTER &&
psDroid->psGroup == NULL)
{
grpJoin(psGroup, psDroid);
psGroup->Add(psDroid);
}
}
@ -183,7 +183,7 @@ BOOL scrGroupAddGroup(void)
for(psDroid=psFrom->psList; psDroid; psDroid=psNext)
{
psNext = psDroid->psGrpNext;
grpJoin(psTo, psDroid);
psTo->Add(psDroid);
}
return true;

View File

@ -646,8 +646,7 @@ BOOL scrCBTransporterLanded( void )
psNext = psDroid->psGrpNext;
if ( psDroid != psTransporter )
{
grpLeave( psTransporter->psGroup, psDroid );
grpJoin(psGroup, psDroid);
psGroup->Add(psDroid);
}
}
}
@ -699,8 +698,7 @@ BOOL scrCBTransporterLandedB( void )
psNext = psDroid->psGrpNext;
if ( psDroid != psTransporter )
{
grpLeave( psTransporter->psGroup, psDroid );
grpJoin(psGroup, psDroid);
psGroup->Add(psDroid);
}
}
//}

View File

@ -1144,7 +1144,7 @@ BOOL scrAddDroidToTransporter(void)
{
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();
break;
}
grpJoin(tmp, NULL);
tmp->Add(NULL);
psVal->v.oval = tmp;
}
@ -1339,7 +1339,7 @@ BOOL scrValDefLoad(SDWORD version, INTERP_VAL *psVal, char *pBuffer, UDWORD size
}
else
{
grpJoin((DROID_GROUP*)(psVal->v.oval), psCDroid);
((DROID_GROUP*)(psVal->v.oval))->Add(psCDroid);
}
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
grpJoin(psGroup, NULL);
psGroup->Add(NULL);
psVal->v.oval = psGroup;

View File

@ -2023,7 +2023,7 @@ static BOOL setFunctionality(STRUCTURE *psBuilding, STRUCTURE_TYPE functionType)
else
{
// Add NULL droid to the group
grpJoin(psRepairFac->psGroup, NULL);
psRepairFac->psGroup->Add(NULL);
}
// Take advantage of upgrades

View File

@ -1356,7 +1356,7 @@ void transporterRemoveDroid(UDWORD id)
{
if (grpCreate(&psGroup))
{
grpJoin(psGroup, psDroid);
psGroup->Add(psDroid);
}
}
psDroid->selected = true;
@ -1437,7 +1437,7 @@ void transporterAddDroid(DROID *psTransporter, DROID *psDroidToAdd)
if (bDroidRemoved)
{
// adding to transporter unit's group list
grpJoin(psTransporter->psGroup, psDroidToAdd);
psTransporter->psGroup->Add(psDroidToAdd);
if (bMultiMessages)
{