Code:
void CvUnit::setXY(int iX, int iY, bool bGroup, bool bUpdate, bool bShow, bool bCheckPlotVisible)
{
CLLNode<IDInfo>* pUnitNode;
CvCity* pOldCity;
CvCity* pNewCity;
CvCity* pWorkingCity;
CvUnit* pTransportUnit;
CvUnit* pLoopUnit;
CvPlot* pOldPlot;
CvPlot* pNewPlot;
CvPlot* pLoopPlot;
CLinkList<IDInfo> oldUnits;
ActivityTypes eOldActivityType;
int iI;
// OOS!! Temporary for Out-of-Sync madness debugging...
if (GC.getLogging())
{
if (gDLL->getChtLvl() > 0)
{
char szOut[1024];
sprintf(szOut, "Player %d Unit %d (%S's %S) moving from %d:%d to %d:%d\n", getOwnerINLINE(), getID(), GET_PLAYER(getOwnerINLINE()).getNameKey(), getName().GetCString(), getX_INLINE(), getY_INLINE(), iX, iY);
gDLL->messageControlLog(szOut);
}
}
FAssert(!at(iX, iY));
FAssert(!isFighting());
FAssert((iX == INVALID_PLOT_COORD) || (GC.getMapINLINE().plotINLINE(iX, iY)->getX_INLINE() == iX));
FAssert((iY == INVALID_PLOT_COORD) || (GC.getMapINLINE().plotINLINE(iX, iY)->getY_INLINE() == iY));
if (getGroup() != NULL)
{
eOldActivityType = getGroup()->getActivityType();
}
else
{
eOldActivityType = NO_ACTIVITY;
}
setBlockading(false);
if (!bGroup || isCargo())
{
joinGroup(NULL, true);
bShow = false;
}
pNewPlot = GC.getMapINLINE().plotINLINE(iX, iY);
if (pNewPlot != NULL)
{
pTransportUnit = getTransportUnit();
if (pTransportUnit != NULL)
{
if (!(pTransportUnit->atPlot(pNewPlot)))
{
setTransportUnit(NULL);
}
}
if (canFight())
{
oldUnits.clear();
pUnitNode = pNewPlot->headUnitNode();
while (pUnitNode != NULL)
{
oldUnits.insertAtEnd(pUnitNode->m_data);
pUnitNode = pNewPlot->nextUnitNode(pUnitNode);
}
pUnitNode = oldUnits.head();
while (pUnitNode != NULL)
{
pLoopUnit = ::getUnit(pUnitNode->m_data);
pUnitNode = oldUnits.next(pUnitNode);
if (pLoopUnit != NULL)
{
if (isEnemy(pLoopUnit->getTeam(), pNewPlot) || pLoopUnit->isEnemy(getTeam()))
{
if (!pLoopUnit->canCoexistWithEnemyUnit(getTeam()))
{
if (NO_UNITCLASS == pLoopUnit->getUnitInfo().getUnitCaptureClassType() && pLoopUnit->canDefend(pNewPlot))
{
pLoopUnit->jumpToNearestValidPlot(); // can kill unit
}
else
{
if (!m_pUnitInfo->isHiddenNationality() && !pLoopUnit->getUnitInfo().isHiddenNationality())
{
GET_TEAM(pLoopUnit->getTeam()).changeWarWeariness(getTeam(), *pNewPlot, GC.getDefineINT("WW_UNIT_CAPTURED"));
GET_TEAM(getTeam()).changeWarWeariness(pLoopUnit->getTeam(), *pNewPlot, GC.getDefineINT("WW_CAPTURED_UNIT"));
GET_TEAM(getTeam()).AI_changeWarSuccess(pLoopUnit->getTeam(), GC.getDefineINT("WAR_SUCCESS_UNIT_CAPTURING"));
}
if (!isNoCapture())
{
pLoopUnit->setCapturingPlayer(getOwnerINLINE());
}
pLoopUnit->kill(false, getOwnerINLINE());
}
}
}
}
}
}
if (pNewPlot->isGoody(getTeam()))
{
GET_PLAYER(getOwnerINLINE()).doGoody(pNewPlot, this);
}
}
pOldPlot = plot();
if (pOldPlot != NULL)
{
pOldPlot->removeUnit(this, bUpdate && !hasCargo());
pOldPlot->changeAdjacentSight(getTeam(), visibilityRange(), false, this, true);
pOldPlot->area()->changeUnitsPerPlayer(getOwnerINLINE(), -1);
pOldPlot->area()->changePower(getOwnerINLINE(), -(m_pUnitInfo->getPowerValue()));
if (AI_getUnitAIType() != NO_UNITAI)
{
pOldPlot->area()->changeNumAIUnits(getOwnerINLINE(), AI_getUnitAIType(), -1);
}
if (isAnimal())
{
pOldPlot->area()->changeAnimalsPerPlayer(getOwnerINLINE(), -1);
}
if (pOldPlot->getTeam() != getTeam() && (pOldPlot->getTeam() == NO_TEAM || !GET_TEAM(pOldPlot->getTeam()).isVassal(getTeam())))
{
GET_PLAYER(getOwnerINLINE()).changeNumOutsideUnits(-1);
}
setLastMoveTurn(GC.getGameINLINE().getTurnSlice());
pOldCity = pOldPlot->getPlotCity();
if (pOldCity != NULL)
{
if (isMilitaryHappiness())
{
pOldCity->changeMilitaryHappinessUnits(-1);
}
}
pWorkingCity = pOldPlot->getWorkingCity();
if (pWorkingCity != NULL)
{
if (canSiege(pWorkingCity->getTeam()))
{
pWorkingCity->AI_setAssignWorkDirty(true);
}
}
if (pOldPlot->isWater())
{
for (iI = 0; iI < NUM_DIRECTION_TYPES; iI++)
{
pLoopPlot = plotDirection(pOldPlot->getX_INLINE(), pOldPlot->getY_INLINE(), ((DirectionTypes)iI));
if (pLoopPlot != NULL)
{
if (pLoopPlot->isWater())
{
pWorkingCity = pLoopPlot->getWorkingCity();
if (pWorkingCity != NULL)
{
if (canSiege(pWorkingCity->getTeam()))
{
pWorkingCity->AI_setAssignWorkDirty(true);
}
}
}
}
}
}
if (pOldPlot->isActiveVisible(true))
{
pOldPlot->updateMinimapColor();
}
if (pOldPlot == gDLL->getInterfaceIFace()->getSelectionPlot())
{
gDLL->getInterfaceIFace()->verifyPlotListColumn();
gDLL->getInterfaceIFace()->setDirty(PlotListButtons_DIRTY_BIT, true);
}
}
if (pNewPlot != NULL)
{
m_iX = pNewPlot->getX_INLINE();
m_iY = pNewPlot->getY_INLINE();
}
else
{
m_iX = INVALID_PLOT_COORD;
m_iY = INVALID_PLOT_COORD;
}
FAssertMsg(plot() == pNewPlot, "plot is expected to equal pNewPlot");
if (pNewPlot != NULL)
{
pNewCity = pNewPlot->getPlotCity();
if (pNewCity != NULL)
{
if (isEnemy(pNewCity->getTeam()) && !canCoexistWithEnemyUnit(pNewCity->getTeam()) && canFight())
{
GET_TEAM(getTeam()).changeWarWeariness(pNewCity->getTeam(), *pNewPlot, GC.getDefineINT("WW_CAPTURED_CITY"));
/************************************************************************************************/
/* BETTER_BTS_AI_MOD 06/14/09 jdog5000 */
/* */
/* General AI */
/************************************************************************************************/
/* original bts code
GET_TEAM(getTeam()).AI_changeWarSuccess(pNewCity->getTeam(), GC.getDefineINT("WAR_SUCCESS_CITY_CAPTURING"));
*/
// Double war success if capturing capital city, always a significant blow to enemy
// pNewCity still points to old city here, hasn't been acquired yet
GET_TEAM(getTeam()).AI_changeWarSuccess(pNewCity->getTeam(), (pNewCity->isCapital() ? 2 : 1)*GC.getWAR_SUCCESS_CITY_CAPTURING());
/************************************************************************************************/
/* BETTER_BTS_AI_MOD END */
/************************************************************************************************/
PlayerTypes eNewOwner = GET_PLAYER(getOwnerINLINE()).pickConqueredCityOwner(*pNewCity);
if (NO_PLAYER != eNewOwner)
{
GET_PLAYER(eNewOwner).acquireCity(pNewCity, true, false, true); // will delete the pointer
pNewCity = NULL;
}
}
}
//update facing direction
if(pOldPlot != NULL)
{
DirectionTypes newDirection = estimateDirection(pOldPlot, pNewPlot);
if(newDirection != NO_DIRECTION)
//Ramkhamhaeng - Formationswechsel für Riverboat beginn
{//Kathy: Nur für Schiffe auf FLussfeldern
if (pNewPlot->isRiver() && getDomainType() == DOMAIN_SEA)
{
update_river_formation(newDirection);
}//Kathy: Nur für Schiffe auf FLussfeldern
m_eFacingDirection = newDirection;
}//Ramkhamhaeng - Formationswechsel für Riverboat end
// m_eFacingDirection = newDirection; //original code
}
//update cargo mission animations
if (isCargo())
{
if (eOldActivityType != ACTIVITY_MISSION)
{
getGroup()->setActivityType(eOldActivityType);
}
}
setFortifyTurns(0);
pNewPlot->changeAdjacentSight(getTeam(), visibilityRange(), true, this, true); // needs to be here so that the square is considered visible when we move into it...
pNewPlot->addUnit(this, bUpdate && !hasCargo());
pNewPlot->area()->changeUnitsPerPlayer(getOwnerINLINE(), 1);
pNewPlot->area()->changePower(getOwnerINLINE(), m_pUnitInfo->getPowerValue());
if (AI_getUnitAIType() != NO_UNITAI)
{
pNewPlot->area()->changeNumAIUnits(getOwnerINLINE(), AI_getUnitAIType(), 1);
}
if (isAnimal())
{
pNewPlot->area()->changeAnimalsPerPlayer(getOwnerINLINE(), 1);
}
if (pNewPlot->getTeam() != getTeam() && (pNewPlot->getTeam() == NO_TEAM || !GET_TEAM(pNewPlot->getTeam()).isVassal(getTeam())))
{
GET_PLAYER(getOwnerINLINE()).changeNumOutsideUnits(1);
}
if (shouldLoadOnMove(pNewPlot))
{
load();
}
for (iI = 0; iI < MAX_CIV_TEAMS; iI++)
{
if (GET_TEAM((TeamTypes)iI).isAlive())
{
if (!isInvisible(((TeamTypes)iI), false))
{
if (pNewPlot->isVisible((TeamTypes)iI, false))
{
GET_TEAM((TeamTypes)iI).meet(getTeam(), true);
}
}
}
}
pNewCity = pNewPlot->getPlotCity();
if (pNewCity != NULL)
{
if (isMilitaryHappiness())
{
pNewCity->changeMilitaryHappinessUnits(1);
}
}
pWorkingCity = pNewPlot->getWorkingCity();
if (pWorkingCity != NULL)
{
if (canSiege(pWorkingCity->getTeam()))
{
pWorkingCity->verifyWorkingPlot(pWorkingCity->getCityPlotIndex(pNewPlot));
}
}
if (pNewPlot->isWater())
{
for (iI = 0; iI < NUM_DIRECTION_TYPES; iI++)
{
pLoopPlot = plotDirection(pNewPlot->getX_INLINE(), pNewPlot->getY_INLINE(), ((DirectionTypes)iI));
if (pLoopPlot != NULL)
{
if (pLoopPlot->isWater())
{
pWorkingCity = pLoopPlot->getWorkingCity();
if (pWorkingCity != NULL)
{
if (canSiege(pWorkingCity->getTeam()))
{
pWorkingCity->verifyWorkingPlot(pWorkingCity->getCityPlotIndex(pLoopPlot));
}
}
}
}
}
}
if (pNewPlot->isActiveVisible(true))
{
pNewPlot->updateMinimapColor();
}
if (GC.IsGraphicsInitialized())
{
//override bShow if check plot visible
if(bCheckPlotVisible && pNewPlot->isVisibleToWatchingHuman())
bShow = true;
if (bShow)
{
QueueMove(pNewPlot);
}
else
{
SetPosition(pNewPlot);
}
}
if (pNewPlot == gDLL->getInterfaceIFace()->getSelectionPlot())
{
gDLL->getInterfaceIFace()->verifyPlotListColumn();
gDLL->getInterfaceIFace()->setDirty(PlotListButtons_DIRTY_BIT, true);
}
}
if (pOldPlot != NULL)
{
if (hasCargo())
{
pUnitNode = pOldPlot->headUnitNode();
while (pUnitNode != NULL)
{
pLoopUnit = ::getUnit(pUnitNode->m_data);
pUnitNode = pOldPlot->nextUnitNode(pUnitNode);
if (pLoopUnit->getTransportUnit() == this)
{
pLoopUnit->setXY(iX, iY, bGroup, false);
}
}
}
}
if (bUpdate && hasCargo())
{
if (pOldPlot != NULL)
{
pOldPlot->updateCenterUnit();
pOldPlot->setFlagDirty(true);
}
if (pNewPlot != NULL)
{
pNewPlot->updateCenterUnit();
pNewPlot->setFlagDirty(true);
}
}
FAssert(pOldPlot != pNewPlot);
GET_PLAYER(getOwnerINLINE()).updateGroupCycle(this);
setInfoBarDirty(true);
if (IsSelected())
{
if (isFound())
{
gDLL->getInterfaceIFace()->setDirty(GlobeLayer_DIRTY_BIT, true);
gDLL->getEngineIFace()->updateFoundingBorder();
}
gDLL->getInterfaceIFace()->setDirty(ColoredPlots_DIRTY_BIT, true);
}
//update glow
if (pNewPlot != NULL)
{
gDLL->getEntityIFace()->updateEnemyGlow(getUnitEntity());
}
// report event to Python, along with some other key state
CvEventReporter::getInstance().unitSetXY(pNewPlot, this);
}
Aber hier sehe ich keinen Ansatzpunkt. setTransportUnit wird hier auch aufgerufen, und ich sehe nichts, was danach meine Moves wieder mit einem (höheren) Wert überschreibt.