chameleonic/chameleonic.p8

1905 lines
72 KiB
Plaintext
Raw Normal View History

2022-12-17 20:16:26 +00:00
pico-8 cartridge // http://www.pico-8.com
version 39
2022-12-17 20:16:26 +00:00
__lua__
-- setup
2022-12-17 20:16:26 +00:00
modules={}
2022-12-18 04:38:49 +00:00
real_modules={}
2022-12-17 20:16:26 +00:00
frame=0
function _init()
_doall("init") end
function _update()
frame+=1
if (frame%1==0) _doall("update") end
function _draw()
_doall("draw") end
mnames={}
function names(root)
local n=mnames[root]
if(n)return all(n)
n={root.."0", root, root.."2", root.."3"}
mnames[root]=n
return all(n)
end
2022-12-17 20:16:26 +00:00
function _doall(x)
for n in names(x) do
2022-12-17 20:16:26 +00:00
for mod in all(modules) do
local f=mod[n]
if (f) f(mod)
2022-12-17 20:16:26 +00:00
end
end
end
-- source: https://www.lexaloffle.com/bbs/?pid=78990
gaps=split"57,23,10,4,1"
2022-12-17 20:16:26 +00:00
--{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
2022-12-17 20:16:26 +00:00
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 d=max(abs(dx),abs(dy))
local n=min(abs(dx),abs(dy))/d
d*=sqrt(n*n+1)
if(d<0.001) return
local ca,sa=dx/d,-dy/d
2022-12-17 20:16:26 +00:00
-- polygon points
local s={
{0,-r},{d,-r},{d,r},{0,r}
}
local u,v,spans=s[4][1],s[4][2],{}
local x0,y0=ax+u*ca+v*sa,ay-u*sa+v*ca
for i=1,4 do
local u,v=s[i][1],s[i][2]
local x1,y1=ax+u*ca+v*sa,ay-u*sa+v*ca
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 then
rectfill(x0,y,span,y)
else
spans[y]=x0
2022-12-17 20:16:26 +00:00
end
x0+=dx
2022-12-17 20:16:26 +00:00
end
x0,y0=_x1,_y1
end
2022-12-17 20:16:26 +00:00
end
function _apply(x,ts,a)
local t=deli(ts,1)
for k,v in pairs(t) do
if k=="update" then
--
2022-12-17 20:16:26 +00:00
else
x[k]=v
end
end
if (t and t.update and not t.update(x,a)) add(ts,t,1)
2022-12-17 20:16:26 +00:00
end
function sgn0(x)
if (x==0) return x
return sgn(x)
2022-12-17 20:16:26 +00:00
end
function _mnmx(x,y)
if (x>y)return y,x
return x,y
2022-12-17 20:16:26 +00:00
end
2022-12-18 04:38:49 +00:00
2022-12-20 05:36:11 +00:00
function _rast(
x0,y0,x1,y1
)
local dx=abs(x1-x0)
local dy=abs(y1-y0)
local x=x0
local y=y0
local sx=-1
local sy=-1
if (x0<x1) sx=1
if (y0<y1) sy=1
local done=false,err
if dx>dy then
err=dx/2.0
return function()
if (done) return
if (x==x1) done=true return x1,y1
local oldx,oldy=x,y
err-=dy
if (err<0) y+=sy err+=dx
2022-12-20 05:36:11 +00:00
x+=sx
return oldx,oldy
end
else
err=dy/2.0
return function()
if (done) return
if (y==y1) done=true return x1,y1
local oldx,oldy=x,y
err-=dx
if (err<0) x+=sx err+=dy
2022-12-20 05:36:11 +00:00
y+=sy
return oldx,oldy
end
end
end
2022-12-18 04:38:49 +00:00
-->8
-- input
2022-12-18 04:38:49 +00:00
kbd={}
add(real_modules,kbd)
function kbd:init()
2022-12-20 00:25:38 +00:00
self.real=btn()
2022-12-18 04:38:49 +00:00
self.down=0
end
function kbd:update()
2022-12-20 00:25:38 +00:00
-- figure out what keys are _really_ pressed
local now_real=btn()
local was_real=self.real
self.real=now_real
-- add keys that are really pressed
-- if they weren't really pressed before
-- (they may have been force-
-- released by :release())
local real_pressed=(~was_real)&now_real
local now_down=(self.down&now_real)|real_pressed
local was_down=self.down
self.down=now_down
-- deduce pressed/released by changes in down
local pressed=(~was_down)&now_down
local released=(~now_down)&was_down
self.pressed=pressed
self.released=released
2022-12-18 04:38:49 +00:00
end
function kbd:btn(i)
return self.down&(1<<i)!=0
end
2022-12-20 00:25:38 +00:00
function kbd:btnp(i)
return self.pressed&(1<<i)!=0
end
function kbd:btnr(i)
return self.released&(1<<i)!=0
end
2022-12-18 04:38:49 +00:00
function kbd:release(i)
self.down&=~(1<<i)
end
function tostring(any)
if type(any)=="function" then
return "function"
end
if any==nil then
return "nil"
end
if type(any)=="string" then
return any
end
if type(any)=="boolean" then
if any then return "true" end
return "false"
end
if type(any)=="table" then
local str = "{ "
for k,v in pairs(any) do
str=str..tostring(k).."->"..tostring(v).." "
end
return str.."}"
end
if type(any)=="number" then
return ""..any
end
return "unknown" -- should never show
end
2022-12-18 04:38:49 +00:00
-->8
-- title screen
2022-12-18 04:38:49 +00:00
title={}
add(modules,title)
function title:init()
end
blinkcol = 10
2022-12-18 04:38:49 +00:00
function title:draw()
cls(0)
-- this is right for 72x32
2022-12-18 05:36:25 +00:00
spr(3,28,56,9,2)
print("pyrex",32,73,7)
print("[nyeogmi]",62,73,7)
print("kistaro",32,79,7)
local lvlstr = "⬅️ "..start_level.." ➡️"
print(lvlstr,50,91,1)
print(lvlstr,51,90,blinkcol)
2022-12-18 04:38:49 +00:00
end
start_level = 0
max_level=15
2022-12-18 04:38:49 +00:00
function title:update()
if time()*4\1%2==0 then
blinkcol=10
else
blinkcol=9
end
if btnp(0) then
start_level -= 1
if (start_level<0) start_level=max_level
end
if btnp(1) then
start_level += 1
if (start_level>max_level) start_level=0
end
if btnp(4) or btnp(5) then
2022-12-18 04:38:49 +00:00
modules=real_modules
_init()
2022-12-18 07:25:42 +00:00
music(0)
2022-12-18 04:38:49 +00:00
end
end
2022-12-20 00:38:21 +00:00
2022-12-17 20:16:26 +00:00
-->8
--level behaviors
2022-12-17 20:16:26 +00:00
level={}
2022-12-18 04:38:49 +00:00
add(real_modules,level)
2022-12-17 20:16:26 +00:00
function level:init()
level:reinit(start_level)
2022-12-17 20:16:26 +00:00
end
function level:reinit(n)
self.ix=n
self.todo={}
self.bigx=(n%8)
self.bigy=(n\8)
self.next_crate_id=1
2022-12-17 20:16:26 +00:00
self:load_dynobjs()
self:recollide()
2022-12-17 23:15:56 +00:00
self:reanchor(true)
2022-12-17 23:08:54 +00:00
self:spawn_exit()
end
2022-12-18 00:25:20 +00:00
function level:restart()
self:reinit(self.ix)
end
2022-12-17 23:08:54 +00:00
function level:advance()
self:reinit(self.ix+1)
2022-12-17 20:16:26 +00:00
end
2022-12-20 00:53:11 +00:00
pitpal = {[0]=1,[7]=0}
2022-12-17 20:16:26 +00:00
function level:draw()
2022-12-17 23:48:52 +00:00
cls(1)
pal(1,0)
2022-12-17 20:16:26 +00:00
map(
2022-12-17 23:08:54 +00:00
self.bigx*16,self.bigy*16,
2022-12-17 20:16:26 +00:00
0,0,16,16,
64 -- flag 6: visible
)
2022-12-17 23:48:52 +00:00
for _,pit in pairs(self._pits) do
spr(pit.s,pit.px,pit.py)
if pit.contents then
pal(pitpal)
2022-12-17 23:48:52 +00:00
palt(0,false)
spr(pit.contents,pit.px,pit.py)
pal()
pal(1,0)
end
2022-12-17 23:48:52 +00:00
end
2022-12-17 20:16:26 +00:00
for _,crate in pairs(self._crates) do
spr(crate.s,crate.px,crate.py)
end
2022-12-17 23:48:52 +00:00
pal()
2022-12-17 20:16:26 +00:00
end
function level:busy()
for _,crate in pairs(self._crates) do
2022-12-17 20:16:26 +00:00
if (#crate.todo>0) return true
end
return false
end
function level:update()
_apply(self, self.todo)
2022-12-17 23:48:52 +00:00
local remove={}
for cix,crate in pairs(self._crates) do
2022-12-17 20:16:26 +00:00
_apply(crate, crate.todo)
2022-12-17 23:48:52 +00:00
if #crate.todo==0 then
local pit=self._pits[_mix(crate.mx,crate.my)]
if pit and not pit.contents then
2022-12-17 23:48:52 +00:00
add(remove,cix)
crate.dead=true
pit.contents=crate.s
end
end
end
for cix in all(remove) do
self._crates[cix]=nil
end
if #remove>0 then
self:recollide()
self:reanchor(true)
2022-12-17 20:16:26 +00:00
end
end
function level:load_dynobjs()
self._crates={}
2022-12-17 23:48:52 +00:00
self._pits={}
2022-12-17 20:16:26 +00:00
for mx=0,15,1 do
for my=0,15,1 do
local mxy=_mix(mx,my)
2022-12-17 23:48:52 +00:00
local px,py=mx*8,my*8
2022-12-17 20:16:26 +00:00
local s=self:_mget(mx,my)
local def=self:_get_cratedef(s)
if def then
2022-12-17 20:16:26 +00:00
self._crates[mxy]={
s=s,def=def,
id=self.next_crate_id,
2022-12-17 20:16:26 +00:00
mx=mx,my=my,
2022-12-17 23:48:52 +00:00
px=px,py=py,
2022-12-17 20:16:26 +00:00
todo={}
}
self.next_crate_id+=1
2022-12-17 20:16:26 +00:00
end
2022-12-17 23:48:52 +00:00
if s==28 then -- pit
self._pits[mxy]={
s=s,
mx=mx,my=my,
px=px,py=py,
contents=nil
}
end
2022-12-17 20:16:26 +00:00
end
end
end
function level:recollide()
self._coll={}
for mx=0,15 do
for my=0,15 do
2022-12-17 20:16:26 +00:00
local mxy=_mix(mx,my)
self._coll[mxy]=
fget(self:_mget(mx,my),7) or
self._crates[mxy]!=nil
end
end
end
function level:reanchor()
local anch_new={}
for dxy in all{{-1,-1},{1,-1},{-1,1},{1,1}} do
local dx,dy=unpack(dxy)
assert(dx!=0 and dy!=0)
for mx0=0,15 do
for my0=0,15 do
local mx1,my1=mx0+dx,my0+dy
if (
self:mcoll(mx0,my0) and not self:get_crate(mx0,my0) and
not self:mcoll(mx0,my1) and
not self:mcoll(mx1,my0) and
not self:mcoll(mx1,my1)
) then
local key="GEOM"..mx0..","..my0..","..dx..","..dy
anch_new[key]= {
ax=max(mx0,mx1),ay=max(my0,my1),adx=-dx,ady=-dy
}
end
end
2022-12-20 02:01:02 +00:00
end
for _,cr in pairs(self._crates) do
local key="CRATE"..cr.id..","..dx..","..dy
local mx0,my0=cr.mx,cr.my
local mx1,my1=mx0+dx,my0+dy
anch_new[key]={
ax=max(mx0,mx1),ay=max(my0,my1),adx=-dx,ady=-dy
}
end
2022-12-17 20:16:26 +00:00
end
local anch_old=self._anch
if (anch_old==nil) anch_old={}
for _,old in pairs(anch_old) do
old.dropped=true
end
2022-12-17 20:16:26 +00:00
for k,new in pairs(anch_new) do
local old=anch_old[k]
if old then
anch_new[k]=old
old.ax,old.ay,old.adx,old.ady=new.ax,new.ay,new.adx,new.ady
old.dropped=nil
2022-12-17 20:16:26 +00:00
end
end
self._anch=anch_new
self._anch_keys={}
for k,_ in pairs(self._anch) do
add(self._anch_keys,{key=k})
2022-12-19 01:37:00 +00:00
end
if (player.rope!=nil) player.rope:relax()
2022-12-17 20:16:26 +00:00
end
2022-12-17 23:08:54 +00:00
function level:win_at(mx,my)
return self._wins[_mix(mx,my)]
end
2022-12-17 20:16:26 +00:00
function level:anchor_points()
keys=all(self._anch_keys)
return function()
local k=keys()
if (k==nil) return nil
return self._anch[k.key]
end
end
2022-12-17 23:48:52 +00:00
function level:get_open_pit(mx,my)
local pit=self._pits[_mix(mx,my)]
if (pit and pit.contents==nil) return pit
end
2022-12-17 23:08:54 +00:00
function level:spawn_exit()
self._wins={}
local spawned=false
local spawn_at=function(x,y)
if (self:_mget(x,y)!=1) return
assert(not spawned,x..","..y)
spawned=true
player:reinit(x,y)
2022-12-17 23:15:56 +00:00
player.orientx=-1
if (x<8) player.orientx=1
2022-12-17 23:08:54 +00:00
end
local win_at=function(x,y)
2022-12-18 04:39:58 +00:00
if (self:_mget(x,y)!=18) return
for nx=x-1,x+1 do
for ny=y-1,y+1 do
if nx<0 or ny<0 or nx>15 or ny>15 then
self._wins[_mix(nx,ny)]=true
end
2022-12-17 23:08:54 +00:00
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
2022-12-17 20:16:26 +00:00
function level:mcoll(mx,my)
2022-12-17 23:08:54 +00:00
return self._coll[_mix(mx,my)]!=false
2022-12-17 20:16:26 +00:00
end
function level:pcoll(px,py)
return self:mcoll(px\8,py\8)
end
function level:get_crate(mx,my)
return self._crates[_mix(mx,my)]
end
function level:_mget(mx,my)
return mget(
self.bigx*16+mx,
self.bigy*16+my
)
end
function _amix(ax,ay)
return ax..","..ay
--if (ax<0 or ay<0 or ax>31 or ay>31) return nil
--return ay*32+ax
end
function _mix(mx,my)
return mx..","..my
--if (mx<0 or my<0 or mx>15 or my>15) return nil
--return my*16+mx
end
function level:_get_cratedef(s)
if (s<64 or s>=80) return nil
local s2=s-64
return {
up=s2&1!=0,
right=s2&2!=0,
down=s2&4!=0,
left=s2&8!=0
}
end
function level:get_latch(dx,dy,px,py)
local mx,my=px\8,py\8
local mxy=_mix(mx,my)
local crate=self._crates[mxy]
2022-12-19 00:46:46 +00:00
local dx1,dy1=-sgn0(dx),-sgn0(dy)
2022-12-17 20:16:26 +00:00
if crate then
if
(crate.def.up and dy>0) or
(crate.def.down and dy<0) or
(crate.def.left and dx>0) or
(crate.def.right and dx<0)
then
return {
el="crate",
2022-12-19 00:46:46 +00:00
dx=dx1,dy=dy1,
ax_offset=dx1*0.5,
ay_offset=dy1*0.5,
2022-12-17 20:16:26 +00:00
rec=crate
}
end
end
local m=self:_mget(mx,my)
if
2022-12-19 00:46:46 +00:00
(m==60 and dy1<0) or
(m==61 and dx1>0) or
(m==62 and dy1>0) or
(m==63 and dx1<0)
2022-12-17 20:16:26 +00:00
then
return {
el="eyehook",
2022-12-19 00:46:46 +00:00
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},
2022-12-17 20:16:26 +00:00
}
end
end
function level:can_move(
2022-12-17 23:08:54 +00:00
is_player,
2022-12-17 20:16:26 +00:00
mx0,my0,dmx,dmy,exclude_src,exclude_dst
)
2022-12-17 23:08:54 +00:00
if is_player and self:win_at(mx0+dmx,my0+dmy) then
return true
end
if is_player and self:get_open_pit(mx0+dmx,my0+dmy) then
return wrongbleep:adequately_warned()
end
2022-12-17 23:08:54 +00:00
2022-12-17 20:16:26 +00:00
if self:mcoll(mx0+dmx,my0+dmy) then
return false
end
2022-12-18 00:57:47 +00:00
if player.x==mx0+dmx and player.y==my0+dmy then
return false
end
2022-12-17 20:16:26 +00:00
-- todo: check tongue collision
if player.rope then
local chk=false
if dmx==0 and dmy==-1 then
chk=player.rope:collide_mrect(mx0,my0-1,1,2,exclude_src,exclude_dst)
2022-12-17 20:16:26 +00:00
elseif dmx==0 and dmy==1 then
chk=player.rope:collide_mrect(mx0,my0,1,2,exclude_src,exclude_dst)
2022-12-17 20:16:26 +00:00
elseif dmx==-1 and dmy==0 then
chk=player.rope:collide_mrect(mx0-1,my0,2,1,exclude_src,exclude_dst)
2022-12-17 20:16:26 +00:00
elseif dmx==1 and dmy==0 then
chk=player.rope:collide_mrect(mx0,my0,2,1,exclude_src,exclude_dst)
2022-12-17 20:16:26 +00:00
end
if (chk) return false
end
return true
end
function level:tug_crate(mx0,my0,dmx,dmy)
local mxy0=_mix(mx0,my0)
local existing=self._crates[mxy0]
if (existing==nil) return
self._crates[mxy0]=nil
local mx1,my1=mx0+dmx,my0+dmy
local mxy1=_mix(mx1,my1)
existing.todo={
{px=mx1*8+dmx,py=my1*8+dmy,mx=mx1,my=my1,update=function()
self:recollide()
self:reanchor()
2022-12-17 20:16:26 +00:00
return true
end},
{px=mx1*8,py=my1*8}
2022-12-17 20:16:26 +00:00
}
self._crates[mxy1]=existing
2022-12-20 05:36:11 +00:00
end
2022-12-17 20:16:26 +00:00
-->8
--player handling
2022-12-17 20:16:26 +00:00
player={}
2022-12-18 04:38:49 +00:00
add(real_modules,player)
2022-12-17 20:16:26 +00:00
function player:init()
--self:reinit(8,14)
2022-12-18 00:25:20 +00:00
-- don't change this on reinit:
-- it stays the same when the level is changed or reloaded
self.vanish_frame=0
2022-12-17 20:16:26 +00:00
end
function player:reinit(x,y)
self.x=x
self.y=y
self.px=0
self.py=0
self.todo={}
2022-12-17 23:48:52 +00:00
self.fall_frame=0
2022-12-18 00:25:20 +00:00
self.reset_frame=0
2022-12-17 20:16:26 +00:00
self.orientx=-1
self.orienty=0
self.rope=nil
end
function player:any_busy()
if (#self.todo>0) return true
if (level:busy()) return true
return false
end
function player:update()
local _addall=function(t,xs)
for i in all(xs) do
add(t,i)
end
end
local f4 = function(xs)
-- todo: other anim stuff
xs[#xs].px=0
xs[#xs].py=0
return xs
end
2022-12-18 00:25:20 +00:00
-- this is a non-gameplay action that takes precedence over
-- all gameplay actions
self:_vanish_if_requested()
2022-12-17 20:16:26 +00:00
if not self:any_busy() then
2022-12-17 23:08:54 +00:00
if level:win_at(self.x,self.y) then
level:advance()
return
end
2022-12-17 23:48:52 +00:00
if level:get_open_pit(self.x,self.y) then
self.todo={{update=self._fall}}
return
end
2022-12-18 04:38:49 +00:00
if kbd:btn(0) then
2022-12-20 00:25:38 +00:00
self.orientx=-1
self.orienty=0
2022-12-18 04:38:49 +00:00
elseif kbd:btn(1) then
2022-12-20 00:25:38 +00:00
self.orientx=1
self.orienty=0
2022-12-18 04:38:49 +00:00
elseif kbd:btn(2) then
2022-12-20 00:25:38 +00:00
self.orienty=-1
2022-12-18 04:38:49 +00:00
elseif kbd:btn(3) then
2022-12-20 00:25:38 +00:00
self.orienty=1
end
if kbd:btn(4) then
if kbd:btnp(4) and self.rope!=nil then
self.rope:destroy()
kbd:release(4)
2022-12-17 20:16:26 +00:00
end
2022-12-20 00:25:38 +00:00
-- wait for user to release it
else
if kbd:btn(0) then
if level:can_move(true,self.x,self.y,-1,0,0,2) then
self.todo=f4({{orientx=-1,orienty=0,px=-2},{px=-7},{x=self.x-1}})
2022-12-20 00:38:21 +00:00
else wrongbleep:bleep() end
2022-12-20 00:25:38 +00:00
elseif kbd:btn(1) then
if level:can_move(true,self.x,self.y,1,0,0,2) then
self.todo=f4({{orientx=1,orienty=0,px=2},{px=7},{x=self.x+1}})
2022-12-20 00:38:21 +00:00
else wrongbleep:bleep() end
2022-12-20 00:25:38 +00:00
elseif kbd:btn(2) then
if level:can_move(true,self.x,self.y,0,-1,0,2) then
self.todo=f4({{orienty=-1,py=-2},{py=-7},{y=self.y-1}})
2022-12-20 00:38:21 +00:00
else wrongbleep:bleep() end
2022-12-20 00:25:38 +00:00
elseif kbd:btn(3) then
if level:can_move(true,self.x,self.y,0,1,0,2) then
self.todo=f4({{orienty=1,py=2},{py=7},{y=self.y+1}})
2022-12-20 00:38:21 +00:00
else wrongbleep:bleep() end
2022-12-20 00:25:38 +00:00
elseif self.rope==nil and kbd:btnr(4) then
local dx,dy=self.orientx,self.orienty
2022-12-17 20:16:26 +00:00
if (dy!=0) dx=0
local x,y=self.x,self.y
while not level:mcoll(x,y) do x+=dx y+=dy end
self.rope=rope:new(
x+0.5-dx*0.5,y+0.5-dy*0.5,
self.x+0.5,self.y+0.1,
level:get_latch(dx,dy,x*8,y*8)
)
2022-12-17 20:16:26 +00:00
self.todo={{
update=function()
2022-12-18 04:10:01 +00:00
return self.rope==nil or self.rope:latched()
2022-12-17 20:16:26 +00:00
end
2022-12-20 00:25:38 +00:00
}}
elseif kbd:btnp(5) then
if self.rope!=nil then
if (not self.rope:tug()) wrongbleep:bleep(9)
2022-12-20 00:25:38 +00:00
end
2022-12-17 20:16:26 +00:00
end
end
end
_apply(self,self.todo)
if self.rope then
self.rope:update()
self.rope:drag_dst(self.x+self.px/8+0.5,self.y+self.py/8+0.1)
2022-12-17 20:16:26 +00:00
2022-12-18 00:57:47 +00:00
local tdx,tdy=self.rope:tug_orientxy()
if (tdx!=0) self.orientx=tdx
if (tdy!=0) self.orienty=tdy
2022-12-17 20:16:26 +00:00
if self.rope:done() then
self.rope=nil
end
end
end
2022-12-18 00:25:20 +00:00
function player:_vanish_if_requested()
2022-12-18 04:38:49 +00:00
if kbd:btn(5) then
2022-12-18 00:25:20 +00:00
self.vanish_frame+=1
2022-12-18 00:26:30 +00:00
if (self.fall_frame>0 or self.vanish_frame>20) then
self.rope=nil
2022-12-18 00:25:20 +00:00
level:restart()
2022-12-18 04:38:49 +00:00
kbd:release(5)
2022-12-18 00:26:30 +00:00
self.vanish_frame=20
2022-12-18 00:25:20 +00:00
end
else
self.vanish_frame-=1
2022-12-17 23:48:52 +00:00
end
2022-12-18 00:25:20 +00:00
self.vanish_frame=max(self.vanish_frame,0)
end
function player:_fall()
if (self.fall_frame<10) self.fall_frame+=1
2022-12-17 23:48:52 +00:00
end
2022-12-17 20:16:26 +00:00
function player:draw()
local px=self.x*8+self.px+wrongbleep:vibrate()
local py=self.y*8+self.py+wrongbleep:vibrate()
2022-12-17 20:16:26 +00:00
2022-12-18 04:38:49 +00:00
local head=1-self.orienty
2022-12-17 23:48:52 +00:00
local vanish_level=max((self.vanish_frame-4)/16,0)
2022-12-18 00:25:20 +00:00
local invis_level=max(self.fall_frame/10,4*(vanish_level-0.75))
if (invis_level>=1.0) return
--px+=sin(vanish_level*16)*max(vanish_level-0.1,0)*1
local HEAD=14--3
local BODY=12--12
local TAIL=14--14
local IRIS=7--9
local PUPIL=0--0
local setpal=function()
-- base colors
pal{
[2]=HEAD,
[3]=HEAD,
[4]=BODY,
[5]=BODY,
[9]=IRIS,
[10]=PUPIL,
[12]=BODY,
[13]=TAIL,
[14]=TAIL,
[15]=TAIL,
}
-- vanish colors
local vanish=split"13,15,14,5,4,12,2,3,9,10"
for i,ilc in ipairs(vanish) do
if (vanish_level>i/#vanish) pal(ilc,1)
end
2022-12-18 00:25:20 +00:00
if self.fall_frame>3 then
local zc=@0x5f00&0xf0
for i=0x5f00,0x5f0c,4 do poke4(i,0x0101.0101) end
poke(0x5f00,zc|0x01)
end
2022-12-17 23:48:52 +00:00
end
2022-12-17 20:16:26 +00:00
if self.orientx==-1 then
setpal()
2022-12-17 20:16:26 +00:00
spr(16,px+6,py-2,1,1)
spr(17,px+1,py,1,1)
2022-12-19 02:14:15 +00:00
if (self.rope and invis_level<=0.25) pal() self.rope:draw(-2,-1) setpal()
2022-12-17 20:16:26 +00:00
spr(head,px-3,py-3,1,1)
else
setpal()
2022-12-17 20:16:26 +00:00
spr(16,px-6,py-2,1,1,true)
spr(17,px-1,py,1,1,true)
2022-12-19 02:14:15 +00:00
if (self.rope and invis_level<=0.25) pal() self.rope:draw(2,-1) setpal()
2022-12-17 20:16:26 +00:00
spr(head,px+3,py-3,1,1,true)
end
2022-12-17 23:48:52 +00:00
pal()
2022-12-17 20:16:26 +00:00
end
-->8
-- rope physics
2022-12-17 20:16:26 +00:00
rope={}
rope.__index=rope
function rope:new(
src_ax,src_ay,dst_ax,dst_ay,latch
2022-12-17 20:16:26 +00:00
)
local r={
id=0,
anchors={
{ax=src_ax,ay=src_ay,prev=nil,next=nil},
{ax=dst_ax,ay=dst_ay,prev=nil,next=nil}
},
state={name="cast",frame=0},
latch=latch,
2022-12-17 20:16:26 +00:00
}
r.src=r.anchors[1]
r.dst=r.anchors[2]
r.src.next=r.dst
r.dst.prev=r.src
2022-12-17 20:16:26 +00:00
setmetatable(r,rope)
return r
end
2022-12-18 04:10:01 +00:00
function rope:latched()
return self.state.name=="latched"
2022-12-17 20:16:26 +00:00
end
function rope:done()
2022-12-18 04:10:01 +00:00
return self.state.name=="done"
2022-12-17 20:16:26 +00:00
end
function rope:update()
2022-12-18 04:10:01 +00:00
if self.state.name=="cast" then
self.state.frame+=1
if (self.state.frame>=3) self.state={name="latched"}
2022-12-18 04:10:01 +00:00
elseif self.state.name=="latched" then
if (self.latch==nil) wrongbleep:bleep(5) self:destroy() return
2022-12-19 00:07:15 +00:00
if
self.latch!=nil and
self.latch.rec!=nil
then
self:drag_src(
self.latch.rec.mx+0.5+self.latch.ax_offset,
self.latch.rec.my+0.5+self.latch.ay_offset
2022-12-19 00:07:15 +00:00
)
if self.latch.rec.dead==true then
self:destroy()
2022-12-19 00:07:15 +00:00
end
end
if (not self:_check_sane()) self:destroy()
2022-12-18 04:10:01 +00:00
elseif self.state.name=="destroy" then -- destroy
self.state.frame+=1
if (self.state.frame>=5) self.state={name="done"}
2022-12-18 22:53:58 +00:00
else
-- done state
2022-12-17 20:16:26 +00:00
end
2022-12-18 04:10:01 +00:00
end
2022-12-17 20:16:26 +00:00
2022-12-18 04:10:01 +00:00
function rope:destroy()
if (self.state.name=="destroy" or self.state.name=="done") return
self.state={name="destroy",frame=0}
2022-12-17 20:16:26 +00:00
end
2022-12-19 02:14:15 +00:00
function rope:draw(artificial_dx,artificial_dy)
2022-12-18 22:53:58 +00:00
local points,highlight=self:_tug(true)
2022-12-18 04:10:01 +00:00
if (self.state.name=="done") return
local perc_to_show=1.0
if (self.state.name=="cast") perc_to_show=self.state.frame/2
2022-12-18 04:10:01 +00:00
if (self.state.name=="destroy") perc_to_show=(1.0-self.state.frame/5)^2
2022-12-19 02:14:15 +00:00
points[#points]={x=points[#points].x+artificial_dx,y=points[#points].y+artificial_dy}
2022-12-18 04:10:01 +00:00
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=#points-1,1,-1 do
2022-12-17 20:16:26 +00:00
local src=points[i]
local dst=points[i+1]
2022-12-18 04:10:01 +00:00
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)
dx,dy=dx*coef,dy*coef
2022-12-17 20:16:26 +00:00
2022-12-18 22:53:58 +00:00
local color=8
2022-12-19 00:46:46 +00:00
if (highlight==i) color=12
2022-12-18 22:53:58 +00:00
linefill(x,y,x+0.25*dx,y+0.25*dy,1.0,color)
linefill(x+0.25*dx,y+0.25*dy,x+1*dx,y+1*dy,0.5,color)
linefill(x+0.9*dx,y+0.9*dy,x+dx,y+dy,1.0,color)
circfill(x+dx+0.5,y+dy+0.5,1.0,color)
2022-12-18 04:10:01 +00:00
end
2022-12-17 20:16:26 +00:00
end
2022-12-19 00:46:46 +00:00
-- draw latch
if self.latch!=nil and self.latch.rec and perc_to_show>=1.0 then
local x,y=self.latch.rec.px,self.latch.rec.py
2022-12-19 00:46:46 +00:00
local ldx,ldy=self.latch.dx,self.latch.dy
local color=8
if (highlight==0) color=12
if self.latch.dx==-1 and self.latch.dy==0 then
rectfill(x,y+3,x+2,y+4,color)
2022-12-19 00:46:46 +00:00
elseif self.latch.dx==1 and self.latch.dy==0 then
rectfill(x+5,y+3,x+7,y+4,color)
2022-12-19 00:46:46 +00:00
elseif self.latch.dx==0 and self.latch.dy==-1 then
rectfill(x+3,y,x+4,y+2,color)
2022-12-19 00:46:46 +00:00
elseif self.latch.dx==0 and self.latch.dy==1 then
rectfill(x+3,y+5,x+4,y+7,color)
2022-12-19 00:46:46 +00:00
end
end
-- debug
2022-12-20 05:36:11 +00:00
--[[
local n1=self.src
local sy=0
while true do
if (n1==nil) break
local x=n1.ax*8
local y=n1.ay*8
if n1.associated_with then
if (n1.associated_with.adx>0) x-=1
if (n1.associated_with.ady>0) y-=1
end
rectfill(x-1,y-1,x+1,y+1,12)
print("ax="..n1.ax..",ay="..n1.ay,0,sy)
sy+=7
local n0=n1.prev
local n2=n1.next
if n0!=nil and n2!=nil then
if n1.associated_with then
local _,_,_,adx,ady=would_stick(n0.ax,n0.ay,n1.associated_with,n2.ax,n2.ay)
assert(adx==-1 or adx==0 or adx==1)
assert(ady==-1 or ady==0 or ady==1)
--assert(not (adx==0 and ady==0))
local c=3
if (n1.associated_with.dropped) c=8
rectfill(x+2,y+2,x+4,y+4,c)
pset(x+adx*2,y,9)
pset(x,y+ady*2,9)
else
rectfill(x+2,y+2,x+4,y+4,2)
end
else
rectfill(x+2,y+2,x+4,y+4,4)
end
n1=n1.next
end
2022-12-17 20:16:26 +00:00
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)
2022-12-17 20:16:26 +00:00
end
]]
2022-12-17 20:16:26 +00:00
end
function rope:drag_dst(x,y)
self:drag(self.dst,x,y)
2022-12-17 20:16:26 +00:00
end
function rope:drag_src(x,y)
self:drag(self.src,x,y)
2022-12-17 20:16:26 +00:00
end
function rope:drag(n1,ax_new,ay_new)
self:relax()
self:_drag(n1,ax_new,n1.ay)
self:_drag(n1,ax_new,ay_new)
self:relax()
2022-12-20 02:01:02 +00:00
end
function rope:relax()
local n=self.src
2022-12-18 23:18:07 +00:00
while true do
if (n==nil) break
if (n.associated_with) then
self:_drag(n,n.associated_with.ax,n.associated_with.ay)
end
n=n.next
end
local n0=self.src
while true do
if (n0==nil) return
local n1=n0.next
if (n1==nil) return
local n2=n1.next
if (n2==nil) return
if n1.associated_with!=nil then
local x0,y0=n0.ax,n0.ay
local x1,y1=n1.ax,n1.ay
local x2,y2=n2.ax,n2.ay
local would,x1_new,y1_new=would_stick(x0,y0,n1.associated_with,x2,y2)
if not would and not (n1.ax==x1_new and n1.ay==y1_new) then
--printh("relaxing: "..tostring(n0.associated_with).."->"..tostring(n1.associated_with).."->"..tostring(n2.associated_with))
self:_drag(n1,x1_new,y1_new)
n0=n1.prev
n2=n1.next
n0.next=n2
n2.prev=n0
n1.next=nil
n1.prev=nil
else n0=n0.next end
else n0=n0.next end
end
end
function rope:_check_sane()
if (self.state.name!="latched") return true
if (level:busy()) return true
local n0=self.src
local qxs,qys={},{}
while true do
local n1=n0.next
if (n1==nil) break
for qx,qy in _rast(flr(n0.ax*2),flr(n0.ay*2),flr(n1.ax*2),flr(n1.ay*2)) do
if not (qx==qxs[#qxs] and qy==qys[#qys]) then
add(qxs,qx)
add(qys,qy)
end
end
n0=n1
end
2022-12-17 21:52:37 +00:00
local function _possible_tiles(qx,qy)
local mx0=(qx-1)\2
local mx1=qx\2
local my0=(qy-1)\2
local my1=qy\2
2022-12-19 00:07:15 +00:00
local poss={}
for mx=mx0,mx1 do
for my=my0,my1 do
add(poss,{mx=mx,my=my})
end
2022-12-19 00:07:15 +00:00
end
return poss
2022-12-19 00:07:15 +00:00
end
local function _blocked(qx,qy)
for i in all(_possible_tiles(qx,qy)) do
if (not level:mcoll(i.mx,i.my)) return false
end
return true
end
-- find cases where i move through an impassable zone
for i=1,#qxs do
if (_blocked(qxs[i],qys[i])) return false
end
-- find cases where i am cut off diagonally
for i=3,#qxs do
local qx1,qy1=qxs[i-1],qys[i-1]
if qx1%2==0 and qy1%2==0 then
local ok=false
for m0 in all(_possible_tiles(qxs[i-2],qys[i-2])) do
for m2 in all(_possible_tiles(qxs[i],qys[i])) do
local mx0,my0=m0.mx,m0.my
local mx2,my2=m2.mx,m2.my
if not (level:mcoll(mx0,my0) or level:mcoll(mx2,my2)) then
local dmx,dmy=abs(mx2-mx0),abs(my2-my0)
if dmx==1 and dmy==1 and level:mcoll(mx0,my2) and level:mcoll(mx2,my0) then
else
--printh("ok! "..tostring({qxs[i-2],qys[i-2]})..tostring({qxs[i],qys[i]})..tostring(m0)..tostring(m2))
ok=true
end
end
end
end
2022-12-19 00:07:15 +00:00
if (not ok) return false
end
end
return true
2022-12-17 20:16:26 +00:00
end
function would_stick(x0,y0,anchor,x2,y2)
local x1,y1=anchor.ax,anchor.ay
if (x0>x2) x0,y0,x2,y2=x2,y2,x0,y0
2022-12-17 20:16:26 +00:00
local dx=x2-x0
local dy=y2-y0
2022-12-17 20:16:26 +00:00
local adx,ady
local x1_new,y1_new
if abs(dx)>abs(dy) then
local dprop=(x1-x0)/dx
x1_new,y1_new=x1,y0+dprop*(y2-y0)
ady=sgn0(y1_new-y1)
adx=0
if (y0>y2) adx=ady
if (y0<y2) adx=-ady
else
local dprop=(y1-y0)/dy
x1_new,y1_new=x0+dprop*(x2-x0),y1
adx=sgn0(x1_new-x1)
ady=0
if (y0>y2) ady=adx
if (y0<y2) ady=-adx
2022-12-17 20:16:26 +00:00
end
local wouldnt=anchor.dropped or (anchor.adx==-adx or anchor.ady==-ady)
2022-12-17 20:16:26 +00:00
return not wouldnt,x1_new,y1_new,adx,ady
2022-12-17 20:16:26 +00:00
end
function rope:_drag(n1,ax1_new,ay1_new)
local function _sweep_radar(ax_pivot,ay_pivot,ax_far0,ay_far0,ax_far1,ay_far1)
if (ax_far0==ax_far1 and ay_far0==ay_far1) return nil
local function crossed(x,y)
return x!=y
end
2022-12-17 20:16:26 +00:00
if ax_far0==ax_far1 then
local ax_far=ax_far0
local ax0,ax1=_mnmx(ax_pivot,ax_far)
ay_far_old=ay_far0
for ay_far_new in _stepfrom(ay_far0,ay_far1) do
for anchor in level:anchor_points() do
if
not (anchor.ax==ax_pivot and anchor.ay==ay_pivot) and
not (anchor.ax==ax_far0 and anchor.ay==ay_far0) and
not (anchor.ax==ax_far1 and anchor.ay==ay_far1) and
(ax0<=anchor.ax and anchor.ax<=ax1) and
would_stick(ax_pivot,ay_pivot,anchor,ax_far,ay_far_new) and
crossed(
_which_side(anchor.ax,anchor.ay,ax_pivot,ay_pivot,ax_far,ay_far_old),
_which_side(anchor.ax,anchor.ay,ax_pivot,ay_pivot,ax_far,ay_far_new)
)
then
return anchor
end
end
ay_far_old=ay_far_new
end
elseif ay_far0==ay_far1 then
local ay_far=ay_far0
local ay0,ay1=_mnmx(ay_pivot,ay_far)
ax_far_old=ax_far0
for ax_far_new in _stepfrom(ax_far0,ax_far1) do
for anchor in level:anchor_points() do
if
not (anchor.ax==ax_pivot and anchor.ay==ay_pivot) and
not (anchor.ax==ax_far0 and anchor.ay==ay_far0) and
not (anchor.ax==ax_far1 and anchor.ay==ay_far1) and
would_stick(ax_pivot,ay_pivot,anchor,ax_far_new,ay_far) and
(ay0<=anchor.ay and anchor.ay<=ay1) and
crossed(
_which_side(anchor.ax,anchor.ay,ax_pivot,ay_pivot,ax_far_old,ay_far),
_which_side(anchor.ax,anchor.ay,ax_pivot,ay_pivot,ax_far_new,ay_far)
)
then
return anchor
end
end
ax_far_old=ax_far_new
end
2022-12-17 20:16:26 +00:00
end
end
local ax1_old,ay1_old=n1.ax,n1.ay
n1.ax=ax1_new
n1.ay=ay1_new
2022-12-17 20:16:26 +00:00
local n0=n1.prev
while true do
if (n0==nil) break
local anch=_sweep_radar(n0.ax,n0.ay,ax1_old,ay1_old,ax1_new,ay1_new)
if (anch==nil) break
local n05={ax=anch.ax,ay=anch.ay,associated_with=anch,prev=n0,next=n1}
--printh("creating post: "..tostring(n0.associated_with).."->"..tostring(n05.associated_with).."->"..tostring(n1.associated_with))
n0.next=n05
n1.prev=n05
n0=n05
end
2022-12-17 20:16:26 +00:00
local n2=n1.next
while true do
if (n2==nil) break
local anch=_sweep_radar(n2.ax,n2.ay,ax1_old,ay1_old,ax1_new,ay1_new)
if (anch==nil) break
local n15={ax=anch.ax,ay=anch.ay,associated_with=anch,prev=n1,next=n2}
--printh("creating post: "..tostring(n1.associated_with).."->"..tostring(n15.associated_with).."->"..tostring(n2.associated_with))
n1.next=n15
n2.prev=n15
n2=n15
2022-12-17 20:16:26 +00:00
end
end
function _stepfrom(x0,x1)
local done=false
if x0==x1 then
return function()
if (done) return nil
done=true return x0
2022-12-17 20:16:26 +00:00
end
end
local mul=0.5
x0*=2
x1*=2
if (x0>x1) x0,x1,mul=-x0,-x1,-mul
local i=flr(x0)
local top=flr(x1)
return function()
if (done) return nil
i+=1
if i>top then
done = true
if (x1!=flr(x1)) return mul*x1
return nil
end
return mul*i
end
2022-12-17 20:16:26 +00:00
end
function _which_side(x,y,x0,y0,x1,y1)
return sgn0((x1-x0)*(y-y0) - (y1-y0)*(x-x0))
2022-12-17 20:16:26 +00:00
end
2022-12-18 04:10:01 +00:00
function distance_dxy(dx,dy)
return sqrt(dx*dx+dy*dy)
end
2022-12-17 20:16:26 +00:00
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
mx0+=0.4
my0+=0.4
mx1-=0.4
my1-=0.4
while true do
local n1=n0.next
if (n1==nil) return false
local nd=n0
for i=1,exclude_dst do
nd=nd.next
if (nd==nil) return false
end
if exclude_src<=0 then
if (_line_line(n0.ax,n0.ay,n1.ax,n1.ay,mx0,my0,mx1,my0)) return true
if (_line_line(n0.ax,n0.ay,n1.ax,n1.ay,mx0,my0,mx0,my1)) return true
if (_line_line(n0.ax,n0.ay,n1.ax,n1.ay,mx0,my1,mx1,my1)) return true
if (_line_line(n0.ax,n0.ay,n1.ax,n1.ay,mx1,my0,mx1,my1)) return true
end
exclude_src-=1
n0=n1
2022-12-17 20:16:26 +00:00
end
end
function _line_line(x1,y1,x2,y2,x3,y3,x4,y4)
local denom=((y4-y3)*(x2-x1)-(x4-x3)*(y2-y1))
local ua=
((x4-x3)*(y1-y3)-(y4-y3)*(x1-x3))/denom
if (ua<0 or ua>1) return false
local ub=
((x2-x1)*(y1-y3)-(y2-y1)*(x1-x3))/denom
if (ub<0 or ub>1) return false
return true
end
-->8
-- moved here because it's complicated
2022-12-18 00:57:47 +00:00
function rope:tug_orientxy()
local a1=self.dst
local a0=self.dst.prev
local dx=a0.ax-a1.ax
2022-12-18 00:57:47 +00:00
local tdx=0
if (dx>3/8) tdx=1
if (dx<-3/8) tdx=-1
2022-12-18 00:57:47 +00:00
local dy=a0.ay-a1.ay
2022-12-18 00:57:47 +00:00
local tdy=0
if abs(dy)>abs(dx)/2 then
if (dy>3/8) tdy=1
if (dy<-3/8) tdy=-1
2022-12-18 00:57:47 +00:00
end
return tdx,tdy
end
2022-12-17 20:16:26 +00:00
function rope:tug()
2022-12-18 04:10:01 +00:00
if (not self:latched()) return
return self:_tug()
2022-12-17 20:16:26 +00:00
end
2022-12-18 22:53:58 +00:00
function rope:_tug(hypothetically)
2022-12-17 20:16:26 +00:00
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])
2022-12-20 02:01:02 +00:00
local ops_to_do,corners={}
2022-12-19 00:07:15 +00:00
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])
2022-12-19 00:46:46 +00:00
ops_to_do=ops_after_trash
end
local ops=ops_to_do
2022-12-19 00:07:15 +00:00
2022-12-18 22:53:58 +00:00
if #ops>0 then
if (hypothetically) return ancs,i-1
2022-12-17 20:16:26 +00:00
local dmx,dmy=ops[1].dmx,ops[1].dmy
for o in all(ops) do
2022-12-20 02:01:02 +00:00
level:tug_crate(o.mx,o.my,o.dmx,o.dmy)
2022-12-17 20:16:26 +00:00
end
2022-12-20 00:38:21 +00:00
return true
2022-12-17 20:16:26 +00:00
end
end
local latch=self.latch
2022-12-20 00:38:21 +00:00
if latch!=nil and latch.el=="crate" then
2022-12-17 20:16:26 +00:00
local dmx,dmy=
sgn0(latch.dx),
sgn0(latch.dy)
2022-12-19 00:07:15 +00:00
local obj_anc=ancs[1]
local pull_anc=ancs[2]
2022-12-19 00:07:15 +00:00
local pull_dx=pull_anc.x-obj_anc.x
local pull_dy=pull_anc.y-obj_anc.y
2022-12-17 20:16:26 +00:00
local mx0=latch.rec.mx
local my0=latch.rec.my
2022-12-19 00:07:15 +00:00
local mxa=(pull_anc.x+dmx)\8
local mya=(pull_anc.y+dmy)\8
2022-12-17 20:16:26 +00:00
local invalid_move=false
2022-12-17 20:16:26 +00:00
if
2022-12-19 00:07:15 +00:00
(dmx!=0 and sgn0(pull_dx)!=dmx) or
(dmy!=0 and sgn0(pull_dy)!=dmy) or
2022-12-17 20:16:26 +00:00
sgn0(mx0-mxa)!=
sgn0(mx0+dmx-mxa) or
sgn0(my0-mya)!=
sgn0(my0+dmy-mya)
then
invalid_move=true
2022-12-17 20:16:26 +00:00
end
if not invalid_move and
2022-12-17 23:08:54 +00:00
level:can_move(false,mx0,my0,dmx,dmy,1,0)
2022-12-17 20:16:26 +00:00
then
2022-12-19 00:46:46 +00:00
if (hypothetically) return ancs,0
2022-12-18 22:53:58 +00:00
level:tug_crate(mx0,my0,dmx,dmy)
2022-12-20 00:38:21 +00:00
return true
2022-12-17 20:16:26 +00:00
end
end
2022-12-18 22:53:58 +00:00
2022-12-20 00:38:21 +00:00
if (hypothetically) return ancs,nil
return false
2022-12-17 20:16:26 +00:00
end
function rope:_calc_push(
2022-12-19 01:20:59 +00:00
an,a0,a1,af
2022-12-17 20:16:26 +00:00
)
local ops={}
2022-12-19 00:50:19 +00:00
if (an==nil) return ops
2022-12-19 01:20:59 +00:00
2022-12-17 20:16:26 +00:00
if a0.x==a1.x then
2022-12-19 01:20:59 +00:00
-- no far side applying pressure?
2022-12-17 20:16:26 +00:00
local y0,y1=_mnmx(a0.y,a1.y)
2022-12-18 22:53:58 +00:00
local my0,my1,smy=(y0+1)\8,(y1-1)\8,1
if a0.y>a1.y then
my0,my1=my1,my0
smy=-smy
end
2022-12-17 20:16:26 +00:00
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
2022-12-18 22:53:58 +00:00
for my=my0,my1,smy do
2022-12-17 20:16:26 +00:00
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)
2022-12-18 22:53:58 +00:00
local mx0,mx1,smx=(x0+1)\8,(x1-1)\8,1
if a0.x>a1.x then
mx0,mx1=mx1,mx0
smx=-smx
end
2022-12-17 20:16:26 +00:00
local my,dmy
if a0.y%8==0 and a0.y>an.y+6 then
-- push up
my=(a0.y-1)\8
dmy=-1
2022-12-19 00:07:15 +00:00
elseif a0.y%8==7 and a0.y<an.y-6 then
2022-12-17 20:16:26 +00:00
-- push down
my=(a0.y+1)\8
dmy=1
else
return {}
end
2022-12-18 22:53:58 +00:00
for mx=mx0,mx1,smx do
2022-12-17 20:16:26 +00:00
add(ops,{mx=mx,my=my,dmx=0,dmy=dmy})
end
end
2022-12-19 00:46:46 +00:00
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==nil then
break
else
if not level:can_move(false,o.mx,o.my,o.dmx,o.dmy,0,0) then
break
end
end
add(ops2,o)
end
end
return ops2
2022-12-17 20:16:26 +00:00
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!=nil do
local point={
x=flr(a.ax*8+0.5),y=flr(a.ay*8+0.5),
ax=a.ax,ay=a.ay
}
if a.associated_with then
if (a.associated_with.adx==1) point.x-=1
if (a.associated_with.ady==1) point.y-=1
elseif a.prev==nil and self.latch then
if (self.latch.ax_offset<0) point.x-=1
if (self.latch.ay_offset<0) point.y-=1
end
2022-12-17 20:16:26 +00:00
if #points<=1 then
add(points,point)
2022-12-17 20:16:26 +00:00
elseif abs(
_slope(points[#points-1],points[#points])-
_slope(points[#points],point)
2022-12-17 20:16:26 +00:00
)==0 then -- epsilon?
points[#points]=point
2022-12-17 20:16:26 +00:00
else
add(points,point)
2022-12-17 20:16:26 +00:00
end
a=a.next
2022-12-17 20:16:26 +00:00
end
return points
end
2022-12-20 00:38:21 +00:00
-->8
--wrongbleeps
wrongbleep={}
add(real_modules,wrongbleep)
function wrongbleep:init()
self.duration=0
self.continuous=0
2022-12-20 00:38:21 +00:00
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)
2022-12-20 00:38:21 +00:00
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
2022-12-20 00:38:21 +00:00
2022-12-17 20:16:26 +00:00
__gfx__
000030000000002200003000000cc0cc0cccccccccccccccccccccccccccccccc0bb0000000000000000000000000000dddddddd000000000005000000000000
003333300000332200333330000cc0cc0000cc0000000000000000000cc0000000bb0bb0bbbb0bbbbb0bbbbb0bbb0000dddddddd000000000000500000000000
2022-12-19 01:53:13 +00:00
099333990039932009333339000cc0cc0cc0cc0cc0cccccccc0ccccc0cc0ccccc0bb0bb000bb0000bb0bb0bb0bb0b000dddddddd000000000000000000000000
09a333a9033a932009333339000cc0cc0cc0cc0cc0cc0cc0cc0000cc0cc0cc0cc0bb0bb0bb000bbbbb0bbb000bb0b000dddddddd000000005005005000000000
023333323333320000222220000cc0cc0cc0cc0cc0cc0cc0cc0ccccc0cc0ccccc0bb0bb0bbbb0bbbbb0bb0bb0bbbb000dddddddd000000000500500500000000
2022-12-19 01:53:13 +00:00
002222200000220000222220000cc0cc0cc0000cc0cc0cc0cc0cc0cc0cc0cc0000bb0000000000000000000000000000dddddddd000000000000000000000000
000222c002222c0000022200000ccccc0ccccc0cc0cc0cc0cc0ccccc0cc0ccccc0bbbbbbbbbbbbbbbbbbbbbbbbbbb000dddddddd000000000005000000000000
00000cc00000cc0000000cc0000000000000000000000000000000000000000000000000000000000000000000000000dddddddd000000000000500000000000
2022-12-19 01:53:13 +00:00
0000ff00000000000000000088888888888888888888880aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa11111111000000000000000000000000
000f00f0000000000aa00aa00088000000088000000000000000000000000aa00000000000000000aa0000000000000011111111000000000000000000000000
00d0000f000000000aaaaaa000880888880880888880880aaa00aaa0aaaa0aa0aaaaa0aa0a0aaaa0aa0aa0aaaaa0aaa011111111000000000000000000000000
00d0d00f00c040500aaaaaa000880880880880000880880aa0a0aa00aa000aa0aa0aa0aa0a0aa000aa0aa0aa0aa0aa0a11111111000000000000000000000000
00dd00ee00c445500099990000880880880880888880880aa0a0aa0000aa0aa0aaa000aa0a0aa000aa0aa0aa0aa0aa0a11111111000000000000000000000000
00000ee00c44455500aaaa0000880880880880880880880aaaa0aaa0aaaa0aa0aa0aa0aaaa0aaaa0aa0aa0aaaaa0aa0a11111111000000000000000000000000
00eeee000c004005000aa00000880888880880888880880000000000000000000000000000000000000000000000000011111111000000000000000000000000
eeee0000cc0440550044440000000000000000000000888888800000000000000000000000000000000000000000000011111111000000000000000000000000
2022-12-18 05:36:25 +00:00
00000000000a90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000aaaaaaa91000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000aaaaaa1a91100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0aaaaaaaaa1a91110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0aaaaaaaa41a91a10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0a000aa4441a91a10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00a0044449a110a10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
000aa111991111100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
2022-12-19 02:59:45 +00:00
000000009910000000000000000000000000000000000000000000000000000000000000000000000000000000000000ddd00ddddddddddddddddddddddddddd
000000009900000000000000000000000000000000000000000000000000000000000000000000000000000000000000ddd00ddddddddddddddddddddddddddd
000000009900000000000000000000000000000000000000000000000000000000000000000000000000000000000000ddd77ddddddddddddddddddddddddddd
000000000900000000000000000000000000000000000000000000000000000000000000000000000000000000000000ddd00dddddd00700ddd00ddd00700ddd
00000000aa00000000000000000000000000000000000000000000000000000000000000000000000000000000000000ddd00dddddd00700ddd00ddd00700ddd
0000000077a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000ddddddddddddddddddd77ddddddddddd
00000007777a000000000000000000000000000000000000000000000000000000000000000000000000000000000000ddddddddddddddddddd00ddddddddddd
000444444444440000000000000000000000000000000000000000000000000000000000000000000000000000000000ddddddddddddddddddd00ddddddddddd
2022-12-17 23:48:52 +00:00
77077077777007777707707777700777770770777770077777077077777007777707707777700777770770777770077777077077777007777707707777700777
77777777777007777777777777700777777777777770077777777777777007777777777777700777777777777770077777777777777007777777777777700777
07777770077777700777777707777777077777700777777007777777077777777777777077777770777777777777777777777770777777707777777777777777
77700777777007777770070077700700777007777770077777700700777007000070077700700777007007000070070000700777007007770070070000700700
77700777777007777770070077700700777007777770077777700700777007000070077700700777007007000070070000700777007007770070070000700700
07777770077777700777777707777777077777700777777007777777077777777777777077777770777777777777777777777770777777707777777777777777
77777777777777777777777777777777777007777770077777700777777007777777777777777777777777777777777777700777777007777770077777700777
77077077770770777707707777077077777007777770077777700777777007777707707777077077770770777707707777700777777007777770077777700777
2022-12-17 20:16:26 +00:00
__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__
2022-12-18 05:36:25 +00:00
000000000808080808080808c00000000000000008080808080808080000000040400000080808080808080800000000404000000808080808080808c0c0c0c000000000080808080808080800000000000000000808080808080808000000000000000008080808080808080000000000000000080808080808080800000000
2022-12-17 20:16:26 +00:00
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
__map__
0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e
0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c00000000000000000000000000000c000000000000000000000000000000000e0000000000000000000000000000000e0000000000000000000000000000000e0000000000000000000000000000000e0000000000000000000000000000000e000000000000000000000000000000
0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c00000000000000000000000000000c000000000000000000000000000000000e0000000000000000000000000000000e0000000000000000000000000000000e0000000000000000000000000000000e0000000000000000000000000000000e000000000000000000000000000000
0c000000000044000c0c0c0c0c0c0c0c0c00000000000000000000000000000c000000000000000000000000000000000e0000000000000000000000000000000e0000000000000000000000000000000e0000000000000000000000000000000e0000000000000000000000000000000e000000000000000000000000000000
0c0000000000000000000000000000000c00000000000000000000000000000c000000000000000000000000000000000e00000000000e0e0e0e0000000000000e000000000e000000000000000000000e0000000000000000000000000000000e0000000000000000000000000000000e000000000000000000000000000000
0c00000000001c0000000000000000000000000000000000000000000000000c000000000000000000000000000000000e00000000000000000e0000000000000e000000000e000e00000000000000000e0000000000000000000000000000000e0000000000000e0e000000000000000e00000000000e0e0e0e000000000000
0c0000000000000000000000000000410000000000000000000000000000000c0000000000000e0e0e000000000000000e00000000000000000e0000000000000e000000000e000e00000000000000000e00000000000e0e0e000000000000000e00000000000e0000000000000000000e00000000000000000e000000000000
0c000000000000000c0c0c0c0c0c0c0c0c00000000000020210000000000000c00000000000e00000e0e0000000000000e0000000000000e0e0e0000000000000e000000000e0e0e0e0e0000000000000e00000000000e0000000000000000000e00000000000e0e0e000000000000000e000000000000000e00000000000000
0c0c0c0c0c0c00000000000c0c0c0c0c0c00000000000030310000000000000c000000000000000e0e000000000000000e00000000000000000e0000000000000e0000000000000e00000000000000000e00000000000e0e0e000000000000000e00000000000e00000e0000000000000e0000000000000e0000000000000000
0c00000000000c0c004f000c0c0c0c0c0c00000000000000000000000000000c0000000000000e0e00000000000000000e00000000000e0e0e0e0000000000000e0000000000000e00000000000000000e000000000000000e000000000000000e0000000000000e0e000000000000000e0000000000000e0000000000000000
2022-12-20 02:01:02 +00:00
0c00000c4f00000000000000000000120100000000000000000000000000000c00000000000e0e0e0e0e0000000000000e0000000000000000000000000000000e0000000000000e00000000000000000e00000000000e0e0e000000000000000e0000000000000000000000000000000e000000000000000000000000000000
3d0000000000003f0c000c0c0c0c0c0c0c00000000000000000000000000000c000000000000000000000000000000000e0000000000000000000000000000000e0000000000000000000000000000000e0000000000000000000000000000000e0000000000000000000000000000000e000000000000000000000000000000
0c0000000000000000000c0c0c0c0c0c0c00000000000000000000000000000c000000000000000000000000000000000e0000000000000000000000000000000e0000000000000000000000000000000e0000000000000000000000000000000e0000000000000000000000000000000e000000000000000000000000000000
010000000000000c0c0c0c0c0c0c0c0c0c00000000000000000000000000000c000000000000000000000000000000000e0000000000000000000000000000000e0000000000000000000000000000000e0000000000000000000000000000000e0000000000000000000000000000000e000000000000000000000000000000
0c0c0c0c00000c0c0c0c0c0c0c0c0c0c0c00000000000000000000000000000c000000000000000000000000000000000e0000000000000000000000000000000e0000000000000000000000000000000e0000000000000000000000000000000e0000000000000000000000000000000e000000000000000000000000000000
0c0c0c0c00410c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c000000000000000000000000000000000e0000000000000000000000000000000e0000000000000000000000000000000e0000000000000000000000000000000e0000000000000000000000000000000e000000000000000000000000000000
0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e
0c00000000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0e0000000000000000000000000000000e000000000000000000000000000000
0c004f000000000c001c1c000c0c000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0c0c0c00000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c3e0c0c0c0c0c0e0000000000000000000000000000000e000000000000000000000000000000
0c0000000000000000000000000c000c0c00000000000000000c00000000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c000000000000000000000c0c0c0c0c0c0000000000000000000c000000000c0c000000000000000000001c0000000c0e000000000e000000000000000000000e000000000000000000000000000000
0c0000000c0c0000000c000000001c120100000000000000004f000000000012010000000000001c004f0000000000120100000000000000004f1c000000001201000000000000000047000000000012010000000000000000401c00000000120e000000000e0000000e0000000000000e000000000e00000e0e0e0000000000
0c000c000c0c0000000c0c0c0000000c0c00000000000000000c00000000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c000000000000000000000c0c0c0c0c0c0000000000000000000c000000000c0c000000000000000000001c0000000c0e000000000e0000000e000e000000000e000000000e00000e00000000000000
0c000c0000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0c0c0c00000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c3c0c0c0c0c0c0e000000000e0000000e0e0e0e0000000e000000000e00000e0e0e0000000000
01000c0c00000000000c0c004f00000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0e000000000e00000000000e000000000e000000000e000000000e0000000000
0c0000000000000c00000c000000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0e000000000e00000000000e000000000e000000000e000000000e0000000000
0c00004f0000000c0c000c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0e0000000000000000000000000000000e000000000e00000e0e0e0000000000
0c00000000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0e0000000000000000000000000000000e000000000000000000000000000000
0c00000c00000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0e0000000000000000000000000000000e000000000000000000000000000000
0c000c0c0c0000000c0c0c004f00000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0e0000000000000000000000000000000e000000000000000000000000000000
0c00000c00000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0e0000000000000000000000000000000e000000000000000000000000000000
0c00000000001c00000000000000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0e0000000000000000000000000000000e000000000000000000000000000000
0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e
2022-12-18 07:25:42 +00:00
__sfx__
01280000050550c05511055180551d05500000000000000000055070550c0550f055130550f0550c0550705501055080550d055140551905500000000000000000055070550f0551305518055130550f0550c055
0128000000000000001f0001f055200551f0551d055180551b055000000000000000000000000000000000000000000000000001b0551d0551b05519055140551805500000000000000000000000000000000000
01280000050550c05511055180551d05518055110550d0550c055130551b055240552b0551b05518055130550a055110551a05522055290550e0550a05505055000550705510055180551f055100550c05507055
012800000000000000130001f055220552005500000270551f0550000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
012800001d4521d452050550c05514055110551f452204522445224452050550c055140551105526452264522745227452080550f055180551405526452244522245222452030550a0551f4521f4521b4521b452
012800001d4521d4520105508055110550d0551f452204522445224452050550c055140551105526452264522745227452070550e0551f4521f4522645226452244522445200055070550f0520f0550e0550c055
00280000000000000000000000000505500000050550c055000000000000000050050505500000050550c055000000000000000000000805500000080550f05500000000000000000000030550a0550205509055
012800000122401222000000000001055000000105508055052220522200000000000505500000050550c05507222072220000000000022220222202222022220022200222000000000000055070550005507055
012800001d3541f3542035420300203040000027354273501f350000001d3001d3541b354000001f354000001d3541f3542035422354243542635027354293502b3540000024354000002935429350293502b350
012800000000000000010550805501055080050105508055000550800000000070550005507055000550705500000000000105508055010550805501055080550005500000070550000000055000000705500000
01280010183541a3541b3540000000000000002235400000213540000026354000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
01281000080050f005080550f05501055000000f055000000e3550000013355000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
2022-12-20 00:38:21 +00:00
001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
010300000015000250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
2022-12-18 07:25:42 +00:00
__music__
01 00014344
00 02034344
00 04064344
00 05074344
00 08094344
02 0a0b4344