Please help with lua trait for Anno Domini

Tested and working, and yes you could split the code as you describe

Code:
--------------------------------------------------------------------
local g_iMitanniPlayer = -1
local g_iMitanniTeam = -1
local g_bMitanniAtWar = false
local g_iPalaceClass = GameInfoTypes.BUILDINGCLASS_PALACE

--------------------------------------------------------------------
function OnCityCreated(_, iPlayer)
  print(string.format("OnCityCreated(_, %i)", iPlayer))
  if (iPlayer == g_iMitanniPlayer) then
    UpdateMitanniBonusYields()
  end
end

function OnCityDestroyed(_, iPlayer, _, iNewPlayer)
  print(string.format("OnCityDestroyed(_, %i, _, %i)", iPlayer, iNewPlayer))
  if (iPlayer == g_iMitanniPlayer or iNewPlayer == g_iMitanniPlayer) then
    UpdateMitanniBonusYields()
  end
end

--------------------------------------------------------------------
-- There is a HUGE problem with this event, it doesn't trigger when a civ is conquered
function OnWarStateChanged(iMyTeam, iTheirTeam, bWar)
  print(string.format("OnWarStateChanged(%i, %i, %s)", iMyTeam, iTheirTeam, (bWar and "true" or "false")))
  if (iMyTeam == g_iMitanniTeam and bWar ~= g_bMitanniAtWar) then
    UpdateMitanniBonusYields()
  end
end

--------------------------------------------------------------------
function AtWarWithAnyMajor(iTeam)
  local pTeam = Teams[iTeam]

  for iOtherPlayer = 0, GameDefines.MAX_MAJOR_CIVS - 1, 1 do
    local pOtherPlayer = Players[iOtherPlayer]
    if (pOtherPlayer:IsAlive() and pTeam:IsAtWar(pOtherPlayer:GetTeam())) then
      print(string.format("Team %i is at war with (at least) player %i", iTeam, iOtherPlayer))
      return true
    end
  end

  print(string.format("Team %i is at war with nobody", iTeam))
  return false
end

--------------------------------------------------------------------
function UpdateMitanniBonusYields()
  local pPlayer = Players[g_iMitanniPlayer]
  local pCapital = pPlayer:GetCapitalCity()
  local iBoost = pPlayer:GetNumCities()

  g_bMitanniAtWar = AtWarWithAnyMajor(g_iMitanniTeam)

  pPlayer:ChangeJONSCulturePerTurnForFree(-1 * pCapital:GetBuildingYieldChange(g_iPalaceClass, YieldTypes.YIELD_CULTURE))

  if (g_bMitanniAtWar) then
    print("Update bonus yields when at war")
    pCapital:SetBuildingYieldChange(g_iPalaceClass, YieldTypes.YIELD_PRODUCTION, 0)
    pCapital:SetBuildingYieldChange(g_iPalaceClass, YieldTypes.YIELD_CULTURE, 2 * iBoost)
  else
    print("Update bonus yields when at peace")
    pCapital:SetBuildingYieldChange(g_iPalaceClass, YieldTypes.YIELD_PRODUCTION, iBoost)
    pCapital:SetBuildingYieldChange(g_iPalaceClass, YieldTypes.YIELD_CULTURE, 0)
  end

  pPlayer:ChangeJONSCulturePerTurnForFree(pCapital:GetBuildingYieldChange(g_iPalaceClass, YieldTypes.YIELD_CULTURE))
end

--------------------------------------------------------------------
function Init()
  for iPlayer = 0, GameDefines.MAX_MAJOR_CIVS - 1, 1 do
    local pPlayer = Players[iPlayer]
    if (pPlayer:IsEverAlive()) then
      if (pPlayer:GetCivilizationType() == GameInfoTypes.CIVILIZATION_MITANNI) then
        g_iMitanniPlayer = iPlayer
        g_iMitanniTeam = pPlayer:GetTeam()
        break
      end
    end
  end

  if (g_iMitanniPlayer ~= -1) then
    g_bMitanniAtWar = AtWarWithAnyMajor(g_iMitanniTeam)

    Events.SerialEventCityCreated.Add(OnCityCreated)
    Events.SerialEventCityDestroyed.Add(OnCityDestroyed)
    Events.SerialEventCityCaptured.Add(OnCityDestroyed)

    Events.WarStateChanged.Add(OnWarStateChanged)

    print("MitanniUA loaded")
  end
end

--------------------------------------------------------------------
Init()
 
Back
Top Bottom