diff --git a/_miz/SPEARHEADDEV.miz b/_miz/SPEARHEADDEV.miz index 4084ef3..42d01b7 100644 Binary files a/_miz/SPEARHEADDEV.miz and b/_miz/SPEARHEADDEV.miz differ diff --git a/classes/stageClasses/Stages/BaseStage/Stage.lua b/classes/stageClasses/Stages/BaseStage/Stage.lua index a89a0e6..fd2425c 100644 --- a/classes/stageClasses/Stages/BaseStage/Stage.lua +++ b/classes/stageClasses/Stages/BaseStage/Stage.lua @@ -240,36 +240,45 @@ end function Stage:CheckAndUpdateSelf() self._logger:debug("Checking on Stage: " .. self.zoneName) - local activeCount = 0 local dbTables = self:GetStageTables() - local availableMissions = {} - for _, mission in pairs(dbTables.missionsByCode) do - local state = mission:getState() - - if state == "ACTIVE" then - activeCount = activeCount + 1 + ---@return Array + local getAvailableMissions = function () + ---@type Array + local availableMissions = {} + for _, mission in pairs(dbTables.missionsByCode) do + if mission:getState() == "NEW" then + table.insert(availableMissions, mission) + end end + return availableMissions + end - if state == "NEW" then - table.insert(availableMissions, mission) + ---@return number + local getActiveMissionsCount = function () + local result = 0 + for _, mission in pairs(dbTables.missionsByCode) do + if mission:getState() == "ACTIVE" then + result = result + 1 + end end + return result end local max = dbTables.maxMissions - local availableMissionsCount = Spearhead.Util.tableLength(availableMissions) + local availableMissionsCount = Spearhead.Util.tableLength(getAvailableMissions()) + local activeCount = getActiveMissionsCount() if activeCount < max and availableMissionsCount > 0 then for i = activeCount+1, max do if availableMissionsCount == 0 then i = max+1 --exits this loop else - local index = math.random(1, availableMissionsCount) - - ---@type Mission - local mission = table.remove(availableMissions, index) + local mission = Spearhead.Util.randomFromList(getAvailableMissions()) --[[@as Mission]] if mission then mission:SpawnActive() activeCount = activeCount + 1; + else + return end availableMissionsCount = availableMissionsCount - 1 end diff --git a/classes/stageClasses/missions/ZoneMission.lua b/classes/stageClasses/missions/ZoneMission.lua index 8b2a9bb..a6ddefe 100644 --- a/classes/stageClasses/missions/ZoneMission.lua +++ b/classes/stageClasses/missions/ZoneMission.lua @@ -2,6 +2,7 @@ --- ZoneMission is missions that are defined by zones in the ME ---@class ZoneMission : Mission, OnUnitLostListener +---@field private _state MissionState ---@field private _missionGroups MissionGroups local ZoneMission = {} @@ -137,9 +138,6 @@ function ZoneMission:UpdateState(checkHealth, messageIfDone) if checkHealth == nil then checkHealth = false end if messageIfDone == false then messageIfDone = true end - if self._state == "COMPLETED" then - return - end if checkHealth == true then local function unitAliveState(unitName) @@ -254,6 +252,11 @@ function ZoneMission:SpawnActive() self._logger:info("Activating " .. self.name) + if self._state == "COMPLETED" or self._state == "ACTIVE" then + self._logger:debug("Mission already completed, not spawning") + return + end + self._state = "ACTIVE" for _, group in pairs(self._missionGroups.groups) do group:Spawn() diff --git a/classes/stageClasses/missions/baseMissions/Mission.lua b/classes/stageClasses/missions/baseMissions/Mission.lua index 33450e8..9351c70 100644 --- a/classes/stageClasses/missions/baseMissions/Mission.lua +++ b/classes/stageClasses/missions/baseMissions/Mission.lua @@ -6,10 +6,10 @@ ---@field missionType MissionType ---@field missionTypeDisplay string ---@field priority MissionPriority ----@field missionBriefing string ---@field location Vec2? ---@field code string ----@field protected state MissionState +---@field protected _state MissionState +---@field protected _missionBriefing string ---@field getState fun(self: Mission): MissionState @Get the mission state ---@field protected _logger Logger ---@field protected _database Database @@ -37,10 +37,10 @@ function Mission.newSuper(self, zoneName, missionName, missionType, missionBrief self.name = missionName self.missionType = missionType self.priority = priority - self.state = "NEW" + self._state = "NEW" self._logger = logger self._database = database - self.missionBriefing = missionBriefing + self._missionBriefing = missionBriefing self.code = tostring(database:GetNewMissionCode()) self._completeListeners = {} @@ -55,7 +55,7 @@ end ---@return MissionState function Mission:getState() - return self.state + return self._state end --region PUBLIC diff --git a/dev/dev_config.lua b/dev/dev_config.lua index a0bd89e..26e1de4 100644 --- a/dev/dev_config.lua +++ b/dev/dev_config.lua @@ -52,7 +52,7 @@ SpearheadConfig = { maxMissionStage = 10, --Stage starting number - startingStage = 0, + startingStage = 1, ---DEBUG logging. Consider keeping this disabled debugEnabled = true