-- Freeciv - Copyright (C) 2007 - The Freeciv Project -- This program is free software; you can redistribute it and/or modify -- it under the terms of the GNU General Public License as published by -- the Free Software Foundation; either version 2, or (at your option) -- any later version. -- -- This program is distributed in the hope that it will be useful, -- but WITHOUT ANY WARRANTY; without even the implied warranty of -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -- GNU General Public License for more details. -- This file is for lua-functionality that is specific to a given -- ruleset. When freeciv loads a ruleset, it also loads script -- file called 'default.lua'. The one loaded if your ruleset -- does not provide an override is default/default.lua. -- Place Ruins at the location of the destroyed city. function city_destroyed_callback(city, loser, destroyer) city.tile:create_extra("Ruins", NIL) -- continue processing return false end signal.connect("city_destroyed", "city_destroyed_callback") -- Check if there is certain terrain in ANY CAdjacent tile. function adjacent_to(tile, terrain_name) for adj_tile in tile:circle_iterate(1) do if adj_tile.id ~= tile.id then local adj_terr = adj_tile.terrain local adj_name = adj_terr:rule_name() if adj_name == terrain_name then return true end end end return false end -- Check if there is certain terrain in ALL CAdjacent tiles. function surrounded_by(tile, terrain_name) for adj_tile in tile:circle_iterate(1) do if adj_tile.id ~= tile.id then local adj_terr = adj_tile.terrain local adj_name = adj_terr:rule_name() if adj_name ~= terrain_name then return false end end end return true end -- Add random labels to the map. function place_map_labels() local rivers = 0 local deeps = 0 local oceans = 0 local lakes = 0 local swamps = 0 local glaciers = 0 local tundras = 0 local deserts = 0 local plains = 0 local grasslands = 0 local jungles = 0 local forests = 0 local hills = 0 local mountains = 0 local selected_river = 0 local selected_deep = 0 local selected_ocean = 0 local selected_lake = 0 local selected_swamp = 0 local selected_glacier = 0 local selected_tundra = 0 local selected_desert = 0 local selected_plain = 0 local selected_grassland = 0 local selected_jungle = 0 local selected_forest = 0 local selected_hill = 0 local selected_mountain = 0 -- Count the tiles that has a terrain type that may get a label. for place in whole_map_iterate() do local terr = place.terrain local tname = terr:rule_name() if place:has_extra("River") then rivers = rivers + 1 elseif tname == "Deep Ocean" then deeps = deeps + 1 elseif tname == "Ocean" then oceans = oceans + 1 elseif tname == "Lake" then lakes = lakes + 1 elseif tname == "Swamp" then swamps = swamps + 1 elseif tname == "Glacier" then glaciers = glaciers + 1 elseif tname == "Tundra" then tundras = tundras + 1 elseif tname == "Desert" then deserts = deserts + 1 elseif tname == "Plains" then plains = plains + 1 elseif tname == "Grassland" then grasslands = grasslands + 1 elseif tname == "Jungle" then jungles = jungles + 1 elseif tname == "Forest" then forests = forests + 1 elseif tname == "Hills" then hills = hills + 1 elseif tname == "Mountains" then mountains = mountains + 1 end end -- Decide if a label should be included and, in case it should, where. if random(1, 100) <= rivers then selected_river = random(1, rivers) end if random(1, 100) <= deeps then selected_deep = random(1, deeps) end if random(1, 100) <= oceans then selected_ocean = random(1, oceans) end if random(1, 100) <= lakes then selected_lake = random(1, lakes) end if random(1, 100) <= swamps then selected_swamp = random(1, swamps) end if random(1, 100) <= glaciers then selected_glacier = random(1, glaciers) end if random(1, 100) <= tundras then selected_tundra = random(1, tundras) end if random(1, 100) <= deserts then selected_desert = random(1, deserts) end if random(1, 100) <= plains then selected_plain = random(1, plains) end if random(1, 100) <= grasslands then selected_grassland = random(1, grasslands) end if random(1, 100) <= jungles then selected_jungle = random(1, jungles) end if random(1, 100) <= forests then selected_forest = random(1, forests) end if random(1, 100) <= hills then selected_hill = random(1, hills) end if random(1, 100) <= mountains then selected_mountain = random(1, mountains) end -- Place the included labels at the location determined above. for place in whole_map_iterate() do local terr = place.terrain local tname = terr:rule_name() if place:has_extra("River") then selected_river = selected_river - 1 if selected_river == 0 then place:create_extra("Wonder") if tname == "Hills" then place:set_label(_("Grand Canyon")) elseif tname == "Mountains" then place:set_label(_("Deep Gorge")) elseif tname == "Tundra" then place:set_label(_("Fjords")) elseif random(1, 100) <= 50 then place:set_label(_("Waterfalls")) else place:set_label(_("Travertine Terraces")) end end elseif tname == "Deep Ocean" then selected_deep = selected_deep - 1 if selected_deep == 0 then place:create_extra("Wonder") if random(1, 100) <= 50 then place:set_label(_("Deep Trench")) else place:set_label(_("Thermal Vent")) end end elseif tname == "Ocean" then selected_ocean = selected_ocean - 1 if selected_ocean == 0 then place:create_extra("Wonder") if surrounded_by(place, "Ocean") then place:set_label(_("Atoll Chain")) elseif adjacent_to(place, "Deep Ocean") then place:set_label(_("Great Barrier Reef")) else -- Coast place:set_label(_("Great Blue Hole")) end end elseif tname == "Lake" then selected_lake = selected_lake - 1 if selected_lake == 0 then place:create_extra("Wonder") if surrounded_by(place, "Lake") then place:set_label(_("Great Lakes")) elseif not adjacent_to(place, "Lake") then -- Isolated place:set_label(_("Dead Sea")) else place:set_label(_("Rift Lake")) end end elseif tname == "Swamp" then selected_swamp = selected_swamp - 1 if selected_swamp == 0 then place:create_extra("Wonder") if not adjacent_to(place, "Swamp") then place:set_label(_("Grand Prismatic Spring")) elseif adjacent_to(place, "Ocean") then place:set_label(_("Mangrove Forest")) else place:set_label(_("Cenotes")) end end elseif tname == "Glacier" then selected_glacier = selected_glacier - 1 if selected_glacier == 0 then place:create_extra("Wonder") if surrounded_by(place, "Glacier") then place:set_label(_("Ice Sheet")) elseif not adjacent_to(place, "Glacier") then place:set_label(_("Frozen Lake")) elseif adjacent_to(place, "Ocean") then place:set_label(_("Glacier Bay")) else place:set_label(_("Advancing Glacier")) end end elseif tname == "Tundra" then selected_tundra = selected_tundra - 1 if selected_tundra == 0 then place:create_extra("Wonder") place:set_label(_("Geothermal Area")) end elseif tname == "Desert" then selected_desert = selected_desert - 1 if selected_desert == 0 then place:create_extra("Wonder") if surrounded_by(place, "Desert") then place:set_label(_("Sand Sea")) elseif not adjacent_to(place, "Desert") then place:set_label(_("Salt Flat")) elseif random(1, 100) <= 50 then place:set_label(_("Singing Dunes")) else place:set_label(_("White Desert")) end end elseif tname == "Plains" then selected_plain = selected_plain - 1 if selected_plain == 0 then place:create_extra("Wonder") if adjacent_to(place, "Ocean") then place:set_label(_("Long Beach")) elseif random(1, 100) <= 50 then place:set_label(_("Mud Volcanoes")) else place:set_label(_("Rock Pillars")) end end elseif tname == "Grassland" then selected_grassland = selected_grassland - 1 if selected_grassland == 0 then place:create_extra("Wonder") if adjacent_to(place, "Ocean") then place:set_label(_("White Cliffs")) elseif random(1, 100) <= 50 then place:set_label(_("Giant Cave")) else place:set_label(_("Rock Formation")) end end elseif tname == "Jungle" then selected_jungle = selected_jungle - 1 if selected_jungle == 0 then place:create_extra("Wonder") if surrounded_by(place, "Jungle") then place:set_label(_("Rainforest")) elseif adjacent_to(place, "Ocean") then place:set_label(_("Subterranean River")) else place:set_label(_("Sinkholes")) end end elseif tname == "Forest" then selected_forest = selected_forest - 1 if selected_forest == 0 then place:create_extra("Wonder") if adjacent_to(place, "Mountains") then place:set_label(_("Stone Forest")) elseif random(1, 100) <= 50 then place:set_label(_("Sequoia Forest")) else place:set_label(_("Millenary Trees")) end end elseif tname == "Hills" then selected_hill = selected_hill - 1 if selected_hill == 0 then place:create_extra("Wonder") if not adjacent_to(place, "Hills") then if adjacent_to(place, "Mountains") then place:set_label(_("Table Mountain")) else place:set_label(_("Inselberg")) end elseif random(1, 100) <= 50 then place:set_label(_("Karst Landscape")) else place:set_label(_("Valley of Geysers")) end end elseif tname == "Mountains" then selected_mountain = selected_mountain - 1 if selected_mountain == 0 then place:create_extra("Wonder") if surrounded_by(place, "Mountains") then place:set_label(_("Highest Peak")) elseif not adjacent_to(place, "Mountains") then place:set_label(_("Sacred Mount")) elseif adjacent_to(place, "Ocean") then place:set_label(_("Cliff Coast")) elseif random(1, 100) <= 50 then place:set_label(_("Active Volcano")) else place:set_label(_("High Summit")) end end end end return true end signal.connect("map_generated", "place_map_labels") -- Add random extra resources to the map. function place_extra_resources(turn, year) if turn == 1 then for place in whole_map_iterate() do local terr = place.terrain local tname = terr:rule_name() if random(1, 100) <= 2 then if tname == "Desert" then place:create_extra("Niter") elseif tname == "Plains" then place:create_extra("Niter") elseif tname == "Swamp" then place:create_extra("Rubber") elseif tname == "Jungle" then place:create_extra("Rubber") elseif tname == "Forest" then place:create_extra("Rubber") elseif tname == "Tundra" then place:create_extra("Aluminum") elseif tname == "Hills" then place:create_extra("Aluminum") elseif tname == "Glacier" then place:create_extra("Uranium") elseif tname == "Mountains" then place:create_extra("Uranium") end end end end end signal.connect("turn_started", "place_extra_resources")