Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Integrate Oxygen Scenario Framework #118

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
112 changes: 112 additions & 0 deletions lua/Oxygen/AdvancedCinematics.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
local Cinematics = import('/lua/cinematics.lua')
local ScenarioUtils = import('/lua/sim/ScenarioUtilities.lua')
local ScenarioFramework = import('/lua/ScenarioFramework.lua')
local Triggers = import("Triggers.lua")

---@type TimerTrigger
local delayClearIntel = Triggers
.TimerTrigger(ScenarioFramework.ClearIntel)
:Delay(0.1)


---@type table<string, VisionHandler>
local visionMarkers = {}


---@class VisionHandler
---@field _marker VizMarker
---@field clearIntel boolean
---@field toBeDestroyed boolean
VisionHandler = ClassSimple
{
---inits VisionHandler
---@param self VisionHandler
---@param vizMarker VizMarker
__init = function(self, vizMarker)
self._marker = vizMarker

end,

---Sets VisionHandler to be destroyed after NIS mode
---@param self VisionHandler
---@param clearIntel? boolean
DestroyOnExit = function(self, clearIntel)
self.clearIntel = clearIntel
self.toBeDestroyed = true
end,

---Destorys VisionHandler
---@param self VisionHandler
---@param clearIntel? boolean
Destroy = function(self, clearIntel)
if clearIntel then
delayClearIntel:Run(Vector(self._marker.X, 0, self._marker.Z), self._marker.Radius + 10)
end
self._marker:Destroy()
self._marker = nil
end,
}

---Creates vision area at location of given radius for army
---@param location Marker
---@param radius number
---@param armyBrain AIBrain
---@param lifetime? number
---@return VisionHandler
function VisionAtLocation(location, radius, armyBrain, lifetime)
local viz = ScenarioFramework.CreateVisibleAreaLocation(radius, location, lifetime or 0, armyBrain)
local handler = VisionHandler(viz)
if not lifetime then
visionMarkers[location] = handler
end
return handler
end

---@param location Marker
---@param clearIntel? boolean
function ClearVisionAtLocation(location, clearIntel)
if visionMarkers[location] == nil then return end

visionMarkers[location]:Destroy(clearIntel)
visionMarkers[location] = nil
end

---Enters NIS mode and after callback Exits, makes units in area(s) invincible
---@param callback fun()
---@param area Area|Area[]?
function NISMode(callback, area)
Cinematics.EnterNISMode()
if area then
Cinematics.SetInvincible(area)
callback()
Cinematics.SetInvincible(area, true)
else
callback()
end
Cinematics.ExitNISMode()
for k, v in visionMarkers do
if v.toBeDestroyed then
v:Destroy(v.clearIntel)
visionMarkers[k] = nil
end
end
end

---Moves camera to marker with name for given amount of seconds
---@param name MarkerChain
---@param seconds number
function MoveTo(name, seconds)
return Cinematics.CameraMoveToMarker(ScenarioUtils.GetMarker(name), seconds)
end

---Displays text with given size, color, position and for duration in seconds
---@param text string
---@param size integer
---@param color Color
---@param position "lefttop"|"leftcenter"|"leftbottom"|"righttop"|"rightcenter"|"rightbottom"|"centertop"|"center"|"centerbottom"|
---@param duration number
function DisplayText(text, size, color, position, duration)
for s in text:gfind("[^\n]+") do
PrintText(s, size, color, duration, position)
end
end
227 changes: 227 additions & 0 deletions lua/Oxygen/ArmyManager.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,227 @@
local ScenarioFramework = import('/lua/ScenarioFramework.lua')
local Utils = import("Utils.lua")
local ScenarioUtils = import('/lua/sim/ScenarioUtilities.lua')


---Sets shared unit cap for Human players
---@type fun(cap:integer)
SetSharedUnitCap = ScenarioFramework.SetSharedUnitCap

Initialize = ScenarioUtils.InitializeScenarioArmies


SetUnitCap = SetArmyUnitCap

---Sets army color based on given string
---@param army Army
---@param color string
function SetColor(army, color)
SetArmyColor(army, Utils.UnpackColor(color))
end

--- Sets an army color to Aeon
---@param army Army
function SetAeonColor(army)
SetColor(army, "ff29BF29")
end

--- Sets an army color to Aeon ally
---@param army Army
function SetAeonAllyColor(army)
SetColor(army, "ffA5c866")
end

--- Sets an army color to Aeon neutral
---@param army Army
function SetAeonNeutralColor(army)
SetArmyColor(army, 16, 86, 16)
end

--- Sets an army color to Cybran
---@param army Army
function SetCybranColor(army)
SetArmyColor(army, 128, 39, 37)
end

