Kistaro Windrider
7c1b12e9ac
Debug mouse is now its own module, so it can be separated from the hint system, since it is useful for more than just positioning hints. It now has the following enhancements: 1. Clock-based table cyclng now has a helper function (cycle) 2. Debug mouse color cycling is distinct from hint color cycling, so debug position readout remains legible 3. Debug position readout now stays on screen even when the cursor is near or past the edges 4. Debug cursor cycles between a mouse sprite specifically marking the exact pixel that is being sampled, an "X" for text character sizing, and a "□" for positioning the centered 3x3 characters often used as hint target markers 5. Map cell coordinates (in square brackets) are displayed in addition to pixel coordnates (in parentheses) Sprite 50 is now the mouse cursor. Color 15 is color cycling for debug readouts. Debug mouse features can be disabled by commenting out `add(real_modules, debugmouse)`. I've done a little bit of golfing but this is stiill a token expense. I'm going to write a crappy sprintf function to save tokens everywhere we're assembling strings from their component parts.
2253 lines
88 KiB
Lua
2253 lines
88 KiB
Lua
pico-8 cartridge // http://www.pico-8.com
|
|
version 39
|
|
__lua__
|
|
-- setup
|
|
modules={}
|
|
real_modules={}
|
|
|
|
frame=0
|
|
function _init()
|
|
-- printh("restarting")
|
|
music_on()
|
|
_doall("init") end
|
|
function _update()
|
|
frame+=1
|
|
if (frame%1==0) _doall("update") end
|
|
function _draw()
|
|
_doall("draw") end
|
|
|
|
function music_on()
|
|
music(0)
|
|
menuitem(3, "music: on", music_off)
|
|
end
|
|
|
|
function music_off()
|
|
music(-1)
|
|
menuitem(3, "music: off", music_on)
|
|
end
|
|
|
|
function gsv(s,sep1,sep2)
|
|
local ret=split(s,sep1 or "\n")
|
|
for i,v in ipairs(ret) do
|
|
ret[i] = type(v) == "string" and split(v,sep2 or "`") or {v} end
|
|
return ret
|
|
end
|
|
|
|
function cycle(tbl,period)
|
|
period = period or 1
|
|
return tbl[t()%period*#tbl\period+1]
|
|
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 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 s in all{{0,-r},{d,-r},{d,r},{0,r}} do
|
|
local x1,y1=calcxy(unpack(s))
|
|
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") x[k]=v
|
|
end
|
|
|
|
if (t and t.update and not t.update(x,a)) add(ts,t,1)
|
|
end
|
|
|
|
function sgn0(x)
|
|
return x!=0 and sgn(x) or 0
|
|
end
|
|
|
|
function inorder(tbl)
|
|
local prev
|
|
for v in all(tbl) do
|
|
if (prev and v < prev) return
|
|
prev = v
|
|
end
|
|
return true
|
|
end
|
|
|
|
function _mnmx(x,y)
|
|
if (x>y)return y,x
|
|
return x,y
|
|
end
|
|
|
|
|
|
function _rast(
|
|
xs,ys,x0,y0,x1,y1
|
|
)
|
|
local function _add()
|
|
local n=#xs
|
|
if (n==0 or xs[n]!=x0 or ys[n]!=y0) add(xs,x0) add(ys,y0)
|
|
end
|
|
|
|
local dx,dy=abs(x1-x0),abs(y1-y0)
|
|
local sx=-1
|
|
local sy=-1
|
|
if (x0<x1) sx=1
|
|
if (y0<y1) sy=1
|
|
|
|
local done,err
|
|
if dx>dy then
|
|
err=dx/2.0
|
|
while x0!=x1 do
|
|
_add()
|
|
err-=dy
|
|
if (err<0) y0+=sy err+=dx
|
|
x0+=sx
|
|
end
|
|
else
|
|
err=dy/2.0
|
|
while y0!=y1 do
|
|
_add()
|
|
err-=dx
|
|
if (err<0) x0+=sx err+=dy
|
|
y0+=sy
|
|
end
|
|
end
|
|
_add()
|
|
end
|
|
|
|
-->8
|
|
-- anchor operations (for the rope code)
|
|
|
|
function _anch_eq(a0,a1)
|
|
if (a0 and a1) return a0[1]==a1[1] and a0[2]==a1[2]
|
|
return a0==a1
|
|
end
|
|
--[[
|
|
function _anch_unpack(anch)
|
|
assert(anch[1])
|
|
assert(anch[2])
|
|
return anch[1],anch[2]
|
|
end
|
|
]]--
|
|
_anch_unpack=unpack
|
|
|
|
function _anch_new(prev,next,xy)
|
|
local out={prev=prev,next=next,_anch_unpack(xy)}
|
|
if (prev) prev.next=out
|
|
if (next) next.prev=out
|
|
return out
|
|
end
|
|
|
|
function _anch_del(n1,xy)
|
|
local n0,n2=n1.prev,n1.next
|
|
if (n0) n0.next=n2
|
|
if (n2) n2.prev=n0
|
|
end
|
|
|
|
function _anch_update(a0,a1)
|
|
a0[1]=a1[1]
|
|
a0[2]=a1[2]
|
|
end
|
|
|
|
|
|
|
|
-->8
|
|
-- input
|
|
kbd={}
|
|
add(real_modules,kbd)
|
|
function kbd:init()
|
|
self.real=btn()
|
|
self.state={btn=0}
|
|
end
|
|
|
|
function kbd:update()
|
|
-- figure out what keys are _really_ pressed
|
|
local now_real,was_real=btn(),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 state=self.state
|
|
local now_down=state.btn&now_real|real_pressed
|
|
local was_down=state.btn
|
|
|
|
-- deduce pressed/released by changes in down
|
|
state.btn,state.btnp,state.btnr=
|
|
now_down,
|
|
~was_down&now_down,
|
|
~now_down&was_down
|
|
end
|
|
|
|
for _kbdi in all(split"btn,btnp,btnr") do
|
|
kbd[_kbdi]=function(self,i,t) return 1<<i&self.state[_kbdi]!=0 end
|
|
end
|
|
|
|
function kbd:release(i)
|
|
self.state.btn&=~(1<<i)
|
|
end
|
|
|
|
function tostring(any)
|
|
if type(any)=="table" then
|
|
local str = "{ "
|
|
for k,v in pairs(any) do
|
|
str=str..tostring(k).."->"..tostring(v).." "
|
|
end
|
|
return str.."}"
|
|
end
|
|
return tostr(any)
|
|
end
|
|
|
|
-->8
|
|
-- title screen
|
|
title={}
|
|
add(modules,title)
|
|
|
|
blinkcol=10
|
|
function title:draw()
|
|
cls(0)
|
|
-- this is right for 72x32
|
|
spr(96,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=31
|
|
|
|
function title:update()
|
|
blinkcol=9
|
|
if (time()*4\1%2==0) blinkcol=10
|
|
|
|
if (btnp"0") start_level-=1
|
|
if (btnp"1") start_level+=1
|
|
start_level%=max_level
|
|
|
|
if (btnp"4" or btnp"5") modules=real_modules _init() music(0)
|
|
end
|
|
|
|
-->8
|
|
--level behaviors
|
|
level={}
|
|
add(real_modules,level)
|
|
|
|
function level:init()
|
|
level:reinit(start_level)
|
|
end
|
|
|
|
function level:reinit(n)
|
|
self.hintlevel=255
|
|
self.ix=n
|
|
self.todo={}
|
|
self.bigx,self.bigy=n%8,n\8
|
|
self.dirty=false
|
|
|
|
self:load_dynobjs()
|
|
self:recollide_reanchor()
|
|
self:spawn_exit()
|
|
end
|
|
|
|
function level:restart()
|
|
self:reinit(self.ix)
|
|
end
|
|
|
|
function level:advance()
|
|
self:reinit(self.ix+1)
|
|
end
|
|
|
|
normpal = {[1]=0,[8]=0,[14]=0}
|
|
pitpal = {[8]=0,[13]=3,[4]=3,[7]=3}
|
|
function level:draw()
|
|
cls(5)
|
|
fillp()
|
|
pal(normpal)
|
|
map(
|
|
self.bigx*16,self.bigy*16,
|
|
0,0,16,16,
|
|
64 -- flag 6: visible
|
|
)
|
|
|
|
for _,pit in pairs(self._pits) do
|
|
local px,py=pit.px,pit.py
|
|
local pr=self._pits[_mix(px+1,py)]
|
|
|
|
spr(pit.s,px,py)
|
|
if pit.contents then
|
|
pal(pitpal)
|
|
palt(0,false)
|
|
--spr(pit.contents,pit.px,pit.py)
|
|
spr(79,pit.px,pit.py)
|
|
pal()
|
|
pal(normpal)
|
|
end
|
|
palt(8,true)
|
|
spr(pit.s,px,py)
|
|
palt()
|
|
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
|
|
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
|
|
self.dirty=true
|
|
end
|
|
|
|
if self.dirty then
|
|
self:recollide_reanchor()
|
|
self.dirty=false
|
|
end
|
|
end
|
|
|
|
function level:load_dynobjs()
|
|
self._crates={}
|
|
self._pits={}
|
|
|
|
local crate_id=1
|
|
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=crate_id,
|
|
mx=mx,my=my,
|
|
px=px,py=py,
|
|
todo={}
|
|
}
|
|
crate_id+=1
|
|
end
|
|
|
|
-- pit
|
|
if (fget(s,5)) self._pits[mxy]={s=s,mx=mx,my=my,px=px,py=py}
|
|
end
|
|
end
|
|
end
|
|
|
|
function level:recollide_reanchor()
|
|
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]
|
|
end
|
|
end
|
|
|
|
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]= {
|
|
max(mx0,mx1),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]={
|
|
max(mx0,mx1),max(my0,my1),adx=-dx,ady=-dy
|
|
}
|
|
end
|
|
end
|
|
|
|
local moves={}
|
|
for k,new in pairs(anch_new) do
|
|
local old=(self._anch or {})[k]
|
|
if old then
|
|
anch_new[k]=new
|
|
if (not _anch_eq(old,new)) add(moves,{old,new,key=k})
|
|
end
|
|
end
|
|
self._anch=anch_new
|
|
self._anch_keys={}
|
|
self._anch_by_position={}
|
|
for k,v in pairs(self._anch) do
|
|
add(self._anch_keys,{key=k})
|
|
local pkey=_mix(_anch_unpack(v))
|
|
self._anch_by_position[pkey]=self._anch_by_position[pkey] or v
|
|
end
|
|
shellsort(self._anch_keys)
|
|
shellsort(moves)
|
|
|
|
if player.rope then
|
|
player.rope:experience_anchor_moves(moves)
|
|
end
|
|
|
|
for point in self:anchor_points() do
|
|
point.moved=nil
|
|
end
|
|
end
|
|
|
|
function level:win_at(mx,my)
|
|
return self._wins[_mix(mx,my)]
|
|
end
|
|
|
|
function level:anchor_points()
|
|
-- TODO: Return this to using all()
|
|
local keys=all(self._anch_keys)
|
|
return function()
|
|
local k=keys()
|
|
if (k) return self._anch[k.key]
|
|
end
|
|
end
|
|
|
|
function level:anchor_at(point)
|
|
return self._anch_by_position[_mix(_anch_unpack(point))]
|
|
end
|
|
|
|
function level:get_open_pit(mx,my)
|
|
local pit=self._pits[_mix(mx,my)]
|
|
if (pit and not pit.contents) return pit
|
|
end
|
|
|
|
function level:spawn_exit()
|
|
self._wins={}
|
|
local spawned
|
|
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
|
|
-- next check: is at least one of
|
|
-- nx or ny out of range [0, 15]?
|
|
if (nx | ny) & 0xFFF0 ~= 0 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)
|
|
if ((mx | my) & 0xFFF0!=0) return true
|
|
return self._coll[_mix(mx,my)]
|
|
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 _mix(mx,my)
|
|
return mx..","..my
|
|
end
|
|
|
|
-- crate spec:
|
|
-- "up" == 1
|
|
-- "right" == 2
|
|
-- "down" == 4
|
|
-- "left" == 8
|
|
--
|
|
-- +1+
|
|
-- 8 2
|
|
-- +4+
|
|
function level:_get_cratedef(s)
|
|
if (s<64 or s>=80) return
|
|
return s & 0x000F
|
|
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 & dy1*dy1*(2.5+1.5*dy1)+dx1*dx1*(5-3*dx1) ~= 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
|
|
|
|
ropecheck=split"-0.6,0.4,0.4"
|
|
|
|
function level:can_move(
|
|
is_player,
|
|
mx0,my0,dmx,dmy,exclude_src,exclude_dst
|
|
)
|
|
local mx1,my1=mx0+dmx,my0+dmy
|
|
if (is_player and self:win_at(mx1,my1)) return true
|
|
if (is_player and self:get_open_pit(mx1,my1)) return wrongbleep:adequately_warned()
|
|
|
|
if (self:mcoll(mx1,my1) or player.x==mx1 and player.y==my1) return
|
|
|
|
if player.rope then
|
|
local w,h=1.2,0.2
|
|
if (dmx==0) w,h=0.2,1.2
|
|
if (player.rope:collide_mrect(mx0+ropecheck[dmx+2],my0+ropecheck[dmy+2],w,h,exclude_src,exclude_dst)) return
|
|
end
|
|
|
|
return true
|
|
end
|
|
|
|
function level:tug_crate(mx0,my0,dmx,dmy)
|
|
local mxy0=_mix(mx0,my0)
|
|
local existing=self._crates[mxy0]
|
|
if (not existing) return
|
|
|
|
self._crates[mxy0]=nil
|
|
local mx1,my1=mx0+dmx,my0+dmy
|
|
local px1,py1=mx1*8,my1*8
|
|
existing.todo={
|
|
{px=px1+dmx,py=py1+dmy,mx=mx1,my=my1,update=function()
|
|
self.dirty=true
|
|
return true
|
|
end},
|
|
{px=px1,py=py1}
|
|
}
|
|
|
|
self._crates[_mix(mx1,my1)]=existing
|
|
end
|
|
|
|
-->8
|
|
--player handling
|
|
player={}
|
|
add(real_modules,player)
|
|
|
|
function player:init()
|
|
-- 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,self.y=x,y
|
|
self.px,self.py=0,0
|
|
self.todo={}
|
|
self.cooldown=4
|
|
self.rope=nil -- don't elide, needs to be cleared if present
|
|
|
|
self.fall_frame=0
|
|
|
|
self.orientx,self.orienty=-1,0
|
|
end
|
|
|
|
function player:update()
|
|
-- this is a non-gameplay action that takes precedence over
|
|
-- all gameplay actions
|
|
self:_vanish_if_requested()
|
|
|
|
if not (#self.todo>0 or level: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
|
|
|
|
function btncd(x)
|
|
return (kbd:btn(x) and self.cooldown==0) or kbd:btnp(x)
|
|
end
|
|
|
|
if kbd:btn(4) then
|
|
if kbd:btnp(4) and self.rope then
|
|
self.rope:destroy()
|
|
kbd:release(4)
|
|
end
|
|
-- wait for user to release it
|
|
else
|
|
local x,y=self.x,self.y
|
|
local function try_move(dx,dy,f)
|
|
if level:can_move(true,x,y,dx,dy,0,2) then
|
|
self.todo=f
|
|
self.cooldown=3
|
|
local t=f[#f]
|
|
t.x=x+dx
|
|
t.y=y+dy
|
|
return
|
|
end
|
|
wrongbleep:bleep()
|
|
end
|
|
if btncd(0) then
|
|
try_move(-1,0,{{orientx=-1,orienty=0,px=-2,py=0},{px=1}})
|
|
elseif btncd(1) then
|
|
try_move(1,0,{{orientx=1,orienty=0,px=2,py=0},{px=-1}})
|
|
elseif btncd(2) then
|
|
try_move(0,-1,{{orienty=-1,px=0,py=-2},{py=1}})
|
|
elseif btncd(3) then
|
|
try_move(0,1,{{orienty=1,px=0,py=2},{py=-1}})
|
|
elseif not self.rope and kbd:btnr(4) then
|
|
local dx,dy=self.orientx,self.orienty
|
|
if (dy!=0) dx=0
|
|
|
|
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 not self.rope or self.rope:latched()
|
|
end
|
|
}}
|
|
elseif kbd:btnp(5) then
|
|
if (self.rope and not self.rope:tug()) wrongbleep:bleep(9)
|
|
end
|
|
end
|
|
end
|
|
|
|
if (#self.todo==0) self.px=0 self.py=0
|
|
_apply(self,self.todo)
|
|
if (self.cooldown>0) self.cooldown-=1
|
|
|
|
if self.rope then
|
|
self.rope:update()
|
|
if self.rope:done_reeling() then
|
|
local latch=self.rope.latch
|
|
self.x=latch.rec.mx+latch.dx
|
|
self.y=latch.rec.my+latch.dy
|
|
end
|
|
|
|
self.rope:drag_dst{
|
|
self.x+self.px/8+0.5,
|
|
self.y+self.py/8+0.5
|
|
}
|
|
|
|
local tdx,tdy=self.rope:tug_orientxy()
|
|
if (tdx) self.orientx=tdx
|
|
if (tdy) self.orienty=tdy
|
|
|
|
if (self.rope:done()) self.rope=nil
|
|
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
|
|
|
|
--[[
|
|
local HEAD=14--3
|
|
local BODY=12--12
|
|
local TAIL=14--14
|
|
local IRIS=7--9
|
|
local PUPIL=0--0
|
|
]]
|
|
|
|
-- in order: head,body,iris,pupil,body again,tail
|
|
local palette=split"-1,14,14,12,12,-1,-1,-1,7,0,-1,12,14,14,14"
|
|
local function setpal()
|
|
--[[
|
|
-- head
|
|
nil,14,14,
|
|
--body
|
|
[2]=HEAD,
|
|
[3]=HEAD,
|
|
[4]=BODY,
|
|
[5]=BODY,
|
|
[9]=IRIS,
|
|
[10]=PUPIL,
|
|
[12]=BODY,
|
|
[13]=TAIL,
|
|
[14]=TAIL,
|
|
[15]=TAIL,
|
|
]]
|
|
pal(palette)
|
|
|
|
-- 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,5)
|
|
end
|
|
|
|
if (self.fall_frame>3) local zc=@0x5f00&0xf0 for i=0x5f00,0x5f0c,4 do poke4(i,0x0101.0101) end poke(0x5f00,zc|0x01)
|
|
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 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,dst,latch
|
|
)
|
|
local r={
|
|
id=0,
|
|
state={name="cast",frame=0},
|
|
latch=latch,
|
|
}
|
|
r.src=src
|
|
r.dst=dst
|
|
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 (not self.latch) wrongbleep:bleep(5) self:destroy() return
|
|
|
|
if self.latch.rec 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>=4) 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)
|
|
local n,perc_to_show,from_end = self.state.name,1.0
|
|
if (n=="done") return
|
|
if (n=="cast") perc_to_show=self.state.frame/2
|
|
if (n=="destroy") perc_to_show=(1.0-self.state.frame/4)^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
|
|
|
|
local function colorh(ix)
|
|
color(8)
|
|
if (highlight==ix) color(12)
|
|
end
|
|
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
|
|
end
|
|
dx,dy=dx*coef,dy*coef
|
|
|
|
colorh(i)
|
|
|
|
local function lf(d0,d1,w)
|
|
linefill(x+d0*dx,y+d0*dy,x+d1*dx,y+d1*dy,w)
|
|
end
|
|
|
|
lf(0,0.25,1.0)
|
|
lf(0.25,1,0.5)
|
|
lf(0.9,1,1.0)
|
|
circfill(x+dx+0.5,y+dy+0.5,1.0)
|
|
end
|
|
end
|
|
|
|
-- draw latch
|
|
local l=self.latch
|
|
if l and l.rec and (perc_to_show>=1.0 or from_end) then
|
|
local function rfsplit(x) rectfill(unpack(split(x))) end
|
|
local ldx,ldy=l.dx,l.dy
|
|
colorh(0)
|
|
camera(-l.rec.px,-l.rec.py)
|
|
if (ldx==-1) rfsplit"0,3,2,4"
|
|
if (ldx==1) rfsplit"5,3,7,4"
|
|
if (ldy==-1) rfsplit"3,0,4,2"
|
|
if (ldy==1) rfsplit"3,5,4,7"
|
|
camera()
|
|
color()
|
|
end
|
|
|
|
-- debug
|
|
--[[
|
|
local n1=self.src
|
|
local sy=0
|
|
while true do
|
|
if (n1==nil) break
|
|
local anch=level:anchor_at(n1)
|
|
local x=n1.ax*8
|
|
local y=n1.ay*8
|
|
if anch then
|
|
if (anch.adx>0) x-=1
|
|
if (anch.ady>0) y-=1
|
|
end
|
|
rectfill(x-1,y-1,x+1,y+1,12)
|
|
print("ax="..n1.ax..",ay="..n1.ay,72,sy)
|
|
sy+=7
|
|
|
|
local n0=n1.prev
|
|
local n2=n1.next
|
|
if n0!=nil and n2!=nil then
|
|
if anch then
|
|
local _,_,_=would_stick(anch,n0.ax,n0.ay,n1.ax,n1.ay,n2.ax,n2.ay)
|
|
|
|
local c=3
|
|
if (anch.dropped) c=4
|
|
rectfill(x+2,y+2,x+4,y+4,c)
|
|
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(xy)
|
|
self:drag(self.dst,xy)
|
|
end
|
|
|
|
function rope:drag_src(xy)
|
|
self:drag(self.src,xy)
|
|
end
|
|
|
|
function rope:drag(n1,axy)
|
|
self:relax()
|
|
self:_drag(n1,{axy[1],n1[2]})
|
|
self:_drag(n1,axy)
|
|
self:relax()
|
|
end
|
|
|
|
function rope:relax()
|
|
local n0=self.src
|
|
while true do
|
|
local n1=n0.next
|
|
if (not n1) break
|
|
local n2=n1.next
|
|
if _anch_eq(n0,n1) then
|
|
_anch_del(n1)
|
|
else
|
|
n0=n0.next
|
|
end
|
|
end
|
|
|
|
local n0=self.src
|
|
while n0 do
|
|
local n1=n0.next
|
|
if (not n1) return
|
|
local n2=n1.next
|
|
if (not n2) return
|
|
|
|
local anch=level:anchor_at(n1)
|
|
local wouldstick,position_new=would_stick(anch,n0,n1,n2)
|
|
if not (wouldstick or _anch_eq(n1,position_new)) then
|
|
self:_drag(n1,position_new,{_anch_unpack(n1)})
|
|
_anch_del(n1)
|
|
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 (not n1) break
|
|
|
|
local n0ax,n0ay=_anch_unpack(n0)
|
|
local n1ax,n1ay=_anch_unpack(n1)
|
|
_rast(qxs,qys,flr(n0ax*2),flr(n0ay*2),flr(n1ax*2),flr(n1ay*2))
|
|
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
|
|
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
|
|
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
|
|
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
|
|
ok=true
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
if (not ok) return
|
|
end
|
|
end
|
|
return true
|
|
end
|
|
|
|
function would_stick(anchor,xy0,xy1,xy2)
|
|
local x0,y0=_anch_unpack(xy0)
|
|
local x1,y1=_anch_unpack(xy1 or anchor)
|
|
local x2,y2=_anch_unpack(xy2)
|
|
|
|
local dx,dy=x2-x0,y2-y0
|
|
|
|
local function switch_ends()
|
|
dx,dy,x0,y0,x2,y2=-dx,-dy,x2,y2,x0,y0
|
|
end
|
|
|
|
local function signs(douter,dinner)
|
|
local adb=sgn0(dinner)
|
|
return -sgn0(douter)*adb,adb
|
|
end
|
|
|
|
local adx,ady,x1_new,y1_new
|
|
if abs(dx)>abs(dy) then
|
|
if (x0>x2) switch_ends()
|
|
x1_new,y1_new=x1,y0+(x1-x0)/dx*dy
|
|
adx,ady=signs(dy,y1_new-y1)
|
|
else
|
|
if (y0>y2) switch_ends()
|
|
x1_new,y1_new=x0+(y1-y0)/dy*dx,y1
|
|
ady,adx=signs(dx,x1_new-x1)
|
|
end
|
|
|
|
return
|
|
anchor and anchor.adx==adx and anchor.ady==ady,
|
|
{x1_new,y1_new}
|
|
end
|
|
|
|
function rope:experience_anchor_moves(moves)
|
|
self:_be_dragged_by(moves)
|
|
self:_be_pushed_by(moves)
|
|
self:relax()
|
|
end
|
|
|
|
function rope:_be_dragged_by(moves)
|
|
local n=self.src
|
|
while n do
|
|
for t in all(moves) do
|
|
local xy_old,xy_new=unpack(t)
|
|
if (_anch_eq(xy_old,n)) n.dest=xy_new break
|
|
end
|
|
n=n.next
|
|
end
|
|
|
|
n=self.src
|
|
while n do
|
|
if (n.dest) self:_drag(n,n.dest) n.dest=nil
|
|
n=n.next
|
|
end
|
|
end
|
|
|
|
function rope:_be_pushed_by(moves)
|
|
for i in all(moves) do
|
|
self:_be_pushed_by1(unpack(i))
|
|
end
|
|
end
|
|
|
|
function rope:_be_pushed_by1(anch_old,anch_new)
|
|
local n0=self.src
|
|
|
|
local ax_old,ay_old=_anch_unpack(anch_old)
|
|
local ax_new,ay_new=_anch_unpack(anch_new)
|
|
|
|
while n0 do
|
|
n1=n0.next
|
|
if (not n1) return
|
|
|
|
local nx0,ny0=_anch_unpack(n0)
|
|
local nx1,ny1=_anch_unpack(n1)
|
|
|
|
local nxmn,nxmx = _mnmx(nx0,nx1)
|
|
local nymn,nymx = _mnmx(ny0,ny1)
|
|
|
|
if
|
|
(ax_new!=ax_old or (nxmn<ax_new and ax_new<nxmx)) and
|
|
(ay_new!=ay_old or (nymn<ay_new and ay_new<nymx)) and
|
|
|
|
(_which_side(anch_old,n0,n1)!=
|
|
_which_side(anch_new,n0,n1)
|
|
) and would_stick(anch_new,n0,nil,n1)
|
|
then
|
|
local nx05,ny05
|
|
if ax_new==ax_old then
|
|
nx05=ax_new
|
|
ny05=ny0+(nx05-nx0)/(nx1-nx0) * (ny1-ny0)
|
|
elseif ay_new==ay_old then
|
|
ny05=ay_new
|
|
nx05=nx0+(ny05-ny0)/(ny1-ny0) * (nx1-nx0)
|
|
end
|
|
|
|
local n05=_anch_new(n0,n1,{nx05,ny05})
|
|
self:_drag(n05,{ax_new,ay_new})
|
|
else
|
|
n0=n0.next
|
|
end
|
|
end
|
|
end
|
|
|
|
function rope:_drag(n1,new,removing)
|
|
local function _sweep_radar(lhs,rhs,pivot,src,dst)
|
|
if (_anch_eq(src,dst)) return
|
|
|
|
local function _uncreatable(anchor)
|
|
return _anch_eq(anchor,lhs) or _anch_eq(anchor,lhs) or _anch_eq(anchor,removing)
|
|
end
|
|
|
|
local function _sweep(extent_orig,extent_final,cb_in_bounds,cb_make_point)
|
|
local eligible={}
|
|
local point_orig=cb_make_point(extent_orig)
|
|
local point_final=cb_make_point(extent_final)
|
|
|
|
for anchor in level:anchor_points() do
|
|
-- figure out which anchors we even can stick to
|
|
if cb_in_bounds(anchor) and not _uncreatable(anchor) then
|
|
local side_orig=_which_side(anchor,pivot,point_orig)
|
|
local side_final=_which_side(anchor,pivot,point_final)
|
|
|
|
if (side_orig!=side_final and would_stick(anchor,pivot,nil,point_final)) add(eligible,{anchor,side_final})
|
|
end
|
|
end
|
|
|
|
-- if no one's in the race, don't raycast
|
|
if (#eligible==0) return
|
|
if (#eligible==1) return eligible[1][1]
|
|
|
|
-- see who wins the race
|
|
for extent in _stepfrom(extent_orig,extent_final) do
|
|
local point = cb_make_point(extent)
|
|
for anchor_final in all(eligible) do
|
|
if (_which_side(anchor_final[1],pivot,point)==anchor_final[2]) return anchor_final[1]
|
|
end
|
|
end
|
|
end
|
|
|
|
local ax_pivot,ay_pivot=_anch_unpack(pivot)
|
|
local ax_src,ay_src=_anch_unpack(src)
|
|
local ax_dst,ay_dst=_anch_unpack(dst)
|
|
|
|
if ax_src==ax_dst then
|
|
return _sweep(
|
|
ay_src,ay_dst,
|
|
function(anchor) return mid(ax_pivot,anchor[1],ax_dst)==anchor[1] end,
|
|
function(ay) return {ax_dst,ay} end
|
|
)
|
|
else
|
|
return _sweep(
|
|
ax_src,ax_dst,
|
|
function(anchor) return mid(ay_pivot,anchor[2],ay_dst)==anchor[2] end,
|
|
function(ax) return {ax,ay_dst} end
|
|
)
|
|
end
|
|
end
|
|
|
|
local old={_anch_unpack(n1)}
|
|
_anch_update(n1,new)
|
|
|
|
local n0=n1.prev
|
|
while n0 do
|
|
local anch=_sweep_radar(n0,n1,n0,old,new)
|
|
if (not anch) break
|
|
n0=_anch_new(n0,n1,anch)
|
|
end
|
|
|
|
local n2=n1.next
|
|
while n2 do
|
|
local anch=_sweep_radar(n1,n2,n2,old,new)
|
|
if (not anch) break
|
|
n2=_anch_new(n1,n2,anch)
|
|
end
|
|
end
|
|
|
|
function _stepfrom(x0,x1)
|
|
local done
|
|
if x0==x1 then
|
|
return function()
|
|
if (done) return
|
|
done=true return x0
|
|
end
|
|
end
|
|
|
|
local mul=1
|
|
if (x0>x1) x0,x1,mul=-x0,-x1,-mul
|
|
local i=flr(x0)
|
|
local top=flr(x1)
|
|
return function()
|
|
if (done) return
|
|
i+=1
|
|
if i>top then
|
|
done = true
|
|
if (x1!=flr(x1)) return mul*x1
|
|
return
|
|
end
|
|
return mul*i
|
|
end
|
|
end
|
|
|
|
function _which_side(xy,x0y0,x1y1)
|
|
local x,y=_anch_unpack(xy)
|
|
local x0,y0=_anch_unpack(x0y0)
|
|
local x1,y1=_anch_unpack(x1y1)
|
|
|
|
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 (not n1) return
|
|
|
|
local nd=n0
|
|
for i=1,exclude_dst do
|
|
nd=nd.next
|
|
if (not nd) return
|
|
end
|
|
|
|
local x1,y1=_anch_unpack(n0)
|
|
local x2,y2=_anch_unpack(n1)
|
|
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
|
|
|
|
local ub=
|
|
((x2-x1)*(y1-y3)-(y2-y1)*(x1-x3))/denom
|
|
if (ub<0 or ub>1) return
|
|
|
|
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 ax0,ay0=_anch_unpack(a0)
|
|
local ax1,ay1=_anch_unpack(a1)
|
|
|
|
local dx=ax0-ax1
|
|
local tdx
|
|
if (dx>3/8) tdx=1
|
|
if (dx<-3/8) tdx=-1
|
|
|
|
local dy=ay0-ay1
|
|
local tdy
|
|
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 and latch.el=="eyehook" then
|
|
if (hypothetically) return ancs,0
|
|
player.todo={{
|
|
update=function(s)
|
|
if not s.rope or s.rope:done() then
|
|
return true
|
|
end
|
|
end
|
|
}}
|
|
self:destroy(true)
|
|
return true
|
|
end
|
|
if latch 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
|
|
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
|
|
return
|
|
end
|
|
|
|
function rope:_calc_push(
|
|
an,a0,a1,af
|
|
)
|
|
local ops={}
|
|
if (not an) 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.x<an.x-7 then
|
|
-- push right
|
|
mx=(a0.x+1)\8
|
|
dmx=1
|
|
else
|
|
return {}
|
|
end
|
|
|
|
for my=my0,my1,smy do
|
|
add(ops,{mx=mx,my=my,dmx=dmx,dmy=0})
|
|
end
|
|
end
|
|
|
|
if a0.y==a1.y then
|
|
local x0,x1=_mnmx(a0.x,a1.x)
|
|
local mx0,mx1,smx=(x0+1)\8,(x1-1)\8,1
|
|
if a0.x>a1.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.y<an.y-6 then
|
|
-- push down
|
|
my=(a0.y+1)\8
|
|
dmy=1
|
|
else
|
|
return {}
|
|
end
|
|
|
|
for mx=mx0,mx1,smx do
|
|
add(ops,{mx=mx,my=my,dmx=0,dmy=dmy})
|
|
end
|
|
end
|
|
|
|
local ops2={}
|
|
for o in all(ops) do
|
|
if not level:mcoll(o.mx,o.my) then
|
|
-- great!
|
|
else
|
|
local crate=level:get_crate(o.mx,o.my)
|
|
if crate then
|
|
if not level:can_move(false,o.mx,o.my,o.dmx,o.dmy,0,0) then
|
|
break
|
|
end
|
|
else
|
|
break
|
|
end
|
|
add(ops2,o)
|
|
end
|
|
end
|
|
return ops2
|
|
end
|
|
|
|
function rope:_anchors_simplified()
|
|
-- todo: cache this
|
|
local points={}
|
|
local _slope = function(p0,p1)
|
|
return atan2(p1.y-p0.y,p1.x-p0.x)
|
|
end
|
|
a=self.src
|
|
while a do
|
|
local ax,ay=_anch_unpack(a)
|
|
local point={
|
|
ax,ay,
|
|
x=flr(ax*8+0.5),y=flr(ay*8+0.5),
|
|
}
|
|
local aw=level:anchor_at(a)
|
|
local l=self.latch
|
|
if aw then
|
|
if (aw.adx==1) point.x-=1
|
|
if (aw.ady==1) point.y-=1
|
|
elseif not a.prev and l then
|
|
if (l.ax_offset<0) point.x-=1
|
|
if (l.ay_offset<0) point.y-=1
|
|
end
|
|
|
|
local p0,p1=points[#points-1],points[#points]
|
|
if not p0 then
|
|
add(points,point)
|
|
elseif _slope(p0,p1)==_slope(p1,point) then -- epsilon?
|
|
points[#points]=point
|
|
else
|
|
add(points,point)
|
|
end
|
|
a=a.next
|
|
end
|
|
return points
|
|
end
|
|
|
|
-->8
|
|
--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={
|
|
"0`9`11`\f7\#0press 🅾️ to mlem & unmlem",
|
|
"0`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
|
|
|
|
-->8
|
|
--hint system
|
|
function rot13(s)
|
|
local sord = pack(ord(s,1,#s))
|
|
for i,c in ipairs(sord) do
|
|
if (inorder{65, c, 77} or inorder{97, c, 109}) sord[i]=c+13
|
|
if (inorder{78, c, 90} or inorder{110, c, 122}) sord[i]=c-13
|
|
end
|
|
return chr(unpack(sord))
|
|
end
|
|
|
|
--hint file format:
|
|
-- each row is one hint.
|
|
-- 4 or 5 columns
|
|
-- separated with a
|
|
-- grave (`) character
|
|
-- [1] room#
|
|
-- [2] x coord
|
|
-- [3] y coord
|
|
-- [4] message line 1 (rot13)
|
|
-- [5] message llne 2 (rot13)
|
|
-- [6] arrow (semicolon separated list: each element is two comma-separated integers)
|
|
-- row 5 can be omitted
|
|
-- for a 1-line hint
|
|
-- row 6 can be omitted if there is no arrow
|
|
--
|
|
-- multiple hints for the same
|
|
-- room are revealed in order
|
|
|
|
hints = {}
|
|
add(real_modules,hints)
|
|
|
|
function hints:init()
|
|
local h = gsv[[0`42`57`🅾️ yVPX` ■
|
|
0`42`73`❎, ❎ cHYY``69,67;55,67
|
|
1`35`33`⁘` cHYY`62,35;41,35
|
|
1`79`82`cHYY ■``100,94;100,88
|
|
1`42`98`⁘`VTABER`66,99;52,99;52,75;28,75;28,120
|
|
2`75`65` `⁘`86,67;76,67;76,71
|
|
2`104`73` ■`cHYY`81,75;86,75
|
|
2`27`42`⁘``36,16;36,44;31,44
|
|
3`51`106`■``52,97;52,104
|
|
3`-1`-1```28,78;28,45
|
|
3`-1`-1```65,35;83,35
|
|
3`-1`-1```97,35;105,35]]
|
|
for rec in all(h) do
|
|
rec[4]=rot13(rec[4])
|
|
if(rec[5]) rec[5]=rot13(rec[5])
|
|
if(rec[6]) rec[6]=gsv(rec[6],";",",")
|
|
local lh = self[rec[1]]
|
|
if lh then
|
|
add(lh,rec)
|
|
else
|
|
self[rec[1]] = {rec}
|
|
end
|
|
end
|
|
menuitem(1,"get hint",function() level.hintlevel+=1 end)
|
|
menuitem(2,"hide hints",function() level.hintlevel=0 end)
|
|
end
|
|
|
|
hintflicker=split"7,10,9,8,8,9,10,7"
|
|
function hints:draw2()
|
|
pal()
|
|
local c=cycle(hintflicker)
|
|
|
|
local function body()
|
|
for i,h in ipairs(self[level.ix]) do
|
|
if (i > level.hintlevel) return
|
|
local _,x,y,txt,txt2,arrow=unpack(h)
|
|
|
|
print(txt,x,y)
|
|
if (txt2) print(txt2,x,y+8)
|
|
|
|
if arrow then
|
|
line()
|
|
local x0,y0,x1,y1
|
|
for i=1,#arrow do
|
|
x0,y0,x1,y1=x1,y1,unpack(arrow[i])
|
|
line(x1,y1)
|
|
end
|
|
local dir=atan2(x1-x0,y1-y0)
|
|
local function _ahead(d,r)
|
|
line(x1+r*sgn0(cos(dir+d)),y1+r*sgn0(sin(dir+d)))
|
|
end
|
|
_ahead(0.375,2) _ahead(0.625,2) _ahead(0,0)
|
|
end
|
|
end
|
|
end
|
|
|
|
color(7)
|
|
camera(1,-1) pal(7,1) body()
|
|
camera() pal(7,c) body()
|
|
pal()
|
|
end
|
|
|
|
-->8
|
|
-- debug mouse support
|
|
|
|
debugmouse = {}
|
|
|
|
-- comment this out to disable debug mode
|
|
add(real_modules, debugmouse)
|
|
|
|
function debugmouse:init()
|
|
poke(0x5f2d,1)
|
|
end
|
|
|
|
debugflicker=split"5,6,7,15,14,8,2,4,9,10,11,3,12,13"
|
|
debugchs = split" ,x, ,□"
|
|
|
|
function debugmouse:draw3()
|
|
if (stat(34) == 0) return
|
|
pal(15,cycle(debugflicker,1.5))
|
|
local x, y, c = stat(32), stat(33), cycle(debugchs,2)
|
|
if (c == " ") spr(50,x,y)
|
|
print(c,x,y,15)
|
|
local px, py = mid(0,x,89), mid(0, y > 111 and y - 12 or y + 6, 117)
|
|
print("("..x..", "..y..")\n["..(x\8)..", "..(y\8).."]",px,py,15)
|
|
pal()
|
|
end
|
|
|
|
__gfx__
|
|
000030000000002200003000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeff1ff1ff1fffffff1ffffff1fffffff1dddddddd111111110005000000000000
|
|
003333300000332200333330eeffffffffffffffffffffeee5e555e55e555e5eff1ff1ffffffffffffffffffffffffffdddddddd111111110000500000000000
|
|
099333990039932009333339effeeeeeeeeeeeeeeeeeeffee5eeeeeeeeeeee5eff1ff1ffff111111ff1111ff111111ffdddddddd111111110000000000000000
|
|
09a333a9033a932009333339efee33e3333e333e3333eefee5e333e333333e5eff1ff1ffff1fffffff1ff1fffffff1ffdddddddd111111115005005000000000
|
|
023333323333320000222220efe333e3333e333e33333efee5e333e333333e5eff1ff1ffff1fffffff1ff1fffffff1ffdddddddd111111110500500500000000
|
|
002222200000220000222220efe33eeeeeeeeeeeeee33efeeee33eeeeee33eeeff1111ffff111111ff1ff1ff111111ffdddddddd111111110000000000000000
|
|
000222c002222c0000022200efeeee555e555e55e5eeeefee5eeeeffffeeee5effffffffffffffffff1ff1ffffffffffdddddddd111111110005000000000000
|
|
00000cc00000cc0000000cc0efe33e5eeeeeeeeee5e33efee5e33efeefe33e5e1ffffff11fffffffff1ff1fffffffff1dddddddd111111110000500000000000
|
|
0000ff000000000000000000efe33e5e11111111e5e33efee5e33efeefe33e5eff1ff1ffffffffffffffffffffffffff88888888555555555555555588888888
|
|
000f00f0000000000aa00aa0efe33eee11ffff11eee33efeeee33effffe33e5eff1ff1ffffffffffffffffffffffffff88888888558855885588558888888888
|
|
00d0000f000000000aaaaaa0efe33e5e1ff11ff1e5e33efee5e33eeeeee33eeeff1ff1fffff11111ffffffff11111fff88888888888888888888888888888888
|
|
00d0d00f00c040500aaaaaa0efeeee5e1f1111f1e5eeeefee5e333e333333e5eff1ff1fffff1ffffff1111ffffff1fff88888888888888888888888888888888
|
|
00dd00ee00c4455000999900efe33e5e1f1111f1e5e33efee5e333e333333e5eff1111fffff1ffffff1ff1ffffff1fff88888888888888888888888888888888
|
|
00000ee00c44455500aaaa00efe33eee1ff11ff1eee33efeeeeeeeeeeeeeee5efffffffffff11111ff1ff1ff11111fff88888888888888888888888888888888
|
|
00eeee000c004005000aa000efe33e5e11ffff11e5e33efee5555e555e555e5effffffffffffffffff1ff1ffffffffff88888888888888888855885588558855
|
|
eeee0000cc04405500444400efeeee5e11111111e5eeeefeeeeeeeeeeeeeeeeeffffffffffffffffff1ff1ffffffffff88888888888888885555555555555555
|
|
00000000000a90005bbbbbb3efe33eeeeeeeeeeeeee33efeff1ff1ffffffffffffffffff00000000000000000000000000000000000000000000000000000000
|
|
00000aaaaaaa9100bbbbbbbbefe33e5555e555e555e33efeff1ff1ffffffffffffffffff00000000000000000000000000000000000000000000000000000000
|
|
0000aaaaaa1a9110bbb7aabbefe33eeeeeeeeeeeeee33efeff1ff1ff11111111ff1111ff00000000000000000000000000000000000000000000000000000000
|
|
0aaaaaaaaa1a9111bbbaabbbefe333e3333e333e33333efeff1ff1ffffffffffff1ff1ff00000000000000000000000000000000000000000000000000000000
|
|
0aaaaaaaa41a91a1bbaaabbbefee33e3333e333e3333eefeff1ff1ffffffffffff1ff1ff00000000000000000000000000000000000000000000000000000000
|
|
0a000aa4441a91a1bbabbbbbeffeeeeeeeeeeeeeeeeeeffeff1ff1ff11111111ff1111ff00000000000000000000000000000000000000000000000000000000
|
|
00a0044449a110a1bbbbbbbbeeffffffffffffffffffffeeff1ff1ffffffffffffffffff00000000000000000000000000000000000000000000000000000000
|
|
000aa111991111103bbbbbb3eeeeeeeeeeeeeeeeeeeeeeeeff1ff1ffffffffffffffffff00000000000000000000000000000000000000000000000000000000
|
|
0000000099100000f765000000000000000000000000000000000000000000000000000000000000000000000000000011111111111111111999999111111111
|
|
00000000990000007700000000000000000000000000000000000000000000000000000000000000000000000000000019911991999999911999999119999999
|
|
00000000990000006060000000000000000000000000000000000000000000000000000000000000000000000000000019977991999999911999999119999999
|
|
00000000090000005005000000000000000000000000000000000000000000000000000000000000000000000000000019911991999117111991199111711999
|
|
00000000aa0000000000000000000000000000000000000000000000000000000000000000000000000000000000000019911991999117111991199111711999
|
|
0000000077a000000000000000000000000000000000000000000000000000000000000000000000000000000000000019999991999999911997799119999999
|
|
00000007777a00000000000000000000000000000000000000000000000000000000000000000000000000000000000019999991999999911991199119999999
|
|
00044444444444000000000000000000000000000000000000000000000000000000000000000000000000000000000019999991111111111111111111111111
|
|
44444444444004444444444444400444444444444440044444444444444004444444444444400444444444444440044444444444444004444444444444400444
|
|
477dd77447711774477dd77447711774477dd77447711774477dd77447711774477dd77447711774477dd77447711774477dd77447711774477dd77447711774
|
|
47777774477777744777777447777774477777744777777447777774477777744777777447777774477777744777777447777774477777744777777447777774
|
|
4d7117d44d7117d44d7117104d7117104d7117d44d7117d44d7117104d711710017117d4017117d40171171001711710017117d4017117d40171171001711710
|
|
4d7117d44d7117d44d7117104d7117104d7117d44d7117d44d7117104d711710017117d4017117d40171171001711710017117d4017117d40171171001711710
|
|
47777774477777744777777447777774477777744777777447777774477777744777777447777774477777744777777447777774477777744777777447777774
|
|
477dd774477dd774477dd774477dd77447711774477117744771177447711774477dd774477dd774477dd774477dd77447711774477117744771177447711774
|
|
44444444444444444444444444444444444004444440044444400444444004444444444444444444444444444444444444400444444004444440044444400444
|
|
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
|
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
|
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
|
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
|
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
|
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
|
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
|
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
|
000cc0cc0cccccccccccccccccccccccccccccccc0bb000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
|
000cc0cc0000cc0000000000000000000cc0000000bb0bb0bbbb0bbbbb0bbbbb0bbb000000000000000000000000000000000000000000000000000000000000
|
|
000cc0cc0cc0cc0cc0cccccccc0ccccc0cc0ccccc0bb0bb000bb0000bb0bb0bb0bb0b00000000000000000000000000000000000000000000000000000000000
|
|
000cc0cc0cc0cc0cc0cc0cc0cc0000cc0cc0cc0cc0bb0bb0bb000bbbbb0bbb000bb0b00000000000000000000000000000000000000000000000000000000000
|
|
000cc0cc0cc0cc0cc0cc0cc0cc0ccccc0cc0ccccc0bb0bb0bbbb0bbbbb0bb0bb0bbbb00000000000000000000000000000000000000000000000000000000000
|
|
000cc0cc0cc0000cc0cc0cc0cc0cc0cc0cc0cc0000bb000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
|
000ccccc0ccccc0cc0cc0cc0cc0ccccc0cc0ccccc0bbbbbbbbbbbbbbbbbbbbbbbbbbb00000000000000000000000000000000000000000000000000000000000
|
|
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
|
88888888888888888888880aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa00000000000000000000000000000000000000000000000000000000
|
|
0088000000088000000000000000000000000aa00000000000000000aa0000000000000000000000000000000000000000000000000000000000000000000000
|
|
00880888880880888880880aaa00aaa0aaaa0aa0aaaaa0aa0a0aaaa0aa0aa0aaaaa0aaa000000000000000000000000000000000000000000000000000000000
|
|
00880880880880000880880aa0a0aa00aa000aa0aa0aa0aa0a0aa000aa0aa0aa0aa0aa0a00000000000000000000000000000000000000000000000000000000
|
|
00880880880880888880880aa0a0aa0000aa0aa0aaa000aa0a0aa000aa0aa0aa0aa0aa0a00000000000000000000000000000000000000000000000000000000
|
|
00880880880880880880880aaaa0aaa0aaaa0aa0aa0aa0aaaa0aaaa0aa0aa0aaaaa0aa0a00000000000000000000000000000000000000000000000000000000
|
|
00880888880880888880880000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
|
00000000000000000000888888800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
|
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
|
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
|
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
|
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
|
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
|
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
|
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
|
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
|
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
|
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
|
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
|
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
|
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
|
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
|
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
|
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
|
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
|
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
|
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
|
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
|
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
|
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
|
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
|
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
|
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
|
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
|
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
|
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
|
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
|
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
|
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
|
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
|
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
|
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
|
|
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
|
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000c0
|
|
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
|
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000c0
|
|
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
|
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000c0
|
|
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
|
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000c0
|
|
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
|
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000c0
|
|
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
|
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000c0
|
|
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
|
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00000000000000212000000000000c0
|
|
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
|
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00000000000000313000000000000c0
|
|
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
|
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000c0
|
|
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
|
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000c0
|
|
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
|
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000c0
|
|
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
|
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000c0
|
|
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
|
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000c0
|
|
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
|
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000c0
|
|
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
|
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
|
|
__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__
|
|
000000c0c0c0c0c0c0c0c0c0c0c00000000000c0c0c0c0c0c0c0c0c0202020200040c0c0c0c0c0c0c008080800000000404000000808080808080808c0c0c0c000000000080808080808080800000008000000000808080808080808000000000008080808080808080808080000000000080808080808080808080800000000
|
|
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
|
__map__
|
|
0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d1203040404050d0d0d0d010d0d0d0d0d0d0d0d0d0d0d0d0d0d120d0d0d0d0d0d0d0d0d0d0d0d0d03043e0a00000000000000000000000000000000000000000000000000000000000000000d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d
|
|
0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0a0d0d0d0d0a0d0304040405140013004f00150d0d0d1400140d0d0d0d0d0d0d0d0d0d0d0d1400140d0d0d0d0d030404040404041700002600000000000000000000000000000000000000000000000000000000000000000d0d0d0d0d033e0404040404050d0d0d0d0d0d0d
|
|
0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d03042604040404260417000000151400001e0000150304040400040404050d0d0d0d0d03040404050003040404050d130000000000000000001800000000000000000000000000000000000000000000000000000000000000000d0d0d0d0d134400000000001514140d0d0d0d0d
|
|
0d0d0d0d0d0d0d0d0d0a0d0d0d0d0d0d0d14130018000000001800000000001514141300000015130000000000000015030404040513000000160017000000150d1300000000000000421e00000000150d0d0d0d0d0d0d0d0d0a0d0d0d0d0d0d0d0d1300000000000000150d0d0d0d0d12001d0000000000000003040404050d
|
|
0d0d0d0d0d0d0d0d0d260d0d0d0d0d0d010000001e0000004f000000000000150d031700000015130000000000000015130000001513004200001e43000000150d130000000000000000001a000041150d0d0d0d0d0d0d0d0d260d0d0d0d0d0d0d0d13000000001d1d00150d0d0d0d0d0d131c0000000000150013000000150d
|
|
0d0d0d0d0d0d0d0d0d260d0d0d0d0d0d0d1413001a000000001a0000000000150d13000000001513000000000000001513001d1d0000000000000000000000150d232424002424240700002600001e150d0d0d0d0d0d0d0d0d260d0d0d0d0d0d0d0d1346062407471c00150d0d0d0d0d0d231c24241d2424250000000000150d
|
|
0d0d0d0d03040404042604050d0d0d0d0d0d232426242424242624071e001e150d13000000001513000000000000001513001f481523242424070006242424250d0304040004040523242408242400250d0d0d0d03040404041804050d0d0d0d0d0d1346150d131c1f0016040404050d0d031f04051c0d030404170000001605
|
|
0d14141413000000001800151414140d0d0d0d0d080d0d0d0d080d23240024250d23240000242513000000000000001513000000150d0d0d0d2324250d0d0d0d0d3d001c001c003f03040404040400050d1414141300001d1d1d003f1414140d0d0d13441604171f1a0000000000150d0d130000161f053d44001d1d001d0015
|
|
0100000000000000004f0000000000120d0d0304040404050d0d0d0d1400140d0d030400000405130000004f000000151300000015030404050d0d0d030404050d13001c1d1c00151300000000000015010000000000001c1c1c0000000000120d0d13001c000000181d1a1d1a1d150d0d131d1d0000151342001c1c001c003f
|
|
0d14141413000000001a00151414140d0d0d1300000000150d0304040400050d0d13001e1e4f15130000001e00000015130000001513000016040404170000150d13001f401f00151300481e000000150d1414141300001f1f1f003f1414140d0d0d13001f0043003f1f181c181f150d0d131f1f0000151300001c1c1d1c4915
|
|
0d0d0d0d23242424242624250d0d0d0d0d0d1300000000150d1300000000150d0d130000000015130000150013000015130000431513000000000000000000150d1300000000001523242400242424250d0d0d0d23242424241a24250d0d0d0d0d0d13001a001a1d1a00001f0000150d0d230747000015131e1e1f1f1f1f3e15
|
|
0d0d0d0d0d0d0d0d0d260d0d0d0d0d0d0d091b00191b00192727271b1e19270b0d2324240024252324242500232424251300000000004d0000000000000000150d1300000000001503040000040514140d0d0d0d0d0d0d0d0d260d0d0d0d0d0d0d0d131e1800181f18001a00063c250d0d0d2324243c25130040000000000015
|
|
0d0d0d0d0d0d0d0d0d260d0d0d0d0d0d0d0d1300001e4f1e000000004f00150d0d0d03040004050d0d0d1400140d0d0d232424242513000000000000000000150d130000000000151300001d1d0000140d0d0d0d0d0d0d0d0d260d0d0d0d0d0d0d1413000000000000001800000000120d140304040405130000000000000015
|
|
0d0d0d0d0d0d0d0d0d080d0d0d0d0d0d0d0d230024242425141300000000150d0d0d134f1e00151414141400140d0d0d0d0d0d0d0d13000006240024070000150d2324240024242513000040441500140d0d0d0d0d0d0d0d0d080d0d0d0d0d0d0100000000000000062424242514140d0100001d1d483f230024242424242425
|
|
0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d1400140d0d0d0d2324242424250d0d0d13000000000000000000140d0d0d0d0d0d0d0d23242425140014232424250d0d0d1400140d0d13000000001500120d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d1423242424243c250d0d0d0d0d0d0d0d14131f1f00000000140d0d0d0d0d0d
|
|
0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d120d0d0d0d0d0d0d0d0d0d0d0d0d0d23242424251414141414140d0d0d0d0d0d0d0d0d0d0d0d0d010d0d0d0d0d0d0d0d0d010d0d0d232424242425140d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d23242424251414140d0d0d0d0d0d
|
|
0d0d0d0d0d0d0d0d030404040404050d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d010d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
|
0d03040404040405133d00001c00150d0d0d0d0d0d0d0d0d0304043e0404050d0d0d0d0d030404000404050d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
|
0d130000000000151300001d1f00150d0d0d0d0d0d0d0d0d150000000000150d0d0d0d0317420000004816050d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
|
0d13001d1d1e4f000000001c000000010d03040404040405150000000000150d0d0d141300191b1d191b0015140d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
|
0d13001f1f000015131e1e1f1d1d150d0d13460044004c15150000000000150d0d3d001e0042001f0048001e003f0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
|
0d13000000000015130000001c1c150d0d131d1d1e1d1d152324241d2424250d0d140023240700410006242500140d0d0d0d0d0d030404040404050d0d0d0d0d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
|
0927271b1e1e0015130014001c1c150d0d131c3d001c1c000000001f040404050d1400000023243c2425000000140d0d0d0d0d0d130000001c000000000d0d0d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
|
0d131c1c00000000000000001c1c150d0d131f1f1e1f1f1514141300280000150d14000000001f1f1f00000000140d0d0d141414130028001c4516050014140d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
|
0d131c1c0014001513001e1e1927270b0d1300004100001514141300000000010d144f47411400000014000000140d0d01000000000000001f0000150000001200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
|
0d131c1c00000015130000000000150d0927271b001927270b031741280000150d14434b491400000014000000140d0d0d14141413002800000000151414140d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
|
0d131f1f1d1e1e151300001d1d00150d0d131f1c001c1c151f130000004900150d03040404040000000304040405140d0d0d0d0d13000000000006250d0d0d0d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
|
120000001c000000004f1e1f1f00150d0d13001f001f1f0000131d1d000000150d1300000000000003170000000000120d0d0d0d232424242424250d0d0d0d0d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
|
0d13001d1f000015130000000000150d0d1300000000001500232424242424250d13000000001d1d1d0000000015140d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
|
0d13001c00003f15232424242424250d0d1300000000001500140d0d0d0d0d0d0d130000000625031700000000150d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
|
0d232424242424250d0d0d0d0d0d0d0d0d2324242424242500140d0d0d0d0d0d0d130000062503170000000000150d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
|
0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d120d0d0d0d0d0d0d0d232424250d23242424242424250d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
|
__sfx__
|
|
00110000250002500025030250302503000000230350000023030230302303023030230302303023030230302103021030210302103021030210300000000000177401774017740177311e7501e7501e7501e750
|
|
00110000290202a0212a0202a0202a0202a02025030250052503025030250302503025030250302503025030250302503025030250302503225030230322504526030260302a040000002d0402d0402d0402d040
|
|
001100001e7401e7401e7401e74010730107301073010730157301573015730157301573015730157301573015730157301573015730000000000000000000000000000000000000000019030190300000000000
|
|
001100002d0422d0402a0302a0302c0302c0302c0322c0322d0402d0312d0302d0302d0302d0302d0302d0302d0302d0302d0322d03200000000000000000000000000000000000000002b0402c0410000000000
|
|
001100001274012740127401274012740127401274012740177301773017730177301773017730177301773014730147301474014740107401074010740000001573015730157301573009720097300973009730
|
|
001100002a0402a0412a0412a0402a0402a0402a042290412a0412a0402a0402a0402a0402a0402a0422903128041280402804028040280402804226032000002504025040250402603026030260322803200000
|
|
001100000e0300e0300e0300e0300e0300e0300000000000000000000000000000000000000000150301503014030140301403014030120301203012030120300d0200d0200d0200d0200d0200d0200d0200d020
|
|
001100002804028040280402804028040280402104000000210402104021040210402104021040150001500014000140001400014000120001200012000240342503125030250302503025030250322503225032
|
|
00110000150301503015030150301503015030150301503015030150301503015030150301503015030150300b0200b0200b0200b0200b0200b0200b0200b0200b0200b0200b0200b02000000000000000000000
|
|
001100002501425010250102501025010250102501025010250212502025020250202502125020250202502027540275402754027540275402754027540275402703027030270302703027030270302703027030
|
|
001100002312023120231202312023120231202312023120231202312023120231202312023120231202212123141231402314023140231402314021140201401e1401e1401e1401e1401c140001001e14020140
|
|
00110000000000000006322063250d3320d33209320093200932009325093200932509320000001703017030170300b0200b0200b0200b02017030170300b0301403014030140301403514030140300000014330
|
|
0011000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001b0301b0301b030000001b0301b0301b030000001b0301b0301b03000000
|
|
0011000020140201402013020130201302013020130201301d1401e1411e1401e1401c140002001b2401b2401b240000000000022554235512355023550235402354023540235402354023540235402314023140
|
|
0011000000000150301503000000000000e0300e0300e0300e0320e0320e0320e0320e0300e0300e030000000d0300d0300d0300d0300d0300d0300d0300d0300d0300d0300d0300d0300d0300d0300d0300d030
|
|
00110000190331903019030000001a0331a0301a0301a0301a0301a0301a0301a0301a0301a0301a0300000027320273202732027320000000000027320273202732027320273202732000000000000000000000
|
|
00110000211402d1402d145000002a1302a1302a1302a1302a1322a1322a1322a1322a1322a13000100000002c3202c3202d3202d3202f320003002d3302d3302d3302d3302c3312c3302a3302a3302833000000
|
|
001100000b0300b0300b0000b0000b0300b0300b0300b0300b0300b0300b0300b0300b0300b0300b0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
|
001100002704027040000000000027040270402704027040270402704027040270402704027040000000000028020280202a020000002c030000002a0202a02000000000002c0302c0302c0302c0300000000000
|
|
001100002a3302a3302c330003002a3302a3302a3302a3302a3302a3322a3322a3322a3322a332283322a3322c3302c3302d330003002f3302f3052d3302d33000300003002f3302f3302f3302f3302804028045
|
|
00110000000000000015310153101531015310153101531000000000001032010320103201032010320103200e3200e3200e3200e3200e3200e3200e3200e32000000000000d3200d3200d3200d3200d3200d320
|
|
001100003102031022310223102231022310222f0322d0302c030000002a0400000028030000002603026030260302603026030260302603026030000000000029040000002a040000002c040000002d0502d050
|
|
0111000034040340403404034042340423404232042310422f040000002d040000002c040000002a0402a0402a0402a0402a0422a0422a0422a042290402a0402c040000002d040000002f040000003104031040
|
|
001100001203012030120351230010030100301003010030020200202002020020200202002020020200202002020020200202002020020220202202022020220b0400b040000000000010040100400000000000
|
|
0011000000000000002c0402c04000000000002a0302a0302a0302a0302a0302a0302a0302a0302a0302a0302a0302a0302a0302a0302a0302a0302a030000002604026040000000000028040280400000000000
|
|
0011000000000000002f0402f04000000000002d0402d0402d0422d0422d0422d0422d0422d0422d0402d0402d0402d0402d0402d0402d0402d0402d040000002a0402a04000000000002c0302c0300000000000
|
|
001100000932209322093220932209322093220932209322043220432204322043220432204322023220232202322023220232202322023120231204312023120131000000033100000005310000000632006320
|
|
00110000250402504025040250402504025040230402104020040000001e040000001c040000001a0401a0401a0401a0401a0401a0401a0400000000000000000000000000000000000000000000000000000000
|
|
0011000028030280302803028030280302803026030250402304000000210400000020040000001e0401e0401e0401e0401e0401e0401e040000001d0401e0402004000000210400000023040000002504025040
|
|
00110000063200632012310123100431004310103101031002310023100231002310023150200002745017450b7351770017735060001274506000107550400004000107550b7550400004755010000172001722
|
|
00110000250502505023040230402304023040250402303021050210502105221050210502105021050210502a030000002d030000003203000000310403104031040310402f0302d0402f0502f0502d0402c040
|
|
001100000e7450e7050000012745000000070010740107401074210742107421074210740000000e7400e7400d7450d00500000117450000000000127401274012742127421e7421e7421c7401c7451074010745
|
|
001100002a05512005000003205500000000002f0502f0502f0502f0502f0502f0502f050000002c0402a0502905500000000003105500000000002d0402d0402d0402d0402d0402d0402c0402c0402c0402c040
|
|
001100000e0400e0400e0400e0400e0400e0400d040000000b0400b0400b0400b0400b0400b040020400000004040040400404004040040400404504040000000404004040040300400001000010000104001030
|
|
001100002a0402a0402a0402a0400000000000260302503023030230302303023030320503205232052320523104031040310403104031040310402f040000002f0402f0402f0402f0002a0402c0402a04028040
|
|
001100001731517310173151731517020170251033010330103301033010330103300233002325023300232501330013300133501335013300133506330063300633006330063300633004040040400404004040
|
|
00110000173601733023030233300b6630b3352a66317330173302a6532c230282302c230282302a6531a230190301903025030250330b6650b6702a6231e0302a7001e7302a6231e730287301c7302a6231c730
|
|
001100002634026340263403234032340323402f3402f3402f3422f3422f3422f3422f3422f34228342263402533025330253303135031350313502d3402d3402d3422d3422d3422b3412c3412c3422c34229341
|
|
001100000e7300e7300e7300e7300e7300e7300d7300d7300b7400b7400b7400e7400e7400e740100401004010030100300403004030040300403004030040300403004030040300403004030040300403000000
|
|
00110000260301a030260301a030260301a03000000000002304017040230402603017030260302a0401c0402a0401c0402a0401c0402a0401c0402a0401c040280401c040280401c04028040000001c04000000
|
|
00110000293402a3412a3422a3422a3422a34228350000002634026340263403234032340323402f3502f3502f3522f3522f3522f3422f3422f3422f3422f3422f3422f3422f3422f3422f340000002d3402d345
|
|
001100001004010040100401004010040100401004010040100301003010030100301003010030100301003010020100201000010000100051000010000100000000000000000000000000000000000000000000
|
|
001100002604028040260302803026040280402603028030260202802026020280202601028010260102801025010250152500028000250052800025000340000d5100d0300d0300000000000125140603006030
|
|
001100002d3322d3322d3322d3322d3322d3322d3322d3322d3222d3222d3222d3222d3222d3222d3222d3222d4122d4122d4022d4052d4002d4002d400000003843038430384303843500000000003473034730
|
|
001100000601006015000000000000000000000000000000215401a030210400000000000000001c540150301c0400000000000000001e540170301e040000000000000000195401203019040120300d0350d005
|
|
0011000034720347203472034720347250000000000001003173031730317302f7352d735001002c7402c7402c7402d7452f745007002d7502d7502d7502c7452a74500700287402874028740007002574500100
|
|
001100001a0302a0321a0301a0351a0001a00000000000000000000000000000000000000000000000000000000000000000000000002f0401c0222f04000000000001c0202d0422502019040190401904019040
|
|
00110000217302173021710217102171021715217002170021000210002100021000210002100021000210000000000000000001c700387303873038730387300000000000347303473034730347303473034730
|
|
0111000025020250202d0402c0402a140022150e0251202012020151250d2152502019020280351a030230251702026030260301703023030200001c000200301c02023040040200402004020040200000000000
|
|
001100003403034030317302f7302d7302d7302d7202f72031720001002f7402f7402f740007002d740007002a7502a75032750327502f7402f7402f7402f7422f7422f7422f7422f74500700007001c75000700
|
|
00110000253401c34009360093600936009340093401734004340043400434004340043401734002340023400234002340023401a340023400434002340023400134000300033400030005340003000635006350
|
|
001100001c567285303453034540345403454032540315402f540255402d540255402c540255402a5402a5402a5402a54021540215402154021540295302a5302c540235402d540255402f540255403155031550
|
|
00110000000000000000000000000000000000000000000021440204401e4401e4401e4401e4401e4401e4401a44000000174401a000174401a00012440124401224012240102401024010240102400d0000d000
|
|
001100000635006350123401234004350043501034010340023400234002340023400234002340023400234017340230001a3402a0001a340000002d3402d3402d3402d3402c3402a3402c3402c3402d0352c035
|
|
0011000031560255602f5602f5602f56025560315602f5602d5602f5602d5602d5602d5602d5602d5602c5601e16000100211500000026130000002514025140251402514023130211402315023155201001e100
|
|
011100002804026040280402604028030260302803026030280302603028030260302802026020280202602028020250202802025020280102501028010250102801025010280102501028010250102802025020
|
|
001120002d3202d3202d3202d3202d3202d3202d3202d3202d3202d3202d3202d3202d3202d3202d3202d3202d3112d3102d3102d3102d3102d3102d310014000140001400014000140001400014000140001400
|
|
0111000034530345323453234532345323453232532315302f540005002d540005002c540005002a5402a5402a5402a5402a5402a5402a5402a540295402a5402c540005002d540005002f540001003104031040
|
|
001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
|
001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
|
001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
|
001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
|
001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
|
010300000015000250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
|
__music__
|
|
01 00014140
|
|
00 02034340
|
|
00 04054540
|
|
00 06074740
|
|
00 08090a40
|
|
00 0b0c0d40
|
|
00 0e0f1040
|
|
00 11121340
|
|
00 14151640
|
|
00 17181940
|
|
00 1a1b1c40
|
|
00 1d1e5e40
|
|
00 1f206040
|
|
00 21226240
|
|
00 23242540
|
|
00 26272840
|
|
00 292a2b40
|
|
00 2c2d6d40
|
|
00 2e2f6f40
|
|
00 30317140
|
|
00 14153940
|
|
00 17181940
|
|
00 32335472
|
|
00 34353640
|
|
00 1f204040
|
|
00 21224040
|
|
00 23242561
|
|
00 26272840
|
|
02 37387840
|
|
|