Feature/lanes #40

Merged
dutchie031 merged 12 commits from feature/lanes into develop 2026-09-07 17:08:27 +00:00
6 changed files with 151 additions and 57 deletions
Showing only changes of commit 4de9e91efd - Show all commits
+16 -7
View File
@@ -33,6 +33,7 @@ do
unitsStates = {},
random_missions = {},
deliveredKilos = {},
activeStage = nil, -- Backwards compatibility for previous version without lanes
dutchie031 marked this conversation as resolved Outdated
Outdated
Review

This breaks backwards compatibility when inserted into missions that already have a persistent file.

This breaks backwards compatibility when inserted into missions that already have a persistent file.
activeStageInStageLane = {}
}
@@ -238,6 +239,21 @@ do
Persistence._updateRequired = true
end
---Get the active stage as in the persistance file
---@param stageLane string?
---@return integer|nil
Persistence.GetActiveStage = function(stageLane)
stageLane = stageLane or "nil"
-- backwards compatibility for previous versions without stage lanes
if stageLane == "nil" and tables.activeStageInStageLane[stageLane] == nil then
tables.activeStageInStageLane[stageLane] = tables.activeStage
tables.activeStage = nil -- Clear the old activeStage so it's not used or confused later
end
return tables.activeStageInStageLane[stageLane]
end
---comment
---@param missionName string
---@param pickedZone string
@@ -257,13 +273,6 @@ do
return tables.random_missions[string.lower(missionName)]
end
---Get the active stage as in the persistance file
---@param stageLane string?
---@return integer|nil
Persistence.GetActiveStage = function(stageLane)
stageLane = stageLane or "nil"
return tables.activeStageInStageLane[stageLane]
end
---comment
---@param zoneName string
+11 -9
View File
@@ -2,7 +2,7 @@ local Util = require("classes.util.Util")
local DcsUtil = require("classes.util.DcsUtil")
local MissionEditorWarnings = require("classes.util.MissionEditorWarnings")
local MizGroupsManager = require("classes.helpers.MizGroupsManager")
local CustomDrawing = require("classes.stageClasses.drawings.CustomDrawing")
local StageDrawing = require("classes.stageClasses.drawings.StageDrawing")
---@class DatabaseTables
@@ -27,7 +27,7 @@ local CustomDrawing = require("classes.stageClasses.drawings.CustomDrawing")
---@field MissionZoneData table<string, MissionZoneData>
---@field FarpZoneData table<string,FarpZoneData>
---@field missionCodes table<string, boolean>
---@field CustomDrawings Array<CustomDrawing>
---@field StageDrawings Array<StageDrawing>
---@class CapRoute
---@field zones Array<SpearheadTriggerZone>
@@ -107,7 +107,7 @@ function Database.New(Logger)
FarpZoneData = {},
missionCodes = {},
SupplyHubZones = {},
CustomDrawings = {}
StageDrawings = {}
}
Database.__index = Database
@@ -231,8 +231,10 @@ function Database.New(Logger)
for key, layer_object in pairs(layer.objects) do
if Util.startswith(layer_object.name, "drawing_", true) then
local object = layer_object --[[@as DrawingObject]]
local customDrawing = CustomDrawing.New(object)
table.insert(self._tables.CustomDrawings, customDrawing)
local stageDrawing = StageDrawing.New(object)
if stageDrawing then
table.insert(self._tables.StageDrawings, stageDrawing)
end
end
end
end
@@ -621,12 +623,12 @@ function Database:loadBlueSamUnits()
end
end
---@return Array<CustomDrawing>
function Database:getCustomDrawings()
if self._tables.CustomDrawings == nil then
---@return Array<StageDrawing>
function Database:getStageDrawings()
if self._tables.StageDrawings == nil then
return {}
end
return self._tables.CustomDrawings
return self._tables.StageDrawings
end
---Loads all units, data and briefings
+2 -2
View File
@@ -35,10 +35,10 @@ do
local OnStageNumberChangedListeners = {}
local OnStageNumberChangedHandlers = {}
---Add a stage zone number changed listener
---@param listener OnStageChangedListener object with function OnStageNumberChanged(self, number)
---@param listener OnStageChangedListener object with function OnStageNumberChanged(self, number, stageLaneIdentifier)
dutchie031 marked this conversation as resolved Outdated
Outdated
Review

