ldjam-44/right_coin.lua

740 lines
34 KiB
Lua

-- title: The Right Coin
-- author: Fabien Freling, Pascal Batty
-- desc: Sell coins for medicine (Ludum Dare 44)
-- script: lua
t=0
s=8 -- sprite/cell size
w=240
mw=w/s
h=136
mh=h/s
GameState = { start=0, game=1, gameover=2, market=3 }
currentState = GameState.start
life=100
coinBlue=0
valueBlue=1.0
coinRed=0
valueRed=5.0
coinYellow=0
valueYellow=0.8
MarketOptions = { blue=0, red=1, yellow=2, all=3, done=4 }
marketSelection = MarketOptions.blue
secondsAlive=0
sickCounter=20 -- how many seconds before the sickness get stronger?
sickLapse=20 -- how many ticks before the life decreases?
solids={}
do
local sols={1, 2, 3, 17}
for i,v in pairs(sols) do
solids[v]=true
end
end
function sol(x,y) return solids[mget(x//8,y//8)] end
g = .15
j = -3.1
anis={
idle={257,257,258,258,259,259,260,260},
run= {273,274,275,276},
jump={289},
fall={290},
coin={
blue= {321,321,322,322,323,323,324,324},
red= {337,337,338,338,339,339,340,340},
yellow={353,353,354,354,355,355,356,356},
}
}
function drawActor(self)
self.spr=self.ani[(((t)//4)% #self.ani)+1]
local flip
if self.isFlipped then flip = 1 else flip = 0 end
spr(self.spr, self.x, self.y, 0, 1, flip)
end
function hitTest(rect1, rect2)
return rect1.x < rect2.x + rect2.w
and rect1.x + rect1.w > rect2.x
and rect1.y < rect2.y + rect2.h
and rect1.y + rect1.h > rect2.y
end
coinCooldown=160
coinTimer=coinCooldown
maxCoin=6
initialCoinDrop=4
coinSpawnCount=2
colors={"blue","red","yellow"}
spawnLocs={
{x=1*8, y=5*8},
{x=28*8,y=5*8},
{x=6*8, y=5*8},
{x=23*8,y=5*8},
{x=11*8,y=12*8},
{x=18*8,y=12*8},
{x=2*8, y=11*8},
{x=27*8,y=11*8},
{x=4*8, y=15*8},
{x=25*8,y=15*8},
}
coins={}
do -- Coin
Coin={
color=colors[1],
ani=anis.coin.red,
spr=0,
x=0,y=0,
w=8,h=8,
}
function Coin:new(o)
o = o or {}
self.__index = self
setmetatable(o, self)
return o
end
function Coin:setColor(c)
self.color = c
if c=="red" then self.ani=anis.coin.red
elseif c=="blue" then self.ani=anis.coin.blue
elseif c=="yellow" then self.ani=anis.coin.yellow
end
end
function Coin:draw()
drawActor(self)
end
end
function randomColor()
return colors[math.random(#colors)]
end
function coinAtLoc(loc)
for i,v in pairs(coins) do
if v.x == loc.x and v.y == loc.y then return true end
end
return false
end
function randomValidSpawnLoc()
local loc
repeat loc=spawnLocs[math.random(#spawnLocs)]
until not coinAtLoc(loc)
return loc
end
function canAddCoin()
return #coins < maxCoin
end
function addRandomCoin()
if not canAddCoin() then return end
local newCoin=Coin:new()
local loc=randomValidSpawnLoc()
newCoin:setColor(randomColor())
newCoin.x=loc.x
newCoin.y=loc.y
coins[#coins + 1]=newCoin
coinTimer=coinCooldown
end
function dropInitialCoins()
coins={}
for i=1, initialCoinDrop do
addRandomCoin()
end
end
-- /MOCK
do -- Player
Player = {
spr=0,
ani=anis.idle,
x=14.5*8,y=8*8,
w=8,h=8,
vx=0,vy=0,
isFlipped=false
}
local maxSp=2
local accel=0.3
local decel=0.5
function Player:new(o)
o = o or {}
self.__index = self
setmetatable(o, self)
return o
end
function Player:direct()
if btn(2) then
self:goLeft()
elseif btn(3) then
self:goRight()
else self:stop()
end
if btnp(4) and self.vy == 0 then
sfx(2,54,15,1)
self.vy = j
end
end
function Player:goLeft()
if self.vx > 0 then self.vx=0 end
self.vx=self.vx - accel
if self.vx < -maxSp then self.vx=-maxSp end
self.isFlipped = true
end
function Player:goRight()
if self.vx < 0 then self.vx=0 end
self.vx=self.vx + accel
if self.vx > maxSp then self.vx=maxSp end
self.isFlipped = false
end
function Player:stop()
if self.vx < 0 then
self.vx= self.vx + decel
if self.vx > 0 then self.vx=0 end
elseif self.vx > 0 then
self.vx= self.vx - decel
if self.vx < 0 then self.vx=0 end
end
end
function Player:update()
self:resolve()
self.x = self.x + self.vx
self.y = self.y + self.vy
self:collectCoin()
end
function Player:resolve()
if sol(self.x + self.vx, self.y + self.h-1) or sol(self.x + self.vx + self.w-1, self.y + self.h-1) then
self.vx = 0
end
local roof = self:distanceToRoof()
local floor = self:distanceToFloor()
if self.vy < roof then
self.vy = roof
end
if self.vy >= floor then self.vy = floor
else self.vy = self.vy + g
end
if self.vy < 0 then
self.ani = anis.jump
elseif self.vy > 0 then
self.ani = anis.fall
elseif not (self.vx == 0) then
self.ani = anis.run
else
self.ani = anis.idle
end
end
function Player:distanceToFloor()
local y = 0
while (not sol(self.x + self.vx, self.y + y + self.h))
and (not sol(self.x + self.vx + self.w-1, self.y + y + self.h))
and (self.y + y < 128) do
y = y + 1
end
return y
end
function Player:distanceToRoof()
local y = 0
while (not sol(self.x + self.vx, self.y + y - 1))
and (not sol(self.x + self.vx + self.w-1, self.y + y - 1))
and (self.y + y > 0) do
y = y - 1
end
return y
end
function Player:collectCoin()
for i,v in pairs(coins) do
if hitTest(self, v) then
sfx(0)
table.remove(coins,i)
if v.color == "blue" then coinBlue=coinBlue+1
elseif v.color == "red" then coinRed=coinRed+1
elseif v.color == "yellow" then coinYellow=coinYellow+1
end
end
end
end
function Player:draw()
drawActor(self)
end
end
function drawStart()
cls(1)
print("The Right Coin",80,20)
spr(80, 20, 30, 0, 3)
spr(81, 50, 50, 0, 2)
spr(82, 40, 70, 0, 1)
local yText=35
print("You're dying, and medicine",130,yText,15,false,1,true)
print("ain't cheap. Exchange your",130,yText+10,15,false,1,true)
print("most valuable coins for life.",130,yText+20,15,false,1,true)
print("The market will dictate how",130,yText+30,15,false,1,true)
print("much medicine you can buy.",130,yText+40,15,false,1,true)
-- A
spr(401,60,90,0)
print(": JUMP",70,92)
print("(keyboard: Z)",60,98,15,false,1,true)
-- B
spr(402,130,90,0)
print(": ENTER MARKET",140,92)
print("(keyboard: X)",130,98,15,false,1,true)
if t%60 > 20 then
print("Press",75,112)
spr(401,108,110,0)
print("to start",120,112)
end
print("Fabien Freling & Pascal Batty", 65, 128, 15, false, 1, true)
end
function drawGameOver()
cls(0)
map(0,17,30,17)
-- Time alive
local minutes = secondsAlive // 60
local seconds = secondsAlive % 60
print("You ran out of time",70,36,6)
if minutes == 0 then
print("You survived for "..seconds.." seconds.",70,50)
elseif minutes == 1 then
print("You survived for "..minutes.." minute",70,50)
print("and "..seconds.." seconds.",70,64)
else
print("You survived for "..minutes.." minutes",70,50)
print("and "..seconds.." seconds.",70,64)
end
if t > 120 and t%120 > 20 then
print("Press",100,100)
spr(401,132,98,0)
end
end
function drawGame()
map(0,0,30,17)
p:draw()
for i,v in pairs(coins) do
v:draw()
end
drawLife(0,0,0)
if isOnMarket() then
spr(385, 14.5*8, 6*8)
end
-- Coins / market
local coinsOff=110
spr(80,coinsOff,0)
print("x"..coinBlue,coinsOff+s,2)
spr(81,coinsOff+25,0)
print("x"..coinRed,coinsOff+25+s,2)
spr(82,coinsOff+50,0)
print("x"..coinYellow,coinsOff+50+s,2)
-- spr(84,190,0)
print(valueBlue,190,2,8)
print(valueRed,206,2,12)
print(valueYellow,222,2,14)
-- Time alive
local minutes = secondsAlive // 60
local seconds = secondsAlive % 60
if minutes == 0 then
print("Time: "..seconds.." sec", 8, 16)
else
print("Time: "..minutes.." min "..seconds.." sec", 8, 16)
end
end
function drawLife(x,y,next)
spr(83,x,y,0)
local color=11 -- green
if life < 25 then
color=6 -- red
elseif life < 50 then
color=9 -- orange
end
local xmin=11
local xmax=107
local lifeLimit=(xmax-xmin)*life/100+xmin
for i=lifeLimit,xmax do
pix(x+i,y+1,0)
pix(x+i,y+2,0)
pix(x+i,y+3,0)
pix(x+i,y+4,0)
pix(x+i,y+5,0)
pix(x+i,y+6,0)
end
local blink=30
if t%blink > (blink/3) then
local potential=math.min(xmax,lifeLimit+next)
for i=lifeLimit,potential do
pix(x+i,y+1,8)
pix(x+i,y+2,8)
pix(x+i,y+3,8)
pix(x+i,y+4,8)
pix(x+i,y+5,8)
pix(x+i,y+6,8)
end
end
for i=xmin,lifeLimit do
pix(x+i,y+1,color)
pix(x+i,y+2,color)
pix(x+i,y+3,color)
pix(x+i,y+4,color)
pix(x+i,y+5,color)
pix(x+i,y+6,color)
end
spr(85,x+10,y,0)
for i=18,100,8 do
spr(86,x+i,y,0)
end
spr(85,x+100,y,0,1,1)
end
function drawMarket()
-- Background
xOff=2
yOff=2
for i=xOff+1, mw-2-xOff do
spr(64,i*s,yOff*s,0,1,0,1)
spr(64,i*s,(mh-1-yOff)*s,0,1,2,1)
end
for j=yOff+1, mh-2-xOff do
spr(64,xOff*s,j*s,0,1,0,0)
spr(64,(mw-1-xOff)*s,j*s,0,1,1,0)
end
spr(65,xOff*s,yOff*s,0,1,0,1)
spr(65,(mw-1-xOff)*s,yOff*s,0,1,0,2)
spr(65,(mw-1-xOff)*s,(mh-1-yOff)*s,0,1,0,3)
spr(65,xOff*s,(mh-1-yOff)*s,0,1,0,0)
for i=xOff+1, mw-2-xOff do
for j=yOff+1, mh-2-xOff do
spr(66,i*s,j*s,0,1,0,1)
end
end
-- Coins
spr(80,4*s,4*s,0)
print("x"..coinBlue,5*s+4,4*s+2)
print("x"..valueBlue,8*s+4,4*s+2,8)
print("= "..math.floor(coinBlue*valueBlue),12*s,4*s+2)
spr(83,15*s,4*s,0)
print("Buy",20*s,4*s+2)
spr(81,4*s,6*s,0)
print("x"..coinRed,5*s+4,6*s+2)
print("x"..valueRed,8*s+4,6*s+2,12)
print("= "..math.floor(coinRed*valueRed),12*s,6*s+2)
spr(83,15*s,6*s,0)
print("Buy",20*s,6*s+2)
spr(82,4*s,8*s,0)
print("x"..coinYellow,5*s+4,8*s+2)
print("x"..valueYellow,8*s+4,8*s+2,14)
print("= "..math.floor(coinYellow*valueYellow),12*s,8*s+2)
spr(83,15*s,8*s,0)
print("Buy",20*s,8*s+2)
print("Buy all",19*s,10*s+2)
print("Done",20*s,12*s+2)
-- Selection
local next=0
if marketSelection == MarketOptions.blue then
spr(97,19*s,4*s+1,0)
spr(97,22*s,4*s+1,0,1,1)
next=math.floor(coinBlue*valueBlue)
elseif marketSelection == MarketOptions.red then
spr(97,19*s,6*s+1,0)
spr(97,22*s,6*s+1,0,1,1)
next=math.floor(coinRed*valueRed)
elseif marketSelection == MarketOptions.yellow then
spr(97,19*s,8*s+1,0)
spr(97,22*s,8*s+1,0,1,1)
next=math.floor(coinYellow*valueYellow)
elseif marketSelection == MarketOptions.all then
spr(97,18*s,10*s+1,0)
spr(97,24*s,10*s+1,0,1,1)
next=math.floor(coinBlue*valueBlue)
next=next+math.floor(coinRed*valueRed)
next=next+math.floor(coinYellow*valueYellow)
elseif marketSelection == MarketOptions.done then
spr(97,19*s,12*s+1,0)
spr(97,23*s,12*s+1,0,1,1)
end
drawLife(4*s,12*s,next)
end
function draw(state)
if currentState == GameState.start then
drawStart()
elseif currentState == GameState.game then
drawGame()
elseif currentState == GameState.market then
drawGame()
drawMarket()
elseif currentState == GameState.gameover then
drawGameOver()
end
end
function setInitialGameState()
p=Player:new()
t=0
secondsAlive=0
life=100
dropInitialCoins()
sickCounter=20 -- how many seconds before the sickness get stronger?
sickLapse=20 -- how many ticks before the life decreases?
coinBlue=0
coinRed=0
coinYellow=0
end
function update(state)
if currentState == GameState.start then
if btnp(4) then -- A (Z key)
currentState = GameState.game
setInitialGameState()
end
elseif currentState == GameState.game then
updateGame()
elseif currentState == GameState.market then
updateMarket()
elseif currentState == GameState.gameover then
if t > 120 and btnp(4) then -- A (Z key)
currentState = GameState.start
end
end
end
function isOnMarket()
return mget(p.x/s,p.y/s) == 48 or mget(p.x/s,p.y/s) == 49
end
function updateGame()
if life == 0 then
sfx(4,20,130)
currentState = GameState.gameover
t=0
return
end
if t%sickLapse == 0 then
life=life-1
end
if t%60 == 0 then
sickCounter = sickCounter - 1
secondsAlive = secondsAlive + 1
end
if sickCounter==0 and sickLapse>1 then
sickLapse=math.max(sickLapse-2,1)
sickCounter=20
end
p:direct()
p:update()
if isOnMarket() then
if btnp(5) then -- B (X key)
if currentState == GameState.game then sfx(1,68,-1,3) end
currentState = GameState.market
end
end
if not canAddCoin() then coinTimer=coinCooldown
elseif coinTimer>0 then coinTimer=coinTimer-1 end
if coinTimer == 0 then
for i=1, coinSpawnCount do
addRandomCoin()
end
end
-- Coin market, capped to 9.9
valueBlue=math.floor((math.sin(t/200)+1)*50)/10
if t%60 == 0 then
valueRed=math.random(0,99)/10
end
valueYellow=math.min(.1*coinYellow*coinYellow, 9.9)
end
function updateMarket()
if btnp(0) then -- Up
if marketSelection ~= MarketOptions.blue then
marketSelection = marketSelection - 1
end
elseif btnp(1) then -- Down
if marketSelection ~= MarketOptions.done then
marketSelection = marketSelection + 1
end
elseif btnp(4) then -- A (Z key)
if marketSelection == MarketOptions.blue then
if coinBlue > 0 then sfx(3,44,-1,1) end
life = life + math.floor(coinBlue*valueBlue)
coinBlue=0
elseif marketSelection == MarketOptions.red then
if coinRed > 0 then sfx(3,44,-1,1) end
life = life + math.floor(coinRed*valueRed)
coinRed=0
elseif marketSelection == MarketOptions.yellow then
if coinYellow > 0 then sfx(3,44,-1,1) end
life = life + math.floor(coinYellow*valueYellow)
coinYellow=0
elseif marketSelection == MarketOptions.all then
if (coinBlue + coinRed + coinYellow) > 0 then sfx(3,44,-1,1) end
life = life + math.floor(coinBlue*valueBlue)
life = life + math.floor(coinRed*valueRed)
life = life + math.floor(coinYellow*valueYellow)
coinBlue=0
coinRed=0
coinYellow=0
elseif marketSelection == MarketOptions.done then
currentState = GameState.game
end
life=math.min(life,100)
elseif btnp(5) then -- B (X key)
currentState = GameState.game
end
end
p=Player
function TIC()
update(currentState)
draw(currentState)
t=t+1
end
-- <TILES>
-- 001:0bbbbbbbbb5b55b5b54544545444444444444444444444c44c44444444444444
-- 002:bbbbbbbb5b55b55b454454454444444444444444444444c44c44444444444444
-- 003:bbbbbbb0b55b555b544544554444444544444444444444c44c44444444444444
-- 017:444444444444c4444c444444444444c444444444444444c444c4444444444444
-- 032:000000000000ffff0000fff600fffff600fffff600ff666600ff666600fffff6
-- 033:00000000ffff00006fff00006fffff006fffff006666ff006666ff006fffff00
-- 048:00fffff600fffff600ffffff00f3333300f3333300f33ff300f33ff300f33ff3
-- 049:6fffff006fffff00ffffff0033333f0033333f003ff33f003ff33f003ff33f00
-- 064:03aaaa3703aaaa3703aa3a3703aaaa3703aaaa3703aaaa3703a3aa3703aaaa37
-- 065:03aaaa3703aa3a3303aaaaaa03aaaaaa03aaaa3a033aaaaa0033333300000000
-- 066:7777777777777777777777777777777777777777777777777777777777777777
-- 080:0088880008822880082882800828828008288280082882800882288000888800
-- 081:00cccc000cc66cc00c6cc6c00c6cc6c00c6cc6c00c6cc6c00cc66cc000cccc00
-- 082:00eeee000ee99ee00e9ee9e00e9ee9e00e9ee9e00e9ee9e00ee99ee000eeee00
-- 083:0660066066666666666666666666666666666666066666600066660000066000
-- 084:000008880000880000880000008eeeee08ee00008ee666608666006680000000
-- 085:0333333333000000300000003000000030000000300000003300000003333333
-- 086:3333333300000000000000000000000000000000000000000000000033333333
-- 096:7773377777733377777333373333333333333333777333377773337777733777
-- 097:0006660000660000066000000660000006600000066000000066000000066600
-- 192:0000000000000000000000000000000000000000000000000000000000000003
-- 193:0000000000000000000033370033377703377777337777773377777737777777
-- 194:0000000000000000777770007777777077777777777777777777777777777777
-- 195:0000000000000000000000000000000000000000700000007700000077700000
-- 208:0000000300000033000003330000033700000337000003370000033700000337
-- 209:3777777777777777777777777777733377773333777333337733377377337773
-- 210:7777777777777733777773337777733737337337373373333733733337337337
-- 211:7770000037770000337700007377000073770000337700003777000077770000
-- 224:0000033700000337000003370000033700000337000003370000033700000337
-- 225:7733777377333333773333377733733377337733773377777777777777777777
-- 226:3733733777337337773377777733777737777777777777777777777777777777
-- 227:7777000077770000777700007777000077770000777700007770000077000000
-- 240:0000033700000337000003370000033700000337000000000000000000000000
-- 241:7777777777777777777777707777000000000000000000000000000000000000
-- 242:7777777077770000000000000000000000000000000000000000000000000000
-- </TILES>
-- <SPRITES>
-- 001:000000000000000000001100000111100000cc00000666600006c66c00080080
-- 002:0000000000001100000111100000cc00000666600006c66c0008008000080080
-- 003:0000000000001100000111100000cc000006c66c000666600008008000080080
-- 004:000000000000000000001100000111100000cc000006c66c0006666000080080
-- 017:0000000000001100000111100000cc00000666600006c66c0008008000000080
-- 018:000000000000000000001100000111100000cc00000666600006c66c00080080
-- 019:0000000000001100000111100000cc00000666600006c66c0008008000080000
-- 020:000000000000000000001100000111100000cc00000666600006c66c00080080
-- 033:00001100000111100000cc0c00066c6000066660000800800080008000000000
-- 034:000011000001111000c0cc0c0006666000066660000800880000800000000000
-- 065:0088880008822880082882800828828008288280082882800882288000888800
-- 066:0008800000882200008828000088280000882800008828000088220000088000
-- 067:0008800000288200002882000028820000288200002882000028820000088000
-- 068:0008800000228800008288000082880000828800008288000022880000088000
-- 081:00cccc000cc66cc00c6cc6c00c6cc6c00c6cc6c00c6cc6c00cc66cc000cccc00
-- 082:000cc00000cc660000cc6c0000cc6c0000cc6c0000cc6c0000cc6600000cc000
-- 083:000cc000006cc600006cc600006cc600006cc600006cc600006cc600000cc000
-- 084:000cc0000066cc0000c6cc0000c6cc0000c6cc0000c6cc000066cc00000cc000
-- 097:00eeee000ee99ee00e9ee9e00e9ee9e00e9ee9e00e9ee9e00ee99ee000eeee00
-- 098:000ee00000ee990000ee9e0000ee9e0000ee9e0000ee9e0000ee9900000ee000
-- 099:000ee000009ee900009ee900009ee900009ee900009ee900009ee900000ee000
-- 100:000ee0000099ee0000e9ee0000e9ee0000e9ee0000e9ee000099ee00000ee000
-- 129:0a66aaa0aa6a6aaaaa6666aaaa6aa6aa3a6666a303aaaa30003aa30000033000
-- 145:0000000006666660066006600660066006666660066006600660066000000000
-- 146:0000000006666000066066000666666006600660066006600666666000000000
-- </SPRITES>
-- <MAP>
-- 001:111111111111111111111111111111111111111111111111111111111111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
-- 002:110000000000000000000000000000000000000000000000000000000011000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
-- 003:110000000000000000000000000000000000000000000000000000000011000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
-- 004:110000000000000000000000000000000000000000000000000000000011000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
-- 005:110000000000000000000000000000000000000000000000000000000011000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
-- 006:112030000010202030000000000000000000000000102020300000102011000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
-- 007:111111000011111100000000000002120000000000001111110000111111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
-- 008:110000000000000000000000000003130000000000000000000000000011000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
-- 009:110000000000000000000010202020202020300000000000000000000011000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
-- 010:110000000000000000000000111111111111000000000000000000000011000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
-- 011:110000000000000000000000001111111100000000000000000000000011000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
-- 012:110010202020300000000000000000000000000000001020202020300011000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
-- 013:110011111111000000001030000000000000103000000000111111110011000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
-- 014:110000000000000000000000000000000000000000000000000000000011000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
-- 015:110000000000000000000000000000000000000000000000000000000011000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
-- 016:112020202020202020202020202020202020202020202020202020202011000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
-- 021:00000c1c2c3c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
-- 022:00000d1d2d3d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
-- 023:00000e1e2e3e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
-- 024:00000f1f2f3f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
-- </MAP>
-- <WAVES>
-- 000:00000000ffffffff00000000ffffffff
-- 001:0123456789abcdeffedcba9876543210
-- 002:0123456789abcdef0123456789abcdef
-- </WAVES>
-- <SFX>
-- 000:0040004000a000a000f000f010f020f030f040f050f060f070f080f090f0a0f0b0f0c0f0d0f0e0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0400000000000
-- 001:01f011f021f031f041f061f081f0a1f0c1f0d1f0e1f0f1f0f100010001001100110011002100310041005100610071008100a100c100d100e100f100577000000000
-- 002:02000200020002101210122022303250428062a072d092f0b2f0d2f0e2f0f2f0f2f0f2f0f2f0f2f0f2f0f2f0f2f0f2f0f2f0f2f0f2f0f2f0f2f0f2f0415000000000
-- 003:0000002010401020204020603040406040805060608060a0708070a080c090a0a0c0c0e0c0c0d0e0e0f0e0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0301000000000
-- 004:01f001f001f001f001f001b001b001b001b001b001700170017001700170010001200100012001000120010001200100012001000100010001000100167000000000
-- </SFX>
-- <PALETTE>
-- 000:140c1c44243430346d4e4a4e854c30346524d04648757161597dced27d2c8595a16daa2cd2aa996dc2cadad45edeeed6
-- </PALETTE>
-- <COVER>
-- 000:e4b000007494648393160f00880077000012ffb0e45445353414055423e2033010000000129f40402000ff00c2000000000f0088007841c0c10d6484e4a4e495d7ec2daa99ad4de5d6aac20343d62dd7c2edee6d58c40343564244424300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080ff001040800004021c28004082c58c0b1a3c780132a4c9841b263448507086c1081b3a74f84024218f842d36183950a4aac59c2b5abce830366cc28a0d08dcb98337aecd9c3b7afcf9f3f52d4108053e1830a15822c093034a2d28721102839f4baa551a23562d40ac5bba7dfac3f921dc8847002529902d294201089e8cf8963109c20359e6a48ba695e64f8b7b0a847a815426449629a26cca333128d5cc8b13e41b54bce955b495e6ede8c6dd208acb9d2bc539577a67e1dc95562500c1b86a609f6df6b68a92d03c6002bd022edae837bee0aa47c2a69c9a3e6141ef9137bdcc3c3f21ff867de62ffcbc75e6c5d8abfe2d7d00ef2242c77167c6899511a0ff8dd4ebcfd48c46d86075e0df36664ed91a7b70d15fea0f1db9f527c4a7a7530ece32106f69161b51805974a59873e997c0a36db9f6645954a9c75c166c6d1731e37371d5575681f5b4d75f77a10818db528d6740ed548d743097461db8036c8232c8d1d4775967651a4ddd55c36f8d19200460924e094461964e1984629a4e29c4639e4e390564925e49b421054a594426934a692427914a7904289a088946e596666976e6996679b6e79d6689f6e8917699866d9a6ad9272e9e6ae9072f997ed9082b9e72d918ee9586f978ef92862a48e2ae8a1af822a19a2a6463a09e5a2926a4966ac9e6ae9a5ad928af9ec94ae0a5a23a7a259aaeaaca6baeaeba0b6cffa84a8a4b6aaa96da6a6ea8aaea392eabbefadb6a9eb60bcbeda6b68a7ce8a5c22bbca2b0ca1be7aca2de4b4d65b6de5b646c5e95b4791247f9f80e68b2ee8b4e69b50929a52e7eda56beac7d157bfeed7fda6b6e6db6fedb8fef8092898f5564cd6b871cbf1627316589fe1c8072cf497aa66fbcee3c791cbac50c3075ca0f5c8176c8054ba083c9f1bb30b0cfd6bb5cdcb32b6c827ac6e23965aace2fbc0379b67a79137dc63fdce257a442ecc37fcc3b39e370d24bac8e60934f1d8432ce82fb9473de4f8bc03b9f4f4d45b55c175d8576db21bcd1b6de5f7d00ccc3428d4636da3f8d567ade430da67bd7471d04abd2770db4fec37fdd7374de62edc77cffc757fd087acc570e4876c26b095872e90f9d88b2ee8fdbc63e87fae8f87eb493eb6368d946abc41686f645d165e5f28e5b59b1162557f8dfe5b539786b3a8e3e6372a9db669a716b89d0fae8d19b2bfbe0b78bdbfdb5b7dea9f4a17beeda7d7fb79b1c3de0c51fb977c8cf7eeaf2fcb75fecbde78b1dd9ff76e29eebb5fc328f2cb952123e64308edf8eb2a8f2ee5e5ef96e4a75f45386088e6f7dfd51cda0c2060c20ef300ad4408004ff905608ffb00a20318ff360a00d1820c7c120908b0420240708a0430eb462851c506ae684b0002580bf732c21e20e0812c21a80758dfb61ab0108c2400a4035813ca1aa094813c31e60968f2ca12eec87642d1ab4ff648fa21262e888ea2322b4098f4af12bd2762ba7c94b4821baa5151f958c2922617457542610a0c40a2a2e0b03525c1327a4c8172db549ab80b2d26ca8d88d2bb1419a4ee329caa0e8aa2f51b15f8133d61dbcf60d204de135566443e2ba6617918c9c88658c7983b0881849a9327b8d2b799f1519f747953ba2937c84a6a0a487405a525b589c54a6cee839c75951359e94831cc2d2881c42cc639d5be423beb86bab2e81f59908856004067ac74e5a4799c2a32b25a4cbc44ef23394435558295557c8f0c27996a48d1ff2a9794a6203da9bf293a8fcf80e438164810c007c9a15e48d498883b024e427a2eef6eeb408a3b42beb0cd0eae82f4104a5412bfff4d729421458bde5cd0f9cfcc76f37d9209b0dee8f68eb186c3b0a015f7e742534d1b7639ad66fbc8edf4d67dc4b170f28614a063054ad1c19650f28014d069de389eb2bdffa78035e1aa0f6823d512d436a43552e7dec9c942b1313e8052d9a7d0e94630a2a275a55aa56159299ca5522571543b4b903f69e5caaa3479ae4c69e25d8a352e8e5491ac554b1eda3a36d65e45d95d7369e557e676533e6a2da95547285daa455365a5315b659b5855ca77bb76959ead6533dd51aac756b606969d8b2b6c559a68ddb6e5dd6f4c4cd41bd6993b364fe1b0830c21a82b6eb119744dac852cd16f0549d7e9d13ead3d082351d45a5bd956188e6c63aad6877697dff64f26b57dc2ec6d4bf1118686d2ae6d8a6ade47515c8434f7b99d82276d3bf9dfae7443aa3986e101ab04929095b32f152960014a825a0aa45aba29ce6947cbcd5196a473adc59413dc32f2db96f0f6a93dc1287952deda1eb7d688fd716e4f4b54329cf45a524d9f264efb17c00315d8b17410ba4c1ba55407f7b7bba545928dab116dc227d7bcf54c29672cdbd0ee1bc2bb85bda5b83c01660b8839472e659dbab2033617db62b9ed325aba4c3ad545db2bb7e5791e8dbb8e527958de46b5e2da7f74e1e2ca8baebd2cdfaac09c53521eb8b8c98522f3836c9b5e2a9b80c44a00b2c0bc02c717587f643e3b5a81a9b237e2ac22b0535e25956c71ef2bb2bffcc1c2d4a481ec66d23d985b42c5d714913be3a9aa623c856ed37b934c16675979994276443d9f553663219850c7dd747d114b2960f2f419b596e62c633d39e4a27ab3d48d82f7af777cd15b8f0dc6ae7a94ea7419e4573dab7b0d58573d8cea64ad4f85d8a5c47da3867b6e1d1877d74be5f55cfa0c6b5f17857d76c5a8ab8d2438538ba4dcce4adaad7dd42aea5bfad8dec6b6b372cf32f294bcb72df6b8b3cd4e67028bdcd3e64779b34abeede6ab9ddaee873cb7edeee67b945edef30d6c47fd0fdcfec4dfd6350872950ed4e283fb90e70fbfa2cffdb0f0873c70ef0738fd437dc0ea8b5cf2e04d5c26c73ec1fe8ba2b9a027d0ff8ddc53ea378c94e4881203e9c74ec2739b8cd5e82f59b95fc9e1fa9bdcf6e94a08000b3
-- </COVER>