local GameEvents = GameEvents
local GameInfo = GameInfo
local GameInfoTypes = GameInfoTypes
local Players = Players
local Teams = Teams
-----------------------------------------------
-- SETTINGS
-----------------------------------------------
-- Select whether you want to unlock it with specified tech, or after discovering Cargo Ship's PrereqTech
local g_UnlockWithTech = false
local iTechnology = GameInfoTypes.TECH_INDUSTRIALIZATION --Set as fallback tech, you can change this if you want
local g_UnlockWithCargoShipTech = false
if not g_UnlockWithTech then
g_UnlockWithCargoShipTech = true
end
local ePrereqTech = GameInfo.Units.UNIT_CARGO_SHIP.PrereqTech --So it can follow any changes from the database
if g_UnlockWithCargoShipTech and ePrereqTech ~= nil then
iTechnology = GameInfoTypes.ePrereqTech
end
-----------------------------------------------
-- END SETTINGS
-----------------------------------------------
local iMissionLand = GameInfoTypes.MISSION_CONVERT_LAND
local iMissionSea = GameInfoTypes.MISSION_CONVERT_SEA
local iUnitClassCaravan = GameInfoTypes.UNITCLASS_CARAVAN
local iUnitClassCargoShip = GameInfoTypes.UNITCLASS_CARGO_SHIP
local CUSTOM_MISSION_NO_ACTION = 0
local CUSTOM_MISSION_ACTION = 1
local CUSTOM_MISSION_DONE = 2
local CUSTOM_MISSION_ACTION_AND_DONE = 3
function OnCustomMissionPossible(iPlayer, iUnit, iMission, _, _, _, _, iPlotX, iPlotY, bTestVisible)
if (iMission == iMissionLand or iMission == iMissionSea) then
local pPlayer = Players[iPlayer]
local iTeam = pPlayer:GetTeam()
local pTeamTechs = Teams[iTeam]:GetTeamTechs()
local pUnit = pPlayer:GetUnitByID(iUnit)
local iUnitClass = pUnit:GetUnitClassType()
local pUnitPlot = pUnit:GetPlot()
if ((iUnitClass == iUnitClassCaravan and iMission == iMissionLand) or (iUnitClass == iUnitClassCargoShip and iMission == iMissionSea)) then
if (pTeamTechs:HasTech(iTechnology)) then
local pCity = pUnitPlot:GetPlotCity()
if (pCity and (pCity:GetOwner() == iPlayer and pCity:IsCoastal())) then
return true
end
return bTestVisible --the right unit but can't do the action
end
end
end
return false
end
function OnCustomMissionStart(iPlayer, iUnit, iMission, _, _, _, _)
if (iMission == iMissionLand or iMission == iMissionSea) then
local pPlayer = Players[iPlayer]
local iUnitCaravan = GameInfoTypes[GetCivSpecificUnit(pPlayer, "UNITCLASS_CARAVAN")]
local iUnitCargoShip = GameInfoTypes[GetCivSpecificUnit(pPlayer, "UNITCLASS_CARGO_SHIP")]
local pUnit = pPlayer:GetUnitByID(iUnit)
local iUnitX = pUnit:GetX()
local iUnitY = pUnit:GetY()
if (iMission == iMissionLand) then
local tradeUnit = pPlayer:InitUnit(iUnitCargoShip, iUnitX, iUnitY)
tradeUnit:SetMoves(0)
else
local tradeUnit = pPlayer:InitUnit(iUnitCaravan, iUnitX, iUnitY)
tradeUnit:SetMoves(0)
end
pUnit:Kill()
end
return CUSTOM_MISSION_NO_ACTION
end
GameEvents.CustomMissionStart.Add(OnCustomMissionStart)
GameEvents.CustomMissionPossible.Add(OnCustomMissionPossible)
function GetCivSpecificUnit(pPlayer, sUnitClass)
local sUnitType = nil
local sCivType = GameInfo.Civilizations[pPlayer:GetCivilizationType()].Type
for pOverride in GameInfo.Civilization_UnitClassOverrides{CivilizationType = sCivType, UnitClassType = sUnitClass} do
sUnitType = pOverride.UnitType
break
end
if (sUnitType == nil) then
sUnitType = GameInfo.UnitClasses[sUnitClass].DefaultUnit
end
return sUnitType
end