最后活跃于 1733295369

修订 013d5d75d0a1ef37a4c474372d6aed7d67a80b93

generated-text-input.lua 原始文件 Playground
1local min, max, huge = math.min, math.max, math.huge
2local machine = {}
3
4machine.counters = {
5 ["run current frame"] = 0,
6 ["step timer"] = 0,
7 ["clear the screen"] = 0,
8 ["draw scene"] = 0,
9 ["present current frame"] = 0,
10 ["sleep for 1ms"] = 0,
11 ["next cycle"] = 0,
12 ["run main loop"] = 1,
13 ["@poll inputs"] = 0,
14 ["@quit love"] = 0,
15 ["@step timer"] = 0,
16 ["@clear screen"] = 0,
17 ["@text input"] = 0,
18 ["@text received"] = 0,
19 ["@quit"] = 0,
20 ["@push text"] = 0,
21 ["@draw buffer"] = 0,
22 ["@present"] = 0,
23 ["@is backspace pressed"] = 0,
24 ["@backspace was pressed"] = 0,
25 ["@delete character"] = 0,
26 ["@is new line pressed"] = 0,
27 ["@new line was pressed"] = 0,
28 ["@insert new line"] = 0,
29 ["handling inputs"] = 0,
30 ["handle text input"] = 0,
31 ["@exit code"] = 0,
32 ["handle return or enter"] = 0,
33 ["check for text input event"] = 0,
34 ["push text to buffer"] = 0,
35 ["check for backspace"] = 0,
36 ["delete character from buffer"] = 0,
37 ["check for new line"] = 0,
38 ["insert new line"] = 0,
39 ["@sleep"] = 0,
40 ["drawing scene"] = 0,
41 ["draw buffer"] = 0,
42 ["handle backspace"] = 0,
43 ["poll inputs"] = 0,
44 ["handle inputs"] = 0,
45}
46
47function machine.on_poll_inputs(counters)
48end
49
50function machine.on_quit_love(counters)
51end
52
53function machine.on_step_timer(counters)
54end
55
56function machine.on_clear_screen(counters)
57end
58
59function machine.on_present(counters)
60end
61
62function machine.on_sleep(counters, sleep)
63end
64
65function machine.on_text_input(counters)
66end
67
68function machine.on_push_text_to_buffer(counters)
69end
70
71function machine.on_draw_buffer(counters)
72end
73
74function machine.on_is_backspace_pressed(counters)
75end
76
77function machine.on_delete_character(counters)
78end
79
80function machine.on_is_new_line_pressed(counters)
81end
82
83function machine.on_insert_new_line(counters)
84end
85
86function match(self, counters)
87 if counters["@poll inputs"] > 0 then
88 self.on_poll_inputs(counters)
89 counters["@poll inputs"] = 0
90 return true
91 end
92 if counters["@quit love"] > 0 then
93 counters["@exit code"] = self.on_quit_love(counters)
94 counters["@quit love"] = 0
95 return true
96 end
97 if counters["@step timer"] > 0 then
98 self.on_step_timer(counters)
99 counters["@step timer"] = 0
100 return true
101 end
102 if counters["@clear screen"] > 0 then
103 self.on_clear_screen(counters)
104 counters["@clear screen"] = 0
105 return true
106 end
107 if counters["@present"] > 0 then
108 self.on_present(counters)
109 counters["@present"] = 0
110 return true
111 end
112 if counters["@sleep"] > 0 then
113 self.on_sleep(counters, counters["@sleep"])
114 counters["@sleep"] = 0
115 return true
116 end
117 if counters["@text input"] > 0 then
118 counters["@text received"] = self.on_text_input(counters)
119 counters["@text input"] = 0
120 return true
121 end
122 if counters["@push text"] > 0 then
123 self.on_push_text_to_buffer(counters)
124 counters["@push text"] = 0
125 return true
126 end
127 if counters["@draw buffer"] > 0 then
128 self.on_draw_buffer(counters)
129 counters["@draw buffer"] = 0
130 return true
131 end
132 if counters["@is backspace pressed"] > 0 then
133 counters["@backspace was pressed"] = self.on_is_backspace_pressed(counters)
134 counters["@is backspace pressed"] = 0
135 return true
136 end
137 if counters["@delete character"] > 0 then
138 self.on_delete_character(counters)
139 counters["@delete character"] = 0
140 return true
141 end
142 if counters["@is new line pressed"] > 0 then
143 counters["@new line was pressed"] = self.on_is_new_line_pressed(counters)
144 counters["@is new line pressed"] = 0
145 return true
146 end
147 if counters["@insert new line"] > 0 then
148 self.on_insert_new_line(counters)
149 counters["@insert new line"] = 0
150 return true
151 end
152 if counters["handling inputs"] > 0 then
153 acc = counters["handling inputs"]
154 counters["handling inputs"] = max(counters["handling inputs"] - acc, 0)
155 counters["handle text input"] = counters["handle text input"] + acc * 1
156 counters["handle backspace"] = counters["handle backspace"] + acc * 1
157 counters["handle return or enter"] = counters["handle return or enter"] + acc * 1
158 return true
159 end
160 if counters["handle text input"] > 0 then
161 acc = counters["handle text input"]
162 counters["handle text input"] = max(counters["handle text input"] - acc, 0)
163 counters["check for text input event"] = counters["check for text input event"] + acc * 1
164 counters["push text to buffer"] = counters["push text to buffer"] + acc * 1
165 return true
166 end
167 if counters["check for text input event"] > 0 then
168 acc = counters["check for text input event"]
169 counters["check for text input event"] = max(counters["check for text input event"] - acc, 0)
170 counters["@text input"] = counters["@text input"] + acc * 1
171 return true
172 end
173 if counters["push text to buffer"] > 0 and counters["@text received"] > 0 then
174 local acc = huge
175 acc = min(acc, counters["@text received"])
176 acc = min(acc, counters["push text to buffer"])
177 counters["push text to buffer"] = max(counters["push text to buffer"] - acc, 0)
178 counters["@text received"] = max(counters["@text received"] - acc, 0)
179 counters["@push text"] = counters["@push text"] + acc * 1
180 counters["handle text input"] = counters["handle text input"] + acc * 1
181 return true
182 end
183 if counters["push text to buffer"] > 0 then
184 acc = counters["push text to buffer"]
185 counters["push text to buffer"] = max(counters["push text to buffer"] - acc, 0)
186 return true
187 end
188 if counters["handle backspace"] > 0 then
189 acc = counters["handle backspace"]
190 counters["handle backspace"] = max(counters["handle backspace"] - acc, 0)
191 counters["check for backspace"] = counters["check for backspace"] + acc * 1
192 counters["delete character from buffer"] = counters["delete character from buffer"] + acc * 1
193 return true
194 end
195 if counters["check for backspace"] > 0 then
196 acc = counters["check for backspace"]
197 counters["check for backspace"] = max(counters["check for backspace"] - acc, 0)
198 counters["@is backspace pressed"] = counters["@is backspace pressed"] + acc * 1
199 return true
200 end
201 if counters["delete character from buffer"] > 0 and counters["@backspace was pressed"] > 0 then
202 local acc = huge
203 acc = min(acc, counters["@backspace was pressed"])
204 acc = min(acc, counters["delete character from buffer"])
205 counters["delete character from buffer"] = max(counters["delete character from buffer"] - acc, 0)
206 counters["@backspace was pressed"] = max(counters["@backspace was pressed"] - acc, 0)
207 counters["@delete character"] = counters["@delete character"] + acc * 1
208 return true
209 end
210 if counters["delete character from buffer"] > 0 then
211 acc = counters["delete character from buffer"]
212 counters["delete character from buffer"] = max(counters["delete character from buffer"] - acc, 0)
213 return true
214 end
215 if counters["handle return or enter"] > 0 then
216 acc = counters["handle return or enter"]
217 counters["handle return or enter"] = max(counters["handle return or enter"] - acc, 0)
218 counters["check for new line"] = counters["check for new line"] + acc * 1
219 counters["insert new line"] = counters["insert new line"] + acc * 1
220 return true
221 end
222 if counters["check for new line"] > 0 then
223 acc = counters["check for new line"]
224 counters["check for new line"] = max(counters["check for new line"] - acc, 0)
225 counters["@is new line pressed"] = counters["@is new line pressed"] + acc * 1
226 return true
227 end
228 if counters["insert new line"] > 0 and counters["@new line was pressed"] > 0 then
229 local acc = huge
230 acc = min(acc, counters["@new line was pressed"])
231 acc = min(acc, counters["insert new line"])
232 counters["insert new line"] = max(counters["insert new line"] - acc, 0)
233 counters["@new line was pressed"] = max(counters["@new line was pressed"] - acc, 0)
234 counters["@insert new line"] = counters["@insert new line"] + acc * 1
235 return true
236 end
237 if counters["insert new line"] > 0 then
238 acc = counters["insert new line"]
239 counters["insert new line"] = max(counters["insert new line"] - acc, 0)
240 return true
241 end
242 if counters["drawing scene"] > 0 then
243 acc = counters["drawing scene"]
244 counters["drawing scene"] = max(counters["drawing scene"] - acc, 0)
245 counters["draw buffer"] = counters["draw buffer"] + acc * 1
246 return true
247 end
248 if counters["draw buffer"] > 0 then
249 acc = counters["draw buffer"]
250 counters["draw buffer"] = max(counters["draw buffer"] - acc, 0)
251 counters["@draw buffer"] = counters["@draw buffer"] + acc * 1
252 return true
253 end
254 if counters["run main loop"] > 0 then
255 acc = counters["run main loop"]
256 counters["run main loop"] = max(counters["run main loop"] - acc, 0)
257 counters["run current frame"] = counters["run current frame"] + acc * 1
258 counters["poll inputs"] = counters["poll inputs"] + acc * 1
259 counters["handle inputs"] = counters["handle inputs"] + acc * 1
260 return true
261 end
262 if counters["poll inputs"] > 0 then
263 acc = counters["poll inputs"]
264 counters["poll inputs"] = max(counters["poll inputs"] - acc, 0)
265 counters["@poll inputs"] = counters["@poll inputs"] + acc * 1
266 return true
267 end
268 if counters["handle inputs"] > 0 then
269 acc = counters["handle inputs"]
270 counters["handle inputs"] = max(counters["handle inputs"] - acc, 0)
271 counters["handling inputs"] = counters["handling inputs"] + acc * 1
272 return true
273 end
274 if counters["run current frame"] > 0 and counters["@quit"] > 0 then
275 local acc = huge
276 acc = min(acc, counters["run current frame"])
277 acc = min(acc, counters["@quit"])
278 counters["run current frame"] = max(counters["run current frame"] - acc, 0)
279 counters["@quit"] = max(counters["@quit"] - acc, 0)
280 counters["@quit love"] = counters["@quit love"] + acc * 1
281 return true
282 end
283 if counters["run current frame"] > 0 then
284 acc = counters["run current frame"]
285 counters["run current frame"] = max(counters["run current frame"] - acc, 0)
286 counters["step timer"] = counters["step timer"] + acc * 1
287 counters["clear the screen"] = counters["clear the screen"] + acc * 1
288 counters["draw scene"] = counters["draw scene"] + acc * 1
289 counters["present current frame"] = counters["present current frame"] + acc * 1
290 counters["sleep for 1ms"] = counters["sleep for 1ms"] + acc * 1
291 counters["next cycle"] = counters["next cycle"] + acc * 1
292 return true
293 end
294 if counters["step timer"] > 0 then
295 acc = counters["step timer"]
296 counters["step timer"] = max(counters["step timer"] - acc, 0)
297 counters["@step timer"] = counters["@step timer"] + acc * 1
298 return true
299 end
300 if counters["clear the screen"] > 0 then
301 acc = counters["clear the screen"]
302 counters["clear the screen"] = max(counters["clear the screen"] - acc, 0)
303 counters["@clear screen"] = counters["@clear screen"] + acc * 1
304 return true
305 end
306 if counters["draw scene"] > 0 then
307 acc = counters["draw scene"]
308 counters["draw scene"] = max(counters["draw scene"] - acc, 0)
309 counters["drawing scene"] = counters["drawing scene"] + acc * 1
310 return true
311 end
312 if counters["present current frame"] > 0 then
313 acc = counters["present current frame"]
314 counters["present current frame"] = max(counters["present current frame"] - acc, 0)
315 counters["@present"] = counters["@present"] + acc * 1
316 return true
317 end
318 if counters["sleep for 1ms"] > 0 then
319 acc = counters["sleep for 1ms"]
320 counters["sleep for 1ms"] = max(counters["sleep for 1ms"] - acc, 0)
321 counters["@sleep"] = counters["@sleep"] + acc * 1
322 return true
323 end
324 if counters["next cycle"] > 0 then
325 acc = counters["next cycle"]
326 counters["next cycle"] = max(counters["next cycle"] - acc, 0)
327 counters["run main loop"] = counters["run main loop"] + acc * 1
328 return true
329 end
330 return false
331end
332
333function machine:run()
334 local counters = self.counters
335 while match(self, counters) do end
336end
337
338return machine