int iBestSeaAssaultCapacity = 0;
if (NULL != pWaterArea && (bAssault))
{
UnitTypes eBestAssaultUnit = NO_UNIT;
kPlayer.AI_bestCityUnitAIValue(UNITAI_ASSAULT_SEA, this, &eBestAssaultUnit);
if (eBestAssaultUnit != NO_UNIT)
{
iBestSeaAssaultCapacity = GC.getUnitInfo(eBestAssaultUnit).getCargoSpace();
}
int iUnitsToTransport = kPlayer.AI_totalAreaUnitAIs(pArea, UNITAI_ATTACK_CITY);
iUnitsToTransport += kPlayer.AI_totalAreaUnitAIs(pArea, UNITAI_ATTACK);
iUnitsToTransport += kPlayer.AI_totalAreaUnitAIs(pArea, UNITAI_COUNTER);
int iTransports = kPlayer.AI_totalAreaUnitAIs(pArea, UNITAI_ASSAULT_SEA);
iTransports += kPlayer.AI_totalAreaUnitAIs(pWaterArea, UNITAI_ASSAULT_SEA);
int iEscorts = kPlayer.AI_totalAreaUnitAIs(pArea, UNITAI_ESCORT_SEA);
iEscorts += kPlayer.AI_totalAreaUnitAIs(pWaterArea, UNITAI_ESCORT_SEA);
//The way of calculating numbers is a bit fuzzy since the ships
//can make return trips. When massing for a war it'll train enough
//ships to move it's entire army. Once the war is underway it'll stop
//training so many ships on the assumption that those out at sea
//will return...
if ((iEscorts < ((1 + 2 * iTransports) / 3)) && (GC.getGame().getSorenRandNum(2, "AI train escort sea") == 0))
{
if (AI_chooseUnit(UNITAI_ESCORT_SEA))
{
AI_chooseBuilding(BUILDINGFOCUS_DOMAINSEA);
return;
}
}
UnitTypes eBestAttackSeaUnit = NO_UNIT;
kPlayer.AI_bestCityUnitAIValue(UNITAI_ATTACK_SEA, this, &eBestAttackSeaUnit);
if (eBestAttackSeaUnit != NO_UNIT)
{
if (GC.getUnitInfo(eBestAttackSeaUnit).getBombardRate() > 0)
{
int iAttackSea = kPlayer.AI_totalAreaUnitAIs(pArea, UNITAI_ATTACK_SEA);
iAttackSea += kPlayer.AI_totalAreaUnitAIs(pWaterArea, UNITAI_ATTACK_SEA);
if ((iAttackSea < ((1 + 2 * iTransports) / 2)) && (GC.getGame().getSorenRandNum(2, "AI train attack sea") == 0))
{
if (AI_chooseUnit(UNITAI_ATTACK_SEA))
{
AI_chooseBuilding(BUILDINGFOCUS_DOMAINSEA);
return;
}
}
}
}
if (iUnitsToTransport > (iTransports * iBestSeaAssaultCapacity))
{
if (AI_chooseUnit(UNITAI_ASSAULT_SEA))
{
AI_chooseBuilding(BUILDINGFOCUS_DOMAINSEA);
return;
}
}
int iCarriers = kPlayer.AI_totalUnitAIs(UNITAI_CARRIER_SEA);
if (iCarriers > 0)
{
UnitTypes eBestCarrierUnit = NO_UNIT;
kPlayer.AI_bestCityUnitAIValue(UNITAI_CARRIER_SEA, this, &eBestCarrierUnit);
if (eBestCarrierUnit != NO_UNIT)
{
FAssert(GC.getUnitInfo(eBestCarrierUnit).getDomainCargo() == DOMAIN_AIR);
int iCarrierAirNeeded = iCarriers * GC.getUnitInfo(eBestCarrierUnit).getCargoSpace();
if (kPlayer.AI_totalUnitAIs(UNITAI_CARRIER_AIR) < iCarrierAirNeeded)
{
if (AI_chooseUnit(UNITAI_CARRIER_AIR))
{
return;
}
}
}
}
if (iCarriers < (kPlayer.AI_totalUnitAIs(UNITAI_ASSAULT_SEA) / 4))
{
if (AI_chooseUnit(UNITAI_CARRIER_SEA))
{
return;
}
}
int iMissileCarriers = kPlayer.AI_totalUnitAIs(UNITAI_MISSILE_CARRIER_SEA);
if (iMissileCarriers > 0)
{
UnitTypes eBestMissileCarrierUnit = NO_UNIT;
kPlayer.AI_bestCityUnitAIValue(UNITAI_MISSILE_CARRIER_SEA, this, &eBestMissileCarrierUnit);
if (eBestMissileCarrierUnit != NO_UNIT)
{
FAssert(GC.getUnitInfo(eBestMissileCarrierUnit).getDomainCargo() == DOMAIN_AIR);
int iMissileCarrierAirNeeded = iMissileCarriers * GC.getUnitInfo(eBestMissileCarrierUnit).getCargoSpace();
if ((kPlayer.AI_totalUnitAIs(UNITAI_MISSILE_AIR) < iMissileCarrierAirNeeded) ||
(bPrimaryArea && (kPlayer.AI_totalAreaUnitAIs(pArea, UNITAI_MISSILE_CARRIER_SEA) * GC.getUnitInfo(eBestMissileCarrierUnit).getCargoSpace() < kPlayer.AI_totalAreaUnitAIs(pArea, UNITAI_MISSILE_AIR))))
{
if (AI_chooseUnit(UNITAI_MISSILE_AIR))
{
return;
}
}
}
}
}
//TLO: AI Land Transport Usage Start
else if (NULL == pWaterArea && (bAssault))
{
int iBestLandAssaultCapacity = 0;
UnitTypes eBestAssaultUnit = NO_UNIT;
kPlayer.AI_bestCityUnitAIValue(UNITAI_ASSAULT_LAND, this, &eBestAssaultUnit);
if (eBestAssaultUnit != NO_UNIT)
{
iBestSeaAssaultCapacity = GC.getUnitInfo(eBestAssaultUnit).getCargoSpace();
}
int iUnitsToTransport = kPlayer.AI_totalAreaUnitAIs(pArea, UNITAI_ATTACK_CITY);
iUnitsToTransport += kPlayer.AI_totalAreaUnitAIs(pArea, UNITAI_ATTACK);
iUnitsToTransport += kPlayer.AI_totalAreaUnitAIs(pArea, UNITAI_COUNTER);
int iTransports = kPlayer.AI_totalAreaUnitAIs(pArea, UNITAI_ASSAULT_LAND);
int iEscorts = kPlayer.AI_totalAreaUnitAIs(pArea, UNITAI_ESCORT_LAND);
//The way of calculating numbers is a bit fuzzy since the ships
//can make return trips. When massing for a war it'll train enough
//ships to move it's entire army. Once the war is underway it'll stop
//training so many ships on the assumption that those out in the field
//will return...
if ((iEscorts < ((1 + 2 * iTransports) / 3)) && (GC.getGame().getSorenRandNum(2, "AI train escort land") == 0))
{
if (AI_chooseUnit(UNITAI_ESCORT_LAND))
{
AI_chooseBuilding(BUILDINGFOCUS_EXPERIENCE);
return;
}
}
if (iUnitsToTransport > (iTransports * iBestLandAssaultCapacity))
{
if (AI_chooseUnit(UNITAI_ASSAULT_LAND))
{
AI_chooseBuilding(BUILDINGFOCUS_EXPERIENCE);
return;
}
}
int iMissileCarriers = kPlayer.AI_totalUnitAIs(UNITAI_MISSILE_CARRIER_LAND);
if (iMissileCarriers > 0)
{
UnitTypes eBestMissileCarrierUnit = NO_UNIT;
kPlayer.AI_bestCityUnitAIValue(UNITAI_MISSILE_CARRIER_LAND, this, &eBestMissileCarrierUnit);
if (eBestMissileCarrierUnit != NO_UNIT)
{
FAssert(GC.getUnitInfo(eBestMissileCarrierUnit).getDomainCargo() == DOMAIN_AIR);
int iMissileCarrierAirNeeded = iMissileCarriers * GC.getUnitInfo(eBestMissileCarrierUnit).getCargoSpace();
if ((kPlayer.AI_totalUnitAIs(UNITAI_MISSILE_AIR) < iMissileCarrierAirNeeded) ||
(bPrimaryArea && (kPlayer.AI_totalAreaUnitAIs(pArea, UNITAI_MISSILE_CARRIER_LAND) * GC.getUnitInfo(eBestMissileCarrierUnit).getCargoSpace() < kPlayer.AI_totalAreaUnitAIs(pArea, UNITAI_MISSILE_AIR))))
{
if (AI_chooseUnit(UNITAI_MISSILE_AIR))
{
return;
}
}
}
}
//TLO: AI Land Transport Usage End