--- Sets an army color to Cybran ally
---@param army Army
function SetCybranAllyColor(army)
SetArmyColor(army, 219, 74, 58)
end

--- Sets an army color to Cybran neutral
---@param army Army
function SetCybranNeutralColor(army)
SetArmyColor(army, 165, 9, 1)
end

--- Sets an army color to UEF
---@param army Army
function SetUEFColor(army)
SetArmyColor(army, 41, 40, 140)
end

--- Sets an army color to UEF ally
---@param army Army
function SetUEFAllyColor(army)
SetArmyColor(army, 71, 114, 148)
end

--- Sets an army color to UEF neutral
---@param army Army
function SetUEFNeutralColor(army)
SetArmyColor(army, 16, 16, 86)
end

--- Sets an army color to Coalition
---@param army Army
function SetCoalitionColor(army)
SetArmyColor(army, 80, 80, 240)
end

--- Sets an army color to neutral
---@param army Army
function SetNeutralColor(army)
SetArmyColor(army, 211, 211, 180)
end

--- Sets an army color to Aeon player
---@param army Army
function SetAeonPlayerColor(army)
SetArmyColor(army, 36, 182, 36)
end

--- Sets an army color to evil Aeon
---@param army Army
function SetAeonEvilColor(army)
SetArmyColor(army, 159, 216, 2)
end

--- Sets an army color to Aeon ally 1
---@param army Army
function SetAeonAlly1Color(army)
SetArmyColor(army, 16, 86, 16)
end

--- Sets an army color to Aeon ally 2
---@param army Army
function SetAeonAlly2Color(army)
SetArmyColor(army, 123, 255, 125)
end

--- Sets an army color to Cybran player
---@param army Army
function SetCybranPlayerColor(army)
SetArmyColor(army, 231, 3, 3)
end

--- Sets an army color to evil Cybran
---@param army Army
function SetCybranEvilColor(army)
SetArmyColor(army, 225, 70, 0)
end

--- Sets an army color to Cybran ally
---@param army Army
function SetCybranAllyColor(army)
SetArmyColor(army, 130, 33, 30)
end

--- Sets an army color to UEF player
---@param army Army
function SetUEFPlayerColor(army)
SetArmyColor(army, 41, 41, 225)
end

--- Sets an army color to UEF ally 1
---@param army Army
function SetUEFAlly1Color(army)
SetArmyColor(army, 81, 82, 241)
end

--- Sets an army color to UEF ally 2
---@param army Army
function SetUEFAlly2Color(army)
SetArmyColor(army, 133, 148, 255)
end

--- Sets an army color to Seraphim
---@param army Army
function SetSeraphimColor(army)
SetArmyColor(army, 167, 150, 2)
end

--- Sets army color to Loyalist
---@param army Army
function SetLoyalistColor(army)
SetColor(army, "ff006400")
end

---returns army units of specified category in area
---@param army Army
---@param category EntityCategory
---@param area (Area|Rectangle)?
---@return Unit[]
function GetUnits(army, category, area)
local result = {}
if area then
-- TODO
end

if type(army) == "string" then
return GetArmyBrain(army):GetListOfUnits(category, false)
elseif type(army) == "number" then
return ArmyBrains[army]:GetListOfUnits(category, false)
end
error "Unknown army type!"
end

---Creates army group defined on the map
---@param strArmy string
---@param groupName string
---@param useDifficulty? boolean @flag for using difficulty based army group division
---@return Unit[]
function CreateGroup(strArmy, groupName, useDifficulty)
if useDifficulty then
groupName = groupName .. '_D' .. ScenarioInfo.Options.Difficulty
end
local units = ScenarioUtils.CreateArmyGroup(strArmy, groupName, false)

assert(units, "Units of " .. strArmy .. " named " .. groupName .. " not found!")

return units
end

---creates unit of army which is defined on map
---@param strArmy string
---@param unitName string
---@return Unit
function CreateUnit(strArmy, unitName)
local unit = ScenarioUtils.CreateArmyUnit(strArmy, unitName)

assert(unit, "Couldn't find '" .. unitName .. "' of army " .. strArmy)

return unit
end

---Gives units from one army to another of certain categories
---@param fromArmy AIBrain
---@param toArmy AIBrain
---@param categories EntityCategory
function TransferUnitsToArmy(fromArmy, toArmy, categories)



for _, unit in fromArmy:GetListOfUnits(categories, false) do
ScenarioFramework.GiveUnitToArmy(unit, toArmy:GetArmyIndex(), false)
end
end

---@param armyId Army
---@param allianceType AllianceType
function SetPlayersAlliance(armyId, allianceType)
for _, player in ScenarioInfo.HumanPlayers do
SetAlliance(player, armyId, allianceType)
SetAlliance(armyId, player, allianceType)
end
end
Loading