From c4b6b2b06c42bdeafe737d6235ad9aee398e0887 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Re=CC=81mi=20Parmentier?= Date: Mon, 21 Nov 2022 21:58:39 +0100 Subject: [PATCH] feat: add first version --- .gitignore | 5 + README.md | 7 +- Source/Assets/pico.fnt | 104 ++ Source/Assets/sprites-table-8-8.png | Bin 0 -> 2275 bytes Source/Scripts/celeste.lua | 1431 +++++++++++++++++++++++++++ Source/Scripts/map.lua | 66 ++ Source/Scripts/pico-8.lua | 227 +++++ Source/main.lua | 31 + Support/classic.lua | 1429 ++++++++++++++++++++++++++ Support/map.png | Bin 0 -> 64673 bytes Support/spritesheet.png | Bin 0 -> 9615 bytes 11 files changed, 3298 insertions(+), 2 deletions(-) create mode 100644 Source/Assets/pico.fnt create mode 100644 Source/Assets/sprites-table-8-8.png create mode 100644 Source/Scripts/celeste.lua create mode 100644 Source/Scripts/map.lua create mode 100644 Source/Scripts/pico-8.lua create mode 100644 Source/main.lua create mode 100644 Support/classic.lua create mode 100644 Support/map.png create mode 100644 Support/spritesheet.png diff --git a/.gitignore b/.gitignore index 6fd0a37..3f10bf6 100644 --- a/.gitignore +++ b/.gitignore @@ -39,3 +39,8 @@ luac.out *.x86_64 *.hex +# Playdate +*.pdx +*.psd +Support/audio +*.sublime-* diff --git a/README.md b/README.md index a904999..4c3cef2 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,5 @@ -# celeste -A port of Celeste Classic to Playdate +# Celeste + +A port of Celeste Classic from PICO-8 to Playdate. + +[Celeste Classic](https://mattmakesgames.itch.io/celesteclassic) is an original game on PICO-8 by Noel Berry and Matt Thorson. \ No newline at end of file diff --git a/Source/Assets/pico.fnt b/Source/Assets/pico.fnt new file mode 100644 index 0000000..28b9e07 --- /dev/null +++ b/Source/Assets/pico.fnt @@ -0,0 +1,104 @@ +--metrics={"baseline":2,"xHeight":3,"capHeight":0,"pairs":{},"left":[],"right":[]} +datalen=900 +data=iVBORw0KGgoAAAANSUhEUgAAAB4AAAAyCAYAAABLXmvvAAACaElEQVRYR61Xi27CMBCD//9oRisSOT7blzCQpnVpOd/D9nXPx+Pxev/w52nOx3Pu/nV+fVTMBWMEUL/Hg1cQDojAeG9c43eva37+lYAx664DqmOx8g5YVaAqHEliPAQu56eVjLZ1c3SznudcEbbMEUQlmwrge/ffHXAhxSczbje2enTDjSQCd9U6YMlgoYopE9fiX1a8ENDpLhnFLiETwaaOhXndR84oTnTLkp2BHRmGYyniIHAaB+t7FhOZBwxm29wBc8nd4B2wa/UOMM94abkjipwLlOCAkRdI3OL7jnmK1btVsgdIk8LKcJWpik+AlcEsZ9xqBuzA3EhUQYsEeQ67wIqxikzcxSndxFq3T9UM06sOz/iWppKTczF3jkazq5ICzLTn5aEk4sCGtLDd0bn4wa4DioDubMZS/UcNq4qVfSIfVKJFy7+aMRuOU8dMQOk4kYhlNOXxuZE22pKM0nGaaXq3UtxQHS1yYhaqBL4FLklJAw8lnwA727QGwnOa2qOEbBvfzzk/mLFdxSgZboD7J04Rjck4E1LASaepSsdwPI8Vs/d2JuLuI1nLEvlvBd0YOH6pOFWZDEWuPDATNeOb7cq5Tvbtzvc58QU4vRAk7br3bdZw2dlpfXV6VsHVsmBW36TjLcJMTJ2QAT/mcVSxcyhFLmSrNQnhdAurlRNxsFGdJMrVOmGT7gWwkEsFVxzgzqRnRqKWXEroCSC111VfXgScJLrKsENMUutYYyycXVel2rG8AtVKLDxyckLTUNeoV2ep8fwbYLVYjsETsLqHo+AFcQTugifrQ3c7AnPm0BEtOdhxAn8WJ3giA/0TGQAAAABJRU5ErkJggg== +width=3 +height=5 + +tracking=1 + +0 3 +1 3 +2 3 +3 3 +4 3 +5 3 +6 3 +7 3 +8 3 +9 3 +space 3 +� 3 +A 3 +B 3 +C 3 +D 3 +E 3 +F 3 +G 3 +H 3 +I 3 +J 3 +K 3 +L 3 +M 3 +N 3 +O 3 +P 3 +Q 3 +R 3 +S 3 +T 3 +U 3 +V 3 +W 3 +X 3 +Y 3 +Z 3 +: 2 +; 2 +! 2 += 3 +- 3 ++ 3 +~ 3 +@ 3 +# 3 +$ 3 +% 3 +^ 3 +? 3 +. 2 +_ 3 +] 3 +[ 2 +( 2 +) 3 +& 3 +' 2 +* 3 +, 2 +/ 3 +< 2 +> 3 +\ 3 +` 2 +| 2 +{ 3 +} 3 +a 3 +b 3 +c 3 +d 3 +e 3 +f 3 +g 3 +h 3 +i 3 +j 3 +k 3 +l 3 +m 3 +n 3 +o 3 +p 3 +q 3 +r 3 +s 3 +t 3 +u 3 +v 3 +w 3 +x 3 +y 3 +z 3 + diff --git a/Source/Assets/sprites-table-8-8.png b/Source/Assets/sprites-table-8-8.png new file mode 100644 index 0000000000000000000000000000000000000000..41a88b8e146351efde51f373e89b3632ea940787 GIT binary patch literal 2275 zcma)8c~leU7N21-NLVUR)N*P&#szIjGLtvd7KJNG82d-nV3u@?4W@4 zSrv*Ft*y@$weGlJmCfb3)K@puvWVdJo>owlDiTO}6A{}#JUwsD%s2PDbAR{#?)~mP zXO_jq&h}vjF#!PZiBT%z>35;)84c0vZ=L1+^y@t;Dv?ScbyOy1A%IypsUhGPBbG+Q z6BwSg@H`O;08pu3ok%6B=E}6Bk%PHxICi6%Mgu_TOuHG=W)KvtA=31wFxHdf4J=rX zhq2}fRfx(QNu=wQ*%l%pJ65gD&d^G6)=W7ZYM0Rtj0A$mD$5sul&kr*`?;P z;8!M8Mi^_DRH7;ljwCGvEavdoS_DC0v6O>qL_$m~)d)gh9>U{s5fK;Vvw1ujg3>qq z`eM-mEx1k=uZVsfj^2f_(kaR;<8m`IGdY=j4rxi_qEe}pi}1KS9-FpcTeD0QW@nqM zlSVu!2&>kjH&c4j1iL(98q!9Ev1qcxSs2YK)f>kq>+4$4RpZ(*GZ*C`T%*yI+AC`- z6;J#@;j(El>yq;z;QTHpXP7Fq4)TiLH0V9>$9P5-W?e5Ew;T)Ff#bX@t0Rk|M3? zq#5S%IYM}v3e)OMF3oh;DGevBAT0Vt1RiZ6jqs~7%k*!dz{dnQD$;1#h(Lm|1sEb> zOK>5|<_ido7DISav6xPO7?1y{e8ZheYv?r0BWz?s9j?O>zJx8tG(0vg5D3^3kyym0 zb%a!kAgB-(vbZ!wuB&tY)JY>Mx;*Z-$F7(Gz8%M<;qJe+oTzo^f;4QA0yR zv`DY{PgZ?OOAr+wn?UP+`N?M%0JvX@QOr`?Tf5eEe|r-iUGmP&p{UG&QNI6}%5Rf9 zwXG9+Zx_!C5BE4GyC?sxzbF4zow)H*LHfYPfuGtD&#pa6*+l82jZSCoR&mGDLySuR z@54T?(j~yY$_{ZpLk7K^H^cpWird=8TOu&OT`ugM|MiplzT?H}yybNrR~_{LQj~|Q zfQ})lpPR5S=J2te?;ak&KYVbc`tzSpJC9wko_Gv>9}(C9#aVO(i>t7P0_c-~hq22l zgW_5sxcHfor_M2mYJQhXdji9c_O)$!UOHeuRGGK8Cb?;16{=d5H8%xl&RIB=A#ZJa zR0Y0B^RN2#1duwVW?il=dxBrv=>-Q*Z9UYRBQYw+%^5iOXzUm%=NQ9#qt?eQXIcfy zt7fFL8i8)xo~HJ*x{Al(w^ww)y@#`d(j#UCL6BtYQhYVAm(Pxsj|;6VjLkqG?<-&%CME+jXv!+6o(bk=JWT$NjH6x>-k8)qo*p+4)~2Kj!e8}gqD zyvDz?E`YV|r~}*3yxVc7aru_mYtJJsL6gBnNuV;jg>rZTKeFd^_mcZpfC^Kk;g>1k zIYY^frZqOhnHv)d&n?*T=y?C%14ALee_Ly++f$H`F43LQq`Qw_>~Zr#n1AV&>B2JM zIPHAUyJNinm;K@Y4NP;gi$W z2$H}M$Zy66q9$b2=F7$28E38~B(Rc-@056YhhK>6l8pC;O= zxw5l*1w;aJrC(sgNzwo_I)VJ2TqNgIxn|XRwlNl=H yo-XL!){yglA!G)88$k)+(Fy#2n+9mmFBO=mPyguD8lPAH9Wha{ioFr3i~k3SYJn;M literal 0 HcmV?d00001 diff --git a/Source/Scripts/celeste.lua b/Source/Scripts/celeste.lua new file mode 100644 index 0000000..f980b01 --- /dev/null +++ b/Source/Scripts/celeste.lua @@ -0,0 +1,1431 @@ +-- globals -- +------------- + +room = { x=0, y=0 } +objects = {} +types = {} +freeze=0 +shake=0 +will_restart=false +delay_restart=0 +got_fruit={} +has_dashed=false +sfx_timer=0 +has_key=false +pause_player=false +flash_bg=false +music_timer=0 + +k_left=playdate.kButtonLeft +k_right=playdate.kButtonRight +k_up=playdate.kButtonUp +k_down=playdate.kButtonDown +k_jump=playdate.kButtonA +k_dash=playdate.kButtonB + +-- entry point -- +----------------- + +function _init() + title_screen() +end + +function title_screen() + got_fruit = {} + for i=0,29 do + add(got_fruit,false) + end + frames=0 + deaths=0 + max_djump=1 + start_game=false + start_game_flash=0 + music(40,0,7) + load_room(7,3) +end + +function begin_game() + frames=0 + seconds=0 + minutes=0 + music_timer=0 + start_game=false + music(0,0,7) + load_room(0,0) +end + +function level_index() + return room.x%8+room.y*8 +end + +function is_title() + return level_index()==31 +end + +-- effects -- +------------- + +clouds = {} +for i=0,16 do + add(clouds,{ + x=rnd(128), + y=rnd(128), + spd=1+rnd(4), + w=32+rnd(32) + }) +end + +particles = {} +for i=0,24 do + add(particles,{ + x=rnd(128), + y=rnd(128), + s=0+flr(rnd(5)/4), + spd=0.25+rnd(5), + off=rnd(1), + c=6+flr(0.5+rnd(1)) + }) +end + +dead_particles = {} + +-- player entity -- +------------------- + +player = +{ + init=function(this) + this.p_jump=false + this.p_dash=false + this.grace=0 + this.jbuffer=0 + this.djump=max_djump + this.dash_time=0 + this.dash_effect_time=0 + this.dash_target={x=0,y=0} + this.dash_accel={x=0,y=0} + this.hitbox = {x=1,y=3,w=6,h=5} + this.spr_off=0 + this.was_on_ground=false + create_hair(this) + end, + update=function(this) + if (pause_player) then return end + + local input = btn(k_right) and 1 or (btn(k_left) and -1 or 0) + + -- spikes collide + if spikes_at(this.x+this.hitbox.x,this.y+this.hitbox.y,this.hitbox.w,this.hitbox.h,this.spd.x,this.spd.y) then + kill_player(this) + end + + -- bottom death + if this.y>128 then + kill_player(this) + end + + local on_ground=this.is_solid(0,1) + local on_ice=this.is_ice(0,1) + + -- smoke particles + if on_ground and not this.was_on_ground then + init_object(smoke,this.x,this.y+4) + end + + local jump = btn(k_jump) and not this.p_jump + this.p_jump = btn(k_jump) + if (jump) then + this.jbuffer=4 + elseif this.jbuffer>0 then + this.jbuffer-=1 + end + + local dash = btn(k_dash) and not this.p_dash + this.p_dash = btn(k_dash) + + if on_ground then + this.grace=6 + if this.djump 0 then + this.grace-=1 + end + + this.dash_effect_time -=1 + if this.dash_time > 0 then + init_object(smoke,this.x,this.y) + this.dash_time-=1 + this.spd.x=appr(this.spd.x,this.dash_target.x,this.dash_accel.x) + this.spd.y=appr(this.spd.y,this.dash_target.y,this.dash_accel.y) + else + -- move + local maxrun=1 + local accel=0.6 + local deccel=0.15 + + if not on_ground then + accel=0.4 + elseif on_ice then + accel=0.05 + if input==(this.flip.x and -1 or 1) then + accel=0.05 + end + end + + if abs(this.spd.x) > maxrun then + this.spd.x=appr(this.spd.x,sign(this.spd.x)*maxrun,deccel) + else + this.spd.x=appr(this.spd.x,input*maxrun,accel) + end + + --facing + if this.spd.x~=0 then + this.flip.x=(this.spd.x<0) + end + + -- gravity + local maxfall=2 + local gravity=0.21 + + if abs(this.spd.y) <= 0.15 then + gravity*=0.5 + end + + -- wall slide + if input~=0 and this.is_solid(input,0) and not this.is_ice(input,0) then + maxfall=0.4 + if rnd(10)<2 then + init_object(smoke,this.x+input*6,this.y) + end + end + + if not on_ground then + this.spd.y=appr(this.spd.y,maxfall,gravity) + end + + -- jump + if this.jbuffer>0 then + if this.grace>0 then + -- normal jump + psfx(1) + this.jbuffer=0 + this.grace=0 + this.spd.y=-2 + init_object(smoke,this.x,this.y+4) + else + -- wall jump + local wall_dir=(this.is_solid(-3,0) and -1 or this.is_solid(3,0) and 1 or 0) + if wall_dir~=0 then + psfx(2) + this.jbuffer=0 + this.spd.y=-2 + this.spd.x=-wall_dir*(maxrun+1) + if not this.is_ice(wall_dir*3,0) then + init_object(smoke,this.x+wall_dir*6,this.y) + end + end + end + end + + -- dash + local d_full=5 + local d_half=d_full*0.70710678118 + + if this.djump>0 and dash then + init_object(smoke,this.x,this.y) + this.djump-=1 + this.dash_time=4 + has_dashed=true + this.dash_effect_time=10 + local v_input=(btn(k_up) and -1 or (btn(k_down) and 1 or 0)) + if input~=0 then + if v_input~=0 then + this.spd.x=input*d_half + this.spd.y=v_input*d_half + else + this.spd.x=input*d_full + this.spd.y=0 + end + elseif v_input~=0 then + this.spd.x=0 + this.spd.y=v_input*d_full + else + this.spd.x=(this.flip.x and -1 or 1) + this.spd.y=0 + end + + psfx(3) + freeze=2 + shake=6 + this.dash_target.x=2*sign(this.spd.x) + this.dash_target.y=2*sign(this.spd.y) + this.dash_accel.x=1.5 + this.dash_accel.y=1.5 + + if this.spd.y<0 then + this.dash_target.y*=.75 + end + + if this.spd.y~=0 then + this.dash_accel.x*=0.70710678118 + end + if this.spd.x~=0 then + this.dash_accel.y*=0.70710678118 + end + elseif dash and this.djump<=0 then + psfx(9) + init_object(smoke,this.x,this.y) + end + end + + -- animation + this.spr_off+=0.25 + if not on_ground then + if this.is_solid(input,0) then + this.spr=5 + else + this.spr=3 + end + elseif btn(k_down) then + this.spr=6 + elseif btn(k_up) then + this.spr=7 + elseif (this.spd.x==0) or (not btn(k_left) and not btn(k_right)) then + this.spr=1 + else + this.spr=1+this.spr_off%4 + end + + -- next level + if this.y<-4 and level_index()<30 then next_room() end + + -- was on the ground + this.was_on_ground=on_ground + + end, --121 then + this.x=clamp(this.x,-1,121) + this.spd.x=0 + end + + set_hair_color(this.djump) + draw_hair(this,this.flip.x and -1 or 1) + spr(this.spr,this.x,this.y,1,1,this.flip.x,this.flip.y) + unset_hair_color() + end, +} + +psfx=function(num) + if sfx_timer<=0 then + sfx(num) + end +end + +create_hair=function(obj) + obj.hair={} + for i=0,4 do + add(obj.hair,{x=obj.x,y=obj.y,size=max(1,min(2,3-i))}) + end +end + +set_hair_color=function(djump) + pal(8,(djump==1 and 8 or djump==2 and (7+flr((frames/3)%2)*4) or 12)) +end + +draw_hair=function(obj,facing) + local last={x=obj.x+4-facing*2,y=obj.y+(btn(k_down) and 4 or 3)} + foreach(obj.hair,function(h) + h.x+=(last.x-h.x)/1.5 + h.y+=(last.y+0.5-h.y)/1.5 + circfill(h.x,h.y,h.size,8) + last=h + end) +end + +unset_hair_color=function() + pal(8,8) +end + +player_spawn = { + tile=1, + init=function(this) + sfx(4) + this.spr=3 + this.target= {x=this.x,y=this.y} + this.y=128 + this.spd.y=-4 + this.state=0 + this.delay=0 + this.solids=false + create_hair(this) + end, + update=function(this) + -- jumping up + if this.state==0 then + if this.y < this.target.y+16 then + this.state=1 + this.delay=3 + end + -- falling + elseif this.state==1 then + this.spd.y+=0.5 + if this.spd.y>0 and this.delay>0 then + this.spd.y=0 + this.delay-=1 + end + if this.spd.y>0 and this.y > this.target.y then + this.y=this.target.y + this.spd = {x=0,y=0} + this.state=2 + this.delay=5 + shake=5 + init_object(smoke,this.x,this.y+4) + sfx(5) + end + -- landing + elseif this.state==2 then + this.delay-=1 + this.spr=6 + if this.delay<0 then + destroy_object(this) + init_object(player,this.x,this.y) + end + end + end, + draw=function(this) + set_hair_color(max_djump) + draw_hair(this,1) + spr(this.spr,this.x,this.y,1,1,this.flip.x,this.flip.y) + unset_hair_color() + end +} +add(types,player_spawn) + +spring = { + tile=18, + init=function(this) + this.hide_in=0 + this.hide_for=0 + end, + update=function(this) + if this.hide_for>0 then + this.hide_for-=1 + if this.hide_for<=0 then + this.spr=18 + this.delay=0 + end + elseif this.spr==18 then + local hit = this.collide(player,0,0) + if hit ~=nil and hit.spd.y>=0 then + this.spr=19 + hit.y=this.y-4 + hit.spd.x*=0.2 + hit.spd.y=-3 + hit.djump=max_djump + this.delay=10 + init_object(smoke,this.x,this.y) + + -- breakable below us + local below=this.collide(fall_floor,0,1) + if below~=nil then + break_fall_floor(below) + end + + psfx(8) + end + elseif this.delay>0 then + this.delay-=1 + if this.delay<=0 then + this.spr=18 + end + end + -- begin hiding + if this.hide_in>0 then + this.hide_in-=1 + if this.hide_in<=0 then + this.hide_for=60 + this.spr=0 + end + end + end +} +add(types,spring) + +function break_spring(obj) + obj.hide_in=15 +end + +balloon = { + tile=22, + init=function(this) + this.offset=rnd(1) + this.start=this.y + this.timer=0 + this.hitbox={x=-1,y=-1,w=10,h=10} + end, + update=function(this) + if this.spr==22 then + this.offset+=0.01 + this.y=this.start+sin(this.offset)*2 + local hit = this.collide(player,0,0) + if hit~=nil and hit.djump0 then + this.timer-=1 + else + psfx(7) + init_object(smoke,this.x,this.y) + this.spr=22 + end + end, + draw=function(this) + if this.spr==22 then + spr(13+(this.offset*8)%3,this.x,this.y+6) + spr(this.spr,this.x,this.y) + end + end +} +add(types,balloon) + +fall_floor = { + tile=23, + init=function(this) + this.state=0 + this.solid=true + end, + update=function(this) + -- idling + if this.state == 0 then + if this.check(player,0,-1) or this.check(player,-1,0) or this.check(player,1,0) then + break_fall_floor(this) + end + -- shaking + elseif this.state==1 then + this.delay-=1 + if this.delay<=0 then + this.state=2 + this.delay=60--how long it hides for + this.collideable=false + end + -- invisible, waiting to reset + elseif this.state==2 then + this.delay-=1 + if this.delay<=0 and not this.check(player,0,0) then + psfx(7) + this.state=0 + this.collideable=true + init_object(smoke,this.x,this.y) + end + end + end, + draw=function(this) + if this.state~=2 then + if this.state~=1 then + spr(23,this.x,this.y) + else + spr(23+(15-this.delay)/5,this.x,this.y) + end + end + end +} +add(types,fall_floor) + +function break_fall_floor(obj) + if obj.state==0 then + psfx(15) + obj.state=1 + obj.delay=15--how long until it falls + init_object(smoke,obj.x,obj.y) + local hit=obj.collide(spring,0,-1) + if hit~=nil then + break_spring(hit) + end + end +end + +smoke={ + init=function(this) + this.spr=29 + this.spd.y=-0.1 + this.spd.x=0.3+rnd(0.2) + this.x+=-1+rnd(2) + this.y+=-1+rnd(2) + this.flip.x=maybe() + this.flip.y=maybe() + this.solids=false + end, + update=function(this) + this.spr+=0.2 + if this.spr>=32 then + destroy_object(this) + end + end +} + +fruit={ + tile=26, + if_not_fruit=true, + init=function(this) + this.start=this.y + this.off=0 + end, + update=function(this) + local hit=this.collide(player,0,0) + if hit~=nil then + hit.djump=max_djump + sfx_timer=20 + sfx(13) + got_fruit[1+level_index()] = true + init_object(lifeup,this.x,this.y) + destroy_object(this) + end + this.off+=1 + this.y=this.start+sin(this.off/40)*2.5 + end +} +add(types,fruit) + +fly_fruit={ + tile=28, + if_not_fruit=true, + init=function(this) + this.start=this.y + this.fly=false + this.step=0.5 + this.solids=false + this.sfx_delay=8 + end, + update=function(this) + --fly away + if this.fly then + if this.sfx_delay>0 then + this.sfx_delay-=1 + if this.sfx_delay<=0 then + sfx_timer=20 + sfx(14) + end + end + this.spd.y=appr(this.spd.y,-3.5,0.25) + if this.y<-16 then + destroy_object(this) + end + -- wait + else + if has_dashed then + this.fly=true + end + this.step+=0.05 + this.spd.y=sin(this.step)*0.5 + end + -- collect + local hit=this.collide(player,0,0) + if hit~=nil then + hit.djump=max_djump + sfx_timer=20 + sfx(13) + got_fruit[1+level_index()] = true + init_object(lifeup,this.x,this.y) + destroy_object(this) + end + end, + draw=function(this) + local off=0 + if not this.fly then + local dir=sin(this.step) + if dir<0 then + off=1+max(0,sign(this.y-this.start)) + end + else + off=(off+0.25)%3 + end + spr(45+off,this.x-6,this.y-2,1,1,true,false) + spr(this.spr,this.x,this.y) + spr(45+off,this.x+6,this.y-2) + end +} +add(types,fly_fruit) + +lifeup = { + init=function(this) + this.spd.y=-0.25 + this.duration=30 + this.x-=2 + this.y-=4 + this.flash=0 + this.solids=false + end, + update=function(this) + this.duration-=1 + if this.duration<= 0 then + destroy_object(this) + end + end, + draw=function(this) + this.flash+=0.5 + + _print("1000",this.x-2,this.y,7+this.flash%2) + end +} + +fake_wall = { + tile=64, + if_not_fruit=true, + update=function(this) + this.hitbox={x=-1,y=-1,w=18,h=18} + local hit = this.collide(player,0,0) + if hit~=nil and hit.dash_effect_time>0 then + hit.spd.x=-sign(hit.spd.x)*1.5 + hit.spd.y=-1.5 + hit.dash_time=-1 + sfx_timer=20 + sfx(16) + destroy_object(this) + init_object(smoke,this.x,this.y) + init_object(smoke,this.x+8,this.y) + init_object(smoke,this.x,this.y+8) + init_object(smoke,this.x+8,this.y+8) + init_object(fruit,this.x+4,this.y+4) + end + this.hitbox={x=0,y=0,w=16,h=16} + end, + draw=function(this) + spr(64,this.x,this.y) + spr(65,this.x+8,this.y) + spr(80,this.x,this.y+8) + spr(81,this.x+8,this.y+8) + end +} +add(types,fake_wall) + +key={ + tile=8, + if_not_fruit=true, + update=function(this) + local was=flr(this.spr) + this.spr=9+(sin(frames/30)+0.5)*1 + local is=flr(this.spr) + if is==10 and is~=was then + this.flip.x=not this.flip.x + end + if this.check(player,0,0) then + sfx(23) + sfx_timer=10 + destroy_object(this) + has_key=true + end + end +} +add(types,key) + +chest={ + tile=20, + if_not_fruit=true, + init=function(this) + this.x-=4 + this.start=this.x + this.timer=20 + end, + update=function(this) + if has_key then + this.timer-=1 + this.x=this.start-1+rnd(3) + if this.timer<=0 then + sfx_timer=20 + sfx(16) + init_object(fruit,this.x,this.y-4) + destroy_object(this) + end + end + end +} +add(types,chest) + +platform={ + init=function(this) + this.x-=4 + this.solids=false + this.hitbox.w=16 + this.last=this.x + end, + update=function(this) + this.spd.x=this.dir*0.65 + if this.x<-16 then this.x=128 + elseif this.x>128 then this.x=-16 end + if not this.check(player,0,0) then + local hit=this.collide(player,0,-1) + if hit~=nil then + hit.move_x(this.x-this.last,1) + end + end + this.last=this.x + end, + draw=function(this) + spr(11,this.x,this.y-1) + spr(12,this.x+8,this.y-1) + end +} + +message={ + tile=86, + last=0, + draw=function(this) + this.text="-- celeste mountain --#this memorial to those# perished on the climb" + if this.check(player,4,0) then + if this.index<#this.text then + this.index+=0.5 + if this.index>=this.last+1 then + this.last+=1 + sfx(35) + end + end + this.off={x=8,y=96} + for i=1,this.index do + if sub(this.text,i,i)~="#" then + rectfill(this.off.x-2,this.off.y-2,this.off.x+7,this.off.y+6 ,7) + _print(sub(this.text,i,i),this.off.x,this.off.y,0) + this.off.x+=5 + else + this.off.x=8 + this.off.y+=7 + end + end + else + this.index=0 + this.last=0 + end + end +} +add(types,message) + +big_chest={ + tile=96, + init=function(this) + this.state=0 + this.hitbox.w=16 + end, + draw=function(this) + if this.state==0 then + local hit=this.collide(player,0,8) + if hit~=nil and hit.is_solid(0,1) then + music(-1,500,7) + sfx(37) + pause_player=true + hit.spd.x=0 + hit.spd.y=0 + this.state=1 + init_object(smoke,this.x,this.y) + init_object(smoke,this.x+8,this.y) + this.timer=60 + this.particles={} + end + spr(96,this.x,this.y) + spr(97,this.x+8,this.y) + elseif this.state==1 then + this.timer-=1 + shake=5 + flash_bg=true + if this.timer<=45 and count(this.particles)<50 then + add(this.particles,{ + x=1+rnd(14), + y=0, + h=32+rnd(32), + spd=8+rnd(8) + }) + end + if this.timer<0 then + this.state=2 + this.particles={} + flash_bg=false + new_bg=true + init_object(orb,this.x+4,this.y+4) + pause_player=false + end + foreach(this.particles,function(p) + p.y+=p.spd + line(this.x+p.x,this.y+8-p.y,this.x+p.x,min(this.y+8-p.y+p.h,this.y+8),7) + end) + end + spr(112,this.x,this.y+8) + spr(113,this.x+8,this.y+8) + end +} +add(types,big_chest) + +orb={ + init=function(this) + this.spd.y=-4 + this.solids=false + this.particles={} + end, + draw=function(this) + this.spd.y=appr(this.spd.y,0,0.5) + local hit=this.collide(player,0,0) + if this.spd.y==0 and hit~=nil then + music_timer=45 + sfx(51) + freeze=10 + shake=10 + destroy_object(this) + max_djump=2 + hit.djump=2 + end + + spr(102,this.x,this.y) + local off=frames/30 + for i=0,7 do + circfill(this.x+4+cos(off+i/8)*8,this.y+4+sin(off+i/8)*8,1,7) + end + end +} + +flag = { + tile=118, + init=function(this) + this.x+=5 + this.score=0 + this.show=false + for i=1,count(got_fruit) do + if got_fruit[i] then + this.score+=1 + end + end + end, + draw=function(this) + this.spr=118+(frames/5)%3 + spr(this.spr,this.x,this.y) + if this.show then + rectfill(32,2,96,31,0) + spr(26,55,6) + _print("x"..this.score,64,9,7) + draw_time(49,16) + _print("deaths:"..deaths,48,24,7) + elseif this.check(player,0,0) then + sfx(55) + sfx_timer=30 + this.show=true + end + end +} +add(types,flag) + +room_title = { + init=function(this) + this.delay=5 + end, + draw=function(this) + this.delay-=1 + if this.delay<-30 then + destroy_object(this) + elseif this.delay<0 then + + rectfill(24,58,104,70,0) + if room.x==3 and room.y==1 then + _print("old site",48,62,7) + elseif level_index()==30 then + _print("summit",52,62,7) + else + local level=(1+level_index())*100 + _print(level.." m",52+(level<1000 and 2 or 0),62,7) + end + + draw_time(4,4) + end + end +} + +-- object functions -- +----------------------- + +function init_object(type,x,y) + + if type.if_not_fruit~=nil and got_fruit[1+level_index()] then + return + end + local obj = {} + obj.type = type + obj.collideable=true + obj.solids=true + + obj.spr = type.tile + obj.flip = {x=false,y=false} + + obj.x = x + obj.y = y + obj.hitbox = { x=0,y=0,w=8,h=8 } + + obj.spd = {x=0,y=0} + obj.rem = {x=0,y=0} + + obj.is_solid=function(ox,oy) + if oy>0 and not obj.check(platform,ox,0) and obj.check(platform,ox,oy) then + return true + end + return solid_at(obj.x+obj.hitbox.x+ox,obj.y+obj.hitbox.y+oy,obj.hitbox.w,obj.hitbox.h) + or obj.check(fall_floor,ox,oy) + or obj.check(fake_wall,ox,oy) + end + + obj.is_ice=function(ox,oy) + return ice_at(obj.x+obj.hitbox.x+ox,obj.y+obj.hitbox.y+oy,obj.hitbox.w,obj.hitbox.h) + end + + obj.collide=function(type,ox,oy) + local other + for i=1,count(objects) do + other=objects[i] + if other ~=nil and other.type == type and other ~= obj and other.collideable and + other.x+other.hitbox.x+other.hitbox.w > obj.x+obj.hitbox.x+ox and + other.y+other.hitbox.y+other.hitbox.h > obj.y+obj.hitbox.y+oy and + other.x+other.hitbox.x < obj.x+obj.hitbox.x+obj.hitbox.w+ox and + other.y+other.hitbox.y < obj.y+obj.hitbox.y+obj.hitbox.h+oy then + return other + end + end + return nil + end + + obj.check=function(type,ox,oy) + return obj.collide(type,ox,oy) ~= nil + end + + obj.move=function(ox,oy) + local amount + -- [x] get move amount + obj.rem.x += ox + amount = flr(obj.rem.x + 0.5) + obj.rem.x -= amount + obj.move_x(amount,0) + + -- [y] get move amount + obj.rem.y += oy + amount = flr(obj.rem.y + 0.5) + obj.rem.y -= amount + obj.move_y(amount) + end + + obj.move_x=function(amount,start) + if obj.solids then + local step = sign(amount) + for i=start,abs(amount) do + if not obj.is_solid(step,0) then + obj.x += step + else + obj.spd.x = 0 + obj.rem.x = 0 + break + end + end + else + obj.x += amount + end + end + + obj.move_y=function(amount) + if obj.solids then + local step = sign(amount) + for i=0,abs(amount) do + if not obj.is_solid(0,step) then + obj.y += step + else + obj.spd.y = 0 + obj.rem.y = 0 + break + end + end + else + obj.y += amount + end + end + + add(objects,obj) + if obj.type.init~=nil then + obj.type.init(obj) + end + return obj + +end + +function destroy_object(obj) + del(objects,obj) +end + +function kill_player(obj) + sfx_timer=12 + sfx(0) + deaths+=1 + shake=10 + destroy_object(obj) + dead_particles={} + for dir=0,7 do + local angle=(dir/8) + add(dead_particles,{ + x=obj.x+4, + y=obj.y+4, + t=10, + spd={ + x=sin(angle)*3, + y=cos(angle)*3 + } + }) + restart_room() + end +end + +-- room functions -- +-------------------- + +function restart_room() + will_restart=true + delay_restart=15 +end + +function next_room() + if room.x==2 and room.y==1 then + music(30,500,7) + elseif room.x==3 and room.y==1 then + music(20,500,7) + elseif room.x==4 and room.y==2 then + music(30,500,7) + elseif room.x==5 and room.y==3 then + music(30,500,7) + end + + if room.x==7 then + load_room(0,room.y+1) + else + load_room(room.x+1,room.y) + end +end + +function load_room(x,y) + + has_dashed=false + has_key=false + + --remove existing objects + foreach(objects,destroy_object) + + --current room + room.x = x + room.y = y + + -- entities + for tx=0,15 do + for ty=0,15 do + local tile = mget(room.x*16+tx,room.y*16+ty); + if tile==11 then + init_object(platform,tx*8,ty*8).dir=-1 + elseif tile==12 then + init_object(platform,tx*8,ty*8).dir=1 + else + foreach(types, + function(type) + if type.tile == tile then + init_object(type,tx*8,ty*8) + end + end) + end + end + end + + if not is_title() then + init_object(room_title,0,0) + end +end + +-- update function -- +----------------------- + +function _update() + frames=((frames+1)%30) + if frames==0 and level_index()<30 then + seconds=((seconds+1)%60) + if seconds==0 then + minutes+=1 + end + end + + if music_timer>0 then + music_timer-=1 + if music_timer<=0 then + music(10,0,7) + end + end + + if sfx_timer>0 then + sfx_timer-=1 + end + + -- cancel if freeze + if freeze>0 then freeze-=1 return end + + -- screenshake + if shake>0 then + shake-=1 + camera() + if shake>0 then + camera(-2+rnd(5),-2+rnd(5)) + end + end + + -- restart (soon) + if will_restart and delay_restart>0 then + delay_restart-=1 + if delay_restart<=0 then + will_restart=false + load_room(room.x,room.y) + end + end + + -- update each object + foreach(objects,function(obj) + obj.move(obj.spd.x,obj.spd.y) + if obj.type.update~=nil then + obj.type.update(obj) + end + end) + + -- start game + if is_title() then + if not start_game and (btn(k_jump) or btn(k_dash)) then + music(-1) + start_game_flash=50 + start_game=true + sfx(38) + end + if start_game then + start_game_flash-=1 + if start_game_flash<=-30 then + begin_game() + end + end + end +end + +-- drawing functions -- +----------------------- +function _draw() + if freeze>0 then return end + + -- reset all palette values + pal() + + -- start game flash + if start_game then + local c=10 + if start_game_flash>10 then + if frames%10<5 then + c=7 + end + elseif start_game_flash>5 then + c=2 + elseif start_game_flash>0 then + c=1 + else + c=0 + end + if c<10 then + pal(6,c) + pal(12,c) + pal(13,c) + pal(5,c) + pal(1,c) + pal(7,c) + end + end + + -- clear screen + local bg_col = 0 + if flash_bg then + bg_col = frames/5 + elseif new_bg~=nil then + bg_col=2 + end + rectfill(0,0,128,128,bg_col) + + -- clouds + previousColor = playdate.graphics.getColor() + playdate.graphics.setColor(playdate.graphics.kColorWhite) + if not is_title() then + foreach(clouds, function(c) + c.x += c.spd + rectfill(c.x,c.y,c.x+c.w,c.y+4+(1-c.w/64)*12,new_bg~=nil and 14 or 1) + if c.x > 128 then + c.x = -c.w + c.y=rnd(128-8) + end + end) + end + playdate.graphics.setColor(previousColor) + + -- draw bg terrain + map(room.x * 16,room.y * 16,0,0,16,16,4) + + -- platforms/big chest + foreach(objects, function(o) + if o.type==platform or o.type==big_chest then + draw_object(o) + end + end) + + -- draw terrain + local off=is_title() and -4 or 0 + map(room.x*16,room.y * 16,off,0,16,16,2) + + -- draw objects + foreach(objects, function(o) + if o.type~=platform and o.type~=big_chest then + draw_object(o) + end + end) + + -- draw fg terrain + map(room.x * 16,room.y * 16,0,0,16,16,8) + + -- particles + previousColor = playdate.graphics.getColor() + playdate.graphics.setColor(playdate.graphics.kColorWhite) + foreach(particles, function(p) + p.x += p.spd + p.y += sin(p.off) + p.off+= min(0.05,p.spd/32) + rectfill(p.x,p.y,p.x+p.s,p.y+p.s,p.c) + if p.x>128+4 then + p.x=-4 + p.y=rnd(128) + end + end) + playdate.graphics.setColor(previousColor) + + -- dead particles + foreach(dead_particles, function(p) + p.x += p.spd.x + p.y += p.spd.y + p.t -=1 + if p.t <= 0 then del(dead_particles,p) end + rectfill(p.x-p.t/5,p.y-p.t/5,p.x+p.t/5,p.y+p.t/5,14+p.t%2) + end) + + -- draw outside of the screen for screenshake + rectfill(-5,-5,-1,133,0) + rectfill(-5,-5,133,-1,0) + rectfill(-5,128,133,133,0) + rectfill(128,-5,133,133,0) + + -- credits + if is_title() then + _print("a+b",58,80,5) + _print("matt thorson",42,96,5) + _print("noel berry",46,102,5) + end + + if level_index()==30 then + local p + for i=1,count(objects) do + if objects[i].type==player then + p = objects[i] + break + end + end + if p~=nil then + local diff=min(24,40-abs(p.x+4-64)) + rectfill(0,0,diff,128,0) + rectfill(128-diff,0,128,128,0) + end + end + +end + +function draw_object(obj) + + if obj.type.draw ~=nil then + obj.type.draw(obj) + elseif obj.spr > 0 then + spr(obj.spr,obj.x,obj.y,1,1,obj.flip.x,obj.flip.y) + end + +end + +function draw_time(x,y) + + local s=seconds + local m=minutes%60 + local h=flr(minutes/60) + + rectfill(x,y,x+32,y+6,0) + _print((h<10 and "0"..h or h)..":"..(m<10 and "0"..m or m)..":"..(s<10 and "0"..s or s),x+1,y+1,7) + +end + +-- helper functions -- +---------------------- + +function clamp(val,a,b) + return max(a, min(b, val)) +end + +function appr(val,target,amount) + return val > target + and max(val - amount, target) + or min(val + amount, target) +end + +function sign(v) + return v>0 and 1 or v<0 and -1 or 0 +end + +function maybe() + return rnd(1)<0.5 +end + +function solid_at(x,y,w,h) + return tile_flag_at(x,y,w,h,0) +end + +function ice_at(x,y,w,h) + return tile_flag_at(x,y,w,h,4) +end + +function tile_flag_at(x,y,w,h,flag) + for i=max(0,flr(x/8)),min(15,(x+w-1)/8) do + for j=max(0,flr(y/8)),min(15,(y+h-1)/8) do + if fget(tile_at(i,j),flag) then + return true + end + end + end + return false +end + +function tile_at(x,y) + return mget(room.x * 16 + x, room.y * 16 + y) +end + +function spikes_at(x,y,w,h,xspd,yspd) + for i=max(0,flr(x/8)),min(15,(x+w-1)/8) do + for j=max(0,flr(y/8)),min(15,(y+h-1)/8) do + local tile=tile_at(i,j) + if tile==17 and ((y+h-1)%8>=6 or y+h==j*8+8) and yspd>=0 then + return true + elseif tile==27 and y%8<=2 and yspd<=0 then + return true + elseif tile==43 and x%8<=2 and xspd<=0 then + return true + elseif tile==59 and ((x+w-1)%8>=6 or x+w==i*8+8) and xspd>=0 then + return true + end + end + end + return false +end \ No newline at end of file diff --git a/Source/Scripts/map.lua b/Source/Scripts/map.lua new file mode 100644 index 0000000..a025d67 --- /dev/null +++ b/Source/Scripts/map.lua @@ -0,0 +1,66 @@ +mapData = { + 0x23, 0x31, 0x25, 0x25, 0x48, 0x25, 0x25, 0x32, 0x32, 0x32, 0x32, 0x32, 0x33, 0x00, 0x00, 0x24, 0x25, 0x26, 0x24, 0x25, 0x25, 0x26, 0x31, 0x32, 0x32, 0x32, 0x25, 0x26, 0x28, 0x28, 0x28, 0x24, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x32, 0x33, 0x28, 0x38, 0x28, 0x28, 0x31, 0x25, 0x25, 0x25, 0x32, 0x32, 0x32, 0x32, 0x33, 0x00, 0x00, 0x00, 0x31, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x33, 0x00, 0x00, 0x00, 0x24, 0x32, 0x32, 0x32, 0x33, 0x31, 0x32, 0x32, 0x32, 0x25, 0x25, 0x25, 0x25, 0x25, 0x48, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x26, 0x28, 0x28, 0x24, 0x25, 0x25, 0x48, 0x25, 0x25, 0x25, 0x26, 0x28, 0x28, 0x28, 0x28, 0x24, 0x25, 0x48, 0x25, 0x25, 0x25, 0x26, 0x28, 0x28, 0x28, 0x28, 0x31, 0x32, 0x32, 0x32, 0x25, 0x48, 0x25, 0x25, 0x25, 0x25, 0x25, + 0x25, 0x23, 0x31, 0x32, 0x32, 0x32, 0x33, 0x29, 0x00, 0x00, 0x28, 0x29, 0x00, 0x00, 0x00, 0x24, 0x25, 0x26, 0x31, 0x32, 0x32, 0x33, 0x28, 0x28, 0x00, 0x28, 0x24, 0x26, 0x2a, 0x10, 0x28, 0x24, 0x25, 0x48, 0x25, 0x25, 0x25, 0x26, 0x00, 0x2a, 0x28, 0x28, 0x29, 0x28, 0x10, 0x24, 0x48, 0x25, 0x28, 0x28, 0x28, 0x29, 0x00, 0x00, 0x00, 0x00, 0x28, 0x28, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x10, 0x00, 0x00, 0x00, 0x37, 0x28, 0x29, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x28, 0x31, 0x48, 0x25, 0x25, 0x25, 0x25, 0x25, 0x48, 0x25, 0x25, 0x32, 0x32, 0x32, 0x33, 0x28, 0x28, 0x24, 0x25, 0x25, 0x25, 0x48, 0x25, 0x32, 0x33, 0x38, 0x28, 0x2a, 0x28, 0x31, 0x32, 0x25, 0x25, 0x48, 0x25, 0x26, 0x28, 0x38, 0x28, 0x28, 0x28, 0x2a, 0x2a, 0x28, 0x31, 0x32, 0x32, 0x32, 0x32, 0x25, 0x25, + 0x25, 0x25, 0x23, 0x20, 0x10, 0x28, 0x38, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x3d, 0x24, 0x25, 0x25, 0x23, 0x20, 0x10, 0x28, 0x29, 0x29, 0x00, 0x28, 0x24, 0x26, 0x00, 0x3a, 0x38, 0x24, 0x25, 0x25, 0x25, 0x48, 0x25, 0x33, 0x00, 0x00, 0x29, 0x00, 0x00, 0x2a, 0x00, 0x31, 0x25, 0x25, 0x28, 0x38, 0x29, 0x00, 0x00, 0x3a, 0x67, 0x68, 0x38, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x28, 0x39, 0x3e, 0x00, 0x3a, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x24, 0x25, 0x25, 0x32, 0x32, 0x32, 0x32, 0x32, 0x33, 0x21, 0x22, 0x22, 0x23, 0x28, 0x28, 0x24, 0x25, 0x25, 0x25, 0x32, 0x33, 0x28, 0x28, 0x28, 0x29, 0x00, 0x00, 0x2a, 0x28, 0x31, 0x32, 0x25, 0x25, 0x26, 0x28, 0x28, 0x28, 0x28, 0x29, 0x00, 0x00, 0x2a, 0x28, 0x28, 0x28, 0x38, 0x28, 0x24, 0x48, + 0x32, 0x32, 0x33, 0x28, 0x28, 0x28, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x20, 0x20, 0x24, 0x48, 0x25, 0x26, 0x28, 0x28, 0x29, 0x00, 0x00, 0x00, 0x2a, 0x24, 0x33, 0x00, 0x00, 0x2a, 0x24, 0x25, 0x32, 0x25, 0x25, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0x25, 0x29, 0x00, 0x00, 0x00, 0x00, 0x21, 0x22, 0x23, 0x28, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x28, 0x28, 0x34, 0x35, 0x36, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x39, 0x24, 0x25, 0x26, 0x21, 0x22, 0x23, 0x20, 0x21, 0x23, 0x31, 0x32, 0x32, 0x33, 0x28, 0x28, 0x24, 0x25, 0x48, 0x26, 0x2b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x3b, 0x24, 0x25, 0x26, 0x28, 0x28, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x28, 0x28, 0x28, 0x28, 0x24, 0x25, + 0x23, 0x40, 0x28, 0x38, 0x28, 0x29, 0x3a, 0x28, 0x39, 0x00, 0x00, 0x00, 0x34, 0x35, 0x22, 0x25, 0x25, 0x48, 0x26, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x24, 0x33, 0x00, 0x31, 0x25, 0x33, 0x3d, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x1c, 0x3a, 0x3a, 0x31, 0x25, 0x26, 0x20, 0x28, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x28, 0x28, 0x28, 0x29, 0x00, 0x00, 0x00, 0x00, 0x11, 0x11, 0x3a, 0x28, 0x28, 0x31, 0x32, 0x33, 0x24, 0x25, 0x26, 0x10, 0x31, 0x33, 0x20, 0x28, 0x28, 0x28, 0x28, 0x38, 0x24, 0x25, 0x25, 0x26, 0x2b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3b, 0x24, 0x25, 0x26, 0x2a, 0x28, 0x28, 0x67, 0x00, 0x16, 0x00, 0x2a, 0x28, 0x28, 0x38, 0x28, 0x28, 0x24, 0x25, + 0x26, 0x3a, 0x28, 0x28, 0x28, 0x10, 0x28, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0x25, 0x25, 0x32, 0x33, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x37, 0x00, 0x00, 0x00, 0x3e, 0x24, 0x00, 0x00, 0x00, 0x37, 0x21, 0x22, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0x58, 0x68, 0x28, 0x28, 0x28, 0x24, 0x26, 0x28, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x28, 0x28, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x23, 0x28, 0x38, 0x28, 0x29, 0x28, 0x28, 0x31, 0x32, 0x33, 0x28, 0x28, 0x29, 0x00, 0x2a, 0x00, 0x2a, 0x28, 0x28, 0x24, 0x25, 0x25, 0x33, 0x2b, 0x0c, 0x00, 0x00, 0x00, 0x11, 0x11, 0x00, 0x00, 0x00, 0x0c, 0x3b, 0x31, 0x48, 0x26, 0x11, 0x28, 0x10, 0x00, 0x00, 0x00, 0x00, 0x68, 0x28, 0x28, 0x28, 0x28, 0x28, 0x24, 0x25, + 0x25, 0x22, 0x35, 0x35, 0x36, 0x28, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3a, 0x28, 0x24, 0x26, 0x00, 0x3d, 0x00, 0x3a, 0x39, 0x00, 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x25, 0x00, 0x1a, 0x00, 0x00, 0x24, 0x25, 0x26, 0x11, 0x11, 0x11, 0x11, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x28, 0x38, 0x28, 0x28, 0x28, 0x38, 0x31, 0x33, 0x28, 0x00, 0x00, 0x00, 0x17, 0x17, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x11, 0x11, 0x00, 0x00, 0x24, 0x26, 0x10, 0x28, 0x29, 0x00, 0x28, 0x28, 0x1b, 0x1b, 0x1b, 0x28, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x21, 0x25, 0x48, 0x26, 0x28, 0x39, 0x00, 0x00, 0x00, 0x3b, 0x34, 0x36, 0x2b, 0x00, 0x00, 0x00, 0x00, 0x28, 0x24, 0x25, 0x23, 0x28, 0x28, 0x3a, 0x67, 0x00, 0x3a, 0x28, 0x28, 0x28, 0x29, 0x00, 0x2a, 0x31, 0x32, + 0x25, 0x33, 0x38, 0x28, 0x28, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x38, 0x24, 0x25, 0x23, 0x20, 0x20, 0x10, 0x29, 0x00, 0x30, 0x39, 0x00, 0x00, 0x00, 0x00, 0x58, 0x24, 0x48, 0x00, 0x00, 0x00, 0x3a, 0x31, 0x32, 0x32, 0x35, 0x35, 0x35, 0x36, 0x67, 0x58, 0x00, 0x00, 0x3c, 0x28, 0x28, 0x28, 0x28, 0x10, 0x28, 0x21, 0x23, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x36, 0x00, 0x3a, 0x24, 0x26, 0x28, 0x28, 0x00, 0x00, 0x38, 0x28, 0x39, 0x00, 0x00, 0x00, 0x2a, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0x32, 0x32, 0x26, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x28, 0x28, 0x39, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x24, 0x25, 0x33, 0x28, 0x28, 0x28, 0x38, 0x00, 0x28, 0x28, 0x28, 0x39, 0x00, 0x00, 0x00, 0x17, 0x00, + 0x26, 0x00, 0x00, 0x2a, 0x28, 0x00, 0x00, 0x00, 0x00, 0x3a, 0x28, 0x3a, 0x28, 0x28, 0x28, 0x24, 0x25, 0x25, 0x22, 0x23, 0x28, 0x39, 0x00, 0x37, 0x28, 0x58, 0x39, 0x00, 0x68, 0x28, 0x31, 0x32, 0x00, 0x00, 0x00, 0x28, 0x28, 0x28, 0x28, 0x28, 0x20, 0x20, 0x28, 0x28, 0x28, 0x39, 0x21, 0x22, 0x28, 0x29, 0x00, 0x2a, 0x28, 0x28, 0x24, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x38, 0x28, 0x28, 0x31, 0x25, 0x23, 0x00, 0x00, 0x00, 0x28, 0x28, 0x28, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x3a, 0x67, 0x68, 0x28, 0x28, 0x00, 0x33, 0x38, 0x28, 0x0b, 0x00, 0x00, 0x00, 0x10, 0x38, 0x28, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x31, 0x33, 0x28, 0x28, 0x28, 0x28, 0x28, 0x68, 0x28, 0x28, 0x28, 0x28, 0x00, 0x00, 0x00, 0x17, 0x00, + 0x33, 0x00, 0x00, 0x00, 0x28, 0x67, 0x58, 0x00, 0x00, 0x28, 0x10, 0x28, 0x28, 0x34, 0x22, 0x25, 0x25, 0x25, 0x48, 0x26, 0x28, 0x28, 0x67, 0x20, 0x28, 0x28, 0x28, 0x38, 0x28, 0x28, 0x21, 0x22, 0x00, 0x00, 0x3a, 0x28, 0x38, 0x28, 0x10, 0x29, 0x00, 0x00, 0x2a, 0x28, 0x38, 0x28, 0x24, 0x25, 0x2a, 0x00, 0x00, 0x00, 0x28, 0x38, 0x24, 0x26, 0x00, 0x00, 0x00, 0x17, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x27, 0x28, 0x28, 0x2a, 0x28, 0x31, 0x33, 0x39, 0x00, 0x00, 0x28, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x28, 0x28, 0x28, 0x29, 0x00, 0x2a, 0x28, 0x39, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x28, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x28, 0x28, 0x38, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x3a, 0x28, 0x28, 0x38, 0x3e, 0x3a, 0x28, 0x28, 0x28, 0x38, 0x28, 0x24, 0x25, 0x48, 0x25, 0x25, 0x26, 0x00, 0x2a, 0x28, 0x27, 0x29, 0x00, 0x2a, 0x28, 0x28, 0x34, 0x32, 0x25, 0x00, 0x00, 0x00, 0x2a, 0x28, 0x28, 0x28, 0x00, 0x00, 0x00, 0x00, 0x28, 0x10, 0x28, 0x24, 0x25, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x28, 0x24, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x37, 0x28, 0x00, 0x00, 0x00, 0x2a, 0x28, 0x28, 0x39, 0x00, 0x28, 0x00, 0x00, 0x00, 0x39, 0x28, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x28, 0x00, 0x00, 0x00, 0x28, 0x29, 0x00, 0x00, 0x00, 0x2a, 0x28, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x28, 0x28, 0x28, 0x28, 0x10, 0x28, 0x28, 0x28, 0x28, 0x67, 0x58, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x28, 0x38, 0x28, 0x28, 0x21, 0x23, 0x28, 0x00, 0x00, 0x2a, 0x28, 0x24, 0x25, 0x32, 0x32, 0x25, 0x26, 0x00, 0x3a, 0x28, 0x30, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x28, 0x28, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x28, 0x11, 0x11, 0x11, 0x11, 0x28, 0x28, 0x28, 0x24, 0x48, 0x00, 0x00, 0x00, 0x3a, 0x28, 0x28, 0x31, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x17, 0x00, 0x01, 0x3f, 0x00, 0x00, 0x00, 0x20, 0x29, 0x00, 0x00, 0x00, 0x00, 0x38, 0x28, 0x00, 0x00, 0x28, 0x01, 0x3a, 0x28, 0x28, 0x10, 0x28, 0x58, 0x00, 0x00, 0x00, 0x3a, 0x28, 0x29, 0x00, 0x00, 0x00, 0x2a, 0x28, 0x0c, 0x00, 0x00, 0x00, 0x3a, 0x38, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x2a, 0x28, 0x28, 0x28, 0x28, 0x28, 0x29, 0x28, 0x28, 0x29, 0x00, 0x00, 0x00, 0x3a, + 0x00, 0x01, 0x3a, 0x21, 0x23, 0x28, 0x2a, 0x31, 0x33, 0x29, 0x00, 0x11, 0x11, 0x11, 0x24, 0x25, 0x00, 0x28, 0x31, 0x26, 0x3a, 0x38, 0x29, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x34, 0x22, 0x22, 0x36, 0x29, 0x2a, 0x00, 0x24, 0x25, 0x3e, 0x01, 0x3a, 0x38, 0x28, 0x29, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x35, 0x35, 0x35, 0x36, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x3d, 0x2a, 0x28, 0x67, 0x14, 0x22, 0x22, 0x23, 0x28, 0x28, 0x28, 0x28, 0x28, 0x39, 0x00, 0x58, 0x28, 0x38, 0x28, 0x3d, 0x00, 0x00, 0x3a, 0x29, 0x00, 0x00, 0x00, 0x00, 0x28, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x28, 0x28, 0x2a, 0x29, 0x00, 0x00, 0x58, 0x10, 0x00, 0x12, 0x00, 0x2a, 0x28, + 0x22, 0x22, 0x22, 0x25, 0x26, 0x29, 0x00, 0x21, 0x23, 0x11, 0x11, 0x21, 0x22, 0x22, 0x25, 0x25, 0x00, 0x2a, 0x38, 0x37, 0x28, 0x29, 0x00, 0x30, 0x11, 0x11, 0x11, 0x00, 0x00, 0x00, 0x3a, 0x28, 0x00, 0x01, 0x3f, 0x00, 0x00, 0x00, 0x2a, 0x28, 0x24, 0x26, 0x29, 0x00, 0x00, 0x00, 0x24, 0x25, 0x22, 0x22, 0x22, 0x23, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x17, 0x00, 0x00, 0x2a, 0x28, 0x20, 0x39, 0x00, 0x3a, 0x20, 0x00, 0x00, 0x3a, 0x00, 0x34, 0x35, 0x35, 0x35, 0x35, 0x25, 0x25, 0x25, 0x22, 0x22, 0x22, 0x23, 0x28, 0x28, 0x28, 0x28, 0x10, 0x28, 0x28, 0x21, 0x22, 0x0b, 0x10, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x28, 0x10, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x28, 0x38, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x28, 0x39, 0x17, 0x00, 0x00, 0x28, + 0x25, 0x48, 0x25, 0x25, 0x26, 0x11, 0x11, 0x24, 0x25, 0x22, 0x22, 0x25, 0x25, 0x25, 0x48, 0x25, 0x00, 0x01, 0x2a, 0x28, 0x28, 0x67, 0x3f, 0x24, 0x22, 0x22, 0x23, 0x00, 0x00, 0x00, 0x38, 0x28, 0x22, 0x22, 0x23, 0x00, 0x00, 0x12, 0x00, 0x2a, 0x24, 0x26, 0x00, 0x00, 0x00, 0x12, 0x24, 0x25, 0x25, 0x25, 0x25, 0x26, 0x00, 0x00, 0x00, 0x00, 0x17, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x20, 0x28, 0x39, 0x28, 0x27, 0x08, 0x00, 0x28, 0x67, 0x68, 0x20, 0x28, 0x28, 0x28, 0x25, 0x48, 0x25, 0x25, 0x25, 0x25, 0x26, 0x2a, 0x28, 0x28, 0x21, 0x22, 0x22, 0x22, 0x25, 0x25, 0x3a, 0x28, 0x01, 0x3d, 0x00, 0x00, 0x00, 0x68, 0x28, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x01, 0x68, 0x28, 0x28, 0x00, 0x17, 0x17, 0x17, 0x00, 0x3a, 0x28, 0x00, 0x00, 0x3a, 0x28, + 0x25, 0x25, 0x25, 0x25, 0x25, 0x22, 0x22, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x25, 0x25, 0x48, 0x26, 0x67, 0x58, 0x68, 0x28, 0x28, 0x25, 0x48, 0x26, 0x00, 0x00, 0x27, 0x00, 0x00, 0x24, 0x26, 0x00, 0x00, 0x00, 0x21, 0x25, 0x25, 0x25, 0x25, 0x48, 0x26, 0x17, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x20, 0x28, 0x10, 0x28, 0x30, 0x00, 0x3a, 0x28, 0x28, 0x28, 0x20, 0x28, 0x28, 0x28, 0x25, 0x25, 0x25, 0x25, 0x48, 0x25, 0x26, 0x00, 0x00, 0x2a, 0x24, 0x25, 0x25, 0x25, 0x48, 0x25, 0x28, 0x21, 0x22, 0x23, 0x00, 0x00, 0x00, 0x28, 0x28, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x22, 0x22, 0x23, 0x28, 0x67, 0x00, 0x00, 0x00, 0x00, 0x28, 0x28, 0x39, 0x00, 0x28, 0x38, + 0x25, 0x32, 0x33, 0x00, 0x00, 0x00, 0x24, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x25, 0x25, 0x25, 0x25, 0x26, 0x28, 0x28, 0x28, 0x28, 0x24, 0x25, 0x32, 0x32, 0x32, 0x32, 0x25, 0x48, 0x25, 0x25, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x25, 0x26, 0x28, 0x28, 0x28, 0x24, 0x48, 0x25, 0x25, 0x25, 0x25, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x25, 0x25, 0x32, 0x32, 0x32, 0x32, 0x33, 0x31, 0x32, 0x32, 0x32, 0x32, 0x33, 0x28, 0x29, 0x00, 0x26, 0x28, 0x29, 0x28, 0x67, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x28, 0x31, 0x32, 0x32, 0x32, 0x25, 0x25, 0x25, 0x32, 0x33, 0x28, 0x28, 0x00, 0x31, 0x25, 0x25, 0x48, 0x25, 0x25, 0x25, 0x48, 0x25, 0x25, 0x48, 0x26, 0x28, 0x38, 0x28, 0x31, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x25, 0x48, + 0x26, 0x28, 0x28, 0x00, 0x00, 0x00, 0x30, 0x40, 0x2a, 0x28, 0x28, 0x28, 0x28, 0x28, 0x24, 0x25, 0x25, 0x48, 0x26, 0x28, 0x38, 0x28, 0x28, 0x31, 0x33, 0x38, 0x28, 0x29, 0x00, 0x31, 0x32, 0x25, 0x26, 0x28, 0x00, 0x00, 0x16, 0x3a, 0x28, 0x28, 0x31, 0x33, 0x28, 0x28, 0x38, 0x24, 0x25, 0x25, 0x48, 0x25, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x25, 0x26, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x10, 0x28, 0x28, 0x38, 0x39, 0x00, 0x26, 0x28, 0x1a, 0x38, 0x20, 0x39, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x38, 0x28, 0x28, 0x28, 0x25, 0x25, 0x26, 0x28, 0x28, 0x28, 0x29, 0x00, 0x3b, 0x24, 0x25, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x33, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x10, 0x28, 0x28, 0x20, 0x31, 0x25, + 0x33, 0x28, 0x39, 0x00, 0x00, 0x00, 0x37, 0x00, 0x00, 0x2a, 0x38, 0x28, 0x00, 0x2a, 0x24, 0x25, 0x25, 0x25, 0x26, 0x28, 0x28, 0x28, 0x28, 0x20, 0x28, 0x29, 0x2a, 0x00, 0x00, 0x00, 0x2a, 0x31, 0x33, 0x28, 0x11, 0x11, 0x11, 0x28, 0x28, 0x28, 0x00, 0x00, 0x28, 0x00, 0x2a, 0x31, 0x25, 0x25, 0x25, 0x25, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x25, 0x26, 0x00, 0x00, 0x00, 0x00, 0x11, 0x11, 0x00, 0x00, 0x00, 0x29, 0x2a, 0x28, 0x29, 0x00, 0x26, 0x28, 0x3a, 0x28, 0x20, 0x10, 0x20, 0x11, 0x11, 0x11, 0x21, 0x22, 0x23, 0x28, 0x28, 0x10, 0x25, 0x25, 0x26, 0x28, 0x38, 0x28, 0x00, 0x00, 0x3b, 0x24, 0x26, 0x2b, 0x00, 0x2a, 0x2a, 0x38, 0x28, 0x28, 0x28, 0x28, 0x28, 0x29, 0x00, 0x2a, 0x28, 0x00, 0x28, 0x28, 0x38, 0x28, 0x28, 0x31, + 0x28, 0x28, 0x10, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x28, 0x39, 0x00, 0x24, 0x48, 0x25, 0x25, 0x26, 0x28, 0x29, 0x00, 0x28, 0x20, 0x67, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x10, 0x21, 0x22, 0x23, 0x28, 0x38, 0x29, 0x00, 0x3a, 0x10, 0x29, 0x00, 0x2a, 0x24, 0x25, 0x32, 0x32, 0x33, 0x67, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x25, 0x26, 0x39, 0x00, 0x00, 0x00, 0x21, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x22, 0x22, 0x25, 0x22, 0x22, 0x23, 0x21, 0x22, 0x23, 0x21, 0x22, 0x23, 0x24, 0x48, 0x26, 0x28, 0x28, 0x28, 0x32, 0x32, 0x33, 0x28, 0x28, 0x28, 0x00, 0x00, 0x3b, 0x31, 0x33, 0x2b, 0x00, 0x00, 0x00, 0x28, 0x10, 0x28, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0x00, 0x2a, 0x28, 0x28, 0x28, 0x29, 0x00, + 0x28, 0x28, 0x28, 0x00, 0x16, 0x00, 0x00, 0x00, 0x16, 0x2a, 0x28, 0x28, 0x28, 0x00, 0x24, 0x25, 0x25, 0x25, 0x26, 0x27, 0x00, 0x00, 0x2a, 0x20, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x34, 0x25, 0x25, 0x33, 0x29, 0x2a, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x11, 0x11, 0x24, 0x25, 0x22, 0x23, 0x28, 0x28, 0x00, 0x00, 0x2c, 0x46, 0x47, 0x2c, 0x00, 0x00, 0x00, 0x42, 0x53, 0x53, 0x25, 0x26, 0x28, 0x00, 0x00, 0x3a, 0x24, 0x26, 0x00, 0x00, 0x16, 0x00, 0x00, 0x24, 0x25, 0x25, 0x25, 0x25, 0x48, 0x26, 0x31, 0x32, 0x33, 0x31, 0x32, 0x33, 0x24, 0x25, 0x26, 0x20, 0x28, 0x38, 0x22, 0x22, 0x23, 0x28, 0x29, 0x28, 0x67, 0x00, 0x00, 0x28, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x38, 0x00, 0x11, 0x11, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x28, 0x29, 0x2a, 0x16, 0x00, + 0x28, 0x38, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3a, 0x28, 0x29, 0x00, 0x24, 0x25, 0x48, 0x25, 0x26, 0x37, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3a, 0x29, 0x3b, 0x24, 0x26, 0x28, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3b, 0x21, 0x22, 0x25, 0x25, 0x25, 0x26, 0x38, 0x28, 0x67, 0x00, 0x3c, 0x56, 0x57, 0x3c, 0x42, 0x43, 0x43, 0x53, 0x63, 0x63, 0x32, 0x33, 0x28, 0x39, 0x00, 0x28, 0x24, 0x26, 0x11, 0x11, 0x11, 0x11, 0x11, 0x24, 0x25, 0x25, 0x25, 0x48, 0x25, 0x26, 0x20, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x24, 0x25, 0x26, 0x28, 0x28, 0x28, 0x25, 0x25, 0x26, 0x00, 0x00, 0x2a, 0x28, 0x14, 0x3a, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x29, 0x3b, 0x21, 0x23, 0x00, 0x00, 0x17, 0x00, 0x00, 0x11, 0x28, 0x67, 0x00, 0x00, 0x00, + 0x28, 0x28, 0x28, 0x67, 0x58, 0x00, 0x00, 0x00, 0x58, 0x68, 0x28, 0x38, 0x00, 0x00, 0x31, 0x32, 0x32, 0x32, 0x33, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x27, 0x28, 0x28, 0x00, 0x3b, 0x24, 0x26, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3b, 0x31, 0x25, 0x48, 0x25, 0x25, 0x33, 0x28, 0x28, 0x28, 0x39, 0x21, 0x22, 0x22, 0x23, 0x52, 0x53, 0x53, 0x64, 0x00, 0x00, 0x29, 0x00, 0x2a, 0x28, 0x38, 0x28, 0x31, 0x32, 0x35, 0x35, 0x35, 0x35, 0x22, 0x25, 0x48, 0x25, 0x25, 0x25, 0x25, 0x25, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0x32, 0x33, 0x28, 0x10, 0x28, 0x48, 0x25, 0x26, 0x11, 0x11, 0x11, 0x34, 0x35, 0x36, 0x11, 0x11, 0x11, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3b, 0x31, 0x33, 0x11, 0x11, 0x11, 0x11, 0x11, 0x27, 0x28, 0x29, 0x00, 0x00, 0x3b, + 0x28, 0x28, 0x28, 0x28, 0x10, 0x29, 0x00, 0x00, 0x00, 0x2a, 0x28, 0x28, 0x67, 0x00, 0x00, 0x28, 0x35, 0x35, 0x35, 0x36, 0x11, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x30, 0x28, 0x38, 0x00, 0x3b, 0x31, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x28, 0x31, 0x32, 0x25, 0x26, 0x2a, 0x28, 0x28, 0x10, 0x28, 0x24, 0x25, 0x25, 0x26, 0x62, 0x63, 0x64, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0x28, 0x28, 0x28, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0x32, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x26, 0x67, 0x58, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x2a, 0x28, 0x28, 0x25, 0x25, 0x32, 0x35, 0x35, 0x35, 0x22, 0x22, 0x22, 0x22, 0x22, 0x35, 0x36, 0x39, 0x00, 0x00, 0x00, 0x00, 0x3b, 0x34, 0x35, 0x35, 0x35, 0x35, 0x35, 0x36, 0x30, 0x38, 0x00, 0x00, 0x00, 0x17, + 0x28, 0x29, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x2a, 0x29, 0x00, 0x3a, 0x28, 0x28, 0x28, 0x28, 0x34, 0x36, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x30, 0x28, 0x28, 0x00, 0x00, 0x2a, 0x29, 0x00, 0x00, 0x11, 0x11, 0x00, 0x00, 0x00, 0x00, 0x28, 0x28, 0x28, 0x31, 0x26, 0x00, 0x29, 0x00, 0x2a, 0x28, 0x24, 0x48, 0x25, 0x25, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0x00, 0x3a, 0x28, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x31, 0x32, 0x25, 0x25, 0x48, 0x25, 0x26, 0x38, 0x29, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x58, 0x68, 0x28, 0x32, 0x33, 0x10, 0x28, 0x29, 0x3b, 0x24, 0x48, 0x25, 0x25, 0x26, 0x28, 0x28, 0x28, 0x00, 0x00, 0x00, 0x00, 0x3b, 0x20, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x30, 0x28, 0x00, 0x00, 0x00, 0x17, + 0x28, 0x3a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x28, 0x28, 0x28, 0x38, 0x10, 0x29, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x37, 0x10, 0x28, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x21, 0x36, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x28, 0x38, 0x0b, 0x26, 0x00, 0x00, 0x00, 0x00, 0x21, 0x25, 0x25, 0x25, 0x25, 0x26, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x28, 0x28, 0x28, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x2a, 0x38, 0x28, 0x29, 0x25, 0x25, 0x25, 0x25, 0x26, 0x28, 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x2a, 0x21, 0x22, 0x28, 0x28, 0x29, 0x08, 0x00, 0x3b, 0x24, 0x25, 0x25, 0x48, 0x26, 0x28, 0x28, 0x29, 0x12, 0x00, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x29, 0x00, 0x00, 0x00, 0x3b, + 0x38, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3a, 0x10, 0x29, 0x00, 0x00, 0x28, 0x38, 0x28, 0x28, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x28, 0x28, 0x22, 0x35, 0x35, 0x35, 0x35, 0x35, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x28, 0x39, 0x33, 0x00, 0x00, 0x00, 0x00, 0x31, 0x32, 0x25, 0x25, 0x25, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x38, 0x28, 0x29, 0x00, 0x00, 0x00, 0x00, 0x3b, 0x20, 0x2b, 0x00, 0x68, 0x28, 0x28, 0x00, 0x32, 0x32, 0x32, 0x32, 0x33, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0x25, 0x28, 0x28, 0x00, 0x00, 0x00, 0x3b, 0x31, 0x32, 0x32, 0x25, 0x26, 0x38, 0x28, 0x00, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x37, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x28, 0x29, 0x28, 0x29, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x2a, 0x33, 0x28, 0x38, 0x28, 0x28, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x28, 0x28, 0x00, 0x00, 0x00, 0x00, 0x42, 0x43, 0x44, 0x24, 0x25, 0x26, 0x28, 0x39, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x2a, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x2a, 0x20, 0x10, 0x29, 0x2c, 0x1b, 0x1b, 0x1b, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x31, 0x28, 0x29, 0x16, 0x00, 0x00, 0x00, 0x1b, 0x1b, 0x1b, 0x31, 0x33, 0x28, 0x10, 0x67, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x3a, 0x27, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x11, 0x11, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x3a, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x28, 0x00, 0x28, 0x28, 0x29, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x28, 0x28, 0x00, 0x00, 0x00, 0x00, 0x52, 0x53, 0x54, 0x24, 0x48, 0x26, 0x28, 0x28, 0x00, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, 0x3b, 0x20, 0x2b, 0x39, 0x00, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x28, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0x1b, 0x2a, 0x28, 0x29, 0x00, 0x00, 0x01, 0x00, 0x00, 0x27, 0x39, 0x00, 0x38, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x11, 0x20, 0x11, 0x11, 0x11, 0x21, 0x22, 0x23, 0x00, 0x00, 0x00, 0x12, 0x12, 0x00, 0x2a, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0x00, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x67, 0x68, 0x28, 0x29, 0x00, 0x00, 0x3f, 0x01, 0x00, 0x52, 0x53, 0x54, 0x24, 0x25, 0x26, 0x28, 0x10, 0x67, 0x3a, 0x39, 0x00, 0x01, 0x3f, 0x00, 0x00, 0x00, 0x2a, 0x38, 0x29, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3a, 0x67, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x38, 0x28, 0x67, 0x58, 0x68, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x68, 0x28, 0x00, 0x00, 0x00, 0x21, 0x23, 0x00, 0x37, 0x28, 0x29, 0x28, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x23, 0x24, 0x48, 0x26, 0x11, 0x11, 0x11, 0x20, 0x20, 0x11, 0x11, 0x00, 0x27, 0x39, 0x00, 0x00, 0x17, 0x17, 0x00, 0x00, 0x00, 0x17, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x17, 0x17, 0x00, 0x00, 0x00, 0x28, 0x28, 0x38, 0x39, 0x3a, 0x00, 0x21, 0x22, 0x23, 0x52, 0x53, 0x54, 0x24, 0x25, 0x33, 0x28, 0x28, 0x28, 0x38, 0x29, 0x00, 0x22, 0x23, 0x2b, 0x00, 0x00, 0x08, 0x28, 0x39, 0x3b, 0x27, 0x00, 0x00, 0x00, 0x00, 0x14, 0x24, 0x23, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x28, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x28, 0x28, 0x10, 0x28, 0x67, 0x00, 0x17, 0x17, 0x17, 0x17, 0x17, 0x28, 0x28, 0x39, 0x00, 0x00, 0x31, 0x33, 0x39, 0x27, 0x10, 0x12, 0x28, 0x37, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x25, 0x48, 0x25, 0x25, 0x25, 0x26, 0x24, 0x25, 0x26, 0x21, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x3a, 0x30, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3a, 0x28, 0x28, 0x28, 0x28, 0x28, 0x00, 0x24, 0x25, 0x26, 0x52, 0x53, 0x54, 0x24, 0x26, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x39, 0x25, 0x26, 0x2b, 0x00, 0x00, 0x3a, 0x28, 0x10, 0x3b, 0x30, 0x00, 0x00, 0x00, 0x21, 0x22, 0x25, 0x26, 0x00, 0x00, 0x00, 0x27, 0x00, 0x00, 0x3a, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x28, 0x38, 0x28, 0x28, 0x28, 0x39, 0x00, 0x00, 0x00, 0x58, 0x68, 0x28, 0x38, 0x28, 0x00, 0x00, 0x22, 0x23, 0x38, 0x30, 0x28, 0x17, 0x28, 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x24, 0x25, 0x25, 0x25, 0x25, 0x48, 0x25, 0x33, 0x29, 0x00, 0x00, 0x31, 0x32, 0x32, 0x32, 0x25, 0x32, 0x32, 0x32, 0x32, 0x32, 0x25, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3b, 0x20, 0x00, 0x00, 0x31, 0x32, 0x32, 0x25, 0x25, 0x26, 0x00, 0x2a, 0x28, 0x38, 0x24, 0x25, 0x25, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x10, 0x28, 0x29, 0x00, 0x31, 0x32, 0x32, 0x25, 0x63, 0x63, 0x63, 0x64, 0x52, 0x53, 0x53, 0x53, 0x54, 0x55, 0x00, 0x00, 0x00, 0x55, 0x52, 0x53, 0x25, 0x48, 0x25, 0x25, 0x26, 0x2b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x25, 0x25, 0x25, 0x26, 0x28, 0x28, 0x28, 0x24, 0x25, 0x48, 0x25, 0x25, 0x25, 0x48, 0x25, 0x25, 0x25, 0x25, 0x25, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x68, 0x28, 0x24, 0x48, 0x25, 0x25, 0x25, 0x25, 0x25, 0x1b, 0x00, 0x16, 0x00, 0x1b, 0x1b, 0x1b, 0x1b, 0x30, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x30, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x11, 0x20, 0x00, 0x00, 0x00, 0x2a, 0x28, 0x24, 0x25, 0x33, 0x00, 0x00, 0x00, 0x2a, 0x31, 0x32, 0x33, 0x00, 0x00, 0x29, 0x00, 0x00, 0x38, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x2a, 0x28, 0x31, 0x00, 0x00, 0x00, 0x00, 0x62, 0x63, 0x63, 0x63, 0x64, 0x55, 0x00, 0x00, 0x00, 0x55, 0x52, 0x53, 0x25, 0x25, 0x25, 0x48, 0x26, 0x2b, 0x3a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x25, 0x48, 0x25, 0x26, 0x28, 0x38, 0x28, 0x31, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x25, 0x25, 0x48, 0x25, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x10, 0x28, 0x31, 0x32, 0x25, 0x25, 0x48, 0x25, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x37, 0x00, 0x00, 0x00, 0x00, 0x00, 0x37, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3b, 0x34, 0x35, 0x36, 0x00, 0x14, 0x00, 0x00, 0x10, 0x31, 0x26, 0x2b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3b, 0x20, 0x2b, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x65, 0x00, 0x00, 0x00, 0x55, 0x62, 0x63, 0x25, 0x25, 0x25, 0x32, 0x33, 0x2b, 0x28, 0x29, 0x00, 0x11, 0x11, 0x20, 0x24, 0x25, 0x25, 0x25, 0x26, 0x10, 0x29, 0x00, 0x28, 0x29, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x28, 0x31, 0x25, 0x25, 0x25, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x28, 0x28, 0x24, 0x25, 0x25, 0x25, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3b, 0x34, 0x35, 0x36, 0x39, 0x00, 0x00, 0x1b, 0x26, 0x72, 0x73, 0x73, 0x73, 0x73, 0x73, 0x73, 0x73, 0x73, 0x73, 0x74, 0x11, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x1b, 0x00, 0x3b, 0x20, 0x2b, 0x00, 0x00, 0x00, 0x16, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x65, 0x00, 0x00, 0x25, 0x25, 0x33, 0x28, 0x28, 0x28, 0x28, 0x10, 0x3a, 0x21, 0x22, 0x22, 0x25, 0x25, 0x25, 0x25, 0x26, 0x28, 0x00, 0x00, 0x2a, 0x00, 0x11, 0x11, 0x11, 0x00, 0x00, 0x28, 0x38, 0x24, 0x25, 0x25, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0x3a, 0x28, 0x28, 0x24, 0x25, 0x25, 0x25, 0x25, 0x00, 0x00, 0x16, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x10, 0x28, 0x00, 0x11, 0x25, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x23, 0x2b, 0x00, 0x00, 0x00, 0x00, 0x3b, 0x20, 0x2b, 0x00, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x26, 0x28, 0x28, 0x28, 0x38, 0x28, 0x28, 0x28, 0x31, 0x32, 0x32, 0x25, 0x48, 0x25, 0x25, 0x26, 0x29, 0x00, 0x00, 0x00, 0x11, 0x42, 0x43, 0x44, 0x00, 0x00, 0x2a, 0x28, 0x24, 0x25, 0x48, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x28, 0x38, 0x28, 0x24, 0x48, 0x25, 0x25, 0x25, 0x00, 0x00, 0x00, 0x00, 0x3b, 0x20, 0x2b, 0x39, 0x16, 0x00, 0x3b, 0x20, 0x2b, 0x00, 0x16, 0x00, 0x27, 0x39, 0x3a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0x2a, 0x28, 0x39, 0x21, 0x25, 0x48, 0x25, 0x25, 0x25, 0x25, 0x25, 0x32, 0x32, 0x32, 0x32, 0x32, 0x26, 0x2b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0x68, 0x28, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x00, 0x00, 0x25, 0x26, 0x28, 0x28, 0x10, 0x2a, 0x00, 0x2a, 0x28, 0x28, 0x29, 0x00, 0x31, 0x32, 0x32, 0x32, 0x26, 0x11, 0x11, 0x11, 0x11, 0x42, 0x53, 0x53, 0x54, 0x00, 0x00, 0x3b, 0x21, 0x25, 0x25, 0x25, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x28, 0x28, 0x31, 0x32, 0x32, 0x32, 0x32, 0x28, 0x00, 0x00, 0x3a, 0x00, 0x1b, 0x3a, 0x28, 0x39, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x37, 0x28, 0x38, 0x39, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x3a, 0x28, 0x28, 0x31, 0x32, 0x32, 0x32, 0x32, 0x25, 0x48, 0x26, 0x28, 0x29, 0x00, 0x2a, 0x10, 0x37, 0x2b, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3b, 0x20, 0x2b, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3a, 0x58, 0x28, 0x28, 0x68, 0x28, 0x28, 0x28, 0x28, 0x28, 0x39, 0x00, 0x00, 0x00, 0x25, 0x26, 0x38, 0x28, 0x29, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0x22, 0x22, 0x22, 0x23, 0x62, 0x63, 0x63, 0x64, 0x00, 0x00, 0x3b, 0x24, 0x25, 0x25, 0x25, + 0x00, 0x00, 0x00, 0x11, 0x11, 0x11, 0x11, 0x3a, 0x28, 0x28, 0x10, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x28, 0x39, 0x28, 0x28, 0x39, 0x00, 0x28, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x2a, 0x28, 0x27, 0x11, 0x00, 0x00, 0x00, 0x00, 0x3b, 0x27, 0x28, 0x28, 0x38, 0x1b, 0x22, 0x22, 0x22, 0x23, 0x31, 0x32, 0x33, 0x16, 0x00, 0x00, 0x68, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x68, 0x39, 0x28, 0x28, 0x28, 0x28, 0x10, 0x29, 0x00, 0x00, 0x2a, 0x10, 0x28, 0x3a, 0x67, 0x68, 0x25, 0x26, 0x28, 0x28, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0x25, 0x48, 0x25, 0x25, 0x23, 0x28, 0x38, 0x29, 0x00, 0x00, 0x3b, 0x24, 0x48, 0x25, 0x25, + 0x00, 0x00, 0x68, 0x21, 0x22, 0x22, 0x23, 0x28, 0x38, 0x28, 0x28, 0x39, 0x00, 0x00, 0x00, 0x00, 0x28, 0x28, 0x28, 0x28, 0x28, 0x38, 0x28, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0x11, 0x00, 0x3a, 0x28, 0x37, 0x27, 0x00, 0x00, 0x00, 0x00, 0x3b, 0x37, 0x2a, 0x28, 0x29, 0x11, 0x25, 0x25, 0x48, 0x26, 0x38, 0x28, 0x2a, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x00, 0x16, 0x28, 0x28, 0x28, 0x2a, 0x38, 0x28, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x28, 0x28, 0x28, 0x25, 0x26, 0x28, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0x25, 0x25, 0x25, 0x25, 0x26, 0x10, 0x2a, 0x00, 0x00, 0x00, 0x3b, 0x24, 0x25, 0x25, 0x25, + 0x00, 0x00, 0x10, 0x31, 0x32, 0x25, 0x25, 0x22, 0x35, 0x35, 0x35, 0x36, 0x00, 0x00, 0x00, 0x00, 0x28, 0x38, 0x00, 0x2a, 0x28, 0x28, 0x28, 0x10, 0x39, 0x39, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x27, 0x28, 0x28, 0x29, 0x1b, 0x30, 0x39, 0x00, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x2a, 0x28, 0x21, 0x25, 0x32, 0x25, 0x26, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x36, 0x2b, 0x00, 0x28, 0x28, 0x29, 0x00, 0x28, 0x28, 0x29, 0x00, 0x60, 0x61, 0x00, 0x3a, 0x28, 0x38, 0x28, 0x2a, 0x48, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0x48, 0x25, 0x25, 0x25, 0x26, 0x29, 0x00, 0x00, 0x11, 0x11, 0x11, 0x24, 0x25, 0x25, 0x25, + 0x00, 0x00, 0x2a, 0x28, 0x28, 0x31, 0x32, 0x26, 0x1b, 0x1b, 0x1b, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x28, 0x28, 0x28, 0x28, 0x39, 0x3b, 0x27, 0x2b, 0x00, 0x00, 0x37, 0x28, 0x10, 0x00, 0x11, 0x30, 0x28, 0x3a, 0x00, 0x00, 0x00, 0x11, 0x00, 0x28, 0x28, 0x31, 0x26, 0x01, 0x31, 0x33, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x39, 0x00, 0x00, 0x00, 0x00, 0x20, 0x28, 0x38, 0x28, 0x28, 0x28, 0x20, 0x28, 0x28, 0x28, 0x28, 0x28, 0x27, 0x2b, 0x00, 0x38, 0x28, 0x00, 0x00, 0x2a, 0x28, 0x3d, 0x00, 0x70, 0x71, 0x3f, 0x28, 0x28, 0x29, 0x00, 0x00, 0x25, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0x25, 0x25, 0x25, 0x48, 0x26, 0x00, 0x00, 0x3b, 0x21, 0x22, 0x23, 0x31, 0x25, 0x48, 0x25, + 0x00, 0x00, 0x00, 0x28, 0x38, 0x29, 0x3b, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x28, 0x28, 0x28, 0x3b, 0x30, 0x2b, 0x00, 0x00, 0x1b, 0x2a, 0x28, 0x38, 0x27, 0x30, 0x28, 0x10, 0x39, 0x00, 0x00, 0x27, 0x3a, 0x28, 0x29, 0x1b, 0x26, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0x38, 0x28, 0x00, 0x00, 0x00, 0x00, 0x1b, 0x2a, 0x28, 0x28, 0x10, 0x28, 0x1b, 0x2a, 0x28, 0x38, 0x2a, 0x28, 0x37, 0x2b, 0x00, 0x28, 0x28, 0x39, 0x00, 0x00, 0x28, 0x21, 0x22, 0x23, 0x21, 0x22, 0x23, 0x28, 0x00, 0x00, 0x3a, 0x32, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x32, 0x32, 0x32, 0x32, 0x33, 0x00, 0x00, 0x3b, 0x24, 0x25, 0x25, 0x23, 0x31, 0x25, 0x25, + 0x00, 0x00, 0x00, 0x2a, 0x28, 0x00, 0x3b, 0x37, 0x00, 0x00, 0x00, 0x00, 0x3a, 0x27, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x11, 0x11, 0x11, 0x11, 0x28, 0x38, 0x3b, 0x37, 0x2b, 0x00, 0x3a, 0x00, 0x00, 0x28, 0x28, 0x37, 0x30, 0x29, 0x00, 0x28, 0x38, 0x00, 0x37, 0x28, 0x38, 0x00, 0x11, 0x26, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x28, 0x28, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0x16, 0x2a, 0x28, 0x00, 0x00, 0x28, 0x16, 0x00, 0x28, 0x28, 0x00, 0x00, 0x10, 0x29, 0x00, 0x00, 0x00, 0x20, 0x31, 0x32, 0x33, 0x24, 0x48, 0x26, 0x28, 0x42, 0x43, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x58, 0x68, 0x00, 0x00, 0x00, 0x38, 0x28, 0x28, 0x29, 0x00, 0x00, 0x00, 0x00, 0x3b, 0x24, 0x25, 0x48, 0x25, 0x23, 0x31, 0x32, + 0x00, 0x00, 0x01, 0x00, 0x28, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x2a, 0x28, 0x30, 0x00, 0x00, 0x22, 0x22, 0x23, 0x11, 0x11, 0x21, 0x35, 0x35, 0x36, 0x10, 0x28, 0x28, 0x29, 0x00, 0x00, 0x38, 0x00, 0x00, 0x29, 0x00, 0x1b, 0x30, 0x00, 0x00, 0x2a, 0x28, 0x00, 0x00, 0x28, 0x28, 0x00, 0x21, 0x26, 0x28, 0x29, 0x00, 0x00, 0x00, 0x00, 0x3a, 0x28, 0x29, 0x00, 0x28, 0x28, 0x00, 0x00, 0x00, 0x00, 0x58, 0x68, 0x00, 0x00, 0x28, 0x28, 0x3a, 0x28, 0x28, 0x39, 0x00, 0x28, 0x29, 0x16, 0x00, 0x28, 0x00, 0x01, 0x00, 0x00, 0x21, 0x22, 0x22, 0x22, 0x25, 0x25, 0x25, 0x23, 0x52, 0x53, 0x53, 0x00, 0x00, 0x00, 0x3f, 0x01, 0x00, 0x00, 0x3a, 0x28, 0x00, 0x00, 0x2a, 0x10, 0x00, 0x00, 0x00, 0x28, 0x29, 0x00, 0x00, 0x00, 0x00, 0x39, 0x00, 0x3b, 0x24, 0x25, 0x25, 0x25, 0x25, 0x22, 0x22, + 0x40, 0x00, 0x21, 0x22, 0x23, 0x2b, 0x00, 0x38, 0x39, 0x12, 0x00, 0x68, 0x38, 0x30, 0x39, 0x00, 0x25, 0x48, 0x25, 0x22, 0x22, 0x26, 0x0c, 0x00, 0x2a, 0x28, 0x28, 0x28, 0x00, 0x00, 0x3a, 0x28, 0x01, 0x00, 0x00, 0x00, 0x3a, 0x37, 0x08, 0x00, 0x00, 0x28, 0x39, 0x00, 0x28, 0x29, 0x00, 0x31, 0x26, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x38, 0x00, 0x3a, 0x28, 0x10, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x28, 0x28, 0x28, 0x29, 0x2a, 0x28, 0x28, 0x38, 0x28, 0x28, 0x28, 0x00, 0x00, 0x00, 0x43, 0x43, 0x43, 0x43, 0x44, 0x24, 0x25, 0x48, 0x25, 0x25, 0x25, 0x25, 0x26, 0x52, 0x53, 0x53, 0x00, 0x00, 0x00, 0x21, 0x36, 0x00, 0x00, 0x38, 0x28, 0x39, 0x00, 0x00, 0x28, 0x00, 0x1c, 0x00, 0x28, 0x01, 0x3d, 0x3e, 0x00, 0x3a, 0x28, 0x00, 0x3b, 0x24, 0x25, 0x25, 0x25, 0x48, 0x25, 0x25, + 0x21, 0x23, 0x24, 0x25, 0x26, 0x2b, 0x68, 0x28, 0x28, 0x27, 0x28, 0x28, 0x10, 0x30, 0x28, 0x00, 0x25, 0x25, 0x25, 0x25, 0x48, 0x26, 0x00, 0x00, 0x00, 0x28, 0x28, 0x29, 0x00, 0x00, 0x28, 0x28, 0x23, 0x00, 0x00, 0x00, 0x38, 0x28, 0x39, 0x00, 0x00, 0x2a, 0x28, 0x10, 0x28, 0x00, 0x00, 0x1b, 0x26, 0x38, 0x39, 0x00, 0x00, 0x00, 0x00, 0x28, 0x28, 0x00, 0x28, 0x28, 0x28, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x28, 0x00, 0x00, 0x00, 0x2a, 0x28, 0x10, 0x28, 0x00, 0x00, 0x00, 0x00, 0x53, 0x53, 0x53, 0x53, 0x54, 0x24, 0x25, 0x25, 0x25, 0x25, 0x25, 0x48, 0x26, 0x52, 0x53, 0x53, 0x00, 0x00, 0x00, 0x30, 0x42, 0x44, 0x00, 0x28, 0x28, 0x28, 0x00, 0x00, 0x28, 0x39, 0x00, 0x00, 0x22, 0x22, 0x22, 0x23, 0x10, 0x28, 0x38, 0x39, 0x3b, 0x24, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, + 0x25, 0x25, 0x25, 0x25, 0x25, 0x26, 0x2b, 0x1b, 0x1b, 0x1b, 0x31, 0x32, 0x32, 0x25, 0x26, 0x00, 0x48, 0x25, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x25, 0x25, 0x32, 0x32, 0x32, 0x33, 0x28, 0x28, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x48, 0x25, 0x32, 0x33, 0x2b, 0x28, 0x32, 0x32, 0x32, 0x32, 0x32, 0x25, 0x26, 0x28, 0x28, 0x00, 0x00, 0x3b, 0x24, 0x25, 0x25, 0x25, 0x25, 0x48, 0x25, 0x25, 0x25, 0x25, 0x25, 0x48, 0x48, 0x25, 0x25, 0x25, 0x26, 0x38, 0x28, 0x24, 0x25, 0x48, 0x25, 0x25, 0x32, 0x33, 0x28, 0x28, 0x29, 0x24, 0x25, 0x32, 0x32, 0x32, 0x25, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x25, 0x25, 0x25, 0x48, 0x25, 0x26, 0x2b, 0x00, 0x00, 0x00, 0x1b, 0x1b, 0x1b, 0x24, 0x26, 0x00, 0x32, 0x33, 0x28, 0x67, 0x00, 0x00, 0x00, 0x28, 0x24, 0x33, 0x2b, 0x2a, 0x28, 0x10, 0x28, 0x38, 0x25, 0x25, 0x25, 0x48, 0x25, 0x25, 0x32, 0x32, 0x32, 0x32, 0x25, 0x26, 0x1b, 0x1b, 0x00, 0x38, 0x29, 0x01, 0x00, 0x3a, 0x28, 0x24, 0x26, 0x38, 0x29, 0x00, 0x00, 0x3b, 0x24, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x25, 0x26, 0x10, 0x28, 0x31, 0x25, 0x25, 0x32, 0x33, 0x1b, 0x1b, 0x10, 0x28, 0x14, 0x31, 0x33, 0x38, 0x28, 0x28, 0x24, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x25, 0x25, 0x25, 0x25, 0x25, 0x26, 0x2b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x24, 0x26, 0x67, 0x28, 0x28, 0x38, 0x29, 0x00, 0x00, 0x11, 0x2a, 0x37, 0x2b, 0x00, 0x3a, 0x28, 0x27, 0x29, 0x00, 0x25, 0x25, 0x25, 0x25, 0x25, 0x33, 0x1b, 0x1b, 0x1b, 0x1b, 0x31, 0x33, 0x00, 0x00, 0x00, 0x28, 0x35, 0x35, 0x35, 0x36, 0x28, 0x24, 0x26, 0x28, 0x14, 0x00, 0x00, 0x3b, 0x30, 0x28, 0x2a, 0x2a, 0x1a, 0x28, 0x29, 0x00, 0x2a, 0x28, 0x38, 0x28, 0x28, 0x10, 0x28, 0x24, 0x26, 0x00, 0x2a, 0x38, 0x25, 0x26, 0x1b, 0x1b, 0x00, 0x00, 0x38, 0x21, 0x23, 0x2b, 0x00, 0x00, 0x08, 0x10, 0x24, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x25, 0x48, 0x25, 0x32, 0x32, 0x33, 0x2b, 0x00, 0x00, 0x00, 0x11, 0x00, 0x28, 0x24, 0x26, 0x29, 0x28, 0x10, 0x2a, 0x00, 0x00, 0x3b, 0x27, 0x00, 0x29, 0x00, 0x00, 0x00, 0x38, 0x30, 0x00, 0x00, 0x32, 0x32, 0x25, 0x25, 0x26, 0x2b, 0x00, 0x00, 0x00, 0x00, 0x3b, 0x27, 0x00, 0x00, 0x3a, 0x28, 0x28, 0x28, 0x38, 0x28, 0x28, 0x24, 0x25, 0x22, 0x23, 0x2b, 0x00, 0x3b, 0x37, 0x29, 0x08, 0x00, 0x00, 0x10, 0x00, 0x11, 0x00, 0x29, 0x2a, 0x28, 0x29, 0x11, 0x2a, 0x31, 0x33, 0x00, 0x3a, 0x28, 0x25, 0x26, 0x2b, 0x00, 0x00, 0x00, 0x2a, 0x31, 0x33, 0x2b, 0x00, 0x00, 0x68, 0x28, 0x24, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x25, 0x25, 0x26, 0x21, 0x22, 0x23, 0x2b, 0x00, 0x3a, 0x67, 0x27, 0x2b, 0x2a, 0x24, 0x26, 0x38, 0x28, 0x29, 0x00, 0x00, 0x00, 0x3b, 0x30, 0x00, 0x00, 0x00, 0x00, 0x3a, 0x28, 0x30, 0x00, 0x00, 0x22, 0x23, 0x31, 0x32, 0x33, 0x2b, 0x00, 0x00, 0x00, 0x00, 0x3b, 0x30, 0x28, 0x39, 0x00, 0x2a, 0x38, 0x28, 0x29, 0x10, 0x29, 0x24, 0x48, 0x25, 0x26, 0x2b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x3b, 0x20, 0x2b, 0x3a, 0x16, 0x28, 0x3b, 0x20, 0x2b, 0x00, 0x11, 0x00, 0x00, 0x28, 0x25, 0x26, 0x2b, 0x00, 0x00, 0x00, 0x00, 0x1b, 0x1b, 0x00, 0x00, 0x2a, 0x38, 0x2a, 0x24, 0x25, 0x00, 0x00, 0x00, 0x00, 0x3a, 0x00, 0x28, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x00, 0x00, 0x00, 0x00, + 0x25, 0x25, 0x26, 0x24, 0x48, 0x26, 0x2b, 0x00, 0x2a, 0x38, 0x30, 0x2b, 0x12, 0x24, 0x26, 0x29, 0x38, 0x00, 0x00, 0x00, 0x00, 0x3b, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x30, 0x3e, 0x14, 0x25, 0x25, 0x22, 0x22, 0x23, 0x2b, 0x00, 0x00, 0x00, 0x00, 0x3b, 0x30, 0x29, 0x00, 0x00, 0x00, 0x28, 0x29, 0x00, 0x00, 0x00, 0x24, 0x25, 0x25, 0x26, 0x2b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x2a, 0x28, 0x28, 0x00, 0x1b, 0x00, 0x3b, 0x20, 0x2b, 0x11, 0x2a, 0x25, 0x26, 0x2b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0x3b, 0x24, 0x48, 0x00, 0x00, 0x00, 0x00, 0x28, 0x67, 0x28, 0x00, 0x00, 0x10, 0x00, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x00, 0x00, 0x00, 0x00, + 0x32, 0x32, 0x33, 0x31, 0x32, 0x26, 0x2b, 0x12, 0x00, 0x28, 0x30, 0x2b, 0x17, 0x31, 0x33, 0x00, 0x28, 0x39, 0x58, 0x68, 0x39, 0x3b, 0x30, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x24, 0x22, 0x22, 0x25, 0x25, 0x48, 0x25, 0x26, 0x2b, 0x00, 0x00, 0x11, 0x00, 0x3b, 0x30, 0x2b, 0x00, 0x00, 0x00, 0x28, 0x11, 0x11, 0x11, 0x11, 0x24, 0x25, 0x48, 0x26, 0x2b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x10, 0x67, 0x58, 0x11, 0x00, 0x1b, 0x3b, 0x20, 0x16, 0x48, 0x26, 0x11, 0x11, 0x11, 0x11, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x3b, 0x31, 0x25, 0x00, 0x00, 0x00, 0x00, 0x28, 0x38, 0x28, 0x76, 0x00, 0x28, 0x67, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x00, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x2a, 0x30, 0x11, 0x27, 0x00, 0x2a, 0x30, 0x2b, 0x00, 0x10, 0x10, 0x39, 0x28, 0x28, 0x38, 0x28, 0x34, 0x35, 0x32, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x25, 0x25, 0x48, 0x25, 0x25, 0x25, 0x25, 0x26, 0x2b, 0x00, 0x3b, 0x27, 0x00, 0x3b, 0x30, 0x2b, 0x00, 0x00, 0x00, 0x28, 0x34, 0x35, 0x35, 0x35, 0x32, 0x32, 0x25, 0x26, 0x2b, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3b, 0x20, 0x28, 0x28, 0x38, 0x27, 0x2b, 0x16, 0x00, 0x1b, 0x00, 0x25, 0x25, 0x23, 0x21, 0x22, 0x23, 0x2b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0x24, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x28, 0x28, 0x21, 0x23, 0x28, 0x38, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x00, 0x00, 0x00, 0x00, + 0x29, 0x00, 0x11, 0x00, 0x00, 0x31, 0x35, 0x26, 0x2b, 0x00, 0x31, 0x35, 0x35, 0x35, 0x35, 0x35, 0x29, 0x00, 0x2a, 0x00, 0x00, 0x10, 0x28, 0x28, 0x28, 0x28, 0x29, 0x00, 0x3b, 0x24, 0x25, 0x25, 0x32, 0x32, 0x32, 0x32, 0x26, 0x2b, 0x16, 0x3b, 0x30, 0x00, 0x3b, 0x30, 0x00, 0x00, 0x00, 0x00, 0x29, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x3b, 0x24, 0x26, 0x2b, 0x00, 0x3b, 0x27, 0x2b, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x1b, 0x2a, 0x28, 0x28, 0x37, 0x2b, 0x00, 0x00, 0x00, 0x00, 0x32, 0x32, 0x33, 0x31, 0x32, 0x33, 0x2b, 0x00, 0x00, 0x11, 0x11, 0x00, 0x00, 0x00, 0x3b, 0x24, 0x00, 0x00, 0x00, 0x68, 0x38, 0x28, 0x21, 0x25, 0x25, 0x23, 0x28, 0x39, 0x3a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x3b, 0x27, 0x2b, 0x00, 0x2a, 0x38, 0x30, 0x2b, 0x00, 0x00, 0x00, 0x2a, 0x28, 0x39, 0x3b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x28, 0x38, 0x28, 0x28, 0x67, 0x21, 0x25, 0x25, 0x25, 0x1b, 0x1b, 0x1b, 0x1b, 0x37, 0x2b, 0x00, 0x3b, 0x30, 0x39, 0x3b, 0x30, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3b, 0x24, 0x26, 0x2b, 0x17, 0x3b, 0x30, 0x2b, 0x00, 0x00, 0x3b, 0x20, 0x2b, 0x11, 0x00, 0x00, 0x00, 0x11, 0x00, 0x29, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x3a, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x00, 0x11, 0x11, 0x21, 0x23, 0x11, 0x00, 0x00, 0x3b, 0x24, 0x00, 0x00, 0x00, 0x2a, 0x28, 0x21, 0x25, 0x48, 0x25, 0x25, 0x23, 0x28, 0x38, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x08, 0x3b, 0x30, 0x2b, 0x00, 0x00, 0x28, 0x30, 0x11, 0x11, 0x11, 0x11, 0x00, 0x28, 0x38, 0x3b, 0x11, 0x11, 0x11, 0x11, 0x11, 0x00, 0x00, 0x28, 0x29, 0x00, 0x29, 0x28, 0x24, 0x25, 0x48, 0x25, 0x00, 0x00, 0x00, 0x3a, 0x28, 0x00, 0x00, 0x3b, 0x30, 0x28, 0x3b, 0x37, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3b, 0x24, 0x26, 0x11, 0x11, 0x11, 0x30, 0x2b, 0x00, 0x00, 0x00, 0x1b, 0x3b, 0x20, 0x2b, 0x00, 0x3b, 0x27, 0x2b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x2b, 0x01, 0x00, 0x00, 0x00, 0x00, 0x3b, 0x21, 0x22, 0x25, 0x32, 0x36, 0x2b, 0x00, 0x3b, 0x31, 0x58, 0x58, 0x68, 0x28, 0x29, 0x24, 0x25, 0x25, 0x25, 0x25, 0x26, 0x10, 0x28, 0x28, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x3b, 0x37, 0x2b, 0x00, 0x00, 0x2a, 0x31, 0x35, 0x35, 0x35, 0x36, 0x00, 0x28, 0x29, 0x3b, 0x22, 0x22, 0x22, 0x22, 0x23, 0x11, 0x11, 0x20, 0x2b, 0x00, 0x00, 0x2a, 0x31, 0x32, 0x25, 0x25, 0x00, 0x00, 0x00, 0x10, 0x38, 0x29, 0x00, 0x3b, 0x30, 0x28, 0x28, 0x28, 0x00, 0x00, 0x00, 0x00, 0x11, 0x11, 0x11, 0x11, 0x39, 0x00, 0x11, 0x24, 0x25, 0x22, 0x22, 0x22, 0x33, 0x2b, 0x00, 0x00, 0x01, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x3b, 0x30, 0x2b, 0x00, 0x00, 0x00, 0x00, 0x58, 0x68, 0x28, 0x2b, 0x17, 0x00, 0x00, 0x00, 0x00, 0x3b, 0x24, 0x25, 0x33, 0x1b, 0x1b, 0x00, 0x00, 0x00, 0x1b, 0x28, 0x10, 0x28, 0x38, 0x00, 0x31, 0x32, 0x25, 0x25, 0x48, 0x26, 0x29, 0x00, 0x2a, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x39, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x00, 0x2a, 0x00, 0x3b, 0x32, 0x32, 0x32, 0x32, 0x32, 0x35, 0x36, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x1b, 0x1b, 0x31, 0x25, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x3b, 0x30, 0x28, 0x38, 0x29, 0x00, 0x00, 0x00, 0x00, 0x22, 0x22, 0x22, 0x23, 0x28, 0x38, 0x34, 0x32, 0x32, 0x32, 0x32, 0x33, 0x2b, 0x00, 0x00, 0x00, 0x23, 0x39, 0x00, 0x00, 0x00, 0x00, 0x3b, 0x37, 0x2b, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x10, 0x28, 0x11, 0x11, 0x11, 0x11, 0x00, 0x00, 0x3b, 0x31, 0x33, 0x1b, 0x00, 0x3a, 0x00, 0x16, 0x00, 0x00, 0x00, 0x2a, 0x28, 0x39, 0x3f, 0x21, 0x23, 0x24, 0x25, 0x32, 0x33, 0x20, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x28, 0x29, 0x00, 0x00, 0x01, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3b, 0x39, 0x01, 0x3d, 0x00, 0x00, 0x2a, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x24, 0x00, 0x00, 0x00, 0x68, 0x28, 0x67, 0x00, 0x3b, 0x30, 0x00, 0x2a, 0x28, 0x67, 0x00, 0x00, 0x00, 0x25, 0x25, 0x25, 0x26, 0x00, 0x28, 0x28, 0x00, 0x3a, 0x10, 0x28, 0x2a, 0x00, 0x16, 0x00, 0x3a, 0x26, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x39, 0x3a, 0x28, 0x38, 0x28, 0x22, 0x22, 0x22, 0x23, 0x2b, 0x00, 0x00, 0x1b, 0x1b, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x68, 0x00, 0x00, 0x21, 0x22, 0x22, 0x25, 0x26, 0x31, 0x33, 0x21, 0x22, 0x23, 0x28, 0x39, 0x28, 0x67, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x10, 0x67, 0x58, 0x3a, 0x21, 0x22, 0x23, 0x11, 0x11, 0x11, 0x11, 0x11, 0x00, 0x12, 0x00, 0x3b, 0x22, 0x22, 0x23, 0x39, 0x00, 0x10, 0x28, 0x39, 0x00, 0x00, 0x00, 0x00, 0x08, 0x3a, 0x10, 0x31, 0x01, 0x00, 0x3a, 0x38, 0x28, 0x29, 0x00, 0x3b, 0x37, 0x00, 0x00, 0x38, 0x29, 0x00, 0x00, 0x00, 0x25, 0x48, 0x25, 0x26, 0x00, 0x2a, 0x28, 0x28, 0x28, 0x38, 0x29, 0x00, 0x00, 0x00, 0x00, 0x28, 0x26, 0x38, 0x39, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3a, 0x28, 0x28, 0x28, 0x28, 0x10, 0x25, 0x48, 0x25, 0x26, 0x2b, 0x16, 0x00, 0x00, 0x39, 0x00, 0x00, 0x28, 0x3a, 0x00, 0x3a, 0x28, 0x01, 0x00, 0x31, 0x25, 0x25, 0x48, 0x25, 0x22, 0x22, 0x25, 0x25, 0x25, 0x23, 0x10, 0x38, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x28, 0x38, 0x28, 0x28, 0x24, 0x25, 0x25, 0x22, 0x22, 0x22, 0x22, 0x23, 0x00, 0x17, 0x00, 0x3b, 0x25, 0x25, 0x26, 0x28, 0x3a, 0x28, 0x38, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x28, 0x28, 0x23, 0x00, 0x10, 0x28, 0x28, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x28, 0x10, 0x00, 0x00, 0x00, 0x25, 0x25, 0x25, 0x26, 0x17, 0x17, 0x28, 0x38, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3a, 0x28, 0x26, 0x28, 0x10, 0x27, 0x39, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x28, 0x28, 0x38, 0x28, 0x28, 0x28, 0x25, 0x25, 0x48, 0x26, 0x2b, 0x00, 0x00, 0x3a, 0x38, 0x00, 0x3a, 0x28, 0x10, 0x28, 0x38, 0x28, 0x21, 0x22, 0x23, 0x24, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x48, 0x25, 0x25, 0x22, 0x22, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +} \ No newline at end of file diff --git a/Source/Scripts/pico-8.lua b/Source/Scripts/pico-8.lua new file mode 100644 index 0000000..c9f7be2 --- /dev/null +++ b/Source/Scripts/pico-8.lua @@ -0,0 +1,227 @@ +import "map.lua" + +local sprites = playdate.graphics.imagetable.new("Assets/sprites") +local spritesFlags = { + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, + 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x4, 0x4, 0x4, 0x2, 0x2, 0x0, 0x0, 0x0, + 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x4, 0x4, 0x4, 0x2, 0x2, 0x2, 0x2, 0x2, + 0x0, 0x0, 0x13, 0x13, 0x13, 0x13, 0x2, 0x2, 0x3, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, + 0x0, 0x0, 0x13, 0x13, 0x13, 0x13, 0x2, 0x2, 0x4, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, + 0x0, 0x0, 0x13, 0x13, 0x13, 0x13, 0x0, 0x4, 0x4, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, + 0x0, 0x0, 0x13, 0x13, 0x13, 0x13, 0x0, 0x0, 0x0, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2 +} + +local font = playdate.graphics.font.new("Assets/pico") +playdate.graphics.setFont(font) + + +function add(t, value, index) + + index = index or #t+1 + table.insert(t, index, value) + +end + +function del(t, value) + + for i=1, #t do + if t[i] == value then + table.remove(t, i) + break + end + end + +end + +function flr(num) + + return math.floor(num) + +end + +function abs(num) + + return math.abs(num) + +end + +function rnd(arg) + + arg = arg or 1.0 + if type(arg) == "table" then + return arg[math.random(1, #arg)] + else + return math.random() * arg + end + +end + +function sin(angle) + + return math.sin(math.rad(angle * -1 * 360.0)) + +end + +function cos(angle) + + return math.cos(math.rad(angle * -1 * 360.0)) + +end + +function min(first, second) + + second = second or 0 + return math.min(first, second) + +end + +function max(first, second) + + second = second or 0 + return math.max(first, second) + +end + +function rectfill(x0, y0, x1, y1, col) + + if col == nil then + playdate.graphics.setBackgroundColor(playdate.graphics.kColorBlack) + end + playdate.graphics.fillRect(x0, y0, x1-x0, y1-y0) + +end + +function circfill(x, y, r, col) + + r = r or 4 + if col == nil then + playdate.graphics.setBackgroundColor(playdate.graphics.kColorBlack) + end + playdate.graphics.fillCircleAtPoint(x, y, r) + +end + +function foreach(tbl, func) + + for _, item in ipairs(tbl) do + func(item) + end + +end + +function btn(i, p) + + if i == nil then + return + end + p = p or 0 + return playdate.buttonIsPressed(i) + +end + +-- spr(n, [x,] [y,] [w,] [h,] [flip_x,] [flip_y]) +function spr(n, x, y, w, h, flip_x, flip_y) + + if n > #sprites or n < 0 then return end + n = flr(n) + 1 or 1 + x = x or 0 + y = y or 0 + w = w or 1.0 + h = h or 1.0 + flip_x = flip_x or false + flip_y = flip_y or false + local img = sprites:getImage(n) + local flip = playdate.graphics.kImageUnflipped + if flip_x and flip_y then + flip = playdate.graphics.kImageFlippedXY + elseif flip_x then + flip = playdate.graphics.kImageFlippedX + elseif flip_y then + flip = playdate.graphics.kImageFlippedY + end + img:draw(x, y, flip) + +end + +function mget(celx, cely) + + local i = (celx % 128) + (cely * 128) + 1 + return mapData[i] + +end + + +function fget(n, f) + + if f ~= nil then + return spritesFlags[n+1] == f + else + return spritesFlags[n+1] + end + +end + +function map(celx, cely, sx, sy, celw, celh, layer) + + for cx=0,celw-1 do + for cy=0,celh-1 do + local i = mget(celx + cx, cely + cy) + 1 + local img = sprites:getImage(i) + local x = sx + (cx * 8) + local y = sy + (cy * 8) + if layer ~= nil and fget(i) == layer then + img:draw(x, y) + else + img:draw(x, y) + end + end + end + +end + +function pal(c0, c1, p) + + -- TODO + +end + +function music() + + -- TODO + +end + +function sfx() + + -- TODO + +end + +function camera(x, y) + + x = x or 0 + y = y or 0 + playdate.display.setOffset(x, y) + +end + +function count(tbl) + + return #tbl + +end + +function _print(text, x, y, color) + + x = x or 0 + y = y or 0 + if col == nil then + playdate.graphics.setImageDrawMode(playdate.graphics.kDrawModeFillWhite) + end + playdate.graphics.drawText(text, x, y) + if col == nil then + playdate.graphics.setImageDrawMode(playdate.graphics.kDrawModeCopy) + end + +end \ No newline at end of file diff --git a/Source/main.lua b/Source/main.lua new file mode 100644 index 0000000..a6b625b --- /dev/null +++ b/Source/main.lua @@ -0,0 +1,31 @@ +import "CoreLibs/object" +import "CoreLibs/graphics" +import "CoreLibs/sprites" +import "CoreLibs/timer" +import "CoreLibs/ui" +import "CoreLibs/crank" + +import "Scripts/pico-8.lua" +import "Scripts/celeste.lua" + +math.randomseed(playdate.getSecondsSinceEpoch()) +playdate.display.setScale(2) + +-- playdate.graphics.sprite.setBackgroundDrawingCallback( +-- function(x, y, width, height) +-- _draw() +-- end +-- ) + +_init() + +function playdate.update() + + playdate.timer.updateTimers() + -- playdate.graphics.sprite.update() + _update() + -- playdate.graphics.clear(playdate.graphics.kColorBlack) + _draw() + playdate.drawFPS(0, 0) + +end \ No newline at end of file diff --git a/Support/classic.lua b/Support/classic.lua new file mode 100644 index 0000000..a38771b --- /dev/null +++ b/Support/classic.lua @@ -0,0 +1,1429 @@ +-- ~celeste~ +-- matt thorson + noel berry + +-- globals -- +------------- + +room = { x=0, y=0 } +objects = {} +types = {} +freeze=0 +shake=0 +will_restart=false +delay_restart=0 +got_fruit={} +has_dashed=false +sfx_timer=0 +has_key=false +pause_player=false +flash_bg=false +music_timer=0 + +k_left=0 +k_right=1 +k_up=2 +k_down=3 +k_jump=4 +k_dash=5 + +-- entry point -- +----------------- + +function _init() + title_screen() +end + +function title_screen() + got_fruit = {} + for i=0,29 do + add(got_fruit,false) end + frames=0 + deaths=0 + max_djump=1 + start_game=false + start_game_flash=0 + music(40,0,7) + + load_room(7,3) +end + +function begin_game() + frames=0 + seconds=0 + minutes=0 + music_timer=0 + start_game=false + music(0,0,7) + load_room(0,0) +end + +function level_index() + return room.x%8+room.y*8 +end + +function is_title() + return level_index()==31 +end + +-- effects -- +------------- + +clouds = {} +for i=0,16 do + add(clouds,{ + x=rnd(128), + y=rnd(128), + spd=1+rnd(4), + w=32+rnd(32) + }) +end + +particles = {} +for i=0,24 do + add(particles,{ + x=rnd(128), + y=rnd(128), + s=0+flr(rnd(5)/4), + spd=0.25+rnd(5), + off=rnd(1), + c=6+flr(0.5+rnd(1)) + }) +end + +dead_particles = {} + +-- player entity -- +------------------- + +player = +{ + init=function(this) + this.p_jump=false + this.p_dash=false + this.grace=0 + this.jbuffer=0 + this.djump=max_djump + this.dash_time=0 + this.dash_effect_time=0 + this.dash_target={x=0,y=0} + this.dash_accel={x=0,y=0} + this.hitbox = {x=1,y=3,w=6,h=5} + this.spr_off=0 + this.was_on_ground=false + create_hair(this) + end, + update=function(this) + if (pause_player) return + + local input = btn(k_right) and 1 or (btn(k_left) and -1 or 0) + + -- spikes collide + if spikes_at(this.x+this.hitbox.x,this.y+this.hitbox.y,this.hitbox.w,this.hitbox.h,this.spd.x,this.spd.y) then + kill_player(this) end + + -- bottom death + if this.y>128 then + kill_player(this) end + + local on_ground=this.is_solid(0,1) + local on_ice=this.is_ice(0,1) + + -- smoke particles + if on_ground and not this.was_on_ground then + init_object(smoke,this.x,this.y+4) + end + + local jump = btn(k_jump) and not this.p_jump + this.p_jump = btn(k_jump) + if (jump) then + this.jbuffer=4 + elseif this.jbuffer>0 then + this.jbuffer-=1 + end + + local dash = btn(k_dash) and not this.p_dash + this.p_dash = btn(k_dash) + + if on_ground then + this.grace=6 + if this.djump 0 then + this.grace-=1 + end + + this.dash_effect_time -=1 + if this.dash_time > 0 then + init_object(smoke,this.x,this.y) + this.dash_time-=1 + this.spd.x=appr(this.spd.x,this.dash_target.x,this.dash_accel.x) + this.spd.y=appr(this.spd.y,this.dash_target.y,this.dash_accel.y) + else + + -- move + local maxrun=1 + local accel=0.6 + local deccel=0.15 + + if not on_ground then + accel=0.4 + elseif on_ice then + accel=0.05 + if input==(this.flip.x and -1 or 1) then + accel=0.05 + end + end + + if abs(this.spd.x) > maxrun then + this.spd.x=appr(this.spd.x,sign(this.spd.x)*maxrun,deccel) + else + this.spd.x=appr(this.spd.x,input*maxrun,accel) + end + + --facing + if this.spd.x!=0 then + this.flip.x=(this.spd.x<0) + end + + -- gravity + local maxfall=2 + local gravity=0.21 + + if abs(this.spd.y) <= 0.15 then + gravity*=0.5 + end + + -- wall slide + if input!=0 and this.is_solid(input,0) and not this.is_ice(input,0) then + maxfall=0.4 + if rnd(10)<2 then + init_object(smoke,this.x+input*6,this.y) + end + end + + if not on_ground then + this.spd.y=appr(this.spd.y,maxfall,gravity) + end + + -- jump + if this.jbuffer>0 then + if this.grace>0 then + -- normal jump + psfx(1) + this.jbuffer=0 + this.grace=0 + this.spd.y=-2 + init_object(smoke,this.x,this.y+4) + else + -- wall jump + local wall_dir=(this.is_solid(-3,0) and -1 or this.is_solid(3,0) and 1 or 0) + if wall_dir!=0 then + psfx(2) + this.jbuffer=0 + this.spd.y=-2 + this.spd.x=-wall_dir*(maxrun+1) + if not this.is_ice(wall_dir*3,0) then + init_object(smoke,this.x+wall_dir*6,this.y) + end + end + end + end + + -- dash + local d_full=5 + local d_half=d_full*0.70710678118 + + if this.djump>0 and dash then + init_object(smoke,this.x,this.y) + this.djump-=1 + this.dash_time=4 + has_dashed=true + this.dash_effect_time=10 + local v_input=(btn(k_up) and -1 or (btn(k_down) and 1 or 0)) + if input!=0 then + if v_input!=0 then + this.spd.x=input*d_half + this.spd.y=v_input*d_half + else + this.spd.x=input*d_full + this.spd.y=0 + end + elseif v_input!=0 then + this.spd.x=0 + this.spd.y=v_input*d_full + else + this.spd.x=(this.flip.x and -1 or 1) + this.spd.y=0 + end + + psfx(3) + freeze=2 + shake=6 + this.dash_target.x=2*sign(this.spd.x) + this.dash_target.y=2*sign(this.spd.y) + this.dash_accel.x=1.5 + this.dash_accel.y=1.5 + + if this.spd.y<0 then + this.dash_target.y*=.75 + end + + if this.spd.y!=0 then + this.dash_accel.x*=0.70710678118 + end + if this.spd.x!=0 then + this.dash_accel.y*=0.70710678118 + end + elseif dash and this.djump<=0 then + psfx(9) + init_object(smoke,this.x,this.y) + end + + end + + -- animation + this.spr_off+=0.25 + if not on_ground then + if this.is_solid(input,0) then + this.spr=5 + else + this.spr=3 + end + elseif btn(k_down) then + this.spr=6 + elseif btn(k_up) then + this.spr=7 + elseif (this.spd.x==0) or (not btn(k_left) and not btn(k_right)) then + this.spr=1 + else + this.spr=1+this.spr_off%4 + end + + -- next level + if this.y<-4 and level_index()<30 then next_room() end + + -- was on the ground + this.was_on_ground=on_ground + + end, --121 then + this.x=clamp(this.x,-1,121) + this.spd.x=0 + end + + set_hair_color(this.djump) + draw_hair(this,this.flip.x and -1 or 1) + spr(this.spr,this.x,this.y,1,1,this.flip.x,this.flip.y) + unset_hair_color() + end +} + +psfx=function(num) + if sfx_timer<=0 then + sfx(num) + end +end + +create_hair=function(obj) + obj.hair={} + for i=0,4 do + add(obj.hair,{x=obj.x,y=obj.y,size=max(1,min(2,3-i))}) + end +end + +set_hair_color=function(djump) + pal(8,(djump==1 and 8 or djump==2 and (7+flr((frames/3)%2)*4) or 12)) +end + +draw_hair=function(obj,facing) + local last={x=obj.x+4-facing*2,y=obj.y+(btn(k_down) and 4 or 3)} + foreach(obj.hair,function(h) + h.x+=(last.x-h.x)/1.5 + h.y+=(last.y+0.5-h.y)/1.5 + circfill(h.x,h.y,h.size,8) + last=h + end) +end + +unset_hair_color=function() + pal(8,8) +end + +player_spawn = { + tile=1, + init=function(this) + sfx(4) + this.spr=3 + this.target= {x=this.x,y=this.y} + this.y=128 + this.spd.y=-4 + this.state=0 + this.delay=0 + this.solids=false + create_hair(this) + end, + update=function(this) + -- jumping up + if this.state==0 then + if this.y < this.target.y+16 then + this.state=1 + this.delay=3 + end + -- falling + elseif this.state==1 then + this.spd.y+=0.5 + if this.spd.y>0 and this.delay>0 then + this.spd.y=0 + this.delay-=1 + end + if this.spd.y>0 and this.y > this.target.y then + this.y=this.target.y + this.spd = {x=0,y=0} + this.state=2 + this.delay=5 + shake=5 + init_object(smoke,this.x,this.y+4) + sfx(5) + end + -- landing + elseif this.state==2 then + this.delay-=1 + this.spr=6 + if this.delay<0 then + destroy_object(this) + init_object(player,this.x,this.y) + end + end + end, + draw=function(this) + set_hair_color(max_djump) + draw_hair(this,1) + spr(this.spr,this.x,this.y,1,1,this.flip.x,this.flip.y) + unset_hair_color() + end +} +add(types,player_spawn) + +spring = { + tile=18, + init=function(this) + this.hide_in=0 + this.hide_for=0 + end, + update=function(this) + if this.hide_for>0 then + this.hide_for-=1 + if this.hide_for<=0 then + this.spr=18 + this.delay=0 + end + elseif this.spr==18 then + local hit = this.collide(player,0,0) + if hit ~=nil and hit.spd.y>=0 then + this.spr=19 + hit.y=this.y-4 + hit.spd.x*=0.2 + hit.spd.y=-3 + hit.djump=max_djump + this.delay=10 + init_object(smoke,this.x,this.y) + + -- breakable below us + local below=this.collide(fall_floor,0,1) + if below~=nil then + break_fall_floor(below) + end + + psfx(8) + end + elseif this.delay>0 then + this.delay-=1 + if this.delay<=0 then + this.spr=18 + end + end + -- begin hiding + if this.hide_in>0 then + this.hide_in-=1 + if this.hide_in<=0 then + this.hide_for=60 + this.spr=0 + end + end + end +} +add(types,spring) + +function break_spring(obj) + obj.hide_in=15 +end + +balloon = { + tile=22, + init=function(this) + this.offset=rnd(1) + this.start=this.y + this.timer=0 + this.hitbox={x=-1,y=-1,w=10,h=10} + end, + update=function(this) + if this.spr==22 then + this.offset+=0.01 + this.y=this.start+sin(this.offset)*2 + local hit = this.collide(player,0,0) + if hit~=nil and hit.djump0 then + this.timer-=1 + else + psfx(7) + init_object(smoke,this.x,this.y) + this.spr=22 + end + end, + draw=function(this) + if this.spr==22 then + spr(13+(this.offset*8)%3,this.x,this.y+6) + spr(this.spr,this.x,this.y) + end + end +} +add(types,balloon) + +fall_floor = { + tile=23, + init=function(this) + this.state=0 + this.solid=true + end, + update=function(this) + -- idling + if this.state == 0 then + if this.check(player,0,-1) or this.check(player,-1,0) or this.check(player,1,0) then + break_fall_floor(this) + end + -- shaking + elseif this.state==1 then + this.delay-=1 + if this.delay<=0 then + this.state=2 + this.delay=60--how long it hides for + this.collideable=false + end + -- invisible, waiting to reset + elseif this.state==2 then + this.delay-=1 + if this.delay<=0 and not this.check(player,0,0) then + psfx(7) + this.state=0 + this.collideable=true + init_object(smoke,this.x,this.y) + end + end + end, + draw=function(this) + if this.state!=2 then + if this.state!=1 then + spr(23,this.x,this.y) + else + spr(23+(15-this.delay)/5,this.x,this.y) + end + end + end +} +add(types,fall_floor) + +function break_fall_floor(obj) + if obj.state==0 then + psfx(15) + obj.state=1 + obj.delay=15--how long until it falls + init_object(smoke,obj.x,obj.y) + local hit=obj.collide(spring,0,-1) + if hit~=nil then + break_spring(hit) + end + end +end + +smoke={ + init=function(this) + this.spr=29 + this.spd.y=-0.1 + this.spd.x=0.3+rnd(0.2) + this.x+=-1+rnd(2) + this.y+=-1+rnd(2) + this.flip.x=maybe() + this.flip.y=maybe() + this.solids=false + end, + update=function(this) + this.spr+=0.2 + if this.spr>=32 then + destroy_object(this) + end + end +} + +fruit={ + tile=26, + if_not_fruit=true, + init=function(this) + this.start=this.y + this.off=0 + end, + update=function(this) + local hit=this.collide(player,0,0) + if hit~=nil then + hit.djump=max_djump + sfx_timer=20 + sfx(13) + got_fruit[1+level_index()] = true + init_object(lifeup,this.x,this.y) + destroy_object(this) + end + this.off+=1 + this.y=this.start+sin(this.off/40)*2.5 + end +} +add(types,fruit) + +fly_fruit={ + tile=28, + if_not_fruit=true, + init=function(this) + this.start=this.y + this.fly=false + this.step=0.5 + this.solids=false + this.sfx_delay=8 + end, + update=function(this) + --fly away + if this.fly then + if this.sfx_delay>0 then + this.sfx_delay-=1 + if this.sfx_delay<=0 then + sfx_timer=20 + sfx(14) + end + end + this.spd.y=appr(this.spd.y,-3.5,0.25) + if this.y<-16 then + destroy_object(this) + end + -- wait + else + if has_dashed then + this.fly=true + end + this.step+=0.05 + this.spd.y=sin(this.step)*0.5 + end + -- collect + local hit=this.collide(player,0,0) + if hit~=nil then + hit.djump=max_djump + sfx_timer=20 + sfx(13) + got_fruit[1+level_index()] = true + init_object(lifeup,this.x,this.y) + destroy_object(this) + end + end, + draw=function(this) + local off=0 + if not this.fly then + local dir=sin(this.step) + if dir<0 then + off=1+max(0,sign(this.y-this.start)) + end + else + off=(off+0.25)%3 + end + spr(45+off,this.x-6,this.y-2,1,1,true,false) + spr(this.spr,this.x,this.y) + spr(45+off,this.x+6,this.y-2) + end +} +add(types,fly_fruit) + +lifeup = { + init=function(this) + this.spd.y=-0.25 + this.duration=30 + this.x-=2 + this.y-=4 + this.flash=0 + this.solids=false + end, + update=function(this) + this.duration-=1 + if this.duration<= 0 then + destroy_object(this) + end + end, + draw=function(this) + this.flash+=0.5 + + print("1000",this.x-2,this.y,7+this.flash%2) + end +} + +fake_wall = { + tile=64, + if_not_fruit=true, + update=function(this) + this.hitbox={x=-1,y=-1,w=18,h=18} + local hit = this.collide(player,0,0) + if hit~=nil and hit.dash_effect_time>0 then + hit.spd.x=-sign(hit.spd.x)*1.5 + hit.spd.y=-1.5 + hit.dash_time=-1 + sfx_timer=20 + sfx(16) + destroy_object(this) + init_object(smoke,this.x,this.y) + init_object(smoke,this.x+8,this.y) + init_object(smoke,this.x,this.y+8) + init_object(smoke,this.x+8,this.y+8) + init_object(fruit,this.x+4,this.y+4) + end + this.hitbox={x=0,y=0,w=16,h=16} + end, + draw=function(this) + spr(64,this.x,this.y) + spr(65,this.x+8,this.y) + spr(80,this.x,this.y+8) + spr(81,this.x+8,this.y+8) + end +} +add(types,fake_wall) + +key={ + tile=8, + if_not_fruit=true, + update=function(this) + local was=flr(this.spr) + this.spr=9+(sin(frames/30)+0.5)*1 + local is=flr(this.spr) + if is==10 and is!=was then + this.flip.x=not this.flip.x + end + if this.check(player,0,0) then + sfx(23) + sfx_timer=10 + destroy_object(this) + has_key=true + end + end +} +add(types,key) + +chest={ + tile=20, + if_not_fruit=true, + init=function(this) + this.x-=4 + this.start=this.x + this.timer=20 + end, + update=function(this) + if has_key then + this.timer-=1 + this.x=this.start-1+rnd(3) + if this.timer<=0 then + sfx_timer=20 + sfx(16) + init_object(fruit,this.x,this.y-4) + destroy_object(this) + end + end + end +} +add(types,chest) + +platform={ + init=function(this) + this.x-=4 + this.solids=false + this.hitbox.w=16 + this.last=this.x + end, + update=function(this) + this.spd.x=this.dir*0.65 + if this.x<-16 then this.x=128 + elseif this.x>128 then this.x=-16 end + if not this.check(player,0,0) then + local hit=this.collide(player,0,-1) + if hit~=nil then + hit.move_x(this.x-this.last,1) + end + end + this.last=this.x + end, + draw=function(this) + spr(11,this.x,this.y-1) + spr(12,this.x+8,this.y-1) + end +} + +message={ + tile=86, + last=0, + draw=function(this) + this.text="-- celeste mountain --#this memorial to those# perished on the climb" + if this.check(player,4,0) then + if this.index<#this.text then + this.index+=0.5 + if this.index>=this.last+1 then + this.last+=1 + sfx(35) + end + end + this.off={x=8,y=96} + for i=1,this.index do + if sub(this.text,i,i)~="#" then + rectfill(this.off.x-2,this.off.y-2,this.off.x+7,this.off.y+6 ,7) + print(sub(this.text,i,i),this.off.x,this.off.y,0) + this.off.x+=5 + else + this.off.x=8 + this.off.y+=7 + end + end + else + this.index=0 + this.last=0 + end + end +} +add(types,message) + +big_chest={ + tile=96, + init=function(this) + this.state=0 + this.hitbox.w=16 + end, + draw=function(this) + if this.state==0 then + local hit=this.collide(player,0,8) + if hit~=nil and hit.is_solid(0,1) then + music(-1,500,7) + sfx(37) + pause_player=true + hit.spd.x=0 + hit.spd.y=0 + this.state=1 + init_object(smoke,this.x,this.y) + init_object(smoke,this.x+8,this.y) + this.timer=60 + this.particles={} + end + spr(96,this.x,this.y) + spr(97,this.x+8,this.y) + elseif this.state==1 then + this.timer-=1 + shake=5 + flash_bg=true + if this.timer<=45 and count(this.particles)<50 then + add(this.particles,{ + x=1+rnd(14), + y=0, + h=32+rnd(32), + spd=8+rnd(8) + }) + end + if this.timer<0 then + this.state=2 + this.particles={} + flash_bg=false + new_bg=true + init_object(orb,this.x+4,this.y+4) + pause_player=false + end + foreach(this.particles,function(p) + p.y+=p.spd + line(this.x+p.x,this.y+8-p.y,this.x+p.x,min(this.y+8-p.y+p.h,this.y+8),7) + end) + end + spr(112,this.x,this.y+8) + spr(113,this.x+8,this.y+8) + end +} +add(types,big_chest) + +orb={ + init=function(this) + this.spd.y=-4 + this.solids=false + this.particles={} + end, + draw=function(this) + this.spd.y=appr(this.spd.y,0,0.5) + local hit=this.collide(player,0,0) + if this.spd.y==0 and hit~=nil then + music_timer=45 + sfx(51) + freeze=10 + shake=10 + destroy_object(this) + max_djump=2 + hit.djump=2 + end + + spr(102,this.x,this.y) + local off=frames/30 + for i=0,7 do + circfill(this.x+4+cos(off+i/8)*8,this.y+4+sin(off+i/8)*8,1,7) + end + end +} + +flag = { + tile=118, + init=function(this) + this.x+=5 + this.score=0 + this.show=false + for i=1,count(got_fruit) do + if got_fruit[i] then + this.score+=1 + end + end + end, + draw=function(this) + this.spr=118+(frames/5)%3 + spr(this.spr,this.x,this.y) + if this.show then + rectfill(32,2,96,31,0) + spr(26,55,6) + print("x"..this.score,64,9,7) + draw_time(49,16) + print("deaths:"..deaths,48,24,7) + elseif this.check(player,0,0) then + sfx(55) + sfx_timer=30 + this.show=true + end + end +} +add(types,flag) + +room_title = { + init=function(this) + this.delay=5 + end, + draw=function(this) + this.delay-=1 + if this.delay<-30 then + destroy_object(this) + elseif this.delay<0 then + + rectfill(24,58,104,70,0) + --rect(26,64-10,102,64+10,7) + --print("---",31,64-2,13) + if room.x==3 and room.y==1 then + print("old site",48,62,7) + elseif level_index()==30 then + print("summit",52,62,7) + else + local level=(1+level_index())*100 + print(level.." m",52+(level<1000 and 2 or 0),62,7) + end + --print("---",86,64-2,13) + + draw_time(4,4) + end + end +} + +-- object functions -- +----------------------- + +function init_object(type,x,y) + if type.if_not_fruit~=nil and got_fruit[1+level_index()] then + return + end + local obj = {} + obj.type = type + obj.collideable=true + obj.solids=true + + obj.spr = type.tile + obj.flip = {x=false,y=false} + + obj.x = x + obj.y = y + obj.hitbox = { x=0,y=0,w=8,h=8 } + + obj.spd = {x=0,y=0} + obj.rem = {x=0,y=0} + + obj.is_solid=function(ox,oy) + if oy>0 and not obj.check(platform,ox,0) and obj.check(platform,ox,oy) then + return true + end + return solid_at(obj.x+obj.hitbox.x+ox,obj.y+obj.hitbox.y+oy,obj.hitbox.w,obj.hitbox.h) + or obj.check(fall_floor,ox,oy) + or obj.check(fake_wall,ox,oy) + end + + obj.is_ice=function(ox,oy) + return ice_at(obj.x+obj.hitbox.x+ox,obj.y+obj.hitbox.y+oy,obj.hitbox.w,obj.hitbox.h) + end + + obj.collide=function(type,ox,oy) + local other + for i=1,count(objects) do + other=objects[i] + if other ~=nil and other.type == type and other != obj and other.collideable and + other.x+other.hitbox.x+other.hitbox.w > obj.x+obj.hitbox.x+ox and + other.y+other.hitbox.y+other.hitbox.h > obj.y+obj.hitbox.y+oy and + other.x+other.hitbox.x < obj.x+obj.hitbox.x+obj.hitbox.w+ox and + other.y+other.hitbox.y < obj.y+obj.hitbox.y+obj.hitbox.h+oy then + return other + end + end + return nil + end + + obj.check=function(type,ox,oy) + return obj.collide(type,ox,oy) ~=nil + end + + obj.move=function(ox,oy) + local amount + -- [x] get move amount + obj.rem.x += ox + amount = flr(obj.rem.x + 0.5) + obj.rem.x -= amount + obj.move_x(amount,0) + + -- [y] get move amount + obj.rem.y += oy + amount = flr(obj.rem.y + 0.5) + obj.rem.y -= amount + obj.move_y(amount) + end + + obj.move_x=function(amount,start) + if obj.solids then + local step = sign(amount) + for i=start,abs(amount) do + if not obj.is_solid(step,0) then + obj.x += step + else + obj.spd.x = 0 + obj.rem.x = 0 + break + end + end + else + obj.x += amount + end + end + + obj.move_y=function(amount) + if obj.solids then + local step = sign(amount) + for i=0,abs(amount) do + if not obj.is_solid(0,step) then + obj.y += step + else + obj.spd.y = 0 + obj.rem.y = 0 + break + end + end + else + obj.y += amount + end + end + + add(objects,obj) + if obj.type.init~=nil then + obj.type.init(obj) + end + return obj +end + +function destroy_object(obj) + del(objects,obj) +end + +function kill_player(obj) + sfx_timer=12 + sfx(0) + deaths+=1 + shake=10 + destroy_object(obj) + dead_particles={} + for dir=0,7 do + local angle=(dir/8) + add(dead_particles,{ + x=obj.x+4, + y=obj.y+4, + t=10, + spd={ + x=sin(angle)*3, + y=cos(angle)*3 + } + }) + restart_room() + end +end + +-- room functions -- +-------------------- + +function restart_room() + will_restart=true + delay_restart=15 +end + +function next_room() + if room.x==2 and room.y==1 then + music(30,500,7) + elseif room.x==3 and room.y==1 then + music(20,500,7) + elseif room.x==4 and room.y==2 then + music(30,500,7) + elseif room.x==5 and room.y==3 then + music(30,500,7) + end + + if room.x==7 then + load_room(0,room.y+1) + else + load_room(room.x+1,room.y) + end +end + +function load_room(x,y) + has_dashed=false + has_key=false + + --remove existing objects + foreach(objects,destroy_object) + + --current room + room.x = x + room.y = y + + -- entities + for tx=0,15 do + for ty=0,15 do + local tile = mget(room.x*16+tx,room.y*16+ty); + if tile==11 then + init_object(platform,tx*8,ty*8).dir=-1 + elseif tile==12 then + init_object(platform,tx*8,ty*8).dir=1 + else + foreach(types, + function(type) + if type.tile == tile then + init_object(type,tx*8,ty*8) + end + end) + end + end + end + + if not is_title() then + init_object(room_title,0,0) + end +end + +-- update function -- +----------------------- + +function _update() + frames=((frames+1)%30) + if frames==0 and level_index()<30 then + seconds=((seconds+1)%60) + if seconds==0 then + minutes+=1 + end + end + + if music_timer>0 then + music_timer-=1 + if music_timer<=0 then + music(10,0,7) + end + end + + if sfx_timer>0 then + sfx_timer-=1 + end + + -- cancel if freeze + if freeze>0 then freeze-=1 return end + + -- screenshake + if shake>0 then + shake-=1 + camera() + if shake>0 then + camera(-2+rnd(5),-2+rnd(5)) + end + end + + -- restart (soon) + if will_restart and delay_restart>0 then + delay_restart-=1 + if delay_restart<=0 then + will_restart=false + load_room(room.x,room.y) + end + end + + -- update each object + foreach(objects,function(obj) + obj.move(obj.spd.x,obj.spd.y) + if obj.type.update~=nil then + obj.type.update(obj) + end + end) + + -- start game + if is_title() then + if not start_game and (btn(k_jump) or btn(k_dash)) then + music(-1) + start_game_flash=50 + start_game=true + sfx(38) + end + if start_game then + start_game_flash-=1 + if start_game_flash<=-30 then + begin_game() + end + end + end +end + +-- drawing functions -- +----------------------- +function _draw() + if freeze>0 then return end + + -- reset all palette values + pal() + + -- start game flash + if start_game then + local c=10 + if start_game_flash>10 then + if frames%10<5 then + c=7 + end + elseif start_game_flash>5 then + c=2 + elseif start_game_flash>0 then + c=1 + else + c=0 + end + if c<10 then + pal(6,c) + pal(12,c) + pal(13,c) + pal(5,c) + pal(1,c) + pal(7,c) + end + end + + -- clear screen + local bg_col = 0 + if flash_bg then + bg_col = frames/5 + elseif new_bg~=nil then + bg_col=2 + end + rectfill(0,0,128,128,bg_col) + + -- clouds + if not is_title() then + foreach(clouds, function(c) + c.x += c.spd + rectfill(c.x,c.y,c.x+c.w,c.y+4+(1-c.w/64)*12,new_bg~=nil and 14 or 1) + if c.x > 128 then + c.x = -c.w + c.y=rnd(128-8) + end + end) + end + + -- draw bg terrain + map(room.x * 16,room.y * 16,0,0,16,16,4) + + -- platforms/big chest + foreach(objects, function(o) + if o.type==platform or o.type==big_chest then + draw_object(o) + end + end) + + -- draw terrain + local off=is_title() and -4 or 0 + map(room.x*16,room.y * 16,off,0,16,16,2) + + -- draw objects + foreach(objects, function(o) + if o.type~=platform and o.type~=big_chest then + draw_object(o) + end + end) + + -- draw fg terrain + map(room.x * 16,room.y * 16,0,0,16,16,8) + + -- particles + foreach(particles, function(p) + p.x += p.spd + p.y += sin(p.off) + p.off+= min(0.05,p.spd/32) + rectfill(p.x,p.y,p.x+p.s,p.y+p.s,p.c) + if p.x>128+4 then + p.x=-4 + p.y=rnd(128) + end + end) + + -- dead particles + foreach(dead_particles, function(p) + p.x += p.spd.x + p.y += p.spd.y + p.t -=1 + if p.t <= 0 then del(dead_particles,p) end + rectfill(p.x-p.t/5,p.y-p.t/5,p.x+p.t/5,p.y+p.t/5,14+p.t%2) + end) + + -- draw outside of the screen for screenshake + rectfill(-5,-5,-1,133,0) + rectfill(-5,-5,133,-1,0) + rectfill(-5,128,133,133,0) + rectfill(128,-5,133,133,0) + + -- credits + if is_title() then + print("x+c",58,80,5) + print("matt thorson",42,96,5) + print("noel berry",46,102,5) + end + + if level_index()==30 then + local p + for i=1,count(objects) do + if objects[i].type==player then + p = objects[i] + break + end + end + if p~=nil then + local diff=min(24,40-abs(p.x+4-64)) + rectfill(0,0,diff,128,0) + rectfill(128-diff,0,128,128,0) + end + end + +end + +function draw_object(obj) + + if obj.type.draw ~=nil then + obj.type.draw(obj) + elseif obj.spr > 0 then + spr(obj.spr,obj.x,obj.y,1,1,obj.flip.x,obj.flip.y) + end + +end + +function draw_time(x,y) + + local s=seconds + local m=minutes%60 + local h=flr(minutes/60) + + rectfill(x,y,x+32,y+6,0) + print((h<10 and "0"..h or h)..":"..(m<10 and "0"..m or m)..":"..(s<10 and "0"..s or s),x+1,y+1,7) + +end + +-- helper functions -- +---------------------- + +function clamp(val,a,b) + return max(a, min(b, val)) +end + +function appr(val,target,amount) + return val > target + and max(val - amount, target) + or min(val + amount, target) +end + +function sign(v) + return v>0 and 1 or + v<0 and -1 or 0 +end + +function maybe() + return rnd(1)<0.5 +end + +function solid_at(x,y,w,h) + return tile_flag_at(x,y,w,h,0) +end + +function ice_at(x,y,w,h) + return tile_flag_at(x,y,w,h,4) +end + +function tile_flag_at(x,y,w,h,flag) + for i=max(0,flr(x/8)),min(15,(x+w-1)/8) do + for j=max(0,flr(y/8)),min(15,(y+h-1)/8) do + if fget(tile_at(i,j),flag) then + return true + end + end + end + return false +end + +function tile_at(x,y) + return mget(room.x * 16 + x, room.y * 16 + y) +end + +function spikes_at(x,y,w,h,xspd,yspd) + for i=max(0,flr(x/8)),min(15,(x+w-1)/8) do + for j=max(0,flr(y/8)),min(15,(y+h-1)/8) do + local tile=tile_at(i,j) + if tile==17 and ((y+h-1)%8>=6 or y+h==j*8+8) and yspd>=0 then + return true + elseif tile==27 and y%8<=2 and yspd<=0 then + return true + elseif tile==43 and x%8<=2 and xspd<=0 then + return true + elseif tile==59 and ((x+w-1)%8>=6 or x+w==i*8+8) and xspd>=0 then + return true + end + end + end + return false +end diff --git a/Support/map.png b/Support/map.png new file mode 100644 index 0000000000000000000000000000000000000000..4607667aa867402d120fc8708da0d2eaeeb21076 GIT binary patch literal 64673 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 NT`dF6a&_B~{|9ik)LZ}n literal 0 HcmV?d00001 diff --git a/Support/spritesheet.png b/Support/spritesheet.png new file mode 100644 index 0000000000000000000000000000000000000000..b369275b749947908331242919aad1a986516d7e GIT binary patch literal 9615 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 z zP%r~St@9#OUD7s8UQS z$i}e1;d+d*$9;zz?%piQ*;lUW^k1KEN2kHUl}miE z!!T5mu288DZl`C{pZe(M%yzZpcV38RmH2KJKLs74FIq9BXUF}RnV$M3IC77D%u8FD z_WRbLGg~3_G%8`r@+12F-+z_<)s9Oq=hYhWe~Kc2iT|=YBETKU^R%KZ0~-@L*PUNP zYvfcJUVr%b$?ZUBbL%zshsrDO!Uzdfcy42nDk*Sw83h~@{5G=4K*+VdD&u|+^bjsA z)z;Mek6a3J2BQmTKb;Vrpy+23+>p1xT&Pg>k5^IeizYlO@Du$Qh25F`L2}yDQ&r4$ zl`EV6;VH*d_1zR0bnAPUu0fwgn}GSZZ}f>Uc4V4^C=S3mmMAS}t)%yWT8y4t1@OPy z7F@D5^cDp0n#{0l0%I&K1@~x5>f9#ZQwo+`X^d#nTzDhHZa*mU^1ep(>G&d@nqqS8 z9=V#Y%LPw87Hy$QeSuD?SkCn5$e@q}H&v8~LPQUFg^P$HFSJ0eTcR(PAp#)*9a4o! zj6sYbGj_{t2sCJteS`3XLvLgBZyPW>Iw*LhthA)x*!Sx-HPm0!E#5sh;9qICM4OO4 z)|Df?#=^49ZT>t6RO-|#!IdHX17=Ny4keP_X8kcl*slP0mLH!7x9%wUwv6_8C$m;t z!(?`5gmTd~Dq3}<1TMjkYpB$Z`<^AXs(Ykgrsj(eGm_w8!$c!>8Cd7rvDrcjBToWWvz5zBxggCUr%$mG&Rex6t;qR4xh1=<<|= zKwv7|TLUYsV*wM8Dzw4sQI_-$;g!eFzY{s z3RHxRoE1moZjGD_*^1<~!+$Dl7h-fd7c^rg_kJsHeTVv*&P)AadZ31AP*Qrnop0uCorKh_!&IV8Finax}Q8-b|Ar`-ay$e;p zF*LhBwwo|8oC}Ze^Lvhe-BsCL{@|5TF9x4qGtk$Lx`W)6Gwp@b(7U__|K~7nAy#=w z@Cp%^rrz1i_J<3*ACZw#!T=Dq7$lYfJ_+^+3?x7a_XDT>JJRN%&1%Yz+pf_fDx$Zy zWYHqS0pOXiAg^ez3eSb&9vjs~K>*FVutlFNnVgi~?nEVI_nn!o%c6JNd*5<9JX0K-Ht_ELr@V< z|9KHg$op1aE*eayj)Gl8!OP?Dk8nxcou86In|)F|ys^uLGMy(`L&+ZUJf`*9uL@c* z<}W!IevRcJsta*D_~Ypw;*0QZ<*9<9>F)Bp1uK}eBE7DH|9#bf=2xg5Wd zydVGNHoCXxDM=)#89g>0S#j!kx5w>>H2W;pOiBC+!mQs$-*{t%@Y5Y^p;sgVLXy`J zDHc2>Ao5z$cNp=8tNnI-Yg5TUin^>XJMgS-t#Ovqk| zN{|r9VRZTZlOuOGR}L+Ne-X?-{-5B8e@veKe-@l$J6b2Ft*yC=CjbBY`frSkiPH$W;K5w7#k}7<@msB+trZnJf!Y>H*xFEWEhq`e0id((1;AA>M$Na z7jIX{2execrAe_0lt8WkeO+*CGO>~EE=)w>13WR1V?NDt0CPrwiUG&IL{HkGhbx95 zLAv3`^L3K$z{3zwV?Qtx5gRC12!?>W@$;RJJ>ZsWak%1RqUweRg><9zkSaNQSHZ92 zcd27tr>pEUbl~XyZlEWY$+Vvz9y?P#0XJ1yut(K)Hd&t;vbTL+K164&5rSnl+Hy8{ zdvDz}$lyJDnEdi(yRi{0P_wtkksJH2DBr8-f3e2mz;Xo+`v>5pfXNg4H*)I-&!KvG zRrv8J`z0&Jvk|j{bII9GY)9XkR`bot(DR|F_vPtxA7ocE9p@UQY>mUKN$?CZ82C(! zi-MApV@)4%i>tnQ8Fi@koI2QPr?hL+GR}%qBOj<9qGc=;!t0B)JVYFuzKOH{tvpPt3@=f$gsd+Zfnh>@yn_Fn7GR=kD4n0V`+ za+8+UZ_jWL_?Dd|L*sS|!$nx|3+B#(nSZJnY1m;no|huX4)Q*DPO+aXGThKkxkqn) zl9vcmzIkP!Ww$;Lse+r9VzSPIeDLfnSuytYerd~Z4&~Vd*tuNZWKy(=r$3V|?8>F2 zh8nfc^#XnBjRd`?n6f$)nE!rGL-x38Td;6x-s(#Zu)=+72V>Q*MI7_^p6q7rNNIuW zu(LhH@WUk<=OEC4mDRg+dJdnrDN}`BfacNW`+zCIgPEmb(;ZDo*6EaB_{GVXgq7xP zZz6IL-&5(KPx&q_Q~Q0MlFLXSdijrc#@$6V%|$x;(0Msrs)~Qn6Hg}V1b&!Qkhb#4 z7zXo?cWY!W2>mT13)feN86lWih_xPAcvG3caABGZ6vA3|E4vkk3*iW(jYHmb&Bsl) z?JmO4*uI)28ON$a$~~&F$w31Lan$a3ml7IwC{8SV>6UqQsHkB3la~0U`HAf)F4+wC ztsBwBxK>=aLKwlgsfVtQmmW#G#w5S`$_r*aXi#j_N)=@C*WpScQEK5hHxjEl4X@zw z`P=PICGek})(K1gRxCTx7)xRys+DezQ<&oN-iO##Vodossm(-r*9pku?;VVl2~+&= zmj3&c&>K9$_NLl!zMam9WoPy;L@4#`z;J>q*4_1Y{@sg$owjhM)m6)GW=M|l!fm3i zQ}79j$MPMC9%)>E1EMl@5;GgoKR;Qh%2#+>qq<6>a>w7$Y@L>E0ay|sT>sMJIVC<>-kS4$t(fIh?)&7kG1?-wJ_-1V zoyTWpMeUjOLt;l`vQ5krQGf zGmIYzIJa{R++w1~Vn!FOyZL@FdS5zJ*rV9@Livp|n-<@joPJHq9)5=PcXwf0pJXz6Q(IZ|1vB z=^K-By}6j}xZV-n>(XA1_mwo^;;y!*uzd`oKv)G9fync7BBRI+=zjtO-}$yGn&^N+ zVo@a=G31;Y%@MIqASkqhDEJ(f{BVzf{%lJr-MFS20RI;eahU&0WUZthIcjrnH`LcB zt$N~VaGrce<+9x~WM9-&&7vEQRAi4*XmAB+{Np;5p}}JJJL~Pi10~gtSeTBgUx52C zh8%Dr^(dfR(Xx#A@3P1;!-~I)K3}|qzMuoqOCSj0}fqWEX1mqqR8 z*`dIy&E2Yhxf8=3VK)>tv~uGhI%p~7e`fH#h_6a%OuQ$pR_X72E4U7eQ9Zvl6?WRF zAwzQrp*!mVOurTiIRb__@lfI82%-x7H0 zT83c5d-06$L_@}{ND@&7e3=T*SxU=U0b*(feB%nl&B?{Z$<58RrCr+rya$q%Qj#qD IVEFz20Ofb&f&c&j literal 0 HcmV?d00001