hello-lvera.lua
· 4.7 KiB · Lua
Неформатований
Playground
local min, max, huge = math.min, math.max, math.huge
local machine = {state = {}}
machine.counters = {
["run main loop"] = 1,
["show message"] = 0,
["@step timer"] = 0,
["present current frame"] = 0,
["sleep for 1ms"] = 0,
["run current frame"] = 0,
["@clear screen"] = 0,
["@exit code"] = 0,
["@present"] = 0,
["@sleep"] = 0,
["@ms"] = 0,
["@print hello from vera"] = 0,
["@poll inputs"] = 0,
["next cycle"] = 0,
["poll inputs"] = 0,
["@quit love"] = 0,
["@quit"] = 0,
["step timer"] = 0,
["clear the screen"] = 0,
}
machine.state = {
}
function machine:on_poll_inputs(counters)
end
function machine:on_quit_love(counters)
end
function machine:on_step_timer(counters)
end
function machine:on_clear_screen(counters)
end
function machine:on_present(counters)
end
function machine:on_sleep(counters, sleep)
end
function machine:on_hello_from_vera(counters)
end
function match(self, counters)
if counters["@poll inputs"] > 0 then
self:on_poll_inputs(counters)
counters["@poll inputs"] = 0
return true
end
if counters["@quit love"] > 0 then
counters["@exit code"] = 0
self:on_quit_love(counters)
counters["@quit love"] = 0
return true
end
if counters["@step timer"] > 0 then
self:on_step_timer(counters)
counters["@step timer"] = 0
return true
end
if counters["@clear screen"] > 0 then
self:on_clear_screen(counters)
counters["@clear screen"] = 0
return true
end
if counters["@present"] > 0 then
self:on_present(counters)
counters["@present"] = 0
return true
end
if counters["@sleep"] > 0 then
self:on_sleep(counters, counters["@sleep"])
counters["@sleep"] = 0
counters["@sleep"] = 0
return true
end
if counters["@print hello from vera"] > 0 then
self:on_hello_from_vera(counters)
counters["@print hello from vera"] = 0
return true
end
if counters["run main loop"] > 0 then
local acc = counters["run main loop"]
counters["run main loop"] = max(counters["run main loop"] - acc, 0)
counters["poll inputs"] = counters["poll inputs"] + acc * 1
counters["run current frame"] = counters["run current frame"] + acc * 1
return true
end
if counters["poll inputs"] > 0 then
local acc = counters["poll inputs"]
counters["poll inputs"] = max(counters["poll inputs"] - acc, 0)
counters["@poll inputs"] = counters["@poll inputs"] + acc * 1
return true
end
if counters["run current frame"] > 0 and counters["@quit"] > 0 then
local acc = huge
acc = min(acc, counters["run current frame"])
acc = min(acc, counters["@quit"])
counters["run current frame"] = max(counters["run current frame"] - acc, 0)
counters["@quit"] = max(counters["@quit"] - acc, 0)
counters["@quit love"] = counters["@quit love"] + acc * 1
return true
end
if counters["run current frame"] > 0 then
local acc = counters["run current frame"]
counters["run current frame"] = max(counters["run current frame"] - acc, 0)
counters["show message"] = counters["show message"] + acc * 1
counters["present current frame"] = counters["present current frame"] + acc * 1
counters["sleep for 1ms"] = counters["sleep for 1ms"] + acc * 1
counters["next cycle"] = counters["next cycle"] + acc * 1
counters["step timer"] = counters["step timer"] + acc * 1
counters["clear the screen"] = counters["clear the screen"] + acc * 1
return true
end
if counters["step timer"] > 0 then
local acc = counters["step timer"]
counters["step timer"] = max(counters["step timer"] - acc, 0)
counters["@step timer"] = counters["@step timer"] + acc * 1
return true
end
if counters["clear the screen"] > 0 then
local acc = counters["clear the screen"]
counters["clear the screen"] = max(counters["clear the screen"] - acc, 0)
counters["@clear screen"] = counters["@clear screen"] + acc * 1
return true
end
if counters["show message"] > 0 then
local acc = counters["show message"]
counters["show message"] = max(counters["show message"] - acc, 0)
counters["@print hello from vera"] = counters["@print hello from vera"] + acc * 1
return true
end
if counters["present current frame"] > 0 then
local acc = counters["present current frame"]
counters["present current frame"] = max(counters["present current frame"] - acc, 0)
counters["@present"] = counters["@present"] + acc * 1
return true
end
if counters["sleep for 1ms"] > 0 then
local acc = counters["sleep for 1ms"]
counters["sleep for 1ms"] = max(counters["sleep for 1ms"] - acc, 0)
counters["@ms"] = counters["@ms"] + acc * 1
return true
end
if counters["next cycle"] > 0 then
local acc = counters["next cycle"]
counters["next cycle"] = max(counters["next cycle"] - acc, 0)
counters["run main loop"] = counters["run main loop"] + acc * 1
return true
end
return false
end
function machine:run()
local counters = self.counters
while match(self, counters) do end
end
return machine
1 | local min, max, huge = math.min, math.max, math.huge |
2 | local machine = {state = {}} |
3 | |
4 | machine.counters = { |
5 | ["run main loop"] = 1, |
6 | ["show message"] = 0, |
7 | ["@step timer"] = 0, |
8 | ["present current frame"] = 0, |
9 | ["sleep for 1ms"] = 0, |
10 | ["run current frame"] = 0, |
11 | ["@clear screen"] = 0, |
12 | ["@exit code"] = 0, |
13 | ["@present"] = 0, |
14 | ["@sleep"] = 0, |
15 | ["@ms"] = 0, |
16 | ["@print hello from vera"] = 0, |
17 | ["@poll inputs"] = 0, |
18 | ["next cycle"] = 0, |
19 | ["poll inputs"] = 0, |
20 | ["@quit love"] = 0, |
21 | ["@quit"] = 0, |
22 | ["step timer"] = 0, |
23 | ["clear the screen"] = 0, |
24 | } |
25 | |
26 | machine.state = { |
27 | } |
28 | |
29 | function machine:on_poll_inputs(counters) |
30 | end |
31 | |
32 | function machine:on_quit_love(counters) |
33 | end |
34 | |
35 | function machine:on_step_timer(counters) |
36 | end |
37 | |
38 | function machine:on_clear_screen(counters) |
39 | end |
40 | |
41 | function machine:on_present(counters) |
42 | end |
43 | |
44 | function machine:on_sleep(counters, sleep) |
45 | end |
46 | |
47 | function machine:on_hello_from_vera(counters) |
48 | end |
49 | |
50 | function match(self, counters) |
51 | if counters["@poll inputs"] > 0 then |
52 | self:on_poll_inputs(counters) |
53 | counters["@poll inputs"] = 0 |
54 | return true |
55 | end |
56 | if counters["@quit love"] > 0 then |
57 | counters["@exit code"] = 0 |
58 | self:on_quit_love(counters) |
59 | counters["@quit love"] = 0 |
60 | return true |
61 | end |
62 | if counters["@step timer"] > 0 then |
63 | self:on_step_timer(counters) |
64 | counters["@step timer"] = 0 |
65 | return true |
66 | end |
67 | if counters["@clear screen"] > 0 then |
68 | self:on_clear_screen(counters) |
69 | counters["@clear screen"] = 0 |
70 | return true |
71 | end |
72 | if counters["@present"] > 0 then |
73 | self:on_present(counters) |
74 | counters["@present"] = 0 |
75 | return true |
76 | end |
77 | if counters["@sleep"] > 0 then |
78 | self:on_sleep(counters, counters["@sleep"]) |
79 | counters["@sleep"] = 0 |
80 | counters["@sleep"] = 0 |
81 | return true |
82 | end |
83 | if counters["@print hello from vera"] > 0 then |
84 | self:on_hello_from_vera(counters) |
85 | counters["@print hello from vera"] = 0 |
86 | return true |
87 | end |
88 | if counters["run main loop"] > 0 then |
89 | local acc = counters["run main loop"] |
90 | counters["run main loop"] = max(counters["run main loop"] - acc, 0) |
91 | counters["poll inputs"] = counters["poll inputs"] + acc * 1 |
92 | counters["run current frame"] = counters["run current frame"] + acc * 1 |
93 | return true |
94 | end |
95 | if counters["poll inputs"] > 0 then |
96 | local acc = counters["poll inputs"] |
97 | counters["poll inputs"] = max(counters["poll inputs"] - acc, 0) |
98 | counters["@poll inputs"] = counters["@poll inputs"] + acc * 1 |
99 | return true |
100 | end |
101 | if counters["run current frame"] > 0 and counters["@quit"] > 0 then |
102 | local acc = huge |
103 | acc = min(acc, counters["run current frame"]) |
104 | acc = min(acc, counters["@quit"]) |
105 | counters["run current frame"] = max(counters["run current frame"] - acc, 0) |
106 | counters["@quit"] = max(counters["@quit"] - acc, 0) |
107 | counters["@quit love"] = counters["@quit love"] + acc * 1 |
108 | return true |
109 | end |
110 | if counters["run current frame"] > 0 then |
111 | local acc = counters["run current frame"] |
112 | counters["run current frame"] = max(counters["run current frame"] - acc, 0) |
113 | counters["show message"] = counters["show message"] + acc * 1 |
114 | counters["present current frame"] = counters["present current frame"] + acc * 1 |
115 | counters["sleep for 1ms"] = counters["sleep for 1ms"] + acc * 1 |
116 | counters["next cycle"] = counters["next cycle"] + acc * 1 |
117 | counters["step timer"] = counters["step timer"] + acc * 1 |
118 | counters["clear the screen"] = counters["clear the screen"] + acc * 1 |
119 | return true |
120 | end |
121 | if counters["step timer"] > 0 then |
122 | local acc = counters["step timer"] |
123 | counters["step timer"] = max(counters["step timer"] - acc, 0) |
124 | counters["@step timer"] = counters["@step timer"] + acc * 1 |
125 | return true |
126 | end |
127 | if counters["clear the screen"] > 0 then |
128 | local acc = counters["clear the screen"] |
129 | counters["clear the screen"] = max(counters["clear the screen"] - acc, 0) |
130 | counters["@clear screen"] = counters["@clear screen"] + acc * 1 |
131 | return true |
132 | end |
133 | if counters["show message"] > 0 then |
134 | local acc = counters["show message"] |
135 | counters["show message"] = max(counters["show message"] - acc, 0) |
136 | counters["@print hello from vera"] = counters["@print hello from vera"] + acc * 1 |
137 | return true |
138 | end |
139 | if counters["present current frame"] > 0 then |
140 | local acc = counters["present current frame"] |
141 | counters["present current frame"] = max(counters["present current frame"] - acc, 0) |
142 | counters["@present"] = counters["@present"] + acc * 1 |
143 | return true |
144 | end |
145 | if counters["sleep for 1ms"] > 0 then |
146 | local acc = counters["sleep for 1ms"] |
147 | counters["sleep for 1ms"] = max(counters["sleep for 1ms"] - acc, 0) |
148 | counters["@ms"] = counters["@ms"] + acc * 1 |
149 | return true |
150 | end |
151 | if counters["next cycle"] > 0 then |
152 | local acc = counters["next cycle"] |
153 | counters["next cycle"] = max(counters["next cycle"] - acc, 0) |
154 | counters["run main loop"] = counters["run main loop"] + acc * 1 |
155 | return true |
156 | end |
157 | return false |
158 | end |
159 | |
160 | function machine:run() |
161 | local counters = self.counters |
162 | while match(self, counters) do end |
163 | end |
164 | |
165 | return machine |