Version 0.9987

Limited Airframes
cloneZones randomizer, cargo
This commit is contained in:
Christian Franz 2022-05-05 13:55:03 +02:00
parent 6d95355000
commit cc46e5fb10
10 changed files with 1323 additions and 1201 deletions

Binary file not shown.

Binary file not shown.

View File

@ -1,5 +1,5 @@
rndFlags = {} rndFlags = {}
rndFlags.version = "1.2.0" rndFlags.version = "1.3.0"
rndFlags.verbose = false rndFlags.verbose = false
rndFlags.requiredLibs = { rndFlags.requiredLibs = {
"dcsCommon", -- always "dcsCommon", -- always
@ -23,6 +23,9 @@ rndFlags.requiredLibs = {
some code clean-up some code clean-up
rndMethod synonym rndMethod synonym
1.2.0 - Watchflag integration 1.2.0 - Watchflag integration
1.3.0 - DML simplification: RND!
zone-local verbosity
--]] --]]
rndFlags.rndGen = {} rndFlags.rndGen = {}
@ -87,18 +90,28 @@ end
-- create rnd gen from zone -- create rnd gen from zone
-- --
function rndFlags.createRNDWithZone(theZone) function rndFlags.createRNDWithZone(theZone)
local flags = cfxZones.getStringFromZoneProperty(theZone, "flags!", "") local flags = ""
if flags == "" then if cfxZones.hasProperty(theZone, "RND!") then
-- let's try alternate spelling without "!" flags = cfxZones.getStringFromZoneProperty(theZone, "RND!", "")
flags = cfxZones.getStringFromZoneProperty(theZone, "flags", "") elseif cfxZones.hasProperty(theZone, "flags!") then
trigger.action.outText("+++RND: warning - zone <" .. theZone.name .. ">: deprecated 'flags!' usage, use 'RND!' instead.", 30)
flags = cfxZones.getStringFromZoneProperty(theZone, "flags!", "")
elseif cfxZones.hasProperty(theZone, "flags") then
trigger.action.outText("+++RND: warning - zone <" .. theZone.name .. ">: deprecated 'flags' (no bang) usage, use 'RND!' instead.", 30)
flags = cfxZones.getStringFromZoneProperty(theZone, "flags", "")
else
trigger.action.outText("+++RND: warning - zone <" .. theZone.name .. ">: no flags defined!", 30)
end end
-- now build the flag array from strings -- now build the flag array from strings
local theFlags = rndFlags.flagArrayFromString(flags) local theFlags = rndFlags.flagArrayFromString(flags)
theZone.myFlags = theFlags theZone.myFlags = theFlags
if rndFlags.verbose or theZone.verbose then
trigger.action.outText("+++RND: output set for <" .. theZone.name .. "> is <" .. flags .. ">",30)
end
theZone.pollSizeMin, theZone.pollSize = cfxZones.getPositiveRangeFromZoneProperty(theZone, "pollSize", 1) theZone.pollSizeMin, theZone.pollSize = cfxZones.getPositiveRangeFromZoneProperty(theZone, "pollSize", 1)
if rndFlags.verbose then if rndFlags.verbose or theZone.verbose then
trigger.action.outText("+++RND: pollSize is <" .. theZone.pollSizeMin .. ", " .. theZone.pollSize .. ">", 30) trigger.action.outText("+++RND: pollSize is <" .. theZone.pollSizeMin .. ", " .. theZone.pollSize .. ">", 30)
end end
@ -179,8 +192,8 @@ function rndFlags.fire(theZone)
if #availableFlags < 1 then if #availableFlags < 1 then
if rndFlags.verbose then if rndFlags.verbose or theZone.verbose then
trigger.action.outText("+++RND: RND " .. theZone.name .. " ran out of flags. aborting fire", 30) trigger.action.outText("+++RND: RND " .. theZone.name .. " ran out of flags. Will fire 'done' instead ", 30)
end end
if theZone.doneFlag then if theZone.doneFlag then
@ -190,7 +203,7 @@ function rndFlags.fire(theZone)
return return
end end
if rndFlags.verbose then if rndFlags.verbose or theZone.verbose then
trigger.action.outText("+++RND: firing RND " .. theZone.name .. " with pollsize " .. pollSize .. " on " .. #availableFlags .. " set size", 30) trigger.action.outText("+++RND: firing RND " .. theZone.name .. " with pollsize " .. pollSize .. " on " .. #availableFlags .. " set size", 30)
end end
@ -212,7 +225,7 @@ function rndFlags.fire(theZone)
local theFlag = table.remove(availableFlags,theFlagIndex) local theFlag = table.remove(availableFlags,theFlagIndex)
--rndFlags.pollFlag(theFlag, theZone.rndMethod) --rndFlags.pollFlag(theFlag, theZone.rndMethod)
if rndFlags.verbose then if rndFlags.verbose or theZone.verbose then
trigger.action.outText("+++RND: polling " .. theFlag .. " with " .. theZone.rndMethod, 30) trigger.action.outText("+++RND: polling " .. theFlag .. " with " .. theZone.rndMethod, 30)
end end
@ -234,25 +247,12 @@ function rndFlags.update()
for idx, aZone in pairs(rndFlags.rndGen) do for idx, aZone in pairs(rndFlags.rndGen) do
if cfxZones.testZoneFlag(aZone, aZone.triggerFlag, aZone.rndTriggerMethod, "lastTriggerValue") then if cfxZones.testZoneFlag(aZone, aZone.triggerFlag, aZone.rndTriggerMethod, "lastTriggerValue") then
if rndFlags.verbose then if rndFlags.verbose or aZone.verbose then
trigger.action.outText("+++RND: triggering " .. aZone.name, 30) trigger.action.outText("+++RND: triggering " .. aZone.name, 30)
end end
rndFlags.fire(aZone) rndFlags.fire(aZone)
end end
--[[-- old code pre watchflag
if aZone.triggerFlag then
local currTriggerVal = cfxZones.getFlagValue(aZone.triggerFlag, aZone) -- trigger.misc.getUserFlag(aZone.triggerFlag)
if currTriggerVal ~= aZone.lastTriggerValue
then
if rndFlags.verbose then
trigger.action.outText("+++RND: triggering " .. aZone.name, 30)
end
rndFlags.fire(aZone)
aZone.lastTriggerValue = currTriggerVal
end
end
--]]--
end end
end end
@ -306,7 +306,9 @@ function rndFlags.start()
rndFlags.readConfigZone() rndFlags.readConfigZone()
-- process RND Zones -- process RND Zones
local attrZones = cfxZones.getZonesWithAttributeNamed("RND") local attrZones = cfxZones.getZonesWithAttributeNamed("RND!")
a = dcsCommon.getSizeOfTable(attrZones)
trigger.action.outText("RND! zones: " .. a, 30)
-- now create an rnd gen for each one and add them -- now create an rnd gen for each one and add them
-- to our watchlist -- to our watchlist
@ -314,6 +316,15 @@ function rndFlags.start()
rndFlags.createRNDWithZone(aZone) -- process attribute and add to zone rndFlags.createRNDWithZone(aZone) -- process attribute and add to zone
rndFlags.addRNDZone(aZone) -- remember it so we can smoke it rndFlags.addRNDZone(aZone) -- remember it so we can smoke it
end end
-- obsolete here
attrZones = cfxZones.getZonesWithAttributeNamed("RND")
-- now create an rnd gen for each one and add them
-- to our watchlist
for k, aZone in pairs(attrZones) do
rndFlags.createRNDWithZone(aZone) -- process attribute and add to zone
rndFlags.addRNDZone(aZone) -- remember it so we can smoke it
end
-- start cycle -- start cycle
timer.scheduleFunction(rndFlags.startCycle, {}, timer.getTime() + 0.25) timer.scheduleFunction(rndFlags.startCycle, {}, timer.getTime() + 0.25)

View File

@ -4,9 +4,8 @@
-- --
-- Copyright (c) 2021, 2022 by Christian Franz and cf/x AG -- Copyright (c) 2021, 2022 by Christian Franz and cf/x AG
-- --
cfxZones = {} cfxZones = {}
cfxZones.version = "2.7.6" cfxZones.version = "2.7.7"
--[[-- VERSION HISTORY --[[-- VERSION HISTORY
- 2.2.4 - getCoalitionFromZoneProperty - 2.2.4 - getCoalitionFromZoneProperty
- getStringFromZoneProperty - getStringFromZoneProperty
@ -65,12 +64,14 @@ cfxZones.version = "2.7.6"
- hasProperty now offers active information when looking for '*?' and '*!' - hasProperty now offers active information when looking for '*?' and '*!'
- 2.7.0 - doPollFlag - fully support multiple flags per bang! - 2.7.0 - doPollFlag - fully support multiple flags per bang!
- 2.7.1 - setFlagValueMult() - 2.7.1 - setFlagValueMult()
- 2.7.2 - '161 repair' - 2.7.2 - '261 repair'
- 2.7.3 - testZoneFlag returns mathodResult, lastVal - 2.7.3 - testZoneFlag returns mathodResult, lastVal
- evalFlagMethodImmediate() - evalFlagMethodImmediate()
- 2.7.4 - doPollFlag supports immediate number setting - 2.7.4 - doPollFlag supports immediate number setting
- 2.7.5 - more QoL checks when mixing up ? and ! for attributes - 2.7.5 - more QoL checks when mixing up ? and ! for attributes
- 2.7.6 - trim for getBoolFromZoneProperty and getStringFromZoneProperty - 2.7.6 - trim for getBoolFromZoneProperty and getStringFromZoneProperty
- 2.7.7 - randomInRange()
- show number of zones
--]]-- --]]--
cfxZones.verbose = false cfxZones.verbose = false
@ -558,6 +559,7 @@ end
function cfxZones.getZonesWithAttributeNamed(attributeName, testZones) function cfxZones.getZonesWithAttributeNamed(attributeName, testZones)
if not testZones then testZones = cfxZones.zones end if not testZones then testZones = cfxZones.zones end
local attributZones = {} local attributZones = {}
for aName,aZone in pairs(testZones) do for aName,aZone in pairs(testZones) do
local attr = cfxZones.getZoneProperty(aZone, attributeName) local attr = cfxZones.getZoneProperty(aZone, attributeName)
@ -1416,6 +1418,7 @@ function cfxZones.testFlagByMethodForZone(currVal, lastVal, theMethod, theZone)
return false return false
end end
function cfxZones.testZoneFlag(theZone, theFlagName, theMethod, latchName) function cfxZones.testZoneFlag(theZone, theFlagName, theMethod, latchName)
-- returns two values: true/false method result, and curr value -- returns two values: true/false method result, and curr value
-- returns true if method constraints are met for flag theFlagName -- returns true if method constraints are met for flag theFlagName
@ -1603,6 +1606,15 @@ function cfxZones.getMinMaxFromZoneProperty(theZone, theProperty)
end end
function cfxZones.randomInRange(minVal, maxVal)
if maxVal < minVal then
local t = minVal
minVal = maxVal
maxVal = t
end
return cfxZones.randomDelayFromPositiveRange(minVal, maxVal)
end
function cfxZones.randomDelayFromPositiveRange(minVal, maxVal) function cfxZones.randomDelayFromPositiveRange(minVal, maxVal)
if not maxVal then return minVal end if not maxVal then return minVal end
if not minVal then return maxVal end if not minVal then return maxVal end
@ -1697,7 +1709,6 @@ function cfxZones.hasProperty(theZone, theProperty)
-- return foundIt ~= nil -- return foundIt ~= nil
end end
function cfxZones.getBoolFromZoneProperty(theZone, theProperty, defaultVal) function cfxZones.getBoolFromZoneProperty(theZone, theProperty, defaultVal)
if not defaultVal then defaultVal = false end if not defaultVal then defaultVal = false end
if type(defaultVal) ~= "boolean" then if type(defaultVal) ~= "boolean" then
@ -1920,7 +1931,8 @@ function cfxZones.init()
cfxZones.startMovingZones() cfxZones.startMovingZones()
cfxZones.updateMovingZones() -- will auto-repeat cfxZones.updateMovingZones() -- will auto-repeat
trigger.action.outText("cf/x Zones v".. cfxZones.version .. ": loaded", 10) trigger.action.outText("cf/x Zones v".. cfxZones.version .. ": loaded, zones:" .. dcsCommon.getSizeOfTable(cfxZones.zones), 30)
end end
-- get everything rolling -- get everything rolling

File diff suppressed because it is too large Load Diff

View File

@ -1,5 +1,5 @@
csarManager = {} csarManager = {}
csarManager.version = "2.1.0" csarManager.version = "2.1.1"
csarManager.verbose = false csarManager.verbose = false
csarManager.ups = 1 csarManager.ups = 1
@ -35,6 +35,7 @@ csarManager.ups = 1
- csarBlueDelivered - csarBlueDelivered
- finally fixed smoke performance bug - finally fixed smoke performance bug
- csarManager.vectoring optional - csarManager.vectoring optional
- 2.1.1 - zone-local verbosity
--]]-- --]]--
-- modules that need to be loaded BEFORE I run -- modules that need to be loaded BEFORE I run
@ -178,7 +179,7 @@ function csarManager.createDownedPilot(theMission)
theBoyGroup) theBoyGroup)
if theBoyGroup then if theBoyGroup then
-- trigger.action.outText("+++csar: created csar!", 30)
else else
trigger.action.outText("+++csar: FAILED to create csar!", 30) trigger.action.outText("+++csar: FAILED to create csar!", 30)
end end
@ -343,7 +344,6 @@ function csarManager.somethingHappened(event)
local ID = event.id local ID = event.id
local myType = theUnit:getTypeName() local myType = theUnit:getTypeName()
-- trigger.action.outText("+++csar: event " .. ID .. " for player unit " .. theUnit:getName() .. " of type " .. myType, 30)
if ID == 4 then -- landed if ID == 4 then -- landed
csarManager.heloLanded(theUnit) csarManager.heloLanded(theUnit)
@ -375,9 +375,7 @@ function csarManager.successMission(who, where, theMission)
-- callback has format callback(coalition, success true/false, numberSaved, descriptionText) -- callback has format callback(coalition, success true/false, numberSaved, descriptionText)
csarManager.invokeCallbacks(theMission.side, true, 1, "success") csarManager.invokeCallbacks(theMission.side, true, 1, "success")
-- for idx, callback in pairs(csarManager.csarCompleteCB) do
-- callback(theMission.side, true, 1, "test")
-- end
trigger.action.outSoundForCoalition(theMission.side, "Quest Snare 3.wav") trigger.action.outSoundForCoalition(theMission.side, "Quest Snare 3.wav")
if csarManager.csarRedDelivered and theMission.side == 1 then if csarManager.csarRedDelivered and theMission.side == 1 then
@ -420,13 +418,10 @@ function csarManager.heloLanded(theUnit)
local currentBaseSide = base.side local currentBaseSide = base.side
if base.zone.owner then if base.zone.owner then
-- this zone is shared with capturable -- this zone is shared with capturable (owned)
-- zone extensions like owned zone, FARP etc. -- zone extensions like owned zone, FARP etc.
-- use current owner -- use current owner
currentBaseSide = base.zone.owner currentBaseSide = base.zone.owner
-- trigger.action.outText("+++csar: overriding base.side with zone owner = " .. currentBaseSide .. " for csarB " .. base.name .. ", requiring " .. mySide .. " or 0 to land", 30)
else
-- trigger.action.outText("+++csar: base " .. base.name .. " has no owner - proceeding with side = " .. base.side .. " looking for " .. mySide, 30)
end end
if currentBaseSide == mySide or if currentBaseSide == mySide or
@ -551,21 +546,7 @@ function csarManager.heloCrashed(theUnit)
local theGroup = theUnit:getGroup() local theGroup = theUnit:getGroup()
conf.id = theGroup:getID() conf.id = theGroup:getID()
conf.currentState = -1 -- (we don't know) conf.currentState = -1 -- (we don't know)
--[[--
if #conf.troopsOnBoard > 0 then
-- this is where we can create a new CSAR mission
trigger.action.outSoundForCoalition(conf.id, theUnit:getName() .. " crashed while evacuating " .. #conf.troopsOnBoard .. " pilots. Survivors possible.", 30)
trigger.action.outSoundForCoalition(conf.id, "Quest Snare 3.wav")
for i=1, #conf.troopsOnBoard do
local msn = conf.troopsOnBoard[i] -- picked up unit(s)
local theRescuedPilot = msn.name
-- create x new missions in 50m radius
-- except for pilot, that will be called
-- from limitedAirframes
csarManager.createCSARforUnit(theUnit, theRescuedPilot, 50, true)
end
end
--]]--
conf.troopsOnBoard = {} conf.troopsOnBoard = {}
local myName = conf.name local myName = conf.name
cargoSuper.removeAllMassForCargo(myName, "Evacuees") -- will allocate new empty table cargoSuper.removeAllMassForCargo(myName, "Evacuees") -- will allocate new empty table
@ -876,7 +857,10 @@ function csarManager.addCSARBase(aZone)
csarBase.side = cfxZones.getCoalitionFromZoneProperty(aZone, "coalition", 0) csarBase.side = cfxZones.getCoalitionFromZoneProperty(aZone, "coalition", 0)
table.insert(csarManager.csarBases, csarBase) table.insert(csarManager.csarBases, csarBase)
-- trigger.action.outText("+++csar: found base " .. csarBase.name .. " for side " .. csarBase.side, 30)
if csarManager.verbose or aZone.verbose then
trigger.action.outText("+++csar: zone <" .. csarBase.name .. "> safe for side " .. csarBase.side, 30)
end
end end
function csarManager.getCSARBaseforZone(aZone) function csarManager.getCSARBaseforZone(aZone)
@ -895,7 +879,6 @@ end
-- --
-- --
-- --
-- updateCSARMissions: make sure evacuees are still alive -- updateCSARMissions: make sure evacuees are still alive
-- --
@ -1191,28 +1174,6 @@ function csarManager.processCSARZones()
for k, aZone in pairs(csarBases) do for k, aZone in pairs(csarBases) do
csarManager.readCSARZone(aZone) csarManager.readCSARZone(aZone)
--[[--
-- gather data, and then create a mission from this
local theSide = cfxZones.getCoalitionFromZoneProperty(aZone, "coalition", 0)
aZone.csarSide = theSide
local name = cfxZones.getZoneProperty(aZone, "name")
aZone.
local freq = cfxZones.getNumberFromZoneProperty(aZone, "freq", 0)
if freq == 0 then freq = nil end
local numCrew = 1
local mapMarker = nil
local timeLimit = cfxZones.getNumberFromZoneProperty(aZone, "timeLimit", 0)
if timeLimit == 0 then timeLimit = nil else timeLimit = timeLimit * 60 end
local theMission = csarManager.createCSARMissionData(aZone.point,
theSide,
freq,
name,
numCrew,
timeLimit,
mapMarker)
csarManager.addMission(theMission)
--]]--
end end
end end

View File

@ -1,19 +1,24 @@
limitedAirframes = {} limitedAirframes = {}
limitedAirframes.version = "1.3.0" limitedAirframes.version = "1.4.0"
limitedAirframes.verbose = false
limitedAirframes.enabled = true -- can be turned off limitedAirframes.enabled = true -- can be turned off
limitedAirframes.userCanToggle = true -- F-10 menu? limitedAirframes.userCanToggle = true -- F10 menu?
limitedAirframes.onlyOwnSide = true -- F10 query only shows own side count, for later expansion
limitedAirframes.maxRed = -1 -- -1 == infinite limitedAirframes.maxRed = -1 -- -1 == infinite
limitedAirframes.maxBlue = 6 -- -1 = infinite limitedAirframes.maxBlue = -1 -- = infinite
limitedAirframes.redWinsFlag = "999" limitedAirframes.redWinsFlag = "999"
limitedAirframes.blueWinsFlag = "998" limitedAirframes.blueWinsFlag = "998"
limitedAirframes.method = "inc"
limitedAirframes.warningSound = "Quest Snare 3.wav"
limitedAirframes.loseSound = "Death PIANO.wav"
limitedAirframes.winSound = "Triumphant Victory.wav"
limitedAirframes.requiredLibs = { limitedAirframes.requiredLibs = {
"dcsCommon", -- common is of course needed for everything "dcsCommon", -- common is of course needed for everything
-- pretty stupid to check for this since we -- pretty stupid to check for this since we
-- need common to invoke the check, but anyway -- need common to invoke the check, but anyway
"cfxZones", -- Zones, of course for safe landings "cfxZones", -- Zones, of course for safe landings
"cfxPlayer", -- callbacks "cfxPlayer",
-- "cfxGroundTroops", -- generic data module for weight
} }
--[[-- VERSION HISTORY --[[-- VERSION HISTORY
@ -40,6 +45,10 @@ limitedAirframes.requiredLibs = {
- hand change in pilotsafe zones that can be landed in - hand change in pilotsafe zones that can be landed in
- 1.2.0 - limitedAirframesConfig zone - 1.2.0 - limitedAirframesConfig zone
- 1.3.0 - added network dead override logic via unitFlownByPlayer - 1.3.0 - added network dead override logic via unitFlownByPlayer
- 1.4.0 - DML integration, verbosity, clean-up, QoL improvements
redSafe, blueSafe with attribute, backward compatible
currRed
--]]-- --]]--
@ -52,6 +61,7 @@ limitedAirframes.requiredLibs = {
-- *** EXTENDS ZONES *** -- *** EXTENDS ZONES ***
-- safe zones must have a property "pilotSafe" -- safe zones must have a property "pilotSafe"
-- - pilotSafe - this is a zone to safely change airframes in -- - pilotSafe - this is a zone to safely change airframes in
-- - can also carry 'red' or 'blue' to enable
-- - redSafe (optional, defaults to true) -- - redSafe (optional, defaults to true)
-- - blueSafe (optional, defaults to true) -- - blueSafe (optional, defaults to true)
-- set to "false" or "no" to disallow that side to change -- set to "false" or "no" to disallow that side to change
@ -80,7 +90,7 @@ limitedAirframes.lastEvents = {}
-- update the side's airframe credit -- update the side's airframe credit
limitedAirframes.currRed = 0 limitedAirframes.currRed = 0
limitedAirframes.currRed = 0 limitedAirframes.currBlue = 0
-- we record all unit names that contain a player -- we record all unit names that contain a player
-- so that we can check against these when we receive -- so that we can check against these when we receive
@ -106,11 +116,19 @@ function limitedAirframes.readConfigZone()
-- note: must match exactly!!!! -- note: must match exactly!!!!
local theZone = cfxZones.getZoneByName("limitedAirframesConfig") local theZone = cfxZones.getZoneByName("limitedAirframesConfig")
if not theZone then if not theZone then
trigger.action.outText("***LimA: NO config zone!", 30) if limitedAirframes.verbose then
return trigger.action.outText("+++limA: NO config zone!", 30)
end
theZone = cfxZones.createSimpleZone("limitedAirframesConfig")
end end
-- remember me
limitedAirframes.config = theZone
trigger.action.outText("LimA: found config zone!", 30) limitedAirframes.verbose = cfxZones.getBoolFromZoneProperty(theZone, "verbose", false)
if limitedAirframes.verbose then
trigger.action.outText("+++limA: found config zone!", 30)
end
-- ok, for each property, load it if it exists -- ok, for each property, load it if it exists
if cfxZones.hasProperty(theZone, "enabled") then if cfxZones.hasProperty(theZone, "enabled") then
@ -130,14 +148,34 @@ function limitedAirframes.readConfigZone()
limitedAirframes.maxBlue = cfxZones.getNumberFromZoneProperty(theZone, "maxBlue", -1) limitedAirframes.maxBlue = cfxZones.getNumberFromZoneProperty(theZone, "maxBlue", -1)
end end
limitedAirframes.numRed = cfxZones.getStringFromZoneProperty(theZone, "#red", "*none")
limitedAirframes.numBlue = cfxZones.getStringFromZoneProperty(theZone, "#blue", "*none")
if cfxZones.hasProperty(theZone, "redWinsFlag") then
limitedAirframes.redWinsFlag = cfxZones.getStringFromZoneProperty(theZone, "redWinsFlag", "999") limitedAirframes.redWinsFlag = cfxZones.getStringFromZoneProperty(theZone, "redWins!", "*none")
if cfxZones.hasProperty(theZone, "redWinsFlag!") then
limitedAirframes.redWinsFlag = cfxZones.getStringFromZoneProperty(theZone, "redWinsFlag!", "*none")
end end
if cfxZones.hasProperty(theZone, "blueWinsFlag") then limitedAirframes.blueWinsFlag = cfxZones.getStringFromZoneProperty(theZone, "blueWins!", "*none")
limitedAirframes.blueWinsFlag = cfxZones.getStringFromZoneProperty(theZone, "blueWinsFlag", "998") if cfxZones.hasProperty(theZone, "blueWinsFlag!") then
limitedAirframes.blueWinsFlag = cfxZones.getStringFromZoneProperty(theZone, "blueWinsFlag!", "*none")
end end
limitedAirframes.method = cfxZones.getStringFromZoneProperty(theZone, "method", "inc")
if cfxZones.hasProperty(theZone, "warningSound") then
limitedAirframes.warningSound = cfxZones.getStringFromZoneProperty(theZone, "warningSound", "none")
end
if cfxZones.hasProperty(theZone, "winSound") then
limitedAirframes.winSound = cfxZones.getStringFromZoneProperty(theZone, "winSound", "none")
end
if cfxZones.hasProperty(theZone, "loseSound") then
limitedAirframes.loseSound = cfxZones.getStringFromZoneProperty(theZone, "loseSound", "none")
end
end end
-- --
@ -206,17 +244,17 @@ end
function limitedAirframes.updatePlayer(pName, status) function limitedAirframes.updatePlayer(pName, status)
if not pName then if not pName then
trigger.action.outText("+++lim: WARNING - NIL pName in updatePlayer for status " .. status, 30) trigger.action.outText("+++limA: WARNING - NIL pName in updatePlayer for status " .. status, 30)
return return
end end
local desc = "" local desc = ""
if not limitedAirframes.players[pName] then if not limitedAirframes.players[pName] then
desc = "+++lim: NEW player " .. pName .. ": " .. status desc = "+++limA: NEW player " .. pName .. ": " .. status
else else
if limitedAirframes.players[pName] ~= status then if limitedAirframes.players[pName] ~= status then
desc = "+++lim: CHANGE player " .. pName .. " " .. limitedAirframes.players[pName] .. " -> " .. status desc = "+++limA: CHANGE player " .. pName .. " " .. limitedAirframes.players[pName] .. " -> " .. status
else else
desc = "+++: player " .. pName .. " no change (" .. status .. ")" desc = "+++limA: player " .. pName .. " no change (" .. status .. ")"
end end
end end
@ -267,16 +305,13 @@ function limitedAirframes.preProcessor(event)
if event.id == 6 then -- Eject, plane already divorced from player if event.id == 6 then -- Eject, plane already divorced from player
if limitedAirframes.isKnownUnitName(uName) then if limitedAirframes.isKnownUnitName(uName) then
--trigger.action.outText("limAir: detected EJECT for player unit " .. uName .. " player " .. limitedAirframes.getKnownUnitPilotByUnitName(uName), 30)
return true return true
end end
return false -- no longer of interest return false -- no longer of interest
end end
if event.id == 5 then -- crash, plane no longer attached to player if event.id == 5 then -- crash, plane no longer attached to player
if limitedAirframes.isKnownUnitName(uName) then if limitedAirframes.isKnownUnitName(uName) then
--trigger.action.outText("limAir: detected CRASH for player unit " .. uName .. " player " .. limitedAirframes.getKnownUnitPilotByUnitName(uName), 30)
return true return true
end end
return false -- no longer of interest return false -- no longer of interest
@ -329,19 +364,10 @@ function limitedAirframes.somethingHappened(event)
local ID = event.id local ID = event.id
local myType = theUnit:getTypeName() local myType = theUnit:getTypeName()
-- "20" event (player enter): always processed
--[[-- if ID == 20 or ID == 15 then -- player entered unit
limitedAirframes.addPlayerUnit(theUnit) -- will also update player and player status to 'alive'
-- now procc a 'cheater' since we entered a new airframe/pilot
limitedAirframes.checkPlayerFrameAvailability(event)
return
end
--]]--
if ID == 20 then -- 20 ENTER UNIT if ID == 20 then -- 20 ENTER UNIT
local pName = limitedAirframes.getKnownUnitPilotByUnit(theUnit) local pName = limitedAirframes.getKnownUnitPilotByUnit(theUnit)
if not pName then pName = "***UNKNOWN***" end if not pName then pName = "***UNKNOWN***" end
--trigger.action.outText("limAir: Received ENTER UNIT (20) for " .. pName .. " in " .. unitName , 30)
return return
end end
@ -354,7 +380,9 @@ function limitedAirframes.somethingHappened(event)
limitedAirframes.unitFlownByPlayer[unitName] = playerName limitedAirframes.unitFlownByPlayer[unitName] = playerName
-- TODO: make sure this is the ONLY plane the player -- TODO: make sure this is the ONLY plane the player
-- is registered under, and mark mismatches -- is registered under, and mark mismatches
trigger.action.outText("limAir: 15 -- player " .. playerName .. " now in " .. unitName, 30) if limitedAirframes.verbose then
trigger.action.outText("limAir: 15 -- player " .. playerName .. " now in " .. unitName, 30)
end
return return
end end
@ -391,7 +419,9 @@ function limitedAirframes.somethingHappened(event)
limitedAirframes.pilotDied(theUnit) limitedAirframes.pilotDied(theUnit)
return return
else else
trigger.action.outText("limAir: Crash of airframe detected - but player status wasn't alive (" .. pStatus .. ")", 30) if limitedAirframes.verbose then
trigger.action.outText("limAir: Crash of airframe detected - but player status wasn't alive (" .. pStatus .. ")", 30)
end
return return
end end
end end
@ -402,8 +432,9 @@ function limitedAirframes.somethingHappened(event)
-- remove pilot name from unit name -- remove pilot name from unit name
limitedAirframes.unitFlownByPlayer[unitName] = nil limitedAirframes.unitFlownByPlayer[unitName] = nil
--trigger.action.outText("limAir: 21 -- unit " .. unitName .. " unoccupied", 30) --trigger.action.outText("limAir: 21 -- unit " .. unitName .. " unoccupied", 30)
if limitedAirframes.verbose then
trigger.action.outText("limAir: 21 (player left) for unit " .. unitName , 30) trigger.action.outText("limAir: 21 (player left) for unit " .. unitName , 30)
end
-- player left unit. Happens twice -- player left unit. Happens twice
-- check if player alive, else we have a ditch. -- check if player alive, else we have a ditch.
limitedAirframes.handlePlayerLeftUnit(event) limitedAirframes.handlePlayerLeftUnit(event)
@ -415,7 +446,9 @@ function limitedAirframes.somethingHappened(event)
--trigger.action.outText("limAir: 9 (PILOT DEAD) for unit " .. unitName , 30) --trigger.action.outText("limAir: 9 (PILOT DEAD) for unit " .. unitName , 30)
local thePilot = limitedAirframes.unitFlownByPlayer[unitName] local thePilot = limitedAirframes.unitFlownByPlayer[unitName]
if not thePilot then if not thePilot then
trigger.action.outText("+++limAir: 9 O'RIDE -- unit " .. unitName .. " was legally vacated before!", 30) if limitedAirframes.verbose then
trigger.action.outText("+++limAir: 9 O'RIDE -- unit " .. unitName .. " was legally vacated before!", 30)
end
return return
end end
limitedAirframes.pilotDied(theUnit) limitedAirframes.pilotDied(theUnit)
@ -426,8 +459,6 @@ function limitedAirframes.somethingHappened(event)
return return
end end
trigger.action.outText("limAir: WARNING unhandled: " .. ID .. " for player unit " .. theUnit:getName() .. " of type " .. myType, 30) trigger.action.outText("limAir: WARNING unhandled: " .. ID .. " for player unit " .. theUnit:getName() .. " of type " .. myType, 30)
end end
@ -474,9 +505,11 @@ function limitedAirframes.handlePlayerLeftUnit(event)
if theSafeZone.owner then if theSafeZone.owner then
-- owned zone. olny allow in neutral or owned by same side -- owned zone. olny allow in neutral or owned by same side
isSafe = isSafe and (mySide == theSafeZone.owner or theSafeZone.owner == 0) isSafe = isSafe and (mySide == theSafeZone.owner or theSafeZone.owner == 0)
trigger.action.outText("+++: Lim - " .. theSafeZone.name .. " ownership: myside = " .. mySide .. " zone owner is " .. theSafeZone.owner, 30) if limitedAirframes.verbose then
trigger.action.outText("+++limA: " .. theSafeZone.name .. " ownership: myside = " .. mySide .. " zone owner is " .. theSafeZone.owner, 30)
end
else else
-- trigger.action.outText("+++: Zone " .. theSafeZone.name .. " has no ownership, skipping check", 30)
end end
-- check we are at rest below 10m height. agl may give -- check we are at rest below 10m height. agl may give
@ -492,7 +525,9 @@ function limitedAirframes.handlePlayerLeftUnit(event)
if isInAir then isSafe = false end if isInAir then isSafe = false end
if isSafe then if isSafe then
trigger.action.outTextForCoalition(mySide, "limAir: Pilot " .. theUnit:getPlayerName() .. " left unit " .. theUnit:getName() .. " legally in zone " .. theSafeZone.name, 30) -- if limitedAirframes.verbose then
trigger.action.outTextForCoalition(mySide, "Pilot " .. theUnit:getPlayerName() .. " left unit " .. theUnit:getName() .. " legally in zone " .. theSafeZone.name, 30)
-- end
-- remove from known player planes -- remove from known player planes
-- no more limitedAirframes.removePlayerUnit(theUnit) -- no more limitedAirframes.removePlayerUnit(theUnit)
return; return;
@ -500,7 +535,10 @@ function limitedAirframes.handlePlayerLeftUnit(event)
end end
-- ditched outside safe harbour -- ditched outside safe harbour
trigger.action.outTextForCoalition(mySide, "Pilot " .. theUnit:getPlayerName() .. " DITCHED unit " .. theUnit:getName() .. " -- PILOT LOSS (MIA)", 30) -- if limitedAirframes.verbose then
trigger.action.outTextForCoalition(mySide, "Pilot " .. theUnit:getPlayerName() .. " DITCHED unit " .. theUnit:getName() .. " -- PILOT is considered MIA", 30)
-- end
limitedAirframes.pilotLost(theUnit) limitedAirframes.pilotLost(theUnit)
if csarManager and csarManager.airframeDitched then if csarManager and csarManager.airframeDitched then
csarManager.airframeDitched(theUnit) csarManager.airframeDitched(theUnit)
@ -560,19 +598,22 @@ function limitedAirframes.pilotLost(theUnit)
if limitedAirframes.maxRed < 0 then return false end -- disabled/infinite if limitedAirframes.maxRed < 0 then return false end -- disabled/infinite
limitedAirframes.currRed = limitedAirframes.currRed - 1 limitedAirframes.currRed = limitedAirframes.currRed - 1
-- pass it along
cfxZones.setFlagValueMult(limitedAirframes.numRed, limitedAirframes.currRed, limitedAirframes.config)
if limitedAirframes.currRed == 0 then if limitedAirframes.currRed == 0 then
trigger.action.outTextForCoalition(theSide, "\nYou have lost almost all of your pilots.\n\nWARNING: Losing any more pilots WILL FAIL THE MISSION\n", 30) trigger.action.outTextForCoalition(theSide, "\nYou have lost almost all of your pilots.\n\nWARNING: Losing any more pilots WILL FAIL THE MISSION\n", 30)
trigger.action.outSoundForCoalition(theSide, "Quest Snare 3.wav") trigger.action.outSoundForCoalition(theSide, limitedAirframes.warningSound)--"Quest Snare 3.wav")
return false return false
end end
if limitedAirframes.currRed < 0 then if limitedAirframes.currRed < 0 then
-- red have lost all airframes -- red have lost all airframes
trigger.action.outText("\nREDFORCE has lost all of their pilots.\n\nBLUEFORCE WINS!\n", 30) trigger.action.outText("\nREDFORCE has lost all of their pilots.\n\nBLUEFORCE WINS!\n", 30)
trigger.action.outSoundForCoalition(theSide, "Death PIANO.wav") trigger.action.outSoundForCoalition(theSide, limitedAirframes.loseSound) --"Death PIANO.wav")
trigger.action.outSoundForCoalition(theOtherSide, "Triumphant Victory.wav") trigger.action.outSoundForCoalition(theOtherSide, limitedAirframes.winSound)--"Triumphant Victory.wav")
trigger.action.setUserFlag(limitedAirframes.blueWinsFlag, 1 ) -- trigger.action.setUserFlag(limitedAirframes.blueWinsFlag, 1 )
cfxZones.pollFlag(limitedAirframes.blueWinsFlag, limitedAirframes.method, limitedAirframes.config)
return true return true
end end
@ -581,20 +622,24 @@ function limitedAirframes.pilotLost(theUnit)
theOtherSide = 1 theOtherSide = 1
if limitedAirframes.maxBlue < 0 then return false end -- disabled/infinite if limitedAirframes.maxBlue < 0 then return false end -- disabled/infinite
limitedAirframes.currBlue = limitedAirframes.currBlue - 1 limitedAirframes.currBlue = limitedAirframes.currBlue - 1
-- pass it along
cfxZones.setFlagValueMult(limitedAirframes.numBlue, limitedAirframes.currBlue, limitedAirframes.config)
if limitedAirframes.currBlue == 0 then if limitedAirframes.currBlue == 0 then
trigger.action.outTextForCoalition(theSide, "\nYou have lost almost all of your pilots.\n\nWARNING: Losing any more pilots WILL FAIL THE MISSION\n", 30) trigger.action.outTextForCoalition(theSide, "\nYou have lost almost all of your pilots.\n\nWARNING: Losing any more pilots WILL FAIL THE MISSION\n", 30)
trigger.action.outSoundForCoalition(theSide, "Quest Snare 3.wav") trigger.action.outSoundForCoalition(theSide, limitedAirframes.warningSound)--"Quest Snare 3.wav")
return false return false
end end
if limitedAirframes.currBlue < 0 then if limitedAirframes.currBlue < 0 then
-- red have lost all airframes -- red have lost all airframes
trigger.action.outText("\nBLUEFORCE has lost all of their pilots.\n\nREDFORCE WINS!\n", 30) trigger.action.outText("\nBLUEFORCE has lost all of their pilots.\n\nREDFORCE WINS!\n", 30)
trigger.action.setUserFlag(limitedAirframes.redWinsFlag, 1 ) -- trigger.action.setUserFlag(limitedAirframes.redWinsFlag, 1 )
trigger.action.outSoundForCoalition(theSide, "Death PIANO.wav") cfxZones.pollFlag(limitedAirframes.redWinsFlag, limitedAirframes.method, limitedAirframes.config)
trigger.action.outSoundForCoalition(theOtherSide, "Triumphant Victory.wav") trigger.action.outSoundForCoalition(theSide, limitedAirframes.loseSound)--"Death PIANO.wav")
trigger.action.outSoundForCoalition(theOtherSide, limitedAirframes.winSound)--"Triumphant Victory.wav")
return true return true
end end
trigger.action.outSoundForCoalition(theSide, "Quest Snare 3.wav") trigger.action.outSoundForCoalition(theSide, limitedAirframes.warningSound)--"Quest Snare 3.wav")
trigger.action.outTextForCoalition(theSide, "You have lost a pilot! Remaining: " .. limitedAirframes.currBlue, 30) trigger.action.outTextForCoalition(theSide, "You have lost a pilot! Remaining: " .. limitedAirframes.currBlue, 30)
end end
return false return false
@ -643,12 +688,31 @@ function limitedAirframes.addSafeZone(aZone)
-- add zone to my list -- add zone to my list
limitedAirframes.safeZones[aZone] = aZone limitedAirframes.safeZones[aZone] = aZone
aZone.redSafe = true
aZone.redSafe = cfxZones.getBoolFromZoneProperty(aZone, "redSafe", true)
aZone.blueSafe = true
aZone.blueSafe = cfxZones.getBoolFromZoneProperty(aZone, "blueSafe", true)
trigger.action.outText("limAir: added safeZone " .. aZone.name, 30) -- deprecated old code. new code contains 'red, blue' in value for pilotsafe
local safeSides = cfxZones.getStringFromZoneProperty(aZone, "pilotsafe", "")
safeSides = safeSides:lower()
if dcsCommon.containsString(safeSides, "red") or dcsCommon.containsString(safeSides, "blue") then
aZone.redSafe = dcsCommon.containsString(safeSides, "red")
aZone.blueSafe = dcsCommon.containsString(safeSides, "blue")
else
--aZone.redSafe = true
aZone.redSafe = cfxZones.getBoolFromZoneProperty(aZone, "redSafe", true)
--aZone.blueSafe = true
aZone.blueSafe = cfxZones.getBoolFromZoneProperty(aZone, "blueSafe", true)
end
if limitedAirframes.verbose or aZone.verbose then
if aZone.redSafe then
trigger.action.outText("+++limA: <" .. aZone.name .. "> is safe for RED pilots", 30)
end
if aZone.blueSafe then
trigger.action.outText("+++limA: <" .. aZone.name .. "> is safe for BLUE pilots", 30)
end
trigger.action.outText("+++limA: added safeZone " .. aZone.name, 30)
end
end end
@ -704,7 +768,7 @@ function limitedAirframes.doAirframeScore(args)
local msg = "\nRED has " .. redRemaining .. " pilots left,\nBLUE has " .. blueRemaining .. " pilots left\n" local msg = "\nRED has " .. redRemaining .. " pilots left,\nBLUE has " .. blueRemaining .. " pilots left\n"
trigger.action.outText(msg, 30, true) trigger.action.outText(msg, 30, true)
trigger.action.outSound("Quest Snare 3.wav") trigger.action.outSound(limitedAirframes.warningSound)--"Quest Snare 3.wav")
end end
function limitedAirframes.redirectToggleAirFrames(args) function limitedAirframes.redirectToggleAirFrames(args)
@ -717,23 +781,26 @@ function limitedAirframes.doToggleAirFrames(args)
local desc = "\n\nPilot Count rule NOW IN EFFECT\n\n" local desc = "\n\nPilot Count rule NOW IN EFFECT\n\n"
if limitedAirframes.enabled then if limitedAirframes.enabled then
trigger.action.outSound("Quest Snare 3.wav") trigger.action.outSound(limitedAirframes.warningSound)--"Quest Snare 3.wav")
else else
desc = "\n\nYou cowardly disabled Pilot Count\n\n" desc = "\n\nYou cowardly disabled Pilot Count\n\n"
trigger.action.outSound("Death PIANO.wav") trigger.action.outSound(limitedAirframes.loseSound)--"Death PIANO.wav")
end end
trigger.action.outText(desc, 30) trigger.action.outText(desc, 30)
limitedAirframes.setCommsMenu() limitedAirframes.setCommsMenu()
end end
-- --
-- CSAR CALLBACK -- CSAR CALLBACK (called by CSAR Manager)
-- --
function limitedAirframes.pilotsRescued(theCoalition, success, numRescued, notes) function limitedAirframes.pilotsRescued(theCoalition, success, numRescued, notes)
local availablePilots = 0 local availablePilots = 0
if theCoalition == 1 then -- red if theCoalition == 1 then -- red
limitedAirframes.currRed = limitedAirframes.currRed + numRescued limitedAirframes.currRed = limitedAirframes.currRed + numRescued
-- pass it along
cfxZones.setFlagValueMult(limitedAirframes.numRed, limitedAirframes.currRed, limitedAirframes.config)
if limitedAirframes.currRed > limitedAirframes.maxRed then if limitedAirframes.currRed > limitedAirframes.maxRed then
limitedAirframes.currRed = limitedAirframes.maxRed limitedAirframes.currRed = limitedAirframes.maxRed
end end
@ -745,6 +812,10 @@ function limitedAirframes.pilotsRescued(theCoalition, success, numRescued, notes
if theCoalition == 2 then -- blue if theCoalition == 2 then -- blue
limitedAirframes.currBlue = limitedAirframes.currBlue + numRescued limitedAirframes.currBlue = limitedAirframes.currBlue + numRescued
-- pass it along
cfxZones.setFlagValueMult(limitedAirframes.numBlue, limitedAirframes.currBlue, limitedAirframes.config)
if limitedAirframes.currBlue > limitedAirframes.maxBlue then if limitedAirframes.currBlue > limitedAirframes.maxBlue then
limitedAirframes.currBlue = limitedAirframes.maxBlue limitedAirframes.currBlue = limitedAirframes.maxBlue
end end
@ -754,7 +825,7 @@ function limitedAirframes.pilotsRescued(theCoalition, success, numRescued, notes
end end
end end
trigger.action.outTextForCoalition(theCoalition, "\nPilots returned to flight line, you now have " .. availablePilots..".\n", 30) trigger.action.outTextForCoalition(theCoalition, "\nPilots returned to flight line, you now have " .. availablePilots..".\n", 30)
trigger.action.outSoundForCoalition(theCoalition, "Quest Snare 3.wav") trigger.action.outSoundForCoalition(theCoalition, limitedAirframes.warningSound)--"Quest Snare 3.wav")
end end
-- --
@ -770,6 +841,10 @@ function limitedAirframes.start()
-- override config settings if defined as zone -- override config settings if defined as zone
limitedAirframes.readConfigZone() limitedAirframes.readConfigZone()
-- set output flags
cfxZones.setFlagValueMult(limitedAirframes.numBlue, limitedAirframes.currBlue, limitedAirframes.config)
cfxZones.setFlagValueMult(limitedAirframes.numRed, limitedAirframes.currRed, limitedAirframes.config)
-- collect all zones that are airframe safe -- collect all zones that are airframe safe
local afsZones = cfxZones.zonesWithProperty("pilotSafe") local afsZones = cfxZones.zonesWithProperty("pilotSafe")
@ -779,6 +854,27 @@ function limitedAirframes.start()
limitedAirframes.addSafeZone(aZone) limitedAirframes.addSafeZone(aZone)
end end
-- check that sides with limited airframes also have at least one
-- pilotsafe zone
if limitedAirframes.maxRed > 0 then
local safeAndSound = false
for idx, theZone in pairs(limitedAirframes.safeZones) do
if theZone.redSafe then safeAndSound = true end
end
if not safeAndSound then
trigger.action.outText("+++limA: WARNING - RED has no safe zone to change air frames", 30)
end
end
if limitedAirframes.maxBlue > 0 then
local safeAndSound = false
for idx, theZone in pairs(limitedAirframes.safeZones) do
if theZone.blueSafe then safeAndSound = true end
end
if not safeAndSound then
trigger.action.outText("+++limA: WARNING - BLUE has no safe zone to change air frames", 30)
end
end
-- connect player callback -- connect player callback
-- install callbacks for airframe-related events -- install callbacks for airframe-related events
dcsCommon.addEventHandler(limitedAirframes.somethingHappened, limitedAirframes.preProcessor, limitedAirframes.postProcessor) dcsCommon.addEventHandler(limitedAirframes.somethingHappened, limitedAirframes.preProcessor, limitedAirframes.postProcessor)
@ -805,13 +901,13 @@ function limitedAirframes.start()
-- connect to csarManager if present -- connect to csarManager if present
if csarManager and csarManager.installCallback then if csarManager and csarManager.installCallback then
csarManager.installCallback(limitedAirframes.pilotsRescued) csarManager.installCallback(limitedAirframes.pilotsRescued)
trigger.action.outText("+++lim: connected to csar manager", 30) trigger.action.outText("+++limA: connected to csar manager", 30)
else else
trigger.action.outText("+++lim: NO CSAR integration", 30) trigger.action.outText("+++limA: NO CSAR integration", 30)
end end
-- say hi -- say hi
trigger.action.outText("limitedAirframes v" .. limitedAirframes.version .. " started: R:".. limitedAirframes.maxRed .. "/B:" .. limitedAirframes.maxBlue, 30) trigger.action.outText("cf/x Limited Airframes v" .. limitedAirframes.version .. " started: R:".. limitedAirframes.maxRed .. "/B:" .. limitedAirframes.maxBlue, 30)
return true return true
end end
@ -825,4 +921,5 @@ end
--[[-- --[[--
safe ditch: check airspeed and altitude. ditch only counts if less than 10m and 2 kts safe ditch: check airspeed and altitude. ditch only counts if less than 10m and 2 kts
report number of airframes left via second instance in switch off menu report number of airframes left via second instance in switch off menu
so it can report only one side
--]]-- --]]--

View File

@ -1,5 +1,5 @@
pulseFlags = {} pulseFlags = {}
pulseFlags.version = "1.2.0" pulseFlags.version = "1.2.1"
pulseFlags.verbose = false pulseFlags.verbose = false
pulseFlags.requiredLibs = { pulseFlags.requiredLibs = {
"dcsCommon", -- always "dcsCommon", -- always
@ -29,6 +29,9 @@ pulseFlags.requiredLibs = {
pulseStopped synonym pulseStopped synonym
- 1.2.0 DML Watchflag integration - 1.2.0 DML Watchflag integration
corrected bug in loading last pulse value for paused corrected bug in loading last pulse value for paused
- 1.2.1 pulseInterval synonym for time
pulses now supports range
zone-local verbosity
--]]-- --]]--
@ -53,11 +56,30 @@ function pulseFlags.createPulseWithZone(theZone)
-- time can be number, or number-number range -- time can be number, or number-number range
theZone.minTime, theZone.time = cfxZones.getPositiveRangeFromZoneProperty(theZone, "time", 1) theZone.minTime, theZone.time = cfxZones.getPositiveRangeFromZoneProperty(theZone, "time", 1)
if pulseFlags.verbose then if cfxZones.hasProperty(theZone, "pulseInterval") then
trigger.action.outText("***PulF: zone <" .. theZone.name .. "> time is <".. theZone.minTime ..", " .. theZone.time .. "!", 30) theZone.minTime, theZone.time = cfxZones.getPositiveRangeFromZoneProperty(theZone, "pulseInterval", 1)
end
if pulseFlags.verbose or theZone.verbose then
trigger.action.outText("+++pulF: zone <" .. theZone.name .. "> time is <".. theZone.minTime ..", " .. theZone.time .. "!", 30)
end end
theZone.pulses = cfxZones.getNumberFromZoneProperty(theZone, "pulses", -1)
theZone.pulses = -1 -- set to infinite
if cfxZones.hasProperty(theZone, "pulses") then
local minP
local maxP
minP, maxP = cfxZones.getPositiveRangeFromZoneProperty(theZone, "pulses", 1)
if minP == maxP then theZone.pulses = minP
else
theZone.pulses = cfxZones.randomInRange(minP, maxP)
end
end
if pulseFlags.verbose or theZone.verbose then
trigger.action.outText("+++pulF: zone <" .. theZone.name .. "> set to <" .. theZone.pulses .. "> pulses", 30)
end
theZone.pulsesLeft = 0 -- will start new cycle theZone.pulsesLeft = 0 -- will start new cycle
-- watchflag: -- watchflag:
@ -133,7 +155,7 @@ function pulseFlags.doPulse(args)
-- do a poll on flags -- do a poll on flags
-- first, we only do an initial pulse if zeroPulse is set -- first, we only do an initial pulse if zeroPulse is set
if theZone.hasPulsed or theZone.zeroPulse then if theZone.hasPulsed or theZone.zeroPulse then
if pulseFlags.verbose then if pulseFlags.verbose or theZone.verbose then
trigger.action.outText("+++pulF: will bang " .. theZone.pulseFlag, 30); trigger.action.outText("+++pulF: will bang " .. theZone.pulseFlag, 30);
end end
@ -151,8 +173,8 @@ function pulseFlags.doPulse(args)
--local currVal = cfxZones.getFlagValue(theZone.pulseDoneFlag, theZone)-- trigger.misc.getUserFlag(theZone.pulseDoneFlag) --local currVal = cfxZones.getFlagValue(theZone.pulseDoneFlag, theZone)-- trigger.misc.getUserFlag(theZone.pulseDoneFlag)
cfxZones.pollFlag(theZone.pulseDoneFlag, "inc", theZone) -- trigger.action.setUserFlag(theZone.pulseDoneFlag, currVal + 1) cfxZones.pollFlag(theZone.pulseDoneFlag, "inc", theZone) -- trigger.action.setUserFlag(theZone.pulseDoneFlag, currVal + 1)
end end
if pulseFlags.verbose then if pulseFlags.verbose or theZone.verbose then
trigger.action.outText("***PulF: pulse <" .. theZone.name .. "> ended!", 30) trigger.action.outText("+++pulF: pulse <" .. theZone.name .. "> ended!", 30)
end end
theZone.pulsing = false theZone.pulsing = false
theZone.pulsePaused = true theZone.pulsePaused = true
@ -160,8 +182,8 @@ function pulseFlags.doPulse(args)
end end
end end
else else
if pulseFlags.verbose then if pulseFlags.verbose or theZone.verbose then
trigger.action.outText("***PulF: pulse <" .. theZone.name .. "> delaying zero pulse!", 30) trigger.action.outText("+++pulF: pulse <" .. theZone.name .. "> delaying zero pulse!", 30)
end end
end end
@ -173,8 +195,8 @@ function pulseFlags.doPulse(args)
-- schedule in delay time -- schedule in delay time
theZone.timerID = timer.scheduleFunction(pulseFlags.doPulse, args, timer.getTime() + delay) theZone.timerID = timer.scheduleFunction(pulseFlags.doPulse, args, timer.getTime() + delay)
if pulseFlags.verbose then if pulseFlags.verbose or theZone.verbose then
trigger.action.outText("+++PulF: pulse <" .. theZone.name .. "> rescheduled in " .. delay, 30) trigger.action.outText("+++pulF: pulse <" .. theZone.name .. "> rescheduled in " .. delay, 30)
end end
end end
@ -184,8 +206,8 @@ function pulseFlags.startNewPulse(theZone)
theZone.pulsesLeft = theZone.pulses theZone.pulsesLeft = theZone.pulses
local args = {theZone} local args = {theZone}
theZone.pulsing = true theZone.pulsing = true
if pulseFlags.verbose then if pulseFlags.verbose or theZone.verbose then
trigger.action.outText("+++PulF: starting pulse <" .. theZone.name .. ">", 30) trigger.action.outText("+++pulF: starting pulse <" .. theZone.name .. ">", 30)
end end
pulseFlags.doPulse(args) pulseFlags.doPulse(args)
end end
@ -214,30 +236,16 @@ function pulseFlags.update()
-- see if we got a pause or activate command -- see if we got a pause or activate command
-- activatePulseFlag -- activatePulseFlag
if cfxZones.testZoneFlag(aZone, aZone.activatePulseFlag, aZone.pulseTriggerMethod, "lastActivateValue") then if cfxZones.testZoneFlag(aZone, aZone.activatePulseFlag, aZone.pulseTriggerMethod, "lastActivateValue") then
if pulseFlags.verbose then if pulseFlags.verbose or aZone.verbose then
trigger.action.outText("+++PulF: activating <" .. aZone.name .. ">", 30) trigger.action.outText("+++pulF: activating <" .. aZone.name .. ">", 30)
end end
aZone.pulsePaused = false -- will start anew aZone.pulsePaused = false -- will start anew
end end
--[[-- -- old code
if aZone.activatePulseFlag then
local currTriggerVal = cfxZones.getFlagValue(aZone.activatePulseFlag, aZone) -- trigger.misc.getUserFlag(aZone.activatePulseFlag)
if currTriggerVal ~= aZone.lastActivateValue
then
if pulseFlags.verbose then
trigger.action.outText("+++PulF: activating <" .. aZone.name .. ">", 30)
end
aZone.lastActivateValue = currTriggerVal
aZone.pulsePaused = false -- will start anew
end
end
--]]--
-- pausePulseFlag -- pausePulseFlag
if cfxZones.testZoneFlag(aZone, aZone.pausePulseFlag, aZone.pulseTriggerMethod, "lastPauseValue") then if cfxZones.testZoneFlag(aZone, aZone.pausePulseFlag, aZone.pulseTriggerMethod, "lastPauseValue") then
if pulseFlags.verbose then if pulseFlags.verbose or aZone.verbose then
trigger.action.outText("+++PulF: pausing <" .. aZone.name .. ">", 30) trigger.action.outText("+++pulF: pausing <" .. aZone.name .. ">", 30)
end end
aZone.pulsePaused = true -- prevents new start aZone.pulsePaused = true -- prevents new start
if aZone.timerID then if aZone.timerID then
@ -245,24 +253,7 @@ function pulseFlags.update()
aZone.timerID = nil aZone.timerID = nil
end end
end end
--[[--
-- old colde
if aZone.pausePulseFlag then
local currTriggerVal = cfxZones.getFlagValue(aZone.pausePulseFlag, aZone)-- trigger.misc.getUserFlag(aZone.pausePulseFlag)
if currTriggerVal ~= aZone.lastPauseValue
then
if pulseFlags.verbose then
trigger.action.outText("+++PulF: pausing <" .. aZone.name .. ">", 30)
end
aZone.lastPauseValue = currTriggerVal
aZone.pulsePaused = true -- prevents new start
if aZone.timerID then
timer.removeFunction(aZone.timerID)
aZone.timerID = nil
end
end
end
--]]--
end end
end end
@ -274,7 +265,7 @@ function pulseFlags.readConfigZone()
local theZone = cfxZones.getZoneByName("pulseFlagsConfig") local theZone = cfxZones.getZoneByName("pulseFlagsConfig")
if not theZone then if not theZone then
if pulseFlags.verbose then if pulseFlags.verbose then
trigger.action.outText("+++PulF: NO config zone!", 30) trigger.action.outText("+++pulF: NO config zone!", 30)
end end
return return
end end
@ -282,7 +273,7 @@ function pulseFlags.readConfigZone()
pulseFlags.verbose = cfxZones.getBoolFromZoneProperty(theZone, "verbose", false) pulseFlags.verbose = cfxZones.getBoolFromZoneProperty(theZone, "verbose", false)
if pulseFlags.verbose then if pulseFlags.verbose then
trigger.action.outText("+++PulF: read config", 30) trigger.action.outText("+++pulF: read config", 30)
end end
end end
@ -302,7 +293,8 @@ function pulseFlags.start()
-- process RND Zones -- process RND Zones
local attrZones = cfxZones.getZonesWithAttributeNamed("pulse") local attrZones = cfxZones.getZonesWithAttributeNamed("pulse")
-- local a = dcsCommon.getSizeOfTable(attrZones)
-- trigger.action.outText("pulse zones: " .. a, 30)
-- now create a pulse gen for each one and add them -- now create a pulse gen for each one and add them
-- to our watchlist -- to our watchlist
for k, aZone in pairs(attrZones) do for k, aZone in pairs(attrZones) do
@ -310,8 +302,9 @@ function pulseFlags.start()
pulseFlags.addPulse(aZone) -- remember it so we can pulse it pulseFlags.addPulse(aZone) -- remember it so we can pulse it
end end
local attrZones = cfxZones.getZonesWithAttributeNamed("pulse!") attrZones = cfxZones.getZonesWithAttributeNamed("pulse!")
a = dcsCommon.getSizeOfTable(attrZones)
trigger.action.outText("pulse! zones: " .. a, 30)
-- now create a pulse gen for each one and add them -- now create a pulse gen for each one and add them
-- to our watchlist -- to our watchlist
for k, aZone in pairs(attrZones) do for k, aZone in pairs(attrZones) do