generated from python-discord/code-jam-template
-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathplan.drawio
488 lines (488 loc) · 53.3 KB
/
plan.drawio
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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
<mxfile>
<diagram id="HfwcXyOT2jd3vhD12_YS" name="Page-1">
<mxGraphModel dx="1769" dy="359" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0">
<root>
<mxCell id="0"/>
<mxCell id="1" parent="0"/>
<mxCell id="11" value="main.py" style="shape=umlFrame;whiteSpace=wrap;html=1;width=120;height=30;boundedLbl=1;verticalAlign=middle;align=left;spacingLeft=5;" vertex="1" parent="1">
<mxGeometry x="40" width="170" height="200" as="geometry"/>
</mxCell>
<mxCell id="23" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.164;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="12" target="15">
<mxGeometry relative="1" as="geometry">
<mxPoint x="350" y="40" as="targetPoint"/>
<Array as="points">
<mxPoint x="260" y="115"/>
<mxPoint x="260" y="43"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="12" value="Contains the main game loop.<br>All major classes and engines<br>are created and assigned here.<br><br>- GameState(Renderer, Level)<br>- blessed.Terminal" style="shape=note2;boundedLbl=1;whiteSpace=wrap;html=1;size=25;verticalAlign=top;align=center;" vertex="1" parent="1">
<mxGeometry x="40" y="30" width="170" height="170" as="geometry"/>
</mxCell>
<mxCell id="15" value="&lt;&lt;class&gt;&gt;<br><b>GameState</b>" style="swimlane;fontStyle=0;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=55;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=0;marginBottom=0;html=1;" vertex="1" parent="1">
<mxGeometry x="355" y="10" width="275" height="203" as="geometry"/>
</mxCell>
<mxCell id="16" value="attributes" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="15">
<mxGeometry y="55" width="275" height="20" as="geometry"/>
</mxCell>
<mxCell id="17" value="level: Level" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="15">
<mxGeometry y="75" width="275" height="20" as="geometry"/>
</mxCell>
<mxCell id="24" value="renderer: Renderer" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="15">
<mxGeometry y="95" width="275" height="20" as="geometry"/>
</mxCell>
<mxCell id="25" value="input_handler: InputHandler" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="15">
<mxGeometry y="115" width="275" height="20" as="geometry"/>
</mxCell>
<mxCell id="20" value="" style="line;strokeWidth=1;fillColor=none;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" vertex="1" parent="15">
<mxGeometry y="135" width="275" height="8" as="geometry"/>
</mxCell>
<mxCell id="21" value="operations" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="15">
<mxGeometry y="143" width="275" height="20" as="geometry"/>
</mxCell>
<mxCell id="22" value="self.process_input(keystroke: Keystroke)" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="15">
<mxGeometry y="163" width="275" height="20" as="geometry"/>
</mxCell>
<mxCell id="26" value="self.update(keystroke: Keystroke)" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="15">
<mxGeometry y="183" width="275" height="20" as="geometry"/>
</mxCell>
<mxCell id="29" value="Called on every loop in the game. Delegate updates here." style="shape=note2;boundedLbl=1;whiteSpace=wrap;html=1;size=25;verticalAlign=top;align=center;fillColor=#808080;" vertex="1" parent="1">
<mxGeometry x="770" y="179.5" width="120" height="87" as="geometry"/>
</mxCell>
<mxCell id="30" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="26" target="29">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="31" value="Process the user input by passing it to the input handler." style="shape=note2;boundedLbl=1;whiteSpace=wrap;html=1;size=25;verticalAlign=top;align=center;fillColor=#808080;" vertex="1" parent="1">
<mxGeometry x="770" y="78" width="120" height="87" as="geometry"/>
</mxCell>
<mxCell id="32" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="22" target="31">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="50" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.25;exitDx=0;exitDy=0;entryX=0;entryY=0;entryDx=120;entryDy=56;entryPerimeter=0;" edge="1" parent="1" source="33" target="46">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="33" value="&lt;&lt;class&gt;&gt;<br><b>Level</b>" style="swimlane;fontStyle=0;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=55;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=0;marginBottom=0;html=1;" vertex="1" parent="1">
<mxGeometry x="-30" y="390" width="275" height="203" as="geometry"/>
</mxCell>
<mxCell id="34" value="attributes" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="33">
<mxGeometry y="55" width="275" height="20" as="geometry"/>
</mxCell>
<mxCell id="35" value="level_elements: level_parser.LevelElements" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="33">
<mxGeometry y="75" width="275" height="20" as="geometry"/>
</mxCell>
<mxCell id="36" value="active_element: LevelElement" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="33">
<mxGeometry y="95" width="275" height="20" as="geometry"/>
</mxCell>
<mxCell id="38" value="_positions: set[Position]" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;fontColor=#808080;" vertex="1" parent="33">
<mxGeometry y="115" width="275" height="20" as="geometry"/>
</mxCell>
<mxCell id="39" value="" style="line;strokeWidth=1;fillColor=none;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" vertex="1" parent="33">
<mxGeometry y="135" width="275" height="8" as="geometry"/>
</mxCell>
<mxCell id="40" value="operations" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="33">
<mxGeometry y="143" width="275" height="20" as="geometry"/>
</mxCell>
<mxCell id="41" value="# performs operations that move elements around" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="33">
<mxGeometry y="163" width="275" height="20" as="geometry"/>
</mxCell>
<mxCell id="42" value="# and find elements based on their positions" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="33">
<mxGeometry y="183" width="275" height="20" as="geometry"/>
</mxCell>
<mxCell id="43" value="" style="endArrow=none;startArrow=diamondThin;endFill=0;startFill=0;html=1;verticalAlign=bottom;labelBackgroundColor=none;strokeWidth=1;startSize=8;endSize=8;entryX=0;entryY=0.5;entryDx=0;entryDy=0;exitX=0.5;exitY=0;exitDx=0;exitDy=0;" edge="1" parent="1" source="33" target="17">
<mxGeometry width="160" relative="1" as="geometry">
<mxPoint x="160" y="330" as="sourcePoint"/>
<mxPoint x="320" y="330" as="targetPoint"/>
<Array as="points">
<mxPoint x="108" y="340"/>
<mxPoint x="290" y="340"/>
<mxPoint x="290" y="95"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="46" value="Currently handles and sets the active/main character. We need to find a good design pattern that allows the GameState to set the behavior of how the level starts and which LevelElement is the active one. The reason why we want to think in terms of "activity" is to allow for flexibility (e.g. telekenesis with ANY block we would want. Easy control over any element on the screen)." style="shape=note2;boundedLbl=1;whiteSpace=wrap;html=1;size=25;verticalAlign=top;align=center;fillColor=#808080;" vertex="1" parent="1">
<mxGeometry x="-450" y="370" width="330" height="160" as="geometry"/>
</mxCell>
<mxCell id="51" value="&lt;&lt;class&gt;&gt;<br><b>Renderer</b>" style="swimlane;fontStyle=0;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=55;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=0;marginBottom=0;html=1;" vertex="1" parent="1">
<mxGeometry x="360" y="390" width="275" height="203" as="geometry"/>
</mxCell>
<mxCell id="52" value="attributes" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="51">
<mxGeometry y="55" width="275" height="20" as="geometry"/>
</mxCell>
<mxCell id="53" value="terminal: blessed.Terminal" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="51">
<mxGeometry y="75" width="275" height="20" as="geometry"/>
</mxCell>
<mxCell id="54" value="level_states: list[Level]" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="51">
<mxGeometry y="95" width="275" height="20" as="geometry"/>
</mxCell>
<mxCell id="62" value="level_origin: Vector2D&nbsp; &nbsp;# origin of level in terminal" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="51">
<mxGeometry y="115" width="275" height="20" as="geometry"/>
</mxCell>
<mxCell id="56" value="" style="line;strokeWidth=1;fillColor=none;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" vertex="1" parent="51">
<mxGeometry y="135" width="275" height="8" as="geometry"/>
</mxCell>
<mxCell id="57" value="operations" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="51">
<mxGeometry y="143" width="275" height="20" as="geometry"/>
</mxCell>
<mxCell id="58" value="self.render_level(level: Level)" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="51">
<mxGeometry y="163" width="275" height="20" as="geometry"/>
</mxCell>
<mxCell id="59" value="self.add_level_state_to_history(level: Level)" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="51">
<mxGeometry y="183" width="275" height="20" as="geometry"/>
</mxCell>
<mxCell id="61" value="" style="endArrow=none;startArrow=diamondThin;endFill=0;startFill=0;html=1;verticalAlign=bottom;labelBackgroundColor=none;strokeWidth=1;startSize=8;endSize=8;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="51" target="24">
<mxGeometry width="160" relative="1" as="geometry">
<mxPoint x="117.5" y="400" as="sourcePoint"/>
<mxPoint x="365" y="105" as="targetPoint"/>
<Array as="points">
<mxPoint x="500" y="350"/>
<mxPoint x="310" y="350"/>
<mxPoint x="310" y="115"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="63" value="&lt;&lt;class&gt;&gt;<br><b>InputHandler</b>" style="swimlane;fontStyle=0;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=55;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=0;marginBottom=0;html=1;" vertex="1" parent="1">
<mxGeometry x="692.5" y="390" width="357.5" height="143" as="geometry"/>
</mxCell>
<mxCell id="64" value="attributes" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="63">
<mxGeometry y="55" width="357.5" height="20" as="geometry"/>
</mxCell>
<mxCell id="65" value="cls.mapping: dict&nbsp; &nbsp; &nbsp; &nbsp; # contains key to commands" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="63">
<mxGeometry y="75" width="357.5" height="20" as="geometry"/>
</mxCell>
<mxCell id="68" value="" style="line;strokeWidth=1;fillColor=none;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" vertex="1" parent="63">
<mxGeometry y="95" width="357.5" height="8" as="geometry"/>
</mxCell>
<mxCell id="69" value="operations" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="63">
<mxGeometry y="103" width="357.5" height="20" as="geometry"/>
</mxCell>
<mxCell id="70" value="self.handle_input(keystroke: Keystroke,&nbsp;data: ElementData)" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="63">
<mxGeometry y="123" width="357.5" height="20" as="geometry"/>
</mxCell>
<mxCell id="72" value="" style="endArrow=none;startArrow=diamondThin;endFill=0;startFill=0;html=1;verticalAlign=bottom;labelBackgroundColor=none;strokeWidth=1;startSize=8;endSize=8;entryX=0;entryY=0.5;entryDx=0;entryDy=0;exitX=0.5;exitY=0;exitDx=0;exitDy=0;" edge="1" parent="1" source="63" target="25">
<mxGeometry width="160" relative="1" as="geometry">
<mxPoint x="509.293286219081" y="400" as="sourcePoint"/>
<mxPoint x="365" y="125" as="targetPoint"/>
<Array as="points">
<mxPoint x="871" y="330"/>
<mxPoint x="330" y="330"/>
<mxPoint x="330" y="135"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="74" value="&lt;&lt;dataclass&gt;&gt;<br><b>Key</b>" style="swimlane;fontStyle=0;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=55;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=0;marginBottom=0;html=1;" vertex="1" parent="1">
<mxGeometry x="1220" y="320" width="275" height="183" as="geometry"/>
</mxCell>
<mxCell id="75" value="attributes" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="74">
<mxGeometry y="55" width="275" height="20" as="geometry"/>
</mxCell>
<mxCell id="186" value="name (property): str" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="74">
<mxGeometry y="75" width="275" height="20" as="geometry"/>
</mxCell>
<mxCell id="76" value="UP = u"KEY_UP"" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="74">
<mxGeometry y="95" width="275" height="20" as="geometry"/>
</mxCell>
<mxCell id="77" value="LEFT = u"KEY_LEFT"" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="74">
<mxGeometry y="115" width="275" height="20" as="geometry"/>
</mxCell>
<mxCell id="84" value="DOWN = u"KEY_DOWN"" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="74">
<mxGeometry y="135" width="275" height="20" as="geometry"/>
</mxCell>
<mxCell id="78" value="..." style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="74">
<mxGeometry y="155" width="275" height="20" as="geometry"/>
</mxCell>
<mxCell id="79" value="" style="line;strokeWidth=1;fillColor=none;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" vertex="1" parent="74">
<mxGeometry y="175" width="275" height="8" as="geometry"/>
</mxCell>
<mxCell id="83" value="" style="endArrow=none;startArrow=diamondThin;endFill=0;startFill=0;html=1;verticalAlign=bottom;labelBackgroundColor=none;strokeWidth=1;startSize=8;endSize=8;entryX=1;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" target="65">
<mxGeometry width="160" relative="1" as="geometry">
<mxPoint x="1219" y="356" as="sourcePoint"/>
<mxPoint x="365" y="145" as="targetPoint"/>
<Array as="points">
<mxPoint x="1070" y="356"/>
<mxPoint x="1070" y="475"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="177" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="85" target="100">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="85" value="&lt;&lt;module&gt;&gt;<br><b>command.py</b>" style="swimlane;fontStyle=0;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=55;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=0;marginBottom=0;html=1;" vertex="1" parent="1">
<mxGeometry x="1220" y="540" width="275" height="143" as="geometry"/>
</mxCell>
<mxCell id="90" value="" style="line;strokeWidth=1;fillColor=none;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" vertex="1" parent="85">
<mxGeometry y="55" width="275" height="8" as="geometry"/>
</mxCell>
<mxCell id="91" value="operations" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="85">
<mxGeometry y="63" width="275" height="20" as="geometry"/>
</mxCell>
<mxCell id="92" value="move_left(data: ElementData)" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="85">
<mxGeometry y="83" width="275" height="20" as="geometry"/>
</mxCell>
<mxCell id="93" value="move_right(data: ElementData)" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="85">
<mxGeometry y="103" width="275" height="20" as="geometry"/>
</mxCell>
<mxCell id="96" value="..." style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="85">
<mxGeometry y="123" width="275" height="20" as="geometry"/>
</mxCell>
<mxCell id="95" value="" style="endArrow=none;startArrow=diamondThin;endFill=0;startFill=0;html=1;verticalAlign=bottom;labelBackgroundColor=none;strokeWidth=1;startSize=8;endSize=8;entryX=1;entryY=0.75;entryDx=0;entryDy=0;entryPerimeter=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="91" target="65">
<mxGeometry width="160" relative="1" as="geometry">
<mxPoint x="1218" y="566" as="sourcePoint"/>
<mxPoint x="1060" y="485" as="targetPoint"/>
<Array as="points">
<mxPoint x="1120" y="613"/>
<mxPoint x="1120" y="480"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="97" value="Command pattern, invokes call to behavior within the level elements." style="shape=note2;boundedLbl=1;whiteSpace=wrap;html=1;size=25;verticalAlign=top;align=center;fillColor=#808080;" vertex="1" parent="1">
<mxGeometry x="1570" y="568" width="120" height="102" as="geometry"/>
</mxCell>
<mxCell id="98" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="93" target="97">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="108" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.25;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="100" target="107">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="100" value="&lt;&lt;dataclass&gt;&gt;<br><b>ElementData</b>" style="swimlane;fontStyle=0;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=55;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=0;marginBottom=0;html=1;" vertex="1" parent="1">
<mxGeometry x="1220" y="770" width="275" height="163" as="geometry"/>
</mxCell>
<mxCell id="101" value="attributes" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="100">
<mxGeometry y="55" width="275" height="20" as="geometry"/>
</mxCell>
<mxCell id="102" value="level: Level" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="100">
<mxGeometry y="75" width="275" height="20" as="geometry"/>
</mxCell>
<mxCell id="103" value="render: Renderer" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="100">
<mxGeometry y="95" width="275" height="20" as="geometry"/>
</mxCell>
<mxCell id="104" value="level_element: LevelElement" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="100">
<mxGeometry y="115" width="275" height="20" as="geometry"/>
</mxCell>
<mxCell id="105" value="..." style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="100">
<mxGeometry y="135" width="275" height="20" as="geometry"/>
</mxCell>
<mxCell id="106" value="" style="line;strokeWidth=1;fillColor=none;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" vertex="1" parent="100">
<mxGeometry y="155" width="275" height="8" as="geometry"/>
</mxCell>
<mxCell id="107" value="Packages up data into a single object for the command pattern to make use of more information." style="shape=note2;boundedLbl=1;whiteSpace=wrap;html=1;size=25;verticalAlign=top;align=center;fillColor=#808080;" vertex="1" parent="1">
<mxGeometry x="1570" y="780" width="120" height="124.5" as="geometry"/>
</mxCell>
<mxCell id="111" value="&lt;&lt;class&gt;&gt;<br><b>Vector2D</b>" style="swimlane;fontStyle=0;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=55;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=0;marginBottom=0;html=1;" vertex="1" parent="1">
<mxGeometry x="-30" y="770" width="275" height="223" as="geometry"/>
</mxCell>
<mxCell id="112" value="attributes" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="111">
<mxGeometry y="55" width="275" height="20" as="geometry"/>
</mxCell>
<mxCell id="113" value="x: Union[float, int]" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="111">
<mxGeometry y="75" width="275" height="20" as="geometry"/>
</mxCell>
<mxCell id="114" value="y: Union[float, int]" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="111">
<mxGeometry y="95" width="275" height="20" as="geometry"/>
</mxCell>
<mxCell id="115" value="scalar_limit&nbsp; &nbsp; &nbsp; # puts a cap to how far it can scale" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="111">
<mxGeometry y="115" width="275" height="20" as="geometry"/>
</mxCell>
<mxCell id="116" value="" style="line;strokeWidth=1;fillColor=none;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" vertex="1" parent="111">
<mxGeometry y="135" width="275" height="8" as="geometry"/>
</mxCell>
<mxCell id="117" value="operations" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="111">
<mxGeometry y="143" width="275" height="20" as="geometry"/>
</mxCell>
<mxCell id="118" value="__add__" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="111">
<mxGeometry y="163" width="275" height="20" as="geometry"/>
</mxCell>
<mxCell id="119" value="__sub__" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="111">
<mxGeometry y="183" width="275" height="20" as="geometry"/>
</mxCell>
<mxCell id="125" value="..." style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="111">
<mxGeometry y="203" width="275" height="20" as="geometry"/>
</mxCell>
<mxCell id="120" value="" style="endArrow=block;startArrow=none;endFill=0;startFill=0;endSize=8;html=1;verticalAlign=bottom;dashed=1;labelBackgroundColor=none;exitX=0.5;exitY=1.279;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="42" target="111">
<mxGeometry width="160" relative="1" as="geometry">
<mxPoint x="70" y="630" as="sourcePoint"/>
<mxPoint x="230" y="630" as="targetPoint"/>
</mxGeometry>
</mxCell>
<mxCell id="121" value="" style="endArrow=block;startArrow=none;endFill=0;startFill=0;endSize=8;html=1;verticalAlign=bottom;dashed=1;labelBackgroundColor=none;exitX=0.484;exitY=1.136;exitDx=0;exitDy=0;exitPerimeter=0;" edge="1" parent="1" source="59">
<mxGeometry width="160" relative="1" as="geometry">
<mxPoint x="117.5" y="608.5799999999999" as="sourcePoint"/>
<mxPoint x="126" y="770" as="targetPoint"/>
<Array as="points">
<mxPoint x="493" y="630"/>
<mxPoint x="126" y="630"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="123" value="" style="endArrow=none;html=1;rounded=0;align=center;verticalAlign=top;endFill=0;labelBackgroundColor=none;endSize=6;startArrow=oval;startFill=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" target="54">
<mxGeometry relative="1" as="geometry">
<mxPoint x="250" y="410" as="sourcePoint"/>
<mxPoint x="440" y="590" as="targetPoint"/>
<Array as="points">
<mxPoint x="300" y="410"/>
<mxPoint x="300" y="495"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="124" value="Renders the level" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
<mxGeometry x="280" y="380" width="40" height="20" as="geometry"/>
</mxCell>
<mxCell id="127" value="&lt;&lt;class&gt;&gt;<br><b>LevelElement<br></b>{abstract}<b><br></b>" style="swimlane;fontStyle=0;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=55;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=0;marginBottom=0;html=1;" vertex="1" parent="1">
<mxGeometry x="620" y="630" width="125" height="183" as="geometry"/>
</mxCell>
<mxCell id="128" value="attributes" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="127">
<mxGeometry y="55" width="125" height="20" as="geometry"/>
</mxCell>
<mxCell id="130" value="..." style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="127">
<mxGeometry y="75" width="125" height="20" as="geometry"/>
</mxCell>
<mxCell id="132" value="" style="line;strokeWidth=1;fillColor=none;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" vertex="1" parent="127">
<mxGeometry y="95" width="125" height="8" as="geometry"/>
</mxCell>
<mxCell id="133" value="operations" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="127">
<mxGeometry y="103" width="125" height="20" as="geometry"/>
</mxCell>
<mxCell id="134" value="move_left" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="127">
<mxGeometry y="123" width="125" height="20" as="geometry"/>
</mxCell>
<mxCell id="135" value="move_right" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="127">
<mxGeometry y="143" width="125" height="20" as="geometry"/>
</mxCell>
<mxCell id="136" value="..." style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="127">
<mxGeometry y="163" width="125" height="20" as="geometry"/>
</mxCell>
<mxCell id="145" value="&lt;&lt;class&gt;&gt;<br><b>Block</b><b><br></b>" style="swimlane;fontStyle=0;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=55;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=0;marginBottom=0;html=1;" vertex="1" parent="1">
<mxGeometry x="470" y="910" width="125" height="183" as="geometry"/>
</mxCell>
<mxCell id="146" value="attributes" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="145">
<mxGeometry y="55" width="125" height="20" as="geometry"/>
</mxCell>
<mxCell id="147" value="..." style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="145">
<mxGeometry y="75" width="125" height="20" as="geometry"/>
</mxCell>
<mxCell id="148" value="" style="line;strokeWidth=1;fillColor=none;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" vertex="1" parent="145">
<mxGeometry y="95" width="125" height="8" as="geometry"/>
</mxCell>
<mxCell id="149" value="operations" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="145">
<mxGeometry y="103" width="125" height="20" as="geometry"/>
</mxCell>
<mxCell id="150" value="move_left" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="145">
<mxGeometry y="123" width="125" height="20" as="geometry"/>
</mxCell>
<mxCell id="151" value="move_right" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="145">
<mxGeometry y="143" width="125" height="20" as="geometry"/>
</mxCell>
<mxCell id="152" value="..." style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="145">
<mxGeometry y="163" width="125" height="20" as="geometry"/>
</mxCell>
<mxCell id="153" value="&lt;&lt;class&gt;&gt;<br><b>BlockDude</b><b><br></b>" style="swimlane;fontStyle=0;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=55;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=0;marginBottom=0;html=1;" vertex="1" parent="1">
<mxGeometry x="620" y="910" width="125" height="183" as="geometry"/>
</mxCell>
<mxCell id="154" value="attributes" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="153">
<mxGeometry y="55" width="125" height="20" as="geometry"/>
</mxCell>
<mxCell id="155" value="..." style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="153">
<mxGeometry y="75" width="125" height="20" as="geometry"/>
</mxCell>
<mxCell id="156" value="" style="line;strokeWidth=1;fillColor=none;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" vertex="1" parent="153">
<mxGeometry y="95" width="125" height="8" as="geometry"/>
</mxCell>
<mxCell id="157" value="operations" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="153">
<mxGeometry y="103" width="125" height="20" as="geometry"/>
</mxCell>
<mxCell id="158" value="move_left" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="153">
<mxGeometry y="123" width="125" height="20" as="geometry"/>
</mxCell>
<mxCell id="159" value="move_right" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="153">
<mxGeometry y="143" width="125" height="20" as="geometry"/>
</mxCell>
<mxCell id="160" value="..." style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="153">
<mxGeometry y="163" width="125" height="20" as="geometry"/>
</mxCell>
<mxCell id="161" value="&lt;&lt;class&gt;&gt;<br><b>BlockDude</b><b><br></b>" style="swimlane;fontStyle=0;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=55;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=0;marginBottom=0;html=1;" vertex="1" parent="1">
<mxGeometry x="765" y="910" width="125" height="183" as="geometry"/>
</mxCell>
<mxCell id="162" value="attributes" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="161">
<mxGeometry y="55" width="125" height="20" as="geometry"/>
</mxCell>
<mxCell id="163" value="..." style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="161">
<mxGeometry y="75" width="125" height="20" as="geometry"/>
</mxCell>
<mxCell id="164" value="" style="line;strokeWidth=1;fillColor=none;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" vertex="1" parent="161">
<mxGeometry y="95" width="125" height="8" as="geometry"/>
</mxCell>
<mxCell id="165" value="operations" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="161">
<mxGeometry y="103" width="125" height="20" as="geometry"/>
</mxCell>
<mxCell id="166" value="move_left" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="161">
<mxGeometry y="123" width="125" height="20" as="geometry"/>
</mxCell>
<mxCell id="167" value="move_right" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="161">
<mxGeometry y="143" width="125" height="20" as="geometry"/>
</mxCell>
<mxCell id="168" value="..." style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="161">
<mxGeometry y="163" width="125" height="20" as="geometry"/>
</mxCell>
<mxCell id="171" value="" style="html=1;verticalAlign=bottom;labelBackgroundColor=none;endArrow=block;endFill=1;entryX=0.5;entryY=1;entryDx=0;entryDy=0;exitX=0.5;exitY=0;exitDx=0;exitDy=0;" edge="1" parent="1" source="153" target="127">
<mxGeometry width="160" relative="1" as="geometry">
<mxPoint x="680" y="910" as="sourcePoint"/>
<mxPoint x="840" y="910" as="targetPoint"/>
</mxGeometry>
</mxCell>
<mxCell id="172" value="" style="html=1;verticalAlign=bottom;labelBackgroundColor=none;endArrow=block;endFill=1;entryX=0.405;entryY=1;entryDx=0;entryDy=0;exitX=0.5;exitY=0;exitDx=0;exitDy=0;entryPerimeter=0;" edge="1" parent="1" source="145" target="136">
<mxGeometry width="160" relative="1" as="geometry">
<mxPoint x="692.5" y="920" as="sourcePoint"/>
<mxPoint x="692.5" y="823.0000000000002" as="targetPoint"/>
</mxGeometry>
</mxCell>
<mxCell id="173" value="" style="html=1;verticalAlign=bottom;labelBackgroundColor=none;endArrow=block;endFill=1;entryX=0.603;entryY=1;entryDx=0;entryDy=0;exitX=0.5;exitY=0;exitDx=0;exitDy=0;entryPerimeter=0;" edge="1" parent="1" source="161" target="136">
<mxGeometry width="160" relative="1" as="geometry">
<mxPoint x="542.5" y="920" as="sourcePoint"/>
<mxPoint x="692.5" y="824.4199999999998" as="targetPoint"/>
</mxGeometry>
</mxCell>
<mxCell id="175" value="" style="endArrow=none;startArrow=diamondThin;endFill=0;startFill=0;html=1;verticalAlign=bottom;labelBackgroundColor=none;strokeWidth=1;startSize=8;endSize=8;entryX=1;entryY=0.5;entryDx=0;entryDy=0;exitX=-0.009;exitY=0.162;exitDx=0;exitDy=0;exitPerimeter=0;" edge="1" parent="1" source="127" target="36">
<mxGeometry width="160" relative="1" as="geometry">
<mxPoint x="300" y="680" as="sourcePoint"/>
<mxPoint x="460" y="680" as="targetPoint"/>
<Array as="points">
<mxPoint x="270" y="660"/>
<mxPoint x="270" y="495"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="178" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="70" target="93">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="1090" y="523"/>
<mxPoint x="1090" y="653"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="180" value="" style="endArrow=none;startArrow=diamondThin;endFill=0;startFill=0;html=1;verticalAlign=bottom;labelBackgroundColor=none;strokeWidth=1;startSize=8;endSize=8;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" target="104">
<mxGeometry width="160" relative="1" as="geometry">
<mxPoint x="745" y="660" as="sourcePoint"/>
<mxPoint x="990" y="710" as="targetPoint"/>
<Array as="points">
<mxPoint x="970" y="660"/>
<mxPoint x="970" y="895"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="181" value="level_parser.py" style="shape=umlFrame;whiteSpace=wrap;html=1;width=120;height=30;boundedLbl=1;verticalAlign=middle;align=left;spacingLeft=5;" vertex="1" parent="1">
<mxGeometry x="-350" y="660" width="170" height="120" as="geometry"/>
</mxCell>
<mxCell id="182" value="Contains handy methods that parse a text file into an object-oriented level.<br>" style="shape=note2;boundedLbl=1;whiteSpace=wrap;html=1;size=25;verticalAlign=top;align=center;" vertex="1" parent="1">
<mxGeometry x="-350" y="690" width="170" height="90" as="geometry"/>
</mxCell>
<mxCell id="183" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=1.004;entryY=0.365;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="35" target="182">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="-80" y="475"/>
<mxPoint x="-80" y="723"/>
</Array>
</mxGeometry>
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>