pico-8 cartridge // http://www.pico-8.com version 39 __lua__ -- setup modules={} real_modules={} frame=0 function _init() _doall("init") end function _update() frame+=1 if (frame%1==0) _doall("update") end function _draw() _doall("draw") end mnames={} function names(root) local n=mnames[root] if(n)return all(n) n={root.."0", root, root.."2", root.."3"} mnames[root]=n return all(n) end function _doall(x) for n in names(x) do for mod in all(modules) do local f=mod[n] if (f) f(mod) end end end -- source: https://www.lexaloffle.com/bbs/?pid=78990 gaps=split"57,23,10,4,1" --{701,301,132,57,23,10,4,1} function shellsort(a) for gap in all(gaps) do for i=gap+1,#a do local x,j=a[i],i-gap while j>=1 and a[j].key>x.key do a[j+gap]=a[j] j-=gap end a[j+gap]=x end end end function linefill(ax,ay,bx,by,r,c) if(c) color(c) local dx,dy=bx-ax,by-ay -- avoid overflow -- credits: https://www.lexaloffle.com/bbs/?tid=28999 local n,d=_mnmx(abs(dx),abs(dy)) n/=d d*=sqrt(n*n+1) if(d<0.001) return local ca,sa=dx/d,-dy/d -- polygon points local s={{0,-r},{d,-r},{d,r},{0,r}} local spans={} local function calcxy(u,v) return ax+u*ca+v*sa,ay-u*sa+v*ca end local x0,y0=calcxy(0,r) for i=1,4 do local x1,y1=calcxy(unpack(s[i])) local _x1,_y1=x1,y1 if(y0>y1) x0,y0,x1,y1=x1,y1,x0,y0 local dx=(x1-x0)/(y1-y0) if(y0<0) x0-=y0*dx y0=-1 local cy0=y0\1+1 -- sub-pix shift x0+=(cy0-y0)*dx for y=y0\1+1,min(y1\1,127) do -- open span? local span=spans[y] if (span) rectfill(x0,y,span,y) spans[y]=x0 x0+=dx end x0,y0=_x1,_y1 end end function _apply(x,ts,a) local t=deli(ts,1) for k,v in pairs(t) do if k=="update" then -- else x[k]=v end end if (t and t.update and not t.update(x,a)) add(ts,t,1) end function sgn0(x) if (x==0) return x return sgn(x) end function _mnmx(x,y) if (x>y)return y,x return x,y end function _rast( x0,y0,x1,y1 ) local dx=abs(x1-x0) local dy=abs(y1-y0) local x=x0 local y=y0 local sx=-1 local sy=-1 if (x0dy then err=dx/2.0 return function() if (done) return if (x==x1) done=true return x1,y1 local oldx,oldy=x,y err-=dy if (err<0) y+=sy err+=dx x+=sx return oldx,oldy end else err=dy/2.0 return function() if (done) return if (y==y1) done=true return x1,y1 local oldx,oldy=x,y err-=dx if (err<0) x+=sx err+=dy y+=sy return oldx,oldy end end end -->8 -- input kbd={} add(real_modules,kbd) function kbd:init() self.real=btn() self.down=0 end function kbd:update() -- figure out what keys are _really_ pressed local now_real=btn() local was_real=self.real self.real=now_real -- add keys that are really pressed -- if they weren't really pressed before -- (they may have been force- -- released by :release()) local real_pressed=(~was_real)&now_real local now_down=(self.down&now_real)|real_pressed local was_down=self.down self.down=now_down -- deduce pressed/released by changes in down local pressed=(~was_down)&now_down local released=(~now_down)&was_down self.pressed=pressed self.released=released end function kbd:btn(i) return self.down&(1<"..tostring(v).." " end return str.."}" end if type(any)=="number" then return ""..any end return "unknown" -- should never show end -->8 -- title screen title={} add(modules,title) function title:init() end blinkcol = 10 function title:draw() cls(0) -- this is right for 72x32 spr(3,28,56,9,2) print("pyrex",32,73,7) print("[nyeogmi]",62,73,7) print("kistaro",32,79,7) local lvlstr = "⬅️ "..start_level.." ➡️" print(lvlstr,50,91,1) print(lvlstr,51,90,blinkcol) end start_level = 0 max_level=15 function title:update() if time()*4\1%2==0 then blinkcol=10 else blinkcol=9 end if btnp(0) then start_level -= 1 if (start_level<0) start_level=max_level end if btnp(1) then start_level += 1 if (start_level>max_level) start_level=0 end if btnp(4) or btnp(5) then modules=real_modules _init() music(0) end end -->8 --level behaviors level={} add(real_modules,level) function level:init() level:reinit(start_level) end function level:reinit(n) self.ix=n self.todo={} self.bigx=(n%8) self.bigy=(n\8) self.next_crate_id=1 self:load_dynobjs() self:recollide() self:reanchor(true) self:spawn_exit() end function level:restart() self:reinit(self.ix) end function level:advance() self:reinit(self.ix+1) end pitpal = {[0]=1,[7]=0,[6]=1,[4]=1} function level:draw() cls(1) pal(1,0) map( self.bigx*16,self.bigy*16, 0,0,16,16, 64 -- flag 6: visible ) for _,pit in pairs(self._pits) do spr(pit.s,pit.px,pit.py) if pit.contents then pal(pitpal) palt(0,false) spr(pit.contents,pit.px,pit.py) pal() pal(1,0) end end for _,crate in pairs(self._crates) do spr(crate.s,crate.px,crate.py) end pal() end function level:busy() for _,crate in pairs(self._crates) do if (#crate.todo>0) return true end return false end function level:update() _apply(self, self.todo) local remove={} for cix,crate in pairs(self._crates) do _apply(crate, crate.todo) if #crate.todo==0 then local pit=self._pits[_mix(crate.mx,crate.my)] if pit and not pit.contents then add(remove,cix) crate.dead=true pit.contents=crate.s end end end for cix in all(remove) do self._crates[cix]=nil end if #remove>0 then self:recollide() self:reanchor(true) end end function level:load_dynobjs() self._crates={} self._pits={} for mx=0,15,1 do for my=0,15,1 do local mxy=_mix(mx,my) local px,py=mx*8,my*8 local s=self:_mget(mx,my) local def=self:_get_cratedef(s) if def then self._crates[mxy]={ s=s,def=def, id=self.next_crate_id, mx=mx,my=my, px=px,py=py, todo={} } self.next_crate_id+=1 end if s==28 then -- pit self._pits[mxy]={ s=s, mx=mx,my=my, px=px,py=py, contents=nil } end end end end function level:recollide() self._coll={} for mx=0,15 do for my=0,15 do local mxy=_mix(mx,my) self._coll[mxy]= fget(self:_mget(mx,my),7) or self._crates[mxy]!=nil end end end function level:reanchor() local anch_new={} for dxy in all{{-1,-1},{1,-1},{-1,1},{1,1}} do local dx,dy=unpack(dxy) assert(dx!=0 and dy!=0) for mx0=0,15 do for my0=0,15 do local mx1,my1=mx0+dx,my0+dy if ( self:mcoll(mx0,my0) and not self:get_crate(mx0,my0) and not self:mcoll(mx0,my1) and not self:mcoll(mx1,my0) and not self:mcoll(mx1,my1) ) then local key="GEOM"..mx0..","..my0..","..dx..","..dy anch_new[key]= { ax=max(mx0,mx1),ay=max(my0,my1),adx=-dx,ady=-dy } end end end for _,cr in pairs(self._crates) do local key="CRATE"..cr.id..","..dx..","..dy local mx0,my0=cr.mx,cr.my local mx1,my1=mx0+dx,my0+dy anch_new[key]={ ax=max(mx0,mx1),ay=max(my0,my1),adx=-dx,ady=-dy } end end local anch_old=self._anch if (anch_old==nil) anch_old={} for _,old in pairs(anch_old) do old.dropped=true end for k,new in pairs(anch_new) do local old=anch_old[k] if old then anch_new[k]=old old.ax_old,old.ay_old,old.ax,old.ay,old.adx,old.ady=old.ax,old.ay,new.ax,new.ay,new.adx,new.ady old.dropped=nil end end self._anch=anch_new self._anch_keys={} for k,_ in pairs(self._anch) do add(self._anch_keys,{key=k}) end shellsort(self._anch_keys) for point in self:anchor_points() do if point.ax_old!=nil then if (player.rope!=nil) player.rope:be_pushed_by(point,point.ax_old,point.ay_old) point.ax_old=nil point.ay_old=nil end end for point in self:anchor_points() do assert(not point.dropped) end if (player.rope!=nil) player.rope:relax() end function level:win_at(mx,my) return self._wins[_mix(mx,my)] end function level:anchor_points() keys=all(self._anch_keys) return function() local k=keys() if (k==nil) return nil return self._anch[k.key] end end function level:get_open_pit(mx,my) local pit=self._pits[_mix(mx,my)] if (pit and pit.contents==nil) return pit end function level:spawn_exit() self._wins={} local spawned=false local spawn_at=function(x,y) if (self:_mget(x,y)!=1) return assert(not spawned,x..","..y) spawned=true player:reinit(x,y) player.orientx=-1 if (x<8) player.orientx=1 end local win_at=function(x,y) if (self:_mget(x,y)!=18) return for nx=x-1,x+1 do for ny=y-1,y+1 do if nx<0 or ny<0 or nx>15 or ny>15 then self._wins[_mix(nx,ny)]=true end end end end for f in all{spawn_at,win_at} do for x=1,14 do f(x,0) f(x,15) end for y=0,15 do f(0,y) f(15,y) end end assert(spawned) end function level:mcoll(mx,my) return self._coll[_mix(mx,my)]!=false end function level:pcoll(px,py) return self:mcoll(px\8,py\8) end function level:get_crate(mx,my) return self._crates[_mix(mx,my)] end function level:_mget(mx,my) return mget( self.bigx*16+mx, self.bigy*16+my ) end function _amix(ax,ay) return ax..","..ay --if (ax<0 or ay<0 or ax>31 or ay>31) return nil --return ay*32+ax end function _mix(mx,my) return mx..","..my --if (mx<0 or my<0 or mx>15 or my>15) return nil --return my*16+mx end function level:_get_cratedef(s) if (s<64 or s>=80) return nil local s2=s-64 return { up=s2&1!=0, right=s2&2!=0, down=s2&4!=0, left=s2&8!=0 } end function level:get_latch(dx,dy,px,py) local mx,my=px\8,py\8 local mxy=_mix(mx,my) local crate=self._crates[mxy] local dx1,dy1=-sgn0(dx),-sgn0(dy) if crate then if (crate.def.up and dy>0) or (crate.def.down and dy<0) or (crate.def.left and dx>0) or (crate.def.right and dx<0) then return { el="crate", dx=dx1,dy=dy1, ax_offset=dx1*0.5, ay_offset=dy1*0.5, rec=crate } end end local m=self:_mget(mx,my) if (m==60 and dy1<0) or (m==61 and dx1>0) or (m==62 and dy1>0) or (m==63 and dx1<0) then return { el="eyehook", dx=dx1,dy=dy1, ax_offset=dx1*0.5, ay_offset=dy1*0.5, rec={mx=mx,my=my,px=mx*8,py=my*8}, } end end function level:can_move( is_player, mx0,my0,dmx,dmy,exclude_src,exclude_dst ) if is_player and self:win_at(mx0+dmx,my0+dmy) then return true end if is_player and self:get_open_pit(mx0+dmx,my0+dmy) then return wrongbleep:adequately_warned() end if self:mcoll(mx0+dmx,my0+dmy) then return false end if player.x==mx0+dmx and player.y==my0+dmy then return false end -- todo: check tongue collision if player.rope then local chk=false if dmx==0 and dmy==-1 then chk=player.rope:collide_mrect(mx0+0.4,my0-0.8,0.2,1.6,exclude_src,exclude_dst) elseif dmx==0 and dmy==1 then chk=player.rope:collide_mrect(mx0+0.4,my0+0.2,0.2,1.6,exclude_src,exclude_dst) elseif dmx==-1 and dmy==0 then chk=player.rope:collide_mrect(mx0-0.8,my0+0.4,1.6,0.2,exclude_src,exclude_dst) elseif dmx==1 and dmy==0 then chk=player.rope:collide_mrect(mx0+0.2,my0+0.4,1.6,0.2,exclude_src,exclude_dst) end if (chk) return false end return true end function level:tug_crate(mx0,my0,dmx,dmy) local mxy0=_mix(mx0,my0) local existing=self._crates[mxy0] if (existing==nil) return self._crates[mxy0]=nil local mx1,my1=mx0+dmx,my0+dmy local mxy1=_mix(mx1,my1) existing.todo={ {px=mx1*8+dmx,py=my1*8+dmy,mx=mx1,my=my1,update=function() self:recollide() self:reanchor() return true end}, {px=mx1*8,py=my1*8} } self._crates[mxy1]=existing end -->8 --player handling player={} add(real_modules,player) function player:init() --self:reinit(8,14) -- don't change this on reinit: -- it stays the same when the level is changed or reloaded self.vanish_frame=0 end function player:reinit(x,y) self.x=x self.y=y self.px=0 self.py=0 self.todo={} self.fall_frame=0 self.reset_frame=0 self.orientx=-1 self.orienty=0 self.rope=nil end function player:any_busy() if (#self.todo>0) return true if (level:busy()) return true return false end function player:update() local _addall=function(t,xs) for i in all(xs) do add(t,i) end end local f4 = function(xs) -- todo: other anim stuff xs[#xs].px=0 xs[#xs].py=0 return xs end -- this is a non-gameplay action that takes precedence over -- all gameplay actions self:_vanish_if_requested() if not self:any_busy() then if level:win_at(self.x,self.y) then level:advance() return end if level:get_open_pit(self.x,self.y) then self.todo={{update=self._fall}} return end if kbd:btn(0) then self.orientx=-1 self.orienty=0 elseif kbd:btn(1) then self.orientx=1 self.orienty=0 elseif kbd:btn(2) then self.orienty=-1 elseif kbd:btn(3) then self.orienty=1 end if kbd:btn(4) then if kbd:btnp(4) and self.rope!=nil then self.rope:destroy() kbd:release(4) end -- wait for user to release it else if kbd:btn(0) then if level:can_move(true,self.x,self.y,-1,0,0,2) then self.todo=f4({{orientx=-1,orienty=0,px=-2},{px=-7},{x=self.x-1}}) else wrongbleep:bleep() end elseif kbd:btn(1) then if level:can_move(true,self.x,self.y,1,0,0,2) then self.todo=f4({{orientx=1,orienty=0,px=2},{px=7},{x=self.x+1}}) else wrongbleep:bleep() end elseif kbd:btn(2) then if level:can_move(true,self.x,self.y,0,-1,0,2) then self.todo=f4({{orienty=-1,py=-2},{py=-7},{y=self.y-1}}) else wrongbleep:bleep() end elseif kbd:btn(3) then if level:can_move(true,self.x,self.y,0,1,0,2) then self.todo=f4({{orienty=1,py=2},{py=7},{y=self.y+1}}) else wrongbleep:bleep() end elseif self.rope==nil and kbd:btnr(4) then local dx,dy=self.orientx,self.orienty if (dy!=0) dx=0 local x,y=self.x,self.y while not level:mcoll(x,y) do x+=dx y+=dy end self.rope=rope:new( x+0.5-dx*0.5,y+0.5-dy*0.5, self.x+0.5,self.y+0.5, level:get_latch(dx,dy,x*8,y*8) ) self.todo={{ update=function() return self.rope==nil or self.rope:latched() end }} elseif kbd:btnp(5) then if self.rope!=nil then if (not self.rope:tug()) wrongbleep:bleep(9) end end end end if self.rope then self.rope:update() end _apply(self,self.todo) if self.rope then self.rope:update() if self.rope:done_reeling() then self.x=self.rope.latch.rec.mx+self.rope.latch.dx self.y=self.rope.latch.rec.my+self.rope.latch.dy end local rx=self.x+self.px/8+0.5 local ry=self.y+self.py/8+0.5 -- do the hokey pokey to work out kinks in the rope self.rope:drag_dst(rx,ry) local tdx,tdy=self.rope:tug_orientxy() if (tdx!=0) self.orientx=tdx if (tdy!=0) self.orienty=tdy if self.rope:done() then self.rope=nil end end end function player:_vanish_if_requested() if kbd:btn(5) then self.vanish_frame+=1 if (self.fall_frame>0 or self.vanish_frame>20) then self.rope=nil level:restart() kbd:release(5) self.vanish_frame=20 end else self.vanish_frame-=1 end self.vanish_frame=max(self.vanish_frame,0) end function player:_fall() if (self.fall_frame<10) self.fall_frame+=1 end function player:draw() local px=self.x*8+self.px+wrongbleep:vibrate() local py=self.y*8+self.py+wrongbleep:vibrate() local head=1-self.orienty local vanish_level=max((self.vanish_frame-4)/16,0) local invis_level=max(self.fall_frame/10,4*(vanish_level-0.75)) if (invis_level>=1.0) return --px+=sin(vanish_level*16)*max(vanish_level-0.1,0)*1 local HEAD=14--3 local BODY=12--12 local TAIL=14--14 local IRIS=7--9 local PUPIL=0--0 local setpal=function() -- base colors pal{ [2]=HEAD, [3]=HEAD, [4]=BODY, [5]=BODY, [9]=IRIS, [10]=PUPIL, [12]=BODY, [13]=TAIL, [14]=TAIL, [15]=TAIL, } -- vanish colors local vanish=split"13,15,14,5,4,12,2,3,9,10" for i,ilc in ipairs(vanish) do if (vanish_level>i/#vanish) pal(ilc,1) end if self.fall_frame>3 then local zc=@0x5f00&0xf0 for i=0x5f00,0x5f0c,4 do poke4(i,0x0101.0101) end poke(0x5f00,zc|0x01) end end local rx,ry=self.x*8+self.px+1,self.y*8+self.py+2 if (self.orientx==1) rx+=6 if self.rope then local rx_adj,ry_adj=self.rope:affected_src_xy(rx,ry) if rx_adj!=nil then local drx,dry=rx_adj-rx,ry_adj-ry rx,ry=rx+drx,ry+dry px,py=px+drx,py+dry end end if self.orientx==-1 then setpal() spr(16,px+6,py-2,1,1) spr(17,px+1,py,1,1) if (self.rope and invis_level<=0.25) pal() self.rope:draw(self.x*8+self.px+1,self.y*8+self.py+2) setpal() spr(head,px-3,py-3,1,1) else setpal() spr(16,px-6,py-2,1,1,true) spr(17,px-1,py,1,1,true) if (self.rope and invis_level<=0.25) pal() self.rope:draw(self.x*8+self.px+7,self.y*8+self.py+2) setpal() spr(head,px+3,py-3,1,1,true) end pal() end -->8 -- rope physics rope={} rope.__index=rope function rope:new( src_ax,src_ay,dst_ax,dst_ay,latch ) local r={ id=0, anchors={ {ax=src_ax,ay=src_ay,prev=nil,next=nil}, {ax=dst_ax,ay=dst_ay,prev=nil,next=nil} }, state={name="cast",frame=0}, latch=latch, } r.src=r.anchors[1] r.dst=r.anchors[2] r.src.next=r.dst r.dst.prev=r.src setmetatable(r,rope) return r end function rope:latched() return self.state.name=="latched" end function rope:done() return self.state.name=="done" end function rope:done_reeling() return self.state.name=="done" and self.state.reelin end function rope:update() if self.state.name=="cast" then self.state.frame+=1 if (self.state.frame>=3) self.state={name="latched"} elseif self.state.name=="latched" then if (self.latch==nil) wrongbleep:bleep(5) self:destroy() return if self.latch!=nil and self.latch.rec!=nil then self:drag_src( self.latch.rec.mx+0.5+self.latch.ax_offset, self.latch.rec.my+0.5+self.latch.ay_offset ) if self.latch.rec.dead==true then self:destroy() end end if (not self:_check_sane()) self:destroy() elseif self.state.name=="destroy" then -- destroy self.state.frame+=1 if (self.state.frame>=5) self.state={name="done",reelin=self.state.reelin} else -- done state end end function rope:destroy(reelin) if (self.state.name=="destroy" or self.state.name=="done") return self.state={name="destroy",frame=0,reelin=reelin} end function rope:affected_src_xy(artificial_px,artificial_py) -- this is the loop from :draw but simplified if (not self.state.reelin) return perc_to_show=(1.0-self.state.frame/8)^2 local points=self:_anchors_simplified() points[#points]={x=artificial_px,y=artificial_py} local len=0 for i=1,#points-1 do len+=distance(points[i],points[i+1]) end local len_to_show=perc_to_show*len local len_cumulative=0 for i=1,#points-1 do local src=points[i] local dst=points[i+1] local x,y=dst.x,dst.y local dx,dy=src.x-x,src.y-y local len_here=len_to_show-len_cumulative local dist_base=distance_dxy(dx,dy) len_cumulative+=dist_base if len_here>0 and dist_base>0 then local coef=min(len_here/dist_base,1.0) return x+dx-dx*coef,y+dy-dy*coef end end return points[1] end function rope:draw(artificial_px,artificial_py) local points,highlight=self:_tug(true) if (self.state.name=="done") return local perc_to_show=1.0 local from_end=false if (self.state.name=="cast") perc_to_show=self.state.frame/2 if (self.state.name=="destroy") perc_to_show=(1.0-self.state.frame/8)^2 if (self.state.reelin) from_end=true points[#points]={x=artificial_px,y=artificial_py} local len=0 for i=1,#points-1 do len+=distance(points[i],points[i+1]) end local len_to_show=perc_to_show*len local len_cumulative=0 local ia,iz,istep=#points-1,1,-1 if (from_end) ia,iz,istep=1,#points-1,1 for i=ia,iz,istep do local src=points[i] local dst=points[i+1] local x,y=dst.x,dst.y local dx,dy=src.x-x,src.y-y local len_here=len_to_show-len_cumulative local dist_base=distance_dxy(dx,dy) len_cumulative+=dist_base if len_here>0 and dist_base>0 then local coef=min(len_here/dist_base,1.0) if from_end then x,y=x+dx-dx*coef,y+dy-dy*coef dx,dy=dx*coef,dy*coef else dx,dy=dx*coef,dy*coef end local color=8 if (highlight==i) color=12 linefill(x,y,x+0.25*dx,y+0.25*dy,1.0,color) linefill(x+0.25*dx,y+0.25*dy,x+1*dx,y+1*dy,0.5,color) linefill(x+0.9*dx,y+0.9*dy,x+dx,y+dy,1.0,color) circfill(x+dx+0.5,y+dy+0.5,1.0,color) end end -- draw latch if self.latch!=nil and self.latch.rec and (perc_to_show>=1.0 or from_end) then local x,y=self.latch.rec.px,self.latch.rec.py local ldx,ldy=self.latch.dx,self.latch.dy local color=8 if (highlight==0) color=12 if self.latch.dx==-1 and self.latch.dy==0 then rectfill(x,y+3,x+2,y+4,color) elseif self.latch.dx==1 and self.latch.dy==0 then rectfill(x+5,y+3,x+7,y+4,color) elseif self.latch.dx==0 and self.latch.dy==-1 then rectfill(x+3,y,x+4,y+2,color) elseif self.latch.dx==0 and self.latch.dy==1 then rectfill(x+3,y+5,x+4,y+7,color) end end -- debug local n1=self.src local sy=0 while true do if (n1==nil) break local x=n1.ax*8 local y=n1.ay*8 if n1.associated_with then if (n1.associated_with.adx>0) x-=1 if (n1.associated_with.ady>0) y-=1 end rectfill(x-1,y-1,x+1,y+1,12) print("ax="..n1.ax..",ay="..n1.ay,0,sy) sy+=7 local n0=n1.prev local n2=n1.next if n0!=nil and n2!=nil then if n1.associated_with then local _,_,_,adx,ady=would_stick(n0.ax,n0.ay,n1.associated_with,n2.ax,n2.ay) assert(adx==-1 or adx==0 or adx==1) assert(ady==-1 or ady==0 or ady==1) --assert(not (adx==0 and ady==0)) local c=3 if (n1.associated_with.dropped) c=4 rectfill(x+2,y+2,x+4,y+4,c) pset(x+adx*2,y,9) pset(x,y+ady*2,9) else rectfill(x+2,y+2,x+4,y+4,2) end else rectfill(x+2,y+2,x+4,y+4,4) end n1=n1.next end for _,p in pairs(level._anch) do local x,y=p.ax*8,p.ay*8 if (p.adx>0) x-=1 if (p.ady>0) y-=1 pset(x,y,11) pset(x+p.adx,y,11) pset(x,y+p.ady,11) end end function rope:drag_dst(x,y) self:drag(self.dst,x,y) end function rope:drag_src(x,y) self:drag(self.src,x,y) end function rope:drag(n1,ax_new,ay_new) self:relax() self:_drag(n1,ax_new,n1.ay) self:_drag(n1,ax_new,ay_new) self:relax() end function rope:relax() local n0=self.src while true do local n1=n0.next if (n1==nil) break local n2=n1.next if n0.ax==n1.ax and n0.ay==n1.ay then n0.next=n2 if (n2!=nil) n2.prev=n0 else n0=n0.next end end local n0=self.src while true do if (n0==nil) return local n1=n0.next if (n1==nil) return local n2=n1.next if (n2==nil) return if n1.associated_with!=nil then local x0,y0=n0.ax,n0.ay local x1,y1=n1.ax,n1.ay local x2,y2=n2.ax,n2.ay if x1!=n1.associated_with.ax or y1!=n1.associated_with.ay then -- printh("dragging home: "..tostring{n1.ax,n1.ay}.."->"..tostring(n1.associated_with)) self:_drag(n1,n1.associated_with.ax,n1.associated_with.ay) end local would,x1_new,y1_new=would_stick(x0,y0,n1.associated_with,x2,y2) if not would and not (n1.ax==x1_new and n1.ay==y1_new) then -- printh("relaxing: "..tostring(n0.associated_with).."->"..tostring(n1.associated_with).."->"..tostring(n2.associated_with)) self:_drag(n1,x1_new,y1_new) n0=n1.prev n2=n1.next n0.next=n2 n2.prev=n0 n1.next=nil n1.prev=nil else n0=n0.next end else n0=n0.next end end end function rope:_check_sane() if (not self:latched()) return true if (level:busy()) return true local n0=self.src local qxs,qys={},{} while true do local n1=n0.next if (n1==nil) break for qx,qy in _rast(flr(n0.ax*2),flr(n0.ay*2),flr(n1.ax*2),flr(n1.ay*2)) do if not (qx==qxs[#qxs] and qy==qys[#qys]) then add(qxs,qx) add(qys,qy) end end n0=n1 end local function _possible_tiles(qx,qy) local mx0=(qx-1)\2 local mx1=qx\2 local my0=(qy-1)\2 local my1=qy\2 local poss={} for mx=mx0,mx1 do for my=my0,my1 do add(poss,{mx=mx,my=my}) end end return poss end local function _blocked(qx,qy) for i in all(_possible_tiles(qx,qy)) do if (not level:mcoll(i.mx,i.my)) return false end return true end -- find cases where i move through an impassable zone for i=1,#qxs do if (_blocked(qxs[i],qys[i])) return false end -- find cases where i am cut off diagonally for i=3,#qxs do local qx1,qy1=qxs[i-1],qys[i-1] if qx1%2==0 and qy1%2==0 then local ok=false for m0 in all(_possible_tiles(qxs[i-2],qys[i-2])) do for m2 in all(_possible_tiles(qxs[i],qys[i])) do local mx0,my0=m0.mx,m0.my local mx2,my2=m2.mx,m2.my if not (level:mcoll(mx0,my0) or level:mcoll(mx2,my2)) then local dmx,dmy=abs(mx2-mx0),abs(my2-my0) if dmx==1 and dmy==1 and level:mcoll(mx0,my2) and level:mcoll(mx2,my0) then else --printh("ok! "..tostring({qxs[i-2],qys[i-2]})..tostring({qxs[i],qys[i]})..tostring(m0)..tostring(m2)) ok=true end end end end if (not ok) return false end end return true end function would_stick(x0,y0,anchor,x2,y2) local x1,y1=anchor.ax,anchor.ay local dx=x2-x0 local dy=y2-y0 -- there is no reason for an acute angle to stick around in this world --[[ local ang0=atan2(x2-x1,y2-y1) local ang2=atan2(x0-x1,y0-y1) local diff=abs((ang0-ang2 + 0.5)%1-0.5) if (diff<0.25) return false,x0,y0,0,0 ]]-- local adx,ady local x1_new,y1_new if abs(dx)>abs(dy) then if (x0>x2) dx,x0,y0,x2,y2=-dx,x2,y2,x0,y0 local dprop=(x1-x0)/dx x1_new,y1_new=x1,y0+dprop*(y2-y0) ady=sgn0(y1_new-y1) adx=0 if (y0>y2) adx=ady if (y0y2) dy,x0,y0,x2,y2=-dy,x2,y2,x0,y0 local dprop=(y1-y0)/dy x1_new,y1_new=x0+dprop*(x2-x0),y1 adx=sgn0(x1_new-x1) ady=0 if (x0>x2) ady=adx if (x0"..tostring(n05.associated_with).."->"..tostring(n1.associated_with)) else n0=n0.next end end end function rope:_drag(n1,ax1_new,ay1_new) local function _sweep_radar(ax_pivot,ay_pivot,ax_far0,ay_far0,ax_far1,ay_far1) if (ax_far0==ax_far1 and ay_far0==ay_far1) return nil if ax_far0==ax_far1 then local ax_far=ax_far0 local ax0,ax1=_mnmx(ax_pivot,ax_far) ay_far_old=ay_far0 for ay_far_new in _stepfrom(ay_far0,ay_far1) do for anchor in level:anchor_points() do if not (anchor.ax==ax_pivot and anchor.ay==ay_pivot) and -- not (anchor.ax==ax_far0 and anchor.ay==ay_far0) and not (anchor.ax==ax_far1 and anchor.ay==ay_far1) and (ax0<=anchor.ax and anchor.ax<=ax1) and would_stick(ax_pivot,ay_pivot,anchor,ax_far,ay_far_new) and ( _which_side(anchor.ax,anchor.ay,ax_pivot,ay_pivot,ax_far,ay_far_old) != _which_side(anchor.ax,anchor.ay,ax_pivot,ay_pivot,ax_far,ay_far_new) ) then return anchor end end ay_far_old=ay_far_new end elseif ay_far0==ay_far1 then local ay_far=ay_far0 local ay0,ay1=_mnmx(ay_pivot,ay_far) ax_far_old=ax_far0 for ax_far_new in _stepfrom(ax_far0,ax_far1) do for anchor in level:anchor_points() do if not (anchor.ax==ax_pivot and anchor.ay==ay_pivot) and -- not (anchor.ax==ax_far0 and anchor.ay==ay_far0) and not (anchor.ax==ax_far1 and anchor.ay==ay_far1) and would_stick(ax_pivot,ay_pivot,anchor,ax_far_new,ay_far) and (ay0<=anchor.ay and anchor.ay<=ay1) and ( _which_side(anchor.ax,anchor.ay,ax_pivot,ay_pivot,ax_far_old,ay_far) != _which_side(anchor.ax,anchor.ay,ax_pivot,ay_pivot,ax_far_new,ay_far) ) then return anchor end end ax_far_old=ax_far_new end end end local ax1_old,ay1_old=n1.ax,n1.ay n1.ax=ax1_new n1.ay=ay1_new local n0=n1.prev while true do if (n0==nil) break local anch=_sweep_radar(n0.ax,n0.ay,ax1_old,ay1_old,ax1_new,ay1_new) if (anch==nil) break local n05={ax=anch.ax,ay=anch.ay,associated_with=anch,prev=n0,next=n1} -- printh("creating pre: "..tostring(n0.associated_with).."->"..tostring(n05.associated_with).."->"..tostring(n1.associated_with)) n0.next=n05 n1.prev=n05 n0=n05 end local n2=n1.next while true do if (n2==nil) break local anch=_sweep_radar(n2.ax,n2.ay,ax1_old,ay1_old,ax1_new,ay1_new) if (anch==nil) break local n15={ax=anch.ax,ay=anch.ay,associated_with=anch,prev=n1,next=n2} -- printh("creating post: "..tostring(n1.associated_with).."->"..tostring(n15.associated_with).."->"..tostring(n2.associated_with)) n1.next=n15 n2.prev=n15 n2=n15 end end function _stepfrom(x0,x1) local done=false if x0==x1 then return function() if (done) return nil done=true return x0 end end local mul=0.5 x0*=2 x1*=2 if (x0>x1) x0,x1,mul=-x0,-x1,-mul local i=flr(x0) local top=flr(x1) return function() if (done) return nil i+=1 if i>top then done = true if (x1!=flr(x1)) return mul*x1 return nil end return mul*i end end function _which_side(x,y,x0,y0,x1,y1) return sgn0((x1-x0)*(y-y0) - (y1-y0)*(x-x0)) end function distance_dxy(dx,dy) return sqrt(dx*dx+dy*dy) end function distance(p1,p2) local dx=p2.x-p1.x local dy=p2.y-p1.y return sqrt(dx*dx+dy*dy) end function rope:collide_mrect(mx0,my0,mw,mh,exclude_src,exclude_dst) local mx1,my1=mx0+mw,my0+mh local n0=self.src while true do local n1=n0.next if (n1==nil) return false local nd=n0 for i=1,exclude_dst do nd=nd.next if (nd==nil) return false end local x1,y1,x2,y2=n0.ax,n0.ay,n1.ax,n1.ay local function _line_line(x3,y3,x4,y4) local denom=((y4-y3)*(x2-x1)-(x4-x3)*(y2-y1)) local ua= ((x4-x3)*(y1-y3)-(y4-y3)*(x1-x3))/denom if (ua<0 or ua>1) return false local ub= ((x2-x1)*(y1-y3)-(y2-y1)*(x1-x3))/denom if (ub<0 or ub>1) return false return true end if exclude_src<=0 then if (_line_line(mx0,my0,mx1,my0) or _line_line(mx0,my0,mx0,my1) or _line_line(mx0,my1,mx1,my1) or _line_line(mx1,my0,mx1,my1)) return true end exclude_src-=1 n0=n1 end end -->8 -- moved here because it's complicated function rope:tug_orientxy() local a1=self.dst local a0=self.dst.prev local dx=a0.ax-a1.ax local tdx=0 if (dx>3/8) tdx=1 if (dx<-3/8) tdx=-1 local dy=a0.ay-a1.ay local tdy=0 if abs(dy)>abs(dx)/2 then if (dy>3/8) tdy=1 if (dy<-3/8) tdy=-1 end return tdx,tdy end function rope:tug() if (not self:latched()) return return self:_tug() end function rope:_tug(hypothetically) local ancs=self:_anchors_simplified() local touched={} for i=#ancs-1,2,-1 do local ops_before_trash=self:_calc_push(ancs[i+1],ancs[i],ancs[i-1],ancs[i-2]) local ops_to_do,corners={} if #ops_before_trash>0 then ops_to_do=ops_before_trash else local ops_after_trash=self:_calc_push(ancs[i-2],ancs[i-1],ancs[i],ancs[i+1]) ops_to_do=ops_after_trash end local ops=ops_to_do if #ops>0 then if (hypothetically) return ancs,i-1 local dmx,dmy=ops[1].dmx,ops[1].dmy for o in all(ops) do level:tug_crate(o.mx,o.my,o.dmx,o.dmy) end return true end end local latch=self.latch if latch!=nil and latch.el=="eyehook" then if (hypothetically) return ancs,0 player.todo={{ update=function(s) if s.rope==nil or s.rope:done() then return true end end }} self:destroy(true) return true end if latch!=nil and latch.el=="crate" then local dmx,dmy= sgn0(latch.dx), sgn0(latch.dy) local obj_anc=ancs[1] local pull_anc=ancs[2] local pull_dx=pull_anc.x-obj_anc.x local pull_dy=pull_anc.y-obj_anc.y local mx0=latch.rec.mx local my0=latch.rec.my local mxa=(pull_anc.x+dmx)\8 local mya=(pull_anc.y+dmy)\8 local invalid_move=false if (dmx!=0 and sgn0(pull_dx)!=dmx) or (dmy!=0 and sgn0(pull_dy)!=dmy) or sgn0(mx0-mxa)!= sgn0(mx0+dmx-mxa) or sgn0(my0-mya)!= sgn0(my0+dmy-mya) then invalid_move=true end if not invalid_move and level:can_move(false,mx0,my0,dmx,dmy,1,0) then if (hypothetically) return ancs,0 level:tug_crate(mx0,my0,dmx,dmy) return true end end if (hypothetically) return ancs,nil return false end function rope:_calc_push( an,a0,a1,af ) local ops={} if (an==nil) return ops if a0.x==a1.x then -- no far side applying pressure? local y0,y1=_mnmx(a0.y,a1.y) local my0,my1,smy=(y0+1)\8,(y1-1)\8,1 if a0.y>a1.y then my0,my1=my1,my0 smy=-smy end local mx,dmx if a0.x%8==0 and a0.x>an.x+7 then -- push left mx=(a0.x-1)\8 dmx=-1 elseif a0.x%8==7 and a0.xa1.x then mx0,mx1=mx1,mx0 smx=-smx end local my,dmy if a0.y%8==0 and a0.y>an.y+6 then -- push up my=(a0.y-1)\8 dmy=-1 elseif a0.y%8==7 and a0.y8 --wrongbleeps wrongbleep={} add(real_modules,wrongbleep) function wrongbleep:init() self.duration=0 self.continuous=0 end function wrongbleep:update() if (self.duration>5) self.duration=5 if self.duration>0 then sfx(63,3) self.continuous+=1 else self.continuous=0 end self.duration=max(self.duration-1,-4) end function wrongbleep:bleep(duration) self.duration+=duration or 2 end function wrongbleep:vibrate(duration) if (self.continuous<10) return 0 return (rnd()*2-1)*min(self.continuous/10,2) end function wrongbleep:adequately_warned(duration) return self.continuous>45 end -->8 -- text level_text={by_lvl={}} add(real_modules,level_text) level_text_raw={ "9`9`11`\f7\#0press 🅾️ to mlem & unmlem", "9`33`17`\f7\#0❎ to yoink" } function level_text:init() for i=0,32 do level_text.by_lvl[i]={} end for row in all(level_text_raw) do if row then lvlxys=split(row,"`") add(level_text.by_lvl[lvlxys[1]],lvlxys) end end end function level_text:draw() for xys in all(level_text.by_lvl[level.ix]) do print(xys[4],xys[2],xys[3],6) end end __gfx__ 000030000000002200003000000cc0cc0cccccccccccccccccccccccccccccccc0bb0000000000000000000000000000dddddddd000000000005000000000000 003333300000332200333330000cc0cc0000cc0000000000000000000cc0000000bb0bb0bbbb0bbbbb0bbbbb0bbb0000dddddddd000000000000500000000000 099333990039932009333339000cc0cc0cc0cc0cc0cccccccc0ccccc0cc0ccccc0bb0bb000bb0000bb0bb0bb0bb0b000dddddddd000000000000000000000000 09a333a9033a932009333339000cc0cc0cc0cc0cc0cc0cc0cc0000cc0cc0cc0cc0bb0bb0bb000bbbbb0bbb000bb0b000dddddddd000000005005005000000000 023333323333320000222220000cc0cc0cc0cc0cc0cc0cc0cc0ccccc0cc0ccccc0bb0bb0bbbb0bbbbb0bb0bb0bbbb000dddddddd000000000500500500000000 002222200000220000222220000cc0cc0cc0000cc0cc0cc0cc0cc0cc0cc0cc0000bb0000000000000000000000000000dddddddd000000000000000000000000 000222c002222c0000022200000ccccc0ccccc0cc0cc0cc0cc0ccccc0cc0ccccc0bbbbbbbbbbbbbbbbbbbbbbbbbbb000dddddddd000000000005000000000000 00000cc00000cc0000000cc0000000000000000000000000000000000000000000000000000000000000000000000000dddddddd000000000000500000000000 0000ff00000000000000000088888888888888888888880aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa11111111000000000000000000000000 000f00f0000000000aa00aa00088000000088000000000000000000000000aa00000000000000000aa0000000000000011111111000000000000000000000000 00d0000f000000000aaaaaa000880888880880888880880aaa00aaa0aaaa0aa0aaaaa0aa0a0aaaa0aa0aa0aaaaa0aaa011111111000000000000000000000000 00d0d00f00c040500aaaaaa000880880880880000880880aa0a0aa00aa000aa0aa0aa0aa0a0aa000aa0aa0aa0aa0aa0a11111111000000000000000000000000 00dd00ee00c445500099990000880880880880888880880aa0a0aa0000aa0aa0aaa000aa0a0aa000aa0aa0aa0aa0aa0a11111111000000000000000000000000 00000ee00c44455500aaaa0000880880880880880880880aaaa0aaa0aaaa0aa0aa0aa0aaaa0aaaa0aa0aa0aaaaa0aa0a11111111000000000000000000000000 00eeee000c004005000aa00000880888880880888880880000000000000000000000000000000000000000000000000011111111000000000000000000000000 eeee0000cc0440550044440000000000000000000000888888800000000000000000000000000000000000000000000011111111000000000000000000000000 00000000000a90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000aaaaaaa91000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0000aaaaaa1a91100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0aaaaaaaaa1a91110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0aaaaaaaa41a91a10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0a000aa4441a91a10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00a0044449a110a10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000aa111991111100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000009910000000000000000000000000000000000000000000000000000000000000000000000000000000000000ddd00ddddddddddddddddddddddddddd 000000009900000000000000000000000000000000000000000000000000000000000000000000000000000000000000ddd00ddddddddddddddddddddddddddd 000000009900000000000000000000000000000000000000000000000000000000000000000000000000000000000000ddd77ddddddddddddddddddddddddddd 000000000900000000000000000000000000000000000000000000000000000000000000000000000000000000000000ddd00dddddd00700ddd00ddd00700ddd 00000000aa00000000000000000000000000000000000000000000000000000000000000000000000000000000000000ddd00dddddd00700ddd00ddd00700ddd 0000000077a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000ddddddddddddddddddd77ddddddddddd 00000007777a000000000000000000000000000000000000000000000000000000000000000000000000000000000000ddddddddddddddddddd00ddddddddddd 000444444444440000000000000000000000000000000000000000000000000000000000000000000000000000000000ddddddddddddddddddd00ddddddddddd 44444444444004444444444444444444444444444440044444444444444004444444444444400444444444444440044444444444444004444444444444400444 47766774477007744776677447700774477667744770077447766774477007744776677447700774477667744770077447766774477007744776677447700774 47777774477777744777777447777774477777744777777447777774477777744777777447777774477777744777777447777774477777744777777447777774 46700764467007644670070046700700467007644670076446700700467007000070076400700764007007000070070000700764007007640070070000700700 46700764467007644670070046700700467007644670076446700700467007000070076400700764007007000070070000700764007007640070070000700700 47777774477777744777777447777774477777744777777447777774477777744777777447777774477777744777777447777774477777744777777447777774 47766774477667744776677447766774477007744770077447700774477007744776677447766774477667744776677447700774477007744770077447700774 44444444444444444444444444444444444004444440044444400444444004444444444444444444444444444444444444400444444004444440044444400444 __label__ 77777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777 77777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777 77777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777 77766777777667777776677777766777777667777776677777766777777667777776677777766777777667777776677777766777777667777776677777766777 77766777777667777776677777766777777667777776677777766777777667777776677777766777777667777776677777766777777667777776677777766777 77777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777 77777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777 77777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777 77777777000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000077777777 77766777000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000077766777 77766777000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000077766777 77777777000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000777777777777777700000000000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000777777777777777700000000000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000777777777777777700000000000000000000000000000000000000000000000077777777 77766777000000000000000000000000000000000000000000000000777667777776677700000000000000000000000000000000000000000000000077766777 77766777000000000000000000000000000000000000000000000000777667777776677700000000000000000000000000000000000000000000000077766777 77777777000000000000000000000000000000000000000000000000777777777777777700000000000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000777777777777777700000000000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000777777777777777700000000000000000000000000000000000000000000000077777777 77777777000000000000000077777777000000000000000000000000000000000000000000000000000000000000000077777777000000000000000077777777 77777777000000000000000077777777000000000000000000000000000000000000000000000000000000000000000077777777000000000000000077777777 77777777000000000000000077777777000000000000000000000000000000000000000000000000000000000000000077777777000000000000000077777777 77766777000000000000000077766777000000000000000000000000000000000000000000000000000000000000000077766777000000000000000077766777 77766777000000000000000077766777000000000000000000000000000000000000000000000000000000000000000077766777000000000000000077766777 77777777000000000000000077777777000000000000000000000000000000000000000000000000000000000000000077777777000000000000000077777777 77777777000000000000000077777777000000000000000000000000000000000000000000000000000000000000000077777777000000000000000077777777 77777777000000000000000077777777000000000000000000000000000000000000000000000000000000000000000077777777000000000000000077777777 77777777000000000000000000000000000000000000000077777777000000000000000077777777000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000077777777000000000000000077777777000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000077777777000000000000000077777777000000000000000000000000000000000000000077777777 77766777000000000000000000000000000000000000000077766777000000000000000077766777000000000000000000000000000000000000000077766777 77766777000000000000000000000000000000000000000077766777000000000000000077766777000000000000000000000000000000000000000077766777 77777777000000000000000000000000000000000000000077777777000000000000000077777777000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000077777777000000000000000077777777000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000077777777000000000000000077777777000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000077777777 77766777000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000077766777 77766777000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000077766777 77777777000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000077777777 77777777000000007777777700000000777777770000000000000000000000000000000000000000000000007777777700000000777777770000000077777777 77777777000000007777777700000000777777770000000000000000000000000000000000000000000000007777777700000000777777770000000077777777 77777777000000007777777700000000777777770000000000000000000000000000000000000000000000007777777700000000777777770000000077777777 77766777000000007776677700000000777667770000000000000000000000000000000000000000000000007776677700000000777667770000000077766777 77766777000000007776677700000000777667770000000000000000000000000000000000000000000000007776677700000000777667770000000077766777 77777777000000007777777700000000777777770000000000000000000000000000000000000000000000007777777700000000777777770000000077777777 77777777000000007777777700000000777777770000000000000008000000000000000080000000000000007777777700000000777777770000000077777777 77777777000000007777777700000000777777770000000000000088888888888888888888000000000000007777777700000000777777770000000077777777 77777777000000000000000000000000000000000000000000000088888877777778888888800000000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000088877777777777777788880000000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000088877777777777777708888000000000000000000000000000000000000000000077777777 77766777000000000000000000000000000000000000000000000088877667777776677700888800000000000000000000000000000000000000000077766777 77766777000000000000000000000000000000000000000000000088777667777776677700088880000000000000000000000000000000000000000077766777 77777777000000000000000000000000000000000000000000000088777777777777777700008888000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000088777777777777777700000888000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000088777777777777777700000008880000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000088777777777777777700000000888000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000088777777777777777700000000088800000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000088777777777777777700000000008880000000000000000000000000000000000077777777 77766777000000000000000000000000000000000000000000000088777667777776677700000000000888000000000000000000000000000000000077766777 77766777000000000000000000000000000000000000000000000088877667777776677700000000000088800000000000000000000000000000000077766777 77777777000000000000000000000000000000000000000000000088877777777777777700000000000008880000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000088877777777777777700000000000000888000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000088877777777777777700000000000000088800000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000088880000000000000000000000000000008880000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000088888800000000000000000000000000000888000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000088888000000000000000000000000000088800000000000000000000000000077777777 77766777000000000000000000000000000000000000000000000000000088880000000000000000000000000000888000000000000000000000000077766777 77766777000000000000000000000000000000000000000000000000000000088880000000000000000000000000888800000000000000000000000077766777 77777777000000000000000000000000000000000000000000000000000000000888880000000000000000000000088880000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000000000000008888880000000000000000000008888000000033000000000000077777777 777777770000000000000000000000000000000000000000000000000000000000000888880000000000000000000008883330003bb300000000000077777777 777777770000000077777777000000007777777700000000000000007777777777777778880000000000000077777777833b33003ab337770000000077777777 77777777000000007777777700000000777777770000000000000000777777777777777888800000000000007777777733333300331137770000000077777777 77777777000000007777777700000000777777770000000000000000777777777777777788800000000000007777777700883330711337770000000077777777 77766777000000007776677700000000777667770000000000000000777667777776677788800000000000007776677703333333733367770000000077766777 77766777000000007776677700000000777667770000000000000000777667777776677708880000000000007776677700333330333667770000000077766777 77777777000000007777777700000000777777770000000000000000777777777777777700880000000000007777777700033133311777770000000077777777 77777777000000007777777700000000777777770000000000000000777777777777777700888000000000007777777700003100317777770000000077777777 77777777000000007777777700000000777777770000000000000000777777777777777700088000000000007777777700033103317777770000000077777777 77777777000000000000000000000000000000000000000000000000000000000000000000088800000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000000000000000000000008800000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000000000000000000000008880000000000000000000000000000000000000000077777777 77766777000000000000000000000000000000000000000000000000000000000000000000000888000000000000000000000000000000000000000077766777 77766777000000000000000000000000000000000000000000000000000000000000000000000888000000000000000000000000000000000000000077766777 77777777000000000000000000000000000000000000000000000000000000000000000000000888800000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000000000000000000000000088800000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000000000000000000000000088880000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000077777777000000000000000077777778880000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000077777777000000000000000077777778880000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000077777777000000000000000077777778800000000000000000000000000000000000000077777777 77766777000000000000000000000000000000000000000077766777000000000000000077766778800000000000000000000000000000000000000077766777 77766777000000000000000000000000000000000000000077766777000000000000000077766778800000000000000000000000000000000000000077766777 77777777000000000000000000000000000000000000000077777777000000000000000077777778800000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000077777777000000000000000077777778880000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000077777777000000000000000077777778880000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000777777777777777700000088880000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000777777777777777700000888800000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000777777777777777700008888000000000000000000000000000000000000000077777777 77766777000000000000000000000000000000000000000000000000777667777776677700088800000000000000000000000000000000000000000077766777 77766777000000000000000000000000000000000000000000000000777667777776677700880000000000000000000000000000000000000000000077766777 77777777000000000000000000000000000000000000000000000000777777777777777708800000000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000777777777777777788000000000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000777777777777778880000000000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000000000000000888800000000000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000000000000008888000000000000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000000000000008880000000000000000000000000000000000000000000000000077777777 77766777000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000077766777 77766777000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000077766777 77777777000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000077777777 77777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777 77777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777 77777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777 77766777777667777776677777766777777667777776677777766777777667777776677777766777777667777776677777766777777667777776677777766777 77766777777667777776677777766777777667777776677777766777777667777776677777766777777667777776677777766777777667777776677777766777 77777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777 77777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777 77777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777 __gff__ 000000000808080808080808c00000000000000008080808080808080000000040400000080808080808080800000000404000000808080808080808c0c0c0c000000000080808080808080800000000000000000808080808080808000000000000000008080808080808080000000000000000080808080808080800000000 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 __map__ 0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c00000000000000000000000000000c0c00000000000000000000000000000c0e0000000000000000000000000000000e0000000000000000000000000000000e0000000000000000000000000000000e0000000000000000000000000000000e000000000000000000000000000000 0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c00000000000000000000000000000c0c0000000000000c001c1c000c0c000c0e0000000000000000000000000000000e0000000000000000000000000000000e0000000000000000000000000000000e0000000000000000000000000000000e000000000000000000000000000000 0c000000000044000c0c0c0c0c0c0c0c0c00000000000000000000000000000c0c0000000000000000000000000c000c0e0000000000000000000000000000000e0000000000000000000000000000000e0000000000000000000000000000000e0000000000000000000000000000000e000000000000000000000000000000 0c0000000000000000000000000000000c00000000000000000000000000000c0c00004f0c0c0000000c000000001c120e00000000000e0e0e0e0000000000000e000000000e000000000000000000000e0000000000000000000000000000000e0000000000000000000000000000000e000000000000000000000000000000 3d1c000000001c0000000000000000000000000000000000000000000000000c3d000c000c0c0000003f0c0c0000000c0e00000000000000000e0000000000000e000000000e000e00000000000000000e0000000000000000000000000000000e0000000000000e0e000000000000000e00000000000e0e0e0e000000000000 0c0000000000000000000000000000410000000000000000000000000000000c0c000c0000000000000000000000000c0e00000000000000000e0000000000000e000000000e000e00000000000000000e00000000000e0e0e000000000000000e00000000000e0000000000000000000e00000000000000000e000000000000 0c000000000000000c0c0c0c0c0c0c0c0c00000000000020210000000000000c01000c0c00000000000c0c004f00000c0e0000000000000e0e0e0000000000000e000000000e0e0e0e0e0000000000000e00000000000e0000000000000000000e00000000000e0e0e000000000000000e000000000000000e00000000000000 0c0c0c0c0c0c00000000000c0c0c0c0c0c00000000000030310000000000000c0c0000000000000c00000c000000000c0e00000000000000000e0000000000000e0000000000000e00000000000000000e00000000000e0e0e000000000000000e00000000000e00000e0000000000000e0000000000000e0000000000000000 0c00000000000c0c004f000c0c0c0c0c0c00000000000000000000000000000c0c00004f0000000c0c000c0000000c0c0e00000000000e0e0e0e0000000000000e0000000000000e00000000000000000e000000000000000e000000000000000e0000000000000e0e000000000000000e0000000000000e0000000000000000 0c00000c4f00000000000000000000120100000000000000000000000000000c0c00000000000000000000000000000c0e0000000000000000000000000000000e0000000000000e00000000000000000e00000000000e0e0e000000000000000e0000000000000000000000000000000e000000000000000000000000000000 3d0000000000003f0c000c0c0c0c0c0c0c00000000000000000000000000000c0c00000c00000000000000000000000c0e0000000000000000000000000000000e0000000000000000000000000000000e0000000000000000000000000000000e0000000000000000000000000000000e000000000000000000000000000000 0c0000000000000000000c0c0c0c0c0c0c00000000000000000000000000000c0c000c0c0c0000000c0c0c004f00000c0e0000000000000000000000000000000e0000000000000000000000000000000e0000000000000000000000000000000e0000000000000000000000000000000e000000000000000000000000000000 010000000000000c0c0c0c0c0c0c0c0c0c00000000000000000000000000000c0c00000c00000000000000000000000c0e0000000000000000000000000000000e0000000000000000000000000000000e0000000000000000000000000000000e0000000000000000000000000000000e000000000000000000000000000000 0c0c0c0c00000c0c0c0c0c0c0c0c0c0c0c00000000000000000000000000000c0c00000000001c00000000000000000c0e0000000000000000000000000000000e0000000000000000000000000000000e0000000000000000000000000000000e0000000000000000000000000000000e000000000000000000000000000000 0c0c0c0c00410c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0e0000000000000000000000000000000e0000000000000000000000000000000e0000000000000000000000000000000e0000000000000000000000000000000e000000000000000000000000000000 0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0c00000000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0e0000000000000000000000000000000e000000000000000000000000000000 0c004f000000000c001c1c000c0c000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0c0c0c00000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c3e0c0c0c0c0c0e0000000000000000000000000000000e000000000000000000000000000000 0c0000000000000000000000000c000c0c00000000000000000c00000000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c000000000000000000000c0c0c0c0c0c0000000000000000000c000000000c0c000000000000000000001c0000000c0e000000000e000000000000000000000e000000000000000000000000000000 0c0000000c0c0000000c000000001c120100000000000000004f000000000012010000000000001c004f0000000000120100000000000000004f1c000000001201000000000000000047000000000012010000000000000000401c00000000120e000000000e0000000e0000000000000e000000000e00000e0e0e0000000000 0c000c000c0c0000000c0c0c0000000c0c00000000000000000c00000000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c000000000000000000000c0c0c0c0c0c0000000000000000000c000000000c0c000000000000000000001c0000000c0e000000000e0000000e000e000000000e000000000e00000e00000000000000 0c000c0000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0c0c0c00000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c3c0c0c0c0c0c0e000000000e0000000e0e0e0e0000000e000000000e00000e0e0e0000000000 01000c0c00000000000c0c004f00000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0e000000000e00000000000e000000000e000000000e000000000e0000000000 0c0000000000000c00000c000000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0e000000000e00000000000e000000000e000000000e000000000e0000000000 0c00004f0000000c0c000c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0e0000000000000000000000000000000e000000000e00000e0e0e0000000000 0c00000000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0e0000000000000000000000000000000e000000000000000000000000000000 0c00000c00000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0e0000000000000000000000000000000e000000000000000000000000000000 0c000c0c0c0000000c0c0c004f00000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0e0000000000000000000000000000000e000000000000000000000000000000 0c00000c00000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0e0000000000000000000000000000000e000000000000000000000000000000 0c00000000001c00000000000000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0e0000000000000000000000000000000e000000000000000000000000000000 0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e __sfx__ 01280000050550c05511055180551d05500000000000000000055070550c0550f055130550f0550c0550705501055080550d055140551905500000000000000000055070550f0551305518055130550f0550c055 0128000000000000001f0001f055200551f0551d055180551b055000000000000000000000000000000000000000000000000001b0551d0551b05519055140551805500000000000000000000000000000000000 01280000050550c05511055180551d05518055110550d0550c055130551b055240552b0551b05518055130550a055110551a05522055290550e0550a05505055000550705510055180551f055100550c05507055 012800000000000000130001f055220552005500000270551f0550000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 012800001d4521d452050550c05514055110551f452204522445224452050550c055140551105526452264522745227452080550f055180551405526452244522245222452030550a0551f4521f4521b4521b452 012800001d4521d4520105508055110550d0551f452204522445224452050550c055140551105526452264522745227452070550e0551f4521f4522645226452244522445200055070550f0520f0550e0550c055 00280000000000000000000000000505500000050550c055000000000000000050050505500000050550c055000000000000000000000805500000080550f05500000000000000000000030550a0550205509055 012800000122401222000000000001055000000105508055052220522200000000000505500000050550c05507222072220000000000022220222202222022220022200222000000000000055070550005507055 012800001d3541f3542035420300203040000027354273501f350000001d3001d3541b354000001f354000001d3541f3542035422354243542635027354293502b3540000024354000002935429350293502b350 012800000000000000010550805501055080050105508055000550800000000070550005507055000550705500000000000105508055010550805501055080550005500000070550000000055000000705500000 01280010183541a3541b3540000000000000002235400000213540000026354000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 01281000080050f005080550f05501055000000f055000000e3550000013355000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 010300000015000250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 __music__ 01 00014344 00 02034344 00 04064344 00 05074344 00 08094344 02 0a0b4344