einhander.lua 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661
  1. -- title: einhander
  2. -- author: pixelbath
  3. -- desc: one-handed
  4. -- script: lua
  5. -- https://gamefaqs.gamespot.com/ps/197217-einhander/faqs/61724
  6. -- TODO:
  7. -- configurable controls
  8. -- enemy collisions
  9. seed=12345
  10. player={
  11. x=20, y=50,
  12. vx=0, vy=0,
  13. speed=1.5,
  14. inv=0,
  15. show=1,
  16. fire=0,
  17. gun_down=0,
  18. gun_anim=0,
  19. gun_held=0,
  20. is_firing=0,
  21. big_gun_cooldown=0,
  22. }
  23. gunsprites={
  24. 292, -- vulcan
  25. 294, -- cannon
  26. 296, -- spreader
  27. 298, -- wasp
  28. 300, -- grenade
  29. 302, -- hedgehog
  30. }
  31. gunnames={
  32. {324, "V", "ULCAN"},
  33. {325, "C", "ANNON"},
  34. {326, "S", "PREADER"},
  35. {327, "W", "ASP"},
  36. {328, "G", "RENADE"},
  37. {329, "H", "EDGEHOG"},
  38. }
  39. vulcanMuzzleSprites={
  40. 264, 266, 280
  41. }
  42. shellParticles={}
  43. -- particles are just white pixels by default
  44. for i=1,15 do
  45. table.insert(shellParticles, {x=0,y=0,vx=0,vy=0,age=0,dieAt=0,color=12,idx=0,isPixel=true})
  46. end
  47. particlePointer=1 -- points at the next particle to be spawned
  48. weaponBgSize=16--12
  49. p_bullets = {}
  50. p_big_bullets = {}
  51. multiplier = 12
  52. multiplier_sub = 0
  53. multiplier_tick = 0
  54. score = 25000
  55. active_enemies={}
  56. t=0
  57. math.randomseed(seed)
  58. -- create a mapping for darkening palette colors
  59. -- note: this is for the default sweetie16 palette
  60. drk={[0]=0,0,1,2,3,6,7,15,0,8,9,10,13,14,15,0}
  61. -- entity interface:
  62. -- props: x, y, vx, vy, speed, t
  63. -- methods: update, draw, setPosition
  64. function createEntity(x, y, speed, t)
  65. local tm = t or 0
  66. local spd = speed or 0
  67. return { x=x, y=y, vx=0, vy=0, speed=spd, t=tm }
  68. end
  69. local gunCounter = createEntity(50, 60)
  70. gunCounter.value = 3000
  71. gunCounter.p_val = 3000
  72. gunCounter.t_def = 5
  73. gunCounter.max_val = 3000
  74. gunCounter.swaps = {}
  75. function gunCounter:setValue(val)
  76. self.value = val
  77. self.p_val = val
  78. self.max_val = val
  79. end
  80. function gunCounter:setPosition(x, y)
  81. self.x = x
  82. self.y = y
  83. end
  84. function gunCounter:dec()
  85. if self.value > 0 then
  86. self.p_val = self.value
  87. self.value = self.value - 1 -- decrement
  88. self.t = self.t_def -- reset timer
  89. -- grab string differences and store indices in .swaps
  90. local prev = string.format("%04d", self.p_val)
  91. local cur = string.format("%04d", self.value)
  92. self.swaps = {}
  93. for i=1,4 do
  94. if prev:sub(i,i) ~= cur:sub(i,i) then
  95. self.swaps[i] = true
  96. end
  97. end
  98. end
  99. end
  100. function gunCounter:update()
  101. end
  102. function gunCounter:draw()
  103. self.t = self.t - 1
  104. if self.t == 0 then
  105. self.swaps = {}
  106. self.p_val = self.value
  107. end
  108. local prev = string.format("%04d", self.p_val)
  109. local cur = string.format("%04d", self.value)
  110. local color = 12
  111. if self.value / self.max_val < 0.1 then color = 4 end
  112. -- clip this area
  113. clip(self.x - 1, self.y - 2, 18, 10)
  114. for i = 1,4 do
  115. local numY = self.y
  116. if self.t > 0 and self.swaps[i] then
  117. numY = self.y - (self.t_def - self.t)
  118. print(prev:sub(i, i), self.x + ((i-1)*4), numY + 6, color, true, 1, true)
  119. end
  120. print(cur:sub(i, i), self.x + ((i-1)*4), numY, color, true, 1, true)
  121. end
  122. clip()
  123. end
  124. function drawParallelogram(x, y, w, h, skewpx, color)
  125. tri(x+skewpx, y, x+w, y+h, x, y+h, color)
  126. tri(x+skewpx, y, x+w, y+h, x+w+skewpx, y, color)
  127. end
  128. function spawnPixelParticle(x, y, vx, vy, age, dieAt, color)
  129. local p = shellParticles[particlePointer]
  130. p.x = x
  131. p.y = y
  132. p.vx = vx
  133. p.vy = vy
  134. p.age = age
  135. p.dieAt = dieAt
  136. p.color = color
  137. p.isPixel = true
  138. particlePointer = particlePointer + 1
  139. if particlePointer > 15 then particlePointer = 1 end
  140. end
  141. function spawnSpriteParticle(x, y, vx, vy, age, dieAt, index)
  142. local p = shellParticles[particlePointer]
  143. p.x = x
  144. p.y = y
  145. p.vx = vx
  146. p.vy = vy
  147. p.age = age
  148. p.dieAt = dieAt
  149. p.idx = index
  150. p.isPixel = false
  151. particlePointer = particlePointer + 1
  152. if particlePointer > 15 then particlePointer = 1 end
  153. end
  154. function spawnEnemySprite(x, y, age, type)
  155. local e = {}
  156. e.hp = 0
  157. e.hp_shield = 0
  158. e.x = x
  159. e.y = y
  160. e.age = age
  161. e.type = type
  162. if type == 1 then
  163. e.hp = 100
  164. e.hp_shield = 50
  165. end
  166. table.insert(active_enemies, e)
  167. end
  168. spawnEnemySprite(150, 50, 0, 1)
  169. function updateEnemies()
  170. for i=1,#active_enemies do
  171. local e = active_enemies[i]
  172. -- car - medium
  173. if e.type == 1 then
  174. end
  175. e.age = e.age + 1
  176. end
  177. end
  178. function drawEnemies()
  179. for i=1,#active_enemies do
  180. local e = active_enemies[i]
  181. -- car - medium
  182. if e.type == 1 then
  183. -- shield
  184. spr(352, e.x, e.y, 0, 1, 0, 0, 2, 1)
  185. -- body
  186. spr(354, e.x + 6, e.y, 0, 1, 0, 0, 3, 1)
  187. end
  188. end
  189. end
  190. function drawPlayer()
  191. if (player.show) then
  192. -- arm
  193. if player.gun_anim > 0 then
  194. --spr(260, player.x+12, player.y+11, 0, 1, 0, 3, 2, 1)
  195. else
  196. if player.gun_down then
  197. spr(260, player.x+12, player.y+11, 0, 1, 0, 0, 2, 1)
  198. else
  199. spr(260, player.x+12, player.y-2, 0, 1, 2, 0, 2, 1)
  200. end
  201. end
  202. -- ship
  203. spr(256, player.x, player.y, 0, 1, 0, 0, 4, 2)
  204. end
  205. -- draw regular bullets
  206. for key,val in ipairs(p_bullets) do
  207. spr(262, val.x, val.y, 0)
  208. end
  209. -- draw big bullets
  210. for key,val in ipairs(p_big_bullets) do
  211. local spritenum = 0
  212. if val.type == 2 then spritenum = 282 end
  213. if val.type == 3 then spritenum = 267 end
  214. spr(spritenum, val.x, val.y, 0)
  215. end
  216. -- custom routines depending on gun held
  217. if player.gun_held > 0 then
  218. local gunsprite = gunsprites[player.gun_held]
  219. local gunpos = player.y - 2
  220. if player.gun_down then
  221. gunsprite = gunsprite + 16
  222. gunpos = gunpos + 14
  223. end
  224. if player.gun_anim > 0 then
  225. spr(gunsprite, player.x+3, gunpos, 0, 1, 0, 3, 2, 1)
  226. else
  227. spr(gunsprite, player.x+12, gunpos, 0, 1, 0, 0, 2, 1)
  228. end
  229. -- vulcan
  230. if player.gun_held == 1 then
  231. local flipfire = 0
  232. local muzzleIdx = math.random(0,3)
  233. if math.random(1, 2) == 2 then
  234. flipfire = 2
  235. end
  236. if player.fire == 0 then
  237. player.fire = 2
  238. else
  239. player.fire = player.fire - 1
  240. end
  241. -- not tracking individual bullets with vulcan
  242. -- begin dakka
  243. if player.is_firing > 0 then
  244. if muzzleIdx > 0 then
  245. if player.gun_down then
  246. spr(vulcanMuzzleSprites[muzzleIdx], player.x + 27, player.y + 14, 0, 1, flipfire, 0, 2, 1)
  247. else
  248. spr(vulcanMuzzleSprites[muzzleIdx], player.x + 28, player.y - 2, 0, 1, flipfire, 0, 2, 1)
  249. end
  250. end
  251. if t % 10 == 0 then
  252. local randFactor = math.random(10,100)
  253. local spawnOffsetY = 1
  254. local lineStart = math.random(player.x//1+20, 260)
  255. if player.gun_down then
  256. spawnOffsetY = 18
  257. -- vulcan tilts downward so we get to do trig! yay!
  258. lineStart = lineStart - player.x
  259. local angle = 8
  260. local radius2 = lineStart+38
  261. local c = math.cos(angle * math.pi / 180)
  262. local s = math.sin(angle * math.pi / 180)
  263. line(c * lineStart + player.x + 18, s * lineStart + player.y + 17, c * radius2 + player.x + 18, s * radius2 + player.y + 17, 14)
  264. else
  265. line(lineStart, player.y+1, lineStart+40, player.y+1, 14)
  266. end
  267. -- shells
  268. spawnPixelParticle(player.x+14, player.y+spawnOffsetY, -0.2, -0.6 + (randFactor / 100), 0, 50, 15)
  269. end
  270. end
  271. -- update shells with light gravity
  272. for i=1,#shellParticles do
  273. local p = shellParticles[i]
  274. p.vy = p.vy + 0.1
  275. end
  276. end
  277. -- cannon
  278. if player.gun_held == 2 then
  279. if player.fire == 0 then
  280. player.fire = 30
  281. else
  282. player.fire = player.fire - 1
  283. end
  284. -- todo: move to update()
  285. for i=1, #p_big_bullets do
  286. if p_big_bullets[i].x < 250 then
  287. p_big_bullets[i].x = p_big_bullets[i].x + 10
  288. end
  289. end
  290. end
  291. end
  292. for i=1,#shellParticles do
  293. local p = shellParticles[i]
  294. if p.age < p.dieAt then
  295. if p.isPixel then
  296. pix(p.x, p.y, p.color)
  297. else
  298. spr(p.idx, p.x, p.y)
  299. end
  300. end
  301. end
  302. if player.gun_anim > 0 then player.gun_anim = player.gun_anim - 1 end
  303. end
  304. function drawUI()
  305. -- weapon bg
  306. -- spr(322, 4, 114, 0, 1, 0, 0, 1, 2)
  307. -- rect(12, 114, 8, 16, 6)
  308. -- spr(323, 20, 114, 0, 1, 0, 0, 1, 2)
  309. drawParallelogram(6, 115, weaponBgSize, 12, 6, 6)
  310. -- selected weapon
  311. if player.gun_held > 0 then
  312. local lettersprite = gunnames[player.gun_held][1]
  313. local guntext = gunnames[player.gun_held][3]
  314. spr(lettersprite, 14, 118, 0, 1)
  315. print(guntext, 24, 122, 12, true, 1, true)
  316. print(gunCounter.value, 12, 129, 12, true, 1, true)
  317. end
  318. gunCounter:draw()
  319. -- multiplier
  320. -- TODO: need to do multipliers over 10, so the X needs to move left when that happens
  321. spr(340, 164, 114, 0)
  322. --spr(340 + multiplier, 172, 113, 0)
  323. spr(330, 180, 114, 0, 1, 0, 0, 4, 1)
  324. spr(331, 212, 114, 0, 1, 0, 0, 3, 1)
  325. spr(334, 236, 114, 0, 1)
  326. if multiplier_sub > 0 then
  327. for i = 1, multiplier_sub do
  328. spr(335, 177 + (i * 6), 114, 0)
  329. end
  330. end
  331. -- score
  332. local scorestring = tostring(score)
  333. for i = 1, #scorestring do
  334. local char = scorestring:sub(i, i)
  335. local numsprite = 340 + tonumber(char)
  336. -- this is a hack because I ordered the numbers weirdly
  337. if char == "0" then numsprite = 350 end
  338. spr(numsprite, (230 - (8 * #scorestring)) + (i * 8), 123, 0)
  339. end
  340. end
  341. function drawWater(waterHeight)
  342. tm=time()/200
  343. for x=0,239 do
  344. for y=waterHeight,135 do
  345. -- introduce some wobble
  346. ox=x+2*math.sin(tm+y)
  347. oy=waterHeight-(y-waterHeight)-1
  348. oc=pix(ox,oy)
  349. -- darken reflected pixel
  350. pix(x,y,drk[oc])
  351. end
  352. end
  353. end
  354. function drawDebug()
  355. -- print("p.gdown: " .. tostring(player.gun_down), 5, 5, 12, true, 1, true)
  356. -- print("spr: " .. tostring(vulcanMuzzleSprites[player.fire + 1]), 5, 13, 12, true, 1, true)
  357. end
  358. function update()
  359. player.vx = 0
  360. player.vy = 0
  361. if btn(0) then
  362. player.vy=-player.speed
  363. end
  364. if btn(1) then
  365. player.vy=player.speed
  366. end
  367. if btn(2) then
  368. player.vx=-player.speed
  369. end
  370. if btn(3) then
  371. player.vx=player.speed
  372. end
  373. -- slow down diagonal movements
  374. if player.vx * player.vy ~= 0 then
  375. player.vx = player.vx * 0.707
  376. player.vy = player.vy * 0.707
  377. end
  378. player.x = player.x + player.vx
  379. player.y = player.y + player.vy
  380. gunCounter:setPosition(player.x + 8, player.y + 22)
  381. if player.x < 5 then player.x = 5 end
  382. if player.x > 220 then player.x = 220 end
  383. if player.y < 5 then player.y = 5 end
  384. if player.y > 128 then player.y = 128 end
  385. -- A: fire main gun
  386. if btn(4) then
  387. if player.fire == 0 then
  388. player.fire = 5
  389. table.insert(p_bullets, {x=player.x+10, y=player.y+2})
  390. else
  391. player.fire = player.fire - 1
  392. end
  393. end
  394. -- B: fire accessory gun
  395. if btn(5) then
  396. if player.gun_held == 1 then
  397. player.is_firing = 1
  398. gunCounter:dec()
  399. end
  400. if player.gun_held == 2 then
  401. -- controlled by cooldown (or semi-auto)
  402. if player.is_firing == 1 then player.is_firing = 0 end
  403. if player.big_gun_cooldown == 0 then
  404. player.big_gun_cooldown = 30
  405. player.is_firing = 1
  406. gunCounter:dec()
  407. else
  408. player.big_gun_cooldown = player.big_gun_cooldown - 1
  409. player.is_firing = 0
  410. end
  411. if player.is_firing == 1 then
  412. table.insert(p_big_bullets, {x=player.x+12, y=player.y+6, type=player.gun_held})
  413. end
  414. end
  415. else
  416. player.big_gun_cooldown = 0
  417. player.is_firing = 0
  418. end
  419. -- X: switch arm
  420. if btnp(6) then
  421. player.gun_down = not player.gun_down
  422. player.gun_anim = 1
  423. end
  424. -- Y: swap weapon (debug)
  425. if btnp(7) then
  426. player.gun_held = player.gun_held + 1
  427. if player.gun_held > 6 then player.gun_held = 0 end
  428. end
  429. for key,val in ipairs(p_bullets) do
  430. p_bullets[key].x = p_bullets[key].x + 8
  431. if val.x > 240 then
  432. table.remove(p_bullets, key)
  433. end
  434. end
  435. for key,val in ipairs(p_big_bullets) do
  436. p_big_bullets[key].x = p_big_bullets[key].x + 8
  437. if val.x > 240 then
  438. table.remove(p_big_bullets, key)
  439. end
  440. end
  441. for i=1,#shellParticles do
  442. local p = shellParticles[i]
  443. p.x = p.x + p.vx
  444. p.y = p.y + p.vy
  445. p.age = p.age + 1
  446. end
  447. t=t+1
  448. end
  449. function TIC()
  450. update()
  451. cls(0)
  452. drawPlayer()
  453. drawEnemies()
  454. drawWater(120)
  455. drawUI()
  456. drawDebug()
  457. end
  458. -- <TILES>
  459. -- 000:00ffffff00ffffff00ffffff00ffffff00ffffff00ffffff00ffffff00ffffff
  460. -- 001:ffffffeeffffffeeffffffeeffffffeeffffffeeffffffeeffffffeeffffffee
  461. -- 004:eee00000e0e00000efe00000f0f0fff0f0f0000000f000000000000000000000
  462. -- 005:eee00000e0e00000efe00000f0f0fff0f0f0f0f000f000000000000000000000
  463. -- 006:eee00000e0e00000efe00000f0f0fff0f0f0000000f000000000000000000000
  464. -- 007:eee00000e0e00000efe00000f0f0fff0f0f0f0f000f000000000000000000000
  465. -- 016:ffffffffffffffffffffffffffbbbffbffbbbffbffffffffffffffffffffffff
  466. -- 017:ffffffffffffffffffffffffbbffffffbbffffffffffffffffffffffffffffff
  467. -- 020:0000000000000000000000000099008800aa0088009a00880088000000000000
  468. -- 021:000000000000000000000000009a00aa00aa00aa009900990088008800000000
  469. -- 022:0000000000000000000000000099009900aa00a900aa00aa0088008800000000
  470. -- 023:000000000000000000000000009a009a00aa009a009900990088008800000000
  471. -- 033:ffffffffffffffffffffffffbbf888ffbbf888fbffffffffffffffffffffffff
  472. -- </TILES>
  473. -- <SPRITES>
  474. -- 000:04488a844488aaaa4889999a00000d99000000d90000000d0000000000000000
  475. -- 001:48000000889aa000aa889aa09aaa899a99aaa884999aa8430d99a43f00d999ff
  476. -- 002:000000000000000000000000a00000004400000038ddc000f8998000ff88dbc0
  477. -- 004:0d000000d9add0009999addd8122999900128889000890080000000000000000
  478. -- 005:000000000000000000000000d000000080000000800000000000000000000000
  479. -- 006:0000000000000000000000000000440044444cc0000044000000000000000000
  480. -- 007:000000000000000000000000eddc0000fee00000000000000000000000000000
  481. -- 008:00000000000000000cc40000ccccccccccccccc404cc00000000000000000000
  482. -- 009:000000000000000000000000ccc4400000000000000000000000000000000000
  483. -- 010:0000000000000000033000003333300033330000033000000000000000000000
  484. -- 017:0009aaaa00088999000eee080000000000000000000000000000000000000000
  485. -- 018:ffeeeddcaf0fffed880e65fe0000eed000000000000000000000000000000000
  486. -- 019:00000000b0000000d00000000000000000000000000000000000000000000000
  487. -- 020:0d000000d9add0009999addd8122999900128888000890000000000000000000
  488. -- 021:0000000000000000000000009d00000098000000880000000000000000000000
  489. -- 022:0300000034300000030000000000000000000000000000000000000000000000
  490. -- 023:000000000000000000000000eddd0000feed0000000000000000000000000000
  491. -- 024:0000000000000000033300004444333344444433033300000000000000000000
  492. -- 025:0000000000000000000000000000000033000000000000000000000000000000
  493. -- 026:0000000000000000000000000004444000444444000444400000000000000000
  494. -- 032:0000000011101300211023003210340043104c0056705c006770650077707500
  495. -- 036:00000000000000000edce000f999edddfffffeee000099dd0000fff000000000
  496. -- 037:0000000000000000000000d0dddddd9deeeeeefe000000f00000000000000000
  497. -- 038:00000000000000000000dddd0dd0ffe3defddeeed2eeeff9ff00feed00000ff0
  498. -- 039:0000dde00ddee900ee9000003000000000000000d00000000000000000000000
  499. -- 040:000000000000000001eeef00d1e77770d3766667c4d66666000000ee00000000
  500. -- 041:00000000000000000000000077700750f565065077776e500077755000000000
  501. -- 042:0000000000000000000c555c000b646b000b666b0009777900000ff000000000
  502. -- 043:0000000000000000540000006300000063000000720000000000000000000000
  503. -- 044:00000000000000000000edd600006ed600dd7ff600ee777700000fe000000000
  504. -- 046:00000000000dd0dd000ee0ee000ee0ee000444440003fff30003333300000000
  505. -- 048:88808a0098809a00a980ab00ba80bc00cdf0cc00def0dc00ef80ed00f880fd00
  506. -- 052:000000000fedc0000f999e0000fffddd00009eee0000f9de0000fff000000000
  507. -- 053:000000000000000000000000d0000000dddd000deeeeddd9000eeefd000000f0
  508. -- 054:00000000000000000ddd099dd2e9dffefeeeeee90000fff00000feed00000000
  509. -- 055:0000000000000000ddddd000eeeeeeee34000000000000000000000000000000
  510. -- 056:00000000000000005577700e5e677776560565f7570077700000000000000000
  511. -- 057:0000000000000000e00000006666d4c0666673d07777e1d00feee10000000000
  512. -- 058:000000000000000000000ff0000c555c000b666b000b636b0009777900000000
  513. -- 059:0000000000000000000000005400000062000000620000007200000000000000
  514. -- 060:0000000000000000000dd000006665dd006ed6ee007ee600007eff0000000000
  515. -- 062:000000000000000000444440004fff400033333000fe0fe000ed0ed000ee0ee0
  516. -- 068:0c00000c0c00000c0cc000cc00c000c000cc0cc0000c0c00000ccc000000c000
  517. -- 069:00ccccc00cc000c00c0000000c0000000c0000000c0000000cc000c000ccccc0
  518. -- 070:00ccccc00cc000000c0000000ccccc0000000cc0000000c000000cc00ccccc00
  519. -- 071:0c00000c0c00000c0c00c00c0c00c00c0c00c00c0c00c00c0cc0c0cc00ccccc0
  520. -- 072:00ccccc00cc000c00c0000000c0000000c00ccc00c0000c00cc000c000ccccc0
  521. -- 073:0c0000c00c0000c00c0000c00cccccc00c0000c00c0000c00c0000c00c0000c0
  522. -- 074:00dddddd000dd0000000dd00000dd00000dd00000dd0000d0ddddddd00000000
  523. -- 075:dddddddd0dd0000d00dd00000dd0000ddd0000ddd0000dd0dddddddd00000000
  524. -- 076:ddddddddd0000dd0dd0000ddd0000dd00000dd00000dd000dddddddd00000000
  525. -- 077:dddddddd000dd0000000dd00000dd00000dd00000dd0000ddddddddd00000000
  526. -- 078:dd0000000dd0000000d000000dd00000dd000000d00000000000000000000000
  527. -- 079:0000000000333300000333300033330003333000333300000000000000000000
  528. -- 080:0000b000000aabb000a999aa0090ffe90000fffe00000ff00000000000000000
  529. -- 081:000000000000000000000000ab000000e9ab0000fee9ab0000fee9a00000fee0
  530. -- 084:000000000c000c0000c0c000000c000000c0c0000c000c000000000000000000
  531. -- 085:00000000000ccc000000cc000000cc000000cc000000cc000000cc000000cc00
  532. -- 086:00000000000ccc0000c00cc000000cc00000cc00000cc00000cc000000ccccc0
  533. -- 087:00000000000ccc0000c00cc000000cc00000cc0000000cc000c00cc0000ccc00
  534. -- 088:00000000000ccc0000cccc0000c0cc000cc0cc000c00cc000cccccc00000cc00
  535. -- 089:0000000000ccccc000cc000000cccc0000000cc000000cc000c00cc0000ccc00
  536. -- 090:00000000000ccc0000cc00c000cc000000cccc0000cc0cc000cc0cc0000ccc00
  537. -- 091:0000000000ccccc000000cc000000cc00000cc000000cc00000cc000000cc000
  538. -- 092:00000000000ccc0000cc0cc000cc0cc0000ccc0000cc0cc000cc0cc0000ccc00
  539. -- 093:00000000000ccc0000cc0cc000cc0cc0000cccc000000cc000c00cc0000ccc00
  540. -- 094:00000000000ccc0000cc0cc000cc0cc000cc0cc000cc0cc000cc0cc0000ccc00
  541. -- 096:0000000000000000000000aa0000ae9900ae9998ae99998e944cc8889944cc88
  542. -- 097:00000000aadddddaae999eaa9999dddd8889ffeeee9999f08888880088888000
  543. -- 098:000000000000000000000000000aaa9900a9eded0a9ededdd888888800000000
  544. -- 099:00000000000000cc00000bdbddd0bddeeeeddddfee9999998811222200000222
  545. -- 100:0000000000000000000ddb00fffee000bfcfa000999999003333334022222224
  546. -- </SPRITES>
  547. -- <MAP>
  548. -- 006:000000000112010110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
  549. -- 007:000000000101010110000000515161610000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
  550. -- 008:000000000101111210000000715161410000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
  551. -- 009:000000000101010110000000417161610000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
  552. -- 010:000000000101011210000000615161710000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
  553. -- 011:000000000101010110000000515171510000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
  554. -- 012:000000000101011210000000715161610000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
  555. -- 013:000000000112010110000000616141710000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
  556. -- 014:000000000101010110000000715161710000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
  557. -- 015:000000000101010110000000515161710000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
  558. -- 016:000000000101120110000000714161410000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
  559. -- </MAP>
  560. -- <WAVES>
  561. -- 000:00000000ffffffff00000000ffffffff
  562. -- 001:012345678acdeeffffeedca876543210
  563. -- 002:0123456789abcdef0123456789abcdef
  564. -- 003:ff000000000000000ff0000000000000
  565. -- 004:01234000000000000000000000000000
  566. -- </WAVES>
  567. -- <SFX>
  568. -- 000:01000101010201020101010f010e010e010f0101010201020101010f010e010e010f0101010201020101010f010e010e010f0101010201020101010f6020000000f9
  569. -- 001:9400940094009400940094009400a400a400a400a400b400b400b400b400b400b400b400c400c400c400c400d400d400d400e400e400f400f400f400212000000000
  570. -- 002:030f030e130d330c530b730a9309b309d308f308f308f308f308f308f308f308f308f308f308f308f308f308f308f308f308f308f308f308f308f308105000000000
  571. -- 003:85009500a500b500c500d500e500f500f500f500f500f500f500f500f500f500f500f500f500f500f500f500f500f500f500f500f500f500f500f500502000000000
  572. -- 004:6500750085009500a500b500c500d500e500f500f500f500f500f500f500f500f500f500f500f500f500f500f500f500f500f500f500f500f500f500572000000000
  573. -- </SFX>
  574. -- <PATTERNS>
  575. -- 000:40002200000000003000000050003a00000000003000000040002200000000003000000050003a000000000030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
  576. -- </PATTERNS>
  577. -- <TRACKS>
  578. -- 000:1800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e0000
  579. -- </TRACKS>
  580. -- <PALETTE>
  581. -- 000:1a1c2c5d275db13e53ef7d57ffcd75a7f07038b76425717929366f3b5dc941a6f673eff7f4f4f494b0c2566c86333c57
  582. -- </PALETTE>