Depends on (#30)

* Added mission dependencies within a stage
This commit is contained in:
2025-05-10 01:22:55 +02:00
committed by GitHub
parent 880816193d
commit c7c532a08a
9 changed files with 169 additions and 40 deletions
+65 -3
View File
@@ -4,6 +4,8 @@
---@class ZoneMission : Mission, OnUnitLostListener
---@field private _state MissionState
---@field private _missionGroups MissionGroups
---@field private _dependencies table<string, boolean>
---@field private _parentStage Stage
local ZoneMission = {}
--- @class MissionGroups
@@ -58,8 +60,9 @@ MINIMAL_UNITS_ALIVE_RATIO = 0.21
---@param priority MissionPriority
---@param database Database
---@param logger Logger
---@param parentStage Stage
---@return ZoneMission?
function ZoneMission.new(zoneName, priority, database, logger)
function ZoneMission.new(zoneName, priority, database, logger, parentStage)
local Mission = Spearhead.classes.stageClasses.missions.baseMissions.Mission
ZoneMission.__index = ZoneMission
setmetatable(ZoneMission, Mission)
@@ -80,6 +83,8 @@ function ZoneMission.new(zoneName, priority, database, logger)
return nil
end
--- parent new done
if self.missionType == "SAM" then
self.missionTypeDisplay = "DEAD"
end
@@ -92,6 +97,15 @@ function ZoneMission.new(zoneName, priority, database, logger)
groupNamesPerunit = {}
}
self._parentStage = parentStage
self._dependencies = {}
local dependencies = database:getMissionDependencies(zoneName)
for _, dependency in pairs(dependencies) do
self._dependencies[dependency] = false
end
local SpearheadGroup = Spearhead.classes.stageClasses.Groups.SpearheadGroup
local groupNames = database:getGroupsForMissionZone(zoneName)
for _, groupName in pairs(groupNames) do
@@ -131,6 +145,48 @@ function ZoneMission.new(zoneName, priority, database, logger)
return self
end
---@private
function ZoneMission:StartCheckingDependencies()
self._state = "WAITING"
---comment
---@param mission ZoneMission
---@param time any
---@return unknown
local function CheckDependencies(mission, time)
if mission:AllDependenciesMet() == true then
mission:SpawnActive()
return nil
end
return time + 15
end
timer.scheduleFunction(CheckDependencies, self, timer.getTime() + 15)
end
---@return boolean
function ZoneMission:AllDependenciesMet()
local allDependenciesMet = true
for missionName, value in pairs(self._dependencies) do
if self._parentStage:IsMissionComplete(missionName) == false then
allDependenciesMet = false
self._dependencies[missionName] = false
else
self._dependencies[missionName] = true
end
end
if allDependenciesMet == true then
self._logger:info("All dependencies met for " .. self.name)
end
return allDependenciesMet
end
---@internal
---@param checkHealth boolean
---@param messageIfDone boolean
@@ -229,7 +285,6 @@ function ZoneMission:UpdateState(checkHealth, messageIfDone)
self._state = "COMPLETED"
end
end
end
function ZoneMission:SpawnPersistedState()
@@ -242,7 +297,6 @@ end
function ZoneMission:SpawnInactive()
self._logger:info("PreActivating " .. self.name)
self._state = "ACTIVE"
for _, group in pairs(self._missionGroups.groups) do
group:Spawn()
end
@@ -250,6 +304,12 @@ end
function ZoneMission:SpawnActive()
if self:AllDependenciesMet() == false then
self:SpawnInactive()
self:StartCheckingDependencies()
return
end
self._logger:info("Activating " .. self.name)
if self._state == "COMPLETED" or self._state == "ACTIVE" then
@@ -270,6 +330,7 @@ end
---@private
function ZoneMission:StartCheckingContinuous()
---comment
---@param mission Mission
---@param time any
@@ -278,6 +339,7 @@ function ZoneMission:StartCheckingContinuous()
mission:UpdateState(true, true)
if mission:getState() == "COMPLETED" then
mission:NotifyMissionComplete()
return nil
end
return time + 30
@@ -153,6 +153,7 @@ do --aliases
--- @alias MissionState
--- | "NEW"
--- | "WAITING"
--- | "ACTIVE"
--- | "COMPLETED"