City Capture Options for AI
This script makes the AI use the new CityCaptureOptions introduced with the Apolyton Edition (keep, kill, or liberate the city).
It also allows for the destruction of buildings upon capture and nuking of a city (a feature originally introduced by Dale).
1The Script1
//--------------------------------------------------------------------------
// MoT Mod for CTP2 (Apolyton Edition) by BureauBert
// v1.1
// http://motmod.ctp2.info
//--------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////
// CityCaptureOptions for AIs for CTP2 - Apolyton Edition
// by BureauBert
// This script makes the AI use the CityCaptureOptions introduced for the
// HUMAN with the Apolyton Edition. The logic may be refined in future.
//
////////////////////////////////////////////////////////////////////////////
///////////////////////////////////
// Globals
///////////////////////////////////
// declared in main.slc
///////////////////////////////////
// Functions
///////////////////////////////////
void_f KCO_KillCity(city_t theCity) {
city_t kcoCity;
int_t kcoCountA;
int_t kcoCitySize;
kcoCity = theCity;
kcoCitySize = kcoCity.population;
if(CityIsValid(kcoCity)) {
for(kcoCountA = kcoCitySize; kcoCountA > 0; kcoCountA = kcoCountA - 1) {
Event:KillPop(kcoCity);
}
}
}
void_f KCO_LiberateCity(city_t theCity) {
city_t kcoCity;
kcoCity = theCity;
if(CityIsValid(kcoCity)) {
Event:CaptureCity(kcoCity, 0, 2);
}
}
///////////////////////////////////
// Event Handlers
///////////////////////////////////
HandleEvent(CaptureCity) 'KCO_StorePreviousOwner' pre {
KCO_DestroyCity = city[0];
KCO_CityOwner = city[0].owner;
return CONTINUE;
}
HandleEvent(CaptureCity) 'KCO_KillCityOption' post {
city_t kcoOptCity;
int_t kcoOptPlayer;
location_t kcoOptCityLoc;
int_t kcoOptHomeCityIdx;
city_t kcoOptHomeCity;
location_t kcoOptHomeCityLoc;
int_t kcoOptHomeDist;
kcoOptCity = city[0];
kcoOptPlayer = player[0].owner;
kcoOptCityLoc = city[0].location;
if(KCO_CityOwner > -1 && kcoOptCity.population > 1) {
if(!IsHumanPlayer(player[0])) {
if(CityIsValid(kcoOptCity)) {
if(!CityHasAnyWonder(kcoOptCity)) {
if(kcoOptCity.owner == 0 && IsBarbFoundedCity(kcoOptCity)) { // always destroy barb settlements
KCO_KillCity(kcoOptCity);
}
else {
kcoOptHomeCityIdx = GetNearestCity(kcoOptCityLoc, kcoOptPlayer);
if(GetCityByIndex(kcoOptPlayer, kcoOptHomeCityIdx, kcoOptHomeCity)) {
if(CityIsValid(kcoOptHomeCity)) {
kcoOptHomeCityLoc = kcoOptHomeCity.location;
kcoOptHomeDist = Distance(kcoOptCityLoc, kcoOptHomeCityLoc);
}
}
if(player[0].government == GovernmentDB(GOVERNMENT_ABSOLUTE_MONARCHY)
|| player[0].government == GovernmentDB(GOVERNMENT_FASCISM)
|| player[0].government == GovernmentDB(GOVERNMENT_FUNDAMENTALISM)
|| player[0].government == GovernmentDB(GOVERNMENT_THEOCRACY)
|| player[0].government == GovernmentDB(GOVERNMENT_TYRANNY)
|| player[0].government == GovernmentDB(GOVERNMENT_EARLY_GANG)
|| player[0].government == GovernmentDB(GOVERNMENT_AUT_COLL)
|| player[0].government == GovernmentDB(GOVERNMENT_ADV_GANG)
) {
if(PlayerCityCount(kcoOptPlayer) >= (MOD_MAXCITIES[kcoOptPlayer] + (MOD_MAXCITIES[kcoOptPlayer] / 10))
|| (kcoOptHomeDist >= 10 && STL_FRUSTRATION[kcoOptPlayer] < 10)) {
// KCO_KillCity(city[0]);
Event:KillCity(city[0], 0, 0);
}
}
if(player[0].government == GovernmentDB(GOVERNMENT_ANARCHY)
|| player[0].government == GovernmentDB(GOVERNMENT_CITY_STATE)
|| player[0].government == GovernmentDB(GOVERNMENT_COMMUNISM)
|| player[0].government == GovernmentDB(GOVERNMENT_CORPORATE_REPUBLIC)
|| player[0].government == GovernmentDB(GOVERNMENT_DEMOCRACY)
|| player[0].government == GovernmentDB(GOVERNMENT_ECOTOPIA)
|| player[0].government == GovernmentDB(GOVERNMENT_MONARCHY)
|| player[0].government == GovernmentDB(GOVERNMENT_REPUBLIC)
|| player[0].government == GovernmentDB(GOVERNMENT_TECHNOCRACY)
|| player[0].government == GovernmentDB(GOVERNMENT_VIRTUAL_DEMOCRACY)
) {
if(PlayerCityCount(kcoOptPlayer) >= (MOD_MAXCITIES[kcoOptPlayer] + (MOD_MAXCITIES[kcoOptPlayer] / 10))
|| (kcoOptHomeDist >= 10 && STL_FRUSTRATION[kcoOptPlayer] < 10)) {
if(kcoOptHomeDist >= 10) {
KCO_LiberateCity(city[0]);
}
else {
// KCO_KillCity(city[0]);
Event:KillCity(city[0], 0, 0);
}
}
}
}
}
}
}
}
KCO_CityOwner = -1;
}
HandleEvent(KillCity) 'KCO_KillCityDiploConsequences' pre {
city_t kcoDipCity;
int_t kcoDipOffender;
int_t kcoDipVictim;
kcoDipCity = city[0];
kcoDipOffender = city[0].owner;
if(kcoDipCity == KCO_DestroyCity) {
LogRegardEvent(KCO_CityOwner, kcoDipOffender, -500, 0, ID_REGARD_EVENT_LOST_BATTLE, 50);
}
return CONTINUE;
}
////////////////////////////////////////////////////////////////////////////
// Destroy buildings script to allow for destruction of buildings due to conquest.
// By Dale
// Version 1.1 5-May-2001
////////////////////////////////////////////////////////////////////////////
///////////////////////////////////
// Capture City event
///////////////////////////////////
//HandleEvent(CaptureCity) 'DestroyBuildsOnCapture' pre {
// city_t ccdCity;
// int_t ccdCount;
// int_t ccdRand;
// ccdCity = city[0];
// if(CityIsValid(ccdCity)) {
// for(ccdCount = 0; ccdCount < 80; ccdCount = ccdCount + 1) {
// ccdRand = random(100);
// if(ccdRand < 50) {
// DestroyBuilding(ccdCity, ccdCount);
// }
// }
// }
// return CONTINUE;
//}
///////////////////////////////////
// Nuke City event
///////////////////////////////////
// possibly causes "BreadBasket"-crash with AE
//HandleEvent(NukeCity) 'DestroyBuildsOnNuke' pre {
// city_t ccdCity;
// int_t ccdCount;
// int_t ccdRand;
// ccdCity = city[0];
// if(CityIsValid(ccdCity)) {
// for(ccdCount = 0; ccdCount < 80; ccdCount = ccdCount + 1) {
// ccdRand = random(100);
// if(ccdRand < 75) {
// DestroyBuilding(ccdCity, ccdCount);
// }
// }
// }
// return CONTINUE;
//}
///////////////////////////////////////////////////////////////////
// SLIC2 Refugee trigger for CTP2v1.1 by Chris Whitaker (Gedrin) //
///////////////////////////////////////////////////////////////////
// possibly causes freeze, no idea why
//messagebox 'POP_FLEES_MSG' {
// Text(ID_POP_FLEES);
// Show();
//}
// Before CaptureCity(city_t, int_t<player>, int_t) has run move
// at most 1/4 it's pop rounddown to cities of the "owning player".
//HandleEvent(CaptureCity) 'Refugees' pre {
// city_t ccrCity;
// city_t ccrCity2;
// int_t ccrPopCount;
// int_t ccrCityCount;
// int_t ccrIndex;
// int_t ccrCityIdx;
// ccrCity = city[0];
// ccrPopCount = (ccrCity.population) / 4;
// ccrCityCount = Cities(ccrCity.owner);
// for(ccrIndex = 0; ccrIndex < ccrPopCount; ccrIndex = ccrIndex + 1) {
// Event:KillPop(ccrCity);
// }
// Message(player[0], 'POP_FLEES_MSG');
// // Message(player[1], 'POP_FLEES_MSG'); // index out of bounds ???
// ccrIndex = 0;
// while(ccrIndex < ccrPopCount) {
// ccrCityIdx = Random(ccrCityCount);
// if(GetCityByIndex(ccrCity.owner, ccrCityIdx, ccrCity2)) {
// if(CityIsValid(ccrCity2) && ccrCity2 != ccrCity) {
// AddPops(ccrCity2, 1);
// ccrIndex = ccrIndex + 1;
// }
// }
// }
// return CONTINUE;
//}