Na super, jetzt habe ich einen weiteren Mist von Firaxis gefunden.
Es gibt in BTS schon immer in bestimmten Situationen einen Unterschied zwischen der Anzeige und den realen Weg einer Einheit. Jetzt weiß ich auch, warum das so ist.
Code:
gDLL->getFAStarIFace()->Initialize(&GC.getPathFinder(), getGridWidthINLINE(), getGridHeightINLINE(), isWrapXINLINE(), isWrapYINLINE(), pathDestValid, pathHeuristic, pathCost, pathValid, pathAdd, NULL, NULL);
gDLL->getFAStarIFace()->Initialize(&GC.getInterfacePathFinder(), getGridWidthINLINE(), getGridHeightINLINE(), isWrapXINLINE(), isWrapYINLINE(), pathDestValid, pathHeuristic, pathCost, pathValid, pathAdd, NULL, NULL);
Das definiert beim Start die Funktionen für die kürzeste Wegeberechnung. Es werden also die gleichen Funktionen für die Anzeige und der realen Bewegung verwendet. Aber es gibt einen Unterschied beim Aufrufen!
Code:
int pathCost(FAStarNode* parent, FAStarNode* node, int data, const void* pointer, FAStar* finder)
{
[...]
pSelectionGroup = ((CvSelectionGroup *)pointer);
[...]
}
Während pSelectionGroup bei der direkten Bewegung die richtige Selektiongroup ist, wird bei der Anzeige eine schlechte Kopie verwendet. Die Kopie hat mit den Original nur die Einheiten-ID-Liste gemein. So kann man diese nicht verwenden, weil die Attribute sonst nur Startwerte sind. Jedoch wird das eine oder andere Attribut im Kürzeste Wegecode verwendet und damit führen Anzeige und Bewegen nicht zum gleichen Ergebnis.