diff --git a/Doc/DML Documentation.pdf b/Doc/DML Documentation.pdf index 57d88f5..9ff5b60 100644 Binary files a/Doc/DML Documentation.pdf and b/Doc/DML Documentation.pdf differ diff --git a/Doc/DML Quick Reference.pdf b/Doc/DML Quick Reference.pdf index 348b714..d3bf215 100644 Binary files a/Doc/DML Quick Reference.pdf and b/Doc/DML Quick Reference.pdf differ diff --git a/modules/cfxZones.lua b/modules/cfxZones.lua index b08854a..0a2b60c 100644 --- a/modules/cfxZones.lua +++ b/modules/cfxZones.lua @@ -5,7 +5,7 @@ -- Copyright (c) 2021, 2022 by Christian Franz and cf/x AG -- cfxZones = {} -cfxZones.version = "2.7.7" +cfxZones.version = "2.7.8" --[[-- VERSION HISTORY - 2.2.4 - getCoalitionFromZoneProperty - getStringFromZoneProperty @@ -72,6 +72,13 @@ cfxZones.version = "2.7.7" - 2.7.6 - trim for getBoolFromZoneProperty and getStringFromZoneProperty - 2.7.7 - randomInRange() - show number of zones + - 2.7.8 - inc method now triggers if curr value > last value + - dec method noew triggers when curr value < last value + - testFlagByMethodForZone supports lohi, hilo transitions + - doPollFlag supports 'pulse' + - pulseFlag + - unpulse + --]]-- cfxZones.verbose = false @@ -1079,6 +1086,41 @@ end -- -- Flag Pulling -- +function cfxZones.pulseFlag(theFlag, method, theZone) + local args = {} + args.theFlag = theFlag + args.method = method + args.theZone = theZone + local delay = 3 + if dcsCommon.containsString(method, ",") then + local parts = dcsCommon.splitString(method, ",") + delay = parts[2] + if delay then delay = tonumber(delay) end + end + if not delay then delay = 3 end + if theZone.verbose then + trigger.action.outText("+++zne: RAISING pulse t="..delay.." for flag <" .. theFlag .. "> in zone <" .. theZone.name ..">", 30) + end + local newVal = 1 + cfxZones.setFlagValue(theFlag, newVal, theZone) + + -- schedule second half of pulse + timer.scheduleFunction(cfxZones.unPulseFlag, args, timer.getTime() + delay) +end + +function cfxZones.unPulseFlag(args) + local theZone = args.theZone + local method = args.method + local theFlag = args.theFlag + local newVal = 0 + -- we may later use method to determine pulse direction / newVal + -- for now, we always go low + if theZone.verbose then + trigger.action.outText("+++zne: DOWNPULSE pulse for flag <" .. theFlag .. "> in zone <" .. theZone.name ..">", 30) + end + cfxZones.setFlagValue(theFlag, newVal, theZone) +end + function cfxZones.doPollFlag(theFlag, method, theZone) if cfxZones.verbose then trigger.action.outText("+++zones: polling flag " .. theFlag .. " with " .. method, 30) @@ -1123,6 +1165,9 @@ function cfxZones.doPollFlag(theFlag, method, theZone) cfxZones.setFlagValue(theFlag, 1, theZone) end + elseif dcsCommon.stringStartsWith(method, "pulse") then + cfxZones.pulseFlag(theFlag, method, theZone) + else if method ~= "on" and method ~= "f=1" then trigger.action.outText("+++zones: unknown method <" .. method .. "> - using 'on'", 30) @@ -1353,13 +1398,23 @@ function cfxZones.testFlagByMethodForZone(currVal, lastVal, theMethod, theZone) end if lMethod == "inc" or lMethod == "+1" then - return currVal == lastVal+1 +-- return currVal == lastVal+1 -- better: test for greater than + return currVal > lastVal end if lMethod == "dec" or lMethod == "-1" then - return currVal == lastVal-1 + --return currVal == lastVal-1 + return currVal < lastVal end + if lMethod == "lohi" or lMethod == "pulse" then + return (lastVal <= 0 and currVal > 0) + end + + if lMethod == "hilo" then + return (lastVal > 0 and currVal <= 0) + end + -- number constraints -- or flag constraints -- ONLY RETURN TRUE IF CHANGE AND CONSTRAINT MET diff --git a/modules/changer.lua b/modules/changer.lua index 4455090..2e977ad 100644 --- a/modules/changer.lua +++ b/modules/changer.lua @@ -15,6 +15,8 @@ changer.changers = {} - not - bool - value + - min, max as separate params + --]]-- @@ -37,9 +39,9 @@ end -- read zone -- function changer.createChangerWithZone(theZone) - theZone.triggerChangerFlag = cfxZones.getStringFromZoneProperty(theZone, "change?", "*") --- if theZone.triggerChangerFlag then - theZone.lastTriggerChangeValue = cfxZones.getFlagValue(theZone.triggerChangerFlag, theZone) + theZone.changerInputFlag = cfxZones.getStringFromZoneProperty(theZone, "change?", "*") +-- if theZone.changerInputFlag then + theZone.lastTriggerChangeValue = cfxZones.getFlagValue(theZone.changerInputFlag, theZone) -- end -- triggerChangerMethod @@ -48,7 +50,7 @@ function changer.createChangerWithZone(theZone) theZone.triggerChangerMethod = cfxZones.getStringFromZoneProperty(theZone, "triggerChangeMethod", "change") end - theZone.inEval = cfxZones.getBoolFromZoneProperty(theZone, "inEval", true) -- yes/no to pre-process, default is yes + theZone.inEval = cfxZones.getBoolFromZoneProperty(theZone, "inEval", false) -- yes/no to pre-process, default is no, we read value theZone.changeTo = cfxZones.getStringFromZoneProperty(theZone, "to", "val") -- val, not, bool @@ -89,6 +91,19 @@ function changer.createChangerWithZone(theZone) trigger.action.outText("+++chgr: new changer zone <".. theZone.name ..">", 30) end + if cfxZones.hasProperty(theZone, "min") then + theZone.changeMin = cfxZones.getNumberFromZoneProperty(theZone, "min", 0) + end + if cfxZones.hasProperty(theZone, "max") then + theZone.changeMax = cfxZones.getNumberFromZoneProperty(theZone, "max", 1) + end + + if cfxZones.hasProperty(theZone, "On/Off?") then + theZone.changerOnOff = cfxZones.getStringFromZoneProperty(theZone, "On/Off?", "*", 1) + end + if cfxZones.hasProperty(theZone, "changeOn/Off?") then + theZone.changerOnOff = cfxZones.getStringFromZoneProperty(theZone, "changeOn/Off?", "*", 1) + end end -- @@ -96,7 +111,7 @@ end -- function changer.process(theZone) -- read the line - local inVal = cfxZones.getFlagValue(theZone.triggerChangerFlag, theZone) + local inVal = cfxZones.getFlagValue(theZone.changerInputFlag, theZone) currVal = inVal if theZone.inEval then currVal = cfxZones.evalFlagMethodImmediate(currVal, theZone.triggerChangerMethod, theZone) @@ -111,15 +126,42 @@ function changer.process(theZone) -- process and write outflag if op == "bool" then if currVal == 0 then res = 0 else res = 1 end - elseif op == "not" then - if currVal == 0 then res = 1 else res = 0 end + elseif op == "val" or op == "direct" then -- do nothing + + elseif op == "not" then + if currVal == 0 then res = 1 else res = 0 end + + elseif op == "sign" or op == "sgn" then + if currVal < 0 then res = -1 else res = 1 end + + elseif op == "inv" or op == "invert" or op == "neg" or op == "negative" then + res = -res + + elseif op == "abs" then + res = math.abs(res) + else - trigger.action.outText("+++chgr: unsupported changeTo operation <" .. .. "> in zone <" .. .. ">, using 'val'", 30) + trigger.action.outText("+++chgr: unsupported changeTo operation <" .. op .. "> in zone <" .. theZone.name .. ">, using 'val' instead", 30) end -- illegal ops drop through after warning, functioning as 'val' + -- min / max handling + if theZone.changeMin then + if theZone.verbose then + trigger.action.outText("+++chgr: applying min " .. theZone.changeMin .. " to curr val: " .. res, 30) + end + if res < theZone.changeMin then res = theZone.changeMin end + end + + if theZone.changeMax then + if theZone.verbose then + trigger.action.outText("+++chgr: applying max " .. theZone.changeMax .. " to curr val: " .. res, 30) + end + if res > theZone.changeMax then res = theZone.changeMax end + end + -- write out cfxZones.setFlagValueMult(theZone.changeOut, res, theZone) if changer.verbose or theZone.verbose then @@ -143,23 +185,29 @@ function changer.update() -- process the pause/unpause flags -- see if we should suspend - if cfxZones.testZoneFlag(theZone, theZone.changerOn, "change", "lastChangerOnValue") then - if changer.verbose or theZone.verbose then - trigger.action.outText("+++chgr: enabling " .. theZone.name, 30) + if cfxZones.testZoneFlag(aZone, aZone.changerOn, "change", "lastChangerOnValue") then + if changer.verbose or aZone.verbose then + trigger.action.outText("+++chgr: enabling " .. aZone.name, 30) end - theZone.changerPaused = false + aZone.changerPaused = false end - if cfxZones.testZoneFlag(theZone, theZone.changerOff, "change", "lastChangerOffValue") then - if changer.verbose or theZone.verbose then - trigger.action.outText("+++chgr: DISabling " .. theZone.name, 30) + if cfxZones.testZoneFlag(aZone, aZone.changerOff, "change", "lastChangerOffValue") then + if changer.verbose or aZone.verbose then + trigger.action.outText("+++chgr: DISabling " .. aZone.name, 30) end - theZone.changerPaused = true + aZone.changerPaused = true end -- do processing if not paused - if not aZone.changerPaused then - changer.process(aZone) + if not aZone.changerPaused then + if aZone.changerOnOff then + if cfxZones.getFlagValue(aZone.changerOnOff, aZone) > 0 then + changer.process(aZone) + end + else + changer.process(aZone) + end end end end @@ -222,6 +270,5 @@ end --[[-- Possible expansions - rnd - - min, max minmax 2,3, cap to left right values, --]]-- \ No newline at end of file diff --git a/modules/cloneZone.lua b/modules/cloneZone.lua index 48ff736..492d924 100644 --- a/modules/cloneZone.lua +++ b/modules/cloneZone.lua @@ -1,5 +1,5 @@ cloneZones = {} - cloneZones.version = "1.4.5" + cloneZones.version = "1.4.6" cloneZones.verbose = false cloneZones.requiredLibs = { "dcsCommon", -- always @@ -44,6 +44,7 @@ 1.4.4 - removed some debugging verbosity 1.4.5 - randomizeLoc, rndLoc keyword - cargo manager integration - pass cargo objects when present + 1.4.6 - removed some verbosity for spawned aircraft with airfields on their routes --]]-- @@ -340,28 +341,28 @@ -- adjust for closest location local firstPoint = thePoints[1] if firstPoint.airdromeId then - trigger.action.outText("first: airdrome adjust for " .. theData.name .. " now is " .. firstPoint.airdromeId, 30) +-- trigger.action.outText("first: airdrome adjust for " .. theData.name .. " now is " .. firstPoint.airdromeId, 30) local loc = {} loc.x = firstPoint.x loc.y = 0 loc.z = firstPoint.y local bestAirbase = dcsCommon.getClosestAirbaseTo(loc) firstPoint.airdromeId = bestAirbase:getID() - trigger.action.outText("first: adjusted to " .. firstPoint.airdromeId, 30) +-- trigger.action.outText("first: adjusted to " .. firstPoint.airdromeId, 30) end -- adjust last point (landing) if #thePoints > 1 then local lastPoint = thePoints[#thePoints] if firstPoint.airdromeId then - trigger.action.outText("last: airdrome adjust for " .. theData.name .. " now is " .. lastPoint.airdromeId, 30) +-- trigger.action.outText("last: airdrome adjust for " .. theData.name .. " now is " .. lastPoint.airdromeId, 30) local loc = {} loc.x = lastPoint.x loc.y = 0 loc.z = lastPoint.y local bestAirbase = dcsCommon.getClosestAirbaseTo(loc) lastPoint.airdromeId = bestAirbase:getID() - trigger.action.outText("last: adjusted to " .. lastPoint.airdromeId, 30) +-- trigger.action.outText("last: adjusted to " .. lastPoint.airdromeId, 30) end end diff --git a/modules/unitZone.lua b/modules/unitZone.lua index 2baabd1..3de7b2e 100644 --- a/modules/unitZone.lua +++ b/modules/unitZone.lua @@ -1,5 +1,5 @@ unitZone={} -unitZone.version = "1.2.1" +unitZone.version = "1.2.2" unitZone.verbose = false unitZone.ups = 1 unitZone.requiredLibs = { @@ -13,6 +13,7 @@ unitZone.requiredLibs = { - method/uzMethod 1.2.0 - uzOn?, uzOff?, triggerMethod 1.2.1 - uzDirect + 1.2.2 - uzDirectInv --]]-- @@ -101,6 +102,9 @@ function unitZone.createUnitZone(theZone) if cfxZones.hasProperty(theZone, "uzDirect") then theZone.uzDirect = cfxZones.getStringFromZoneProperty(theZone, "uzDirect", "*") end + if cfxZones.hasProperty(theZone, "uzDirectInv") then + theZone.uzDirectInv = cfxZones.getStringFromZoneProperty(theZone, "uzDirectInv", "*") + end -- on/off flags theZone.uzPaused = false -- we are turned on @@ -267,7 +271,7 @@ function unitZone.update() aZone.lastStatus = newState end - -- output direct state + -- output direct state suite if aZone.uzDirect then if newState then cfxZones.setFlagValueMult(aZone.uzDirect, 1, aZone) @@ -275,6 +279,13 @@ function unitZone.update() cfxZones.setFlagValueMult(aZone.uzDirect, 0, aZone) end end + if aZone.uzDirectInv then + if newState then + cfxZones.setFlagValueMult(aZone.uzDirectInv, 0, aZone) + else + cfxZones.setFlagValueMult(aZone.uzDirectInv, 1, aZone) + end + end end end end diff --git a/tutorial & demo missions/demo - Gate and Switch.miz b/tutorial & demo missions/demo - Gate and Switch.miz new file mode 100644 index 0000000..762a8e3 Binary files /dev/null and b/tutorial & demo missions/demo - Gate and Switch.miz differ