Skip to content

Commit

Permalink
Fix loading of droids in transporters.
Browse files Browse the repository at this point in the history
Hopefully fixes ticket:2889 and ticket:2959, but does not handle the corrupted savegame in ticket:2959, which has duplicate droids in droid.ini and mdroid.ini.
  • Loading branch information
Cyp committed Dec 6, 2011
1 parent 2d4e1e1 commit 93a6d7b
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 2 deletions.
36 changes: 34 additions & 2 deletions src/game.cpp
Expand Up @@ -3964,7 +3964,21 @@ static bool loadSaveDroidPointers(const QString &pFileName, DROID **ppsCurrentDr
int player = getPlayer(ini);
int id = ini.value("id").toInt();

for (psDroid = ppsCurrentDroidLists[player]; psDroid && psDroid->id != id; psDroid = psDroid->psNext) {}
for (psDroid = ppsCurrentDroidLists[player]; psDroid && psDroid->id != id; psDroid = psDroid->psNext)
{
if (psDroid->droidType == DROID_TRANSPORTER && psDroid->psGroup != NULL) // Check for droids in the transporter.
{
for (DROID *psTrDroid = psDroid->psGroup->psList; psTrDroid != NULL; psTrDroid = psTrDroid->psGrpNext)
{
if (psTrDroid->id == id)
{
psDroid = psTrDroid;
goto foundDroid;
}
}
}
}
foundDroid:
if (!psDroid)
{
for (psDroid = mission.apsDroidLists[player]; psDroid && psDroid->id != id; psDroid = psDroid->psNext) {}
Expand Down Expand Up @@ -4052,9 +4066,27 @@ static bool loadSaveDroid(const char *pFileName, DROID **ppsCurrentDroidLists)
return false;
}
QStringList list = ini.childGroups();
// Sort list so transports are loaded first, since they must be loaded before the droids they contain.
std::vector<std::pair<int, QString> > sortedList;
for (int i = 0; i < list.size(); ++i)
{
ini.beginGroup(list[i]);
DROID_TYPE droidType = (DROID_TYPE)ini.value("droidType").toInt();
int priority = 0;
switch (droidType)
{
case DROID_TRANSPORTER: ++priority;
case DROID_COMMAND: ++priority;
default: break;
}
sortedList.push_back(std::make_pair(-priority, list[i]));
ini.endGroup();
}
std::sort(sortedList.begin(), sortedList.end());

for (unsigned i = 0; i < sortedList.size(); ++i)
{
ini.beginGroup(sortedList[i].second);
DROID *psDroid;
int player = getPlayer(ini);
int id = ini.value("id").toInt();
Expand Down Expand Up @@ -4236,7 +4268,7 @@ static bool loadSaveDroid(const char *pFileName, DROID **ppsCurrentDroidLists)
scriptSetStartPos(psDroid->player, psDroid->pos.x, psDroid->pos.y); // set map start position, FIXME - save properly elsewhere!
}

if (psDroid->pos.x >= 0) // do not add to list if on a transport, then the group list is used instead
if (psDroid->psGroup == NULL || psDroid->psGroup->type != GT_TRANSPORTER || psDroid->droidType == DROID_TRANSPORTER) // do not add to list if on a transport, then the group list is used instead
{
addDroid(psDroid, ppsCurrentDroidLists);
}
Expand Down
1 change: 1 addition & 0 deletions src/group.cpp
Expand Up @@ -120,6 +120,7 @@ void DROID_GROUP::add(DROID *psDroid)
if (psDroid->droidType == DROID_TRANSPORTER)
{
ASSERT_OR_RETURN(, (type == GT_NORMAL), "grpJoin: Cannot have two transporters in a group" );
ASSERT_OR_RETURN(, psList == NULL, "Adding transporter to non-empty list.");
type = GT_TRANSPORTER;
psDroid->psGrpNext = psList;
psList = psDroid;
Expand Down

0 comments on commit 93a6d7b

Please sign in to comment.