23 Commits

Author SHA1 Message Date
08fa3cd46e Use bit math to keep player from leaving the map 2022-12-30 23:38:08 -08:00
ba14cc18f2 Remove unnecessary nils and falses 2022-12-30 23:30:05 -08:00
4987e71deb Shorten rope drawing code 2022-12-30 23:09:38 -08:00
95e5b3d0bf Shorten latch code 2022-12-30 23:04:27 -08:00
3f7f96a520 On reinit, take away the player's rope 2022-12-30 22:47:36 -08:00
59774303e4 Fix restart anim 2022-12-30 22:45:34 -08:00
003c6b5dc3 Rope timing fixes 2022-12-30 22:45:12 -08:00
37283c146d Fix an edge case in snappy controls 2022-12-30 22:41:08 -08:00
87219678ef Snappier controls 2022-12-30 22:39:15 -08:00
7c3cd44b9a Default level 0 2022-12-30 22:28:42 -08:00
0534e8df79 Crate-pushing puzzle before The Pivot 2022-12-30 21:09:01 -08:00
5955cf1695 Mirror two stages 2022-12-30 20:01:03 -08:00
5110c6c487 Remove some unnecessary walls 2022-12-30 19:38:24 -08:00
81c8e0182f Add The Pivot to the rotation 2022-12-30 19:28:07 -08:00
d32f522c7f Add a version of One Weird Trick to the level list 2022-12-30 19:16:57 -08:00
9e11f2ccaa Add yin-yang to standard puzzle cycle 2022-12-30 18:34:48 -08:00
8fae7affa6 New, fucked up level 15 2022-12-30 17:08:08 -08:00
2ba5adcca7 Make the level possible to complete 2022-12-30 15:46:45 -08:00
04779ede71 Readd Kistaro's level 15 with more visual polish 2022-12-30 15:35:33 -08:00
a5f1eea577 Add a prettier tileset (#16)
Tileset fuckery

First servicable

Better, black BG

Redo crate graphics

Make debug wall a less confusing color

Redo first few levels

Do another level!

Tile the whole intro

Merge branch 'main' into tiles (bad)

Fix bad merge

Co-authored-by: Nyeogmi <economicsbat@gmail.com>
Reviewed-on: #16
2022-12-30 04:12:39 +00:00
1629749857 Merge branch 'intro_sequence' into level-29 2022-12-29 15:09:29 -08:00
5c7f48baf5 Bullshitty puzzle in slot 29 2022-12-28 21:57:08 -08:00
cec52623eb mini-puzzle in room 14
I feel like there's a way to build on this theme. I think this is the minimal version of the puzzle; I'd be glad to remove elements if it turns out I can.
2022-12-28 20:38:20 -08:00

View File

@ -117,7 +117,7 @@ function _rast(
if (x0<x1) sx=1 if (x0<x1) sx=1
if (y0<y1) sy=1 if (y0<y1) sy=1
local done=false,err local done,err
if dx>dy then if dx>dy then
err=dx/2.0 err=dx/2.0
while x0!=x1 do while x0!=x1 do
@ -138,6 +138,7 @@ function _rast(
_add() _add()
end end
-->8 -->8
-- input -- input
kbd={} kbd={}
@ -197,7 +198,7 @@ blinkcol=10
function title:draw() function title:draw()
cls(0) cls(0)
-- this is right for 72x32 -- this is right for 72x32
spr(3,28,56,9,2) spr(96,28,56,9,2)
print("pyrex",32,73,7) print("pyrex",32,73,7)
print("[nyeogmi]",62,73,7) print("[nyeogmi]",62,73,7)
print("kistaro",32,79,7) print("kistaro",32,79,7)
@ -207,7 +208,7 @@ function title:draw()
end end
start_level=0 start_level=0
max_level=15 max_level=31
function title:update() function title:update()
blinkcol=9 blinkcol=9
@ -248,24 +249,34 @@ function level:advance()
self:reinit(self.ix+1) self:reinit(self.ix+1)
end end
pitpal = {[0]=1,[7]=0,[6]=1,[4]=1} normpal = {[1]=0,[8]=0,[14]=0}
pitpal = {[8]=0,[13]=3,[4]=3,[7]=3}
function level:draw() function level:draw()
cls(1) cls(5)
pal(1,0) fillp()
pal(normpal)
map( map(
self.bigx*16,self.bigy*16, self.bigx*16,self.bigy*16,
0,0,16,16, 0,0,16,16,
64 -- flag 6: visible 64 -- flag 6: visible
) )
for _,pit in pairs(self._pits) do for _,pit in pairs(self._pits) do
spr(pit.s,pit.px,pit.py) local px,py=pit.px,pit.py
local pr=self._pits[_mix(px+1,py)]
spr(pit.s,px,py)
if pit.contents then if pit.contents then
pal(pitpal) pal(pitpal)
palt(0,false) palt(0,false)
spr(pit.contents,pit.px,pit.py) --spr(pit.contents,pit.px,pit.py)
spr(79,pit.px,pit.py)
pal() pal()
pal(1,0) pal(normpal)
end end
palt(8,true)
spr(pit.s,px,py)
palt()
end end
for _,crate in pairs(self._crates) do for _,crate in pairs(self._crates) do
spr(crate.s,crate.px,crate.py) spr(crate.s,crate.px,crate.py)
@ -277,7 +288,7 @@ function level:busy()
for _,crate in pairs(self._crates) do for _,crate in pairs(self._crates) do
if (#crate.todo>0) return true if (#crate.todo>0) return true
end end
return false return
end end
function level:update() function level:update()
@ -328,7 +339,7 @@ function level:load_dynobjs()
end end
-- pit -- pit
if (s==28) self._pits[mxy]={s=s,mx=mx,my=my,px=px,py=py} if (fget(s,5)) self._pits[mxy]={s=s,mx=mx,my=my,px=px,py=py}
end end
end end
end end
@ -340,7 +351,7 @@ function level:recollide()
local mxy=_mix(mx,my) local mxy=_mix(mx,my)
self._coll[mxy]= self._coll[mxy]=
fget(self:_mget(mx,my),7) or fget(self:_mget(mx,my),7) or
self._crates[mxy]!=nil self._crates[mxy]
end end
end end
end end
@ -378,8 +389,7 @@ function level:reanchor()
end end
end end
local anch_old=self._anch local anch_old=self._anch or {}
if (anch_old==nil) anch_old={}
for _,old in pairs(anch_old) do for _,old in pairs(anch_old) do
old.dropped=true old.dropped=true
end end
@ -417,19 +427,18 @@ function level:anchor_points()
keys=all(self._anch_keys) keys=all(self._anch_keys)
return function() return function()
local k=keys() local k=keys()
if (k==nil) return nil if (k) return self._anch[k.key]
return self._anch[k.key]
end end
end end
function level:get_open_pit(mx,my) function level:get_open_pit(mx,my)
local pit=self._pits[_mix(mx,my)] local pit=self._pits[_mix(mx,my)]
if (pit and pit.contents==nil) return pit if (pit and not pit.contents) return pit
end end
function level:spawn_exit() function level:spawn_exit()
self._wins={} self._wins={}
local spawned=false local spawned
local spawn_at=function(x,y) local spawn_at=function(x,y)
if (self:_mget(x,y)!=1) return if (self:_mget(x,y)!=1) return
assert(not spawned,x..","..y) assert(not spawned,x..","..y)
@ -458,7 +467,7 @@ function level:spawn_exit()
end end
function level:mcoll(mx,my) function level:mcoll(mx,my)
return self._coll[_mix(mx,my)]!=false return self._coll[_mix(mx,my)]
end end
function level:pcoll(px,py) function level:pcoll(px,py)
@ -545,12 +554,13 @@ function level:can_move(
if (is_player and self:win_at(mx1,my1)) return true if (is_player and self:win_at(mx1,my1)) return true
if (is_player and self:get_open_pit(mx1,my1)) return wrongbleep:adequately_warned() if (is_player and self:get_open_pit(mx1,my1)) return wrongbleep:adequately_warned()
if (self:mcoll(mx1,my1) or player.x==mx1 and player.y==my1) return false if ((mx1 | my1) & 0xFFF0!=0) return false
if (self:mcoll(mx1,my1) or player.x==mx1 and player.y==my1) return
if player.rope then if player.rope then
local w,h=1.2,0.2 local w,h=1.2,0.2
if (dmx==0) w,h=0.2,1.2 if (dmx==0) w,h=0.2,1.2
if (player.rope:collide_mrect(mx0+ropecheck[dmx+2],my0+ropecheck[dmy+2],w,h,exclude_src,exclude_dst)) return false if (player.rope:collide_mrect(mx0+ropecheck[dmx+2],my0+ropecheck[dmy+2],w,h,exclude_src,exclude_dst)) return
end end
return true return true
@ -591,6 +601,8 @@ function player:reinit(x,y)
self.x,self.y=x,y self.x,self.y=x,y
self.px,self.py=0,0 self.px,self.py=0,0
self.todo={} self.todo={}
self.cooldown=4
self.rope=nil -- don't elide, needs to be cleared if present
self.fall_frame=0 self.fall_frame=0
@ -624,6 +636,10 @@ function player:update()
self.orienty=1 self.orienty=1
end end
function btncd(x)
return (kbd:btn(x) and self.cooldown==0) or kbd:btnp(x)
end
if kbd:btn(4) then if kbd:btn(4) then
if kbd:btnp(4) and self.rope then if kbd:btnp(4) and self.rope then
self.rope:destroy() self.rope:destroy()
@ -631,23 +647,30 @@ function player:update()
end end
-- wait for user to release it -- wait for user to release it
else else
local x,y=self.x,self.y
local function try_move(dx,dy,f) local function try_move(dx,dy,f)
if (level:can_move(true,self.x,self.y,dx,dy,0,2)) self.todo=f return if level:can_move(true,x,y,dx,dy,0,2) then
self.todo=f
self.cooldown=3
local t=f[#f]
t.x=x+dx
t.y=y+dy
return
end
wrongbleep:bleep() wrongbleep:bleep()
end end
if kbd:btn(0) then if btncd(0) then
try_move(-1,0,{{orientx=-1,orienty=0,px=-2},{px=-7},{x=self.x-1,px=0}}) try_move(-1,0,{{orientx=-1,orienty=0,px=-2,py=0},{px=1}})
elseif kbd:btn(1) then elseif btncd(1) then
try_move(1,0,{{orientx=1,orienty=0,px=2},{px=7},{x=self.x+1,px=0}}) try_move(1,0,{{orientx=1,orienty=0,px=2,py=0},{px=-1}})
elseif kbd:btn(2) then elseif btncd(2) then
try_move(0,-1,{{orienty=-1,py=-2},{py=-7},{y=self.y-1,py=0}}) try_move(0,-1,{{orienty=-1,px=0,py=-2},{py=1}})
elseif kbd:btn(3) then elseif btncd(3) then
try_move(0,1,{{orienty=1,py=2},{py=7},{y=self.y+1,py=0}}) try_move(0,1,{{orienty=1,px=0,py=2},{py=-1}})
elseif not self.rope and kbd:btnr(4) then elseif not self.rope and kbd:btnr(4) then
local dx,dy=self.orientx,self.orienty local dx,dy=self.orientx,self.orienty
if (dy!=0) dx=0 if (dy!=0) dx=0
local x,y=self.x,self.y
while not level:mcoll(x,y) do x+=dx y+=dy end while not level:mcoll(x,y) do x+=dx y+=dy end
self.rope=rope:new( self.rope=rope:new(
@ -667,7 +690,9 @@ function player:update()
end end
end end
if (#self.todo==0) self.px=0 self.py=0
_apply(self,self.todo) _apply(self,self.todo)
if (self.cooldown>0) self.cooldown-=1
if self.rope then if self.rope then
self.rope:update() self.rope:update()
@ -752,7 +777,7 @@ function player:draw()
-- vanish colors -- vanish colors
local vanish=split"13,15,14,5,4,12,2,3,9,10" local vanish=split"13,15,14,5,4,12,2,3,9,10"
for i,ilc in ipairs(vanish) do for i,ilc in ipairs(vanish) do
if (vanish_level>i/#vanish) pal(ilc,1) if (vanish_level>i/#vanish) pal(ilc,5)
end end
if (self.fall_frame>3) local zc=@0x5f00&0xf0 for i=0x5f00,0x5f0c,4 do poke4(i,0x0101.0101) end poke(0x5f00,zc|0x01) if (self.fall_frame>3) local zc=@0x5f00&0xf0 for i=0x5f00,0x5f0c,4 do poke4(i,0x0101.0101) end poke(0x5f00,zc|0x01)
@ -829,9 +854,9 @@ function rope:update()
if (self.state.frame>=3) self.state={name="latched"} if (self.state.frame>=3) self.state={name="latched"}
elseif self.state.name=="latched" then elseif self.state.name=="latched" then
if (self.latch==nil) wrongbleep:bleep(5) self:destroy() return if (not self.latch) wrongbleep:bleep(5) self:destroy() return
if self.latch and self.latch.rec then if self.latch.rec then
self:drag_src( self:drag_src(
self.latch.rec.mx+0.5+self.latch.ax_offset, self.latch.rec.mx+0.5+self.latch.ax_offset,
self.latch.rec.my+0.5+self.latch.ay_offset self.latch.rec.my+0.5+self.latch.ay_offset
@ -846,7 +871,7 @@ function rope:update()
elseif self.state.name=="destroy" then -- destroy elseif self.state.name=="destroy" then -- destroy
self.state.frame+=1 self.state.frame+=1
if (self.state.frame>=5) self.state={name="done",reelin=self.state.reelin} if (self.state.frame>=4) self.state={name="done",reelin=self.state.reelin}
else else
-- done state -- done state
end end
@ -893,10 +918,10 @@ end
function rope:draw(artificial_px,artificial_py) function rope:draw(artificial_px,artificial_py)
local points,highlight=self:_tug(true) local points,highlight=self:_tug(true)
local n,perc_to_show,from_end = self.state.name,1.0,false local n,perc_to_show,from_end = self.state.name,1.0
if (n=="done") return if (n=="done") return
if (n=="cast") perc_to_show=self.state.frame/2 if (n=="cast") perc_to_show=self.state.frame/2
if (n=="destroy") perc_to_show=(1.0-self.state.frame/8)^2 if (n=="destroy") perc_to_show=(1.0-self.state.frame/4)^2
if (self.state.reelin) from_end=true if (self.state.reelin) from_end=true
points[#points]={x=artificial_px,y=artificial_py} points[#points]={x=artificial_px,y=artificial_py}
@ -910,6 +935,11 @@ function rope:draw(artificial_px,artificial_py)
local len_cumulative=0 local len_cumulative=0
local ia,iz,istep=#points-1,1,-1 local ia,iz,istep=#points-1,1,-1
if (from_end) ia,iz,istep=1,#points-1,1 if (from_end) ia,iz,istep=1,#points-1,1
local function colorh(ix)
color(8)
if (highlight==ix) color(12)
end
for i=ia,iz,istep do for i=ia,iz,istep do
local src=points[i] local src=points[i]
local dst=points[i+1] local dst=points[i+1]
@ -926,36 +956,35 @@ function rope:draw(artificial_px,artificial_py)
if from_end then if from_end then
x,y=x+dx-dx*coef,y+dy-dy*coef x,y=x+dx-dx*coef,y+dy-dy*coef
end
dx,dy=dx*coef,dy*coef dx,dy=dx*coef,dy*coef
else
dx,dy=dx*coef,dy*coef colorh(i)
local function lf(d0,d1,w)
linefill(x+d0*dx,y+d0*dy,x+d1*dx,y+d1*dy,w)
end end
local color=8 lf(0,0.25,1.0)
if (highlight==i) color=12 lf(0.25,1,0.5)
lf(0.9,1,1.0)
linefill(x,y,x+0.25*dx,y+0.25*dy,1.0,color) circfill(x+dx+0.5,y+dy+0.5,1.0)
linefill(x+0.25*dx,y+0.25*dy,x+1*dx,y+1*dy,0.5,color)
linefill(x+0.9*dx,y+0.9*dy,x+dx,y+dy,1.0,color)
circfill(x+dx+0.5,y+dy+0.5,1.0,color)
end end
end end
-- draw latch -- draw latch
if self.latch!=nil and self.latch.rec and (perc_to_show>=1.0 or from_end) then local l=self.latch
local x,y=self.latch.rec.px,self.latch.rec.py if l and l.rec and (perc_to_show>=1.0 or from_end) then
local ldx,ldy=self.latch.dx,self.latch.dy local function rfsplit(x) rectfill(unpack(split(x))) end
local color=8 local ldx,ldy=l.dx,l.dy
if (highlight==0) color=12 colorh(0)
if self.latch.dx==-1 and self.latch.dy==0 then camera(-l.rec.px,-l.rec.py)
rectfill(x,y+3,x+2,y+4,color) if (ldx==-1) rfsplit"0,3,2,4"
elseif self.latch.dx==1 and self.latch.dy==0 then if (ldx==1) rfsplit"5,3,7,4"
rectfill(x+5,y+3,x+7,y+4,color) if (ldy==-1) rfsplit"3,0,4,2"
elseif self.latch.dx==0 and self.latch.dy==-1 then if (ldy==1) rfsplit"3,5,4,7"
rectfill(x+3,y,x+4,y+2,color) camera()
elseif self.latch.dx==0 and self.latch.dy==1 then color()
rectfill(x+3,y+5,x+4,y+7,color)
end
end end
-- debug -- debug
@ -1027,8 +1056,7 @@ end
function rope:relax() function rope:relax()
local n0=self.src local n0=self.src
while true do while n0 do
if (n0==nil) break
if n0.associated_with and n0.associated_with.dropped then if n0.associated_with and n0.associated_with.dropped then
for i in level:anchor_points() do for i in level:anchor_points() do
if i.ax==n0.ax and i.ay==n0.ay then if i.ax==n0.ax and i.ay==n0.ay then
@ -1044,26 +1072,25 @@ function rope:relax()
local n0=self.src local n0=self.src
while true do while true do
local n1=n0.next local n1=n0.next
if (n1==nil) break if (not n1) break
local n2=n1.next local n2=n1.next
if n0.ax==n1.ax and n0.ay==n1.ay then if n0.ax==n1.ax and n0.ay==n1.ay then
n0.next=n2 n0.next=n2
if (n2!=nil) n2.prev=n0 if (n2) n2.prev=n0
else else
n0=n0.next n0=n0.next
end end
end end
local n0=self.src local n0=self.src
while true do while n0 do
if (n0==nil) return
local n1=n0.next local n1=n0.next
if (n1==nil) return if (not n1) return
local n2=n1.next local n2=n1.next
if (n2==nil) return if (not n2) return
if n1.associated_with!=nil then if n1.associated_with then
local x0,y0=n0.ax,n0.ay local x0,y0=n0.ax,n0.ay
local x1,y1=n1.ax,n1.ay local x1,y1=n1.ax,n1.ay
@ -1099,7 +1126,7 @@ function rope:_check_sane()
local qxs,qys={},{} local qxs,qys={},{}
while true do while true do
local n1=n0.next local n1=n0.next
if (n1==nil) break if (not n1) break
_rast(qxs,qys,flr(n0.ax*2),flr(n0.ay*2),flr(n1.ax*2),flr(n1.ay*2)) _rast(qxs,qys,flr(n0.ax*2),flr(n0.ay*2),flr(n1.ax*2),flr(n1.ay*2))
n0=n1 n0=n1
@ -1121,21 +1148,21 @@ function rope:_check_sane()
end end
local function _blocked(qx,qy) local function _blocked(qx,qy)
for i in all(_possible_tiles(qx,qy)) do for i in all(_possible_tiles(qx,qy)) do
if (not level:mcoll(i.mx,i.my)) return false if (not level:mcoll(i.mx,i.my)) return
end end
return true return true
end end
-- find cases where i move through an impassable zone -- find cases where i move through an impassable zone
for i=1,#qxs do for i=1,#qxs do
if (_blocked(qxs[i],qys[i])) return false if (_blocked(qxs[i],qys[i])) return
end end
-- find cases where i am cut off diagonally -- find cases where i am cut off diagonally
for i=3,#qxs do for i=3,#qxs do
local qx1,qy1=qxs[i-1],qys[i-1] local qx1,qy1=qxs[i-1],qys[i-1]
if qx1%2==0 and qy1%2==0 then if qx1%2==0 and qy1%2==0 then
local ok=false local ok
for m0 in all(_possible_tiles(qxs[i-2],qys[i-2])) do for m0 in all(_possible_tiles(qxs[i-2],qys[i-2])) do
for m2 in all(_possible_tiles(qxs[i],qys[i])) do for m2 in all(_possible_tiles(qxs[i],qys[i])) do
local mx0,my0=m0.mx,m0.my local mx0,my0=m0.mx,m0.my
@ -1152,7 +1179,7 @@ function rope:_check_sane()
end end
end end
if (not ok) return false if (not ok) return
end end
end end
return true return true
@ -1164,8 +1191,8 @@ function would_stick(x0,y0,anchor,x2,y2)
local dx=x2-x0 local dx=x2-x0
local dy=y2-y0 local dy=y2-y0
if (x1==x0 and y1==y0) return false if (x1==x0 and y1==y0) return
if (x1==x2 and y1==y2) return false if (x1==x2 and y1==y2) return
local adx,ady local adx,ady
local x1_new,y1_new local x1_new,y1_new
@ -1224,8 +1251,6 @@ function rope:be_pushed_by(anchor,ax_old,ay_old)
ny05=anchor.ay ny05=anchor.ay
nx05=nx0+(ny05-ny0)/(ny1-ny0) * (nx1-nx0) nx05=nx0+(ny05-ny0)/(ny1-ny0) * (nx1-nx0)
-- printh("found (y): "..tostring({nx05,ny05})) -- printh("found (y): "..tostring({nx05,ny05}))
else
assert(false,"wtf?")
end end
local n05={ax=nx05,ay=ny05,associated_with=anchor,prev=n0,next=n1} local n05={ax=nx05,ay=ny05,associated_with=anchor,prev=n0,next=n1}
@ -1249,7 +1274,7 @@ function rope:_drag(n1,ax1_new,ay1_new,ax_removing,ay_removing)
(anchor.ax==ax_removing and anchor.ay==ay_removing) (anchor.ax==ax_removing and anchor.ay==ay_removing)
end end
if (ax_far0==ax_far1 and ay_far0==ay_far1) return nil if (ax_far0==ax_far1 and ay_far0==ay_far1) return
if ax_far0==ax_far1 then if ax_far0==ax_far1 then
local ax_far=ax_far0 local ax_far=ax_far0
@ -1301,13 +1326,12 @@ function rope:_drag(n1,ax1_new,ay1_new,ax_removing,ay_removing)
n1.ay=ay1_new n1.ay=ay1_new
local n0=n1.prev local n0=n1.prev
while true do while n0 do
if (n0==nil) break
local anch=_sweep_radar( local anch=_sweep_radar(
n0.ax,n0.ay,n1.ax,n1.ay, n0.ax,n0.ay,n1.ax,n1.ay,
n0.ax,n0.ay,ax1_old,ay1_old,ax1_new,ay1_new n0.ax,n0.ay,ax1_old,ay1_old,ax1_new,ay1_new
) )
if (anch==nil) break if (not anch) break
local n05={ax=anch.ax,ay=anch.ay,associated_with=anch,prev=n0,next=n1} local n05={ax=anch.ax,ay=anch.ay,associated_with=anch,prev=n0,next=n1}
-- printh("creating pre: "..tostring(n0.associated_with).."->"..tostring(n05.associated_with).."->"..tostring(n1.associated_with)) -- printh("creating pre: "..tostring(n0.associated_with).."->"..tostring(n05.associated_with).."->"..tostring(n1.associated_with))
n0.next=n05 n0.next=n05
@ -1316,13 +1340,12 @@ function rope:_drag(n1,ax1_new,ay1_new,ax_removing,ay_removing)
end end
local n2=n1.next local n2=n1.next
while true do while n2 do
if (n2==nil) break
local anch=_sweep_radar( local anch=_sweep_radar(
n1.ax,n1.ay,n2.ax,n2.ay, n1.ax,n1.ay,n2.ax,n2.ay,
n2.ax,n2.ay,ax1_old,ay1_old,ax1_new,ay1_new n2.ax,n2.ay,ax1_old,ay1_old,ax1_new,ay1_new
) )
if (anch==nil) break if (not anch) break
local n15={ax=anch.ax,ay=anch.ay,associated_with=anch,prev=n1,next=n2} 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)) -- printh("creating post: "..tostring(n1.associated_with).."->"..tostring(n15.associated_with).."->"..tostring(n2.associated_with))
n1.next=n15 n1.next=n15
@ -1332,7 +1355,7 @@ function rope:_drag(n1,ax1_new,ay1_new,ax_removing,ay_removing)
end end
function _stepfrom(x0,x1) function _stepfrom(x0,x1)
local done=false local done
if x0==x1 then if x0==x1 then
return function() return function()
if (done) return if (done) return
@ -1347,12 +1370,12 @@ function _stepfrom(x0,x1)
local i=flr(x0) local i=flr(x0)
local top=flr(x1) local top=flr(x1)
return function() return function()
if (done) return nil if (done) return
i+=1 i+=1
if i>top then if i>top then
done = true done = true
if (x1!=flr(x1)) return mul*x1 if (x1!=flr(x1)) return mul*x1
return nil return
end end
return mul*i return mul*i
end end
@ -1378,25 +1401,25 @@ function rope:collide_mrect(mx0,my0,mw,mh,exclude_src,exclude_dst)
while true do while true do
local n1=n0.next local n1=n0.next
if (n1==nil) return false if (not n1) return
local nd=n0 local nd=n0
for i=1,exclude_dst do for i=1,exclude_dst do
nd=nd.next nd=nd.next
if (nd==nil) return false if (not nd) return
end end
local x1,y1,x2,y2=n0.ax,n0.ay,n1.ax,n1.ay local x1,y1,x2,y2=n0.ax,n0.ay,n1.ax,n1.ay
local function _line_line(x3,y3,x4,y4) local function _line_line(x3,y3,x4,y4)
local denom=((y4-y3)*(x2-x1)-(x4-x3)*(y2-y1)) local denom=(y4-y3)*(x2-x1)-(x4-x3)*(y2-y1)
local ua= local ua=
((x4-x3)*(y1-y3)-(y4-y3)*(x1-x3))/denom ((x4-x3)*(y1-y3)-(y4-y3)*(x1-x3))/denom
if (ua<0 or ua>1) return false if (ua<0 or ua>1) return
local ub= local ub=
((x2-x1)*(y1-y3)-(y2-y1)*(x1-x3))/denom ((x2-x1)*(y1-y3)-(y2-y1)*(x1-x3))/denom
if (ub<0 or ub>1) return false if (ub<0 or ub>1) return
return true return true
end end
@ -1417,12 +1440,12 @@ function rope:tug_orientxy()
local a1=self.dst local a1=self.dst
local a0=self.dst.prev local a0=self.dst.prev
local dx=a0.ax-a1.ax local dx=a0.ax-a1.ax
local tdx=nil local tdx
if (dx>3/8) tdx=1 if (dx>3/8) tdx=1
if (dx<-3/8) tdx=-1 if (dx<-3/8) tdx=-1
local dy=a0.ay-a1.ay local dy=a0.ay-a1.ay
local tdy=nil local tdy
if abs(dy)>abs(dx)/2 then if abs(dy)>abs(dx)/2 then
if (dy>3/8) tdy=1 if (dy>3/8) tdy=1
if (dy<-3/8) tdy=-1 if (dy<-3/8) tdy=-1
@ -1463,11 +1486,11 @@ function rope:_tug(hypothetically)
end end
local latch=self.latch local latch=self.latch
if latch!=nil and latch.el=="eyehook" then if latch and latch.el=="eyehook" then
if (hypothetically) return ancs,0 if (hypothetically) return ancs,0
player.todo={{ player.todo={{
update=function(s) update=function(s)
if s.rope==nil or s.rope:done() then if not s.rope or s.rope:done() then
return true return true
end end
end end
@ -1475,7 +1498,7 @@ function rope:_tug(hypothetically)
self:destroy(true) self:destroy(true)
return true return true
end end
if latch!=nil and latch.el=="crate" then if latch and latch.el=="crate" then
local dmx,dmy= local dmx,dmy=
sgn0(latch.dx), sgn0(latch.dx),
sgn0(latch.dy) sgn0(latch.dy)
@ -1491,7 +1514,7 @@ function rope:_tug(hypothetically)
local mxa=(pull_anc.x+dmx)\8 local mxa=(pull_anc.x+dmx)\8
local mya=(pull_anc.y+dmy)\8 local mya=(pull_anc.y+dmy)\8
local invalid_move=false local invalid_move
if if
(dmx!=0 and sgn0(pull_dx)!=dmx) or (dmx!=0 and sgn0(pull_dx)!=dmx) or
(dmy!=0 and sgn0(pull_dy)!=dmy) or (dmy!=0 and sgn0(pull_dy)!=dmy) or
@ -1515,15 +1538,15 @@ function rope:_tug(hypothetically)
end end
end end
if (hypothetically) return ancs,nil if (hypothetically) return ancs
return false return
end end
function rope:_calc_push( function rope:_calc_push(
an,a0,a1,af an,a0,a1,af
) )
local ops={} local ops={}
if (an==nil) return ops if (not an) return ops
if a0.x==a1.x then if a0.x==a1.x then
-- no far side applying pressure? -- no far side applying pressure?
@ -1585,12 +1608,12 @@ function rope:_calc_push(
-- great! -- great!
else else
local crate=level:get_crate(o.mx,o.my) local crate=level:get_crate(o.mx,o.my)
if crate==nil then if crate then
break
else
if not level:can_move(false,o.mx,o.my,o.dmx,o.dmy,0,0) then if not level:can_move(false,o.mx,o.my,o.dmx,o.dmy,0,0) then
break break
end end
else
break
end end
add(ops2,o) add(ops2,o)
end end
@ -1605,7 +1628,7 @@ function rope:_anchors_simplified()
return atan2(p1.y-p0.y,p1.x-p0.x) return atan2(p1.y-p0.y,p1.x-p0.x)
end end
a=self.src a=self.src
while a!=nil do while a do
local point={ local point={
x=flr(a.ax*8+0.5),y=flr(a.ay*8+0.5), x=flr(a.ax*8+0.5),y=flr(a.ay*8+0.5),
ax=a.ax,ay=a.ay ax=a.ax,ay=a.ay
@ -1615,13 +1638,13 @@ function rope:_anchors_simplified()
if aw then if aw then
if (aw.adx==1) point.x-=1 if (aw.adx==1) point.x-=1
if (aw.ady==1) point.y-=1 if (aw.ady==1) point.y-=1
elseif a.prev==nil and l then elseif not a.prev and l then
if (l.ax_offset<0) point.x-=1 if (l.ax_offset<0) point.x-=1
if (l.ay_offset<0) point.y-=1 if (l.ay_offset<0) point.y-=1
end end
local p0,p1=points[#points-1],points[#points] local p0,p1=points[#points-1],points[#points]
if p0==nil then if not p0 then
add(points,point) add(points,point)
elseif _slope(p0,p1)==_slope(p1,point) then -- epsilon? elseif _slope(p0,p1)==_slope(p1,point) then -- epsilon?
points[#points]=point points[#points]=point
@ -1682,45 +1705,45 @@ function level_text:draw()
end end
end end
__gfx__ __gfx__
000030000000002200003000000cc0cc0cccccccccccccccccccccccccccccccc0bb0000000000000000000000000000dddddddd000000000005000000000000 000030000000002200003000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeff1ff1ff1fffffff1ffffff1fffffff1dddddddd111111110005000000000000
003333300000332200333330000cc0cc0000cc0000000000000000000cc0000000bb0bb0bbbb0bbbbb0bbbbb0bbb0000dddddddd000000000000500000000000 003333300000332200333330eeffffffffffffffffffffeee5e555e55e555e5eff1ff1ffffffffffffffffffffffffffdddddddd111111110000500000000000
099333990039932009333339000cc0cc0cc0cc0cc0cccccccc0ccccc0cc0ccccc0bb0bb000bb0000bb0bb0bb0bb0b000dddddddd000000000000000000000000 099333990039932009333339effeeeeeeeeeeeeeeeeeeffee5eeeeeeeeeeee5eff1ff1ffff111111ff1111ff111111ffdddddddd111111110000000000000000
09a333a9033a932009333339000cc0cc0cc0cc0cc0cc0cc0cc0000cc0cc0cc0cc0bb0bb0bb000bbbbb0bbb000bb0b000dddddddd000000005005005000000000 09a333a9033a932009333339efee33e3333e333e3333eefee5e333e333333e5eff1ff1ffff1fffffff1ff1fffffff1ffdddddddd111111115005005000000000
023333323333320000222220000cc0cc0cc0cc0cc0cc0cc0cc0ccccc0cc0ccccc0bb0bb0bbbb0bbbbb0bb0bb0bbbb000dddddddd000000000500500500000000 023333323333320000222220efe333e3333e333e33333efee5e333e333333e5eff1ff1ffff1fffffff1ff1fffffff1ffdddddddd111111110500500500000000
002222200000220000222220000cc0cc0cc0000cc0cc0cc0cc0cc0cc0cc0cc0000bb0000000000000000000000000000dddddddd000000000000000000000000 002222200000220000222220efe33eeeeeeeeeeeeee33efeeee33eeeeee33eeeff1111ffff111111ff1ff1ff111111ffdddddddd111111110000000000000000
000222c002222c0000022200000ccccc0ccccc0cc0cc0cc0cc0ccccc0cc0ccccc0bbbbbbbbbbbbbbbbbbbbbbbbbbb000dddddddd000000000005000000000000 000222c002222c0000022200efeeee555e555e55e5eeeefee5eeeeffffeeee5effffffffffffffffff1ff1ffffffffffdddddddd111111110005000000000000
00000cc00000cc0000000cc0000000000000000000000000000000000000000000000000000000000000000000000000dddddddd000000000000500000000000 00000cc00000cc0000000cc0efe33e5eeeeeeeeee5e33efee5e33efeefe33e5e1ffffff11fffffffff1ff1fffffffff1dddddddd111111110000500000000000
0000ff00000000000000000088888888888888888888880aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa11111111000000000000000000000000 0000ff000000000000000000efe33e5e11111111e5e33efee5e33efeefe33e5eff1ff1ffffffffffffffffffffffffff88888888555555555555555588888888
000f00f0000000000aa00aa00088000000088000000000000000000000000aa00000000000000000aa0000000000000011111111000000000000000000000000 000f00f0000000000aa00aa0efe33eee11ffff11eee33efeeee33effffe33e5eff1ff1ffffffffffffffffffffffffff88888888558855885588558888888888
00d0000f000000000aaaaaa000880888880880888880880aaa00aaa0aaaa0aa0aaaaa0aa0a0aaaa0aa0aa0aaaaa0aaa011111111000000000000000000000000 00d0000f000000000aaaaaa0efe33e5e1ff11ff1e5e33efee5e33eeeeee33eeeff1ff1fffff11111ffffffff11111fff88888888888888888888888888888888
00d0d00f00c040500aaaaaa000880880880880000880880aa0a0aa00aa000aa0aa0aa0aa0a0aa000aa0aa0aa0aa0aa0a11111111000000000000000000000000 00d0d00f00c040500aaaaaa0efeeee5e1f1111f1e5eeeefee5e333e333333e5eff1ff1fffff1ffffff1111ffffff1fff88888888888888888888888888888888
00dd00ee00c445500099990000880880880880888880880aa0a0aa0000aa0aa0aaa000aa0a0aa000aa0aa0aa0aa0aa0a11111111000000000000000000000000 00dd00ee00c4455000999900efe33e5e1f1111f1e5e33efee5e333e333333e5eff1111fffff1ffffff1ff1ffffff1fff88888888888888888888888888888888
00000ee00c44455500aaaa0000880880880880880880880aaaa0aaa0aaaa0aa0aa0aa0aaaa0aaaa0aa0aa0aaaaa0aa0a11111111000000000000000000000000 00000ee00c44455500aaaa00efe33eee1ff11ff1eee33efeeeeeeeeeeeeeee5efffffffffff11111ff1ff1ff11111fff88888888888888888888888888888888
00eeee000c004005000aa00000880888880880888880880000000000000000000000000000000000000000000000000011111111000000000000000000000000 00eeee000c004005000aa000efe33e5e11ffff11e5e33efee5555e555e555e5effffffffffffffffff1ff1ffffffffff88888888888888888855885588558855
eeee0000cc0440550044440000000000000000000000888888800000000000000000000000000000000000000000000011111111000000000000000000000000 eeee0000cc04405500444400efeeee5e11111111e5eeeefeeeeeeeeeeeeeeeeeffffffffffffffffff1ff1ffffffffff88888888888888885555555555555555
00000000000a90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000a90005bbbbbb3efe33eeeeeeeeeeeeee33efeff1ff1ffffffffffffffffff00000000000000000000000000000000000000000000000000000000
00000aaaaaaa91000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000aaaaaaa9100bbbbbbbbefe33e5555e555e555e33efeff1ff1ffffffffffffffffff00000000000000000000000000000000000000000000000000000000
0000aaaaaa1a91100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0000aaaaaa1a9110bbb7aabbefe33eeeeeeeeeeeeee33efeff1ff1ff11111111ff1111ff00000000000000000000000000000000000000000000000000000000
0aaaaaaaaa1a91110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0aaaaaaaaa1a9111bbbaabbbefe333e3333e333e33333efeff1ff1ffffffffffff1ff1ff00000000000000000000000000000000000000000000000000000000
0aaaaaaaa41a91a10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0aaaaaaaa41a91a1bbaaabbbefee33e3333e333e3333eefeff1ff1ffffffffffff1ff1ff00000000000000000000000000000000000000000000000000000000
0a000aa4441a91a10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0a000aa4441a91a1bbabbbbbeffeeeeeeeeeeeeeeeeeeffeff1ff1ff11111111ff1111ff00000000000000000000000000000000000000000000000000000000
00a0044449a110a10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00a0044449a110a1bbbbbbbbeeffffffffffffffffffffeeff1ff1ffffffffffffffffff00000000000000000000000000000000000000000000000000000000
000aa111991111100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000aa111991111103bbbbbb3eeeeeeeeeeeeeeeeeeeeeeeeff1ff1ffffffffffffffffff00000000000000000000000000000000000000000000000000000000
000000009910000000000000000000000000000000000000000000000000000000000000000000000000000000000000ddd00ddddddddddddddddddddddddddd 00000000991000000000000000000000000000000000000000000000000000000000000000000000000000000000000011111111111111111999999111111111
000000009900000000000000000000000000000000000000000000000000000000000000000000000000000000000000ddd00ddddddddddddddddddddddddddd 00000000990000000000000000000000000000000000000000000000000000000000000000000000000000000000000019911991999999911999999119999999
000000009900000000000000000000000000000000000000000000000000000000000000000000000000000000000000ddd77ddddddddddddddddddddddddddd 00000000990000000000000000000000000000000000000000000000000000000000000000000000000000000000000019977991999999911999999119999999
000000000900000000000000000000000000000000000000000000000000000000000000000000000000000000000000ddd00dddddd00700ddd00ddd00700ddd 00000000090000000000000000000000000000000000000000000000000000000000000000000000000000000000000019911991999117111991199111711999
00000000aa00000000000000000000000000000000000000000000000000000000000000000000000000000000000000ddd00dddddd00700ddd00ddd00700ddd 00000000aa0000000000000000000000000000000000000000000000000000000000000000000000000000000000000019911991999117111991199111711999
0000000077a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000ddddddddddddddddddd77ddddddddddd 0000000077a000000000000000000000000000000000000000000000000000000000000000000000000000000000000019999991999999911997799119999999
00000007777a000000000000000000000000000000000000000000000000000000000000000000000000000000000000ddddddddddddddddddd00ddddddddddd 00000007777a00000000000000000000000000000000000000000000000000000000000000000000000000000000000019999991999999911991199119999999
000444444444440000000000000000000000000000000000000000000000000000000000000000000000000000000000ddddddddddddddddddd00ddddddddddd 00044444444444000000000000000000000000000000000000000000000000000000000000000000000000000000000019999991111111111111111111111111
44444444444004444444444444400444444444444440044444444444444004444444444444400444444444444440044444444444444004444444444444400444 44444444444004444444444444400444444444444440044444444444444004444444444444400444444444444440044444444444444004444444444444400444
47766774477007744776677447700774477667744770077447766774477007744776677447700774477667744770077447766774477007744776677447700774 477dd77447711774477dd77447711774477dd77447711774477dd77447711774477dd77447711774477dd77447711774477dd77447711774477dd77447711774
47777774477777744777777447777774477777744777777447777774477777744777777447777774477777744777777447777774477777744777777447777774 47777774477777744777777447777774477777744777777447777774477777744777777447777774477777744777777447777774477777744777777447777774
46700764467007644670070046700700467007644670076446700700467007000070076400700764007007000070070000700764007007640070070000700700 4d7117d44d7117d44d7117104d7117104d7117d44d7117d44d7117104d711710017117d4017117d40171171001711710017117d4017117d40171171001711710
46700764467007644670070046700700467007644670076446700700467007000070076400700764007007000070070000700764007007640070070000700700 4d7117d44d7117d44d7117104d7117104d7117d44d7117d44d7117104d711710017117d4017117d40171171001711710017117d4017117d40171171001711710
47777774477777744777777447777774477777744777777447777774477777744777777447777774477777744777777447777774477777744777777447777774 47777774477777744777777447777774477777744777777447777774477777744777777447777774477777744777777447777774477777744777777447777774
47766774477667744776677447766774477007744770077447700774477007744776677447766774477667744776677447700774477007744770077447700774 477dd774477dd774477dd774477dd77447711774477117744771177447711774477dd774477dd774477dd774477dd77447711774477117744771177447711774
44444444444444444444444444444444444004444440044444400444444004444444444444444444444444444444444444400444444004444440044444400444 44444444444444444444444444444444444004444440044444400444444004444444444444444444444444444444444444400444444004444440044444400444
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
@ -1730,6 +1753,22 @@ eeee0000cc0440550044440000000000000000000000888888800000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
000cc0cc0cccccccccccccccccccccccccccccccc0bb000000000000000000000000000000000000000000000000000000000000000000000000000000000000
000cc0cc0000cc0000000000000000000cc0000000bb0bb0bbbb0bbbbb0bbbbb0bbb000000000000000000000000000000000000000000000000000000000000
000cc0cc0cc0cc0cc0cccccccc0ccccc0cc0ccccc0bb0bb000bb0000bb0bb0bb0bb0b00000000000000000000000000000000000000000000000000000000000
000cc0cc0cc0cc0cc0cc0cc0cc0000cc0cc0cc0cc0bb0bb0bb000bbbbb0bbb000bb0b00000000000000000000000000000000000000000000000000000000000
000cc0cc0cc0cc0cc0cc0cc0cc0ccccc0cc0ccccc0bb0bb0bbbb0bbbbb0bb0bb0bbbb00000000000000000000000000000000000000000000000000000000000
000cc0cc0cc0000cc0cc0cc0cc0cc0cc0cc0cc0000bb000000000000000000000000000000000000000000000000000000000000000000000000000000000000
000ccccc0ccccc0cc0cc0cc0cc0ccccc0cc0ccccc0bbbbbbbbbbbbbbbbbbbbbbbbbbb00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
88888888888888888888880aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa00000000000000000000000000000000000000000000000000000000
0088000000088000000000000000000000000aa00000000000000000aa0000000000000000000000000000000000000000000000000000000000000000000000
00880888880880888880880aaa00aaa0aaaa0aa0aaaaa0aa0a0aaaa0aa0aa0aaaaa0aaa000000000000000000000000000000000000000000000000000000000
00880880880880000880880aa0a0aa00aa000aa0aa0aa0aa0a0aa000aa0aa0aa0aa0aa0a00000000000000000000000000000000000000000000000000000000
00880880880880888880880aa0a0aa0000aa0aa0aaa000aa0a0aa000aa0aa0aa0aa0aa0a00000000000000000000000000000000000000000000000000000000
00880880880880880880880aaaa0aaa0aaaa0aa0aa0aa0aaaa0aaaa0aa0aa0aaaaa0aa0a00000000000000000000000000000000000000000000000000000000
00880888880880888880880000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000888888800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
@ -1763,53 +1802,37 @@ eeee0000cc0440550044440000000000000000000000888888800000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000c0c0c0c0c021c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c021c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000c0c100c0c000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c000c0c0c0c0c0c0c0c0c0c00000000000000000000000000000c0
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000c0c1002400c1c100c0c0c0c0c0c0c0c0c0c0c0c0c0c000c0c0c0c0c0c0c0c0c0c00000000000000000000000000000c0
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000c00000e300c00000c0c0c0c0c0c0c0c0c0c0c10000c000c0c0c0c0c0c0c0c0c0c00000000000000000000000000000c0
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000c000000000c000c0c0c0c0c0c0c0c0c0c000000000c100c100f3c0c0c0c0c0c0c00000000000000000000000000000c0
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000001000340000c000c0c0c0c0c0c0c0c0c01000c034c1c1c1c100c0c0c0c0c0c0c0c00000000000000000000000000000c0
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000c000000000c100f3c0c0c0c0c0c0c0c0c00000000000000000c0c0c0c0c0c0c0c00000000000000000000000000000c0
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c00000000000000212000000000000c0
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c00000000000000313000000000000c0
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c00000000000000000000000000000c0
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0100000000000000000000000000000c0
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c00000000000000000000000000000c0
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c00000000000000000000000000000c0
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c00000000000000000000000000000c0
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c00000000000000000000000000000c0
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000c0
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000c0
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000c0
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000c0
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00000000000000212000000000000c0
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00000000000000313000000000000c0
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000c0
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000c0
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000c0
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000c0
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000c0
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000c0
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
__label__ __label__
77777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777 77777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777
77777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777 77777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777
@ -1941,41 +1964,41 @@ __label__
77777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777 77777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777
__gff__ __gff__
000000000808080808080808c00000000000000008080808080808080000000040400000080808080808080800000000404000000808080808080808c0c0c0c000000000080808080808080800000000000000000808080808080808000000000000000008080808080808080000000000000000080808080808080800000000 000000c0c0c0c0c0c0c0c0c0c0c00000000000c0c0c0c0c0c0c0c0c0202020200040c0c0c0c0c0c0c008080800000000404000000808080808080808c0c0c0c000000000080808080808080800000008000000000808080808080808000000000008080808080808080808080000000000080808080808080808080800000000
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
__map__ __map__
0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c120c0c0c0c0c0c0c0c0c010c0c0c0c0c0c0c0c0c0c0c0c0c0c120c0c0c0c0c0c0c0c0c0c0c0c0c0c0c3e0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d1203040404050d0d0d0d010d0d0d0d0d0d0d0d0d0d0d0d0d0d120d0d0d0d0d0d0d0d0d0d0d0d0d03043e0a040404050d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d
0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c00000000000c00000000000000000c0c000c004f00000c000000000000000c0c0c0c0c0c0c0000000c000c0000000c0c0c0c0c0c0c0c0c0c00000c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0e0000000000000000000000000000000e000000000000000000000000000000 0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0a0d0d0d0d0a0d0304040405140013004f00150d0d0d1400140d0d0d0d0d0d0d0d0d0d0d0d1400140d0d0d0d0d0304040404040417000026000000150d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d030404043e050d0d0d0d0d0d033e0404040404050d0d0d0d0d0d0d
0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c00000000001c00004f00000000000c0c00001c0000000c000000000000000c0c0c0c0c0c0c0000000c000c0000000c0c000000000000000000000c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0e0000000000000000000000000000000e000000000000000000000000000000 0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d03042604040404260417000000151400001e0000150304040400040404050d0d0d0d0d03040404050003040404050d1300000000000000000018000000150d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0304041700000000150d0d0d0d0d0d134400000000001514140d0d0d0d0d
0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c00000000000c0c0c0c0c0c1c001c0c0c0c0c00000c0c0c000000000000000c0c000000000c0000000c000c0000000c0c0000000000000000421c000000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0e0000000000000000000000000000000e000000000000000000000000000000 0d0d0d0d0d0d0d0d0d0a0d0d0d0d0d0d0d14130018000000001800000000001514141300000015130000000000000015030404040513000000160017000000150d1300000000000000421e00000000150d0d0d0d0d0d0d0d0d0a0d0d0d0d0d0d0d0d1300000000000000150d0d0d0d0d12001d0000000000000003040404050d
0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c000000000000000000000c1c001c0c0c0000000000000c000000000000000c0c00001c1c000000000c000c0000000c0c000000000000000000000c0000410c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0e0000000000000000000000000000000e000000000000000000000000000000 0d0d0d0d0d0d0d0d0d260d0d0d0d0d0d010000001e0000004f000000000000150d031700000015130000000000000015130000001513004200001e43000000150d130000000000000000001a000041150d0d0d0d0d0d0d0d0d260d0d0d0d0d0d0d0d13000000001d1d00150d0d0d0d0d0d131c0000000000150013000000150d
0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c000000000000000000000c0000000c0c0000000000000c000000000000000c0c00001c480c004200001c430000000c0c0c0c0c000c0c0c0c00000c00001c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0e0000000000000e0e000000000000000e00000000000e0e0e0e000000000000 0d0d0d0d0d0d0d0d0d260d0d0d0d0d0d0d1413001a000000001a0000000000150d13000000001513000000000000001513001d1d0000000000000000000000150d232424002424240700002600001e150d0d0d0d0d0d0d0d0d260d0d0d0d0d0d0d0d1346062407471c00150d0d0d0d0d0d231c24241d2424250000000000150d
0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c000000000000000000000c0000000c0c0000000000000c000000000000000c0c000000000c0000000000000000000c3d00001c001c00003f0c0c0c0c0c000c0c0c0c1c1c1c1c1c1c1c1c1c1c0c0c0c0e00000000000e0000000000000000000e00000000000000000e000000000000 0d0d0d0d03040404042604050d0d0d0d0d0d232426242424242624071e001e150d13000000001513000000000000001513001f481523242424070006242424250d0304040004040523242408242400250d0d0d0d03040404041804050d0d0d0d0d0d1346150d131c1f0016040404050d0d031f04051c0d030404170000001605
0c0c0000000000000c00000000000c0c01000000000000000000000c0000000c0c0c0c00000c0c0c000000000000000c0c000000000c0c0c0c0000000c0c0c0c0c00001c1c1c00000c0c0c0c0c0c000c0c0c00001c1c1c1c1c1c1c1c00003f0c0e00000000000e0e0e000000000000000e000000000000000e00000000000000 0d14141413000000001800151414140d0d0d0d0d080d0d0d0d080d23240024250d23240000242513000000000000001513000000150d0d0d0d2324250d0d0d0d0d3d001c001c003f03040404040400050d1414141300001d1d1d003f1414140d0d0d13441604171f1a0000000000150d0d130000161f053d44001d1d001d0015
01000000000000004f000000000000120c0c0c0c0c0c0c0c0c0c0c0c0c000c0c0c00001c1c004f0c000000000000000c0c000000000c00000c0c0c0c0c00000c0c00001c401c00000c0000000000000c010000001c1c1c1c1c1c1c1c000000120e00000000000e00000e0000000000000e0000000000000e0000000000000000 0100000000000000004f0000000000120d0d0304040404050d0d0d0d1400140d0d030400000405130000004f000000151300000015030404050d0d0d030404050d13001c1d1c00151300000000000015010000000000001c1c1c0000000000120d0d13001c000000181d1a1d1a1d150d0d131d1d0000151342001c1c001c003f
0c0c0000000000000c00000000000c0c0c000000000000000c0000000000000c0c0000000000000c0000004f0000000c0c000000000c0000000000000000000c0c000000000000000c00481c0000000c0c0c00001c1c1c1c1c1c1c1c00003f0c0e0000000000000e0e000000000000000e0000000000000e0000000000000000 0d14141413000000001a00151414140d0d0d1300000000150d0304040400050d0d13001e1e4f15130000001e00000015130000001513000016040404170000150d13001f401f00151300481e000000150d1414141300001f1f1f003f1414140d0d0d13001f0043003f1f181c181f150d0d131f1f0000151300001c1c1d1c4915
0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c000000000000000c0000000000000c0c0000000000000c0000001c0000000c0c000000430c0000000000000000000c0c000000000000000c0c0c000c0c0c0c0c0c0c1c1c1c1c1c1c1c1c1c1c0c0c0c0e0000000000000000000000000000000e000000000000000000000000000000 0d0d0d0d23242424242624250d0d0d0d0d0d1300000000150d1300000000150d0d130000000015130000150013000015130000431513000000000000000000150d1300000000001523242400242424250d0d0d0d23242424241a24250d0d0d0d0d0d13001a001a1d1a00001f0000150d0d230747000015131e1e1f1f1f1f3e15
0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c000000000000000c0000000000000c0c0c0c00000c0c0c00000c000c00000c0c00000000004d00000000000000000c0c000000000000000c0000000c00000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0e0000000000000000000000000000000e000000000000000000000000000000 0d0d0d0d0d0d0d0d0d260d0d0d0d0d0d0d091b00191b00192727271b1e19270b0d2324240024252324242500232424251300000000004d0000000000000000150d1300000000001503040000040514140d0d0d0d0d0d0d0d0d260d0d0d0d0d0d0d0d131e1800181f18001a00063c250d0d0d2324243c25130040000000000015
0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c00000c0c000c0c0c0c0c0c1c0c0c0c0c4f001c1c00000c0c0c0c000c0c0c0c0c0c0c0c0c0c0000000000000000000c0c000000000000000c00001c1c00000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0e0000000000000000000000000000000e000000000000000000000000000000 0d0d0d0d0d0d0d0d0d260d0d0d0d0d0d0d0d1300001e4f1e000000004f00150d0d0d03040004050d0d0d1400140d0d0d232424242513000000000000000000150d130000000000151300001d1d0000140d0d0d0d0d0d0d0d0d260d0d0d0d0d0d0d1413000000000000001800000000120d140304040405130000000000000015
0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c00000c1c4f1c000000000c4f0c000c0c00000000000000000000000000000c0c0c0c0c0c0c0000000000000000000c0c000000000000000c000040440c000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0e0000000000000000000000000000000e000000000000000000000000000000 0d0d0d0d0d0d0d0d0d080d0d0d0d0d0d0d0d230024242425141300000000150d0d0d134f1e00151414141400140d0d0d0d0d0d0d0d13000006240024070000150d2324240024242513000040441500140d0d0d0d0d0d0d0d0d080d0d0d0d0d0d0100000000000000062424242514140d0100001d1d483f230024242424242425
0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c000c1c1c1c00000000000000000c0c00000000000000000000000000000c0c0c0c0c0c0c00000c0c000c0c00000c0c0c0c0c000c0c0c0c000000000c00120c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0e0000000000000000000000000000000e000000000000000000000000000000 0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d1400140d0d0d0d2324242424250d0d0d13000000000000000000140d0d0d0d0d0d0d0d23242425140014232424250d0d0d1400140d0d13000000001500120d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d1423242424243c250d0d0d0d0d0d0d0d14131f1f00000000140d0d0d0d0d0d
0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c120c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c010c0c0c0c0c0c0c0c0c010c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0e0000000000000000000000000000000e000000000000000000000000000000 0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d120d0d0d0d0d0d0d0d0d0d0d0d0d0d23242424251414141414140d0d0d0d0d0d0d0d0d0d0d0d0d010d0d0d0d0d0d0d0d0d010d0d0d232424242425140d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d23242424251414140d0d0d0d0d0d
0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0d0d0d0d0d0d0d0d030404040404050d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d010d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0c00000000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0e0000000000000000000000000000000e000000000000000000000000000000 0d03040404040405133d00001c00150d0d0d0d0d0d0d0d0d0304043e0404050d0d0d0d0d030404000404050d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0c004f000000000c001c1c000c0c000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0c0c0c00000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c3e0c0c0c0c0c0e0000000000000000000000000000000e000000000000000000000000000000 0d130000000000151300001d1f00150d0d0d0d0d0d0d0d0d150000000000150d0d0d0d0317420000004816050d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0c0000000000000000000000000c000c0c00000000000000000c00000000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c000000000000000000000c0c0c0c0c0c0000000000000000000c000000000c0c000000000000000000001c0000000c0e000000000e000000000000000000000e000000000000000000000000000000 0d13001d1d1e4f000000001c000000010d03040404040405150000000000150d0d0d141300191b1d191b0015140d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0c0000000c0c0000000c000000001c120100000000000000004f000000000012010000000000001c004f0000000000120100000000000000004f1c000000001201000000000000000047000000000012010000000000000000401c00000000120e000000000e0000000e0000000000000e000000000e00000e0e0e0000000000 0d13001f1f000015131e1e1f1d1d150d0d13460044004c15150000000000150d0d3d001e0042001f0048001e003f0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0c000c000c0c0000000c0c0c0000000c0c00000000000000000c00000000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c000000000000000000000c0c0c0c0c0c0000000000000000000c000000000c0c000000000000000000001c0000000c0e000000000e0000000e000e000000000e000000000e00000e00000000000000 0d13000000000015130000001c1c150d0d131d1d1e1d1d152324241d2424250d0d140023240700410006242500140d0d0d0d0d0d030404040404050d0d0d0d0d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0c000c0000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0c0c0c00000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c3c0c0c0c0c0c0e000000000e0000000e0e0e0e0000000e000000000e00000e0e0e0000000000 0927271b1e1e0015130014001c1c150d0d131c3d001c1c000000001f040404050d1400000023243c2425000000140d0d0d0d0d0d130000001c000000000d0d0d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
01000c0c00000000000c0c004f00000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0e000000000e00000000000e000000000e000000000e000000000e0000000000 0d131c1c00000000000000001c1c150d0d131f1f1e1f1f1514141300280000150d14000000001f1f1f00000000140d0d0d141414130028001c4516050014140d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0c0000000000000c00000c000000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0e000000000e00000000000e000000000e000000000e000000000e0000000000 0d131c1c0014001513001e1e1927270b0d1300004100001514141300000000010d144f47411400000014000000140d0d01000000000000001f0000150000001200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0c00004f0000000c0c000c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0e0000000000000000000000000000000e000000000e00000e0e0e0000000000 0d131c1c00000015130000000000150d0927271b001927270b031741280000150d14434b491400000014000000140d0d0d14141413002800000000151414140d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0c00000000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0e0000000000000000000000000000000e000000000000000000000000000000 0d131f1f1d1e1e151300001d1d00150d0d131f1c001c1c151f130000004900150d03040404040000000304040405140d0d0d0d0d13000000000006250d0d0d0d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0c00000c00000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0e0000000000000000000000000000000e000000000000000000000000000000 120000001c000000004f1e1f1f00150d0d13001f001f1f0000131d1d000000150d1300000000000003170000000000120d0d0d0d232424242424250d0d0d0d0d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0c000c0c0c0000000c0c0c004f00000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0e0000000000000000000000000000000e000000000000000000000000000000 0d13001d1f000015130000000000150d0d1300000000001500232424242424250d13000000001d1d1d0000000015140d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0c00000c00000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0e0000000000000000000000000000000e000000000000000000000000000000 0d13001c00003f15232424242424250d0d1300000000001500140d0d0d0d0d0d0d130000000625031700000000150d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0c00000000001c00000000000000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0e0000000000000000000000000000000e000000000000000000000000000000 0d232424242424250d0d0d0d0d0d0d0d0d2324242424242500140d0d0d0d0d0d0d130000062503170000000000150d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d120d0d0d0d0d0d0d0d232424250d23242424242424250d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
__sfx__ __sfx__
00110000250002500025030250302503000000230350000023030230302303023030230302303023030230302103021030210302103021030210300000000000177401774017740177311e7501e7501e7501e750 00110000250002500025030250302503000000230350000023030230302303023030230302303023030230302103021030210302103021030210300000000000177401774017740177311e7501e7501e7501e750
00110000290202a0212a0202a0202a0202a02025030250052503025030250302503025030250302503025030250302503025030250302503225030230322504526030260302a040000002d0402d0402d0402d040 00110000290202a0212a0202a0202a0202a02025030250052503025030250302503025030250302503025030250302503025030250302503225030230322504526030260302a040000002d0402d0402d0402d040