12 Commits

Author SHA1 Message Date
709be93332 Tidy up more loose ends 2022-12-20 21:42:20 -08:00
535fcf7601 Clean up some residual messes 2022-12-20 21:37:09 -08:00
c98194550e Everything _seems_ to work 2022-12-20 20:45:33 -08:00
c71cd312b1 First version I couldn't immediately break 2022-12-20 16:27:08 -08:00
ca819b0e53 Save current changes 2022-12-20 15:18:01 -08:00
281ed4b40f Elide points as needed 2022-12-20 15:04:00 -08:00
60f1c2e112 Well, this is closer to right!! 2022-12-20 13:48:23 -08:00
b0d356aeee One final note 2022-12-19 23:29:22 -08:00
6821d6cb53 Add further algo notes 2022-12-19 23:28:26 -08:00
675ef20115 Add comment expressing uncertainty 2022-12-19 23:22:37 -08:00
a7b016c4b2 We should only care about anchors on the old path 2022-12-19 23:20:48 -08:00
f3df6c674a Rope rewrite, part one 2022-12-19 23:15:55 -08:00

View File

@ -305,7 +305,7 @@ function level:advance()
self:reinit(self.ix+1)
end
pitpal = {[0]=1,[7]=0,[6]=1,[4]=1}
pitpal = {[0]=1,[7]=0}
function level:draw()
cls(1)
pal(1,0)
@ -450,7 +450,7 @@ function level:reanchor()
local old=anch_old[k]
if old then
anch_new[k]=old
old.ax_old,old.ay_old,old.ax,old.ay,old.adx,old.ady=old.ax,old.ay,new.ax,new.ay,new.adx,new.ady
old.ax,old.ay,old.adx,old.ady=new.ax,new.ay,new.adx,new.ady
old.dropped=nil
end
end
@ -459,17 +459,6 @@ function level:reanchor()
for k,_ in pairs(self._anch) do
add(self._anch_keys,{key=k})
end
shellsort(self._anch_keys)
for point in self:anchor_points() do
if point.ax_old!=nil then
if (player.rope!=nil) player.rope:be_pushed_by(point,point.ax_old,point.ay_old)
point.ax_old=nil
point.ay_old=nil
end
end
for point in self:anchor_points() do
assert(not point.dropped)
end
if (player.rope!=nil) player.rope:relax()
end
@ -612,9 +601,6 @@ function level:can_move(
if is_player and self:win_at(mx0+dmx,my0+dmy) then
return true
end
if is_player and self:get_open_pit(mx0+dmx,my0+dmy) then
return wrongbleep:adequately_warned()
end
if self:mcoll(mx0+dmx,my0+dmy) then
return false
@ -628,13 +614,13 @@ function level:can_move(
if player.rope then
local chk=false
if dmx==0 and dmy==-1 then
chk=player.rope:collide_mrect(mx0+0.4,my0-0.8,0.2,1.6,exclude_src,exclude_dst)
chk=player.rope:collide_mrect(mx0,my0-1,1,2,exclude_src,exclude_dst)
elseif dmx==0 and dmy==1 then
chk=player.rope:collide_mrect(mx0+0.4,my0+0.2,0.2,1.6,exclude_src,exclude_dst)
chk=player.rope:collide_mrect(mx0,my0,1,2,exclude_src,exclude_dst)
elseif dmx==-1 and dmy==0 then
chk=player.rope:collide_mrect(mx0-0.8,my0+0.4,1.6,0.2,exclude_src,exclude_dst)
chk=player.rope:collide_mrect(mx0-1,my0,2,1,exclude_src,exclude_dst)
elseif dmx==1 and dmy==0 then
chk=player.rope:collide_mrect(mx0+0.2,my0+0.4,1.6,0.2,exclude_src,exclude_dst)
chk=player.rope:collide_mrect(mx0,my0,2,1,exclude_src,exclude_dst)
end
if (chk) return false
@ -771,7 +757,7 @@ function player:update()
self.rope=rope:new(
x+0.5-dx*0.5,y+0.5-dy*0.5,
self.x+0.5,self.y+0.5,
self.x+0.5,self.y+0.1,
level:get_latch(dx,dy,x*8,y*8)
)
@ -782,28 +768,17 @@ function player:update()
}}
elseif kbd:btnp(5) then
if self.rope!=nil then
if (not self.rope:tug()) wrongbleep:bleep(9)
if (not self.rope:tug()) wrongbleep:bleep(7)
end
end
end
end
if self.rope then
self.rope:update()
end
_apply(self,self.todo)
if self.rope then
self.rope:update()
if self.rope:done_reeling() then
self.x=self.rope.latch.rec.mx+self.rope.latch.dx
self.y=self.rope.latch.rec.my+self.rope.latch.dy
end
local rx=self.x+self.px/8+0.5
local ry=self.y+self.py/8+0.5
-- do the hokey pokey to work out kinks in the rope
self.rope:drag_dst(rx,ry)
self.rope:drag_dst(self.x+self.px/8+0.5,self.y+self.py/8+0.1)
local tdx,tdy=self.rope:tug_orientxy()
if (tdx!=0) self.orientx=tdx
@ -837,9 +812,8 @@ function player:_fall()
end
function player:draw()
local px=self.x*8+self.px+wrongbleep:vibrate()
local py=self.y*8+self.py+wrongbleep:vibrate()
local px=self.x*8+self.px
local py=self.y*8+self.py
local head=1-self.orienty
@ -882,29 +856,17 @@ function player:draw()
end
end
local rx,ry=self.x*8+self.px+1,self.y*8+self.py+2
if (self.orientx==1) rx+=6
if self.rope then
local rx_adj,ry_adj=self.rope:affected_src_xy(rx,ry)
if rx_adj!=nil then
local drx,dry=rx_adj-rx,ry_adj-ry
rx,ry=rx+drx,ry+dry
px,py=px+drx,py+dry
end
end
if self.orientx==-1 then
setpal()
spr(16,px+6,py-2,1,1)
spr(17,px+1,py,1,1)
if (self.rope and invis_level<=0.25) pal() self.rope:draw(self.x*8+self.px+1,self.y*8+self.py+2) setpal()
if (self.rope and invis_level<=0.25) pal() self.rope:draw(-2,-1) 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()
if (self.rope and invis_level<=0.25) pal() self.rope:draw(2,-1) setpal()
spr(head,px+3,py-3,1,1,true)
end
pal()
@ -943,17 +905,13 @@ function rope:done()
return self.state.name=="done"
end
function rope:done_reeling()
return self.state.name=="done" and self.state.reelin
end
function rope:update()
if self.state.name=="cast" then
self.state.frame+=1
if (self.state.frame>=3) self.state={name="latched"}
elseif self.state.name=="latched" then
if (self.latch==nil) wrongbleep:bleep(5) self:destroy() return
if (self.latch==nil) wrongbleep:bleep(3) self:destroy() return
if
self.latch!=nil and
@ -973,61 +931,25 @@ function rope:update()
elseif self.state.name=="destroy" then -- destroy
self.state.frame+=1
if (self.state.frame>=5) self.state={name="done",reelin=self.state.reelin}
if (self.state.frame>=5) self.state={name="done"}
else
-- done state
end
end
function rope:destroy(reelin)
function rope:destroy()
if (self.state.name=="destroy" or self.state.name=="done") return
self.state={name="destroy",frame=0,reelin=reelin}
self.state={name="destroy",frame=0}
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)
function rope:draw(artificial_dx,artificial_dy)
local points,highlight=self:_tug(true)
if (self.state.name=="done") return
local perc_to_show=1.0
local from_end=false
if (self.state.name=="cast") perc_to_show=self.state.frame/2
if (self.state.name=="destroy") perc_to_show=(1.0-self.state.frame/8)^2
if (self.state.reelin) from_end=true
if (self.state.name=="destroy") perc_to_show=(1.0-self.state.frame/5)^2
points[#points]={x=artificial_px,y=artificial_py}
points[#points]={x=points[#points].x+artificial_dx,y=points[#points].y+artificial_dy}
local len=0
for i=1,#points-1 do
@ -1036,9 +958,7 @@ function rope:draw(artificial_px,artificial_py)
local len_to_show=perc_to_show*len
local len_cumulative=0
local ia,iz,istep=#points-1,1,-1
if (from_end) ia,iz,istep=1,#points-1,1
for i=ia,iz,istep do
for i=#points-1,1,-1 do
local src=points[i]
local dst=points[i+1]
@ -1051,13 +971,7 @@ function rope:draw(artificial_px,artificial_py)
if len_here>0 and dist_base>0 then
local coef=min(len_here/dist_base,1.0)
if from_end then
x,y=x+dx-dx*coef,y+dy-dy*coef
dx,dy=dx*coef,dy*coef
else
dx,dy=dx*coef,dy*coef
end
local color=8
if (highlight==i) color=12
@ -1070,7 +984,7 @@ function rope:draw(artificial_px,artificial_py)
end
-- draw latch
if self.latch!=nil and self.latch.rec and (perc_to_show>=1.0 or from_end) then
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
local ldx,ldy=self.latch.dx,self.latch.dy
local color=8
@ -1112,7 +1026,7 @@ function rope:draw(artificial_px,artificial_py)
--assert(not (adx==0 and ady==0))
local c=3
if (n1.associated_with.dropped) c=4
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)
@ -1165,20 +1079,6 @@ function rope:relax()
n=n.next
end
local n0=self.src
while true do
local n1=n0.next
if (n1==nil) break
local n2=n1.next
if n0.ax==n1.ax and n0.ay==n1.ay then
n0.next=n2
n2.prev=n0
else
n0=n0.next
end
end
local n0=self.src
while true do
if (n0==nil) return
@ -1209,7 +1109,7 @@ function rope:relax()
end
function rope:_check_sane()
if (not self:latched()) return true
if (self.state.name!="latched") return true
if (level:busy()) return true
local n0=self.src
@ -1283,6 +1183,7 @@ 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
local dx=x2-x0
local dy=y2-y0
@ -1290,7 +1191,6 @@ function would_stick(x0,y0,anchor,x2,y2)
local adx,ady
local x1_new,y1_new
if abs(dx)>abs(dy) then
if (x0>x2) dx,x0,y0,x2,y2=-dx,x2,y2,x0,y0
local dprop=(x1-x0)/dx
x1_new,y1_new=x1,y0+dprop*(y2-y0)
ady=sgn0(y1_new-y1)
@ -1298,66 +1198,25 @@ function would_stick(x0,y0,anchor,x2,y2)
if (y0>y2) adx=ady
if (y0<y2) adx=-ady
else
if (y0>y2) dy,x0,y0,x2,y2=-dy,x2,y2,x0,y0
local dprop=(y1-y0)/dy
x1_new,y1_new=x0+dprop*(x2-x0),y1
adx=sgn0(x1_new-x1)
ady=0
if (x0>x2) ady=adx
if (x0<x2) ady=-adx
if (y0>y2) ady=adx
if (y0<y2) ady=-adx
end
local wouldnt=anchor.dropped or (anchor.adx!=adx or anchor.ady!=ady)
local wouldnt=anchor.dropped or (anchor.adx==-adx or anchor.ady==-ady)
return not wouldnt,x1_new,y1_new,adx,ady
end
function rope:be_pushed_by(anchor,ax_old,ay_old)
local n0=self.src
local ax_new,ay_new=anchor.ax,anchor.ay
while true do
n1=n0.next
if (n1==nil) return
local nx0,ny0=n0.ax,n0.ay
local nx1,ny1=n1.ax,n1.ay
if
not (anchor.ax==nx0 and anchor.ay==ny0) and
not (anchor.ax==nx1 and anchor.ay==ny1) and
(_which_side(ax_old,ay_old,nx0,ny0,nx1,ny1)!=
_which_side(ax_new,ay_new,nx0,ny0,nx1,ny1)
) and would_stick(nx0,ny0,anchor,nx1,ny1)
then
local nx05,ny05
if ax_new==ax_old then
nx05=anchor.ax
ny05=ny0+(nx05-nx0)/(nx1-nx0) * (ny1-ny0)
--printh("found (x): "..tostring({nx05,ny05}))
elseif ay_new==ay_old then
ny05=anchor.ay
nx05=nx0+(ny05-ny0)/(ny1-ny0) * (nx1-nx0)
--printh("found (y): "..tostring({nx05,ny05}))
else
assert(false,"wtf?")
end
local n05={ax=nx05,ay=ny05,associated_with=anchor,prev=n0,next=n1}
--printh("adding: "..tostring({nx05,ny05,anchor}))
n0.next=n05
n1.prev=n05
self:_drag(n05,anchor.ax,anchor.ay)
-- printh("dragged: "..tostring({n05.ax,n05.ay,anchor}))
-- printh("local: "..tostring(n0.associated_with).."->"..tostring(n05.associated_with).."->"..tostring(n1.associated_with))
else
n0=n0.next
end
end
end
function rope:_drag(n1,ax1_new,ay1_new)
local function _sweep_radar(ax_pivot,ay_pivot,ax_far0,ay_far0,ax_far1,ay_far1)
if (ax_far0==ax_far1 and ay_far0==ay_far1) return nil
local function crossed(x,y)
return x!=y
end
if ax_far0==ax_far1 then
local ax_far=ax_far0
@ -1372,8 +1231,8 @@ function rope:_drag(n1,ax1_new,ay1_new)
not (anchor.ax==ax_far1 and anchor.ay==ay_far1) and
(ax0<=anchor.ax and anchor.ax<=ax1) and
would_stick(ax_pivot,ay_pivot,anchor,ax_far,ay_far_new) and
(
_which_side(anchor.ax,anchor.ay,ax_pivot,ay_pivot,ax_far,ay_far_old) !=
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
@ -1395,8 +1254,8 @@ function rope:_drag(n1,ax1_new,ay1_new)
not (anchor.ax==ax_far1 and anchor.ay==ay_far1) and
would_stick(ax_pivot,ay_pivot,anchor,ax_far_new,ay_far) and
(ay0<=anchor.ay and anchor.ay<=ay1) and
(
_which_side(anchor.ax,anchor.ay,ax_pivot,ay_pivot,ax_far_old,ay_far) !=
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
@ -1482,6 +1341,11 @@ 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
@ -1570,18 +1434,6 @@ function rope:_tug(hypothetically)
end
local latch=self.latch
if latch!=nil and latch.el=="eyehook" then
if (hypothetically) return ancs,0
player.todo={{
update=function(s)
if s.rope==nil or s.rope:done() then
return true
end
end
}}
self:destroy(true)
return true
end
if latch!=nil and latch.el=="crate" then
local dmx,dmy=
sgn0(latch.dx),
@ -1746,48 +1598,17 @@ 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)
if (self.duration>0) sfx(63,3)
self.duration=max(self.duration-1,-2)
end
function wrongbleep:bleep(duration)
self.duration+=duration or 2
end
function wrongbleep:vibrate(duration)
if (self.continuous<10) return 0
return (rnd()*2-1)*min(self.continuous/10,2)
end
function wrongbleep:adequately_warned(duration)
return self.continuous>45
end
-->8
-- text
level_text={by_lvl={}}
add(real_modules,level_text)
level_text_raw={
"9`9`11`\f7\#0press 🅾️ to mlem & unmlem",
"9`33`17`\f7\#0❎ to yoink"
}
function level_text:init()
for i=0,32 do level_text.by_lvl[i]={} end
for row in all(level_text_raw) do
if row then
lvl,x,y,s=unpack(split(row,"`"))
add(level_text.by_lvl[lvl],{x,y,s})
end
end
end
function level_text:draw()
for xys in all(level_text.by_lvl[level.ix]) do
print(xys[3],xys[1],xys[2],6)
end
end
__gfx__
000030000000002200003000000cc0cc0cccccccccccccccccccccccccccccccc0bb0000000000000000000000000000dddddddd000000000005000000000000
003333300000332200333330000cc0cc0000cc0000000000000000000cc0000000bb0bb0bbbb0bbbbb0bbbbb0bbb0000dddddddd000000000000500000000000
@ -1821,14 +1642,14 @@ eeee0000cc0440550044440000000000000000000000888888800000000000000000000000000000
0000000077a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000ddddddddddddddddddd77ddddddddddd
00000007777a000000000000000000000000000000000000000000000000000000000000000000000000000000000000ddddddddddddddddddd00ddddddddddd
000444444444440000000000000000000000000000000000000000000000000000000000000000000000000000000000ddddddddddddddddddd00ddddddddddd
44444444444004444444444444444444444444444440044444444444444004444444444444400444444444444440044444444444444004444444444444400444
47766774477007744776677447700774477667744770077447766774477007744776677447700774477667744770077447766774477007744776677447700774
47777774477777744777777447777774477777744777777447777774477777744777777447777774477777744777777447777774477777744777777447777774
46700764467007644670070046700700467007644670076446700700467007000070076400700764007007000070070000700764007007640070070000700700
46700764467007644670070046700700467007644670076446700700467007000070076400700764007007000070070000700764007007640070070000700700
47777774477777744777777447777774477777744777777447777774477777744777777447777774477777744777777447777774477777744777777447777774
47766774477667744776677447766774477007744770077447700774477007744776677447766774477667744776677447700774477007744770077447700774
44444444444444444444444444444444444004444440044444400444444004444444444444444444444444444444444444400444444004444440044444400444
77077077777007777707707777700777770770777770077777077077777007777707707777700777770770777770077777077077777007777707707777700777
77777777777007777777777777700777777777777770077777777777777007777777777777700777777777777770077777777777777007777777777777700777
07777770077777700777777707777777077777700777777007777777077777777777777077777770777777777777777777777770777777707777777777777777
77700777777007777770070077700700777007777770077777700700777007000070077700700777007007000070070000700777007007770070070000700700
77700777777007777770070077700700777007777770077777700700777007000070077700700777007007000070070000700777007007770070070000700700
07777770077777700777777707777777077777700777777007777777077777777777777077777770777777777777777777777770777777707777777777777777
77777777777777777777777777777777777007777770077777700777777007777777777777777777777777777777777777700777777007777770077777700777
77077077770770777707707777077077777007777770077777700777777007777707707777077077770770777707707777700777777007777770077777700777
__label__
77777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777
77777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777
@ -1968,7 +1789,7 @@ __map__
0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c00000000000000000000000000000c000000000000000000000000000000000e0000000000000000000000000000000e0000000000000000000000000000000e0000000000000000000000000000000e0000000000000000000000000000000e000000000000000000000000000000
0c000000000044000c0c0c0c0c0c0c0c0c00000000000000000000000000000c000000000000000000000000000000000e0000000000000000000000000000000e0000000000000000000000000000000e0000000000000000000000000000000e0000000000000000000000000000000e000000000000000000000000000000
0c0000000000000000000000000000000c00000000000000000000000000000c000000000000000000000000000000000e00000000000e0e0e0e0000000000000e000000000e000000000000000000000e0000000000000000000000000000000e0000000000000000000000000000000e000000000000000000000000000000
3d1c000000001c0000000000000000000000000000000000000000000000000c000000000000000000000000000000000e00000000000000000e0000000000000e000000000e000e00000000000000000e0000000000000000000000000000000e0000000000000e0e000000000000000e00000000000e0e0e0e000000000000
0c00000000001c0000000000000000000000000000000000000000000000000c000000000000000000000000000000000e00000000000000000e0000000000000e000000000e000e00000000000000000e0000000000000000000000000000000e0000000000000e0e000000000000000e00000000000e0e0e0e000000000000
0c0000000000000000000000000000410000000000000000000000000000000c0000000000000e0e0e000000000000000e00000000000000000e0000000000000e000000000e000e00000000000000000e00000000000e0e0e000000000000000e00000000000e0000000000000000000e00000000000000000e000000000000
0c000000000000000c0c0c0c0c0c0c0c0c00000000000020210000000000000c00000000000e00000e0e0000000000000e0000000000000e0e0e0000000000000e000000000e0e0e0e0e0000000000000e00000000000e0000000000000000000e00000000000e0e0e000000000000000e000000000000000e00000000000000
0c0c0c0c0c0c00000000000c0c0c0c0c0c00000000000030310000000000000c000000000000000e0e000000000000000e00000000000000000e0000000000000e0000000000000e00000000000000000e00000000000e0e0e000000000000000e00000000000e00000e0000000000000e0000000000000e0000000000000000
@ -1979,35 +1800,35 @@ __map__
010000000000000c0c0c0c0c0c0c0c0c0c00000000000000000000000000000c000000000000000000000000000000000e0000000000000000000000000000000e0000000000000000000000000000000e0000000000000000000000000000000e0000000000000000000000000000000e000000000000000000000000000000
0c0c0c0c00000c0c0c0c0c0c0c0c0c0c0c00000000000000000000000000000c000000000000000000000000000000000e0000000000000000000000000000000e0000000000000000000000000000000e0000000000000000000000000000000e0000000000000000000000000000000e000000000000000000000000000000
0c0c0c0c00410c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c000000000000000000000000000000000e0000000000000000000000000000000e0000000000000000000000000000000e0000000000000000000000000000000e0000000000000000000000000000000e000000000000000000000000000000
0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e
0c00000000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0e0000000000000000000000000000000e000000000000000000000000000000
0c004f000000000c001c1c000c0c000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0c0c0c00000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c3e0c0c0c0c0c0e0000000000000000000000000000000e000000000000000000000000000000
0c0000000000000000000000000c000c0c00000000000000000c00000000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c000000000000000000000c0c0c0c0c0c0000000000000000000c000000000c0c000000000000000000001c0000000c0e000000000e000000000000000000000e000000000000000000000000000000
0c0000000c0c0000000c000000001c120100000000000000004f000000000012010000000000001c004f0000000000120100000000000000004f1c000000001201000000000000000047000000000012010000000000000000401c00000000120e000000000e0000000e0000000000000e000000000e00000e0e0e0000000000
0c000c000c0c0000000c0c0c0000000c0c00000000000000000c00000000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c000000000000000000000c0c0c0c0c0c0000000000000000000c000000000c0c000000000000000000001c0000000c0e000000000e0000000e000e000000000e000000000e00000e00000000000000
0c000c0000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0c0c0c00000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c3c0c0c0c0c0c0e000000000e0000000e0e0e0e0000000e000000000e00000e0e0e0000000000
01000c0c00000000000c0c004f00000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0e000000000e00000000000e000000000e000000000e000000000e0000000000
0c0000000000000c00000c000000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0e000000000e00000000000e000000000e000000000e000000000e0000000000
0c00004f0000000c0c000c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0e0000000000000000000000000000000e000000000e00000e0e0e0000000000
0c00000000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0e0000000000000000000000000000000e000000000000000000000000000000
0c00000c00000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0e0000000000000000000000000000000e000000000000000000000000000000
0c000c0c0c0000000c0c0c004f00000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0e0000000000000000000000000000000e000000000000000000000000000000
0c00000c00000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0e0000000000000000000000000000000e000000000000000000000000000000
0c00000000001c00000000000000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0e0000000000000000000000000000000e000000000000000000000000000000
0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e
0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e
0c00000000000000000000000000000c0e0000000000000000000000000000000e0000000000000000000000000000000e0000000000000000000000000000000e0000000000000000000000000000000e0000000000000000000000000000000e0000000000000000000000000000000e000000000000000000000000000000
0c004f000000000c001c1c000c0c000c0e0000000000000000000000000000000e0000000000000000000000000000000e0000000000000000000000000000000e0000000000000000000000000000000e0000000000000000000000000000000e0000000000000000000000000000000e000000000000000000000000000000
0c0000000000000000000000000c000c0e00000000000e0e00000000000000000e0000000000000000000000000000000e0000000000000000000000000000000e0000000000000000000000000000000e0000000000000000000000000000000e000000000e000000000000000000000e000000000000000000000000000000
0c0000000c0c0000000c000000001c120e000000000e00000e000000000000000e0000000000000000000000000000000e0000000000000000000000000000000e0000000000000000000000000000000e00000000000e0000000e0e000000000e000000000e0000000e0000000000000e000000000e00000e0e0e0000000000
0c000c000c0c0000000c0c0c0000000c0e000000000e00000e000000000000000e00000000000e000000000e000000000e0000000000000e0000000e000000000e00000000000e00000e0e00000000000e00000000000e00000000000e0000000e000000000e0000000e000e000000000e000000000e00000e00000000000000
0c000c0000000000000000000000000c0e00000000000e0e0e000000000000000e00000000000e0000000e000e0000000e0000000000000e0000000e000000000e00000000000e000000000e000000000e00000000000e0000000e0e000000000e000000000e0000000e0e0e0e0000000e000000000e00000e0e0e0000000000
01000c0c00000000000c0c004f00000c0e000000000000000e000000000000000e00000000000e0000000e000e0000000e0000000000000e0000000e000000000e00000000000e0000000e00000000000e00000000000e00000000000e0000000e000000000e00000000000e000000000e000000000e000000000e0000000000
0c0000000000000c00000c000000000c0e00000000000e0e00000000000000000e00000000000e000000000e000000000e0000000000000e0000000e000000000e00000000000e00000e0e0e000000000e00000000000e0000000e0e000000000e000000000e00000000000e000000000e000000000e000000000e0000000000
0c00004f0000000c0c000c0000000c0c0e0000000000000000000000000000000e0000000000000000000000000000000e0000000000000000000000000000000e00000000000e0000000000000000000e0000000000000000000000000000000e0000000000000000000000000000000e000000000e00000e0e0e0000000000
0c00000000000000000000000000000c0e0000000000000000000000000000000e0000000000000000000000000000000e0000000000000000000000000000000e0000000000000000000000000000000e0000000000000000000000000000000e0000000000000000000000000000000e000000000000000000000000000000
0c00000c00000000000000000000000c0e0000000000000000000000000000000e0000000000000000000000000000000e0000000000000000000000000000000e0000000000000000000000000000000e0000000000000000000000000000000e0000000000000000000000000000000e000000000000000000000000000000
0c000c0c0c0000000c0c0c004f00000c0e0000000000000000000000000000000e0000000000000000000000000000000e0000000000000000000000000000000e0000000000000000000000000000000e0000000000000000000000000000000e0000000000000000000000000000000e000000000000000000000000000000
0c00000c00000000000000000000000c0e0000000000000000000000000000000e0000000000000000000000000000000e0000000000000000000000000000000e0000000000000000000000000000000e0000000000000000000000000000000e0000000000000000000000000000000e000000000000000000000000000000
0c00000000001c00000000000000000c0e0000000000000000000000000000000e0000000000000000000000000000000e0000000000000000000000000000000e0000000000000000000000000000000e0000000000000000000000000000000e0000000000000000000000000000000e000000000000000000000000000000
0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e
__sfx__
01320000050350c03511045185451d55511515115000050001035080350d04514545195551b5551a5301b5401a5551a51516555145001554015545000000000013005130350d035100450c045100201d0530c053
0132000000000000001f0001f035200452001520000180001b0001b00500000190351b0451d0451c0551d0451c0551c015180551b000170401704519000140001800000000130051305517055170251701500000
01280000050350c03511045185451d5550c515115150051501515011150c0000f000130000f0000c0001403314550145530c023080141950000000000000000000000070000f0001300018000130000f0000c000
012800000000000000130001f055220552005500000270551f0551d05500000000000000000000000000000024050240501d0261a0030c0040000000000000000000000000000000000000000000000000000000
013200001102511025110250c000140001d0451c0411904018040160401404013040110500d00508005264002740027400080000f000180001400026400244002240022400030000a0001f4001f4001b4001b400
013200002c555295552955508000115002c5552b55528555285552b5552955528545295451853518535265002750027500075000e5001f5001f4002640026400244002440000000070000f0000f0000e0000c000
013200000000000000000000000013000190001805116050140501305011050100510d0350d0350d0350000000000000000000000000000000000000000000000000000000000000000000000000000000000000
01280000050550c05511055180551d05500000000000000000055070550c0550f055130550f0550c0550705501055080550d055140551905500000000000000000055070550f0551305518055130550f0550c055
0128000000000000001f0001f055200551f0551d055180551b055000000000000000000000000000000000000000000000000001b0551d0551b05519055140551805500000000000000000000000000000000000
01280000050550c05511055180551d05518055110550d0550c055130551b055240552b0551b05518055130550a055110551a05522055290550e0550a05505055000550705510055180551f055100550c05507055
012800000000000000130001f055220552005500000270551f0550000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
012800001d4521d452050550c05514055110551f452204522445224452050550c055140551105526452264522745227452080550f055180551405526452244522245222452030550a0551f4521f4521b4521b452
012800001d4521d4520105508055110550d0551f452204522445224452050550c055140551105526452264522745227452070550e0551f4521f4522645226452244522445200055070550f0520f0550e0550c055
00280000000000000000000000000505500000050550c055000000000000000050050505500000050550c055000000000000000000000805500000080550f05500000000000000000000030550a0550205509055
012800000122401222000000000001055000000105508055052220522200000000000505500000050550c05507222072220000000000022220222202222022220022200222000000000000055070550005507055
012800001d3141f3142032420300203040000027324273201f320000001d3001d3241b324000001f324000001d3141f3142031422314243142631427324293242b3240000024324273002932129320293102b310
012800000000000000010550805501055080050105508055000550800000000070550005507055000550705501055000000100508005010050800501055080550005500000070550000000050000000705500000
01280010183241a3241b3240000000000000002232400000213240000026324000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
01281000080050f005080250f02501055000000f025000000e3250000013325000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
012800001d3541f3542035420300203040000027354273501f350000001d3001d3541b354000001f354000001d3541f3542035422354243542635027354293502b3540000024354000002935429350293502b350
012800000000000000010550805501055080050105508055000550800000000070550005507055000550705500000000000105508055010550805501055080550005500000070550000000055000000705500000
01280010183541a3541b3540000000000000002235400000213540000026354000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
01281000080050f005080550f05501055000000f055000000e3550000013355000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
@ -2063,9 +1884,8 @@ __sfx__
__music__
01 00014344
00 02034344
00 04050644
00 04064344
00 05074344
00 08094344
02 0a0b4344
00 0c424344