Images
Visible Wonders

Visible Wonders

This is just an implementation of The Immortal Wombat’s Visible Wonders script: "On the completion of certain wonders, a representation of them appears on the map next to the city in which they were built. This adds a bit of atmosphere to the game ..."

1The Script1

//--------------------------------------------------------------------------
// MoT Mod for CTP2 by BureauBert
// 1.0 BETA
// http://ctp2.free.fr/
//--------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////
// Map-visual wonders
// mod brought to you by The Immortal Wombat, aka. Ben Weaver
////////////////////////////////////////////////////////////////////////////

///////////////////////////////////
// Globals
///////////////////////////////////

// declared in main.slc

///////////////////////////////////
// Begin game initialisations
///////////////////////////////////

// InitVisibleWonders() in main.slc
// called from setup.slc

///////////////////////////////////
// Functions
///////////////////////////////////

// Common functions in main.slc

///////////////////////////////////
// The wonders
///////////////////////////////////

void_f IWW_DoGreatWall(city_t walledcity) {
        location_t iwwCityLoc;
        location_t iwwLoc;
        int_t iwwPlayer;
        int_t iwwTheWall;
        int_t iwwRand;
        int_t iwwCountA;
        int_t iwwCountB;
        int_t iwwCheck;

        iwwPlayer = walledcity.owner;
        iwwCityLoc = walledcity.location;
        iwwCheck = 1;

        for(iwwCountB = 4; iwwCountB < 7; iwwCountB = iwwCountB + 1){                // Make sure there are no wonders in the Wall gaps.
                if(iwwCountB != 5){
                        if(GetNeighbor(iwwCityLoc, iwwCountB, iwwLoc)) {
                                for(iwwCountA = 0; iwwCountA < IWW_WONDERTIMP.#; iwwCountA = iwwCountA + 1){
                                        if(TileHasImprovement(iwwLoc, IWW_WONDERTIMP[iwwCountA])){
                                                iwwCheck = 0;
                                        }
                                }
                        }
                }
        }
        if(iwwCheck > 0) {
                iwwTheWall = TerrainImprovementDB(TILEIMP_WONDER_GREAT_WALL_A);
                if(GetNeighbor(iwwCityLoc, 6, iwwLoc)) {
                        if(TerrainType(iwwLoc) == TerrainDB(TERRAIN_PLAINS)
                        || TerrainType(iwwLoc) == TerrainDB(TERRAIN_GRASSLAND)
                        || TerrainType(iwwLoc) == TerrainDB(TERRAIN_DESERT)
                        || TerrainType(iwwLoc) == TerrainDB(TERRAIN_MOUNTAIN)
                        || TerrainType(iwwLoc) == TerrainDB(TERRAIN_HILL)
                        || TerrainType(iwwLoc) == TerrainDB(TERRAIN_TUNDRA)
                        ) {
                                VIS_VisiStuffPlacement = 1;
                                GrantAdvance(iwwPlayer, AdvanceDB(ADVANCE_SUBNEURAL_ADS));
                                Event:CreateImprovement(iwwPlayer, iwwLoc, iwwTheWall, 0);
                                FinishImprovements(iwwLoc);
                        }
                        elseif(!IsSeaTerrain(iwwLoc) && !TileHasWonder(iwwLoc) && !TileHasCapital(iwwLoc) && !TileHasMonument(iwwLoc)) {
                                iwwRand = random(2);
                                if(iwwRand == 0){
                                        VIS_VisiStuffPlacement = 1;
                                        Terraform(iwwLoc, TerrainDB(TERRAIN_PLAINS));
                                        GrantAdvance(iwwPlayer, AdvanceDB(ADVANCE_SUBNEURAL_ADS));
                                        Event:CreateImprovement(iwwPlayer, iwwLoc, iwwTheWall, 0);       
                                        FinishImprovements(iwwLoc);
                                }
                                else {
                                        VIS_VisiStuffPlacement = 1;
                                        Terraform(iwwLoc, TerrainDB(TERRAIN_GRASSLAND));
                                        GrantAdvance(iwwPlayer, AdvanceDB(ADVANCE_SUBNEURAL_ADS));
                                        Event:CreateImprovement(iwwPlayer, iwwLoc, iwwTheWall, 0);       
                                        FinishImprovements(iwwLoc);
                                }
                        }
                }

                iwwTheWall = TerrainImprovementDB(TILEIMP_WONDER_GREAT_WALL_B);
                if(GetNeighbor(iwwCityLoc, 4, iwwLoc)) {
                        if(TerrainType(iwwLoc) == TerrainDB(TERRAIN_PLAINS)
                        || TerrainType(iwwLoc) == TerrainDB(TERRAIN_GRASSLAND)
                        || TerrainType(iwwLoc) == TerrainDB(TERRAIN_DESERT)
                        || TerrainType(iwwLoc) == TerrainDB(TERRAIN_MOUNTAIN)
                        || TerrainType(iwwLoc) == TerrainDB(TERRAIN_HILL)
                        || TerrainType(iwwLoc) == TerrainDB(TERRAIN_TUNDRA)
                        ) {
                                VIS_VisiStuffPlacement = 1;
                                GrantAdvance(iwwPlayer, AdvanceDB(ADVANCE_SUBNEURAL_ADS));
                                Event:CreateImprovement(iwwPlayer, iwwLoc, iwwTheWall, 0);       
                                FinishImprovements(iwwLoc);
                        }
                        elseif(!IsSeaTerrain(iwwLoc) && !TileHasWonder(iwwLoc) && !TileHasCapital(iwwLoc) && !TileHasMonument(iwwLoc)) {
                                iwwRand = random(2);
                                if(iwwRand == 0){
                                        VIS_VisiStuffPlacement = 1;
                                        Terraform(iwwLoc, TerrainDB(TERRAIN_PLAINS));
                                        GrantAdvance(iwwPlayer, AdvanceDB(ADVANCE_SUBNEURAL_ADS));
                                        Event:CreateImprovement(iwwPlayer, iwwLoc, iwwTheWall, 0);
                                        FinishImprovements(iwwLoc);
                                }
                                else {
                                        VIS_VisiStuffPlacement = 1;
                                        Terraform(iwwLoc, TerrainDB(TERRAIN_GRASSLAND));
                                        GrantAdvance(iwwPlayer, AdvanceDB(ADVANCE_SUBNEURAL_ADS));
                                        Event:CreateImprovement(iwwPlayer, iwwLoc, iwwTheWall, 0);       
                                        FinishImprovements(iwwLoc);
                                }
                        }
                }
        }
}

