--[[-----------------------------------------
Name: GetCivSpecificUnit
Purpose: Get the UnitType for a specific
civ from a UnitClassType.
-------------------------------------------]]
function fnGetCivSpecificUnit( pPly, sUnitClass ) -- Thanks whoward69
-- BEGIN DEFINES
local sUnitType = nil
local sCivType = GameInfo.Civilizations[ pPly:GetCivilizationType() ].Type
-- END DEFINES
--[[ Loop through civilization-specific UnitClass overrides, id est their unique units, and
yield to be returned the proper UnitType. --]]
for pOverride in GameInfo.Civilization_UnitClassOverrides{ CivilizationType = sCivType,
UnitClassType = sUnitClass } do
sUnitType = pOverride.UnitType
break
end
-- If we didn't get anything, yield to be returned the default UnitType for the UnitClass.
if sUnitType == nil then
sUnitType = GameInfo.UnitClasses[ sUnitClass ].DefaultUnit
end
-- Give whatever function called this the UnitType we yielded.
print( "Got Civ-Specific UnitType: " .. tostring( sUnitType ) .. ".\n" )
return sUnitType
end
--[[-----------------------------------------
Name: ReturnBestInfantryUnit
Purpose: Return the best land melee unit
that a city can build.
-------------------------------------------]]
function fnReturnBestInfantryUnit( pCity )
--BEGIN DEFINES
local pPly = pCity:GetOwner()
local possibleUnitClasses = {
GameInfoTypes.UNITCLASS_MECH,
GameInfoTypes.UNITCLASS_MECHANIZED_INFANTRY,
GameInfoTypes.UNITCLASS_INFANTRY,
GameInfotypes.UNITCLASS_GREAT_WAR_INFANTRY,
GameInfoTypes.UNITCLASS_RIFLEMAN,
GameInfoTypes.UNITCLASS_MUSKETMAN,
GameInfoTypes.UNITCLASS_LONGSWORDSMAN,
GameInfoTypes.UNITCLASS_PIKEMAN,
GameInfoTypes.UNITCLASS_SWORDSMAN,
GameInfoTypes.UNITCLASS_SPEARMAN,
GameInfoTypes.UNITCLASS_WARRIOR
} -- Thanks whoward69
--END DEFINES
-- Loop through each UnitClassType in the above defined table, see if the city can
-- train it's owner's specific UnitType. Yield to be returned the best land melee
-- UnitType the city can build.
for _, iUnitClass in ipairs( possibleUnitClasses ) do -- Thanks whoward69
if pCity:CanTrain( fn_GetCivSpecificUnit( pPly, iUnitClass ) ) then
print( "Unit to be given: " .. tostring( fn_GetCivSpecificUnit( pPly, iUnitClass ) .. ".\n" )
return fn_GetCivSpecificUnit( pPly, iUnitClass )
end
end
-- Uh-oh!
return -1
end
GameEvents.SetPopulation.Add( function( xOffset, yOffset, fOldPop, fNewPop )
-- BEGIN DEFINES
local pPlot = Map.GetPlot( xOffset, yOffset )
local pCity = pPlot:GetPlotCity()
local pPly = pCity:GetOwner()
local iUnitMostCurrent = nil
local nTrait = GameInfo.Traits[ pPly ].UnitPerCapitalGrowths
local sUnitAIType = GameInfo.UnitAITypes.UNITAI_DEFENSE.ID
local nZenith = math.floor( pCity:GetHighestPopulation() )
local strGrowFallen = nil
-- END DEFINES
--[[ On every growth of every city, run through the following list of conditions:
1: Does the city's owner have the trait, and is its population evenly divisible
by the trait?
2: Is the city a capital?
3: Has the city grown instead of shrinking, and is this the city's highest
population?
If all of the above are true, get the best land infantry unit we can, and
spawn it at the city. --]]
if fNewPop > fOldPop then
strGrowFallen = "grown"
else
strGrowFallen = "fallen"
end
print( pCity:GetName() .. "'s Population has " .. strGrowFallen .. " from " .. tostring( fOldPop ) .. " to " .. tostring( fNewPop ) .. "! Highest Population" )
if ( nTrait > 0 &&
( math.floor( fNewPop ) % nTrait ) == 0 ) then
print( pPly:GetName() .. " has the trait, and the population is divisible by the trait.\n" )
if pCity:IsCapital() then
print( pCity:GetName() .. " is the capital of " .. pPly:GetName() .. "'s empire.\n" )
if ( fNewPop > fOldPop ) &&
fNewPop >= nZenith then
print( pCity:GetName() "'s current population is more than its previous population, and its population has reached a new level!" )
iFreeUnit = fnReturnBestInfantryUnit( pCity )
pPly:AddFreeUnit( iFreeUnit, iUnitAIType ) --[[ What are the
implications of this line? --]]
end
end
end
end )