diff --git a/src/classes/stageClasses/Stages/BaseStage/Stage.lua b/src/classes/stageClasses/Stages/BaseStage/Stage.lua index d3f41e2..fd97508 100644 --- a/src/classes/stageClasses/Stages/BaseStage/Stage.lua +++ b/src/classes/stageClasses/Stages/BaseStage/Stage.lua @@ -13,6 +13,8 @@ local Events = require("classes.spearhead_events") local GlobalCapManager = require("classes.capClasses.GlobalCapManager") local CustomDrawing = require("classes.stageClasses.drawings.CustomDrawing") local DrawingHelper = require("classes.stageClasses.drawings.helper.DrawingHelper") +local StageRepository = require("classes.stageClasses.StageRepository") +local StageState = require("classes.stageClasses.Stages.BaseStage.StageState") ---@alias StageColor ---| "RED" @@ -58,9 +60,9 @@ local DrawingHelper = require("classes.stageClasses.drawings.helper.DrawingHelpe --- @field protected _missionCommandsHelper MissionCommandsHelper --- @field protected _missionPriority MissionPriority --- @field protected _database Database +--- @field protected _stageRepository StageRepository --- @field protected _db StageData --- @field protected _logger Logger ---- @field protected _activeStage integer --- @field protected _stageConfig StageConfig --- @field protected _customDrawing CustomDrawing --- @field protected _spawnedGroups Array @@ -72,14 +74,6 @@ local Stage = {} Stage.__index = Stage ----@enum CurrentStageState -Stage.CurrentStageState = { - INACTIVE = 0, - PREACTIVATED = 1, - ACTIVE = 2, - BLUE = 3 -} - Stage.StageColors = { INVISIBLE = { 0, 0, 0, 0 }, RED_ACTIVE = { 1, 0, 0, 0.20 }, @@ -100,16 +94,16 @@ Stage.StageColors = { function Stage:superNew(database, stageConfig, logger, initData, stageType, missionPriority, spawnManager) logger:debug("[BaseStage] Initiating stage with name: " .. initData.stageZoneName) - self._currentStageState = Stage.CurrentStageState.INACTIVE + self._currentStageState = StageState.Inactive self.zoneName = initData.stageZoneName self.stageNumber = initData.stageNumber + self._stageRepository = StageRepository.getInstance() if initData.stageLaneIdentifier then self._stageLaneIdentifier = string.lower(initData.stageLaneIdentifier) else self._stageLaneIdentifier = nil end self.stageName = initData.stageDisplayName - self._currentStageState = Stage.CurrentStageState.INACTIVE self._stageType = stageType self.OnPostStageComplete = nil @@ -131,7 +125,6 @@ function Stage:superNew(database, stageConfig, logger, initData, stageType, miss supplyHubs = {} } - self._activeStage = -99 self._stageConfig = stageConfig or {} self._missionCommandsHelper = MissionCommandsHelper.getOrCreate() @@ -289,7 +282,7 @@ end ---@return boolean 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 local state = mission:getState() @@ -304,14 +297,12 @@ function Stage:IsComplete() return false end end - - self._currentStageState = Stage.CurrentStageState.BLUE return true end ---@return boolean function Stage:IsActive() - return self._currentStageState == Stage.CurrentStageState.ACTIVE + return self._currentStageState == StageState.Activated end ---@return StageType @@ -429,19 +420,22 @@ end ---Activates all SAMS, Airbase units etc all at once. 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 - airbase:ActivateRedStage() + if self._currentStageState >= StageState.PreActivated then + return + end + + self._currentStageState = StageState.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 + airbase:ActivateRedStage() + end + self:MarkStage() end @@ -455,22 +449,22 @@ function Stage:MarkStage() 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 end if self._customDrawing then self._customDrawing:UpdateDrawingObject(function(drawingObject) 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.colorString = DrawingHelper.ColorTableToColorString(Stage.StageColors.RED_ACTIVE) 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.colorString = DrawingHelper.ColorTableToColorString(Stage.StageColors.RED_PREACTIVE) 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.colorString = DrawingHelper.ColorTableToColorString(Stage.StageColors.BLUE) drawing.style = "two dash" @@ -488,10 +482,13 @@ function Stage:MarkStage() end function Stage:ActivateStage() - self._currentStageState = Stage.CurrentStageState.ACTIVE + + if self._currentStageState >= StageState.Activated then + return + end self:PreActivate() - + self._currentStageState = StageState.Activated pcall(function() self:MarkStage() end) @@ -519,6 +516,10 @@ function Stage:ActivateStage() 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) end @@ -534,45 +535,57 @@ end ---@param stageLaneIdentifier string? function Stage:OnStageNumberChanged(number, stageLaneIdentifier) - if stageLaneIdentifier ~= self._stageLaneIdentifier then - return + ---@return boolean + 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 - if self._activeStage == number then --only activate once for a stage - return + ---@return boolean + local needsActivation = function() + if self._stageLaneIdentifier == stageLaneIdentifier and self.stageNumber == number then + return true + end + return false end - local previousActive = self._activeStage - self._activeStage = number + ---@return boolean + 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 - self._logger:debug("Pre-activating stage: " .. self.zoneName .. " with number: " .. number) - self:PreActivate() - elseif GlobalCapManager.IsCapActiveWhenZoneIsActive(self.zoneName, number) == true then + if needsPreActivation() == true then self:PreActivate() end - if number == self.stageNumber then + if needsActivation() == true then self:ActivateStage() - - if self._db and self._db.stageBriefing then - self._missionCommandsHelper:AddStageBriefing(self.zoneName, self._db.stageBriefing) - end end - if previousActive <= self.stageNumber then - if number > self.stageNumber then - self:ActivateBlueStage() - end + if needsBlueActivation() == true then + self:ActivateBlueStage() end - - if number > self.stageNumber then - self._missionCommandsHelper:RemoveStageBriefing(self.zoneName) - end -end - -function Stage:GetBriefing() - return "Briefing For " + end ---@param self Stage @@ -581,7 +594,6 @@ Stage.OnMissionComplete = function(self, mission) self:CheckAndUpdateSelf() end - ---private use only function Stage:ActivateBlueGroups() @@ -643,8 +655,12 @@ end function Stage:ActivateBlueStage() + if self._currentStageState >= StageState.Blue then + return + end + 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 mission:SpawnPersistedState() end @@ -668,6 +684,8 @@ function Stage:ActivateBlueStage() return nil end + self._missionCommandsHelper:RemoveStageBriefing(self.zoneName) + timer.scheduleFunction(ActivateBlueAsync, self, timer.getTime() + 3) end diff --git a/src/classes/stageClasses/Stages/BaseStage/StageState.lua b/src/classes/stageClasses/Stages/BaseStage/StageState.lua new file mode 100644 index 0000000..279325f --- /dev/null +++ b/src/classes/stageClasses/Stages/BaseStage/StageState.lua @@ -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 \ No newline at end of file