local g_nextAvailablePlayerIndex
for iPlayer = 1, GameDefines.MAX_PLAYERS - 1 do
if PreGame.GetSlotStatus(iPlayer) == SlotStatus.SS_OBSERVER then
g_nextAvailablePlayerIndex = iPlayer
break
end
end
function CloneAsDifferentCivilization(iOldPlayer, newCivID)
--Swaps civ in-place. New civ will have cities, units, techs, policies, gold, faith, etc. from old civ
local iNewPlayer = g_nextAvailablePlayerIndex
g_nextAvailablePlayerID = g_nextAvailablePlayerIndex + 1
local newCivInfo = GameInfo.Civilizations[newCivID]
local oldPlayer = Players[iOldPlayer]
local iTeam = oldPlayer:GetTeam() --use same team to preserve FOW, techs & war status.
--Get the proper leader for the new civ
local newLeaderID
for row in GameInfo.Civilization_Leaders() do
if newCivInfo.Type == row.CivilizationType then
newLeaderID = GameInfoTypes[row.LeaderheadType]
break
end
end
if not newLeaderID then
error("PlayerCivSwap: No leader for new civ type")
end
--Add new player here?
print("AddPlayer")
Game.AddPlayer(iNewPlayer, newLeaderID, newCivID)
--Setup the new player in PreGame
PreGame.SetLeaderName(iNewPlayer, GameInfo.Leaders[newLeaderID].Description)
PreGame.SetCivilizationDescription(iNewPlayer, newCivInfo.Description)
PreGame.SetCivilizationShortDescription(iNewPlayer, newCivInfo.ShortDescription)
PreGame.SetCivilizationAdjective(iNewPlayer, newCivInfo.Adjective)
PreGame.SetPassword(iNewPlayer, "")
PreGame.SetCivilization(iNewPlayer, newCivID)
PreGame.SetLeaderType(iNewPlayer, newLeaderID)
PreGame.SetTeam(iNewPlayer, iTeam)
PreGame.SetHandicap(iNewPlayer, oldPlayer:GetHandicapType())
PreGame.SetSlotStatus(iNewPlayer, SlotStatus.SS_COMPUTER)
PreGame.SetSlotClaim(iNewPlayer, SlotClaim.SLOTCLAIM_ASSIGNED)
print("GetSlotStatus = ", PreGame.GetSlotStatus(iNewPlayer))
local newPlayer = Players[iNewPlayer]
newPlayer:SetStartingPlot(oldPlayer:GetStartingPlot())
print("New player team is / should be= ", newPlayer:GetTeam(), iTeam)
print("Starting plot, old/new = ", oldPlayer:GetStartingPlot(), newPlayer:GetStartingPlot())
--Clone the old player
[COLOR="Grey"]--[[ DISABLED
for city in oldPlayer:Cities() do
local plot = city:Plot()
local bOccupied, bPuppet = city:IsOccupied(), city:IsPuppet()
print(bOccupied, bPuppet)
newPlayer:AcquireCity(city, false, false)
local newCity = plot:GetPlotCity()
print(newCity:GetName())
print(newCity:IsOccupied())
newCity:SetOccupied(bOccupied)
newCity:SetPuppet(bPuppet)
print(newCity:IsOccupied())
--need: SetWeLoveTheKingDayCounter, SetResourceDemanded
--what about build queue and progresses (can loop through everything if needed)
end
for unit in oldPlayer:Units() do
local newUnit = newPlayer:InitUnit(unit:GetUnitType(), unit:GetX(), unit:GetY())
newUnit:Convert(unit) --gets promotions & damage, but not original owner
if newUnit:GetOriginalOwner() == iOldPlayer then
newUnit:SetOriginalOwner(iNewPlayer)
end
--unit movement?
end
newPlayer:SetGold(oldPlayer:GetGold())
newPlayer:SetFaith(oldPlayer:GetFaith())
newPlayer:SetJONSCulture(oldPlayer:GetJONSCulture())
for policyBranchInfo in GameInfo.PolicyBranchTypes() do
if oldPlayer:IsPolicyBranchUnlocked(policyBranchInfo.ID) then
newPlayer:SetPolicyBranchUnlocked(policyBranchInfo.ID, true)
end
end
for policyInfo in GameInfo.Policies() do
if oldPlayer:HasPolicy(policyInfo.ID) then
newPlayer:SetHasPolicy(policyInfo.ID, true)
end
end
local researchQueue = {}
for techInfo in GameInfo.Technologies() do
local queuePos = oldPlayer:GetQueuePosition(techInfo.ID)
if queuePos ~= -1 then
researchQueue[queuePos] = techInfo.ID
end
end
newPlayer:ClearResearchQueue()
for i = 0, #researchQueue do
newPlayer:PushResearch(researchQueue[i], false)
end
--Not needed by mod: trade routes, ideologies, influence, tourism, great works
]][/COLOR]
--DEBUG: just add new player and leave player 0 unmolested
local oldCapital = oldPlayer:GetCapitalCity()
local newCity = newPlayer:InitCity(oldCapital:GetX()+3, oldCapital:GetY())
--Will this be the active player?
if Game.GetActivePlayer() == iOldPlayer then
print("Changing active player to ", iNewPlayer)
Game.SetActivePlayer(iNewPlayer, false)
PreGame.SetSlotStatus(iOldPlayer, SlotStatus.SS_COMPUTER)
PreGame.SetSlotStatus(iNewPlayer, SlotStatus.SS_TAKEN)
end
print("GetSlotStatus = old / new", PreGame.GetSlotStatus(iOldPlayer), PreGame.GetSlotStatus(iNewPlayer))
end
GameEvents.PlayerDoTurn.Add(function(iPlayer) print("PlayerDoTurn for player ", iPlayer) end)