//////////////////////////////////////////////////////////////////////////////////////////////// // // 1) City Expansion v2.0 by BlueO and Pedrunn // // Cities expand with tile improvements and not goods anymore and sea cities also expand // // ExpandCity Fuction: // Given the location of the city 'cityLoc', fuction will attempt to fill the 'numOfType' of the subcity 'tileType' // around the city. The 'owner' parameter ensures that the tiles belong to the city owner. // // Fuction begins by searching all surrounding tiles 1 radius away from the city and look for proper tiles to put // the new subcity tile 'tileType' into. If it fails to find such a tile 1 radius away, it'll look 2 radius away, // then 3, and finally 4 radius away. // If it cannot put in all the subcity tiles, then that means there are no more room for the city to expand. // There fore the city cant grow. // // ReplaceTile Fuction: // // Will search through the tiles with certain 'range' and 'direction' starting from 'checkLoc' for player 'owner'. // If applicable terrain type is found for 'checkType', that terrain will be replaced accordingly. // The 'newType' parameter determines what to replace. // ('NewType' == 1) Small City // ('NewType' == 2) Medium City // ('NewType' == 3) Big City // // If tiles are placed, returns 1. // If tiles are not placed, returns 0. // // ('addDelete' == 0) Upgrades tile Improvement // ('addDelete' == 1) adds the land city // ('addDelete' == 2) reduces a city // ('addDelete' == 10) kill a city // ////////////////////////////////////////////////////////////////////////////////////////////////// int_t DontReduce; int_t WallWasBuilt; int_t ExpansionPlacement; location_t DeadCityLoc[]; int_t DeadCityRound[]; int_t CanCutDeadCities; int_f TileHasWonder(location_t tmpLoc) { if(TileHasImprovement(tmpLoc, TerrainImprovementDB(TILEIMP_WONDER_CODE_OF_HAMMURABI)) || TileHasImprovement(tmpLoc, TerrainImprovementDB(TILEIMP_WONDER_COLISEUM)) || TileHasImprovement(tmpLoc, TerrainImprovementDB(TILEIMP_WONDER_EMPIRE_STATE_BUILDING)) || TileHasImprovement(tmpLoc, TerrainImprovementDB(TILEIMP_WONDER_FIELD_DYNAMICS_LABORATORY)) || TileHasImprovement(tmpLoc, TerrainImprovementDB(TILEIMP_WONDER_GLOBESAT)) || TileHasImprovement(tmpLoc, TerrainImprovementDB(TILEIMP_WONDER_HAGIA_SOPHIA)) || TileHasImprovement(tmpLoc, TerrainImprovementDB(TILEIMP_WONDER_HANGING_GARDENS)) || TileHasImprovement(tmpLoc, TerrainImprovementDB(TILEIMP_WONDER_HOLLYWOOD)) || TileHasImprovement(tmpLoc, TerrainImprovementDB(TILEIMP_WONDER_MECCA)) || TileHasImprovement(tmpLoc, TerrainImprovementDB(TILEIMP_WONDER_PYRAMIDS)) || TileHasImprovement(tmpLoc, TerrainImprovementDB(TILEIMP_WONDER_STONEHENGE)) || TileHasImprovement(tmpLoc, TerrainImprovementDB(TILEIMP_WONDER_TEMPLE_OF_SOLOMON)) || TileHasImprovement(tmpLoc, TerrainImprovementDB(TILEIMP_WONDER_HANGING_GARDENS)) || TileHasImprovement(tmpLoc, TerrainImprovementDB(TILEIMP_WONDER_TEMPLE_OF_ZEUS)) || TileHasImprovement(tmpLoc, TerrainImprovementDB(TILEIMP_WONDER_THE_AGENCY)) || TileHasImprovement(tmpLoc, TerrainImprovementDB(TILEIMP_WONDER_HADRIANS_WALL_A)) || TileHasImprovement(tmpLoc, TerrainImprovementDB(TILEIMP_WONDER_HADRIANS_WALL_B))) { return 1; } else { return 0; } } int_f TileHasCity(location_t tmpLoc) { if(TileHasImprovement(tmpLoc, TerrainImprovementDB(TILEIMP_ANCIENT_CITY_ONE)) || TileHasImprovement(tmpLoc, TerrainImprovementDB(TILEIMP_MEDIEVAL_CITY_ONE)) || TileHasImprovement(tmpLoc, TerrainImprovementDB(TILEIMP_MODERN_CITY_ONE)) || TileHasImprovement(tmpLoc, TerrainImprovementDB(TILEIMP_MODERN_CITY_TWO)) || TileHasImprovement(tmpLoc, TerrainImprovementDB(TILEIMP_MODERN_CITY_THREE)) || TileHasImprovement(tmpLoc, TerrainImprovementDB(TILEIMP_GENETIC_CITY_ONE)) || TileHasImprovement(tmpLoc, TerrainImprovementDB(TILEIMP_GENETIC_CITY_TWO)) || TileHasImprovement(tmpLoc, TerrainImprovementDB(TILEIMP_FUTURE_CITY_ONE)) || TileHasImprovement(tmpLoc, TerrainImprovementDB(TILEIMP_FUTURE_CITY_TWO)) || TileHasImprovement(tmpLoc, TerrainImprovementDB(TILEIMP_SEA_CITY_ONE))) { return 1; } else { return 0; } } int_f TileHasDeadCity(location_t tmpLoc) { if(TileHasImprovement(tmpLoc, TerrainImprovementDB(TILEIMP_ANCIENT_CITY_DEAD)) || TileHasImprovement(tmpLoc, TerrainImprovementDB(TILEIMP_MODERN_CITY_DEAD)) || TileHasImprovement(tmpLoc, TerrainImprovementDB(TILEIMP_GENETIC_CITY_DEAD)) || TileHasImprovement(tmpLoc, TerrainImprovementDB(TILEIMP_FUTURE_CITY_DEAD)) || TileHasImprovement(tmpLoc, TerrainImprovementDB(TILEIMP_SEA_CITY_DEAD))) { return 1; } else { return 0; } } int_f PlaceAncientCity(int_t owner, location_t checkLoc, int_t range, int_t direction, int_t newType, int_t addDelete) { location_t tmpLoc; location_t tmp2Loc; int_t searchDirection; int_t TType; int_t count; int_t sucess; tmpLoc = checkLoc; count = range; // Searching through the tiles, clockwise. if (direction == 0) { // searchDirection = 4; } // NORTH if (direction == 1) { // 0 searchDirection = 4; } // 3 1 if (direction == 2) { // WEST 5 + 2 EAST searchDirection = 6; } // 6 4 if (direction == 3) { // 7 searchDirection = 1; } // SOUTH if (direction == 4) { // searchDirection = 6; } if (direction == 5) { searchDirection = 1; } if (direction == 6) { searchDirection = 3; } if (direction == 7) { searchDirection = 3; } while (count > 0) { TType = TerrainType(tmpLoc); if (cellOwner(tmpLoc) == owner && addDelete == 10) { if(TileHasImprovement(tmpLoc, TerrainImprovementDB(TILEIMP_ANCIENT_CITY_ONE))) { ExpansionPlacement = 1; GrantAdvance(owner, AdvanceDB(ADVANCE_SUBNEURAL_ADS)); Event:CreateImprovement(owner, tmpLoc, TerrainImprovementDB(TILEIMP_ANCIENT_CITY_DEAD), 0); return 1; } elseif(TileHasImprovement(tmpLoc, TerrainImprovementDB(TILEIMP_SEA_CITY_ONE))) { ExpansionPlacement = 1; GrantAdvance(owner, AdvanceDB(ADVANCE_SUBNEURAL_ADS)); Event:CreateImprovement(owner, tmpLoc, TerrainImprovementDB(TILEIMP_SEA_CITY_DEAD), 0); return 1; } } if (cellOwner(tmpLoc) == owner && addDelete == 2) { if(TileHasCity(tmpLoc)) { Event: CutImprovements(tmpLoc); return 1; } } if (newType == 1 && cellOwner(tmpLoc) == owner && addDelete == 1 && !TileHasImprovement(tmpLoc, TerrainImprovementDB(TILEIMP_ANCIENT_CITY_ONE)) && TileHasWonder(tmpLoc) == 0) { if (TType == TerrainDB(TERRAIN_FOREST) || TType == TerrainDB(TERRAIN_JUNGLE) || TType == TerrainDB(TERRAIN_SWAMP)){ Terraform(tmpLoc, TerrainDB(TERRAIN_PLAINS)); ExpansionPlacement = 1; GrantAdvance(owner, AdvanceDB(ADVANCE_SUBNEURAL_ADS)); Event:CreateImprovement(owner,tmpLoc,TerrainImprovementDB(TILEIMP_ANCIENT_CITY_ONE),0); return 1; } elseif (TType == TerrainDB(TERRAIN_GRASSLAND) || TType == TerrainDB(TERRAIN_PLAINS) || TType == TerrainDB(TERRAIN_DESERT) || TType == TerrainDB(TERRAIN_TUNDRA) || TType == TerrainDB(TERRAIN_HILL) || TType == TerrainDB(TERRAIN_BROWN_HILL)) { ExpansionPlacement = 1; GrantAdvance(owner, AdvanceDB(ADVANCE_SUBNEURAL_ADS)); Event:CreateImprovement(owner,tmpLoc,TerrainImprovementDB(TILEIMP_ANCIENT_CITY_ONE),0); return 1; } elseif (TType == TerrainDB(TERRAIN_WATER_DEEP) || TType == TerrainDB(TERRAIN_WATER_TRENCH) || TType == TerrainDB(TERRAIN_WATER_RIFT)) { ExpansionPlacement = 1; GrantAdvance(owner, AdvanceDB(ADVANCE_SUBNEURAL_ADS)); Event:CreateImprovement(owner,tmpLoc, TerrainImprovementDB(TILEIMP_SEA_CITY_ONE),0 ); return 1; } } GetNeighbor(tmpLoc, searchDirection, tmp2Loc); tmpLoc = tmp2Loc; count = count - 1; } return sucess; } int_f PlaceMedievalCity(int_t owner, location_t checkLoc, int_t range, int_t direction, int_t newType, int_t addDelete) { location_t tmpLoc; location_t tmp2Loc; int_t searchDirection; int_t TType; int_t count; int_t sucess; tmpLoc = checkLoc; count = range; // Searching through the tiles, clockwise. if (direction == 0) { // searchDirection = 4; } // NORTH if (direction == 1) { // 0 searchDirection = 4; } // 3 1 if (direction == 2) { // WEST 5 + 2 EAST searchDirection = 6; } // 6 4 if (direction == 3) { // 7 searchDirection = 1; } // SOUTH if (direction == 4) { // searchDirection = 6; } if (direction == 5) { searchDirection = 1; } if (direction == 6) { searchDirection = 3; } if (direction == 7) { searchDirection = 3; } while (count > 0) { TType = TerrainType(tmpLoc); if (cellOwner(tmpLoc) == owner && addDelete == 10) { if(TileHasImprovement(tmpLoc, TerrainImprovementDB(TILEIMP_ANCIENT_CITY_ONE)) || TileHasImprovement(tmpLoc, TerrainImprovementDB(TILEIMP_MEDIEVAL_CITY_ONE))) { GrantAdvance(owner, AdvanceDB(ADVANCE_SUBNEURAL_ADS)); ExpansionPlacement = 1; Event:CreateImprovement(owner, tmpLoc, TerrainImprovementDB(TILEIMP_ANCIENT_CITY_DEAD), 0); return 1; } elseif(TileHasImprovement(tmpLoc, TerrainImprovementDB(TILEIMP_SEA_CITY_ONE))) { GrantAdvance(owner, AdvanceDB(ADVANCE_SUBNEURAL_ADS)); ExpansionPlacement = 1; Event:CreateImprovement(owner, tmpLoc, TerrainImprovementDB(TILEIMP_SEA_CITY_DEAD), 0); return 1; } } if (cellOwner(tmpLoc) == owner && addDelete == 2) { if(TileHasCity(tmpLoc)) { Event: CutImprovements(tmpLoc); return 1; } } if (newType == 1 && cellOwner(tmpLoc) == owner && addDelete == 1 && !TileHasImprovement(tmpLoc, TerrainImprovementDB(TILEIMP_MEDIEVAL_CITY_ONE)) && TileHasWonder(tmpLoc) == 0) { if (TType == TerrainDB(TERRAIN_FOREST) || TType == TerrainDB(TERRAIN_JUNGLE) || TType == TerrainDB(TERRAIN_SWAMP)){ Terraform(tmpLoc, TerrainDB(TERRAIN_PLAINS)); ExpansionPlacement = 1; GrantAdvance(owner, AdvanceDB(ADVANCE_SUBNEURAL_ADS)); Event:CreateImprovement(owner,tmpLoc,TerrainImprovementDB(TILEIMP_MEDIEVAL_CITY_ONE),0 ); return 1; } elseif (TType == TerrainDB(TERRAIN_GRASSLAND) || TType == TerrainDB(TERRAIN_PLAINS) || TType == TerrainDB(TERRAIN_DESERT) || TType == TerrainDB(TERRAIN_TUNDRA) || TType == TerrainDB(TERRAIN_HILL) || TType == TerrainDB(TERRAIN_BROWN_HILL)) { ExpansionPlacement = 1; GrantAdvance(owner, AdvanceDB(ADVANCE_SUBNEURAL_ADS)); Event:CreateImprovement(owner,tmpLoc,TerrainImprovementDB(TILEIMP_MEDIEVAL_CITY_ONE),0 ); return 1; } elseif (TType == TerrainDB(TERRAIN_WATER_DEEP) || TType == TerrainDB(TERRAIN_WATER_TRENCH) || TType == TerrainDB(TERRAIN_WATER_RIFT)) { ExpansionPlacement = 1; GrantAdvance(owner, AdvanceDB(ADVANCE_SUBNEURAL_ADS)); Event:CreateImprovement(owner,tmpLoc, TerrainImprovementDB(TILEIMP_SEA_CITY_ONE),0 ); return 1; } } if (cellOwner(tmpLoc) == owner && addDelete == 0) { if (TileHasImprovement(tmpLoc, TerrainImprovementDB(TILEIMP_ANCIENT_CITY_ONE))) { ExpansionPlacement = 1; GrantAdvance(owner, AdvanceDB(ADVANCE_SUBNEURAL_ADS)); Event:CreateImprovement(owner,tmpLoc, TerrainImprovementDB(TILEIMP_MEDIEVAL_CITY_ONE),0 );// Create Railroad return 1; } } GetNeighbor(tmpLoc, searchDirection, tmp2Loc); tmpLoc = tmp2Loc; count = count - 1; } return 0; } int_f PlaceModernCity(int_t owner, location_t checkLoc, int_t range, int_t direction, int_t newType, int_t addDelete) { location_t tmpLoc; location_t tmp2Loc; int_t searchDirection; int_t TType; int_t count; int_t sucess; tmpLoc = checkLoc; count = range; // Searching through the tiles, clockwise. if (direction == 0) { // searchDirection = 4; } // NORTH if (direction == 1) { // 0 searchDirection = 4; } // 3 1 if (direction == 2) { // WEST 5 + 2 EAST searchDirection = 6; } // 6 4 if (direction == 3) { // 7 searchDirection = 1; } // SOUTH if (direction == 4) { // searchDirection = 6; } if (direction == 5) { searchDirection = 1; } if (direction == 6) { searchDirection = 3; } if (direction == 7) { searchDirection = 3; } while (count > 0) { TType = TerrainType(tmpLoc); if (newType == 1 && cellOwner(tmpLoc) == owner && addDelete == 10) { if(TileHasImprovement(tmpLoc, TerrainImprovementDB(TILEIMP_ANCIENT_CITY_ONE)) || TileHasImprovement(tmpLoc, TerrainImprovementDB(TILEIMP_MEDIEVAL_CITY_ONE))) { ExpansionPlacement = 1; GrantAdvance(owner, AdvanceDB(ADVANCE_SUBNEURAL_ADS)); Event:CreateImprovement(owner, tmpLoc, TerrainImprovementDB(TILEIMP_ANCIENT_CITY_DEAD), 0); return 1; } elseif(TileHasImprovement(tmpLoc, TerrainImprovementDB(TILEIMP_MODERN_CITY_ONE)) || TileHasImprovement(tmpLoc, TerrainImprovementDB(TILEIMP_MODERN_CITY_TWO)) || TileHasImprovement(tmpLoc, TerrainImprovementDB(TILEIMP_MODERN_CITY_THREE))) { ExpansionPlacement = 1; GrantAdvance(owner, AdvanceDB(ADVANCE_SUBNEURAL_ADS)); Event:CreateImprovement(owner, tmpLoc, TerrainImprovementDB(TILEIMP_MODERN_CITY_DEAD), 0); return 1; } elseif(TileHasImprovement(tmpLoc, TerrainImprovementDB(TILEIMP_SEA_CITY_ONE))) { ExpansionPlacement = 1; GrantAdvance(owner, AdvanceDB(ADVANCE_SUBNEURAL_ADS)); Event:CreateImprovement(owner, tmpLoc, TerrainImprovementDB(TILEIMP_SEA_CITY_DEAD), 0); return 1; } } if (cellOwner(tmpLoc) == owner && addDelete == 2) { if(TileHasCity(tmpLoc)) { Event: CutImprovements(tmpLoc); return 1; } } if(newType == 1 && cellOwner(tmpLoc) == owner && addDelete == 1) { if(!TileHasImprovement(tmpLoc, TerrainImprovementDB(TILEIMP_MODERN_CITY_ONE)) && !TileHasImprovement(tmpLoc, TerrainImprovementDB(TILEIMP_MODERN_CITY_TWO)) && !TileHasImprovement(tmpLoc, TerrainImprovementDB(TILEIMP_MODERN_CITY_THREE)) && TileHasWonder(tmpLoc) == 0) { if (TType == TerrainDB(TERRAIN_FOREST) || TType == TerrainDB(TERRAIN_JUNGLE) || TType == TerrainDB(TERRAIN_SWAMP)) { Terraform(tmpLoc, TerrainDB(TERRAIN_PLAINS)); ExpansionPlacement = 1; GrantAdvance(owner, AdvanceDB(ADVANCE_SUBNEURAL_ADS)); Event:CreateImprovement(owner,tmpLoc,TerrainImprovementDB(TILEIMP_MODERN_CITY_ONE),0 ); // Create Road return 1; } elseif (TType == TerrainDB(TERRAIN_GRASSLAND) || TType == TerrainDB(TERRAIN_PLAINS) || TType == TerrainDB(TERRAIN_DESERT) || TType == TerrainDB(TERRAIN_TUNDRA) || TType == TerrainDB(TERRAIN_HILL) || TType == TerrainDB(TERRAIN_BROWN_HILL)) { ExpansionPlacement = 1; GrantAdvance(owner, AdvanceDB(ADVANCE_SUBNEURAL_ADS)); Event:CreateImprovement(owner,tmpLoc,TerrainImprovementDB(TILEIMP_MODERN_CITY_ONE),0 ); // Create Road return 1; } elseif (TType == TerrainDB(TERRAIN_WATER_DEEP) || TType == TerrainDB(TERRAIN_WATER_TRENCH) || TType == TerrainDB(TERRAIN_WATER_RIFT)) { ExpansionPlacement = 1; GrantAdvance(owner, AdvanceDB(ADVANCE_SUBNEURAL_ADS)); Event:CreateImprovement(owner,tmpLoc, TerrainImprovementDB(TILEIMP_SEA_CITY_ONE),0 ); return 1; } } } if (newType == 2 && cellOwner(tmpLoc) == owner && addDelete == 1) { if (TileHasImprovement(tmpLoc, TerrainImprovementDB(TILEIMP_MODERN_CITY_ONE))) { ExpansionPlacement = 1; GrantAdvance(owner, AdvanceDB(ADVANCE_SUBNEURAL_ADS)); Event:CreateImprovement(owner,tmpLoc, TerrainImprovementDB(TILEIMP_MODERN_CITY_TWO),0 );// Create Railroad return 1; } } if (newType == 3 && cellOwner(tmpLoc) == owner && addDelete == 1) { if (TileHasImprovement(tmpLoc, TerrainImprovementDB(TILEIMP_MODERN_CITY_TWO))) { ExpansionPlacement = 1; GrantAdvance(owner, AdvanceDB(ADVANCE_SUBNEURAL_ADS)); Event:CreateImprovement(owner,tmpLoc, TerrainImprovementDB(TILEIMP_MODERN_CITY_THREE),0 );// Create Railroad return 1; } } if (cellOwner(tmpLoc) == owner && addDelete == 0) { if (TileHasImprovement(tmpLoc, TerrainImprovementDB(TILEIMP_ANCIENT_CITY_ONE)) || TileHasImprovement(tmpLoc, TerrainImprovementDB(TILEIMP_MEDIEVAL_CITY_ONE))) { ExpansionPlacement = 1; GrantAdvance(owner, AdvanceDB(ADVANCE_SUBNEURAL_ADS)); Event:CreateImprovement(owner,tmpLoc, TerrainImprovementDB(TILEIMP_MODERN_CITY_ONE),0 );// Create Railroad return 1; } } GetNeighbor(tmpLoc, searchDirection, tmp2Loc); tmpLoc = tmp2Loc; count = count - 1; } return 0; } int_f PlaceGeneticCity(int_t owner, location_t checkLoc, int_t range, int_t direction, int_t newType, int_t addDelete) { location_t tmpLoc; location_t tmp2Loc; int_t searchDirection; int_t TType; int_t count; int_t sucess; tmpLoc = checkLoc; count = range; // Searching through the tiles, clockwise. if (direction == 0) { // searchDirection = 4; } // NORTH if (direction == 1) { // 0 searchDirection = 4; } // 3 1 if (direction == 2) { // WEST 5 + 2 EAST searchDirection = 6; } // 6 4 if (direction == 3) { // 7 searchDirection = 1; } // SOUTH if (direction == 4) { // searchDirection = 6; } if (direction == 5) { searchDirection = 1; } if (direction == 6) { searchDirection = 3; } if (direction == 7) { searchDirection = 3; } while (count > 0) { TType = TerrainType(tmpLoc); if (newType == 1 && cellOwner(tmpLoc) == owner && addDelete == 10) { if(TileHasImprovement(tmpLoc, TerrainImprovementDB(TILEIMP_ANCIENT_CITY_ONE)) || TileHasImprovement(tmpLoc, TerrainImprovementDB(TILEIMP_MEDIEVAL_CITY_ONE))) { ExpansionPlacement = 1; GrantAdvance(owner, AdvanceDB(ADVANCE_SUBNEURAL_ADS)); Event:CreateImprovement(owner, tmpLoc, TerrainImprovementDB(TILEIMP_ANCIENT_CITY_DEAD), 0); return 1; } elseif(TileHasImprovement(tmpLoc, TerrainImprovementDB(TILEIMP_MODERN_CITY_ONE)) || TileHasImprovement(tmpLoc, TerrainImprovementDB(TILEIMP_MODERN_CITY_TWO)) || TileHasImprovement(tmpLoc, TerrainImprovementDB(TILEIMP_MODERN_CITY_THREE))) { ExpansionPlacement = 1; GrantAdvance(owner, AdvanceDB(ADVANCE_SUBNEURAL_ADS)); Event:CreateImprovement(owner, tmpLoc, TerrainImprovementDB(TILEIMP_MODERN_CITY_DEAD), 0); return 1; } elseif(TileHasImprovement(tmpLoc, TerrainImprovementDB(TILEIMP_GENETIC_CITY_ONE)) || TileHasImprovement(tmpLoc, TerrainImprovementDB(TILEIMP_GENETIC_CITY_TWO))) { ExpansionPlacement = 1; GrantAdvance(owner, AdvanceDB(ADVANCE_SUBNEURAL_ADS)); Event:CreateImprovement(owner, tmpLoc, TerrainImprovementDB(TILEIMP_SEA_CITY_DEAD), 0); return 1; } elseif(TileHasImprovement(tmpLoc, TerrainImprovementDB(TILEIMP_SEA_CITY_ONE))) { ExpansionPlacement = 1; GrantAdvance(owner, AdvanceDB(ADVANCE_SUBNEURAL_ADS)); Event:CreateImprovement(owner, tmpLoc, TerrainImprovementDB(TILEIMP_SEA_CITY_DEAD), 0); return 1; } } if (cellOwner(tmpLoc) == owner && addDelete == 2) { if(TileHasCity(tmpLoc)) { Event: CutImprovements(tmpLoc); return 1; } } if (newType < 2 && cellOwner(tmpLoc) == owner && addDelete == 1) { if(!TileHasImprovement(tmpLoc, TerrainImprovementDB(TILEIMP_GENETIC_CITY_ONE)) && !TileHasImprovement(tmpLoc, TerrainImprovementDB(TILEIMP_GENETIC_CITY_TWO)) && TileHasWonder(tmpLoc) == 0) { if (TType == TerrainDB(TERRAIN_FOREST) || TType == TerrainDB(TERRAIN_JUNGLE) || TType == TerrainDB(TERRAIN_SWAMP) || TType == TerrainDB(TERRAIN_PLAINS) || TType == TerrainDB(TERRAIN_GRASSLAND) || TType == TerrainDB(TERRAIN_DESERT) || TType == TerrainDB(TERRAIN_TUNDRA) || TType == TerrainDB(TERRAIN_HILL) || TType == TerrainDB(TERRAIN_BROWN_HILL)) { ExpansionPlacement = 1; GrantAdvance(owner, AdvanceDB(ADVANCE_SUBNEURAL_ADS)); Event:CreateImprovement(owner,tmpLoc, TerrainImprovementDB(TILEIMP_GENETIC_CITY_ONE),0 ); return 1; } elseif (TType == TerrainDB(TERRAIN_WATER_DEEP) || TType == TerrainDB(TERRAIN_WATER_TRENCH) || TType == TerrainDB(TERRAIN_WATER_RIFT)) { ExpansionPlacement = 1; GrantAdvance(owner, AdvanceDB(ADVANCE_SUBNEURAL_ADS)); Event:CreateImprovement(owner,tmpLoc, TerrainImprovementDB(TILEIMP_SEA_CITY_ONE),0 ); return 1; } } } if (newType >= 2 && cellOwner(tmpLoc) == owner && addDelete == 1) { if (TileHasImprovement(tmpLoc, TerrainImprovementDB(TILEIMP_GENETIC_CITY_ONE))) { ExpansionPlacement = 1; GrantAdvance(owner, AdvanceDB(ADVANCE_SUBNEURAL_ADS)); Event:CreateImprovement(owner,tmpLoc, TerrainImprovementDB(TILEIMP_GENETIC_CITY_TWO),0 ); return 1; } } if (cellOwner(tmpLoc) == owner && addDelete == 0) { if (TileHasImprovement(tmpLoc, TerrainImprovementDB(TILEIMP_ANCIENT_CITY_ONE)) || TileHasImprovement(tmpLoc, TerrainImprovementDB(TILEIMP_MEDIEVAL_CITY_ONE)) || TileHasImprovement(tmpLoc, TerrainImprovementDB(TILEIMP_MODERN_CITY_ONE))) { ExpansionPlacement = 1; GrantAdvance(owner, AdvanceDB(ADVANCE_SUBNEURAL_ADS)); Event:CreateImprovement(owner,tmpLoc, TerrainImprovementDB(TILEIMP_GENETIC_CITY_ONE),0 ); return 1; } elseif (TileHasImprovement(tmpLoc, TerrainImprovementDB(TILEIMP_MODERN_CITY_TWO)) || TileHasImprovement(tmpLoc, TerrainImprovementDB(TILEIMP_MODERN_CITY_THREE))) { ExpansionPlacement = 1; GrantAdvance(owner, AdvanceDB(ADVANCE_SUBNEURAL_ADS)); Event:CreateImprovement(owner,tmpLoc, TerrainImprovementDB(TILEIMP_GENETIC_CITY_TWO),0 ); return 1; } } GetNeighbor(tmpLoc, searchDirection, tmp2Loc); tmpLoc = tmp2Loc; count = count - 1; } return 0; } int_f PlaceDiamondCity(int_t owner, location_t checkLoc, int_t range, int_t direction, int_t newType, int_t addDelete) { location_t tmpLoc; location_t tmp2Loc; int_t searchDirection; int_t TType; int_t count; int_t sucess; tmpLoc = checkLoc; count = range; // Searching through the tiles, clockwise. if (direction == 0) { // searchDirection = 4; } // NORTH if (direction == 1) { // 0 searchDirection = 4; } // 3 1 if (direction == 2) { // WEST 5 + 2 EAST searchDirection = 6; } // 6 4 if (direction == 3) { // 7 searchDirection = 1; } // SOUTH if (direction == 4) { // searchDirection = 6; } if (direction == 5) { searchDirection = 1; } if (direction == 6) { searchDirection = 3; } if (direction == 7) { searchDirection = 3; } while (count > 0) { TType = TerrainType(tmpLoc); if (newType == 1 && cellOwner(tmpLoc) == owner && addDelete == 10) { if(TileHasImprovement(tmpLoc, TerrainImprovementDB(TILEIMP_ANCIENT_CITY_ONE)) || TileHasImprovement(tmpLoc, TerrainImprovementDB(TILEIMP_MEDIEVAL_CITY_ONE))) { ExpansionPlacement = 1; GrantAdvance(owner, AdvanceDB(ADVANCE_SUBNEURAL_ADS)); Event:CreateImprovement(owner, tmpLoc, TerrainImprovementDB(TILEIMP_ANCIENT_CITY_DEAD), 0); return 1; } elseif(TileHasImprovement(tmpLoc, TerrainImprovementDB(TILEIMP_MODERN_CITY_ONE)) || TileHasImprovement(tmpLoc, TerrainImprovementDB(TILEIMP_MODERN_CITY_TWO)) || TileHasImprovement(tmpLoc, TerrainImprovementDB(TILEIMP_MODERN_CITY_THREE))) { ExpansionPlacement = 1; GrantAdvance(owner, AdvanceDB(ADVANCE_SUBNEURAL_ADS)); Event:CreateImprovement(owner, tmpLoc, TerrainImprovementDB(TILEIMP_MODERN_CITY_DEAD), 0); return 1; } elseif(TileHasImprovement(tmpLoc, TerrainImprovementDB(TILEIMP_GENETIC_CITY_ONE)) || TileHasImprovement(tmpLoc, TerrainImprovementDB(TILEIMP_GENETIC_CITY_TWO))) { ExpansionPlacement = 1; GrantAdvance(owner, AdvanceDB(ADVANCE_SUBNEURAL_ADS)); Event:CreateImprovement(owner, tmpLoc, TerrainImprovementDB(TILEIMP_SEA_CITY_DEAD), 0); return 1; } elseif(TileHasImprovement(tmpLoc, TerrainImprovementDB(TILEIMP_FUTURE_CITY_ONE)) || TileHasImprovement(tmpLoc, TerrainImprovementDB(TILEIMP_FUTURE_CITY_TWO))) { ExpansionPlacement = 1; GrantAdvance(owner, AdvanceDB(ADVANCE_SUBNEURAL_ADS)); Event:CreateImprovement(owner, tmpLoc, TerrainImprovementDB(TILEIMP_FUTURE_CITY_DEAD), 0); return 1; } elseif(TileHasImprovement(tmpLoc, TerrainImprovementDB(TILEIMP_SEA_CITY_ONE))) { ExpansionPlacement = 1; GrantAdvance(owner, AdvanceDB(ADVANCE_SUBNEURAL_ADS)); Event:CreateImprovement(owner, tmpLoc, TerrainImprovementDB(TILEIMP_SEA_CITY_DEAD), 0); return 1; } } if (cellOwner(tmpLoc) == owner && addDelete == 2) { if(TileHasCity(tmpLoc)) { Event: CutImprovements(tmpLoc); return 1; } } if (newType < 2 && cellOwner(tmpLoc) == owner && addDelete == 1) { if(!TileHasImprovement(tmpLoc, TerrainImprovementDB(TILEIMP_FUTURE_CITY_ONE)) && !TileHasImprovement(tmpLoc, TerrainImprovementDB(TILEIMP_FUTURE_CITY_TWO)) && TileHasWonder(tmpLoc) == 0) { if (TType == TerrainDB(TERRAIN_FOREST) || TType == TerrainDB(TERRAIN_JUNGLE) || TType == TerrainDB(TERRAIN_SWAMP) || TType == TerrainDB(TERRAIN_PLAINS) || TType == TerrainDB(TERRAIN_GRASSLAND) || TType == TerrainDB(TERRAIN_DESERT) || TType == TerrainDB(TERRAIN_TUNDRA) || TType == TerrainDB(TERRAIN_HILL) || TType == TerrainDB(TERRAIN_BROWN_HILL)) { ExpansionPlacement = 1; GrantAdvance(owner, AdvanceDB(ADVANCE_SUBNEURAL_ADS)); Event:CreateImprovement(owner,tmpLoc, TerrainImprovementDB(TILEIMP_FUTURE_CITY_ONE),0 ); return 1; } elseif (TType == TerrainDB(TERRAIN_WATER_DEEP) || TType == TerrainDB(TERRAIN_WATER_TRENCH) || TType == TerrainDB(TERRAIN_WATER_RIFT)) { ExpansionPlacement = 1; GrantAdvance(owner, AdvanceDB(ADVANCE_SUBNEURAL_ADS)); Event:CreateImprovement(owner,tmpLoc, TerrainImprovementDB(TILEIMP_SEA_CITY_ONE),0 ); return 1; } } } if (newType >= 2 && cellOwner(tmpLoc) == owner && addDelete == 1) { if (TileHasImprovement(tmpLoc, TerrainImprovementDB(TILEIMP_FUTURE_CITY_ONE))) { ExpansionPlacement = 1; GrantAdvance(owner, AdvanceDB(ADVANCE_SUBNEURAL_ADS)); Event:CreateImprovement(owner,tmpLoc, TerrainImprovementDB(TILEIMP_FUTURE_CITY_TWO),0 ); return 1; } } if (cellOwner(tmpLoc) == owner && addDelete == 0) { if (TileHasImprovement(tmpLoc, TerrainImprovementDB(TILEIMP_ANCIENT_CITY_ONE)) || TileHasImprovement(tmpLoc, TerrainImprovementDB(TILEIMP_MEDIEVAL_CITY_ONE)) || TileHasImprovement(tmpLoc, TerrainImprovementDB(TILEIMP_MODERN_CITY_ONE)) || TileHasImprovement(tmpLoc, TerrainImprovementDB(TILEIMP_GENETIC_CITY_ONE))) { ExpansionPlacement = 1; GrantAdvance(owner, AdvanceDB(ADVANCE_SUBNEURAL_ADS)); Event:CreateImprovement(owner,tmpLoc, TerrainImprovementDB(TILEIMP_FUTURE_CITY_ONE),0 ); return 1; } elseif( TileHasImprovement(tmpLoc, TerrainImprovementDB(TILEIMP_MODERN_CITY_TWO)) || TileHasImprovement(tmpLoc, TerrainImprovementDB(TILEIMP_GENETIC_CITY_TWO)) || TileHasImprovement(tmpLoc, TerrainImprovementDB(TILEIMP_MODERN_CITY_THREE))) { ExpansionPlacement = 1; GrantAdvance(owner, AdvanceDB(ADVANCE_SUBNEURAL_ADS)); Event:CreateImprovement(owner,tmpLoc, TerrainImprovementDB(TILEIMP_FUTURE_CITY_TWO),0 ); return 1; } } GetNeighbor(tmpLoc, searchDirection, tmp2Loc); tmpLoc = tmp2Loc; count = count - 1; } return 0; } int_f ExpandCity(int_t owner, location_t cityLoc, int_t cityRadius, int_t tileType, int_t addDelete) { location_t tmpLoc; location_t tmp2Loc; location_t theLoc; int_t i; int_t j; int_t k; int_t sucess; int_t newType; int_t searchRadius; int_t addDeleteYN; int_t ownerNum; searchRadius = 1; sucess = 0; newType = tileType; theLoc = cityLoc; addDeleteYN = addDelete; ownerNum = owner; j = random(8); if (j == 0) { j = 1; } if(j == 2) { j = 3; } if(j == 5) { j = 2; } if(j == 7) { j = 6; } while (searchRadius <= cityRadius && sucess == 0) { tmpLoc = theLoc; for (k = 0; k < searchRadius; k = k + 1) { GetNeighbor(tmpLoc, j, tmp2Loc); tmpLoc = tmp2Loc; } if (!HasAdvance(ownerNum, ID_ADVANCE_AGRICULTURAL_REVOLUTION) && !HasAdvance(ownerNum, ID_ADVANCE_MASS_PRODUCTION) && !HasAdvance(ownerNum, ID_ADVANCE_ARCOLOGIES) && !HasAdvance(ownerNum, ID_ADVANCE_NANO_MACHINES)) { sucess = PlaceAncientCity(ownerNum, tmpLoc, searchRadius, j, newType, addDeleteYN); } elseif (HasAdvance(ownerNum, ID_ADVANCE_AGRICULTURAL_REVOLUTION) && !HasAdvance(ownerNum, ID_ADVANCE_MASS_PRODUCTION) && !HasAdvance(ownerNum, ID_ADVANCE_ARCOLOGIES) && !HasAdvance(ownerNum, ID_ADVANCE_NANO_MACHINES)) { sucess = PlaceMedievalCity(ownerNum, tmpLoc, searchRadius, j, newType, addDeleteYN); } elseif (HasAdvance(ownerNum, ID_ADVANCE_AGRICULTURAL_REVOLUTION) && HasAdvance(ownerNum, ID_ADVANCE_MASS_PRODUCTION) && !HasAdvance(ownerNum, ID_ADVANCE_ARCOLOGIES) && !HasAdvance(ownerNum, ID_ADVANCE_NANO_MACHINES)) { sucess = PlaceModernCity(ownerNum, tmpLoc, searchRadius, j, newType, addDeleteYN); } elseif (HasAdvance(ownerNum, ID_ADVANCE_AGRICULTURAL_REVOLUTION) && HasAdvance(ownerNum, ID_ADVANCE_MASS_PRODUCTION) && HasAdvance(ownerNum, ID_ADVANCE_ARCOLOGIES) && !HasAdvance(ownerNum, ID_ADVANCE_NANO_MACHINES)) { sucess = PlaceGeneticCity(ownerNum, tmpLoc, searchRadius, j, newType, addDeleteYN); } elseif (HasAdvance(ownerNum, ID_ADVANCE_AGRICULTURAL_REVOLUTION) && HasAdvance(ownerNum, ID_ADVANCE_MASS_PRODUCTION) && HasAdvance(ownerNum, ID_ADVANCE_ARCOLOGIES) && HasAdvance(ownerNum, ID_ADVANCE_NANO_MACHINES)) { sucess = PlaceDiamondCity(ownerNum, tmpLoc, searchRadius, j, newType, addDeleteYN); } i = j + 1; while (i != j && sucess == 0) { tmpLoc = cityLoc; for (k = 0; k < searchRadius; k = k + 1) { GetNeighbor(tmpLoc, i, tmp2Loc); tmpLoc = tmp2Loc; } if (!HasAdvance(ownerNum, ID_ADVANCE_AGRICULTURAL_REVOLUTION) && !HasAdvance(ownerNum, ID_ADVANCE_MASS_PRODUCTION) && !HasAdvance(ownerNum, ID_ADVANCE_ARCOLOGIES) && !HasAdvance(ownerNum, ID_ADVANCE_NANO_MACHINES)) { sucess = PlaceAncientCity(ownerNum, tmpLoc, searchRadius, j, newType, addDeleteYN); } elseif (HasAdvance(ownerNum, ID_ADVANCE_AGRICULTURAL_REVOLUTION) && !HasAdvance(ownerNum, ID_ADVANCE_MASS_PRODUCTION) && !HasAdvance(ownerNum, ID_ADVANCE_ARCOLOGIES) && !HasAdvance(ownerNum, ID_ADVANCE_NANO_MACHINES)) { sucess = PlaceMedievalCity(ownerNum, tmpLoc, searchRadius, j, newType, addDeleteYN); } elseif (HasAdvance(ownerNum, ID_ADVANCE_AGRICULTURAL_REVOLUTION) && HasAdvance(ownerNum, ID_ADVANCE_MASS_PRODUCTION) && !HasAdvance(ownerNum, ID_ADVANCE_ARCOLOGIES) && !HasAdvance(ownerNum, ID_ADVANCE_NANO_MACHINES)) { sucess = PlaceModernCity(ownerNum, tmpLoc, searchRadius, j, newType, addDeleteYN); } elseif (HasAdvance(ownerNum, ID_ADVANCE_AGRICULTURAL_REVOLUTION) && HasAdvance(ownerNum, ID_ADVANCE_MASS_PRODUCTION) && HasAdvance(ownerNum, ID_ADVANCE_ARCOLOGIES) && !HasAdvance(ownerNum, ID_ADVANCE_NANO_MACHINES)) { sucess = PlaceGeneticCity(ownerNum, tmpLoc, searchRadius, j, newType, addDeleteYN); } elseif (HasAdvance(ownerNum, ID_ADVANCE_AGRICULTURAL_REVOLUTION) && HasAdvance(ownerNum, ID_ADVANCE_MASS_PRODUCTION) && HasAdvance(ownerNum, ID_ADVANCE_ARCOLOGIES) && HasAdvance(ownerNum, ID_ADVANCE_NANO_MACHINES)) { sucess = PlaceDiamondCity(ownerNum, tmpLoc, searchRadius, j, newType, addDeleteYN); } i = i + 1; if (i == 8) { i = 0; } } searchRadius = searchRadius + 1; } return sucess; } int_f GetCityRadius(city_t theCity) { int_t pop; city_t tmpCity; tmpCity = theCity; pop = theCity.population; if(pop < 9) { return 1; } elseif(pop >= 9 && pop < 21) { return 2; } elseif(pop >= 21 && pop < 68) { return 3; } elseif(pop >= 68) { return 4; } else{ return 0; } } int_f BeginCityExpansion(city_t tmpCity, int_t tmpValue) { city_t theCity; int_t sucess; int_t pop; int_t radius; int_t addDelete; int_t i; theCity = tmpCity; addDelete = tmpValue; sucess = 1; pop = theCity.population; radius = GetCityRadius(theCity); // Small City (6 + 6n) if(pop == 6 || pop == 12 || pop == 18 || pop == 24 || pop == 30 || pop == 36 || pop == 42 || pop == 48 || pop == 54 || pop == 60 || pop == 66 || pop == 72 || pop == 78 || pop == 84 || pop == 90 || pop == 96 || pop ==102 || pop ==108 || pop ==114 || pop ==120 || pop ==126 || pop ==132 || pop ==138 || pop ==144 || pop ==150) { sucess = ExpandCity(theCity.owner, theCity.location, radius, 1, addDelete); } // Medium city (pop 22 + 12n) if(pop == 22 || pop == 34 || pop == 46 || pop == 58 || pop == 70 || pop == 82 || pop == 94 || pop == 106 || pop == 118 || pop == 130 || pop == 142 || 154) { ExpandCity(theCity.owner, theCity.location, radius, 2, addDelete); } // Big city (pop 49 + 24n) if(pop == 49 || pop == 97 || pop ==121 || pop == 145) { ExpandCity(theCity.owner, theCity.location, radius, 3, addDelete); } ExpandCity(theCity.owner, theCity.location, radius, 1, 0); if (sucess == 0) { if(addDelete == 1) { DontReduce = 1; Event: KillPop(theCity); } ExpansionPlacement = 0; if (HasAdvance(theCity.owner, ID_ADVANCE_SUBNEURAL_ADS)) { RemoveAdvance(theCity.owner, AdvanceDB(ADVANCE_SUBNEURAL_ADS)); } } } void_f ReduceManyCities(city_t tmpCity, int_t tmpValue) { int_t radius; int_t num; int_t i; city_t theCity; theCity = tmpValue; num = tmpCity; radius = GetCityRadius(theCity); for (i = 0; i <= num; i = i + 1){ ExpandCity(theCity.owner, theCity.location, radius, 1, 10); } } HandleEvent(MakePop) 'expanding city' post { city_t theCity; int_t sucess; int_t pop; int_t radius; if (CityIsValid(city[0])){ BeginCityExpansion(city[0], 1); } } HandleEvent(KillPop) 'KillPop' pre { if(DontReduce == 0) { if(CityIsValid(city[0])) { BeginCityExpansion(city[0], 2); } } else { DontReduce = 0; } } HandleEvent(CreateUnit) 'settler built post' pre { int_t tmpValue; tmpValue = value[0]; if(CityIsValid(city[0])) { if(tmpValue == UnitDB(UNIT_NOMAD) // if a unit is one of those listed here || tmpValue == UnitDB(UNIT_SETTLER) || tmpValue == UnitDB(UNIT_URBAN_PLANNER) // ... || tmpValue == UnitDB(UNIT_SEA_ENGINEER)) { BeginCityExpansion(city[0], 2); } } } HandleEvent(SlaveRaidCity) 'SlaveRaidCity' pre { if (CityIsValid(city[0])) { BeginCityExpansion(city[0], 2); } } HandleEvent(UndergroundRailwayUnit) 'FreeSlavesInCity' pre { if (CityIsValid(city[0])) { BeginCityExpansion(city[0], 2); } } HandleEvent(CaptureCity) 'CityCaptured' pre { if (CityIsValid(city[0])) { BeginCityExpansion(city[0], 2); } } HandleEvent(PlagueCity) 'CityPlagued' pre { int_t DeadNum; int_t pop; pop = city[0].population; if (CityIsValid(city[0])) { DeadNum = 1 + city[0].population/10; ReduceManyCities(city[0], DeadNum); } } HandleEvent(NukeCity) 'CityNuked' pre { int_t pop; int_t DeadNum; pop = city[0].population; if (CityIsValid(city[0])) { DeadNum = 1 + pop*2/6; ReduceManyCities(city[0], DeadNum); } } HandleEvent(CreateParkUnit) 'CreatedParkOverCity' pre { int_t pop; int_t DeadNum; pop = city[0].population; if (CityIsValid(city[0])) { DeadNum = 1 + pop/2; ReduceManyCities(city[0], DeadNum); } } ///////////////////////// // Improvement Control/// ///////////////////////// HandleEvent(CutImprovements) 'PillageKillsCity' pre { int_t owner; location_t tmpLoc; city_t tmpCity; owner = CellOwner(location[0]); tmpLoc = location[0]; if(TileHasDeadCity(tmpLoc)) { if(CanCutDeadCities == 0) { return STOP; } else{ CanCutDeadCities = 0; } } // Ancient/Medieval Cities elseif(TileHasImprovement(tmpLoc, TerrainImprovementDB(TILEIMP_ANCIENT_CITY_ONE)) || TileHasImprovement(tmpLoc, TerrainImprovementDB(TILEIMP_MEDIEVAL_CITY_ONE))) { ExpansionPlacement = 1; GrantAdvance(owner, AdvanceDB(ADVANCE_SUBNEURAL_ADS)); Event:CreateImprovement(owner,tmpLoc, TerrainImprovementDB(TILEIMP_ANCIENT_CITY_DEAD),0); } // Modern Cities elseif(TileHasImprovement(tmpLoc, TerrainImprovementDB(TILEIMP_MODERN_CITY_ONE))) { ExpansionPlacement = 1; GrantAdvance(owner, AdvanceDB(ADVANCE_SUBNEURAL_ADS)); Event:CreateImprovement(owner,tmpLoc, TerrainImprovementDB(TILEIMP_MODERN_CITY_DEAD),0); } elseif(TileHasImprovement(tmpLoc, TerrainImprovementDB(TILEIMP_MODERN_CITY_TWO))){ ExpansionPlacement = 1; GrantAdvance(owner, AdvanceDB(ADVANCE_SUBNEURAL_ADS)); Event:CreateImprovement(owner,tmpLoc, TerrainImprovementDB(TILEIMP_MODERN_CITY_ONE),0); } elseif(TileHasImprovement(tmpLoc, TerrainImprovementDB(TILEIMP_MODERN_CITY_THREE))){ ExpansionPlacement = 1; GrantAdvance(owner, AdvanceDB(ADVANCE_SUBNEURAL_ADS)); Event:CreateImprovement(owner,tmpLoc, TerrainImprovementDB(TILEIMP_MODERN_CITY_TWO),0); } // Genetic Cities elseif(TileHasImprovement(tmpLoc, TerrainImprovementDB(TILEIMP_GENETIC_CITY_ONE))) { ExpansionPlacement = 1; GrantAdvance(owner, AdvanceDB(ADVANCE_SUBNEURAL_ADS)); Event:CreateImprovement(owner,tmpLoc, TerrainImprovementDB(TILEIMP_GENETIC_CITY_DEAD),0); } elseif(TileHasImprovement(tmpLoc, TerrainImprovementDB(TILEIMP_GENETIC_CITY_TWO))) { ExpansionPlacement = 1; GrantAdvance(owner, AdvanceDB(ADVANCE_SUBNEURAL_ADS)); Event:CreateImprovement(owner,tmpLoc, TerrainImprovementDB(TILEIMP_GENETIC_CITY_ONE),0); } // Diamond Cities elseif(TileHasImprovement(tmpLoc, TerrainImprovementDB(TILEIMP_FUTURE_CITY_ONE))) { ExpansionPlacement = 1; GrantAdvance(owner, AdvanceDB(ADVANCE_SUBNEURAL_ADS)); Event:CreateImprovement(owner,tmpLoc, TerrainImprovementDB(TILEIMP_FUTURE_CITY_DEAD),0); } elseif(TileHasImprovement(tmpLoc, TerrainImprovementDB(TILEIMP_FUTURE_CITY_TWO))) { ExpansionPlacement = 1; GrantAdvance(owner, AdvanceDB(ADVANCE_SUBNEURAL_ADS)); Event:CreateImprovement(owner,tmpLoc, TerrainImprovementDB(TILEIMP_FUTURE_CITY_ONE),0); } elseif(TileHasImprovement(tmpLoc, TerrainImprovementDB(TILEIMP_SEA_CITY_ONE))) { ExpansionPlacement = 1; GrantAdvance(owner, AdvanceDB(ADVANCE_SUBNEURAL_ADS)); Event:CreateImprovement(owner,tmpLoc, TerrainImprovementDB(TILEIMP_SEA_CITY_DEAD),0); } } HandleEvent(CreateImprovement) 'DontLetPlaceImpsOverCities' pre { if(ExpansionPlacement == 0) { if(TileHasWonder(location[0]) == 1 || TileHasCity (location[0]) == 1) { if(value[0] != TerrainImprovementDB(TILEIMP_ROAD) || value[0] != TerrainImprovementDB(TILEIMP_RAILROAD) || value[0] != TerrainImprovementDB(TILEIMP_MAGLEV) || value[0] != TerrainImprovementDB(TILEIMP_UNDERSEA_TUNNEL)) { return STOP; } } elseif(TileHasDeadCity(location[0]) == 1) { if(value[0] != TerrainImprovementDB(TILEIMP_TERRAFORM_BROWN_HILL) || value[0] != TerrainImprovementDB(TILEIMP_TERRAFORM_BROWN_MOUNTAIN) || value[0] != TerrainImprovementDB(TILEIMP_TERRAFORM_DESERT) || value[0] != TerrainImprovementDB(TILEIMP_TERRAFORM_FOREST) || value[0] != TerrainImprovementDB(TILEIMP_TERRAFORM_HILL) || value[0] != TerrainImprovementDB(TILEIMP_TERRAFORM_JUNGLE) || value[0] != TerrainImprovementDB(TILEIMP_TERRAFORM_GRASSLAND) || value[0] != TerrainImprovementDB(TILEIMP_TERRAFORM_MOUNTAIN) || value[0] != TerrainImprovementDB(TILEIMP_TERRAFORM_PLAINS) || value[0] != TerrainImprovementDB(TILEIMP_TERRAFORM_SWAMP) || value[0] != TerrainImprovementDB(TILEIMP_TERRAFORM_WHITE_HILL) || value[0] != TerrainImprovementDB(TILEIMP_TERRAFORM_WHITE_MOUNTAIN)) { return STOP; } } } else{ if(value[0] == TerrainImprovementDB(TILEIMP_MEDIEVAL_CITY_ONE)) { if(!HasAdvance(player[0], ID_ADVANCE_AGRICULTURAL_REVOLUTION)) { ExpansionPlacement = 0; if(HasAdvance(player[0], ID_ADVANCE_SUBNEURAL_ADS)) { RemoveAdvance(player[0], AdvanceDB(ADVANCE_SUBNEURAL_ADS)); } return STOP; } } if(value[0] == TerrainImprovementDB(TILEIMP_MODERN_CITY_ONE) || value[0] == TerrainImprovementDB(TILEIMP_MODERN_CITY_TWO) || value[0] == TerrainImprovementDB(TILEIMP_MODERN_CITY_THREE)) { if(!HasAdvance(player[0], ID_ADVANCE_MASS_PRODUCTION)) { ExpansionPlacement = 0; if(HasAdvance(player[0], ID_ADVANCE_SUBNEURAL_ADS)) { RemoveAdvance(player[0], AdvanceDB(ADVANCE_SUBNEURAL_ADS)); } return STOP; } } if(value[0] == TerrainImprovementDB(TILEIMP_GENETIC_CITY_ONE) || value[0] == TerrainImprovementDB(TILEIMP_GENETIC_CITY_TWO)) { if(!HasAdvance(player[0], ID_ADVANCE_ARCOLOGIES)) { ExpansionPlacement = 0; if(HasAdvance(player[0], ID_ADVANCE_SUBNEURAL_ADS)) { RemoveAdvance(player[0], AdvanceDB(ADVANCE_SUBNEURAL_ADS)); } return STOP; } } if(value[0] == TerrainImprovementDB(TILEIMP_FUTURE_CITY_ONE) || value[0] == TerrainImprovementDB(TILEIMP_FUTURE_CITY_TWO)) { if(!HasAdvance(player[0], ID_ADVANCE_NANO_MACHINES)) { ExpansionPlacement = 0; if(HasAdvance(player[0], ID_ADVANCE_SUBNEURAL_ADS)) { RemoveAdvance(player[0], AdvanceDB(ADVANCE_SUBNEURAL_ADS)); } return STOP; } } } } void_f StoreDeadCityLocation(location_t tmpLoc) { int_t tmpRound; int_t CleanRound; int_t sucess; int_t i; tmpRound = GetCurrentRound(); CleanRound = tmpRound + 100; while(i < DeadCityLoc.# && sucess == 0) { if(TileHasDeadCity(DeadCityLoc[i]) == 0) { DeadCityLoc[i] = tmpLoc; DeadCityRound[i] = CleanRound; sucess = 1; } i = i + 1; } if(sucess == 0) { i = DeadCityLoc.#; DeadCityLoc[i] = tmpLoc; DeadCityRound[i] = CleanRound; } } HandleEvent(BeginTurn) 'CleanDeadCities' pre { int_t i; int_t tmpRound; tmpRound = GetCurrentRound(); for (i = 0; i < DeadCityLoc.#; i = i + 1){ if(DeadCityRound[i] == tmpRound) { if(TileHasDeadCity(DeadCityLoc[i])) { CanCutDeadCities = 1; Event: CutImprovements(DeadCityLoc[i]); } } } if(HasAdvance(player[0], ID_ADVANCE_SUBNEURAL_ADS)) { RemoveAdvance(player[0], AdvanceDB(ADVANCE_SUBNEURAL_ADS)); } ExpansionPlacement = 0; } HandleEvent(CreateImprovement) 'RemoveSubneuralAds' post { int_t sucess; city_t tmpCity; if (HasAdvance(player[0], ID_ADVANCE_SUBNEURAL_ADS)) { RemoveAdvance(player[0], AdvanceDB(ADVANCE_SUBNEURAL_ADS)); } if(ExpansionPlacement == 1) { FinishImprovements(location[0]); ExpansionPlacement = 0; if(value[0] == TerrainImprovementDB(TILEIMP_ANCIENT_CITY_DEAD) || value[0] == TerrainImprovementDB(TILEIMP_MODERN_CITY_DEAD) || value[0] == TerrainImprovementDB(TILEIMP_GENETIC_CITY_DEAD) || value[0] == TerrainImprovementDB(TILEIMP_FUTURE_CITY_DEAD) || value[0] == TerrainImprovementDB(TILEIMP_SEA_CITY_DEAD)) { StoreDeadCityLocation(location[0]); } } }