-
Notifications
You must be signed in to change notification settings - Fork 0
/
chess.p8
1242 lines (1163 loc) · 67.1 KB
/
chess.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
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
pico-8 cartridge // http://www.pico-8.com
version 8
__lua__
-- chessquest v0.5
-- by dakerfp
-- todo:
--- check for ember chain reaction
--- add beholder
--- add cocatrice
--- add freeze magic
--- add coins
--- add treasures
--- decide for 8x8 or 16x16
--- add dragon boss
--- add snake boss
--- add shield mechanics
--- add 2d metamap
--- shake cam and earthquake
flag_wall = 0
flag_stairs = 1
flag_trap = 2
u = 8 -- unit
map_width = 11
map_height = 8
e_player = 33
e_bat = 49
e_red_bat = 51
e_slime = 57
e_fire_elem = 25
e_skeleton = 59
e_kobold = 37
e_ghost = 39
e_wizard = 55
e_dead = 4
e_ember = 41
e_knight = 43
e_dead_slime = 5
e_dead_skel = 6
e_floor_trap = 61
e_spinner = 20
p = {t=e_player,atk=1,x=u,y=u,vx=u,cx=u,cy=u,hp=3,slow=false}
t = 0
dead_bodies = {}
enemies = {}
traps = {}
particles = {}
function randomize_section(from, to)
-- 5 diff level parts
my = flr(1 + rnd(7)) * map_height
for y=0,map_height-1 do
for x=from,to do
mset(x,y,mget(x,my+y))
if its_a_trap(x, y) then
add(traps, {x=x*u, y=y*u, i=0, t=3}) -- xxx: t=0
end
end
end
end
function cast_shadow(x,y)
v = mget(x,y)
return fget(v,flag_wall) or fget(v,flag_stairs)
end
function randomize_map()
randomize_section(1,3)
randomize_section(4,6)
randomize_section(7,10)
-- build shadow
for y=0,10 do
for x=0,9 do
s = 64
if cast_shadow(x,y) then
mset(x+11,y,s)
else
right=cast_shadow(x+1,y)
up=cast_shadow(x,y-1)
lcor=cast_shadow(x-1,y-1)
rcor=cast_shadow(x+1,y-1)
if right and up then
s = 113
elseif right then
if rcor then s=112 else s=114 end
elseif up then
if rcor then s = 116 else s = 117 end
elseif rcor then
s = 115
end
mset(x+11,y,s)
end
end
end
end
function eq_pos(a,b)
return a.x == b.x and a.y == b.y
end
function fetch_next_enemy(cost)
cost_table = {
{e_bat, 1}, -- bat must come first
{e_spinner, 3},
{e_red_bat, 3},
{e_slime, 3},
{e_fire_elem, 5},
{e_skeleton, 3},
{e_wizard, 5},
{e_kobold, 5},
{e_ember, 5},
{e_ghost, 7},
{e_knight, 7},
}
i = 1 + flr(rnd(#cost_table) + 4) % #cost_table
while i > 0 do
row = cost_table[i]
if row[2] <= cost then
return row[1], row[2]
end
i -= 1
end
return e_dead, 0 -- should never happen
end
function init_random_level(cost)
enemies={}
dead_bodies = {}
traps = {}
randomize_map() -- xxx
p = {x=u,y=5*u,vx=u,cx=u,cy=5*u, hp=3, atk=1}
while cost > 0 do
-- 2x more probable to fit in 2nd half
x = flr(9 - rnd(9 + 4) % 9) * u
y = flr(rnd(7)) * u
vx = 1 - 2 * flr(rnd(2)) -- 1 or -1
vy = 1 - 2 * flr(rnd(2)) -- 1 or -1
def = 0
s = flr(rnd(2)) -- state 0 or 1
e = {x=x, y=y, vx=vx*u, vy=vy*u, def=def, state=s}
if not hits_wall(x, y)
and get_enemy_at(x,y) == nil
and dist2(p, e) > 2*u*u
then
-- xxx
tp, c = fetch_next_enemy(cost)
if tp == e_spinner or tp == e_fire_elem then
def = 1
end
cost -= c
e.t = tp
add(enemies, e)
end
end
end
function move_red_bat(e)
if p.x < e.x then
e.vx = -u
elseif p.x > e.x then
e.vx = u
end
if can_move_to(e,e.x+e.vx,e.y) then
return e.x + e.vx, e.y
end
return e.x, e.y
end
function move_bat(e)
if can_move_to(e,e.x+e.vx,e.y) then
return e.x + e.vx, e.y
else
e.vx = -e.vx
end
return e.x, e.y
end
function move_spinner(e)
if can_move_to(e,e.x+e.vx,e.y+e.vy) then
-- keep going
elseif can_move_to(e,e.x+e.vx,e.y-e.vy) then
e.vy = -e.vy
elseif can_move_to(e,e.x-e.vx,e.y+e.vy) then
e.vx = -e.vx
else
e.vx = -e.vx
e.vy = -e.vy
end
return e.x + e.vx, e.y + e.vy
end
function move_slime(e)
return move_closest(e, {
{x=e.x-u,y=e.y },
{x=e.x+u,y=e.y },
{x=e.x ,y=e.y-u},
{x=e.x ,y=e.y+u}}, false)
end
function move_fire_elem(e)
return move_closest(e, {
{x=e.x-u,y=e.y },
{x=e.x+u,y=e.y },
{x=e.x ,y=e.y-u},
{x=e.x ,y=e.y+u}}, false)
end
function get_random_enemy()
return enemies[flr(rnd(#enemies)) + 1]
end
function move_wizard(e)
if e.other != nil then
o.def -= 1
o.shield = false
end
while #enemies > 1 do
o = get_random_enemy()
if o != e then
o.def += 1
o.shield = true
e.other = o
break
end
end
return move_closest(e, {
{x=e.x-u,y=e.y },
{x=e.x+u,y=e.y },
{x=e.x ,y=e.y-u},
{x=e.x ,y=e.y+u}}, false)
end
function dist2(a, b)
dx, dy = a.x-b.x, a.y-b.y -- xxx: see if is required to add preference to vertical axis
return dx*dx+dy*dy
end
function move_skeleton(e)
return move_closest(e, {
{x=e.x-u,y=e.y-u},
{x=e.x-u,y=e.y+u},
{x=e.x+u,y=e.y-u},
{x=e.x+u,y=e.y+u}}, false)
end
function move_kobold(e)
if e.state == 0 then
e.state = 1
return move_closest(e, {
{x=e.x-u,y=e.y-u},
{x=e.x-u,y=e.y+u},
{x=e.x+u,y=e.y-u},
{x=e.x+u,y=e.y+u}}, true)
else
e.state = 0
return move_closest(e, {
{x=e.x,y=e.y-u},
{x=e.x,y=e.y+u},
{x=e.x+u,y=e.y},
{x=e.x+u,y=e.y}}, true)
end
end
function move_ghost(e)
return move_closest(e, {
{x=e.x-u,y=e.y-2*u},
{x=e.x-u,y=e.y+2*u},
{x=e.x+u,y=e.y-2*u},
{x=e.x+u,y=e.y+2*u},
{x=e.x-2*u,y=e.y-u},
{x=e.x-2*u,y=e.y+u},
{x=e.x+2*u,y=e.y-u},
{x=e.x+2*u,y=e.y+u}}, true)
end
function move_knight(e)
return move_closest(e, {
{x=e.x-u,y=e.y},
{x=e.x-u,y=e.y+u},
{x=e.x-u,y=e.y-u},
{x=e.x,y=e.y},
{x=e.x,y=e.y+u},
{x=e.x,y=e.y-u},
{x=e.x+u,y=e.y},
{x=e.x+u,y=e.y+u},
{x=e.x+u,y=e.y-u}}, true)
end
function move_ember(e)
tries = {
{x=e.x-u,y=e.y},
{x=e.x+u,y=e.y},
{x=e.x,y=e.y-u},
{x=e.x,y=e.y+u}
}
if can_move_to(e,e.x+u,e.y) then
add(tries,{x=e.x+2*u,y=e.y})
end
if can_move_to(e,e.x-u,e.y) then
add(tries,{x=e.x-2*u,y=e.y})
end
if can_move_to(e,e.x,e.y-u) then
add(tries,{x=e.x,y=e.y-2*u})
end
if can_move_to(e,e.x,e.y+u) then
add(tries,{x=e.x,y=e.y+2*u})
end
return move_closest(e, tries, true)
end
function move_closest(e, tries, flp)
md = 1000*1000
x, y = e.x, e.y
for try in all(tries) do
if can_move_to(e,try.x,try.y) then
d = dist2(p, try)
if d < md or (d == md and rnd(2) > 1) then
to, md = try, d
if flp then
e.vx += sgn(try.x - e.x) * u
end
x, y = try.x, try.y
end
end
end
return x, y
end
function get_enemy_at(x,y)
for e in all(enemies) do
if eq_pos(e,{x=x,y=y}) then
return e
end
end
return nil
end
function is_killable(e)
return e.def < p.atk
end
function can_move_to(e,x,y)
return not hits_wall(x,y) and (get_enemy_at(x,y) == nil)
and x >= 0 and x <= 10*u and y >= 0 and y <= 8*u
end
function hits_wall(x,y)
val = mget(x/u,y/u)
return fget(val, flag_wall)
end
function hits_stairs(x,y)
val = mget(x/u,y/u)
return fget(val, flag_stairs)
end
function its_a_trap(x,y)
val = mget(x,y)
return fget(val, flag_trap)
end
function _init()
level = 0
curr_state = s_home
end
cursor_state = 0
dpressed = false
function move_cursor(p)
s_center, s_left, s_right, s_up, s_down,
s_left2, s_right2, s_up2, s_down2 = 0,1,2,3,4,5,6,7,8
if dpressed then
-- ignore
elseif cursor_state == s_center then
if btn(0) and not hits_wall(p.cx - u, p.cy) then
p.cx -= u
cursor_state = s_left
elseif btn(1) and not hits_wall(p.cx + u, p.cy) then
p.cx += u
cursor_state = s_right
elseif btn(2) and not hits_wall(p.cx, p.cy - u) then
p.cy -= u
cursor_state = s_up
elseif btn(3) and not hits_wall(p.cx, p.cy + u) then
p.cy += u
cursor_state = s_down
end
elseif cursor_state == s_left then
if btn(0) and can_move_to(p,p.cx,p.cy) and not hits_wall(p.cx - u, p.cy) and not p.slow then
p.cx -= u
cursor_state = s_left2
elseif btn(1) then
p.cx += u
cursor_state = s_center
end
elseif cursor_state == s_right then
if btn(1) and can_move_to(p,p.cx,p.cy) and not hits_wall(p.cx + u, p.cy) and not p.slow then
p.cx += u
cursor_state = s_right2
elseif btn(0) then
p.cx -= u
cursor_state = s_center
end
elseif cursor_state == s_up then
if btn(2) and can_move_to(p,p.cx,p.cy) and not hits_wall(p.cx, p.cy - u) and not p.slow then
p.cy -= u
cursor_state = s_up2
elseif btn(3) then
p.cy += u
cursor_state = s_center
end
elseif cursor_state == s_down then
if btn(3) and can_move_to(p,p.cx,p.cy) and not hits_wall(p.cx, p.cy + u) and not p.slow then
p.cy += u
cursor_state = s_down2
elseif btn(2) then
p.cy -= u
cursor_state = s_center
end
elseif cursor_state == s_left2 then
if btn(1) then
p.cx += u
cursor_state = s_left
end
elseif cursor_state == s_right2 then
if btn(0) then
p.cx -= u
cursor_state = s_right
end
elseif cursor_state == s_up2 then
if btn(3) then
p.cy += u
cursor_state = s_up
end
elseif cursor_state == s_down2 then
if btn(3) then
p.cy -= u
cursor_state = s_down
end
end
if p.cx > p.x then
p.vx = u
elseif p.cx < p.x then
p.vx = -u
end
dpressed = btn(0) or btn(1) or btn(2) or btn(3)
if btn(4) then
cursor_state = s_center
p.slow = false
return true
end
return false
end
function update_animation()
t += 1 -- time for animation
t = t % 64
for part in all(particles) do
part.t += part.dt
if part.t > 1 then
if part.after != nil then part.after() end
del(particles, part)
end
end
end
function burn(x,y)
particle_explosion(x, y, u/2, function()
e = get_enemy_at(x,y)
if e != nil then
kill(e)
elseif eq_pos(p,{x=x,y=y}) then
die()
end
end)
end
function kill(e)
if e.t == e_ember then
particle_explosion(e.x, e.y, u * 1.5, function()
burn(e.x + u, e.y)
burn(e.x - u, e.y)
burn(e.x, e.y + u)
burn(e.x, e.y - u)
end)
elseif e.t == e_fire_elem then
particle_explosion(e.x, e.y, u * 1.5, function()
burn(e.x + u, e.y)
burn(e.x - u, e.y)
burn(e.x, e.y + u)
burn(e.x, e.y - u)
burn(e.x + u, e.y + u)
burn(e.x - u, e.y + u)
burn(e.x + u, e.y - u)
burn(e.x - u, e.y - u)
end)
elseif e.t == e_wizard and e.other != nil then
e.other.shield = false
e.other.def -= 1
elseif e.t == e_slime and p.x == e.x and e.y == e.y then
p.slow = true
end
add(dead_bodies, e)
del(enemies, e)
sfx(11)
end
function die()
show_player = false
p.hp = 0
end
-- states --
function s_idle()
_draw = draw_game
update_animation()
show_hint = true
if move_cursor(p) then
show_hint = false
return s_player
end
return s_idle
end
function s_player()
_draw = draw_game
update_animation()
sfx(10)
return animate(p,p.cx,p.cy,function ()
e = get_enemy_at(p.x,p.y)
if e != nil then
if is_killable(e) then
kill(e)
else
die()
end
end
return s_traps
end)
end
function s_die()
_draw = draw_game
sfx(12)
update_animation()
return s_dead
end
function s_dead()
_draw = draw_game_over
update_animation()
if btn(4) and btn(5) then
_init()
end
return s_dead
end
function s_traps()
_draw = draw_game
for trap in all(traps) do
trap.i = (trap.i + 1) % trap.t
if trap.i == 0 then
sfx(14)
e = get_enemy_at(trap.x,trap.y)
if e != nil and e.t != e_spinner then
kill(e)
elseif eq_pos(trap,p) then
die()
return s_die
end
end
end
return s_enemies
end
idx = 1
function s_enemies()
_draw = draw_game
update_animation()
if #particles > 0 then -- end all animations before proceeding
return s_enemies
end
if idx > #enemies then
idx = 1
return s_check
end
e = enemies[idx]
idx += 1
sfx(13)
if e.t == e_bat then
return animate_move(e, move_bat)
elseif e.t == e_red_bat then
return animate_move(e, move_red_bat)
elseif e.t == e_spinner then
return animate_move(e, move_spinner)
elseif e.t == e_slime then
return animate_move(e, move_slime)
elseif e.t == e_skeleton then
return animate_move(e, move_skeleton)
elseif e.t == e_kobold then
return animate_move(e, move_kobold)
elseif e.t == e_ghost then
return animate_move(e, move_ghost)
elseif e.t == e_ember then
return animate_move(e, move_ember)
elseif e.t == e_fire_elem then
return animate_move(e, move_fire_elem)
elseif e.t == e_knight then
return animate_move(e, move_knight)
elseif e.t == e_wizard then
return animate_move(e, move_wizard)
end
return s_enemies
end
function animate_move(e, move)
x, y = move(e)
saved_state = curr_state
return animate(e,x,y, function()
if eq_pos(e,p) then
die()
elseif e.t == e_spinner then
for o in all(enemies) do
if o != e and eq_pos(o,{x=x,y=y}) then
kill(o)
end
end
end
return saved_state
end)
end
function animate(e, tx, ty, after)
a, fs = 0, 8 -- frames
fx, fy = e.x, e.y
f = function()
_draw = draw_game
update_animation()
a += 1
if a >= fs then
e.x, e.y = tx, ty
return after
end
e.x = (fx * (fs - a) + tx * a) / fs
e.y = (fy * (fs - a) + ty * a) / fs
return f
end
return f
end
function s_check()
_draw = draw_game
if p.hp == 0 then
return s_die
elseif hits_stairs(p.x,p.y) then
sfx(9)
return s_next_level
end
return s_idle
end
level = 0
function s_next_level()
level += 1
if level > 10 then
return s_dead
end
enemies = {}
particles = {}
init_random_level(3 * level)
return s_idle
end
function s_home()
_draw = draw_home
update_animation()
if btn(4) and not btn(5) then
return s_next_level
end
return s_home
end
show_hint = true
function draw_hint(x, y)
if hits_wall(x,y) then
spr(17, x, y)
else
spr(19, x, y)
end
end
curr_state = s_home
_draw = draw_home
function _update()
curr_state = curr_state()
end
function particle_explosion(x,y,r,after)
x,y =off.x+x+4, off.y+y+2
add(particles, {t=0.2,dt=0.1,after=after,draw=function(t)
circfill(x,y,r*t+1,8)
circfill(x,y,r*t,10)
end})
end
function spr_bg_color(s)
if s == e_skeleton or
s == e_kobold or
s == e_ember or
s == e_knight or
s == e_wizard
then
return 11
end
return 0
end
off = {x=20, y=30}
function draw_game()
cls()
mapdraw(0, 0, off.x, off.y, 11, 8) -- tiles
mapdraw(22,0, off.x, off.y, 11, 8) -- map
mapdraw(11,0, off.x, off.y, 11, 8) -- shadow
ds = (t%64) / 16
-- draw possible moves?
-- draw cursor
if show_hint then
if p.cx > p.x then
p.vx = u
elseif p.cx < p.x then
p.vx = -u
end
draw_hint(off.x + p.cx, off.y + p.cy)
end
for e in all(dead_bodies) do
s = e_dead
if e.t == e_slime then
s = e_dead_slime
elseif e.t == e_skeleton then
s = e_dead_skel
end
spr(s, off.x + e.x, off.y + e.y - 2,
1, 1, (e.vx > 0))
end
for trap in all(traps) do
if trap.i == 0 then
spr(e_floor_trap, off.x+trap.x,off.y+trap.y,1,1)
elseif trap.i == 2 then
spr(e_floor_trap+1, off.x+trap.x,off.y+trap.y,1,1)
end
end
for e in all(enemies) do
s = e.t + ds/2
bg = spr_bg_color(e.t)
palt(0, false)
palt(bg, true)
spr(s, off.x+e.x, off.y+e.y - 2,
1, 1, (e.vx > 0))
palt(bg, false)
palt(0, true)
if e.shield == true then
circ(off.x+e.x+4,off.y+e.y+2, 5+ds, 12)
end
end
if p.hp > 0 then
spr(33 + ds, off.x+p.x, off.y+p.y - 2, 1, 1, (p.vx > 0))
end
for part in all(particles) do
part.draw(part.t)
end
end
function draw_home()
cls()
mapdraw(0, 0, 20, 30, 11, 8) -- tiles
print('chessquest', 45, 44)
if t % 32 < 16 then
print('press \142 to play', 34, 44 + 2 * u)
end
end
function draw_game_over()
death_msg = 'game over'
if p.hp > 0 then
death_msg = 'you win!'
end
cls()
spr(33, 64, 64)
print(death_msg, 50, 44)
end
__gfx__
000000000000000000a7aa0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000088088000a0000a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
000000008888878000a7aa0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000088888880000a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000008888800000a0000000000000020020000b00b0000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000888000000aa00006760000022220020bbbb00b76007007000000000000000000000000000000000000000000000000000000000000000000000000
0000000000080000000a000006067666022022200bb0bbb000506650000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000aa0000666060600020000000b000007060700000000000000000000000000000000000000000000000000000000000000000000000000
000000007770077777000077aaa00aaa0007000000007000000000000000000000000000a22222aaa88888aa0000000000000000000000000000000000000000
000000007000000770000007a000000a00088700007880000000000000000000000000000a2a2aa00a8a8aa00000000000000000000000000000000000000000
000000007000000700000000a000000a078888000088887000000000000000000000000000aaaa0000aaaa000000000000000000000000000000000000000000
00000000000000000000000000000000088a888778889880000000000000000000000000009999a0909999a00000000000000000000000000000000000000000
000000000000000000000000000000007888a8800889888700000000000000000000000009999998099999920000000000000000000000000000000000000000
000000007000000700000000a000000a008888700788880000000000000000000000000090999909009999090000000000000000000000000000000000000000
000000007000000770000007a000000a0078800000088700000000000000000000000000009999a0009999a00000000000000000000000000000000000000000
000000007770077777000077aaa00aaa000070000007000000000000000000000000000000900900009009000000000000000000000000000000000000000000
00000000003333000033330000333300003333006b5bb5bb6b5bb5bb0077700000000000bbbbbbbbbbbbbbbbb0bb0babb0bb0bab000000000000000000000000
00000000033330000333300003333000033330006b5555bb6b5555bb0777770000777000b9999bbbb9999bbbb0000aaab0000aaa007070000070700000000000
0000000001f1900001f1900001f1900001f190004b0505bb4b0505bb7474477007777700b0909bbbb0909bbbb5550b0bb5550b0b044444440444444400000000
000000000fff94000fff94000fff94000fff94004b5555bb4b5555b57777777074744770b9999babb9999b8bb0500b0bb0500b0b00a4a44000a4a44000000000
00000000003344400033444000334440003344404566775b4566775b7788777077777770bb449b8bbb449bab0000000b0000000b004444000044440000000000
000000000fb44a4400b44a440fb44a4400b44a444b6677b54b6677bb0778777077887770bbaa949bbbaa949bb0000b0bb0000b0b005555400055554000000000
00000000003344400f334440003344400f3344404b4444bb4b4444bb0077777707887770bba949bbbba949bbb0000b0bb0000b0b040444040404440400000000
00000000003034000030340000303400003034004b5bb5bb4b5bb5bb0000000000777777bb9b9bbbbb9b9bbbb0bb0b0bb0bb0b0b000404000004040000000000
00000000000000000000000000000000000400400044450000444450bbbbb999bbbbb9990000000000000000bbbbbbbbbbbbbbbb000000000000000000000000
00000000000000000020000200000000044000040555544005555544bbbbbbc9bb444bc900777b0000000000bbbbbbbbbb6777bb006000700000000000000000
00000000222022200200002244404440440000440707744007077744bb444b99b480849907773bb00077bb00bb6777bbb506707b066007700000000000000000
0000000002aa11022220222004882244444044440777444004444444b480849bb400049b077333b007773bb0b506707bb560077b066007700660066000000000
000000000011000002aa110000224004048822400444444000444440b400049bb444449b073333b0077333b0b560077bbb5667bb007000600000000000000000
00000000000000000011000000000000002240000044440000000000bb44490bbb44490b0b3333b00b3333b0bb5667bbb6b56b7b077006600000000000000000
00000000001100000000000000110000000000000000000000111100b044494bb044494b0bb33bb00bb33bb0b6b56b7bbbb56bbb077006600660066000000000
00000000011110000111100001111000011110000111111001111110b0444944b0444944bbbbbb33bbbbb333bb6bb7bbbb6bb7bb000000000000000000000000
00000000dddddddd22222222222222225555d55d1111d5d5222222225d5d111122222222dddddddd555555550000000000000000000000000000000000000000
00000000dddddddd2222222222222222dd5ddddd11d5d5d5222222225d5d5d1122222222dddddddd555555550000000000000000000000000000000000000000
00000000dddddddd2222222222222222d5555dddd5d5d5d5222222225d5d5d5d22222222dddddddd555555550000000000000000000000000000000000000000
00000000dddddddd2222222222222222ddddddddd5d5d5d5222222225d5d5d5d22222222dddddddd555555550000000000000000000000000000000000000000
00000000dddddddd0000000022222222ddddddddd5d5d50000000000005d5d5d00000000dddddddd555555550000000000000000000000000000000000000000
00000000dddddddd0000000022222222ddd5555dd5d500000000001100005d5d11000000dddddddd555555550000000000000000000000000000000000000000
00000000dddddddd0000000022222222ddddd5ddd5000000000011110000005d111100005dddddddd55555550000000000000000000000000000000000000000
00000000dddddddd0000000022222222d555dddd00000000001111d5000000005d11110055555555dddddddd0000000000000000000000000000000000000000
55555555000000000000000000000000000000550000000055555555555555550000000000000000000000000000000000000000000000000000000000000000
55555555000000000000000000000000000000550000000555555555055555550000000000000000000000000000000000000000000000000000000000000000
55555555000000000000000000000000000000550000005500000055000000550000000000000000000000000000000000000000000000000000000000000000
55555555000000000000000000000000000000550000005500000055000000550000000000000000000000000000000000000000000000000000000000000000
55555555000000000000000000000000000000550000005500000055000000550000000000000000000000000000000000000000000000000000000000000000
55555555000000000000000000000000000000550000005500000055000000550000000000000000000000000000000000000000000000000000000000000000
55555555000000000000000000000000000000550000005500000055000000550000000000000000000000000000000000000000000000000000000000000000
55555555000000000000000000000000000000550000005500000055000000550000000000000000000000000000000000000000000000000000000000000000
555505500000000055555055000000000000000000000000dddd0dd000000000ddddd0dd00000000000000000000000030033333000000000000000000000000
00500000000550555500555000000000000000000000000000d00000000dd0dddd00ddd000000000000000000000000030330000000000000000000000000000
0555500000005550500000000000000055550000000000000dddd0000000ddd0d000000000000000dddd00000003300033000000000000000000000000000000
0000000000000500500000000000000000000000000000000000000000000d00d000000000000000000000000000333003000000000000000000000000000000
000000000550055050000000000000050000000000000033000000000dd00dd0d00000000000000d000000000030000003000000000000000000000000000000
000555505500005050000000000500000000000033000330000dddd0dd0000d0d0000000000d0000000000000030000033000000000000000000000000000000
00000500000500505000000000000000000000000330000000000d00000d00d0d000000000000000000000000330000030000000000000000000000000000000
0555000000000000000000000000000000000000000000000ddd0000000000000000000000000000000000000000000000000000000000000000000000000000
00000011111111110000000000000011111111111111111000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000011111111110000000100000011111111111111110000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000011000000110000001100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000011000000110000001100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000011000000110000001100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000011000000110000001100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000011000000110000001100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000011000000110000001100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
34242424242424242464340000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
66666666666666660000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
34140514051405140554340000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
66555555555556660000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
34051405140514051405340000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
66656566666666660000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
34140514051405140514340000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
66666666666666660000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
34051405140514051405340000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
66666666666555550000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
34140514051405140514340000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
66665555555555550000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
34343434343434343434340000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
66666666656665660000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
34343434343434343434340000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
66666666666666660000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
34242424242424242464340000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
34140514051405140554340000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
34059405143414051434340000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
34140514243424140534340000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
34059405142414051424340000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
34140514051405140514340000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
34343434343434343434340000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
34343434343434343434340000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
34343434242424242464340000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
34242424051405140554340000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
3405140514a414051405340000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
34140514a414a4140514340000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
3405140514a414051405340000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
34140514051405343434340000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
34343434343434343434340000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
34343434343434343434340000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
34242424242424242464340000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
34940514059405140554340000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
34a414051405140514a4340000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
34940514051405140594340000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
34a414051405140514a4340000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
34140514059405140594340000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
34343434343434343434340000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
34343434343434343434340000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
__label__
dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd