2261 lines
88 KiB
Lua
2261 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)
|
|
local ret=split(s,"\n")
|
|
for i,v in ipairs(ret) do
|
|
ret[i] = type(v) == "string" and split(v,"`") or {v} end
|
|
return ret
|
|
end
|
|
|
|
function cycle(tbl,period)
|
|
period = period or 1
|
|
return tbl[t()%period*#tbl\period+1]
|
|
end
|
|
|
|
-- fake sprintf function
|
|
-- %~ for literal "%"
|
|
-- %v for param
|
|
-- %! for tostring(param)
|
|
-- which dumps tables
|
|
function fmt(f, ...)
|
|
local out, i = "", 0
|
|
for s in all(split(f,"%")) do
|
|
if i == 0 then
|
|
-- before first format directive
|
|
out ..= s
|
|
i = 1
|
|
else
|
|
local m = s[1]
|
|
if m == "~" then
|
|
out ..= "%"
|
|
else
|
|
local p = select(i,...)
|
|
i+=1
|
|
if m == "v" then
|
|
out ..= p
|
|
elseif m == "!" then
|
|
out ..= tostring(p)
|
|
else
|
|
out ..= "(?!:"..m..":"..tostring(p)..")"
|
|
end
|
|
end
|
|
out ..=sub(s,2)
|
|
end
|
|
end
|
|
return out
|
|
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") return tostr(any)
|
|
local str = "{ "
|
|
for k,v in pairs(any) do
|
|
str..=tostring(k).."->"..tostring(v).." "
|
|
end
|
|
return str.."}"
|
|
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 = fmt("⬅️ %v ➡️",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 = 0
|
|
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
|
|
anch_new[fmt("GEOM%v,%v,%v,%v",mx0,my0,dx,dy)]= {
|
|
max(mx0,mx1),max(my0,my1),adx=-dx,ady=-dy
|
|
}
|
|
end
|
|
end
|
|
end
|
|
|
|
for _,cr in pairs(self._crates) do
|
|
local mx0,my0=cr.mx,cr.my
|
|
local mx1,my1=mx0+dx,my0+dy
|
|
anch_new[fmt("CRATE%v,%v,%v",cr.id,dx,dy)]={
|
|
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(fmt("ax=%v,ay=%v",n1.ax,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)
|
|
-- row 5 can be omitted
|
|
-- for a 1-line hint
|
|
--
|
|
-- 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
|
|
1`35`34`⁘ sVYY
|
|
1`99`82`■ cHYY
|
|
1`42`98`⁘`VTABER
|
|
2`75`65`i <`⁘
|
|
2`104`73` ■`cHYY
|
|
2`27`42`⁘
|
|
3`51`106`■ cHYY
|
|
3`27`81`⁘ HAOYBPX ZR
|
|
3`91`33`■ FGNAQ` URER]]
|
|
for rec in all(h) do
|
|
rec[4]=rot13(rec[4])
|
|
if(rec[5]) rec[5]=rot13(rec[5])
|
|
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
|
|
|
|
function shdprint(txt,x,y,c)
|
|
print(txt,x-1,y+1,1)
|
|
print(txt,x,y,c)
|
|
end
|
|
|
|
hintflicker=split"7,10,9,8,8,9,10,7"
|
|
function hints:draw2()
|
|
pal()
|
|
local c=cycle(hintflicker)
|
|
|
|
for i,h in ipairs(self[level.ix]) do
|
|
if (i > level.hintlevel) return
|
|
local _,x,y,txt,txt2=unpack(h)
|
|
shdprint(txt,x,y,c)
|
|
if (txt2) shdprint(txt2,x,y+8,c)
|
|
end
|
|
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(fmt("(%v, %v)\n[%v, %v]",x,y,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
|
|
00000000000000000000000000000000c0c0c0c0c021c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c021c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
|
|
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
|
00000000000000000000000000000000c0c100c0c000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c000c0c0c0c0c0c0c0c0c0c00000000000000000000000000000c0
|
|
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
|
00000000000000000000000000000000c0c1002400c1c100c0c0c0c0c0c0c0c0c0c0c0c0c0c000c0c0c0c0c0c0c0c0c0c00000000000000000000000000000c0
|
|
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
|
00000000000000000000000000000000c00000e300c00000c0c0c0c0c0c0c0c0c0c0c10000c000c0c0c0c0c0c0c0c0c0c00000000000000000000000000000c0
|
|
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
|
00000000000000000000000000000000c000000000c000c0c0c0c0c0c0c0c0c0c000000000c100c100f3c0c0c0c0c0c0c00000000000000000000000000000c0
|
|
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
|
000000000000000000000000000000001000340000c000c0c0c0c0c0c0c0c0c01000c034c1c1c1c100c0c0c0c0c0c0c0c00000000000000000000000000000c0
|
|
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
|
00000000000000000000000000000000c000000000c100f3c0c0c0c0c0c0c0c0c00000000000000000c0c0c0c0c0c0c0c00000000000000000000000000000c0
|
|
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
|
00000000000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c00000000000000212000000000000c0
|
|
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
|
00000000000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c00000000000000313000000000000c0
|
|
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
|
00000000000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c00000000000000000000000000000c0
|
|
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
|
00000000000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0100000000000000000000000000000c0
|
|
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
|
00000000000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c00000000000000000000000000000c0
|
|
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
|
00000000000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c00000000000000000000000000000c0
|
|
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
|
00000000000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c00000000000000000000000000000c0
|
|
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
|
00000000000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c00000000000000000000000000000c0
|
|
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
|
00000000000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
|
|
__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__
|
|
0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d1203040404050d0d0d0d010d0d0d0d0d0d0d0d0d0d0d0d0d0d120d0d0d0d0d0d0d0d0d0d0d0d0d03043e0a040404050d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d
|
|
0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0a0d0d0d0d0a0d0304040405140013004f00150d0d0d1400140d0d0d0d0d0d0d0d0d0d0d0d1400140d0d0d0d0d0304040404040417000026000000150d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d030404043e050d0d0d0d0d0d033e0404040404050d0d0d0d0d0d0d
|
|
0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d03042604040404260417000000151400001e0000150304040400040404050d0d0d0d0d03040404050003040404050d1300000000000000000018000000150d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0304041700000000150d0d0d0d0d0d134400000000001514140d0d0d0d0d
|
|
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
|
|
|