diff --git a/Aircraft/Generic/aar.nas b/Aircraft/Generic/aar.nas index a2e09c748..b528cc75f 100644 --- a/Aircraft/Generic/aar.nas +++ b/Aircraft/Generic/aar.nas @@ -9,9 +9,7 @@ # + fuel-consumed-lbs - Output from the FDM, zeroed by this script # + out-of-fuel - boolean, set by this code. - var UPDATE_PERIOD = 0.3; - var enabled = nil; var serviceable = nil; var fuel_freeze = nil; @@ -176,9 +174,11 @@ var update_loop = func { foreach (var e; engines) e.getNode("out-of-fuel", 1).setBoolValue(out_of_fuel); - settimer(update_loop, UPDATE_PERIOD); + aarTimer.restart(UPDATE_PERIOD); } +var aarTimer = maketimer(UPDATE_PERIOD, update_loop); +aarTimer.simulatedTime = 1; setlistener("/sim/signals/fdm-initialized", func { @@ -213,7 +213,7 @@ setlistener("/sim/signals/fdm-initialized", func { setlistener("sim/freeze/fuel", func(n) fuel_freeze = n.getBoolValue(), 1); setlistener("sim/ai/enabled", func(n) ai_enabled = n.getBoolValue(), 1); setlistener("systems/refuel/serviceable", func(n) serviceable = n.getBoolValue(), 1); - update_loop(); + aarTimer.restart(UPDATE_PERIOD); }); diff --git a/Aircraft/ufo/cam.nas b/Aircraft/ufo/cam.nas index 19e35c7bb..18a7314f7 100644 --- a/Aircraft/ufo/cam.nas +++ b/Aircraft/ufo/cam.nas @@ -182,8 +182,6 @@ if (0) { var loop = func { if (view_number == cam_view and targetN != nil) update(); - - settimer(loop, 0); } @@ -301,6 +299,8 @@ setlistener("/sim/cam/lock", func(n) { }); } +camTimer = maketimer(0, loop); +camTimer.simulatedTime = 1; setlistener("/sim/signals/fdm-initialized", func { var views = props.globals.getNode("/sim").getChildren("view"); @@ -311,7 +311,7 @@ setlistener("/sim/signals/fdm-initialized", func { setprop("/sim/current-view/view-number", cam_view); setprop("/engines/engine/speed-max-mps", 500); update_aircraft(); - loop(); + camTimer.start(); }); diff --git a/Nasal/contrail.nas b/Nasal/contrail.nas index 2673deb1e..fbdae873e 100644 --- a/Nasal/contrail.nas +++ b/Nasal/contrail.nas @@ -20,11 +20,11 @@ updateContrail = func{ } else { contrail_Node.setValue(0); } - - settimer(updateContrail,30) } ### Contrail +contrailTimer = maketimer(30, updateContrail); +contrailTimer.simulatedTime = 1; _setlistener("/sim/signals/nasal-dir-initialized", func { printlog ("debug", "init contrail"); @@ -35,5 +35,5 @@ _setlistener("/sim/signals/nasal-dir-initialized", func { var static_contrail_node = props.globals.getNode("sim/ai/aircraft/contrail", 1); var time_node = props.globals.getNode("sim/time/elapsed-sec", 1); - updateContrail(); + contrailTimer.restart(30); }); diff --git a/Nasal/seaport.nas b/Nasal/seaport.nas index 81786fd55..9b5aa14e3 100644 --- a/Nasal/seaport.nas +++ b/Nasal/seaport.nas @@ -1,13 +1,18 @@ -_setlistener("/sim/signals/nasal-dir-initialized", func { - _setlistener("/sim/presets/latitude-deg", func { - printlog("info", "*** NEW LOCATION ***"); - settimer(func { +seaportLoop = func { var typ = getprop("/sim/type"); var lat = getprop("/position/latitude-deg"); var lon = getprop("/position/longitude-deg"); var g = geodinfo(lat, lon); if ((g != nil and g[1] != nil and g[1].solid) and (typ == "seaplane") ) fgcommand("dialog-show", props.Node.new({ "dialog-name": "seaport" })); - }, 8); + }; +seaportTimer = maketimer(8, seaportLoop); +seaportTimer.simulatedTime = 1; + +_setlistener("/sim/signals/nasal-dir-initialized", func { + _setlistener("/sim/presets/latitude-deg", func { + printlog("info", "*** NEW LOCATION ***"); + seaportTimer.restart(8); + }, 1); }); diff --git a/Nasal/wildfire.nas b/Nasal/wildfire.nas index 8ab105db1..43ff94697 100644 --- a/Nasal/wildfire.nas +++ b/Nasal/wildfire.nas @@ -22,6 +22,7 @@ var SAVEDIR = getprop("/sim/fg-home") ~ "/Wildfire/"; # Maximum number of ignite events a single user can send per second. var MAX_IGNITE_RATE = 0.25; +var wildfireScoreReportTimer = nil; ############################################################################### ## External API @@ -164,7 +165,6 @@ var score_report_loop = func { old_score.protected = score.protected; old_score.waste = score.waste; } - settimer(score_report_loop, CAFire.GENERATION_DURATION); } ############################################################################### @@ -439,7 +439,6 @@ CAFireModels.MODEL = { # Model paths CAFireModels.grid = {}; # Sparse cell model grid storage. CAFireModels.pending = []; # List of pending model changes. CAFireModels.models_enabled = 1; -CAFireModels.loopid = 0; ###################################################################### # Public operations ############################################################ @@ -470,14 +469,13 @@ CAFireModels.reset = func (enabled) { ############################################################ # Start the CA model grid. CAFireModels.start = func { - me.loopid += 1; - me._loop_(me.loopid); + me.timer.restart(0.033); # 30hz should be fast enough. } ############################################################ # Stop the CA model grid. # Note that it will catch up lost time when started again. CAFireModels.stop = func { - me.loopid += 1; + me.timer.stop(); } ############################################################ # Add a new cell model. @@ -516,12 +514,6 @@ CAFireModels.update = func { } } } -############################################################ -CAFireModels._loop_ = func(id) { - id == me.loopid or return; - me.update(); - settimer(func { me._loop_(id); }, 0); -} ############################################################################### ############################################################################### @@ -543,7 +535,6 @@ CAFire.cells_burning = 0; CAFire.pass = 0; # Update pass within the current full update. CAFire.pass_work = 0; # Cells to update in each pass. CAFire.remaining_work = []; # Work remaining in this full update. -CAFire.loopid = 0; CAFire.event_log = []; # List of all events that has occured so far. CAFire.load_count = 0; CAFire.BURN_RATE = { # Burn rate DB. grid widths per second @@ -580,6 +571,8 @@ CAFire.NEIGHBOURS = # Neighbour index offsets. First row and column ############################################################ CAFire.init = func { # Initialization. + CAFireModels.timer = maketimer(0.03, me, me.loop); + CAFireModels.timer.simulatedTime = 1; me.reset(1, SimTime.current_time()); } ############################################################ @@ -612,15 +605,12 @@ CAFire.reset = func (enabled, sim_time) { CAFire.start = func { CAFireModels.start(); broadcast.start(); - me.loopid += 1; - me._loop_(me.loopid); } ############################################################ # Stop the CA. Note that it will catch up lost time when started again. CAFire.stop = func { CAFireModels.stop(); broadcast.stop(); - me.loopid += 1; } ############################################################ # Start a fire in the cell at pos. @@ -931,12 +921,12 @@ CAFire.update = func { } } ############################################################ -CAFire._loop_ = func(id) { - id == me.loopid or return; +CAFire.loop = func { me.update(); - settimer(func { me._loop_(id); }, - me.GENERATION_DURATION * (me.generation + 1/me.PASSES) - - SimTime.current_time()); + CAFireModels.timer.restart(me.GENERATION_DURATION + * (me.generation + 1/me.PASSES) + - SimTime.current_time() + ); } ############################################################################### @@ -973,7 +963,11 @@ _setlistener("/sim/signals/nasal-dir-initialized", func { CAFire.init(); # Start the score reporting. - settimer(score_report_loop, CAFire.GENERATION_DURATION); + if (wildfireScoreReportTimer == nil){ + wildfireScoreReportTimer = maketimer(CAFire.GENERATION_DURATION, score_report_loop); + wildfireScoreReportTimer.simulatedTime = 1; + wildfireScoreReportTimer.start(); + } setlistener("/sim/signals/exit", func { if (getprop(report_score_pp) and (CAFire.cells_created > 0)) diff --git a/Nasal/windsock.nas b/Nasal/windsock.nas index 2f4448563..8d019ffd6 100644 --- a/Nasal/windsock.nas +++ b/Nasal/windsock.nas @@ -22,7 +22,7 @@ var windsock = func { interpolate("/environment/windsock/wind-speed-12.5kt", total, 0.1); dt += 0.08 + 0.02*(math.sin(dt)+math.cos(dt/(mag2+0.01))*0.33); - settimer(windsock, 0.25); } - -windsock(); +windsockTimer = maketimer(0.25, windsock); +windsockTimer.simulatedTime = 1; +windsockTimer.start();