updated stage logic

This commit is contained in:
2026-09-01 18:06:56 +02:00
parent 1b46b828a6
commit e8e12cf892
2 changed files with 90 additions and 60 deletions
@@ -13,6 +13,8 @@ local Events = require("classes.spearhead_events")
local GlobalCapManager = require("classes.capClasses.GlobalCapManager") local GlobalCapManager = require("classes.capClasses.GlobalCapManager")
local CustomDrawing = require("classes.stageClasses.drawings.CustomDrawing") local CustomDrawing = require("classes.stageClasses.drawings.CustomDrawing")
local DrawingHelper = require("classes.stageClasses.drawings.helper.DrawingHelper") local DrawingHelper = require("classes.stageClasses.drawings.helper.DrawingHelper")
local StageRepository = require("classes.stageClasses.StageRepository")
local StageState = require("classes.stageClasses.Stages.BaseStage.StageState")
---@alias StageColor ---@alias StageColor
---| "RED" ---| "RED"
@@ -58,9 +60,9 @@ local DrawingHelper = require("classes.stageClasses.drawings.helper.DrawingHelpe
--- @field protected _missionCommandsHelper MissionCommandsHelper --- @field protected _missionCommandsHelper MissionCommandsHelper
--- @field protected _missionPriority MissionPriority --- @field protected _missionPriority MissionPriority
--- @field protected _database Database --- @field protected _database Database
--- @field protected _stageRepository StageRepository
--- @field protected _db StageData --- @field protected _db StageData
--- @field protected _logger Logger --- @field protected _logger Logger
--- @field protected _activeStage integer
--- @field protected _stageConfig StageConfig --- @field protected _stageConfig StageConfig
--- @field protected _customDrawing CustomDrawing --- @field protected _customDrawing CustomDrawing
--- @field protected _spawnedGroups Array<string> --- @field protected _spawnedGroups Array<string>
@@ -72,14 +74,6 @@ local Stage = {}
Stage.__index = Stage Stage.__index = Stage
---@enum CurrentStageState
Stage.CurrentStageState = {
INACTIVE = 0,
PREACTIVATED = 1,
ACTIVE = 2,
BLUE = 3
}
Stage.StageColors = { Stage.StageColors = {
INVISIBLE = { 0, 0, 0, 0 }, INVISIBLE = { 0, 0, 0, 0 },
RED_ACTIVE = { 1, 0, 0, 0.20 }, RED_ACTIVE = { 1, 0, 0, 0.20 },
@@ -100,16 +94,16 @@ Stage.StageColors = {
function Stage:superNew(database, stageConfig, logger, initData, stageType, missionPriority, spawnManager) function Stage:superNew(database, stageConfig, logger, initData, stageType, missionPriority, spawnManager)
logger:debug("[BaseStage] Initiating stage with name: " .. initData.stageZoneName) logger:debug("[BaseStage] Initiating stage with name: " .. initData.stageZoneName)
self._currentStageState = Stage.CurrentStageState.INACTIVE self._currentStageState = StageState.Inactive
self.zoneName = initData.stageZoneName self.zoneName = initData.stageZoneName
self.stageNumber = initData.stageNumber self.stageNumber = initData.stageNumber
self._stageRepository = StageRepository.getInstance()
if initData.stageLaneIdentifier then if initData.stageLaneIdentifier then
self._stageLaneIdentifier = string.lower(initData.stageLaneIdentifier) self._stageLaneIdentifier = string.lower(initData.stageLaneIdentifier)
else else
self._stageLaneIdentifier = nil self._stageLaneIdentifier = nil
end end
self.stageName = initData.stageDisplayName self.stageName = initData.stageDisplayName
self._currentStageState = Stage.CurrentStageState.INACTIVE
self._stageType = stageType self._stageType = stageType
self.OnPostStageComplete = nil self.OnPostStageComplete = nil
@@ -131,7 +125,6 @@ function Stage:superNew(database, stageConfig, logger, initData, stageType, miss
supplyHubs = {} supplyHubs = {}
} }
self._activeStage = -99
self._stageConfig = stageConfig or {} self._stageConfig = stageConfig or {}
self._missionCommandsHelper = MissionCommandsHelper.getOrCreate() self._missionCommandsHelper = MissionCommandsHelper.getOrCreate()
@@ -289,7 +282,7 @@ end
---@return boolean ---@return boolean
function Stage:IsComplete() function Stage:IsComplete()
if self._currentStageState == Stage.CurrentStageState.BLUE then return true end if self._currentStageState >= StageState.Blue then return true end
for i, mission in pairs(self._db.sams) do for i, mission in pairs(self._db.sams) do
local state = mission:getState() local state = mission:getState()
@@ -304,14 +297,12 @@ function Stage:IsComplete()
return false return false
end end
end end
self._currentStageState = Stage.CurrentStageState.BLUE
return true return true
end end
---@return boolean ---@return boolean
function Stage:IsActive() function Stage:IsActive()
return self._currentStageState == Stage.CurrentStageState.ACTIVE return self._currentStageState == StageState.Activated
end end
---@return StageType ---@return StageType
@@ -429,19 +420,22 @@ end
---Activates all SAMS, Airbase units etc all at once. ---Activates all SAMS, Airbase units etc all at once.
function Stage:PreActivate() function Stage:PreActivate()
if self._currentStageState == Stage.CurrentStageState.INACTIVE then
self._currentStageState = Stage.CurrentStageState.PREACTIVATED
for key, mission in pairs(self._db.sams) do
if mission then
mission:SpawnInactive()
end
end
for _, airbase in pairs(self._db.airbases) do if self._currentStageState >= StageState.PreActivated then
airbase:ActivateRedStage() return
end
self._currentStageState = StageState.PreActivated
for key, mission in pairs(self._db.sams) do
if mission then
mission:SpawnInactive()
end end
end end
for _, airbase in pairs(self._db.airbases) do
airbase:ActivateRedStage()
end
self:MarkStage() self:MarkStage()
end end
@@ -455,22 +449,22 @@ function Stage:MarkStage()
end end
if self._stageConfig.isDrawStagesEnabled == false then return end if self._stageConfig.isDrawStagesEnabled == false then return end
if self._stageConfig.isDrawPreActivatedEnabled == false and self._currentStageState == Stage.CurrentStageState.PREACTIVATED then if self._stageConfig.isDrawPreActivatedEnabled == false and self._currentStageState == StageState.PreActivated then
return return
end end
if self._customDrawing then if self._customDrawing then
self._customDrawing:UpdateDrawingObject(function(drawingObject) self._customDrawing:UpdateDrawingObject(function(drawingObject)
local drawing = drawingObject --[[@as Polygon]] local drawing = drawingObject --[[@as Polygon]]
if self._currentStageState == Stage.CurrentStageState.ACTIVE then if self._currentStageState == StageState.Activated then
drawing.fillColorString = DrawingHelper.ColorTableToColorString(Stage.StageColors.RED_ACTIVE) drawing.fillColorString = DrawingHelper.ColorTableToColorString(Stage.StageColors.RED_ACTIVE)
drawing.colorString = DrawingHelper.ColorTableToColorString(Stage.StageColors.RED_ACTIVE) drawing.colorString = DrawingHelper.ColorTableToColorString(Stage.StageColors.RED_ACTIVE)
drawing.style = "dot dash" drawing.style = "dot dash"
elseif self._currentStageState == Stage.CurrentStageState.PREACTIVATED then elseif self._currentStageState == StageState.PreActivated then
drawing.fillColorString = DrawingHelper.ColorTableToColorString(Stage.StageColors.RED_PREACTIVE) drawing.fillColorString = DrawingHelper.ColorTableToColorString(Stage.StageColors.RED_PREACTIVE)
drawing.colorString = DrawingHelper.ColorTableToColorString(Stage.StageColors.RED_PREACTIVE) drawing.colorString = DrawingHelper.ColorTableToColorString(Stage.StageColors.RED_PREACTIVE)
drawing.style = "no line" drawing.style = "no line"
elseif self._currentStageState == Stage.CurrentStageState.BLUE then elseif self._currentStageState == StageState.Blue then
drawing.fillColorString = DrawingHelper.ColorTableToColorString(Stage.StageColors.BLUE) drawing.fillColorString = DrawingHelper.ColorTableToColorString(Stage.StageColors.BLUE)
drawing.colorString = DrawingHelper.ColorTableToColorString(Stage.StageColors.BLUE) drawing.colorString = DrawingHelper.ColorTableToColorString(Stage.StageColors.BLUE)
drawing.style = "two dash" drawing.style = "two dash"
@@ -488,10 +482,13 @@ function Stage:MarkStage()
end end
function Stage:ActivateStage() function Stage:ActivateStage()
self._currentStageState = Stage.CurrentStageState.ACTIVE
if self._currentStageState >= StageState.Activated then
return
end
self:PreActivate() self:PreActivate()
self._currentStageState = StageState.Activated
pcall(function() pcall(function()
self:MarkStage() self:MarkStage()
end) end)
@@ -519,6 +516,10 @@ function Stage:ActivateStage()
end end
end end
if self._db and self._db.stageBriefing then
self._missionCommandsHelper:AddStageBriefing(self.zoneName, self._db.stageBriefing)
end
timer.scheduleFunction(self.CheckContinuousAsync, self, timer.getTime() + 3) timer.scheduleFunction(self.CheckContinuousAsync, self, timer.getTime() + 3)
end end
@@ -534,45 +535,57 @@ end
---@param stageLaneIdentifier string? ---@param stageLaneIdentifier string?
function Stage:OnStageNumberChanged(number, stageLaneIdentifier) function Stage:OnStageNumberChanged(number, stageLaneIdentifier)
if stageLaneIdentifier ~= self._stageLaneIdentifier then ---@return boolean
return local needsPreActivation = function()
if self._stageLaneIdentifier == stageLaneIdentifier then
if self.stageNumber - number < self._stageConfig.AmountPreactivateStage then
return true
end
elseif self._stageLaneIdentifier == nil then
--main lane
--Check if this stage is a chapter stage
if self._stageRepository:getStageLane(self._stageLaneIdentifier):IsChapterStart(self.stageNumber)
and self.stageNumber - number < self._stageConfig.AmountPreactivateStage
then
return true
end
if GlobalCapManager.IsCapActiveWhenZoneIsActive(self.zoneName, number) == true then
return true
end
end
return false
end end
if self._activeStage == number then --only activate once for a stage ---@return boolean
return local needsActivation = function()
if self._stageLaneIdentifier == stageLaneIdentifier and self.stageNumber == number then
return true
end
return false
end end
local previousActive = self._activeStage ---@return boolean
self._activeStage = number local needsBlueActivation = function()
if self._stageLaneIdentifier == stageLaneIdentifier and self.stageNumber > number then
return true
end
return false
end
if self.stageNumber - self._activeStage == self._stageConfig.AmountPreactivateStage then if needsPreActivation() == true then
self._logger:debug("Pre-activating stage: " .. self.zoneName .. " with number: " .. number)
self:PreActivate()
elseif GlobalCapManager.IsCapActiveWhenZoneIsActive(self.zoneName, number) == true then
self:PreActivate() self:PreActivate()
end end
if number == self.stageNumber then if needsActivation() == true then
self:ActivateStage() self:ActivateStage()
if self._db and self._db.stageBriefing then
self._missionCommandsHelper:AddStageBriefing(self.zoneName, self._db.stageBriefing)
end
end end
if previousActive <= self.stageNumber then if needsBlueActivation() == true then
if number > self.stageNumber then self:ActivateBlueStage()
self:ActivateBlueStage()
end
end end
if number > self.stageNumber then
self._missionCommandsHelper:RemoveStageBriefing(self.zoneName)
end
end
function Stage:GetBriefing()
return "Briefing For "
end end
---@param self Stage ---@param self Stage
@@ -581,7 +594,6 @@ Stage.OnMissionComplete = function(self, mission)
self:CheckAndUpdateSelf() self:CheckAndUpdateSelf()
end end
---private use only ---private use only
function Stage:ActivateBlueGroups() function Stage:ActivateBlueGroups()
@@ -643,8 +655,12 @@ end
function Stage:ActivateBlueStage() function Stage:ActivateBlueStage()
if self._currentStageState >= StageState.Blue then
return
end
self._logger:debug("Setting stage '" .. Util.toString(self.zoneName) .. "' to blue") self._logger:debug("Setting stage '" .. Util.toString(self.zoneName) .. "' to blue")
self._currentStageState = Stage.CurrentStageState.BLUE self._currentStageState = StageState.Blue
for _, mission in pairs(self._db.missions) do for _, mission in pairs(self._db.missions) do
mission:SpawnPersistedState() mission:SpawnPersistedState()
end end
@@ -668,6 +684,8 @@ function Stage:ActivateBlueStage()
return nil return nil
end end
self._missionCommandsHelper:RemoveStageBriefing(self.zoneName)
timer.scheduleFunction(ActivateBlueAsync, self, timer.getTime() + 3) timer.scheduleFunction(ActivateBlueAsync, self, timer.getTime() + 3)
end end
@@ -0,0 +1,12 @@
--- StageState enumeration for the current stage state.
--- Chronological order, meaning that higher values should represent later stages in the sequence.
---@enum CurrentStageState
local StageState = {
Inactive = 0,
PreActivated = 1,
Activated = 2,
Blue = 3
}
return StageState