Buildable (#36)
- Buildable missions now working. - FARPS and BLUESAM zones are now buildable. - Secondary Logistics missions are created as buildables become available. - Logistic missions can be "marked" with a MAP marker. - Supplies can only be picked up in a SUPPLYHUB zone. - SUPPLYHUB zones are active once their parents are active. A supplyhub parent can be oneof: FARP, AIRBASE, STAGE. - Required supplies for a zone can be configured in kilos. - Crates can be picked up with 1000 or 2000 kilo per crate. - Max load for a helicopter is set based on public data. - TO COME: Sling load options
This commit is contained in:
+183
-68
@@ -11,6 +11,7 @@
|
||||
---@field CapDataPerStageNumber table<integer, CapData> table<StageNumber, table>
|
||||
---@field CarrierRouteZones Array<string> All Carrier routes zones
|
||||
---@field BlueSams Array<string> All blue sam zones
|
||||
---@field SupplyHubZones Array<string> All supply hub zones
|
||||
---@field MissionAnnotations table<string, MissionAnnotations> table<ZoneName, MissionAnnotations>
|
||||
---@field AirbaseDataPerAirfield table<string, AirbaseData>
|
||||
---@field BlueSamDataPerZone table<string, BlueSamData>
|
||||
@@ -39,15 +40,19 @@
|
||||
---@field RandomMissionZones Array<string>
|
||||
---@field StageIndex string
|
||||
---@field BlueSamZones Array<string>
|
||||
---@field SupplyHubZones Array<string>
|
||||
---@field SupplyHubZonesInFarp table<string, string>
|
||||
---@field MiscGroups Array<string>
|
||||
|
||||
---@class AirbaseData
|
||||
---@field CapGroups Array<string>
|
||||
---@field RedGroups Array<string>
|
||||
---@field BlueGroups Array<string>
|
||||
---@field supplyHubNames Array<string>
|
||||
|
||||
---@class BlueSamData
|
||||
---@field Groups Array<string>
|
||||
---@field groups Array<string>
|
||||
---@field buildingKilos number?
|
||||
|
||||
---@class MissionZoneData
|
||||
---@field Groups Array<string>
|
||||
@@ -58,6 +63,8 @@
|
||||
---@class FarpZoneData
|
||||
---@field groups Array<string>
|
||||
---@field padNames Array<string>
|
||||
---@field buildingKilos number?
|
||||
---@field supplyHubNames Array<string>
|
||||
|
||||
---@class Database
|
||||
---@field private _tables DatabaseTables
|
||||
@@ -87,7 +94,8 @@ function Database.New(Logger)
|
||||
MissionZoneData = {},
|
||||
FarpZoneData = {},
|
||||
missionCodes = {},
|
||||
MissionAnnotations = {}
|
||||
MissionAnnotations = {},
|
||||
SupplyHubZones = {}
|
||||
}
|
||||
|
||||
Database.__index = Database
|
||||
@@ -126,7 +134,9 @@ function Database.New(Logger)
|
||||
FarpZones = {},
|
||||
MissionZones = {},
|
||||
RandomMissionZones = {},
|
||||
MiscGroups = {}
|
||||
MiscGroups = {},
|
||||
SupplyHubZones = {},
|
||||
SupplyHubZonesInFarp = {}
|
||||
}
|
||||
self._tables.StageZones[zone_name] = stageData
|
||||
end
|
||||
@@ -161,25 +171,37 @@ function Database.New(Logger)
|
||||
if string.lower(split_string[1]) == "bluesam" then
|
||||
table.insert(self._tables.BlueSams, zone_name)
|
||||
end
|
||||
|
||||
if string.lower(split_string[1]) == "supplyhub" then
|
||||
table.insert(self._tables.SupplyHubZones, zone_name)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
self._logger:debug("initiated zone tables, continuing with descriptions")
|
||||
do --load markers
|
||||
|
||||
if env.mission.drawings and env.mission.drawings.layers then
|
||||
for i, layer in pairs(env.mission.drawings.layers) do
|
||||
if string.lower(layer.name) == "author" then
|
||||
for key, layer_object in pairs(layer.objects) do
|
||||
if Spearhead.Util.startswith(string.lower(layer_object.name), "buildable", true) == true then
|
||||
local blueSamData = self:getBlueSamDataForDrawLayer(layer_object)
|
||||
if blueSamData then
|
||||
local number = tonumber(layer_object.text)
|
||||
blueSamData.buildingKilos = number
|
||||
end
|
||||
|
||||
if Spearhead.Util.startswith(string.lower(layer_object.name), "completeat", true) == true then
|
||||
|
||||
local farpData = self:getFarpDataForDrawLayer(layer_object)
|
||||
if farpData then
|
||||
local number = tonumber(layer_object.text)
|
||||
farpData.buildingKilos = number
|
||||
end
|
||||
elseif Spearhead.Util.startswith(string.lower(layer_object.name), "completeat", true) == true then
|
||||
local annotationData = self:getMissionMetaDataForDrawLayer(layer_object)
|
||||
if annotationData then
|
||||
local number = tonumber(layer_object.text)
|
||||
if number and number > 1 then
|
||||
number = number / 100
|
||||
|
||||
end
|
||||
annotationData.completeAt = number
|
||||
end
|
||||
@@ -204,6 +226,12 @@ function Database.New(Logger)
|
||||
end
|
||||
end
|
||||
|
||||
---@type table<string, boolean>
|
||||
local availableSupplyHubs = {}
|
||||
for _, supplyHubZoneName in pairs(self._tables.SupplyHubZones) do
|
||||
availableSupplyHubs[supplyHubZoneName] = true
|
||||
end
|
||||
|
||||
for _, stageZoneName in pairs(self._tables.StageZoneNames) do
|
||||
local stageData = self._tables.StageZones[stageZoneName]
|
||||
if stageData then
|
||||
@@ -214,6 +242,63 @@ function Database.New(Logger)
|
||||
end
|
||||
end
|
||||
|
||||
--- fill farp zones
|
||||
for _, farpZoneName in pairs(self._tables.AllFarpZones) do
|
||||
if Spearhead.DcsUtil.isZoneInZone(farpZoneName, stageZoneName) then
|
||||
table.insert(stageData.FarpZones, farpZoneName)
|
||||
|
||||
for hubZoneName, available in pairs(availableSupplyHubs) do
|
||||
if available == true and Spearhead.DcsUtil.isZoneInZone(hubZoneName, farpZoneName) == true then
|
||||
local farpZoneData = self:getOrCreateFarpDataForZone(farpZoneName)
|
||||
if farpZoneData then
|
||||
table.insert(farpZoneData.supplyHubNames, hubZoneName)
|
||||
availableSupplyHubs[hubZoneName] = false
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- fill airbases
|
||||
for _, airbase in pairs(world.getAirbases()) do
|
||||
local point = airbase:getPoint()
|
||||
|
||||
if Spearhead.DcsUtil.isPositionInZone(point.x, point.z, stageZoneName) == true then
|
||||
if airbase:getDesc().category == 0 then
|
||||
table.insert(stageData.AirbaseNames, airbase:getName())
|
||||
|
||||
local airbaseZone = Spearhead.DcsUtil.getAirbaseZoneByName(airbase:getName())
|
||||
for hubZoneName, available in pairs(availableSupplyHubs) do
|
||||
local zone = Spearhead.DcsUtil.getZoneByName(hubZoneName)
|
||||
if zone and airbaseZone then
|
||||
if available == true and Spearhead.Util.is2dPointInZone(zone.location, airbaseZone) == true then
|
||||
local airbaseData = self:getOrCreateAirbaseData(airbase:getName())
|
||||
if airbaseData then
|
||||
table.insert(airbaseData.supplyHubNames, hubZoneName)
|
||||
availableSupplyHubs[hubZoneName] = false
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- fill supply hubs
|
||||
for supplyHubZone, available in pairs(availableSupplyHubs) do
|
||||
if available == true and Spearhead.DcsUtil.isZoneInZone(supplyHubZone, stageZoneName) == true then
|
||||
table.insert(stageData.SupplyHubZones, supplyHubZone)
|
||||
end
|
||||
end
|
||||
|
||||
for _, farpZoneName in pairs(stageData.FarpZones) do
|
||||
for _, supplyHubZone in pairs(self._tables.SupplyHubZones) do
|
||||
if Spearhead.DcsUtil.isZoneInZone(supplyHubZone, farpZoneName) == true then
|
||||
stageData.SupplyHubZonesInFarp[supplyHubZone] = farpZoneName
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- fill missions
|
||||
for key, missionZone in pairs(self._tables.MissionZones) do
|
||||
if Spearhead.DcsUtil.isZoneInZone(missionZone, stageZoneName) == true then
|
||||
@@ -227,24 +312,6 @@ function Database.New(Logger)
|
||||
table.insert(stageData.RandomMissionZones, missionZone)
|
||||
end
|
||||
end
|
||||
|
||||
--- fill farp zones
|
||||
for _, farpZoneName in pairs(self._tables.AllFarpZones) do
|
||||
if Spearhead.DcsUtil.isZoneInZone(farpZoneName, stageZoneName) then
|
||||
table.insert(stageData.FarpZones, farpZoneName)
|
||||
end
|
||||
end
|
||||
|
||||
-- fill airbases
|
||||
for _, airbase in pairs(world.getAirbases()) do
|
||||
local point = airbase:getPoint()
|
||||
|
||||
if Spearhead.DcsUtil.isPositionInZone(point.x, point.z, stageZoneName) == true then
|
||||
if airbase:getDesc().category == 0 then
|
||||
table.insert(stageData.AirbaseNames, airbase:getName())
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -268,7 +335,8 @@ function Database.New(Logger)
|
||||
if self._tables.FarpZoneData[farpZoneName] == nil then
|
||||
self._tables.FarpZoneData[farpZoneName] = {
|
||||
groups = {},
|
||||
padNames = {}
|
||||
padNames = {},
|
||||
supplyHubNames = {}
|
||||
}
|
||||
end
|
||||
local position = airbase:getPoint()
|
||||
@@ -288,7 +356,8 @@ function Database.New(Logger)
|
||||
baseData = {
|
||||
CapGroups = {},
|
||||
RedGroups = {},
|
||||
BlueGroups = {}
|
||||
BlueGroups = {},
|
||||
supplyHubNames = {}
|
||||
}
|
||||
self._tables.AirbaseDataPerAirfield[baseName] = baseData
|
||||
end
|
||||
@@ -417,13 +486,65 @@ function Database:initAvailableUnits()
|
||||
end
|
||||
end
|
||||
|
||||
---comment
|
||||
---@private
|
||||
---@param layer_object table
|
||||
---@return BlueSamData?
|
||||
function Database:getBlueSamDataForDrawLayer(layer_object)
|
||||
for _, zonename in pairs(self._tables.BlueSams) do
|
||||
if Spearhead.DcsUtil.isPositionInZone(layer_object.mapX, layer_object.mapY, zonename) == true then
|
||||
return self:getOrCreateBlueSamDataForZone(zonename)
|
||||
end
|
||||
end
|
||||
return nil
|
||||
end
|
||||
|
||||
---@private
|
||||
---@param layer_object table
|
||||
---@return FarpZoneData?
|
||||
function Database:getFarpDataForDrawLayer(layer_object)
|
||||
for _, zonename in pairs(self._tables.AllFarpZones) do
|
||||
if Spearhead.DcsUtil.isPositionInZone(layer_object.mapX, layer_object.mapY, zonename) == true then
|
||||
return self:getOrCreateFarpDataForZone(zonename)
|
||||
end
|
||||
end
|
||||
return nil
|
||||
end
|
||||
|
||||
---@private
|
||||
function Database:getOrCreateBlueSamDataForZone(zoneName)
|
||||
local blueSamData = self._tables.BlueSamDataPerZone[zoneName]
|
||||
if blueSamData == nil then
|
||||
blueSamData = {
|
||||
groups = {},
|
||||
buildingCrates = nil
|
||||
}
|
||||
self._tables.BlueSamDataPerZone[zoneName] = blueSamData
|
||||
end
|
||||
return blueSamData
|
||||
end
|
||||
|
||||
---@private
|
||||
function Database:getOrCreateFarpDataForZone(zoneName)
|
||||
local farpData = self._tables.FarpZoneData[zoneName]
|
||||
if farpData == nil then
|
||||
farpData = {
|
||||
padNames = {},
|
||||
groups = {},
|
||||
buildingCrates = nil,
|
||||
supplyHubNames = {}
|
||||
}
|
||||
self._tables.FarpZoneData[zoneName] = farpData
|
||||
end
|
||||
return farpData
|
||||
end
|
||||
|
||||
---@private
|
||||
---@param layer_object table
|
||||
---@return MissionAnnotations?
|
||||
function Database:getMissionMetaDataForDrawLayer(layer_object)
|
||||
for _, zonename in pairs(self._tables.MissionZones) do
|
||||
if Spearhead.DcsUtil.isPositionInZone(layer_object.mapX, layer_object.mapY, zonename) == true then
|
||||
|
||||
if self._tables.MissionAnnotations[zonename] == nil then
|
||||
self._tables.MissionAnnotations[zonename] = {
|
||||
description = nil,
|
||||
@@ -437,7 +558,6 @@ function Database:getMissionMetaDataForDrawLayer(layer_object)
|
||||
|
||||
for _, zonename in pairs(self._tables.RandomMissionZones) do
|
||||
if Spearhead.DcsUtil.isPositionInZone(layer_object.mapX, layer_object.mapY, zonename) == true then
|
||||
|
||||
if self._tables.MissionAnnotations[zonename] == nil then
|
||||
self._tables.MissionAnnotations[zonename] = {
|
||||
description = nil,
|
||||
@@ -487,13 +607,11 @@ end
|
||||
function Database:loadBlueSamUnits()
|
||||
local all_groups = Spearhead.DcsUtil.getAllGroupNames()
|
||||
for _, blueSamZone in pairs(self._tables.BlueSams) do
|
||||
self._tables.BlueSamDataPerZone[blueSamZone] = {
|
||||
Groups = {}
|
||||
}
|
||||
local samData = self:getOrCreateBlueSamDataForZone(blueSamZone)
|
||||
local groups = Spearhead.DcsUtil.getGroupsInZone(all_groups, blueSamZone)
|
||||
for _, groupName in pairs(groups) do
|
||||
is_group_taken[groupName] = true
|
||||
table.insert(self._tables.BlueSamDataPerZone[blueSamZone].Groups, groupName)
|
||||
table.insert(samData.groups, groupName)
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -533,17 +651,12 @@ end
|
||||
function Database:loadFarpGroups()
|
||||
local all_groups = getAvailableGroups()
|
||||
for _, farpZone in pairs(self._tables.AllFarpZones) do
|
||||
if self._tables.FarpZoneData[farpZone] == nil then
|
||||
self._tables.FarpZoneData[farpZone] = {
|
||||
groups = {},
|
||||
padNames = {}
|
||||
}
|
||||
end
|
||||
local farpzoneData = self:getOrCreateFarpDataForZone(farpZone)
|
||||
|
||||
local groups = Spearhead.DcsUtil.getGroupsInZone(all_groups, farpZone)
|
||||
for _, groupName in pairs(groups) do
|
||||
is_group_taken[groupName] = true
|
||||
table.insert(self._tables.FarpZoneData[farpZone].groups, groupName)
|
||||
table.insert(farpzoneData.groups, groupName)
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -628,7 +741,6 @@ function Database:loadMiscGroupsInStages()
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
---@return string?
|
||||
function Database:getMissionBriefingForMissionZone(missionZoneName)
|
||||
if not self._tables.MissionAnnotations[missionZoneName] then
|
||||
@@ -638,7 +750,6 @@ function Database:getMissionBriefingForMissionZone(missionZoneName)
|
||||
return self._tables.MissionAnnotations[missionZoneName].description
|
||||
end
|
||||
|
||||
|
||||
---@param missionZoneName string
|
||||
---@return Array<string>
|
||||
function Database:getMissionDependencies(missionZoneName)
|
||||
@@ -757,7 +868,6 @@ function Database:getGroupsForMissionZone(missionZoneName)
|
||||
return missionZoneData.Groups
|
||||
end
|
||||
|
||||
|
||||
---@param stageName string
|
||||
---@return table result airbase Names
|
||||
function Database:getAirbaseNamesInStage(stageName)
|
||||
@@ -780,14 +890,15 @@ function Database:getFarpDataForZone(farpZoneName)
|
||||
return farpData
|
||||
end
|
||||
|
||||
---@param airbaseName string
|
||||
---@return Array<string>
|
||||
function Database:getCapGroupsAtAirbase(airbaseName)
|
||||
local airbaseData = self._tables.AirbaseDataPerAirfield[airbaseName]
|
||||
if not airbaseData then return {} end
|
||||
return airbaseData.CapGroups
|
||||
---@return AirbaseData?
|
||||
---@param baseName string
|
||||
function Database:getAirbaseDataForZone(baseName)
|
||||
local baseData = self._tables.AirbaseDataPerAirfield[baseName]
|
||||
if not baseData then return nil end
|
||||
return baseData
|
||||
end
|
||||
|
||||
|
||||
---@param stageName string
|
||||
---@return Array<string>
|
||||
function Database:getBlueSamsInStage(stageName)
|
||||
@@ -796,29 +907,33 @@ function Database:getBlueSamsInStage(stageName)
|
||||
return stageData.BlueSamZones
|
||||
end
|
||||
|
||||
---@param stageName string
|
||||
---@return Array<string>
|
||||
function Database:getSupplyHubsInStage(stageName)
|
||||
local stageData = self._tables.StageZones[stageName]
|
||||
if not stageData then return {} end
|
||||
return stageData.SupplyHubZones
|
||||
end
|
||||
|
||||
---comment
|
||||
---@param stageName any
|
||||
---@param supplyZoneName any
|
||||
---@return nil
|
||||
function Database:getFarpDependencyForSupplyHub(stageName, supplyZoneName)
|
||||
local stageData = self._tables.StageZones[stageName]
|
||||
if not stageData then return nil end
|
||||
return stageData.SupplyHubZonesInFarp[supplyZoneName]
|
||||
end
|
||||
|
||||
---@param samZone string
|
||||
---@return Array<string>
|
||||
function Database:getBlueSamGroupsInZone(samZone)
|
||||
local blueSamData = self._tables.BlueSamDataPerZone[samZone]
|
||||
if not blueSamData then return {} end
|
||||
return blueSamData.Groups
|
||||
---@return BlueSamData?
|
||||
function Database:getBlueSamDataForZone(samZone)
|
||||
return self._tables.BlueSamDataPerZone[samZone]
|
||||
end
|
||||
|
||||
---@param airbaseName string
|
||||
---@return Array<string>
|
||||
function Database:getRedGroupsAtAirbase(airbaseName)
|
||||
local airbaseData = self._tables.AirbaseDataPerAirfield[airbaseName]
|
||||
if not airbaseData then return {} end
|
||||
return airbaseData.RedGroups
|
||||
end
|
||||
|
||||
---@param airbaseName string
|
||||
---@return Array<string>
|
||||
function Database:getBlueGroupsAtAirbase(airbaseName)
|
||||
local airbaseData = self._tables.AirbaseDataPerAirfield[airbaseName]
|
||||
if not airbaseData then return {} end
|
||||
return airbaseData.BlueGroups
|
||||
end
|
||||
|
||||
|
||||
|
||||
function Database:getMiscGroupsAtStage(stageName)
|
||||
local stageZone = self._tables.StageZones[stageName]
|
||||
|
||||
Reference in New Issue
Block a user