updated stage logic
This commit is contained in:
@@ -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,8 +420,12 @@ 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
|
if self._currentStageState >= StageState.PreActivated then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
self._currentStageState = StageState.PreActivated
|
||||||
for key, mission in pairs(self._db.sams) do
|
for key, mission in pairs(self._db.sams) do
|
||||||
if mission then
|
if mission then
|
||||||
mission:SpawnInactive()
|
mission:SpawnInactive()
|
||||||
@@ -440,7 +435,6 @@ function Stage:PreActivate()
|
|||||||
for _, airbase in pairs(self._db.airbases) do
|
for _, airbase in pairs(self._db.airbases) do
|
||||||
airbase:ActivateRedStage()
|
airbase:ActivateRedStage()
|
||||||
end
|
end
|
||||||
end
|
|
||||||
|
|
||||||
self:MarkStage()
|
self:MarkStage()
|
||||||
|
|
||||||
@@ -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
|
end
|
||||||
|
|
||||||
if self._activeStage == number then --only activate once for a stage
|
if GlobalCapManager.IsCapActiveWhenZoneIsActive(self.zoneName, number) == true then
|
||||||
return
|
return true
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
local previousActive = self._activeStage
|
return false
|
||||||
self._activeStage = number
|
end
|
||||||
|
|
||||||
if self.stageNumber - self._activeStage == self._stageConfig.AmountPreactivateStage then
|
---@return boolean
|
||||||
self._logger:debug("Pre-activating stage: " .. self.zoneName .. " with number: " .. number)
|
local needsActivation = function()
|
||||||
self:PreActivate()
|
if self._stageLaneIdentifier == stageLaneIdentifier and self.stageNumber == number then
|
||||||
elseif GlobalCapManager.IsCapActiveWhenZoneIsActive(self.zoneName, number) == true then
|
return true
|
||||||
|
end
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|
||||||
|
---@return boolean
|
||||||
|
local needsBlueActivation = function()
|
||||||
|
if self._stageLaneIdentifier == stageLaneIdentifier and self.stageNumber > number then
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|
||||||
|
if needsPreActivation() == 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
|
||||||
Reference in New Issue
Block a user