Diplomod
Based upon Diplomod Script v3.6 by Dale. Since AI-AI diplomacy has been fixed by the Apolyton Edition the script is no longer needed for this purpose. I am still using the parts that ensure the withdraw of troops upon agreement, though I am not sure if this is still needed.
The modified version also includes the map to allies-function provided by Pedrunn.
I have added a couple of diplomatic states and SLIC-routines to choose among them to make AI diplomacy a bit more sensible regarding their geo-strategic situation and political interests. This certainly needs some additions and refinement.
1The Script1
//--------------------------------------------------------------------------
// MoT Mod for CTP2 (Apolyton Edition) by BureauBert
// v1.1
// http://motmod.ctp2.info
//--------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////
// Diplomacy modifications
// by BureauBert
// Originally based upon the concepts of Diplomod by Dale.
// Since AI-AI diplomacy is now fixed in the source code of the Apolyton
// Edition, the remaining purpose of this script consists in making the AI
// consider the diplomatic states introduced with this Mod.
////////////////////////////////////////////////////////////////////////////
///////////////////////////////////
// Global variables
///////////////////////////////////
// declared in main.slc
///////////////////////////////////
// Messages
///////////////////////////////////
messagebox 'RisingNationalismMsg' {
Text(ID_RISING_NATIONALISM);
MessageType("DIPLOMATIC");
Show();
}
///////////////////////////////////
// Ensure AI -> AI Diplo state
///////////////////////////////////
HandleEvent(InitDiplomaticState) 'DIP_InitDiploState' pre {
int_t dipWe;
int_t dipThey;
int_t dipPer;
dipWe = player[0].owner;
dipThey = player[1].owner;
if(GetCurrentRound() > 1) {
DisableTrigger('DIP_InitDiploState');
}
else {
if(!IsHumanPlayer(dipWe) && !IsHumanPlayer(dipThey) && dipWe != 0 && dipThey != 0 && dipWe != dipThey) {
dipPer = GetPersonalityType(dipWe);
if(dipPer == PersonalityDB(PERSONALITY_GHANDI)) {
DIP_diplostate = DiplomacyDB(DIPLOMACY_AI_AI_SUCKUP);
ConsiderDiplomaticState(player[0], player[1], 9999, DIP_diplostate, -1,-1,-1);
ChangeDiplomaticState(player[0], player[1]);
}
elseif(dipPer == PersonalityDB(PERSONALITY_STALIN)) {
DIP_diplostate = DiplomacyDB(DIPLOMACY_AI_AI_WARMONGER);
ConsiderDiplomaticState(player[0], player[1], 9999, DIP_diplostate, -1,-1,-1);
ChangeDiplomaticState(player[0], player[1]);
}
elseif(dipPer == PersonalityDB(PERSONALITY_CEASAR)) {
DIP_diplostate = DiplomacyDB(DIPLOMACY_AI_AI_NORMAL);
ConsiderDiplomaticState(player[0], player[1], 9999, DIP_diplostate, -1,-1,-1);
ChangeDiplomaticState(player[0], player[1]);
}
elseif(dipPer == PersonalityDB(PERSONALITY_DEGAULLE)) {
DIP_diplostate = DiplomacyDB(DIPLOMACY_AI_AI_SUCKUP);
ConsiderDiplomaticState(player[0], player[1], 9999, DIP_diplostate, -1,-1,-1);
ChangeDiplomaticState(player[0], player[1]);
}
elseif(dipPer == PersonalityDB(PERSONALITY_MEDICI)) {
DIP_diplostate = DiplomacyDB(DIPLOMACY_AI_AI_NORMAL);
ConsiderDiplomaticState(player[0], player[1], 9999, DIP_diplostate, -1,-1,-1);
ChangeDiplomaticState(player[0], player[1]);
}
elseif(dipPer == PersonalityDB(PERSONALITY_TELLER)) {
DIP_diplostate = DiplomacyDB(DIPLOMACY_AI_AI_NORMAL);
ConsiderDiplomaticState(player[0], player[1], 9999, DIP_diplostate, -1,-1,-1);
ChangeDiplomaticState(player[0], player[1]);
}
elseif(dipPer == PersonalityDB(PERSONALITY_STRANGELOVE)) {
DIP_diplostate = DiplomacyDB(DIPLOMACY_AI_AI_WARMONGER);
ConsiderDiplomaticState(player[0], player[1], 9999, DIP_diplostate, -1,-1,-1);
ChangeDiplomaticState(player[0], player[1]);
}
elseif(dipPer == PersonalityDB(PERSONALITY_CALLENBACH)) {
DIP_diplostate = DiplomacyDB(DIPLOMACY_AI_AI_NORMAL);
ConsiderDiplomaticState(player[0], player[1], 9999, DIP_diplostate, -1,-1,-1);
ChangeDiplomaticState(player[0], player[1]);
}
elseif(dipPer == PersonalityDB(PERSONALITY_NADER)) {
DIP_diplostate = DiplomacyDB(DIPLOMACY_AI_AI_SUCKUP);
ConsiderDiplomaticState(player[0], player[1], 9999, DIP_diplostate, -1,-1,-1);
ChangeDiplomaticState(player[0], player[1]);
}
}
}
return CONTINUE;
}
///////////////////////////////////
// Consider next diplomatic state
///////////////////////////////////
HandleEvent(NextDiplomaticState) 'DIP_NextDiploState' pre {
int_t dipPer;
int_t dipCheckPlayer;
int_t dipPrio;
int_t dipCapitalIdx;
city_t dipCapital;
location_t dipCapitalLoc;
int_t dipMinDist;
int_t dipCheckCapitalIdx;
city_t dipCheckCapital;
location_t dipCheckCapitalLoc;
int_t dipCheckDistance;
int_t dipFirstComp;
DIP_We = player[0].owner;
DIP_They = player[1].owner;
dipPrio = 0;
if(!IsHumanPlayer(DIP_We) && DIP_We != 0 && DIP_They != 0 && IsPlayerAlive(DIP_They) && DIP_We != DIP_They) {
// if we are at war, try to find allies:
if(AtWarCount(DIP_We) > 0) {
if(HasAdvance(DIP_We, AdvanceDB(ADVANCE_AGE_OF_REASON)) && HasAdvance(DIP_They, AdvanceDB(ADVANCE_AGE_OF_REASON))) {
if(GetEffectiveRegard(DIP_We, DIP_They) > 300 // Regard level: neutral
&& GetEffectiveRegard(DIP_They, DIP_We) > 300 // Regard level: neutral
&& player[0].government == player[1].government) {
DIP_diplostate = DiplomacyDB(DIPLOMACY_POL_MILPACT);
dipPrio = 1000;
}
}
}
// post-nationalism:
if(dipPrio < 1000) {
if(HasAdvance(DIP_We, AdvanceDB(ADVANCE_COMPUTER)) && HasAdvance(DIP_They, AdvanceDB(ADVANCE_COMPUTER))) {
DIP_diplostate = DiplomacyDB(DIPLOMACY_GLOBALIZATION);
dipPrio = 1000;
}
}
if(dipPrio < 1000) {
if(HasAdvance(DIP_We, AdvanceDB(ADVANCE_AGE_OF_REASON)) && HasAdvance(DIP_They, AdvanceDB(ADVANCE_AGE_OF_REASON))) {
if(player[0].government == player[1].government) {
DIP_diplostate = DiplomacyDB(DIPLOMACY_MAKE_FRIEND);
dipPrio = 1000;
}
}
}
// nationalism:
if(dipPrio < 1000) {
if(HasAdvance(DIP_We, AdvanceDB(ADVANCE_CITIZENSHIP)) && !HasAdvance(DIP_We, AdvanceDB(ADVANCE_NATIONALISM))) {
if(STL_FRUSTRATION[DIP_We] > 15) {
dipCapitalIdx = GetCapital(DIP_We);
if(GetCityByIndex(DIP_We, dipCapitalIdx, dipCapital)) {
dipCapitalLoc = dipCapital.location;
dipMinDist = 9999;
for(dipCheckPlayer = 1; dipCheckPlayer < g.max_players; dipCheckPlayer = dipCheckPlayer + 1) {
if(IsPlayerAlive(dipCheckPlayer)) {
dipCheckCapitalIdx = GetCapital(dipCheckPlayer);
if(GetCityByIndex(dipCheckPlayer, dipCheckCapitalIdx, dipCheckCapital)) {
dipCheckCapitalLoc = dipCheckCapital.location;
if(GetContinent(dipCapitalLoc) == GetContinent(dipCheckCapitalLoc)) {
dipCheckDistance = Distance(dipCapitalLoc, dipCheckCapitalLoc);
if(dipCheckDistance < dipMinDist) {
dipMinDist = dipCheckDistance;
dipFirstComp = dipCheckCapital.owner;
}
}
}
}
}
if(dipFirstComp == DIP_They) {
DIP_diplostate = DiplomacyDB(DIPLOMACY_NATIONALISM_LIGHT);
dipPrio = 1000;
if(IsHumanPlayer(dipFirstComp)) {
Message(player[1], 'RisingNationalismMsg');
}
}
}
}
}
}
if(dipPrio < 1000) {
if(HasAdvance(DIP_We, AdvanceDB(ADVANCE_NATIONALISM))) {
if(STL_FRUSTRATION[DIP_We] > 15) {
dipCapitalIdx = GetCapital(DIP_We);
if(GetCityByIndex(DIP_We, dipCapitalIdx, dipCapital)) {
dipCapitalLoc = dipCapital.location;
dipMinDist = 9999;
for(dipCheckPlayer = 1; dipCheckPlayer < g.max_players; dipCheckPlayer = dipCheckPlayer + 1) {
if(IsPlayerAlive(dipCheckPlayer)) {
dipCheckCapitalIdx = GetCapital(dipCheckPlayer);
if(GetCityByIndex(dipCheckPlayer, dipCheckCapitalIdx, dipCheckCapital)) {
dipCheckCapitalLoc = dipCheckCapital.location;
if(GetContinent(dipCapitalLoc) == GetContinent(dipCheckCapitalLoc)) {
dipCheckDistance = Distance(dipCapitalLoc, dipCheckCapitalLoc);
if(dipCheckDistance < dipMinDist) {
dipMinDist = dipCheckDistance;
dipFirstComp = dipCheckCapital.owner;
}
}
}
}
}
if(dipFirstComp == DIP_They) {
DIP_diplostate = DiplomacyDB(DIPLOMACY_NATIONALISM_HEAVY);
dipPrio = 1000;
if(IsHumanPlayer(dipFirstComp)) {
Message(player[1], 'RisingNationalismMsg');
}
}
}
}
}
}
if(dipPrio > 0) {
ConsiderDiplomaticState(player[0], player[1], dipPrio, DIP_diplostate, -1,-1,-1);
ChangeDiplomaticState(player[0], player[1]);
}
}
return CONTINUE;
}
////////////////////////////////////////////////////////////////////////////
// Map to Allies Code
// by Pedrunn
// ALPHA
////////////////////////////////////////////////////////////////////////////
HandleEvent(BeginTurn) 'GiveMapToAllies' post {
int_t mapCount;
int_t mapPlayer;
mapPlayer = player[0].owner;
for(mapCount = 1; mapCount < g.max_players; mapCount = mapCount + 1){
if(IsPlayerAlive(mapCount) && mapPlayer != mapCount){
if(HasAgreement(mapPlayer, mapCount, 36) // 36 = Military Pact
|| HasAgreement(mapPlayer, mapCount, 38) // 38 = Alliance
) {
Event:GiveMap(mapPlayer, mapCount);
}
}
}
}