Images
Diplomod

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.

The Script

//--------------------------------------------------------------------------
// 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);			
			}
		}	
	}
}