-
Notifications
You must be signed in to change notification settings - Fork 1
/
scheduler.lua
88 lines (70 loc) · 2.08 KB
/
scheduler.lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
local Object = require "object"
local Scheduler = Object:extend()
function Scheduler:__new()
self.queue = {}
self.actCount = 0
end
function Scheduler:add(actor, time, lastAct)
local schedTable = {}
schedTable.actor = actor
schedTable.time = 0 or time
schedTable.lastAct = 0 or lastAct
table.insert(self.queue, schedTable)
end
function Scheduler:remove(actor)
for i, schedTable in ipairs(self.queue) do
if schedTable.actor == actor then
table.remove(self.queue, i)
return
end
end
end
function Scheduler:has(actor)
for i, schedTable in ipairs(self.queue) do
if schedTable.actor == actor then
return true
end
end
end
function Scheduler:addTime(actor, time)
for i, schedTable in ipairs(self.queue) do
if schedTable.actor == actor then
schedTable.time = schedTable.time + time
return
end
end
error "Attempted to add time to an actor not in the scheduler!"
end
local function sortFunction(a, b)
-- handling ties in a consistent way is important to us
-- if two actors are tied the one who acted most recently goes second
if a.time == b.time then
return a.lastAct < b.lastAct
end
return a.time < b.time
end
function Scheduler:next()
-- we sort our queue so that those with the least time left to act
-- end up on top
table.sort(self.queue, sortFunction)
-- next we increment our actCount which is essentially used as a timestamp
-- to consistently break ties
self.actCount = self.actCount + 1
-- update this actor's lastAct so that we know when he last acted for tie breaking
self.queue[1].lastAct = self.actCount
-- and finally before we return we make a call to updateTime which will
-- lower all of the actor's time by the amount of the one who's taking it's turn
self:updateTime(self.queue[1].time)
--self:debugPrint()
return self.queue[1].actor
end
function Scheduler:debugPrint()
for i, schedTable in ipairs(self.queue) do
end
end
function Scheduler:updateTime(time)
for i, schedTable in ipairs(self.queue) do
schedTable.time = schedTable.time - time
end
end
return Scheduler