Skip to content

Commit

Permalink
Improve last part of Aeon 6 mission
Browse files Browse the repository at this point in the history
  • Loading branch information
speed2CZ committed Nov 26, 2022
1 parent 8349147 commit 0564ea5
Show file tree
Hide file tree
Showing 7 changed files with 23,048 additions and 13,493 deletions.
75 changes: 74 additions & 1 deletion SCCA_Coop_A06/SCCA_Coop_A06_CustomFunctions.lua
Original file line number Diff line number Diff line change
Expand Up @@ -57,10 +57,83 @@ function MultipleExperimentalsThread(platoon)
end
end

--- Adds the platoon to the base's guard pool from which other platoons can request guards.
function AddToNavalGuardPool(platoon)
local data = platoon.PlatoonData
local base = platoon:GetBrain().BaseManagers[data.LocationType]
if not base.NavalGuardPlatoons then
base.NavalGuardPlatoons = {}
end

table.insert(base.NavalGuardPlatoons, platoon)
platoon:AddDestroyCallback(RemoveFromNavalGuardPool)

if data.RallyPoint then
platoon:MoveToLocation(ScenarioUtils.MarkerToPosition(data.RallyPoint), false)
end
end

function RemoveFromNavalGuardPool(brain, platoon)
local base = brain.BaseManagers[platoon.PlatoonData.LocationType]
if not base.NavalGuardPlatoons then
return
end

table.removeByValue(base.NavalGuardPlatoons, platoon)
end

function GetAvailableGuardUnit(brain, baseName, cats, num)
num = num or 1
local availablePlatoons = brain.BaseManagers[baseName].NavalGuardPlatoons
if not availablePlatoons then
return
end

local result = {}

for _, platoon in availablePlatoons do
for _, unit in platoon:GetPlatoonUnits() do
if EntityCategoryContains(cats, unit) then
table.insert(result, unit)

if table.getn(result) == num then
return result
end
end
end
end
end

function RequestAmphibiousGuard(platoon)
local baseName = platoon.PlatoonData.LocationType
local brain = platoon:GetBrain()

for _, unit in platoon:GetPlatoonUnits() do
local guardUnits = nil
if unit.techCategory == "TECH1" then
continue
elseif unit.techCategory == "TECH2" then
if EntityCategoryContains(categories.CRUISER, unit) then
guardUnits = GetAvailableGuardUnit(brain, baseName, categories.ual0307, 1)
else
guardUnits = GetAvailableGuardUnit(brain, baseName, categories.ual0307 + categories.ual0205, 1)
end
else
guardUnits = GetAvailableGuardUnit(brain, baseName, categories.ual0307 + categories.ual0205, 2)
end

if guardUnits then
brain:AssignUnitsToPlatoon(platoon, guardUnits, 'support', 'NoFormation')
IssueClearCommands(guardUnits)
IssueGuard(guardUnits, unit)
end
end
end

function EnableStealthOnAir()
local T3AirUnits = {}
while true do
for _, v in ArmyBrains[Cybran]:GetListOfUnits(categories.ura0303 + categories.ura0304, false) do
for _, v in ArmyBrains[Cybran]:GetListOfUnits(categories.ura0303 + categories.ura0304 + categories.ura0401, false) do
if not ( T3AirUnits[v:GetEntityId()] or v:IsBeingBuilt() ) then
v:ToggleScriptBit('RULEUTC_StealthToggle')
T3AirUnits[v:GetEntityId()] = true
Expand Down
71 changes: 0 additions & 71 deletions SCCA_Coop_A06/SCCA_Coop_A06_EditorFunctions.lua

This file was deleted.

135 changes: 104 additions & 31 deletions SCCA_Coop_A06/SCCA_Coop_A06_m2cybranai.lua
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@ function CybranM2BaseAI()
CybranM2Base:InitializeDifficultyTables(ArmyBrains[Cybran], 'M2_Cybran_Base', 'M2_Cybran_Base_Marker', 150, {M2_Base = 100})
CybranM2Base:StartNonZeroBase({{6, 10, 14}, {6, 9, 12}})
CybranM2Base:SetActive('AirScouting', true)
CybranM2Base:AddBuildGroup('M2_Base_Support_Factories', 100, true)

CybranM2BaseAirAttacks()
CybranM2BaseLandAttacks()
Expand All @@ -35,9 +34,9 @@ function CybranM2BaseAirAttacks()
-- Transport builder, maintain 8 transports
opai = CybranM2Base:AddOpAI('EngineerAttack', 'M2_TransportBuilder',
{
MasterPlatoonFunction = {SPAIFileName, 'LandAssaultWithTransports'},
MasterPlatoonFunction = {SPAIFileName, 'TransportPool'},
PlatoonData = {
TransportReturn = 'M2_Cybran_Base_Marker',
TransportMoveLocation = 'M2_Cybran_Base_Marker',
},
Priority = 1000,
}
Expand All @@ -53,44 +52,80 @@ function CybranM2BaseAirAttacks()
MasterPlatoonFunction = {SPAIFileName, 'PatrolChainPickerThread'},
PlatoonData = {
PatrolChains = {
'M2_Cybran_Amphibious_Chain_1',
'M2_Cybran_Amphibious_Chain_2',
'M2_Cybran_Amphibious_Chain_3',
'M1_Cybran_Naval_Attack_Chain',
'M1_Cybran_Naval_Attack_Chain_1',
'M1_Cybran_Naval_Attack_Chain_3',
},
},
Priority = 100,
}
)
opai:SetChildQuantity('Gunships', quantity[Difficulty])

