-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgravitywar.p8
642 lines (560 loc) · 25.6 KB
/
gravitywar.p8
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
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
pico-8 cartridge // http://www.pico-8.com
version 15
__lua__
-- gravity war
-- by ace + 15
if(stat(6) != "") debug = true
function _init()
cls()
played = false
playing = 0
players = {}
planets = {}
shots = {}
gen_map(2, 3)
end
function can_reset()
return not played or
#players <= 1
end
function control()
move_player(players[playing])
if btnp"4" then
playing += 1
sfx(7)
end
if btnp"5" and can_reset() then
_init()
end
--local mars = planets[1]
--if (btnp(2,1)) mars.mass += 4
--if (btnp(3,1)) mars.mass -= 4
end
function _update60()
if playing < 1 then
move_shots()
if #shots < 1 then
playing = 1
end
return
end
control()
if playing > #players then
for a in all(players) do
add(shots, shoot(a))
end
playing = -1
played = true
end
end
function _draw()
maybe_clear()
draw_shots()
draw_planets()
draw_players()
draw_power(players[playing])
end
thermal_scale = {0,1,2,13,12,3,11,10,9,8,14,15,7}
thermal_step = 1/78
function dither(value, palette, increment_size)
if(not increment_size) increment_size = 1
local value = value/increment_size
local substeps = #rylander_dither
local i = flr(value/substeps+1)
local j = flr(value%substeps+1)
i = mid(1,i,#palette)
i2 = min(i+1,#palette)
local col1 = palette[i]
local col2 = palette[i2]
fillp(rylander_dither[j])
return col1 + (col2 * 0x10)
end
function show_gravity()
for i=0,127 do
for j=0,127 do
local grav = get_gravity_at(i, j)
local col = dither(grav, thermal_scale, thermal_step)
rectfill(i,j,i,j,col)
end
end
end
function maybe_clear()
if playing < 0 then
playing = 0
cls()
load_map_background()
end
end
function draw_power(a)
if (not a) return
local x=a.power*(128/max_power)
rectfill(0, 0, 128, 3, a.col)
rectfill(x, 0, 128, 3, 0)
end
function gen_map(n_players, n_planets)
local n = n_players + n_planets
local r, k = 25, 10
local points = distribute_points(r, k)
for i=1, n_planets do
local p = points[flr(rnd(#points)) + 1]
if(not p)return _init()
local size = flr(p_min_size + rnd(r/2-p_min_size))
local mass = flr(p_min_mass + rnd(p_max_mass - p_min_mass))
--if (rnd(15) < 1) mass = -mass
add(planets, planet(p.x, p.y, size, mass))
del(points, p)
end
for i=1, n_players do
local p = points[flr(rnd(#points)) + 1]
if(not p)return _init()
add(players, player(p.x, p.y,player_colors[i]))
del(points, p)
end
if debug then
for p in all(points) do
circfill(p.x, p.y, 1, 6)
end
else
show_gravity()
end
dump_screen_to_map()
end
function dump_screen_to_map()
--0x1000 gfx2/map2 (shared)
--0x2000 map
--0x6000 screen (8k)
memcpy(0x1000, 0x6000, 0x2000)
end
function load_map_background()
memcpy(0x6000, 0x1000, 0x2000)
end
function distribute_points(r, k)
-- poisson disc distribution algo
local points = {}
local active = {}
local x0, y0 = flr(rnd(128)), flr(rnd(128))
add(points, {x=x0, y=y0})
add(active, {x=x0, y=y0})
while (#active > 0) do
local a = active[flr(rnd(#active)) + 1]
for i=1, k do
local x,y = random_point_around(a.x, a.y, r, 2*r)
local valid = true
if (outside({x=x,y=y},8)) valid = false
for p in all(points) do
if (not valid) break
if collides(p, {x=x, y=y, r=r}) then
valid = false
end
end
if (valid) then
add(points, {x=x, y=y})
add(active, {x=x, y=y})
break
end
if (i == k) then
del(active, a)
end
end
end
return points
end
function random_point_around(x, y, r, r2)
local dist = r + rnd(r2-r)
local rot = rnd(1)
return x + dist * cos(rot), y + dist * sin(rot)
end
-->8
------------------- player ----
player_colors = {8, 12}
aim_sens = 0.005
power_sens = 0.03
min_power = 0.5
max_power = 2.5
player_radius = 3
gun_length = 9
function aim_center(x, y)
return atan2(64-x, 64-y, x, y)
end
function player(x, y, col)
local d = aim_center(x, y)
return {
x = x,
y = y,
col = col,
d = d,
old = d,
r = player_radius,
power = max_power / 2,
}
end
_btnpp = {}
function btnpp(n)
if btn(n) then
local t = (_btnpp[n] or 0) + 1
_btnpp[n] = t
return btnp(n) or t > 40
else
_btnpp[n] = 0
end
end
function move_player(a)
if (not a) return
a.old = a.d
if (btnpp"0") a.d+=aim_sens
if (btnpp"1") a.d-=aim_sens
if a.old != a.d then
sfx(2)
end
local pwr = a.power
if (btnpp"2") pwr += power_sens
if (btnpp"3") pwr -= power_sens
pwr = mid(pwr,min_power,max_power)
if pwr != a.power then
sfx(1, 3, pwr * 2, 1)
a.power = pwr
end
end
function draw_players()
for i, a in pairs(players) do
draw_gun(a.x, a.y, a.old, 0)
draw_gun(a.x,a.y,a.d,a.col)
circfill(a.x,a.y,a.r,a.col)
if i == playing then
circfill(a.x, a.y, 1, 0)
end
end
end
function draw_gun(x, y, d, col)
line(
x, y,
x + cos(d) * gun_length,
y + sin(d) * gun_length,
col)
end
-->8
------------------- planet ----
rylander_dither = {
0x0000, 0x8000, 0x8020, 0xa020,
0xa0a0, 0xa8a0, 0xa8a2, 0xaaa2,
0xaaaa, 0xeaaa, 0xeaba, 0xfaba,
0xfafa, 0xfefa, 0xfefb, 0xfffb,
}
planet_colors = {15, 14, 4, 2, 5}
p_min_size = 5
p_min_mass = 50
p_max_mass = 250
function planet(x, y, r, mass)
return {
x = x,
y = y,
r = r,
mass = mass,
}
end
function draw_planets()
for a in all(planets) do
--if a.mass < 1 then
-- local col = dither(-a.mass)
-- fillp(0)
-- circ(a.x, a.y, a.r, col)
-- print(a.mass,a.x-8,a.y-2,7)
-- return
--end
local col = dither(a.mass, planet_colors, 4)
circfill(a.x, a.y, a.r, col)
--draw_label(a)
end
fillp(0)
end
function draw_label(a)
print(
a.mass,
a.x - 5, a.y - 2,
a.mass < 100 and 0 or 7)
end
-->8
--------------------- shot ----
shot_speed = 0.5
expl_radius = 15
shot_colors = {}
shot_colors[8] = 5
shot_colors[12] = 6
--shot_colors[8] = 9
--shot_colors[12] = 13
function shoot(pl)
return shot(
pl.x + cos(pl.d) * gun_length,
pl.y + sin(pl.d) * gun_length,
pl.d,
pl.power * 2,
pl.col)
end
function shot(x, y, d, v, col)
return {
x = x,
y = y,
ox = x,
oy = y,
dx = cos(d) * v,
dy = sin(d) * v,
col = col,
expl = 0,
}
end
function move_shots()
for a in all(shots) do
if a.expl > 0 then
a.expl += 0.02
if (a.expl>1) del(shots,a)
return
end
a.ox = a.x
a.oy = a.y
a.x += a.dx * shot_speed
a.y += a.dy * shot_speed
collide_players(a)
follow_planets(a)
if (outside(a)) del(shots, a)
end
end
function sqr(x) return x*x end
function collides(a, b)
local ax, ay = a.x, a.y
local bx, by, r = b.x, b.y, b.r
if (r < 1) r = -r
return r > sqrt(
sqr(ax - bx) + sqr(ay - by))
end
function collide_players(a)
for b in all(players) do
if collides(a, b) then
a.expl = 0.01
a.x = b.x
a.y = b.y
a.dx = 0
a.dy = 0
del(players, b)
sfx(6)
end
end
end
function get_gravity_at(x, y, pl)
local grav = 0
local planets = planets
if (pl) planets = {pl}
for p in all(planets) do
grav = grav + p.mass /
abs(sqr(p.x-x)+sqr(p.y-y))
end
return grav
end
function get_force_at(x, y)
local fx, fy = 0, 0
for p in all(planets) do
local d = atan2(p.x-x,p.y-y,x,y)
local grav = get_gravity_at(x,y,p)
fx += grav * cos(d)
fy += grav * sin(d)
end
return fx, fy
end
function follow_planets(a)
local fx, fy = get_force_at(a.x, a.y)
a.dx += fx
a.dy += fy
for b in all(planets) do
if collides(a,b) then
del(shots,a)
sfx(5)
end
end
end
function outside(a, margin)
if (not margin) margin=0
return
a.x < margin or
a.x > 128-margin or
a.y < margin or
a.y > 128-margin
end
function draw_shots()
for i, a in pairs(shots) do
local x, y = a.x, a.y
if a.expl == 0 then
local col = shot_colors[a.col]
--rect(a.ox,a.oy,x,y,0)
rectfill(a.ox,a.oy,x,y,col)
pset(a.x,a.y,a.col)
local size =
sqrt(sqr(a.dx)+sqr(a.dy))
sfx(3+i%2, i, size * 7, 1)
else
if a.expl > 0.25 then
circfill(x,y,expl_radius,0)
end
circfill(
x,y,
expl_radius*-sin(a.expl/2),
10)
end
end
end
-->8
------------------- vector ----
vector_mt = {
__add = function(a,b)
return {x=a.x+b.x, y=a.y+b.y}
end,
}
function vec(x, y)
local v = {x=x,y=y}
setmetatable(v, vector_mt)
return v
end
function vec_to_string(v)
return "("..v.x..","..v.y..")"
end
-- v1 = vec(42,-5)
-- v2 = vec(6,66)
-- v3 = v1+v2
-- v4 = v3+vec(3,5)
-- printh(vec_to_string(v4))
__label__
101010101110111111111111212121222222ddddcc33bb99ee777777777e89abb33ccdddd2222221212121111111111011101010101010101010101010101010
101010101010101010101111111121212222ddddcc33ba98f77777777777f89ab33ccdd2d2222121211111111110101010101010101010001000100010000000
1010101010101011111111111121212222d2ddccccbba9ef7777777777777e89ab3ccdcdd2d22221212111111111101110101010101010101010101010101010
001000101010101010111011111111212222ddcdccbba9f777722422777777e9abbccdddd2222121111111111010101010101010101000100010000000000000
1010101011101111111111112121222222d2ddcc33ba9e7777222222277777789ab33ccdddd22221212121111111111111101010101010101010101010101010
101010101010101011101ccc111121212222ddcc33ba8e77722422242277777e8ab33ccdd2222221211111111110101010101010101010001000100010000000
10101010101110111111ccccc121212222ddddcc33aa8f77222222222227777e8aa33ccdd2d22221212111111111111110101010101010101010101010101010
0010101010101010101ccccccc11212222d2ddcc33aa8f77242224222427777f8ab33ccdd2d22121211111111010101010101010101000100010000000000000
1010101011101111111ccccccc212222d2ddddcc3ba9e777222222222227777feaa33ccdddd22221212121111111111111101110101010101010101010101010
1010101010101010111ccccccc11212122d2ddcc33aaef77222422242227777f8ab33ccdd2d22221211111111110101010101010101010101000100010000000
10101010101110111111ccccc121212222ddddcc33aa8f77222222222227777f8aa33ccdd2d22222212111111111111110101010101010101010101010101010
001010101010101010111cccc111212222d2ddcc33ba8e77742224222477777e9ab33ccdd2d22121211111111010101010101010101000100010000000000000
101010101110111111111111c121222222d2ddcc33ba8e7777222222277777789ab33ccdddd22221212121111111111111101110101010101010101010101010
1010101010101010111011111c1121212222ddcd33bb98f777742224777777e99bbccccdd2222221211111111110101010101010101010101000100010001000
1010101010111011111111111c21212222d2ddccccbba9ef7777777777777fe9abb3cdcdd2d22221212111111111111110111010101010101010101010101010
00101010101010101011101111c111212222d2ddcc33ba88f77777777777f89ab33ccdddd2222121111111111010101010101010101000100010000000000000
10101010111011111111111121c6212222d2ddddcc33ba99ef777777777ee99bb33ccdddd2d22221212121111111111111101110101010101010101010101010
101010101010101011101111116621212222d2ddccccbbaa98eeff7ffee99aa33ccdcdd2d2222121211111111110101010101010101010101000100010001000
101010101011101111111111116661222222d2ddcdcc33bbaa8888e8899aabb33ccccdd2d2222121212111111111111110111010101010101010101010101010
00101010101010101011101111166121212222ddddcccc33bbaa9a9a9aabb33ccccdd2d222222121111111111010101010101010101000100010000000000000
101010101110111111111111212666212222d2ddddcccc33bbbbaaababb3b33ccccdddd2d2222221212121111111111111101110101010101010101010101010
1010101010101010101011111111662121222222ddddcccc3333b3b3b3333ccccdddd2d222212121211111111110101010101010101010101000100010001000
10101010101110111111111111216661212222d2ddddcdcc3c333333333c3ccdcdddd2d222222121212111111111111110111010101010101010101010101010
001010101010101010101011111116612121222222ddddcdcdcccc3ccccccdcdd2d2222221212121111111111010101010101010101000100010001000000000
1010101011101111111111111111266622222222d2ddddcdcccccccccccdcdcdddd2d22222212121211121111111111111101110101010101010101010101010
101010101010101010101111111111666621222222d2ddddddddcdcdcdddddd2d2d2222121212111111111111110101010101010101010101000100010001000
101010101011101111111111111111266622222222d2d2ddddddddcdddddddddd2d2222221212121212111111111111110111010101010101010101010101010
0010101010101010101010111111111666662122222222d2d2d2d2ddd2d2d2d22222212121211111111111111010101010101010101000100010001000000000
10101010111011111111111111112121266622222222d2d2d2d2ddddddd2d2d2d222222222212121211111111111111111101110101010101010101010101010
101010101010101010101110111111112666612122222222d222d2d2d2d2d2222222212121212111111111101110101010101010101010101000100010001000
10101010101010111111111111111121212666622222222222d2d2d2d2d222d22222212221212121111111111111111110111010101010101010101010101010
00101010101010101010101110111111111166612121212222222222222222222121212121211111111110111010101010101010101000100010001000000000
1010101011101111111111111111211121216666622222222222d222d22222222222222121212121211111111111111111101110101010101010101010101010
10101010101010101010111011111111111121666661212122222222222222212121212121111111111111101110101010101010101010101000100010001000
10101010101010111011111111111111112121216662212222222222222222222122212121212121111111111111111110111010101010101010101010101010
00101010101010101010101010111111111111216666612121212121212121212121212111111111111110111010101010101010101010100010001000000000
10101010111011101111111111111111212121212166666122222222222222222221212121212121211111111111111111101110101010101010101010101010
10101010101010101010101011111111111111112121666661212121212121212121212121111111111111101110101010101010101010101000100010001000
10101010101010111011111111111111112111212121216661222122212221222121212121212121111111111111111110111010101010101010101010101010
00101010101010101010101010111011111111111121116666612121212121212121212111111111111110111010101010101010101010100010001000000000
10101010111011101111111111111111211121212121212166666222222222212221212121212121211111111111111111101110101010101010101010101010
10101010101010101010101011101111111111112111212121666661212121212121212121111111111111101110101010101010101010101010100010001000
10101010101010111011111111111111111111212121212121226666612221222121212121212121111111111111111110111010101010101010101010101010
00100010101010101010101010111011111111111111112121212166612121212121212111211111111110111010101010101010101010100010001000000000
10101010111011101111111111111111111121212121212122212266666222222221222121212121211111111111111111101110101010101010101010101010
10101010101010101010101011101111111111111111212121212121666666212121212121212111111111111110101010101010101010101010100010001000
10101010101010111011111111111111111111212121212121222222226666662222212121212121112111111111111110111010101010101010101010101010
00100010101010101010101010111011111111111121112121212122212226662121212121211111111111111010101010101010101010100010001000000000
10101010101011101111111111111111111121212121212122222222d222d6666622222222212121211121111111111111101110111010101010101010101010
10101010101010101010101011101111111111112111212121212222222222266622222121212111111111111110101010101010101010101010100010001000
101010101010101110111111111111111111112121212122222222d2d2d2d2d66666222222212121212111111111111110111010101010101010101010101010
00100010101010101010101010111011111111111121212121222222d2d2d2d2d666662221212121111111111011101010101010101010100010001000000000
1010101010101110111111111111111111112121212122222222d2d2ddddddddddd666d222222221212121111111111111101110111010101010101010101010
1010101010101010101010101110111111111111212121222222d2d2ddddddddddd6666622212121211111111110111010101010101010101010100010001000
10101010101010111011111111111111112111212122222222d2ddddcdcccdcdcdcdd666d2222121212111111111111110111010101010101010101010101010
00100010101010101010101010111011111111111121212222d2ddddcdcccccccdcdd66666222121111111111011101010101010101010100010001000100000
101010101010111011111111111111112111212122222222d2ddcdcc3e4e4e4e3ccccdd666d22221212121111111111111111110111010101010101010101010
101010101010101010101010111011111111111121212222d2ddcdce4eee4eee4e3ccdd666622221211111111110111010101010101010101010100010001000
1010101010101011101111111111111111212121212222d2ddddcc4e4e4e4e4e4e433ccdd6622222212121211111111111111010101010101010101010101010
001000101010101010101010101111111111112121222222d2ddce4eee4eee4eee4e3ccdd6622221212111111111101010101010101010100010001000100000
10101010111011101111111111111111212121212222d2d2ddcc4e4e4e4e4e4e4e4e433cc666d222222121212111111111111110111010101010101010101010
1010101010101010101010101111111111112121212222d2ddce4eee4eee4eee4eee4e3ccd66d221212121111111111010101010101010101010100010001000
1010101010101011101111111111111111212121222222ddddce4e4e4e4e4e4e4e4e4e3ccd666222212121211111111111111011101010101010101010101010
0010101010101010101010101011111111111121212222dddd4eee4eee4eee4eee4eee4ccdd66222212111111111101010101010101010100010001000100000
10101010111011101111111111111111212121212222d2ddcc4e4e4e4e4e4e4e4e4e4e433cd6c222222121212111111111111110111010101010101010101010
1010101010101010101010101111111111112121222222ddccee4eee4eee4eee4eee4ee3cdd2d222212121111111111010101010101010101010100010001000
10101010101010111011111111111111112121222222d2ddcc4e4e4e4e4e4e4e4e4e4e433dcdd2d2212121211111111111111011101010101010101010101010
0010101010101010101010101011111111111121212222dddd4eee4eee4eee4eee4eee43cdddd222212111111111101010101010101010100010001000100000
10101010111011101111111111111111212121212222d2ddcc4e4e4e4e4e4e4e4e4e4e433ccdd222222121212111111111111110111010101010101010101010
10101010101010101010111011111111111121212222d2ddcdee4eee4eee4eee4eee4eeccdd2d222212121111111111010101010101010101010100010001000
10101010101010111011111111111111112121222222d2ddcd3e4e4e4e4e4e4e4e4e4ebccdddd2d2212121211111111111111011101010101010101010101010
0010101010101010101010111011111111111121212222ddddceee4eee4eee4eee4eee3ccdd22222212111111111101010101010101010100010001000100000
10101010111011111111111111111111212121222222d2ddcdcc4e4e4e4e4e4e4e4e433ccdd2d222222121212111111111111110111010101010101010101010
1010101010101010101011101111111111112121222222d2ddcc3eee4eee4eee4eeebccdcdd2d221212121111111111010101010101010101010100010001000
1010101010101011101111111111112121212122222222ddddcccc4e4e4e4e4e4e433ccdcdd2d222212121211111111111111011101010101010101010101010
0010101010101010101010111011111111111121212222d2ddddcc3eee4eee4eee3ccccdd2d22221212111111111101010101010101010101010001000100000
10101010111011111111111111112111212122222222d2d2ddddcccc3e4e4e4eb33ccccdddd2d222222121212111111111111110111010101010101010101010
101010101010101010101110111111111111212122222222ddddcdcccc3c333c3ccdcdddd2d22221212121111111111010101010101088801010100010001000
1010101010111011111111111111112121212122222222d2ddddcdcccc3c3c3ccccdcdddd2d22222212121211111111111111011101888881010101010101010
0010101010101010101010111111111111212121212222d2d2ddddcdcdcccdcccdcdddd2d2222121212111111111101010101010108888888010001000100000
10101010111011111111111111112121212122222222d2d2ddddcdcdcccccccdcdcdddd2d2d22222222121212111111111111110188888888010101010101010
101010101010101010101111111111112121212122222222d2d2ddddcdcdcdcdcdddddd2d2222221212121111111111010558888808888888010100010001000
1010101010111011111111111111112121212122222222d2d2ddddcdcdcdcdcdddddd2d2d2d22222212121211555555555555011101888881010101010101010
0010101010101010101010111111111111212121222222d2d2ddddddddddddddddddd2d222555555555555555555101010101010101088801010001000100000
10101010111011111111111111112121212122222222d2d2ddddddcdcdc555555555555555555522212121212111111111111110111010101010101010101010
10101010101010101010111111111111212121222222d2d2d55555555555555dddd2d2d2d2222221212121111111111010101010101010101010100010001000
101010101011101111111111111111212122222222d2d25555555dcdcdcdcdcdddddd2d2d2d22222212121211111111111111011101010101010101010101010
00101010101010101010101111111111112121222225555555ddddcdcdcdcdcdddddd2d222222121212111111111101010101010101010100010001000100000
10101010111011111111111111112121222222555555555dcdcdcccccccccccdcdddddd2d2d22222222121212111111111111110111010101010101010101010
101010101010101010101111111111112125555552d2ddddcdcdcccccccccdcdcdddddd2d2222221212121111111111010101010101010101010100010001000
1010101010111011111111111121212125555552d2ddddcdcdcccc3c3c3ccccccdcdddddd2d22222212121211111111111111011101010101010101010101010
001010101010101010111011111111212555222222ddddcdcccc3c3c3c3ccccccdcdddd2d2222121212111111111101010101010101010100010001000100000
10101010111011111111111121212125555522d2ddddcdcc3c3333b3b333333c3ccdcdddd2d2d222222121212111111111111110111010101010101010101010
1010101010101010111011111111555555222222ddddcdcc3333b3b3bbb3b33c3ccdcdd2d2222221212121111111111010101010101010101010100010001000
10101010101110111111111111255555222222ddddcdcc3333bbabaaababbbb33c3ccdcdd2d22222212121211111111111111011101010101010101010101010
00101010101010101011101111185121212222d2ddcdcc33b3abaa9a9a9aabb33c3ccdcdd2d22221212111111111101010101010101010100010001000100000
101010101110111111111111212121212222d2ddcdcc3333aa998888e8899aabb33c3ccdddd2d222222121212111111111111110111010101010101010101010
101010101010101011101111111121212222d2ddddcc33bbaa98e22222fee99aab3c3ccdddd2d221212121111111111010101010101010101010100010001000
101010101011101111111111112121222222d2ddcdcc33aa99e222222222fe89abb33ccdcdd2d222212121211111111111111011101010101010101010101010
00101010101010101011111111111121212222ddcdcc3baa82222222222222f89ab33ccdddd22222212111111111101010101010101010100010001000000000
101010101110111111111111212121222222ddddcc33bb99222222222222222e89abb33ccdd2d222222121212111111111111110111010101010101010101010
101010101010101011101111111121212222ddddcc33ba98222222222222222fe9abb3cccdd2d222212121111111111010101010101010101010100010001000
1010101010111011111111111121212222d2ddcdcc33aa822222222222222222f89ab33ccdddd2d2222121211111111111111011101010101010101010101010
001010101010101010111111111111212222d2ddcc33aa822222222222222222789ab33ccdd2d222212111111111101010101010101010100010001000000000
1010101011101111111111112121222222d2ddcd33bba92222222222222222222e8aa33ccdddd2d2222121212111111111111110111010101010101010101010
101010101010101011101111111121212222ddddcc3ba92222222222222222222f8aa33ccdd2d222212121111111111010101010101010101010100010001000
1010101010111011111111111121212222d2ddccccbba92222222222222222222f8aa33ccdddd2d2222121211111111111111010101010101010101010101010
001010101010101010111011111111212222d2ddcc3ba92222222222222222222e8ab33ccdd2d222212111111111101010101010101010100010001000000000
1010101011101111111111112121212222d2ddcd33bb992222222222222222222f8aa33ccdddd222222121212111111111111110111010101010101010101010
101010101010101011101111111121212222ddddcc33a9e222222222222222227e8ab33ccdd2d222212121111111111010101010101010101000100010001000
1010101010111011111111111121212222d2ddcdcc3baa822222222222222222789ab33ccdddd222212121211111111111111010101010101010101010101010
001000101010101010111011111111212122d2ddcc33ba8e2222222222222227f99bbc3ccdd22222212111111111101010101010101010100010001000000000
101010101110111111111111212121222222ddddcc33ba98222222222222222fe9abb33ccdd2d222222121212111111111101110101010101010101010101010
101010101010101010101111111121212222d2ddccccbba9e2222222222222f88aa33ccdddd22221212121111110111010101010101010101000100010001000
101010101010101111111111112121212222d2ddcdcc33aa88f2222222227fe99bb33ccdddd22222212121211111111110111010101010101010101010101010
00100010101010101010101111111121212222ddddcc33bba98ef222227fe88aabbccdcdd2d22221212111111011101010101010101000100010000000000000
101010101010111111111111111121212222d2ddddcc33bbaa99eeeefee8899bb33ccccdddd2d222212121111111111111101110101010101010101010101010
1010101010101010101011111111111121222222ddddcc33bbaa9999899a9ab3b33ccdd2d2222221211111111110101010101010101010101000100010001000
10101010101010111011111111111121212222d2ddcdcc3333bbaaaaaaababb33ccccdddd2d22221212111111111111110111010101010101010101010101010
0010001010101010101010111111111111212222d2ddddcc3c33b3bbbbb3333ccccdd2d222222121111111111010101010101010101000100010000000000000
1010101010101110111111111111212121222222d2ddcdcccc333333b333333ccccdddd2d2222221212121111111111111101110101010101010101010101010
100010101010101010101110111111112121222222d2ddddcccc3c3c3c3ccccdcdddd22222212121211111111110101010101010101010001000100010000000
101010101010101110111111111111212121222222d2ddddcdcccccccccccdcdddddd2d222222121212111111111101110101010101010101010101010101010
0010001000101010101010101011111111212122222222d2ddddddcdcdcdddddd2d2222221212121111110111010101010101010101000100010000000000000
10101010101011101111111111111111212122222222d2d2ddddcdddcdddddddd2d2d22222212121211111111111111011101010101010101010101010101010
100010101010101010101010111111111111212122222222d2d2ddd2ddd2d2d2d222222121212111111111101010101010101010101010001000100010000000
1010101010101010101110111111111111212121212222d2d2d2d2d2d2d2d2d22222222221212121111111111111101110101010101010101010101010101010
00100010001010101010101010111011111111212121212222222222222222222221212121211111111110101010101010101010001000100000000000000000
__sfx__
000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
000100002101021020210302104021050210602107000000000000000000000050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
000200001a03002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0104000015520165201752018520195201a5201b5201c5201d5201e5201f520205202152022520235202452025520265202752028520295202a5202b5202c5202d5202e5202f5203052031520325203352034520
0104000015720167201772018720197201a7201b7201c7201d7201e7201f720207202172022720237202472025720267202772028720297202a7202b7202c7202d7202e7202f7203072031720327203372034720
000d0000106430e033090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
011100001305302670026600265002650026400264002640026300263002623026000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
010700002b6201261013033024001f400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000