HandleEvent(CreateWonder) 'IWW_major_redevelopment_in_progress' post {
        int_t iwwStructure;
        int_t iwwPlayer;
        city_t iwwCity;
        location_t iwwCityLoc;
        int_t iwwCountA;
        int_t iwwCountB;
        int_t iwwVisible;
        int_t iwwWonder;
        location_t iwwLoc;
        location_t iwwWonderLoc;

        iwwCity = city[0];
        iwwPlayer = city[0].owner;
        iwwStructure = value[0].value;
        iwwCityLoc = city[0].location;
        iwwVisible = 0;

        // GWW if you are not using the great wall, delete from here:
        if(iwwStructure == WonderDB(WONDER_GREAT_WALL)) {
                IWW_DoGreatWall(city[0]);
        }
        //to here

        for(iwwCountA = 0; iwwCountA < IWW_VISIWONDER.#; iwwCountA = iwwCountA + 1) {
                if(iwwStructure == IWW_VISIWONDER[iwwCountA]) {
                        iwwWonder = IWW_WONDERTIMP[iwwCountA];
                        iwwVisible = 1;
                }
        }
        if(iwwVisible == 1) {
                int_t iwwCheck;
                int_t iwwTimp;
                int_t iwwRand;
                iwwWonderLoc = iwwCityLoc;                // null starting point
                                                        // Basic routine: find a 'flat' tile with no iwwTimps.
                for(iwwCountA = 7; iwwCountA > -1; iwwCountA = iwwCountA - 1) {
                        if(GetNeighbor(iwwCityLoc, iwwCountA, iwwLoc)) {
                                iwwTimp = 0;
                                if(TerrainType(iwwLoc) == TerrainDB(TERRAIN_PLAINS)
                                || TerrainType(iwwLoc) == TerrainDB(TERRAIN_GRASSLAND)
                                || TerrainType(iwwLoc) == TerrainDB(TERRAIN_DESERT)) {
                                        for(iwwCountB = 0; iwwCountB < MOD_NUMOFTILEIMPS; iwwCountB = iwwCountB + 1) {
                                                if(TileHasImprovement(iwwLoc, iwwCountB)){
                                                        iwwTimp = iwwTimp + 1;
                                                }
                                                if(TileHasWonder(iwwLoc) || TileHasCapital(iwwLoc)) {
                                                        iwwTimp = iwwTimp + 10;
                                                }
                                                if(HasGood(iwwLoc) > -1) {
                                                        iwwTimp = iwwTimp + 10;
                                                }
                                        }
                                        if(iwwTimp < 1) {
                                                iwwWonderLoc = iwwLoc;
                                                iwwCountA = -1;
                                        }
                                }
                        }
                }
                if(iwwWonderLoc == iwwCityLoc) {        // still...
                        iwwCheck = 0;
                        GetRandomNeighbor(iwwCityLoc, iwwLoc);
                        while(iwwCheck < 8) {
                                iwwTimp = 0;
                                if(IsMountainTerrain(iwwLoc) || IsSeaTerrain(iwwLoc) || TileHasWonder(iwwLoc) || TileHasCapital(iwwLoc) || TileHasMonument(iwwLoc) || HasGood(iwwLoc) > -1) {
                                        iwwTimp = iwwTimp + 1;
                                }
                                if(iwwTimp == 0){
                                        for(iwwCountA = 0; iwwCountA < MOD_NUMOFTILEIMPS; iwwCountA = iwwCountA + 1) {        // find a random location with
                                                if(TileHasImprovement(iwwLoc, iwwCountA)){                                // tile imps, cut them.
                                                        Event:CutImprovements(iwwLoc);
                                                }
                                        }
                                        iwwWonderLoc = iwwLoc;
                                        iwwCheck = 8;
                                }
                                else {
                                        GetRandomNeighbor(iwwCityLoc, iwwLoc);
                                        iwwCheck = iwwCheck + 1;
                                }
                        }
                        if(iwwWonderLoc != iwwCityLoc && !TileHasWonder(iwwWonderLoc) && !TileHasCapital(iwwWonderLoc) && !TileHasMonument(iwwLoc)) {
                                iwwRand = random(2);
                                if(iwwRand == 1) {
                                        Terraform(iwwWonderLoc, TerrainDB(TERRAIN_PLAINS));
                                } elseif(iwwRand==0){
                                        Terraform(iwwWonderLoc, TerrainDB(TERRAIN_GRASSLAND));
                                }
                        }
                }

                // By now, the only reason you would not have found a
                // place is if you are surrounded by mountains, water or wonders

                if(iwwWonderLoc != iwwCityLoc && !TileHasWonder(iwwWonderLoc) && !TileHasCapital(iwwWonderLoc)) {
                        VIS_VisiStuffPlacement = 1;
                        GrantAdvance(iwwPlayer, AdvanceDB(ADVANCE_SUBNEURAL_ADS));
                        Event:CreateImprovement(iwwPlayer, iwwWonderLoc, iwwWonder, 0);
                        FinishImprovements(iwwWonderLoc);
                        location[0] = iwwWonderLoc;
                }
        }
}                               

///////////////////////////////////
// Pillage Protection
///////////////////////////////////

HandleEvent(PillageOrder) 'WondersPillageProtectA' pre {
        location_t iwwLoc;

        iwwLoc = army[0].location;

        if(TileHasWonder(iwwLoc)) {
                return STOP;
        }
        else {
                return CONTINUE;
        }
}

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

        if(TileHasWonder(iwwLoc)) {
                return STOP;
        }
        else {
                return CONTINUE;
        }
}

HandleEvent(CutImprovements)'WondersPillageProtectC' pre {
        location_t iwwLoc;
       
        iwwLoc = location[0];

        if(TileHasWonder(iwwLoc)) {
                return STOP;
        }
        else {
                return CONTINUE;
        }
}

// prevent overbuilding of visible wonders
               
HandleEvent(CreateImprovement) 'WondersOverbuildProtection' pre {       
        if(TileHasWonder(location[0])) {
                return STOP;
        }
        return CONTINUE;
}