quantity = {9, 15, 24}
opai = CybranM2Base:AddOpAI('AirAttacks', 'M2_Cybran_Base_AirAttack_2',
{
MasterPlatoonFunction = {SPAIFileName, 'SplitPatrolThread'},
PlatoonData = {
PatrolChains = {
'M1_Cybran_Naval_Attack_Chain',
'M1_Cybran_Naval_Attack_Chain_1',
'M1_Cybran_Naval_Attack_Chain_3',
},
},
Priority = 110,
}
)
opai:SetChildQuantity('Bombers', quantity[Difficulty])

quantity = {9, 12, 15}
trigger = {20, 15, 10}
opai = CybranM2Base:AddOpAI('AirAttacks', 'M2_Cybran_Base_AirAttack_3',
{
MasterPlatoonFunction = {SPAIFileName, 'PatrolChainPickerThread'},
PlatoonData = {
PatrolChains = {
'M2_Cybran_Amphibious_Chain_1',
'M2_Cybran_Amphibious_Chain_2',
'M2_Cybran_Amphibious_Chain_3',
'M1_Cybran_Naval_Attack_Chain',
'M1_Cybran_Naval_Attack_Chain_1',
'M1_Cybran_Naval_Attack_Chain_3',
},
},
Priority = 110,
}
)
opai:SetChildQuantity('StratBombers', 3)
opai:SetChildQuantity('TorpedoBombers', quantity[Difficulty])
opai:AddBuildCondition('/lua/editor/otherarmyunitcountbuildconditions.lua',
'BrainsCompareNumCategory', {'default_brain', {'HumanPlayers'}, trigger[Difficulty], categories.NAVAL, '>='})

quantity = {2, 3, 6}
opai = CybranM2Base:AddOpAI('AirAttacks', 'M2_Cybran_Base_AirAttack_4',
{
MasterPlatoonFunction = {SPAIFileName, 'PatrolChainPickerThread'},
PlatoonData = {
PatrolChains = {
'M1_Cybran_Naval_Attack_Chain',
'M1_Cybran_Naval_Attack_Chain_1',
'M1_Cybran_Naval_Attack_Chain_3',
},
},
Priority = 120,
}
)
opai:SetChildQuantity('StratBombers', quantity[Difficulty])

