Created
September 9, 2019 22:06
-
-
Save Powersaurus/2d204de7ae6e2586139951a8a668f602 to your computer and use it in GitHub Desktop.
Ray caster demo in PICO-8, now with fancier walls
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| pico-8 cartridge // http://www.pico-8.com | |
| version 18 | |
| __lua__ | |
| -- raycaster demo | |
| -- by @powersaurus | |
| -- based heavily on http://lodev.org/cgtutor/raycasting.html | |
| -- and http://lodev.org/cgtutor/raycasting2.html | |
| -- and inspired by the work of @matthughson | |
| -- thanks for advice from @kometbomb and @doyousketch2 | |
| debug=true | |
| frames=0 | |
| function _init() | |
| timer=0 | |
| id=1 | |
| dist_table={} | |
| detail_limit_table={} | |
| create_palettes() | |
| msg="" | |
| projectiles={} | |
| player=make_player() | |
| -- turn_player(player,45) | |
| turn_player(player,270) | |
| world=make_world() | |
| sprites={} | |
| cats={} | |
| local cat=make_cat(5,5,0) | |
| add(sprites,cat) | |
| add(cats,cat) | |
| for y=0,128 do | |
| dist_table[y]=128/(2*y-128) | |
| detail_limit_table[y]=flr(98+7*sin(y/256)) | |
| end | |
| -- build tex lookup table | |
| -- experimental, not used atm | |
| world2={} | |
| for y=1,#world do | |
| for x=1,#world[y] do | |
| poke(0x4300+y*32+x,abs(world[y][x])) | |
| world2[y*32+x]=world[y][x] | |
| end | |
| end | |
| stars={} | |
| for s=0,50 do | |
| local x=rnd(20)-10 | |
| local y=rnd(20)-10 | |
| local z=32+rnd(64) | |
| local star={ | |
| x=x, | |
| y=y, | |
| z=z | |
| } | |
| add(stars,star) | |
| end | |
| particles={} | |
| _draw=draw | |
| _update=update | |
| end | |
| strafe=false | |
| draw_map=false | |
| hvy=0 -- move hand | |
| function update() | |
| timer+=1 | |
| hy=clamp(hvy,0,20) | |
| hvy=max(hvy-4,-3) | |
| update_doors(doors) | |
| if btnp(5) then | |
| draw_map=not draw_map | |
| end | |
| local sp=0.08 | |
| if btnp(4) then | |
| hvy+=20 | |
| add_projectile(player,projectiles) | |
| end | |
| --[[if btn(4) then | |
| strafe=true | |
| else | |
| strafe=false | |
| end]] | |
| if btn(0) then | |
| if strafe then | |
| strafe_in_current_dir(player,-sp) | |
| else | |
| turn_player2(player,-1.0) | |
| end | |
| end | |
| if btn(1) then | |
| if strafe then | |
| strafe_in_current_dir(player,sp) | |
| else | |
| turn_player2(player,1.0) | |
| end | |
| end | |
| if btn(2) then | |
| move_in_current_dir(player,sp) | |
| end | |
| if btn(3) then | |
| move_in_current_dir(player,-sp) | |
| end | |
| player:update() | |
| for _,p in pairs(projectiles) do | |
| p:update() | |
| if (p.life==0) del(projectiles,p) | |
| end | |
| for _,s in pairs(sprites) do | |
| if (s.update) s:update() | |
| end | |
| -- hack | |
| if timer%1==0 | |
| and #cats<5 then | |
| local cy=1 | |
| local cx=1 | |
| -- this has a habit of blowing up | |
| while world[cy][cx]>2 do | |
| cy=flr(rnd(#world-1))+1 | |
| print(cy) | |
| cx=1+flr(rnd(#world[cy])) | |
| cls() | |
| print(cx..","..cy) | |
| end | |
| local cat=make_cat( | |
| cx+0.5, | |
| cy+0.5, | |
| 0) | |
| add(sprites,cat) | |
| add(cats,cat) | |
| end | |
| end | |
| hy=0 | |
| function draw() | |
| reset_palette() | |
| calculate_fps(time()) | |
| -- timer+=1 | |
| --[[msg=player.pos.x.." "..player.pos.y | |
| .."\n"..player.dr.x.." "..player.dr.y | |
| .."\n"..player.cam.x.." "..player.cam.y]] | |
| if draw_map then | |
| draw_map_view(world,player) | |
| else | |
| draw_perspective(world,player,dist_table,detail_limit_table) | |
| --hand | |
| sspr(96,16,32,16,64+hy/2,96+hy,64,32) | |
| if debug then | |
| reset_palette() | |
| print(fps,2,2,7) | |
| print("cpu: "..stat(1),2,10,7) | |
| -- print("pos: "..player.pos.x.." "..player.pos.y.." "..player.a,2,19,7) | |
| -- print("msg: "..msg,2,19,10) | |
| end | |
| end | |
| end | |
| -->8 | |
| -- raycasting | |
| -- draw the 3d view | |
| function draw_perspective(world,player,dist_table,detail_limit_table) | |
| -- sky | |
| rectfill(0,0,128,64,0) | |
| local cam=player.cam | |
| local dr=player.dr | |
| -- stars | |
| for _,s in pairs(stars) do | |
| local invdet=1/(cam.x*dr.y-cam.y*dr.x) | |
| local tfx=invdet*(dr.y*s.x-dr.x*s.y) | |
| local tfy=invdet*(-cam.y*s.x+cam.x*s.y) | |
| local sx=64*(1+tfx/tfy) | |
| local sy=abs(64-s.z) | |
| pset(sx,sy,7) | |
| end | |
| -- put another rect fill to hide the stars behind the walls | |
| rectfill(0,64,128,128,1) | |
| --0.6971->0.7227 | |
| -- -> 0.7368 | |
| -- first raycast pass | |
| local floors, | |
| zbuf, | |
| dr_start, | |
| dr_end=ray_cast( | |
| world, | |
| player, | |
| dist_table, | |
| detail_limit_table, | |
| 0, | |
| 127, | |
| false) | |
| floor_cast(floors,world,player,dist_table) | |
| -- pass for walls over doors | |
| ray_cast( | |
| world, | |
| player, | |
| dist_table, | |
| detail_limit_table, | |
| dr_start, | |
| dr_end, | |
| true) | |
| -- draw sprites | |
| ce_heap_sort(sprites,player) | |
| for _,s in pairs(sprites) do | |
| draw_billboard_sprite(s,player,zbuf) | |
| end | |
| reset_palette() | |
| end | |
| function ray_cast( | |
| world,player, | |
| dist_table,detail_limit_table, | |
| s_x,e_x, | |
| bad_wall_hack) | |
| local floors={} | |
| local zbuf={} | |
| local check=0 | |
| local camx1=player.cam.x | |
| local camy=player.cam.y | |
| local rayx=player.pos.x | |
| local rayy=player.pos.y | |
| local perpwalldist=0 | |
| local wallx=0 | |
| local raydirx=0 | |
| local raydiry=0 | |
| local mapx=0 | |
| local mapy=0 | |
| local dr_start=0 | |
| local dr_end=0 | |
| local old_p=0 | |
| local old_h=0 | |
| local old_side=0 | |
| local dond=0 | |
| local dend=0 | |
| local half_height=0 | |
| local texwidth=0 | |
| for x=s_x,e_x do | |
| rayx=player.pos.x | |
| rayy=player.pos.y | |
| local camx=2*x/128 -1 | |
| raydirx=player.dr.x+camx1*camx | |
| raydiry=player.dr.y+camy*camx | |
| mapx=flr(rayx) | |
| mapy=flr(rayy) | |
| --.5143->.4703 wow! thanks lodev tut | |
| local ddx=abs(1/raydirx) | |
| local ddy=abs(1/raydiry) | |
| if abs(raydirx)<0.01 then | |
| if raydirx<0 then | |
| raydirx=-0.01 | |
| else | |
| raydirx=0.01 | |
| end | |
| ddx=100 | |
| end | |
| if abs(raydiry)<0.01 then | |
| if raydiry<0 then | |
| raydiry=-0.01 | |
| else | |
| raydiry=0.01 | |
| end | |
| ddy=100 | |
| end | |
| -- printh("r:"..raydiry,"debug") | |
| local hit=0 | |
| local side=0 | |
| local stepx=0 | |
| local stepy=0 | |
| local sidedistx=0 | |
| local sidedisty=0 | |
| local texidx=0 | |
| local last_texidx=0 | |
| local d=nil--door | |
| if raydirx<0 then | |
| stepx=-1 | |
| sidedistx=(rayx-mapx)*ddx | |
| elseif raydirx>0 then | |
| stepx=1 | |
| sidedistx=(mapx+1-rayx)*ddx | |
| else | |
| -- perpendicular so 'infinite' | |
| sidedistx=20000 | |
| end | |
| if raydiry<0 then | |
| stepy=-1 | |
| sidedisty=(rayy-mapy)*ddy | |
| elseif raydiry>0 then | |
| stepy=1 | |
| sidedisty=(mapy+1-rayy)*ddy | |
| else | |
| sidedisty=20000 | |
| end | |
| while hit==0 do | |
| if sidedistx<sidedisty then | |
| sidedistx+=ddx | |
| mapx+=stepx | |
| side=0 | |
| else | |
| sidedisty+=ddy | |
| mapy+=stepy | |
| side=1 | |
| end | |
| last_texidx=texidx | |
| texidx=world[mapy][mapx] | |
| -- check moving from outside->inside | |
| if texidx==0 then | |
| if bad_wall_hack then | |
| hit=1 | |
| texidx=6 | |
| end | |
| if last_texidx~=0 then | |
| if (dr_start==0) dr_start=x | |
| dr_end=x | |
| end | |
| -- check for wall texture tiles | |
| elseif texidx>2 then | |
| -- wall over door | |
| if texidx==3 | |
| and bad_wall_hack then | |
| hit=1 | |
| texidx=6 | |
| elseif texidx==3 or texidx==5 then | |
| -- door handling | |
| if (dr_start==0) dr_start=x | |
| dr_end=x | |
| -- do a load of extra calculations | |
| -- for the offset door | |
| local map_x2=mapx | |
| local map_y2=mapy | |
| if (rayx<map_x2) map_x2-=1 | |
| if (rayy>map_y2) map_y2+=1 | |
| local adj=1 | |
| local ray_mult=1 | |
| if side==0 then | |
| adj=(map_x2-rayx)+1 | |
| ray_mult=adj/raydirx | |
| else | |
| adj=map_y2-rayy | |
| ray_mult=adj/raydiry | |
| end | |
| local rxe=rayx+raydirx*ray_mult | |
| local rye=rayy+raydiry*ray_mult | |
| d=door_for(mapx,mapy) | |
| local rdy2=raydiry*raydiry | |
| local rdx2=raydirx*raydirx | |
| if side==0 then | |
| local ddx2=sqrt(1+rdy2/rdx2) | |
| local y_step=sqrt(ddx2*ddx2-1) | |
| if flr(rye+(stepy*y_step)/2)==mapy then | |
| if texidx==5 or (rye+(stepy*y_step)/2)-mapy>d.open_pcnt/100 then | |
| hit=1 | |
| mapx+=stepx/2 | |
| end | |
| end | |
| --[[ if hit==0 then | |
| mapx+=5 | |
| rayx+=5 | |
| end]] | |
| else | |
| local ddy2=sqrt(1+rdx2/rdy2) | |
| local x_step=sqrt(ddy2*ddy2-1) | |
| if flr(rxe+(stepx*x_step)/2)==mapx then | |
| if texidx==5 or (rxe+(stepx*x_step)/2)-mapx>d.open_pcnt/100 then | |
| hit=1 | |
| mapy+=stepy/2 | |
| end | |
| end | |
| end | |
| else | |
| hit=1 | |
| end | |
| end | |
| end | |
| --0.7424 | |
| if side==0 then | |
| perpwalldist=(mapx-rayx+ | |
| (1-stepx)/2)/raydirx | |
| wallx=rayy+perpwalldist*raydiry | |
| else | |
| perpwalldist=(mapy-rayy+ | |
| (1-stepy)/2)/raydiry | |
| wallx=rayx+perpwalldist*raydirx | |
| end | |
| --[[if x==64 then | |
| msg=""..perpwalldist | |
| end]] | |
| zbuf[x]=perpwalldist | |
| zbuf[x+1]=perpwalldist | |
| wallx-=flr(wallx) | |
| local texx=flr(wallx*16) | |
| local stack_tex={} | |
| stack_tex[0]=texidx | |
| stack_tex[1]=texidx | |
| local stacks=0 | |
| if (last_texidx==1 or last_texidx==2) stacks=1 | |
| local stack_start=0 | |
| if (bad_wall_hack) stack_start=1 | |
| if texidx==3 then | |
| if d.open_pcnt>0 then--whuuuuuut | |
| texx+=1 | |
| end | |
| texx-=(d.open_pcnt/100)*16 | |
| if stacks>0 then | |
| stack_tex[1]=6 | |
| end | |
| end | |
| local lheight=flr(128/perpwalldist) | |
| if lheight~=old_h | |
| or side~=old_side then | |
| half_height=lheight/2 | |
| local dstart=-(half_height)+64 | |
| dend=half_height+64 | |
| -- hack for being very close | |
| -- to the wall. doesn't quite | |
| -- work | |
| if dstart>dend then | |
| dstart=0 | |
| dend=128 | |
| end | |
| if (dend<64) dend=128 | |
| if lheight==0 then | |
| dstart=0 | |
| dend=128 | |
| end | |
| dend=dend or 128 | |
| local dcol= | |
| min(15,flr((dend-dstart)/2)) | |
| if (side==1) dcol=max(dcol-3,0) | |
| local p=clamp(15-dcol,0,7) | |
| --0.7368 | |
| if p~=old_p then | |
| palette(p) | |
| old_p=p | |
| end | |
| dond=dend-dstart+1 | |
| -- texwidth=clamp(perpwalldist/2,1,2) | |
| -- if (perpwalldist>4) texwidth=2 | |
| end | |
| -- if half_height~=old_h then | |
| for i=stack_start,stacks do | |
| local foo=half_height*(max(1,i*3)) | |
| local dstart2=-foo+64 | |
| -- sspr(stack_tex[i]*16+texx,0,1,16,x,dstart2,1,dond) | |
| sspr(stack_tex[i]*16+texx,0,1,16,x,dstart2,1,dond) | |
| end | |
| -- end | |
| old_h=lheight | |
| old_side=side | |
| -- draw every other vertical line | |
| if x%2==0 and dend<128 then | |
| add(floors, | |
| { | |
| x, | |
| check%2, | |
| dend, | |
| raydirx, | |
| raydiry, | |
| flr(max( | |
| detail_limit_table[x], | |
| dend)), | |
| stacks }) | |
| check+=1 | |
| end | |
| end | |
| reset_palette() | |
| local par_col={} | |
| par_col[0]=4 | |
| par_col[1]=9 | |
| par_col[2]=10 | |
| par_col[3]=10 | |
| par_col[4]=7 | |
| par_col[5]=7 | |
| local cam=player.cam | |
| local dr=player.dr | |
| for _,s in pairs(particles) do | |
| s.z+=1 | |
| s.life-=1 | |
| if s.z>30 or s.life==0 then | |
| del(particles,s) | |
| end | |
| local s_x=s.x-player.pos.x | |
| local s_y=s.y-player.pos.y | |
| local invdet=1/(cam.x*dr.y-cam.y*dr.x) | |
| local tfx=invdet*(dr.y*s_x-dr.x*s_y) | |
| local tfy=invdet*(-cam.y*s_x+cam.x*s_y) | |
| local scr_x=64*(1+tfx/tfy) | |
| local scr_y=64-(s.z/tfy) | |
| -- int drawstarty = -spriteheight / 2 + h / 2 + vmovescreen; | |
| if tfy>0 and tfy<128 then | |
| -- msg=">> "..(tfy/tfx) | |
| local sz= | |
| flr(clamp(5-sqrt(s_x*s_x+s_y*s_y),0,3)) | |
| rectfill( | |
| scr_x, | |
| scr_y, | |
| scr_x+sz, | |
| scr_y+sz, | |
| par_col[clamp(flr(s.life/10),0,5)]) | |
| end | |
| end | |
| return floors,zbuf,dr_start,dr_end | |
| end | |
| function floor_cast(floors,world,player,dist_table) | |
| local h=128 | |
| local px=player.pos.x | |
| local py=player.pos.y | |
| for _,f in pairs(floors) do | |
| local x=f[1] | |
| local x_width=x+3 | |
| local check=f[2] | |
| local dend=f[3] | |
| local raydirx=f[4] | |
| local raydiry=f[5] | |
| local start_dither=f[6] | |
| local stacks=f[7] | |
| --653 to beat | |
| local curdist=0 | |
| local cfloorx=0 | |
| local cfloory=0 | |
| local floortex=0 | |
| local floortexx=0 | |
| local floortexy=0 | |
| if stacks==0 then | |
| rectfill(x,128-start_dither,x+2,128-(dend+3),1) | |
| end | |
| -- for y=start_dither-check,dend+5,-2 do | |
| for y=start_dither-check,dend+5,-2 do | |
| curdist=dist_table[y] | |
| cfloorx=curdist*raydirx+px | |
| cfloory=curdist*raydiry+py | |
| floortex=world[flr(cfloory)][flr(cfloorx)] | |
| -- floortex=abs(world[flr(cfloory)*32+flr(cfloorx)]) | |
| -- floortex=peek(0x4300+32*flr(cfloory)+flr(cfloorx)) | |
| floortexx=(cfloorx*16)%16 | |
| floortexy=(cfloory*16)%16 | |
| local tcol=sget(floortex*16+floortexx,floortexy) | |
| pset(x,y,tcol) | |
| if floortex==0 then | |
| local trcol=sget(floortexx,floortexy+16) | |
| pset(x,128-y,trcol) | |
| end | |
| end | |
| for y=h-check,start_dither,-2 do | |
| curdist=dist_table[y] | |
| cfloorx=curdist*raydirx+px | |
| cfloory=curdist*raydiry+py | |
| floortex=world[flr(cfloory)][flr(cfloorx)] | |
| -- floortex=abs(world[flr(cfloory)*32+flr(cfloorx)]) | |
| --6503->6374 | |
| -- floortex=peek(0x4300+32*flr(cfloory)+flr(cfloorx)) | |
| if floortex==3 or floortex==5 then | |
| floortex=0 | |
| end | |
| floortexx=(cfloorx*16)%16 | |
| floortexy=(cfloory*16)%16 | |
| local tcol=sget(floortex*16+floortexx,floortexy) | |
| -- local tcol2=sget(floortex*16+floortexx,floortexy+1) | |
| rectfill(x,y,x_width,y,tcol) | |
| if floortex==0 then | |
| local trcol=sget(floortexx,floortexy+16) | |
| rectfill(x,128-y,x_width,128-y,trcol) | |
| end | |
| end | |
| end | |
| end | |
| -->8 | |
| -- cats/sprites | |
| -- creating sprites, drawing them, | |
| -- some update stuff | |
| function make_cat(x,y,a) | |
| local c=make_sprite(x,y,32,32,a,false) | |
| c.v=0 | |
| c.sv=0 | |
| c.think_timer=1 | |
| c.id=id | |
| id+=1 --each cat needs their own id | |
| c.do_plan=function(self) | |
| local accel=0.01 | |
| local dx=self.pos.x-self.target.x | |
| local dy=self.pos.y-self.target.y | |
| if dx*dx+dy*dy>0.2 then | |
| local r_diff=abs(self.target_r-self.a)%360 | |
| if r_diff>20 then | |
| local rot=15 | |
| local cw= | |
| loop_angle(self.target_r-self.a) | |
| local ccw= | |
| loop_angle(self.a-self.target_r) | |
| if cw>ccw then | |
| rot=-15 | |
| end | |
| --msg=cw.." v "..ccw | |
| turn_player(self,rot) | |
| else | |
| self.think_timer=1 | |
| accel=0.04 | |
| end | |
| else | |
| self.think_timer=1 | |
| end | |
| move_in_current_dir(self,accel) | |
| update_p(self) | |
| end | |
| c.update=function(c) | |
| c.think_timer-=1 | |
| if c.think_timer==0 then | |
| c.think_timer=30 | |
| c.target=pick_target(c,player) | |
| local o=c.target.y-c.pos.y | |
| local a=c.target.x-c.pos.x | |
| local new_r=atan2(-o, -a)*360-90 | |
| if (new_r>360)new_r-=360 | |
| if (new_r<0)new_r+=360 | |
| rotate_to(c,new_r) | |
| --msg=c.target_r.."!" | |
| --end plan | |
| end | |
| c:do_plan() | |
| end | |
| return c | |
| end | |
| function pick_target(picker,potential) | |
| local dx=picker.pos.x-potential.pos.x | |
| local dy=picker.pos.y-potential.pos.y | |
| local dist_to_target=dx*dx+dy*dy | |
| if potential.prev then | |
| dx=picker.pos.x-potential.prev.x | |
| dy=picker.pos.y-potential.prev.y | |
| if dx*dx+dy*dy<dist_to_target then | |
| return {x=player.prev.x,y=player.prev.y} | |
| end | |
| end | |
| return {x=potential.pos.x,y=potential.pos.y} | |
| end | |
| function make_sprite(x,y,width,height,a,flat) | |
| local s={ | |
| a=0, | |
| target_r=0, | |
| dr={x=1,y=0}, | |
| pos={x=x,y=y}, | |
| flat=flat, | |
| width=width, | |
| height=height | |
| } | |
| return s | |
| end | |
| function draw_billboard_sprite(s,player,zbuf) | |
| local pos=player.pos | |
| local dr=player.dr | |
| local cam=player.cam | |
| local t_w=s.width | |
| local t_h=s.height | |
| local s_x=s.pos.x-pos.x | |
| local s_y=s.pos.y-pos.y | |
| local s_dist= | |
| sqrt(s_x*s_x+s_y*s_y) | |
| local invdet=1.0/ | |
| (cam.x*dr.y- | |
| cam.y*dr.x | |
| ) | |
| local t_x=invdet*( | |
| dr.y*s_x- | |
| dr.x*s_y | |
| ) | |
| local t_y=invdet*( | |
| -cam.y*s_x+ | |
| cam.x*s_y | |
| ) | |
| -- if t_y>0 and t_y<128 then | |
| local sscr_x=flr(64*(1+t_x/t_y)) | |
| local s_height=flr(abs(128/t_y)) | |
| local ds_y=-s_height/2+64 | |
| local s_width=s_height | |
| local ds_x=-s_width/2+sscr_x | |
| if ds_x<0 then | |
| ds_x=0 | |
| end | |
| local de_x=s_width/2+sscr_x | |
| if (de_x>=128) de_x=127 | |
| if t_y>0 and t_y<128 then | |
| local a_to_spr=(s.a-player.a) | |
| if a_to_spr>360 then | |
| a_to_spr-=360 | |
| elseif a_to_spr<0 then | |
| a_to_spr+=360 | |
| end | |
| -- msg="a="..a_to_spr | |
| local rot_tex_idx=0 | |
| if a_to_spr<45 | |
| or a_to_spr>315 then | |
| rot_tex_idx+=t_w*2 | |
| elseif a_to_spr>=45 | |
| and a_to_spr<125 then | |
| rot_tex_idx+=t_w | |
| elseif a_to_spr>225 then | |
| rot_tex_idx+=t_w*3 | |
| end | |
| palette(clamp(flr(s_dist-2),0,15)) | |
| for i=ds_x,de_x do | |
| if zbuf[flr(i)]>s_dist then | |
| local texx=( | |
| i-(-s_width/2+sscr_x))*(t_w-1) /s_width | |
| sspr(rot_tex_idx+texx,64,1,t_h,i,ds_y,1,s_height) | |
| end | |
| end | |
| end | |
| end | |
| -->8 | |
| -- utils | |
| function is_between(e,a,b) | |
| local tmp=a | |
| if b<a then | |
| a=b | |
| b=tmp | |
| end | |
| if e>=a and e<=b then | |
| return true | |
| end | |
| return false | |
| end | |
| function is_between_v(e,a,b) | |
| if is_between(e.x,a.x,b.x) | |
| and is_between(e.y,a.y,b.y) | |
| then | |
| return true | |
| end | |
| return false | |
| end | |
| function loop_angle(a) | |
| if (a>360) return abs(a-360) | |
| if (a<0) return abs(a+360) | |
| return a | |
| end | |
| function clamp(val,mi,ma) | |
| return max(mi,min(ma,val)) | |
| end | |
| function add_v(a,b) | |
| return {x=a.x+b.x,y=a.y+b.y} | |
| end | |
| function sub_v(a,b) | |
| return {x=b.x-a.x,y=b.y-a.y} | |
| end | |
| function dot(a,b) | |
| return a.x*b.x+a.y*b.y | |
| end | |
| function v_len(x,y) | |
| return sqrt(x*x+y*y) | |
| end | |
| function normalize(a) | |
| local len=v_len(a.x,a.y) | |
| return {x=a.x/len,y=a.y/len} | |
| end | |
| -- adapted from heap sort | |
| -- originally by @casualeffects | |
| function ce_heap_sort(data,player) | |
| if (#data==0) return | |
| local n = #data | |
| local p_pos=player.pos | |
| for d in all(data) do | |
| local dx=(d.pos.x-p_pos.x)/10 | |
| local dy=(d.pos.y-p_pos.y)/10 | |
| d.key=dx*dx+dy*dy | |
| end | |
| -- form a max heap | |
| for i = flr(n / 2) + 1, 1, -1 do | |
| -- m is the index of the max child | |
| local parent, value, m = i, data[i], i + i | |
| local key = value.key | |
| while m <= n do | |
| -- find the max child | |
| if ((m < n) and (data[m + 1].key < data[m].key)) m += 1 | |
| local mval = data[m] | |
| if (key < mval.key) break | |
| data[parent] = mval | |
| parent = m | |
| m += m | |
| end | |
| data[parent] = value | |
| end | |
| -- read out the values, | |
| -- restoring the heap property | |
| -- after each step | |
| for i = n, 2, -1 do | |
| -- swap root with last | |
| local value = data[i] | |
| data[i], data[1] = data[1], value | |
| -- restore the heap | |
| local parent, terminate, m = 1, i - 1, 2 | |
| local key = value.key | |
| while m <= terminate do | |
| local mval = data[m] | |
| local mkey = mval.key | |
| if (m < terminate) and (data[m + 1].key < mkey) then | |
| m += 1 | |
| mval = data[m] | |
| mkey = mval.key | |
| end | |
| if (key < mkey) break | |
| data[parent] = mval | |
| parent = m | |
| m += m | |
| end | |
| data[parent] = value | |
| end | |
| end | |
| function calculate_fps(now) | |
| frames+=1 | |
| local newnow=flr(now) | |
| if (newnow!=lastclock) then | |
| fps=frames | |
| frames=0 | |
| lastclock=newnow | |
| end | |
| end | |
| -->8 | |
| -- player | |
| function make_player() | |
| return { | |
| id=0, | |
| a=0, | |
| vr=0, | |
| v=0, | |
| sv=0, | |
| --pos={x=3.6,y=3.8}, | |
| pos={x=6.5,y=18}, | |
| prev={x=3.6,y=3.8}, | |
| dr={x=1,y=0}, -- looking west | |
| cam={x=0,y=0.66}, | |
| update=update_player_with_input | |
| } | |
| end | |
| function update_player_with_input(self) | |
| update_p(self) | |
| self.vr*=0.9 | |
| self.a+=self.vr | |
| if self.a>359 then | |
| self.a-=359 | |
| end | |
| local r=self.a/360 | |
| local olddrx=self.dr.x | |
| self.dr.x=cos(r) | |
| self.dr.y=-sin(r) | |
| if self.cam then | |
| local r2=self.vr/360 | |
| local oldplanex=self.cam.x | |
| self.cam.x=oldplanex*cos(r2)+ | |
| self.cam.y*sin(r2) | |
| self.cam.y=-oldplanex*sin(r2)+ | |
| self.cam.y*cos(r2) | |
| end | |
| if timer%60==0 then | |
| self.prev.x=self.pos.x | |
| self.prev.y=self.pos.y | |
| end | |
| end | |
| function move_in_current_dir(s,amount) | |
| s.v=clamp(s.v+amount,-0.3,0.3) | |
| end | |
| function strafe_in_current_dir(s,amount) | |
| s.sv=clamp(s.sv+amount,-0.3,0.3) | |
| end | |
| -- todo:remove i think | |
| function turn_player(player,ar) | |
| player.a+=ar | |
| if player.a>359 then | |
| player.a-=359 | |
| end | |
| player.a=flr(player.a) | |
| local r=player.a/360 | |
| local olddrx=player.dr.x | |
| player.dr.x=cos(r) | |
| player.dr.y=-sin(r) | |
| if player.cam then | |
| local r2=ar/360 | |
| local oldplanex=player.cam.x | |
| player.cam.x=oldplanex*cos(r2)+ | |
| player.cam.y*sin(r2) | |
| player.cam.y=-oldplanex*sin(r2)+ | |
| player.cam.y*cos(r2) | |
| end | |
| end | |
| function turn_player2(player,ar) | |
| player.vr=clamp(player.vr+ar,-6,6) | |
| end | |
| function update_p(s) | |
| s.v*=0.6 | |
| s.sv*=0.6 | |
| local mvx=player.cam.x*s.sv+s.dr.x*s.v | |
| local mvy=player.cam.y*s.sv+s.dr.y*s.v | |
| local movex=s.pos.x+mvx | |
| local movey=s.pos.y+mvy | |
| local move_sq=world | |
| [flr(s.pos.y)] | |
| [flr(movex)] | |
| if move_sq<3 | |
| or (move_sq==3 and door_for( | |
| flr(movex), flr(s.pos.y)).open_pcnt>70) | |
| -- and abs(flr(movex)-movex)>0.1 | |
| then | |
| s.pos.x=movex | |
| end | |
| move_sq=world | |
| [flr(movey)] | |
| [flr(s.pos.x)] | |
| if move_sq<3 | |
| or (move_sq==3 and door_for( | |
| flr(s.pos.x), flr(movey)).open_pcnt>70) | |
| -- and abs(flr(movey)-movey)>0.1 | |
| then | |
| s.pos.y=movey | |
| end | |
| end | |
| function rotate_to(s,targetrotation) | |
| s.target_r = targetrotation | |
| end | |
| -->8 | |
| -- map utils/doors | |
| -- map creation, door updating | |
| -- also drawing the map view | |
| doors={} | |
| map_to_tex_mapping={} | |
| map_to_tex_mapping[96]=0 | |
| map_to_tex_mapping[97]=1 | |
| map_to_tex_mapping[98]=2 | |
| map_to_tex_mapping[99]=3 | |
| map_to_tex_mapping[100]=4 | |
| map_to_tex_mapping[101]=5 | |
| map_to_tex_mapping[102]=6 | |
| map_to_tex_mapping[103]=7 | |
| tex_to_map_mapping={} | |
| tex_to_map_mapping[0]=96 | |
| tex_to_map_mapping[1]=97 | |
| tex_to_map_mapping[2]=98 | |
| tex_to_map_mapping[3]=99 | |
| tex_to_map_mapping[4]=100 | |
| tex_to_map_mapping[5]=101 | |
| tex_to_map_mapping[6]=102 | |
| tex_to_map_mapping[7]=103 | |
| function map_to_tex(mapval) | |
| return map_to_tex_mapping[mapval] | |
| end | |
| function make_world() | |
| local new_world={} | |
| for y=0,32 do | |
| new_world[y+1]={} | |
| for x=0,32 do | |
| --local tex=map_to_tex(mget(x,48+y)) | |
| local tex=map_to_tex(mget(x,y)) | |
| new_world[y+1][x+1]=tex | |
| if tex==3 then | |
| add(doors,{x=x+1,y=y+1,open_pcnt=0,open_vel=0}) | |
| end | |
| end | |
| end | |
| return new_world | |
| end | |
| function door_for(x,y) | |
| for _,d in pairs(doors) do | |
| if d.x==x and d.y==y then | |
| return d | |
| end | |
| end | |
| return nil | |
| end | |
| function check_door(d,p) | |
| local dx=p.pos.x-(d.x+0.5) | |
| local dy=p.pos.y-(d.y+0.5) | |
| local dtd=abs(dx*dx+dy*dy) | |
| -- msg=player.pos.x.." "..player.pos.y.." "..d.x.." "..d.y.." "..dtd | |
| -- msg="" | |
| if dtd<2 then | |
| -- msg="door "..dtd.." "..d.x.." "..d.y.." "..player.pos.x.." "..player.pos.y | |
| return true | |
| else | |
| return false | |
| end | |
| end | |
| function update_doors(doors) | |
| for _,d in pairs(doors) do | |
| local near_door=check_door(d,player) | |
| for _,c in pairs(cats) do | |
| near_door=near_door or check_door(d,c) | |
| end | |
| if near_door then | |
| if d.open_pcnt<100 then | |
| d.open_vel=5 | |
| end | |
| else | |
| if d.open_pcnt>0 then | |
| d.open_vel=-5 | |
| end | |
| end | |
| d.open_pcnt=clamp(d.open_pcnt+d.open_vel,0,100) | |
| end | |
| end | |
| function draw_map_view(world,player) | |
| cls(5) | |
| pal(7,7) | |
| -- camera((player.pos.x*8),(player.pos.y*8)) | |
| reset_palette() | |
| for y=1,#world do | |
| for x=1,#world[y] do | |
| local sp=world[y][x] | |
| -- if (sp==-1) sp=16 | |
| -- spr(sp,(x-1)*8,#world*8-y*8) | |
| spr(tex_to_map_mapping[sp],(x-1)*8,(y-1)*8) | |
| end | |
| end | |
| local px=8*(player.pos.x-1) | |
| local py=8*(player.pos.y-1) | |
| local pxe=px+player.dr.x*5 | |
| local pye=py+player.dr.y*5 | |
| line( | |
| px,py, | |
| pxe,pye, | |
| 10) | |
| pset(px,py,9) | |
| circfill(8*(player.prev.x-1),8*(player.prev.y-1),1,9) | |
| for _,s in pairs(sprites) do | |
| local px=8*(s.pos.x-1) | |
| local py=8*(s.pos.y-1) | |
| local pxe=px+s.dr.x*5 | |
| local pye=py+s.dr.y*5 | |
| line( | |
| px,py, | |
| pxe,pye, | |
| 9) | |
| pset(px,py,8) | |
| end | |
| for _,p in pairs(projectiles) do | |
| line( | |
| 8*(p.pos.x-1),8*(p.pos.y-1), | |
| 8*(p.en.x-1),8*(p.en.y-1), | |
| 8) | |
| if (p.closest)pset(8*(p.closest.x-1),8*(p.closest.y-1),11) | |
| end | |
| for _,p in pairs(particles) do | |
| pset(8*(p.x-1),8*(p.y-1),11) | |
| end | |
| -- print("msg: "..msg,2,120,7) | |
| camera() | |
| end | |
| -->8 | |
| --projectiles | |
| -- creation+raycasting projectiles | |
| function add_projectile(player,projectiles) | |
| add(projectiles,{ | |
| id=player.id, | |
| pos={x=player.pos.x,y=player.pos.y}, | |
| dr={x=player.dr.x,y=player.dr.y}, | |
| life=4, | |
| update=function(self) | |
| local rxe,rye=single_ray_cast( | |
| self.pos,self.dr,world | |
| ) | |
| self.en={x=rxe,y=rye} | |
| local dr=normalize(sub_v(self.pos,self.en)) | |
| -- hardcoded so hardcoded! | |
| for _,e in pairs(sprites) do | |
| local ac=sub_v(self.pos,e.pos) | |
| local dist=dot(ac,dr) | |
| local proj={x=dr.x*dist,y=dr.y*dist} | |
| self.closest=add_v(self.pos,proj) | |
| --msg=self.pos.x.." "..proj.x.." "..proj.y | |
| if abs(e.pos.x-self.closest.x)<0.5 | |
| and abs(e.pos.y-self.closest.y)<0.5 | |
| and is_between_v( | |
| e.pos, | |
| player.pos, | |
| self.en | |
| ) | |
| then | |
| self.hit=true | |
| del(sprites,e) | |
| del(cats,e) | |
| for i=0,1,0.1 do | |
| local d=0.5 | |
| add(particles,{ | |
| x=e.pos.x+d*sin(i), | |
| y=e.pos.y+d*cos(i), | |
| z=rnd(50)-30, | |
| life=10+rnd(5)}) | |
| end | |
| end | |
| end | |
| -- wall particle puff | |
| if not self.hit then | |
| self.hit=true | |
| for i=0,1,0.1 do | |
| local d=0.1 | |
| add(particles,{ | |
| x=rxe+d*sin(i)+rnd(0.1), | |
| y=rye+d*cos(i)+rnd(0.1), | |
| z=rnd(50)-30, | |
| life=10+rnd(5)}) | |
| end | |
| end | |
| -- msg=self.closest.x.." "..self.closest.y | |
| self.life-=1 | |
| end | |
| }) | |
| end | |
| function single_ray_cast(p,ray,world) | |
| local map_x=flr(p.x) | |
| local map_y=flr(p.y) | |
| local side=0 | |
| local step_x=0 | |
| local step_y=0 | |
| local dx=abs(1/ray.x) | |
| local dy=abs(1/ray.y) | |
| local hit=0 | |
| local rxe=0 | |
| local rye=0 | |
| if ray.x<0 then | |
| step_x=-1 | |
| side_x=(p.x-map_x)*dx | |
| else | |
| step_x=1 | |
| side_x=(map_x+1-p.x)*dx | |
| end | |
| if ray.y<0 then | |
| step_y=-1 | |
| side_y=(p.y-map_y)*dy | |
| else | |
| step_y=1 | |
| side_y=(map_y+1-p.y)*dy | |
| end | |
| while hit==0 do | |
| if side_x<side_y then | |
| side_x+=dx | |
| map_x+=step_x | |
| side=0 | |
| else | |
| side_y+=dy | |
| map_y+=step_y | |
| side=1 | |
| end | |
| if world[map_y][map_x]>2 then | |
| hit=1 | |
| if (p.x<map_x) map_x-=1 | |
| if (p.y>map_y) map_y+=1 | |
| local adj=1 | |
| local ray_mult=1 | |
| if side==1 then | |
| adj=map_y-p.y | |
| ray_mult=adj/ray.y | |
| else | |
| adj=(map_x-p.x)+1 | |
| ray_mult=adj/ray.x | |
| end | |
| rxe=p.x+ray.x*ray_mult | |
| rye=p.y+ray.y*ray_mult | |
| end | |
| end | |
| return rxe,rye | |
| end | |
| -->8 | |
| --palette stuff | |
| function reset_palette() | |
| palette(0) | |
| end | |
| function palette(z) | |
| memcpy(0x5f00,0x5000+16*z,16) | |
| end | |
| function create_palettes() | |
| for z=0,7 do | |
| for i=0,15 do | |
| local col=sget(i,z+32) | |
| if i==12 then | |
| col=bor(0x80,i) | |
| end | |
| poke(0x5000+16*z+i,col) | |
| end | |
| end | |
| end | |
| -- for extended pico palette | |
| function new_palette() | |
| --[[ for i=0,15 do | |
| pal(i,i+128,1) | |
| end]] | |
| --[[ext_pal(1) | |
| ext_pal(2) | |
| ext_pal(4) | |
| ext_pal(5) | |
| ext_pal(6) | |
| ext_pal(8) | |
| ext_pal(13) | |
| ext_pal(14)]] | |
| poke(0x5f2e,1) | |
| end | |
| function ext_pal(c) | |
| pal(c,c+128,1) | |
| end | |
| function original_palette() | |
| --[[ for i=0,15 do | |
| pal(i,i,0) | |
| end]] | |
| end | |
| __gfx__ | |
| ddddd555d5dddddd5111511311b1153b442444642244422411111111111111111122211111122211112d3111111222115d5d515d5d5d5d5d111111111111111d | |
| dd5d6d5d5dd5ddd51311131b11311131544524444464445419a29a59a29a29a1411111442211511441d3b34422115114111111111111111115d15d15d15d15dd | |
| ddddd5d5d5dddddd1331111b11311111445224424442244414954944954954a12211142222211142221b3422222111425d6761111d67671515d15d15d15d15dd | |
| dd5ddddddd6dd6dd1b31511b511513114422164454421444144244244544249122211222222211222223b222222211225dddd155ddddd61515d15d15d15d15dd | |
| d5d5d5dddddddddd13b3111b1113135144444464524454461494494494494441252112225552112225213222525211225d5d51555d5d551515d15d15d15d15dd | |
| dd5ddddddd5d5d5d1b33131313311b114224544421244224144244244254244155111555511111125211152525211112111551111115115115d15d15d1dd15dd | |
| 5d65ddddd555d5dd1b3b111331311b112122444422242124122222222222222111111111114421111111111111111111115111111111111115d15d15515d15dd | |
| dd555ddd5d5d5ddd1b3315111111131122144124444252141424524254244241114422111442211111442211143d3311551155d66767155615515d15d15d15dd | |
| d555d5ddd5d5dd5d13b3111311531351444442244444444414444444444dd1411422221442222111142222144223b211551155555556155515d15d15d15d15dd | |
| 5d5d5ddddd555ddd1b3135131511111124444444454224641222222222221121122225122222214412222512222b3111d51ddddddd5515d515d15d15d1dd155d | |
| d5ddd56dddd555dd131b31b11111515112442444244114421111111111111111112551122222114211252112222231445d11ddddddd5115d15d15d15d15d15dd | |
| dd5dddd6d5dd5dd5151331b5311111312246442124422442122122122122122121111122525114222111112252511422d51111111d5511d515d15d15d15d15dd | |
| d6ddd56dddd5d5dd1115133131511131244464124444442412424525524414415111112555111222511331252511122211111111511111111551551d5155155d | |
| dddd5d5ddddd5d5d51111111111131b34424424444644444121144144145114111442112511411521143b11251141152555d6d6711555d55155155155155155d | |
| 5d5dd5dd5dddd5dd115311151131313b52124464224442241111211121121111142222111142211114223211114221115555d5d61155d6d5155155155155156d | |
| dddd5d5dddd6d5d61113311111b1113b41225442212452221111111111111111122222111122221112222211112222111111111511111d6d11d11d11d11d11d6 | |
| 111111111111111d112d311111122211222222224524422211c111111ccd111155555551d55555551111111111111111cccccccccccccccccccccccccccccccc | |
| 15d15d15d15d15dd41d3b3442211511422224522442242521cc11111dcccd111dddddd51dddddddd19a29a59a29a29a1cccccccccccccccccccccccccccccccc | |
| 15d15d15d15d15dd221b3422222111422452442224222242ccdc1111ccdccccc76676651d676766614954222222454a1cccccccccfffffffcccccccccccccccc | |
| 15d15d15d15d15dd2223b222222211225452422222225222111ccccccdddcc1167667651d667676614422cccccc22491ccccccfffff9fffffffffffccccccccc | |
| 15d15d15d15d15dd25213222525211224442424452255225111c1111c1111c11667676515676677614942cccccc24441cccccf79fff99fffffffffffcccccccc | |
| 15d15d15d1dd15dd5211152525211112445222244424442411ccd11dc1111c11676676515766766614422cccccc22441ccccf7f9ffffffffffffffffcccccccc | |
| 15d15d15515d15dd11111111111111114422222224244422ccddc11cc111cccc677676515676676712222cccccc22221cccc7ff4999ffffff99999fffccccccc | |
| 15515d15d15d15dd11442211143d33112425524224224222c11dcccccc11cc1c766776515666767614242cccccc24241cccc79f49ff99ff99111dddddd6ccccc | |
| 15d15d15d15d15dd142222144223b2112224524424122221c1111c11dccccd1c776767515676666714441cccccc1d141cccff9994f99999111ddddddddddd6cc | |
| 15d15d15d1dd155d12222512222b31112224424422224412c1111c111111c11c667667515667667612221cccccc11121cccfff492f9991111ddddddddddddd6c | |
| 15d15d15d15d15dd11252112222231441214422221214422cc11cc111111ccc167667751567667661111111111111111cccf29942f991111111dddddddddddd6 | |
| 15d15d15d15d15dd211111225251142222244214411242241ccccccccd111ccc67767651576677671221221221221221cccc4242ff99111111111ddddddddddd | |
| 1551551d5155155d51133125251112224212211244122144cc1dcd1dccd1ccd167677651567676761242421421441441ccff422f99911111111111dddddddddd | |
| 155155155155155d1143b1125114115242244221442242441c1c11111ccccd1166666651566666661211421421451141ccf9fff99991111111111111dddddddd | |
| 155155155155156d1422321111422111121441122224412411cc11111dccd111d7dd75155dd6dd6d1111211121121111ccff999999111111111111111ddddddd | |
| 11d11d11d11d11d61222221111222211211121111414111211c111111cc1111111111111111111111111111111111111ccfff9999911111111111111111ddddd | |
| 0123456789abcdefcccccccc00000000666d6ddd666d66d61242424214242421010010150010010066fff66f666fff6611294441111911110123456789ab1def | |
| 012325562493dde9cccccccc00000000dddddddddddddddd149494a219494942005000001005000555dd5555555dd5551124494141149111012325562493dde9 | |
| 2123255d2493d524cccccccc00000000111111111111111114a494a219494a421010010100000100005500000005500011244941411449112123255d2493d524 | |
| 0111215d2243d524cccccccc0000000000000000000000001494a4a21a494a420000100001100001101101111101101111224941491244910111215d2243d524 | |
| 0111111512211522cccccccc0000000001010100100010101494a492194a49420500050100001000101101111101101111224441441149410111111512211522 | |
| 0001111112211122cccccccc00000000111111111111111114949492194949420001000010510050101101111101101111122441249124990001111112211122 | |
| 000011111221112211cccccc00000000212212122121222114949142191949425100010100000001101101111101101111122441244112440000111112211122 | |
| 0000101111111111e1cccccc0000000052252155d212d2d214911142191119420001500050111000101101010101101191112241224912240000101111111111 | |
| 0000001100000000e11111cccccccccc55d5d515512155551491d142191d19421500001000000050101101010101101044111241124411240000001100000000 | |
| 0000000100000000ee1ee11ccccccccc5555155d5515555512915142191519420001000000100001001100000001100049111244124441220000000100000000 | |
| 0000000000000000e11111111ccccccc5d555d555dddd5d512911142192119421000150010010100d5115d555d5115d544411124112241220000000000000000 | |
| 0000000000000000eee11e1111cccccc555dd55ddddd5ddd12949442194449420150001005000005666666666666666624441111111221220000000000000000 | |
| 00000000000000001eee1ee1e1cccccc5d5ddddddddddddd12949442124449420000000001050001111111111111111122441111111111110000000000000000 | |
| 00000000000000001eee1ee1e11ccccc555dddd5555dd55512949492124949420101001000000100555555555555555522244144499111110000000000000000 | |
| 00000000000000001eeee1e1ee1ccccc5155d555d55551d512929292122929225050000050010010ff65d6656f6d55d612224124444911110000000000000000 | |
| 0123456789abcdef11eee1e1ee1ccccc111115151115111111424242112424210000501000100500f6d56f65d66d5d6f11224412444491110123456789abcdef | |
| 2555555255355333442444341111111100111100111111111111111111111111dd666dd6ddd666dd00000000000000001111111111111111ccc5dcccccc5dccc | |
| 5d5ddd55333333135445244419a29a5111525491115211411d1d1dd115d115d155dd5555555dd55504409909904409901224941249912499ccc1f555555fdccc | |
| 5dddddd53351355344522442149549411295542112113b211d6761d11565156100110000000110000990aa0490990aa01111111111111111ccc19555555dcccc | |
| 5d6666d513353533242213441442442112415221124132211dddd15115651561105501111105501100000000000000002444124444124441ccc111a7551a7ccc | |
| 556665d555333335444444421494494115211221152112211d5d515115d51561105501111105501100000000000000001111111111111111ccc1190a5190accc | |
| 5dd66dd555333335422454421442442115215451152154511115511115d515d110550111110550110330a902209901101111112244412444ccc11aaa51aaaccc | |
| 5dddddd5533513332142444412222221151155111511551111511d6115d115d110550111110550110bb0a90440a90d101111111111111111ccc1511150011ccc | |
| 5555555533555533421441241111111101101110111111111111111111121112105501010105501100000000000000004441244441111112cccc1155115dcccc | |
| 000000005111511533553bb30000000000000000776ff77700000000100f0000105501010105501000000000000000001111111111111111ccc11111111ccccc | |
| 0000000015b3355133333333000000000000000076deff7700000000200e0000005500000005500004401109909909a01224441244412444ccc111155dddcccc | |
| 000000001333b3313553355300000000000000006d58ef770000000050089f7055dd5555555dd5550990dd0a909a09a01111111111111111cc11115555dddccc | |
| 0000000013baab31333bab330000000000000000d51249f700000000d00200a06d66d6d6d6d66d6d00000000000000004411111112444122cc111155555dddcc | |
| 00000000133abab13333333300000000000000006d51249f000000006d51249f111111111111111100000000000000001111111111111111cc111155555dddcc | |
| 0000000013b3333135355333000000000000000076d349af0000000070030040555555555555555509904409902209902444412444412441cc1111155555ddcc | |
| 000000001b3b3b513bb333550000000000000000766baa7700000000d00b002066ddddddd6dddddd0aa0aa09a0440a902222222222222222cc1111115555ddcc | |
| 00000000111515113333333300000000000000007776777700000000500600106dddd6ddddddddd600000000000000004444444444444444ccc111111111dccc | |
| cccc1111ccccccccccccc11111ccccccccccccc111ccccc155cccccccccccccccccccc11111cccccccccc11111cccccccccccccccccccc511ccccc111ccccccc | |
| cccc155511cc111111c115f551ccccccccccccc15f55cc155fcccccccccccccccccccc1555511c1111c1155551ccccccccccccccccccccf551cc55f51ccccccc | |
| cccc155ff9115555551555f51cccccccccccccc15ff5551559ccccccccccccccccccccc155555155551555551ccccccccccccccccccccc9551555ff51ccccccc | |
| ccccc15ff9155555555519f51cccccccccccccc159ff5555555cccccccccccccccccccc151155555555551151cccccccccccccccccccc5555555ff951ccccccc | |
| ccccc15f99155555555551951cccccccccccccc1599555551155ccccccccccccccccccc151155555555551151ccccccccccccccccccc5511555559951ccccccc | |
| ccccc15011511115555511151cccccccccccccc155555551aa155cccccccccccccccccc111555555555555111cccccccccccccccccc551aa155555551ccccccc | |
| cccccc11151aaaa15551aaa1ccccccccccccccc115555551a0155ccccccccccccccccccc5555555555555555ccccccccccccccccccc5510a155555511ccccccc | |
| cccccc11151aa0a15551a0a1ccccccccccccccc115555551a015555ccccccccccccccccc5555555555555555ccccccccccccccccc555510a155555511ccccccc | |
| ccccccc1151aa0a15551a0a1ccccccccccccccc115555551aa155500cccccccccccccccc5555555555555555cccccccccccccccc005551aa155555511ccccccc | |
| ccccccc1151aaaa15551aaa15cccccccccccccc115555551aa155000ccccccccccccccc555555555555555555ccccccccccccccc000551aa155555511ccccccc | |
| ccccccc115511115115511155cccccccccccccc11555555511555050ccccccccccccccc155555555555555551ccccccccccccccc05055511555555511ccccccc | |
| ccccccc111555555005555555cccccccccccccc11155555555555055cccccccccccccc11155555555555555111cccccccccccccc11055555555555111ccccccc | |
| ccccccc11100555000055505ccccccccccccccc11155555555550555cccccccccccccccc1155551111555511cccccccccccccccc11505555555555111ccccccc | |
| ccccccc11110000055000015ccccccccccccccc11115555555005515ccccccccccccccc111111111111111111ccccccccccccccc11150055555551111ccccccc | |
| cccccccc111111555555115ccccccccccccccccc111115555555511cccccccccccccccccc11111111111111cccccccccccccccccc111155555551111cccccccc | |
| ccccccc111111111155555ccccccccccccccccc1111111111115cccccccccccccccccccccc111111111111cccccccccccccccccccccc11155511111ccccccccc | |
| ccccccc111111115555555ccccccccccccccccc1111111111155ccccccccccccccccccc111111111555551cccccccccccccccccccc111115555555cccccccccc | |
| cccccc11111555555555555ccccccccccccccc111115555555555ccccccccccccccccc11111555555555555cccccccccccccccccc11555555555555ccccccccc | |
| ccccc1111155555555555555ccccccccccccc11111555555555555ccccccccccccccc1111155555555555555cccccccccccccccc1155555555555555cccccccc | |
| ccccc11111555555555555555cccccccccccc111115555555555555cccccccccccccc11111555555555555555cccccccccccccc111555555555555555ccccccc | |
| ccccc111115555555555555555ccccccccccc111115555555555555cccccccccccccc111115555555555555555ccccccccccccc1115555555555555555cccccc | |
| cccc1111115555555555555555cccccccccc11111155555555555555cccccccccccc1111115555555555555555ccccccccccccc1115555555555555555cccccc | |
| cccc1111115555555555555555cccccccccc11111155555555555555cccccccccccc1111115555555555555555cccccccccccc11115555555555555555cccccc | |
| cccc1111115555555555555555cccccccccc111111555555555555555ccccccccccc1111115555555555555555cccccccccccc11115555555555555555cccccc | |
| cccc11111155555555555555555ccccccccc111111555555555555555ccccccccccc11111155555555555555555ccccccccc11111155555555555555555ccccc | |
| ccc111111115555555555555555cccccccc1111111555555555555555cccccccccc111111115555555555555555cccccccc111111155555555555555555ccccc | |
| ccc111111115555555555555555cccccccc1111111155555555555555cccccccccc111111115555555555555555cccccccc111111115555555555555555ccccc | |
| ccc111111115555555555555555cccccccc11111111555555555555555ccccccccc111111115555555555555555cccccccc111111115555555555555555ccccc | |
| ccc111111115555555555555555cccccccc11111111555555555555555ccccccccc111111111111111115555555cccccccc111111115555555555555555ccccc | |
| ccc111111111111115555555555cccccccc11111111111111555555555ccccccccc111111111111111111111555cccccccc111111111111115555555555ccccc | |
| ccccc11111111111111111155ccccccccccc111111111111111111155cccccccccccc11111111111111111111ccccccccccc1111111111111111111555cccccc | |
| ccccccc1111111111111111cccccccccccccc1111111111111111111cccccccccccccc111111111111111111ccccccccccccc11111111111111111111ccccccc | |
| 46464646464646464646464646464646000000000000000000000000000000000000000000000000cccc1111ccccccccccccc11111ccccccccc5dcccccc5dccc | |
| 00000000000000000000000000000000000000000000000000000000000000000000000000000000cccc155511cc111111c115f551ccccccccc1f555555fdccc | |
| 46261616161616464616161616161646000000000000000000000000000000000000000000000000cccc155ff9115555551555f51cccccccccc19555555dcccc | |
| 00000000000000000000000000000000000000000000000000000000000000000000000000000000ccccc15ff9155555555519f51cccccccccc111a7551a7ccc | |
| 46261626261616461616166666661646000000000000000000000000000000000000000000000000ccccc15f99155555555551951cccccccccc1190a5190accc | |
| 00000000000000000000000000000000000000000000000000000000000000000000000000000000ccccc15011511115555511151cccccccccc11aaa51aaaccc | |
| 46261616161616262616660606361646000000000000000000000000000000000000000000000000cccccc11151aaaa15551aaa1ccccccccccc1511150011ccc | |
| 00000000000000000000000000000000000000000000000000000000000000000000000000000000cccccc11151aa0a15551a0a1cccccccccccc1155115dcccc | |
| 46262626262626262626360606661646000000000000000000000000000000000000000000000000ccccccc1151aa0a15551a0a1ccccccccccc11111111ccccc | |
| 00000000000000000000000000000000000000000000000000000000000000000000000000000000ccccccc1151aaaa15551aaa15cccccccccc111155dddcccc | |
| 46161616161616462616666666161646000000000000000000000000000000000000000000000000ccccccc115511115115511155ccccccccc11115555dddccc | |
| 00000000000000000000000000000000000000000000000000000000000000000000000000000000ccccccc111555555005555555ccccccccc111155555dddcc | |
| 46262616162616462616161616161646340034340000000000000000000000000000000000000000ccccccc11100555000055505cccccccccc111155555dddcc | |
| 00000000000000000000000000000000000000000000000000000000000000000000000000000000ccccccc11110000055000015ccccccccc11111155555dddc | |
| 46262646464646462616464616161646000000000000000000000000000000000000000000000000cccccccc111111555555115cccccccccc11111115555dddc | |
| 00000000000000000000000000000000000000000000000000000000000000000000000000000000ccccccc111111111155555ccccccccccc11111111111dddc | |
| 46262666060606662616164616161646000000000000000000000000000000000000000000000000ccccccc111111115555555cccccccccc0000000000000000 | |
| 00000000000000000000000000000000000000000000000000000000000000000000000000000000cccccc11111555555555555ccccccccc0000000000000000 | |
| 46166606060606062616164646161646000000000000000000000000000000000000000000000000ccccc1111155555555555555cccccccc0000000000000000 | |
| 00000000000000000000000000000000000000000000000000000000000000000000000000000000ccccc11111555555555555555ccccccc0000000000000000 | |
| 46160606066666062616462626161646000000000000000000000000000000000000000000000000ccccc111115555555555555555cccccc0000000000000000 | |
| 00000000000000000000000000000000000000000000000000000000000000000000000000000000cccc1111115555555555555555cccccc0000000000000000 | |
| 46160606060606062646262626261646000000000000000000000000000000000000000000000000cccc1111115555555555555555cccccc0000000000000000 | |
| 00000000000000000000000000000000000000000000000000000000000000000000000000000000cccc1111115555555555555555cccccc0000000000000000 | |
| 46166606060606662626262626461646000000000000000000000000000000000000000000000000cccc11111155555555555555555ccccc0000000000000000 | |
| 00000000000000000000000000000000000000000000000000000000000000000000000000000000ccc111111115555555555555555ccccc0000000000000000 | |
| 46161666666666662616462646461646000000000000000000000000000000000000000000000000ccc111111115555555555555555ccccc0000000000000000 | |
| 00000000000000000000000000000000000000000000000000000000000000000000000000000000ccc111111115555555555555555ccccc0000000000000000 | |
| 46161616161616261616161616161646000000000000000000000000000000000000000000000000ccc111111115555555555555555ccccc0000000000000000 | |
| 00000000000000000000000000000000000000000000000000000000000000000000000000000000ccc111111111111115555555555ccccc0000000000000000 | |
| 46464646464646464646464646464646000000000000000000000000000000000000000000000000ccccc11111111111111111155ccccccc0000000000000000 | |
| 00000000000000000000000000000000000000000000000000000000000000000000000000000000ccccccc1111111111111111ccccccccc0000000000000000 | |
| __label__ | |
| 55552211212500000000000000000000000000000000000000000000011444442244444222222222222222222222222200000000000000000000000000000000 | |
| 55552211112500000000000000000070000000000000000000000000011444442244422222222222222222222222222200000000000000000070000000000000 | |
| 55777177712500000000000000000000000000070000000000000000011444442222222222222222222222222222222400000000000000000000000000000000 | |
| 55557171712500000000000000000000000000000000000000000000011444442222222222222222222222222222222400000000000000000000000000000000 | |
| 55577171712500000000000000000000000000000000000000000000011442222222222222222222222222222444222400000000000000000000000000000000 | |
| 55557171712500000000000000000000000000000000000007000000011222222222222222222222222224444444222400000000000000000000000000000000 | |
| 55777177712500000000000000000000000000000000000000000000011222222222222222222222242224444444222400000000000000000000000000000000 | |
| 55551111112100000000000000000000000000000000000000000000011222222222222222222254442224444444222400000000000000000000000000000011 | |
| 55551111111100070000000000000000000000000000000000000000011222222222222222222554442224444444222400000000000000000000000000111111 | |
| 55551111111100000000000000000000000000000000000000000000011222222222222244222554442224444444222400000000000000000000001111111111 | |
| 55577177717170000000007770000077707770777077700000000000011222222222222444222554442224444444222400000000000000000011111111111111 | |
| 55711171717170070000007070000070007070707700700000000000011222222255522444222554442224444444222400000000000000111111111111111111 | |
| 11711177717170000000007070000077707770707007700000000000011222224455522444222554442224444444222400000000111111111111111111111111 | |
| 11711171117170070000007070000000700070707000700000000000011224224455522444222554442224444444222400001111111111111111111222111111 | |
| 11177171111770000000007770070077700070777077700000000000011444224455522444222554442224444ddd111411111111111111111112222222111111 | |
| 111111111111000000000000000000000000000000000000000000000114442244555224442225544422244ddddd111411111111111111122222222222111111 | |
| 1111111111110000000000000000000000000000000000000000000001144422445552244422255444224ddddddd111411111111122222222222222222111111 | |
| 1111111211110000000000000000000000000000000700000000000001144422445552244422254444444ddddddd111411111111122222222222222222111111 | |
| 1111122211110000000000000000000000000070000000000000000001144422445552244424444444444ddddddd111111111111122222222221122111111111 | |
| 11aaa22aa11aa000000000000000000000000007000000000000000001144422445552244444444444444ddddd11111111111111122222211111111111111111 | |
| 11aaa2a211a1000a0000000000000000000000000000000000000000011444224444444444444444444411111111444411111111122111111111111111111111 | |
| 11a4a2aaa1a100000000000000000007000000000000000000000000011444224444444444444444445555111144442222111111111111111111111111111111 | |
| 11a4a222a1a1a00a0000000000000000000000000000000000000000011444444444444444442222555511111111222211441111111111111111111111111111 | |
| 11a4a2aa11aaa0000000000000000000000000000000000000000000011444444444441111111111111111444422222222441111111111111111111111114411 | |
| 11442222111100000000000000000000000000000000000000000000011444444444111111111111111111114444222244441111111111111111111111444444 | |
| 11442222111100000000000000000000000000000000000000000000011444111111112222111122221111111144442222441111111111111111111111444444 | |
| 11442222111100000000000000000000000000000000000000000000011411111111444422222222111111112222222244441111111111111111111111444444 | |
| 11422222111100000000000000000000000000000011100000000022225555111111112222222255551111111111112222441122211111111111111111444444 | |
| 44222222111100000000000000000000000000111111111000002222555555551111444422222222555511111111111114222222211111111111111111444444 | |
| 44222222111100000000000000000000111111111111114444222222222222111111114444222255551111221122111111222222211111111111111111444444 | |
| 11122222111100000000000000001111111111111111111111112222222211111111111122222211111122115511551112222222211111111111111111442222 | |
| 11111112111100000000000011111111111111111111111111111111111111111111111111111111112211221155551222222222211111111111111111222222 | |
| 11111111111110000000111111111111111111111111111122111111111111112211551111114411221122111111111222222222211111111111111111222222 | |
| 11111111111111111111111111111111122222111111111111221111114411221122111111111144111222221111111222222222211222211111111111222222 | |
| 11111111111111111000111111111112222222114422111111111111111122112211221111111222222222221111111122222222222222211111111111222222 | |
| 11111111111110000222111111111112225111114422211111111111114411221122111222222222222222221111111122222222222222211111111111222222 | |
| 11111111111101122222111111111111155111114422211111111111111122111222222222222222222211111111111122222222222222211111111111222222 | |
| 11111221111111122222111111222111155111114422211111111111111222222222222222222211111111111111111122222222222222211111111111222222 | |
| 22222221111111122222114442222111155111142421211111111111111222222222211111111111111111111111111122222222222222211111111111222222 | |
| 22222221111111122111144442222111151111442211111111111122111221111111111111111111111111111111111122222255222222211111111111222222 | |
| 22222221111141111111144442222121111111442211111111111122211111111111111111111111111111111111111122225555522222211111111111222222 | |
| 22222221144141111111142242222221111111442211111111112122211111111111111111111111111111111111111122225555522222211111111111222222 | |
| 22222211444141111111422222222221111111442211111111112211211111111111111111111111111111111111111122225555522222211111111111222222 | |
| 22222211444142211111422222222221111111422211111111112211111111111111111111111111111111111111111122225555522222211111111111225522 | |
| 22222211444122211111422222222222211111222211111111112211111111111111111111111111111111111111111122225555522222211111111111555555 | |
| 22222211444122211111422222222222211111222211111111111211111111111111111111111111111111111111111222225555522112211111111111555555 | |
| 22222211444122211111222222222222211111222211111111111111111111111111111111111111111122221111222222555555511111111111111111555555 | |
| 22222211444122221111222222222222211111222211111111111111111111111111111111222221112222221111222255555555511111111111111111555555 | |
| 22222211444122221111222222552252211111222211111111111111111112221122222111222221112222221111222255555555511111111111111111555555 | |
| 22222211422122221111222225555552211111222211111111111111111222221122222111222221112222221111222255555555511111111111111111555555 | |
| 22222114222225521111222225555552211111222211111111111111111222221122222111222221112222221111222255555555511111111111111111551155 | |
| 55251114222225521111222225555552211111212211111111111111111222221122222111222221112222221111222255555511511111111111111111111111 | |
| 55251114222225521111225525555551111111112211111111111111111222221122222111222221112222221111222255111111111111111111111111111111 | |
| 55251114222225521111555555555551111111112211111111111111111222221122222111222221112222221111222211111111111111111111111111111111 | |
| 55251114222255511111555555555551111111112211111111111111111222221122222111222221112222221111222211111111111111111111111111111111 | |
| 55251114222255511111555555555551111111111211111111111111111222221122222111222221112222221111222211111111111111111111111111111111 | |
| 55251114222255511111551155115511111111111111111111111111111222221122222111222221112244421111444411111111111111111111111111111111 | |
| 55251114222251111111111111111111111111111111111111111111111222441144455222555552224444441111444411111111111441144114211221112211 | |
| 55551112222511111111111111111111111111111111111111111111111222442244455222555552224444441111444411111111144444444444222222222222 | |
| 55511112222511111111111111111111112221111111111111111111111222442244455222555552224444441111444411111111144444444444222222222222 | |
| 55511112222511111422111111141142222222111111111221111111111222442244455222555552224444441111444411111111144444444444222222222222 | |
| 55511112222511144422211111144442222222111111111222111111111222442244455222555552224444441111444411111111144444444444222222222222 | |
| 55511112222511144422211111144442222222111111111222111111111222442244455222555552224444441111444411111111144444444444222222222222 | |
| 55511112222511144422211111144442222222111111111222111111111222442244455222555552224444441111444411111111144444444444222222222222 | |
| 55511112222514444222211411424422222222111111122212111111111222442244455222555552224444441111444411111144144224422442222222222222 | |
| 55511112222514422222211444422222222222111111122111111111211222442244455222555552224444441111444411114444422222222222222222222222 | |
| 55114411552514422222211444422222222222111111122111111111211222112244455211455541124445541111444411114444422222222222222222222222 | |
| 55114411552112222222211244222222222222111111122111111111211222111144444111444441114445551111111411114444422222222222222222222222 | |
| 55114411552112222222511222222222222112111111111111111111111222111144444111444441114445551111111411114444422222222222222222222222 | |
| 55114411552112222222511222222222222111111111111111111111111222111144444111444441114445551111111411114444422222222222222222222222 | |
| 55114411552111122222511222222222222111111111111111111111111222111144444111444441114445551111111411114422422222222222222222225522 | |
| 55114411552111122555511222222222222111111111111111111111111222111144444111444441114445551111111411112222222222222222222222555555 | |
| 55114411552111125555111222222222221111144111111111111111111222111144444111444441114445551111111411112222222222222222222222555555 | |
| 55114411552111125555111222222222211111444411111111111111111222111144444111444441114445551111111411112222222222222222222222555555 | |
| 11142221511111125111111222222222211111444411111111111111111222111144444111444441114445551111111411112222222222222222222222555555 | |
| 11142221111121111111112222522251211111444411111111111111111111111144444111444441114445551111111411112222222222222222222222555555 | |
| 11142221111121111111122225522551211441422411111111111111111111111122211111144421114445551111111411112211222222255225522222555555 | |
| 11142221111121111111122225522551111444222211111111111111111111111122211111111221111112221111111111111111122222255555522552551155 | |
| 11142221111151111111122525522551111444222211111111111111111111111122211111111221111112221111111111111111122222255555555555111111 | |
| 11142221111151111111122525552511111444222211111111111111111111111122211111111221111112221111111111111111122222255555555555111111 | |
| 11142221111151111111122555555111111224222211111111111111111111111122211111111221111112221111111111111111122222255555555555111111 | |
| 11142221111151111422122555555111111222222211111111111111111111111122211111111221111112221111111111221111122222255555555555111111 | |
| 11122221111111144422121255555111111222222211111111111111111111111122211111111221111112221111111122221111122112211555555555111111 | |
| 11122222111111144422111255515114111222222211111121111111111111111122211111111221111112221111111122221111111111111551155115111111 | |
| 11122222111114444422111225511114111112252211111122111111111111111122211111111221111112221111111122221111111111111111111115111111 | |
| 11122222111114444222111225511114411111552211111222111111111111111111111111111221111112221111111122221111111111111111111111111111 | |
| 11122222111114422222111125111114411111552211111222111111111111111111111111111111111112221111111122221111111111111111111111111111 | |
| 11122222111114422222211111111142411111552211111212111111111111111111111111111111111111121111111122551111111111111111111111111111 | |
| 11122222111112222222211111111442412111552211122211111111111111111111111111111111111111111111111155551111111111111111111111111111 | |
| 11122222111112222222211111111442222111511211122111111111111111111111111111111111111111111111111155551111111111111111111111111111 | |
| 11111112111112222222211111111442222111111111122111111111111111111111111111111111111111111111111155551111111111111111111111111111 | |
| 11111111111111122222211111111422222111111111122111111111111111111111111111111111111111111111111155551111111111111111111111111111 | |
| 111111111111111221112111111112222222211111111111111111111111aaaa1111111111111111111111111111111155551111111111111111111111111111 | |
| 11111111111111111111211111111222222221111111111111111111119999444444441111111111111111111111111155111111111111111111111111111111 | |
| 11111111111111111111111111111222222222111111111111111111aaaa44444444444422221111111111111111111111111111111441111111111111111111 | |
| 11111111113111bbbb11111111111111112222111111111111111199999999444444442222222244441111111111111111111111144441144111111111111111 | |
| 31511111111111113333555511111111222255551111111111112222555544449999444444444444222211111111111111111111144444444114211221111111 | |
| 11111111111111111133331111555511111111111111111111aaaa99992222444444442222444422221111222255551111111111144444444444222221111111 | |
| 11113333333311111111111111113333bbbbbbbbbbbb111199994444444444442222222255554444111111115555444411111111144444444444222222111111 | |
| 11333311115555111155551111111111113333bbbbbbbb1111111144449999444422224444444422221111111122221111111111144444444444222222111111 | |
| 33331111555511111111111111113333111133333333111111111111444444442222222244442222111122225555111111111144144444444444222222111111 | |
| 11111111115555111111111111333333331111555533331111111111111111222244444444222211112222444444441111114444144224422444222222111111 | |
| 11111111555511111111555511111111111155551111111111111111111111111111444422221111111122224444222211114444422222222442222222111111 | |
| 11333311111111111155551111111111111111111111113333555511111111111111112222111111112222222211112222114444422222222222222222111111 | |
| 33331111333333331111111133331111111111111111333333331111111111111111111111111111222244441111111111114444422222222222222222112211 | |
| 11111155553333111111111111bbbbbbbb1111111111111111bbbbbbbb1111111111111111111122222222111111111111114444422222222222222222222222 | |
| bbbb555511111111111111111111bbbb33331111555511111111bbbbbbbb11115555111111111111111122222222111111114422422222222222222222222222 | |
| 11bbbb11111111111111111111111133333333555533331111111111113333333311115555111111111111111111111111112222422222222222222222222222 | |
| bbbb3333111155551111111111111111111111111111111111111111111133331111111155551111111111111111111111112222222222222222222222222222 | |
| 11333311111111111133331111111111111111111111111111111111111111111111115555333333333333333311111111112222222222222222222222222222 | |
| 3333111111111111333333331111111111111111111133331111111133331111111111111111333333333333bbbb111111112222222222222222222222222222 | |
| 1111111111111111113333bbbb11115555111111113333333311111111333311115555111111113333bbbb3333bbbbbbbb111122222222222222222222222222 | |
| 11111111111111111111bbbbbbbb55551111111133331111111111113333111155555555111111111111bbbb3333bbbbbbbb1111222222222222222222222222 | |
| 1111111111111111111111bbbbbbbb11111111111111111111111155551111111111111111111111111111333333333333bbbb11112222222222222222222222 | |
| 111111111111333311111111bbbbbbbbbbbb11113333111111115555111111111111111111111111111111111111333333331111111111112222222222222222 | |
| 11333355553333333311111111bbbbbbbb3333333333331111111111111111111111111111111133333333111111113333333333331111111122222222222222 | |
| 3333555511113333111111111111bbbb333333333333111111111111555511111111111111111111333333331111111155553333333311111111111122222222 | |
| 11555511111111111111111111111111113333333311111111111155551111111111115555111111113333333311115555111133331111111111111111555522 | |
| 11111111111111111111111111111111111133331111111111111111555511111111111155551111111111111111111155551111111111111111111111111111 | |
| 11111111111111555511111111111111111111111111113333111111111111111111115555111111111111111111111111111111111111111111115555111111 | |
| 11111111111155555555111133331111111111111111333333331111111111111111111155551111333311111111111111111111111111113333555555551111 | |
| 11111111115555555511113333333311111111111133333333333311111111333311111111111133333333111111111111111111111111333333335555111111 | |
| 111111111111555511111111333311111111111111113333333311111111333333331111111111113333bbbb1111111111111111111111113333333333331111 | |
| 11111111111111111111111111111111115555111111113333333311113333333333331111111111113333bbbbbbbb1111111111111111111133333333bbbb11 | |
| 333311111111333311111111111111115555111111111111111111115555333333333333111111111111bbbbbbbbbbbb1111111111111111111111113333bbbb | |
| 11333311113333333311111111111155555555111111111111bbbb11115555111133331111111111111111bbbbbbbbbbbb111111111111111111111111bbbbbb | |
| 333333333333333333331111111111115555111155551111bbbbbbbb555555551111111111111111111111111111bbbb3333333311115555555511111111bbbb | |
| 113333bbbb333333333333111111111111111111115555bbbbbbbbbbbb5555111111111111111111111111111111113333333333331111555555551111111111 | |
| __map__ | |
| 64646464646464646464646464646464646666646464646464646464646464640000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c2 | |
| 6464646464646464616161616161616161616166646464646464646464646464000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 | |
| 6464646464646464616161616060676767616166646464646464646464646464000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 | |
| 6464646464646464616161616161606067616166646464646464646464646464000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 | |
| 6464646464646464616161616161606067616166666464646464646464646464000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 | |
| 6464646464606063616161616161606067616160606664646464646464646464000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 | |
| 6464646464606064616161616060676767616160606066666464646464646464000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 | |
| 6464646464606064616161616161616161616166606060666464646464646464000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 | |
| 6464646464606064646464646464646464666664666060606664646460606064000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 | |
| 6464646060606060646762626262626262626764616262626161616463646364000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 | |
| 6460646067606760646262626262626262626264616262616161616460646064000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 | |
| 6460636060606060646262616161616262626264616262626261616460646064000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 | |
| 6460646060606060646262616161616262626264616162626261616460646064000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 | |
| 6464646060606060646262616161616262626264616161616262616460646064000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 | |
| 6464646067606760646262626262626262626264616161626262616463646364000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 | |
| 6464646060606060646762626262626262626764616262626161616460606064000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 | |
| 6464646460606064646464646464636464646464646364646464646464646464000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 | |
| 6464646464646464646464646464606064646460676067606464646464646464000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 | |
| 6464646464646464646464646464646060646460676067606464646464646464000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 | |
| 6464646464646464646464646464646460606360606060606464646464646464000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 | |
| 6464646464646464646464646464646464646460606060606464646464646464000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 | |
| 6464646464646464646464646464646464646464646364646464646464646464000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 | |
| 6464646464646464646464646464646464646464606060646464646464646464000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 | |
| 6464646464646464646464646464646464646464606060646464646464646464000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 | |
| 6464646464646464646464646464646464646464646464646464646464646464000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 | |
| 6464646464646464646464646464646464646464646464646464646464646464000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 | |
| 6464646464646464646464646464646464646464646464646464646464646464000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 | |
| 6464646464646464646464646464646464646464646464646464646464646464000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 | |
| 6464646464646464646464646464646464646464646464646464646464646464000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 | |
| 6464646464646464646464646464646464646464646464646464646464646464000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 | |
| 6464646464646464646464646464646464646464646464646464646464646464000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 | |
| 6464646464646464646464646464646464646464646464646464646464646464000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment