void CvPlayer::disbandUnit(bool bAnnounce) {
CvUnit* pLoopUnit;
CvUnit* pBestUnit;
wchar szBuffer[1024];
int iValue;
int iBestValue;
int iLoop;
iBestValue = MAX_INT;
pBestUnit = NULL;
for (pLoopUnit = firstUnit(&iLoop); pLoopUnit != NULL; pLoopUnit = nextUnit(&iLoop)) {
if (!(pLoopUnit->hasCargo())) {
if (!(pLoopUnit->isGoldenAge())) {
if (pLoopUnit->getUnitInfo().getProductionCost() > 0) {
if (!(pLoopUnit->isMilitaryHappiness()) || !(pLoopUnit->plot()->isCity()) || (pLoopUnit->plot()->plotCount(PUF_isMilitaryHappiness, -1, -1, getID()) > 1)) {
iValue = (10000 + GC.getGameINLINE().getSorenRandNum(1000, "Disband Unit"));
iValue += (pLoopUnit->getUnitInfo().getProductionCost() * 5);
iValue += (pLoopUnit->getExperience() * 20);
iValue += (pLoopUnit->getLevel() * 100);
if (pLoopUnit->canDefend() && pLoopUnit->plot()->isCity()) {
iValue *= 2;
}
if (pLoopUnit->plot()->getTeam() == pLoopUnit->getTeam()) {
iValue *= 3;
}
switch (pLoopUnit->AI_getUnitAIType()) {
case UNITAI_UNKNOWN:
case UNITAI_ANIMAL:
break;
case UNITAI_SETTLE:
iValue *= 20;
break;
case UNITAI_WORKER:
iValue *= 10;
break;
case UNITAI_ATTACK:
case UNITAI_ATTACK_CITY:
case UNITAI_COLLATERAL:
case UNITAI_PILLAGE:
case UNITAI_RESERVE:
case UNITAI_COUNTER:
iValue *= 2;
break;
case UNITAI_CITY_DEFENSE:
case UNITAI_CITY_COUNTER:
case UNITAI_CITY_SPECIAL:
case UNITAI_PARADROP:
iValue *= 6;
break;
case UNITAI_EXPLORE:
iValue *= 15;
break;
case UNITAI_MISSIONARY:
iValue *= 8;
break;
case UNITAI_PROPHET:
case UNITAI_ARTIST:
case UNITAI_SCIENTIST:
case UNITAI_GENERAL:
case UNITAI_MERCHANT:
case UNITAI_ENGINEER:
break;
case UNITAI_SPY:
iValue *= 12;
break;
case UNITAI_ICBM:
iValue *= 4;
break;
case UNITAI_WORKER_SEA:
iValue *= 18;
break;
case UNITAI_ATTACK_SEA:
case UNITAI_RESERVE_SEA:
case UNITAI_ESCORT_SEA:
break;
case UNITAI_EXPLORE_SEA:
iValue *= 25;
break;
case UNITAI_ASSAULT_SEA:
case UNITAI_SETTLER_SEA:
case UNITAI_MISSIONARY_SEA:
case UNITAI_SPY_SEA:
case UNITAI_CARRIER_SEA:
case UNITAI_MISSILE_CARRIER_SEA:
iValue *= 5;
break;
case UNITAI_PIRATE_SEA:
case UNITAI_ATTACK_AIR:
break;
case UNITAI_DEFENSE_AIR:
case UNITAI_CARRIER_AIR:
case UNITAI_MISSILE_AIR:
iValue *= 3;
break;
default:
FAssert(false);
break;
}
if (pLoopUnit->getUnitInfo().getExtraCost() > 0) {
iValue /= (pLoopUnit->getUnitInfo().getExtraCost() + 1);
}
if (iValue < iBestValue) {
iBestValue = iValue;
pBestUnit = pLoopUnit;
}
}
}
}
}
}
if (pBestUnit != NULL) {
swprintf(szBuffer, gDLL->getText("TXT_KEY_MISC_UNIT_DISBANDED_NO_MONEY", pBestUnit->getNameKey()).GetCString());
gDLL->getInterfaceIFace()->addMessage(getID(), false, GC.getEVENT_MESSAGE_TIME(), szBuffer, "AS2D_UNITDISBANDED", MESSAGE_TYPE_MINOR_EVENT, pBestUnit->getButton(), (ColorTypes) GC.getInfoTypeForString("COLOR_RED"), pBestUnit->getX_INLINE(), pBestUnit->getY_INLINE(), true, true);
FAssert(!(pBestUnit->isGoldenAge()));
pBestUnit->kill(false);
}
}