quantity = {6, 9, 12}
trigger = {10, 11, 12}
opai = CybranM2Base:AddOpAI('AirAttacks', 'M2_Cybran_Base_AirAttack_3',
opai = CybranM2Base:AddOpAI('AirAttacks', 'M2_Cybran_Base_AirAttack_5',
{
MasterPlatoonFunction = {SPAIFileName, 'PatrolChainPickerThread'},
PlatoonData = {
PatrolChains = {
'M2_Cybran_Amphibious_Chain_1',
'M2_Cybran_Amphibious_Chain_2',
'M2_Cybran_Amphibious_Chain_3',
'M1_Cybran_Naval_Attack_Chain',
'M1_Cybran_Naval_Attack_Chain_1',
'M1_Cybran_Naval_Attack_Chain_3',
},
},
Priority = 120,
Priority = 130,
}
)
opai:SetChildQuantity('AirSuperiority', quantity[Difficulty])
Expand All @@ -112,7 +147,6 @@ function CybranM2BaseLandAttacks()
PatrolChains = {
'M2_Cybran_Amphibious_Chain_1',
'M2_Cybran_Amphibious_Chain_2',
'M2_Cybran_Amphibious_Chain_3',
},
},
Priority = 100,
Expand Down Expand Up @@ -170,9 +204,13 @@ function CybranM2BaseNavalAttacks()
quantity = {{3, 3}, {6, 3}, {12, 6}}
opai = CybranM2Base:AddOpAI('NavalAttacks', 'M2_Cybran_Base_NavalAttack_1',
{
MasterPlatoonFunction = {SPAIFileName, 'PatrolThread'},
MasterPlatoonFunction = {SPAIFileName, 'PatrolChainPickerThread'},
PlatoonData = {
PatrolChain = 'M1_Cybran_Naval_Attack_Chain'
PatrolChains = {
'M1_Cybran_Naval_Attack_Chain',
'M1_Cybran_Naval_Attack_Chain_1',
'M1_Cybran_Naval_Attack_Chain_2'
},
},
Priority = 100,
}
Expand All @@ -181,25 +219,52 @@ function CybranM2BaseNavalAttacks()

opai = CybranM2Base:AddOpAI('NavalAttacks', 'M2_Cybran_Base_NavalAttack_2',
{
MasterPlatoonFunction = {SPAIFileName, 'PatrolThread'},
MasterPlatoonFunction = {SPAIFileName, 'PatrolChainPickerThread'},
PlatoonData = {
PatrolChain = 'M1_Cybran_Naval_Attack_Chain'
PatrolChains = {
'M1_Cybran_Naval_Attack_Chain',
'M1_Cybran_Naval_Attack_Chain_1',
'M1_Cybran_Naval_Attack_Chain_2'
},
},
Priority = 110,
}
)
opai:SetChildQuantity({'Destroyers', 'Frigates'}, {3, 6})

quantity = {{2, 1}, {3, 1, 4}, {4, 2, 6}}
quantity = {2, 4, 6}
trigger = {15, 12, 9}
opai = CybranM2Base:AddOpAI('NavalAttacks', 'M2_Cybran_Base_NavalAttack_3',
{
MasterPlatoonFunction = {SPAIFileName, 'PatrolThread'},
MasterPlatoonFunction = {SPAIFileName, 'PatrolChainPickerThread'},
PlatoonData = {
PatrolChain = 'M1_Cybran_Naval_Attack_Chain'
PatrolChains = {
'M1_Cybran_Naval_Attack_Chain',
'M1_Cybran_Naval_Attack_Chain_1',
'M1_Cybran_Naval_Attack_Chain_2'
},
},
Priority = 120,
}
)
opai:SetChildQuantity('Destroyers', 3)
opai:AddBuildCondition('/lua/editor/otherarmyunitcountbuildconditions.lua',
'BrainsCompareNumCategory', {'default_brain', {'HumanPlayers'}, trigger[Difficulty], categories.NAVAL * categories.MOBILE - categories.TECH1, '>='})

quantity = {{2, 1}, {3, 1, 4}, {4, 2, 6}}
opai = CybranM2Base:AddOpAI('NavalAttacks', 'M2_Cybran_Base_NavalAttack_4',
{
MasterPlatoonFunction = {SPAIFileName, 'PatrolChainPickerThread'},
PlatoonData = {
PatrolChains = {
'M1_Cybran_Naval_Attack_Chain',
'M1_Cybran_Naval_Attack_Chain_1',
'M1_Cybran_Naval_Attack_Chain_2'
},
},
Priority = 130,
}
)
if Difficulty >= 2 then
opai:SetChildQuantity({'Destroyers', 'Cruisers', 'Submarines'}, quantity[Difficulty])
else
Expand All @@ -208,26 +273,34 @@ function CybranM2BaseNavalAttacks()
opai:AddBuildCondition('/lua/editor/otherarmyunitcountbuildconditions.lua',
'BrainsCompareNumCategory', {'default_brain', {'HumanPlayers'}, 3, categories.NAVAL * categories.MOBILE - categories.TECH1, '>='})

opai = CybranM2Base:AddOpAI('NavalAttacks', 'M2_Cybran_Base_NavalAttack_4',
opai = CybranM2Base:AddOpAI('NavalAttacks', 'M2_Cybran_Base_NavalAttack_5',
{
MasterPlatoonFunction = {SPAIFileName, 'PatrolThread'},
MasterPlatoonFunction = {SPAIFileName, 'PatrolChainPickerThread'},
PlatoonData = {
PatrolChain = 'M1_Cybran_Naval_Attack_Chain'
PatrolChains = {
'M1_Cybran_Naval_Attack_Chain',
'M1_Cybran_Naval_Attack_Chain_1',
'M1_Cybran_Naval_Attack_Chain_2'
},
},
Priority = 130,
Priority = 140,
}
)
opai:SetChildQuantity({'Battleships', 'Destroyers'}, {1, 4})
opai:AddBuildCondition('/lua/editor/otherarmyunitcountbuildconditions.lua',
'BrainsCompareNumCategory', {'default_brain', {'HumanPlayers'}, 6, categories.NAVAL * categories.MOBILE - categories.TECH1, '>='})

opai = CybranM2Base:AddOpAI('NavalAttacks', 'M2_Cybran_Base_NavalAttack_5',
opai = CybranM2Base:AddOpAI('NavalAttacks', 'M2_Cybran_Base_NavalAttack_6',
{
MasterPlatoonFunction = {SPAIFileName, 'PatrolThread'},
MasterPlatoonFunction = {SPAIFileName, 'PatrolChainPickerThread'},
PlatoonData = {
PatrolChain = 'M1_Cybran_Naval_Attack_Chain'
PatrolChains = {
'M1_Cybran_Naval_Attack_Chain',
'M1_Cybran_Naval_Attack_Chain_1',
'M1_Cybran_Naval_Attack_Chain_2'
},
},
Priority = 140,
Priority = 150,
}
)
opai:SetChildQuantity('Battleships', 3)
Expand Down
Loading

0 comments on commit 0564ea5

Please sign in to comment.