comment needs updating

comment needs updating
SpearheadEvents.AddStageNumberChangedListener = function(listener)
if type(listener) ~= "table" or type(listener.OnStageNumberChanged) ~= "function" then
warn("Event handler not of type table/object with function OnStageNumberChanged(self, number)")
warn("Event handler not of type table/object with function OnStageNumberChanged(self, number, stageLaneIdentifier)")
return
end
table.insert(OnStageNumberChangedListeners, listener)
1
@@ -337,17 +337,24 @@ function GlobalStageManager:OnStageNumberChangeComplete(stageNumber, stageLaneId
end
---@private
function GlobalStageManager:UpdateDrawings(stageNumber)
---@param stageNumber number
---@param stageLaneIdentifier string?
function GlobalStageManager:UpdateDrawings(stageNumber, stageLaneIdentifier)
self.logger:debug("Updating custom drawings for stage number: " .. tostring(stageNumber))
local drawings = self.database:getCustomDrawings()
local drawings = self.database:getStageDrawings()
for _, drawing in pairs(drawings) do
local startStage, stopStage = drawing:GetStartAndStop()
if stageNumber >= startStage and stageNumber < stopStage then
self.logger:debug("Drawing " .. drawing:GetName() .. " is active for stage number: " .. tostring(stageNumber))
drawing:Draw()
else
self.logger:debug("Drawing " .. drawing:GetName() .. " is not active for stage number: " .. tostring(stageNumber))
drawing:Remove()
local startStage = drawing:GetStartingStage()
local stopStage = drawing:GetRemoveAtStage()
local laneIdentifier = drawing:GetStageLaneIdentifier()
if laneIdentifier == stageLaneIdentifier then
if stageNumber >= startStage and stageNumber < stopStage then
self.logger:debug("Drawing " .. drawing:GetName() .. " is active for stage number: " .. tostring(stageNumber))
drawing:Draw()
else
self.logger:debug("Drawing " .. drawing:GetName() .. " is not active for stage number: " .. tostring(stageNumber))
drawing:Remove()
end
end
end
end
@@ -1,35 +1,25 @@
local DrawingHelper = require("classes.stageClasses.drawings.helper.DrawingHelper")
local Util = require("classes.util.Util")
local Logger = require("classes.util.Logger")
local MissionEditorWarnings = require("classes.util.MissionEditorWarnings")
local drawingLogger = Logger.new("CustomDrawing")
---@class CustomDrawing
---@field private _id integer?
---@field private _drawingObject DrawingObject
---@field private _startingStage number
---@field private _removeAtStage number
---@field private _logger Logger
---@field protected _id integer?
---@field protected _name string?
---@field protected _drawingObject DrawingObject
local CustomDrawing = {}
CustomDrawing.__index = CustomDrawing
---@protected
---@param drawingObject DrawingObject
---@return CustomDrawing
---@return CustomDrawing?
function CustomDrawing.New(drawingObject)
local self = setmetatable({}, CustomDrawing)
self._drawingObject = drawingObject
self._id = nil -- initiate ID as nil, when drawn it will be set to the ID returned by DrawingHelper.Draw
self._logger = drawingLogger
local name = drawingObject.name
local split = Util.split_string(name or "", "_")
local secondPart = split[2] or "1"
local splitPart = Util.split_string(secondPart, ":")
self._startingStage = tonumber(splitPart[1]) or 1
self._removeAtStage = tonumber(splitPart[2]) or math.huge
self._name = drawingObject.name
return self
end
@@ -95,7 +85,6 @@ function CustomDrawing.FromZone(zone, colorString, fillColorString, lineStyle, l
end
if zone.zone_type == "Polygon" then
---@type Free
local drawingObject = {
mapX = 0,
@@ -110,7 +99,7 @@ function CustomDrawing.FromZone(zone, colorString, fillColorString, lineStyle, l
fillColorString = fillColorString,
thickness = lineThickness,
}
return CustomDrawing.New(drawingObject)
end
end
@@ -120,25 +109,19 @@ function CustomDrawing:GetName()
return self._drawingObject.name
end
---@return number start
---@return number stop
function CustomDrawing:GetStartAndStop()
return self._startingStage, self._removeAtStage
end
function CustomDrawing:Draw()
self._logger:debug("Drawing custom drawing with ID " .. tostring(self._id))
drawingLogger:debug("Drawing custom drawing with ID " .. tostring(self._id))
if self._id ~= nil then
DrawingHelper.Remove(self._id)
end
self._id = DrawingHelper.Draw(self._drawingObject, self._logger)
self._id = DrawingHelper.Draw(self._drawingObject)
end
function CustomDrawing:Remove()
if self._id ~= nil then
self._logger:debug("Removing custom drawing with ID " .. tostring(self._id))
drawingLogger:debug("Removing custom drawing with ID " .. tostring(self._id))
DrawingHelper.Remove(self._id)
self._id = nil
end
@@ -149,4 +132,4 @@ function CustomDrawing:UpdateDrawingObject(updateFunc)
self._drawingObject = updateFunc(self._drawingObject)
end
return CustomDrawing
return CustomDrawing
@@ -0,0 +1,93 @@
local CustomDrawing = require("classes.stageClasses.drawings.CustomDrawing")
local Util = require("classes.util.Util")
local MissionEditorWarnings = require("classes.util.MissionEditorWarnings")
---@class StageDrawing : CustomDrawing
---@field private _startingStage number
---@field private _removeAtStage number
---@field private _stageLaneIdentifier string?
local StageDrawing = {}
StageDrawing.__index = StageDrawing
setmetatable(StageDrawing, CustomDrawing)
---@param drawingObject DrawingObject
---@return StageDrawing?
function StageDrawing.New(drawingObject)
local super = CustomDrawing.New(drawingObject)
if not super then
return nil
end
local self = setmetatable(super, StageDrawing) --[[@as StageDrawing]]
local split = Util.split_string(self._name or "", "_")
local secondPart = split[2] or "1"
local splitPart = Util.split_string(secondPart, ":")
if tonumber(splitPart[1]) == nil then
local laneIdentifier = string.sub(splitPart[1], 1, 1)
if tonumber(laneIdentifier) == nil then
self._stageLaneIdentifier = laneIdentifier
end
local startNumber = string.sub(splitPart[1], 2)
local startNumberVal = tonumber(startNumber)
if startNumberVal == nil then
MissionEditorWarnings.Add("Start number for " ..
self._name .. " is not a valid number: " .. tostring(startNumber))
return nil
end
self._startingStage = startNumberVal
else
local startNumber = tonumber(splitPart[1])
if startNumber == nil then
MissionEditorWarnings.Add("Start number for " ..
self._name .. " is not a valid number: " .. tostring(splitPart[1]))
return nil
end
self._startingStage = startNumber
end
if tonumber(splitPart[2]) == nil then
local laneIdentifier = string.sub(splitPart[2], 1, 1)
if tonumber(laneIdentifier) == nil then
if self._stageLaneIdentifier and self._stageLaneIdentifier ~= laneIdentifier then
MissionEditorWarnings.Add("Lane identifiers do not match for " ..
self._name ..
": " ..
self._stageLaneIdentifier ..
" vs " .. laneIdentifier .. ". Will only use stage " .. self._stageLaneIdentifier)
end
end
local stopNumber = string.sub(splitPart[2], 2)
local stopNumberVal = tonumber(stopNumber)
if stopNumberVal == nil then
MissionEditorWarnings.Add("Stop number for " ..
self._name .. " is not a valid number: " .. tostring(stopNumber))
return nil
end
self._removeAtStage = stopNumberVal
else
local stopNumber = tonumber(splitPart[2])
if stopNumber == nil then
MissionEditorWarnings.Add("Stop number for " ..
self._name .. " is not a valid number: " .. tostring(splitPart[2]))
return nil
end
self._removeAtStage = stopNumber
end
return self
end
function StageDrawing:GetStageLaneIdentifier()
return self._stageLaneIdentifier
end
function StageDrawing:GetStartingStage()
return self._startingStage
end
function StageDrawing:GetRemoveAtStage()
return self._removeAtStage
end
return StageDrawing