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.

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