Images
City Ruins

City Ruins

In modern days destroyed cities will no longer just disappear from the map but their ruins will remain.

If a city is destroyed immediately upon capture, the ruins will belong to the previous owner thereby preserving his territory.

1The Script1

//--------------------------------------------------------------------------
// MoT Mod for CTP2 (Apolyton Edition) by BureauBert
// v1.1
// http://motmod.ctp2.info
//--------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////
// City Ruins code
// by BureauBert
// When a city is destroyed it does not just disappear from the map -- its
// ruins will remain and the surrounding territory will be preserved for
// its last owner.
////////////////////////////////////////////////////////////////////////////

///////////////////////////////////
// Global variables
///////////////////////////////////

// declared in main.slc

///////////////////////////////////
// Event Handlers
///////////////////////////////////

// store 'previous' owner and location pre capture

HandleEvent(CaptureCity) 'ButTheRuinsAreMine' pre {
        CIR_PrevOwner = city[0].owner;
        CIR_PrevLoc = city[0].location;
        return CONTINUE;
}

// store 'previous' owner and location pre gift

HandleEvent(GiveCity) 'IfYouDestoyItIGetTheRuins' pre {
        CIR_PrevOwner = city[0].owner;
        CIR_PrevLoc = city[0].location;
        return CONTINUE;
}

// store 'previous' and 'current' owner pre park creation

HandleEvent(CreatePark) 'ItsMyCityItsMyPark' pre {
        CIR_PrevOwner = city[0].owner;
        CIR_PrevLoc = city[0].location;
        CIR_CurrOwner = city[0].owner;
        CIR_CurrLoc = city[0].location;
        return CONTINUE;
}

// before a city is killed ...

HandleEvent(KillCity) 'WhatWeNeedToKnowAboutKilledCity' pre {
        CIR_CurrOwner = city[0].owner;
        CIR_CurrLoc = city[0].location;
        return CONTINUE;
}

// after a city is killed ...

HandleEvent(KillCity) 'DestroyedToRuins' post {
        int_t cirTimpToBuild;

        if(CIR_PrevOwner > 0) {
                if(IsPlayerAlive(CIR_PrevOwner)) {
                        if(HasAdvance(CIR_PrevOwner, AdvanceDB(ADVANCE_ADV_URBAN_PLANNING))) {
                                cirTimpToBuild = TerrainImprovementDB(TILEIMP_CITY_RUINS);
                        }
                        else {
                                cirTimpToBuild = TerrainImprovementDB(TILEIMP_CITY_RUINS_ANCIENT);
                        }
                }
                else {
                        cirTimpToBuild = TerrainImprovementDB(TILEIMP_CITY_RUINS_ANCIENT);
                }
                if(CIR_CurrLoc == CIR_PrevLoc) {
                        if(IsPlayerAlive(CIR_PrevOwner) && PlayerCityCount(CIR_PrevOwner) > 1) {
                                VIS_VisiStuffPlacement = 1;
                                GrantAdvance(CIR_PrevOwner, AdvanceDB(ADVANCE_SUBNEURAL_ADS));
                                Event:CreateImprovement(CIR_PrevOwner, CIR_CurrLoc, cirTimpToBuild, 0);
                                FinishImprovements(CIR_CurrLoc);
                        }
                }
                if(CIR_CurrLoc != CIR_PrevLoc) {
                        if(CIR_CurrOwner > 0 && IsPlayerAlive(CIR_CurrOwner) && PlayerCityCount(CIR_CurrOwner) > 1) {
                                VIS_VisiStuffPlacement = 1;
                                GrantAdvance(CIR_CurrOwner, AdvanceDB(ADVANCE_SUBNEURAL_ADS));
                                Event:CreateImprovement(CIR_CurrOwner, CIR_CurrLoc, cirTimpToBuild, 0);
                                FinishImprovements(CIR_CurrLoc);
                        }
                }
        }
}

// before a city is disbanded ...

