In world/New() use global.AddLoop(id,time) to add in a loop.
Use LoopAdd(id) on a atom/movable to add it to a loop.
Use LoopRemove(id) on a atom/movable to remove it to a loop.
Override updateLoop() as needed.
#define UPDATE_LOOP_SLEEP world.tick_lag
var/list/updateLoop[] = new
world
New()
..()
for()
sleep(UPDATE_LOOP_SLEEP)
for(var/loop in global.updateLoop)
var/UPDATE_LOOP/Loop = global.updateLoop[loop]
Loop.updateLoop()
proc/AddLoop(id,time)
global.updateLoop[id] = new/UPDATE_LOOP(time,id)
UPDATE_LOOP
var
list
updateLoop = list()
max_tick = 0
tick = 0
id = ""
proc/updateLoop()
if(!--tick)
tick = max_tick
for(var/object in src.updateLoop)
object:updateLoop(id)
New(time,ID){id = ID; max_tick = time; tick = max_tick}
atom/movable/proc
updateLoop(id)
LoopAdd(id)
var/UPDATE_LOOP/Loop = global.updateLoop[id]
if(Loop)Loop.updateLoop |= src
LoopRemove(id)
var/UPDATE_LOOP/Loop = global.updateLoop[id]
if(Loop)Loop.updateLoop -= src