View difference between Paste ID: MvCr5yCa and 9ZYSSW5Q
SHOW: | | - or go back to the newest paste.
1
--[[-----------------------------------------
2
Name:		 GetCivSpecificUnit
3
Purpose: 	 Get the UnitType for a specific
4
civ from a UnitClassType.
5
-------------------------------------------]]
6
function fnGetCivSpecificUnit(pPly, sUnitClass) -- Thanks whoward69
7
8
	-- BEGIN DEFINES
9
	local sUnitType = nil
10
	local sCivType 	= GameInfo.Civilizations[pPly:GetCivilizationType()].Type
11
	-- END DEFINES
12
	
13-
	--[ Loop through civilization-specific UnitClass overrides, id est their unique units, and 
13+
	--[[ Loop through civilization-specific UnitClass overrides, id est their unique units, and 
14-
	yield to be returned the proper UnitType. --] 
14+
	yield to be returned the proper UnitType. --]]
15
	for pOverride in GameInfo.Civilization_UnitClassOverrides{CivilizationType = sCivType,
16
	UnitClassType = sUnitClass} do
17
		sUnitType = pOverride.UnitType
18
		break
19
	end
20
21
	-- If we didn't get anything, yield to be returned the default UnitType for the UnitClass.
22
	if (sUnitType == nil) then
23
		sUnitType = GameInfo.UnitClasses[sUnitClass].DefaultUnit
24
	end
25
26
	-- Give whatever function called this the UnitType we yielded.
27
	return sUnitType
28
end
29
30
--[[-----------------------------------------
31
Name:  		ReturnBestInfantryUnit
32
Purpose:	Return the best land melee unit
33
that a city can build.  
34
-------------------------------------------]]
35
function fnReturnBestInfantryUnit( pCity )
36
37
	--BEGIN DEFINES
38
	local pPly = pCity:GetOwner()
39
	
40
	local possibleUnitClasses = { 
41
	GameInfoTypes.UNITCLASS_MECH,
42
	GameInfoTypes.UNITCLASS_MECHANIZED_INFANTRY, 
43
	GameInfoTypes.UNITCLASS_INFANTRY, 
44
	GameInfotypes.UNITCLASS_GREAT_WAR_INFANTRY, 
45
	GameInfoTypes.UNITCLASS_RIFLEMAN, 
46
	GameInfoTypes.UNITCLASS_MUSKETMAN, 
47
	GameInfoTypes.UNITCLASS_LONGSWORDSMAN, 
48
	GameInfoTypes.UNITCLASS_PIKEMAN, 
49
	GameInfoTypes.UNITCLASS_SWORDSMAN, 
50
	GameInfoTypes.UNITCLASS_SPEARMAN, 
51
	GameInfoTypes.UNITCLASS_WARRIOR
52
	} -- Thanks whoward69
53
	--END DEFINES
54
	
55
	-- Loop through each UnitClassType in the above defined table, see if the city can 
56
	-- train it's owner's specific UnitType.  Yield to be returned the best land melee 
57
	-- UnitType the city can build.
58
	for _, iUnitClass in ipairs(possibleUnitClasses) do -- Thanks whoward69
59
		if pCity:CanTrain( fn_GetCivSpecificUnit( pPly, iUnitClass ) ) then
60
			return fn_GetCivSpecificUnit( pPly, iUnitClass )
61
		end
62
	end
63
64
	-- Uh-oh!
65
	return -1
66
end
67
68
GameEvents.SetPopulation.Add( function( xOffset, yOffset, fOldPop, fNewPop )
69
70
	-- BEGIN DEFINES
71
	local pPlot			= Map.GetPlot( xOffset, yOffset )
72
	local pCity  			= pPlot:GetPlotCity()
73
	local pPly 			= pCity:GetOwner()
74
	local iUnitMostCurrent		= nil
75
	local nTrait			= GameInfo.Traits[pPly].UnitPerCapitalGrowths
76
	local sUnitAIType		= GameInfo.UnitAITypes.UNITAI_DEFENSE.ID
77
	local nZenith			= math.floor( pCity:GetHighestPopulation() )
78
	-- END DEFINES
79
80-
	--[ On every growth of every city, run through the following list of conditions:
80+
	--[[ On every growth of every city, run through the following list of conditions:
81
	1:  Does the city's owner have the trait, and is its population evenly divisible 
82
	by the trait?
83
	2:  Is the city a capital?
84
	3:  Has the city grown instead of shrinking, and is this the city's highest 
85
	population?
86
87
	If all of the above are true, get the best land infantry unit we can, and 
88-
	spawn it at the city. --]
88+
	spawn it at the city. --]]
89
90
	if ( nTrait > 0 &&
91
	( math.floor( fNewPop ) % nTrait ) == 0 ) && then 
92
		if pCity:IsCapital() then
93
			if ( fNewPop > fOldPop ) &&
94
			fNewPop >= nZenith then
95
				iFreeUnit = fnReturnBestInfantryUnit( pCity )
96
97
				pPly:AddFreeUnit( iFreeUnit, iUnitAIType ) -- What are the 
98
				implications of this line?
99
			end
100
		end
101
	end
102
end )