forked from Mirrors/openclonk
C4Game: Refactor CheckObjectEnumeration to not use manual list traversal
parent
843d4039b1
commit
e05bdfbcb4
|
@ -3122,38 +3122,48 @@ bool C4Game::InitNetworkHost()
|
||||||
|
|
||||||
bool C4Game::CheckObjectEnumeration()
|
bool C4Game::CheckObjectEnumeration()
|
||||||
{
|
{
|
||||||
// Check valid & maximum number & duplicate numbers
|
|
||||||
int32_t iMax = 0;
|
struct Check
|
||||||
C4Object *cObj; C4ObjectLink *clnk;
|
|
||||||
C4Object *cObj2; C4ObjectLink *clnk2;
|
|
||||||
clnk=Objects.First; if (!clnk) clnk=Objects.InactiveObjects.First;
|
|
||||||
while (clnk)
|
|
||||||
{
|
{
|
||||||
// Invalid number
|
int32_t maxNumber = 0;
|
||||||
cObj = clnk->Obj;
|
// Check valid & maximum number & duplicate numbers
|
||||||
if (cObj->Number<1)
|
bool that(C4Object* cObj)
|
||||||
{
|
{
|
||||||
LogFatal(FormatString("Invalid object enumeration number (%d) of object %s (x=%d)", cObj->Number, cObj->id.ToString(), cObj->GetX()).getData()); return false;
|
// Invalid number
|
||||||
|
if (cObj->Number<1)
|
||||||
|
{
|
||||||
|
LogFatal(FormatString("Invalid object enumeration number (%d) of object %s (x=%d)", cObj->Number, cObj->id.ToString(), cObj->GetX()).getData()); return false;
|
||||||
|
}
|
||||||
|
// Max
|
||||||
|
if (cObj->Number>maxNumber) maxNumber=cObj->Number;
|
||||||
|
// Duplicate
|
||||||
|
for (C4Object *cObj2 : Objects)
|
||||||
|
if (cObj2!=cObj)
|
||||||
|
if (cObj->Number==cObj2->Number)
|
||||||
|
{ LogFatal(FormatString("Duplicate object enumeration number %d (%s and %s)",cObj2->Number,cObj->GetName(),cObj2->GetName()).getData()); return false; }
|
||||||
|
for (C4Object *cObj2 : Objects.InactiveObjects)
|
||||||
|
if (cObj2!=cObj)
|
||||||
|
if (cObj->Number==cObj2->Number)
|
||||||
|
{ LogFatal(FormatString("Duplicate object enumeration number %d (%s and %s(i))",cObj2->Number,cObj->GetName(),cObj2->GetName()).getData()); return false; }
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
// Max
|
};
|
||||||
if (cObj->Number>iMax) iMax=cObj->Number;
|
|
||||||
// Duplicate
|
Check check;
|
||||||
for (clnk2=Objects.First; clnk2 && (cObj2=clnk2->Obj); clnk2=clnk2->Next)
|
for (C4Object *cObj : Objects)
|
||||||
if (cObj2!=cObj)
|
{
|
||||||
if (cObj->Number==cObj2->Number)
|
if (!check.that(cObj))
|
||||||
{ LogFatal(FormatString("Duplicate object enumeration number %d (%s and %s)",cObj2->Number,cObj->GetName(),cObj2->GetName()).getData()); return false; }
|
return false;
|
||||||
for (clnk2=Objects.InactiveObjects.First; clnk2 && (cObj2=clnk2->Obj); clnk2=clnk2->Next)
|
|
||||||
if (cObj2!=cObj)
|
|
||||||
if (cObj->Number==cObj2->Number)
|
|
||||||
{ LogFatal(FormatString("Duplicate object enumeration number %d (%s and %s(i))",cObj2->Number,cObj->GetName(),cObj2->GetName()).getData()); return false; }
|
|
||||||
// next
|
|
||||||
if (!clnk->Next)
|
|
||||||
if (clnk == Objects.Last) clnk=Objects.InactiveObjects.First; else clnk=NULL;
|
|
||||||
else
|
|
||||||
clnk=clnk->Next;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (C4Object *cObj : Objects.InactiveObjects)
|
||||||
|
{
|
||||||
|
if (!check.that(cObj))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
// Adjust enumeration index
|
// Adjust enumeration index
|
||||||
C4PropListNumbered::SetEnumerationIndex(iMax);
|
C4PropListNumbered::SetEnumerationIndex(check.maxNumber);
|
||||||
// Done
|
// Done
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue