-- Cartography1
-- Author: Jason
-- DateCreated: 7/8/2017 2:49:19 AM
--------------------------------------------------------------
--------------------------------------------------------------
-- Config
--------------------------------------------------------------
local iCartographyPolicyID = GameInfoTypes.POLICY_MERCHANT_NAVY
--Cartography triggers on Jungle, Marsh, Oasis, Snow, Ice, and Atoll
local atoll, ice, jungle, marsh, oasis = GameInfoTypes.FEATURE_ATOLL, GameInfoTypes.FEATURE_ICE, GameInfoTypes.FEATURE_JUNGLE, GameInfoTypes.FEATURE_MARSH, GameInfoTypes.FEATURE_OASIS
local snow = GameInfoTypes.TERRAIN_SNOW
local speedPercent
do
if Game.GetGameSpeedType() == 0 then speedPercent = 300 end
if Game.GetGameSpeedType() == 1 then speedPercent = 150 end
if Game.GetGameSpeedType() == 2 then speedPercent = 100 end
if Game.GetGameSpeedType() == 3 then speedPercent = 66 end
end
local yieldGAP = math.floor((50 * speedPercent) / 100)
local yieldBeaker = math.floor( (50 * speedPercent) / 100)
local szYieldsMessage = "+"..yieldBeaker.." [ICON_RESEARCH], +"..yieldGAP.." [ICON_GOLDEN_AGE] from Cartography"
local diversePlots = {"ATOLL", "ICE", "JUNGLE", "MARSH", "OASIS"} --SNOW is Terrain
--------------------------------------------------------------
-- Memory
--------------------------------------------------------------
function GiveCapitalPersistence(buildingType, pPlayer)
if (pPlayer:IsEverAlive() and pPlayer:GetCapitalCity())
then
if pPlayer:GetCapitalCity():HasBuilding(buildingType)
then
function OnCapitalChanged(reorganizingPlayerID, newCapitalID, oldCapitalID)
if reorganizingPlayerID ~= pPlayer:GetID() then return end
Players[reorganizingPlayerID]:GetCityByID(newCapitalID):SetNumFreeBuilding(buildingType, 1)
if (oldCapitalID ~= -1)
then
local pOldCapital = Players[reorganizingPlayerID]:GetCityByID(oldCapitalID)
if (pOldCapital:GetOwner() == reorganizingPlayerID) --GetOwner() returns: PlayerID
then
pOldCapital:SetNumFreeBuilding(buildingType, 0)
end
end
end
GameEvents.CapitalChanged.Add(OnCapitalChanged)
end
end
end
for _, pLoopPlayer in pairs(Players) do
for _, v in ipairs(diversePlots) do
GiveCapitalPersistence(GameInfo.Buildings["BUILDING_CARTOGRAPHY_"..v].ID, pLoopPlayer)
end
GiveCapitalPersistence(GameInfo.Buildings["BUILDING_CARTOGRAPHY_SNOW"].ID, pLoopPlayer)
end
--------------------------------------------------------------
-- Util
--------------------------------------------------------------
function GiveRewardAndPersistence(receivingPlayerID, buildingType)
local receivingPlayer = Players[receivingPlayerID]
if receivingPlayer:IsEverAlive()
then
local capitalCity = receivingPlayer:GetCapitalCity() -- player->city
capitalCity:SetNumFreeBuilding(buildingType, 1)
receivingPlayer:ChangeYieldStored(GameInfoTypes.YIELD_GOLDEN_AGE_POINTS, yieldGAP)
receivingPlayer:ChangeYieldStored(GameInfoTypes.YIELD_SCIENCE, yieldBeaker)
receivingPlayer:AddMessage(szYieldsMessage)
GiveCapitalPersistence(buildingType, receivingPlayer)
end
end
--------------------------------------------------------------
-- POLICY_CARTOGRAPHY bonus triggers
--------------------------------------------------------------
local cartographyAward = {}
for i, v in ipairs(diversePlots) do
cartographyAward[i] = function (iPlotX, iPlotY, iOwner, iOldOwner)
if (Players[iOwner]:HasPolicy(iCartographyPolicyID))
then
if Players[iOwner]:GetCapitalCity():HasBuilding(GameInfo.Buildings["BUILDING_CARTOGRAPHY_"..v].ID) then return
else
local newPlot = Map.GetPlot(iPlotX, iPlotY)
if (newPlot:GetFeatureType() == GameInfoTypes["FEATURE_"..v])
then
GiveRewardAndPersistence(iOwner, GameInfo.Buildings["BUILDING_CARTOGRAPHY_"..v].ID)
end
end
end
end --anonymous TileOwnershipChanged listener
end
cartographyAward[6] = function(iPlotX, iPlotY, iOwner, iOldOwner)
if (Players[iOwner]:HasPolicy(iCartographyPolicyID))
then
if Players[iOwner]:GetCapitalCity():HasBuilding(GameInfo.Buildings["BUILDING_CARTOGRAPHY_SNOW"].ID) then return
else
local newPlot = Map.GetPlot(iPlotX, iPlotY)
if (newPlot:GetTerrainType() == GameInfoTypes["TERRAIN_SNOW"])
then
GiveRewardAndPersistence(iOwner, GameInfo.Buildings["BUILDING_CARTOGRAPHY_SNOW"].ID)
end
end
end
end --anonymous TileOwnershipChanged listener
GameEvents.TileOwnershipChanged.Add(cartographyAward[1])
GameEvents.TileOwnershipChanged.Add(cartographyAward[2])
GameEvents.TileOwnershipChanged.Add(cartographyAward[3])
GameEvents.TileOwnershipChanged.Add(cartographyAward[4])
GameEvents.TileOwnershipChanged.Add(cartographyAward[5])
GameEvents.TileOwnershipChanged.Add(cartographyAward[6])
--------------------------------------------------------------
-- OnPlayerAdoptPolicy POLICY_CARTOGRAPHY
--------------------------------------------------------------
function GiveCartographyBonus(adopterID, policyID)
if (policyID == iCartographyPolicyID)
then
local hasAtoll, hasIce, hasJungle, hasMarsh, hasOasis, hasSnow = false, false, false, false, false, false
for iPlotID = 0, Map.GetNumPlots()-1, 1 do
local loopPlot = Map.GetPlotByIndex(iPlotID)
if loopPlot:GetOwner() == adopterID
then
hasAtoll = hasAtoll or (loopPlot:GetFeatureType() == atoll)
hasIce = hasIce or (loopPlot:GetFeatureType() == ice)
hasJungle = hasJungle or (loopPlot:GetFeatureType() == jungle)
hasMarsh = hasMarsh or (loopPlot:GetFeatureType() == marsh)
hasOasis = hasOasis or (loopPlot:GetFeatureType() == oasis)
hasSnow = hasSnow or (loopPlot:GetTerrainType() == snow)
if hasAtoll and hasIce and hasJungle and hasMarsh and hasOasis and hasSnow
then
break
end
end
end
if hasAtoll then GiveRewardAndPersistence(adopterID, GameInfo.Buildings.BUILDING_CARTOGRAPHY_ATOLL.ID)
end
if hasIce then GiveRewardAndPersistence(adopterID, GameInfo.Buildings.BUILDING_CARTOGRAPHY_ICE.ID)
end
if hasJungle then GiveRewardAndPersistence(adopterID, GameInfo.Buildings.BUILDING_CARTOGRAPHY_JUNGLE.ID)
end
if hasMarsh then GiveRewardAndPersistence(adopterID, GameInfo.Buildings.BUILDING_CARTOGRAPHY_MARSH.ID)
end
if hasOasis then GiveRewardAndPersistence(adopterID, GameInfo.Buildings.BUILDING_CARTOGRAPHY_OASIS.ID)
end
if hasSnow then GiveRewardAndPersistence(adopterID, GameInfo.Buildings.BUILDING_CARTOGRAPHY_SNOW.ID)
end
-- then rely on the OnTileOwnershipChanged listener
end
end
GameEvents.PlayerAdoptPolicy.Add(GiveCartographyBonus)