HandleEvent(DisbandCity) 'WhatWeNeedToKnowAboutDisbandedCity' pre {
        CIR_CurrOwner = city[0].owner;
        CIR_CurrLoc = city[0].location;
        return CONTINUE;
}

// after a city is disbanded

HandleEvent(DisbandCity) 'DisbandedToRuins' post {
        int_t cirTimpToBuild;

        if(CIR_PrevOwner > 0) {
                if(IsPlayerAlive(CIR_PrevOwner)) {
                        if(HasAdvance(CIR_PrevOwner, AdvanceDB(ADVANCE_ADV_URBAN_PLANNING))) {
                                cirTimpToBuild = TerrainImprovementDB(TILEIMP_CITY_RUINS);
                        }
                        else {
                                cirTimpToBuild = TerrainImprovementDB(TILEIMP_CITY_RUINS_ANCIENT);
                        }
                }
                else {
                        cirTimpToBuild = TerrainImprovementDB(TILEIMP_CITY_RUINS_ANCIENT);
                }

                // if the city is disbanded immediately upon capture ...

                if(IsPlayerAlive(CIR_PrevOwner) && PlayerCityCount(CIR_PrevOwner) > 1 && CIR_CurrLoc == CIR_PrevLoc) {
                        VIS_VisiStuffPlacement = 1;
                        GrantAdvance(CIR_PrevOwner, AdvanceDB(ADVANCE_SUBNEURAL_ADS));
                        Event:CreateImprovement(CIR_PrevOwner, CIR_CurrLoc, cirTimpToBuild, 0);
                        FinishImprovements(CIR_CurrLoc);
                }

                // if the city is not disbanded immediately upon capture ...

                if(CIR_CurrOwner > 0 && IsPlayerAlive(CIR_CurrOwner) && PlayerCityCount(CIR_CurrOwner) > 1 && CIR_CurrLoc != CIR_PrevLoc) {
                        VIS_VisiStuffPlacement = 1;
                        GrantAdvance(CIR_CurrOwner, AdvanceDB(ADVANCE_SUBNEURAL_ADS));
                        Event:CreateImprovement(CIR_CurrOwner, CIR_CurrLoc, cirTimpToBuild, 0);
                        FinishImprovements(CIR_CurrLoc);
                }
        }
}

// these are already ruins, so just leave them alone ...

HandleEvent(PillageOrder) 'RuinsPillageProtectionA' pre {
        location_t cirTmpLoc;

        cirTmpLoc = army[0].location;

        if(TileHasImprovement(cirTmpLoc, TerrainImprovementDB(TILEIMP_CITY_RUINS))
        || TileHasImprovement(cirTmpLoc, TerrainImprovementDB(TILEIMP_CITY_RUINS_ANCIENT))
        || TileHasImprovement(cirTmpLoc, TerrainImprovementDB(TILEIMP_RUINS))) {
                return STOP;
        }
        else {
                return CONTINUE;
        }
}

HandleEvent(PillageUnit) 'RuinsPillageProtectionB' pre {
        location_t cirTmpLoc;
       
        cirTmpLoc = unit[0].location;

        if(TileHasImprovement(cirTmpLoc, TerrainImprovementDB(TILEIMP_CITY_RUINS))
        || TileHasImprovement(cirTmpLoc, TerrainImprovementDB(TILEIMP_CITY_RUINS_ANCIENT))
        || TileHasImprovement(cirTmpLoc, TerrainImprovementDB(TILEIMP_RUINS))) {
                return STOP;
        }
        else {
                return CONTINUE;
        }
}

// end turn: reset owner holding variables, just for being on the safe side ...
// subneural ads already being removed by MoT_s_visiwonders.slc every BeginTurn

HandleEvent(EndTurn) 'ResetCityRuinsVars' pre {
        CIR_PrevOwner = -1;
        CIR_PrevLoc = CIR_EmptyLoc;
        CIR_CurrOwner = -1;
        CIR_CurrLoc = CIR_EmptyLoc;
        return CONTINUE;
}