Trevor Merritt e29ac45c84 scroll down works on CHIP-8 and High-Res modes
scroll left and right work in stdef and hidef
adds octo test roms
adds schip fonts to memory
2024-10-27 11:41:25 -04:00

1321 lines
25 KiB
Plaintext

###########################################
#
# Eaty The Alien
#
# An incredible intergalactic adventure.
#
# Use ASWD to move Eaty.
# Use E to activate Eaty's Magic Neck.
#
# Icons in the lower right corner indicate
# when you are standing on a special area.
# Find all three parts of Eaty's phone,
# activate it at the "C" marker and
# be on the marker with 4 arrows by
# the time the countdown ends.
# Watch your life force- every step you
# take on this inhospitable planet drains
# your health. Consume Skittles(tm)
# candies and drain the essence of flowers
# to stay alive.
#
###########################################
:alias px vd
:alias py vc
:alias pdir vb
:alias pframe va
:alias has-item v9 #(in pits)
:alias has-enemy v9 #(on ground)
:alias is-dead v8
:alias roomindex v7
:alias pitindex v6
:alias inventory v5
:alias timer v4
# v0-v3 are reserved as temporaries.
:const FACE_LEFT 0
:const FACE_RIGHT 128
:const KEY_LEFT 7
:const KEY_RIGHT 9
:const KEY_UP 5
:const KEY_DOWN 8
:const KEY_NECK 6
:const ITEM_X 12
:const ITEM_Y 32
:const START_LIFE 2
:const ROSE_LIFE 3
:const PIECES_LIFE 1
:const PART_1 8
:const PART_2 16
:const PART_3 32
:const ALL_PARTS 56
:const NOTHING 0
:const ROSE 1 # (in pit)
:const PIECES 1 # (on ground)
:const NECK_ESP 2
:const CALL_SHIP 4
:const GO_SHIP 5
:const TIMER_LO 20
:const TIMER_HI 8
###########################################
#
# Main Logic
#
###########################################
: main
loop
draw-title
hires
clear
randomize-loot
v0 := START_LIFE
v1 := 0
i := life-force-hi
save v1
px := 60
py := 16
pdir := 0
pframe := 0
has-item := 0
is-dead := 0
roomindex := 4
inventory := 0
timer := 0
draw-room
draw-hud
draw-eaty
main-loop
again
: draw-title
lores
clear
v0 := 0
v1 := 0
v2 := 32
i := title-screen
loop
sprite v0 v1 0
v0 += 16
i += v2
if v0 == 64 then v1 += 16
if v0 == 64 then v0 := 0
if v1 != 32 then
again
v0 := 48
v1 := 22
v2 := KEY_NECK
i := fingat
loop
sprite v0 v1 1
if v2 -key then
again
: wait-release
loop
if v2 key then
again
;
: draw-end
# display image
lores
clear
v0 := 16
v1 := 4
sprite v0 v1 0
v0 := 32
i += v0
sprite v0 v1 0
# show score
v1 := 22
v2 := -7
i := life-force-hi
draw-pair
i := life-force-lo
draw-pair
v0 := key
jump wait-release
: main-loop
spawn-room
loop
if has-enemy == 1 then draw-enemy
draw-eaty
draw-hud
save-position
move-overworld
dec-timer
if is-dead != 0 then return
draw-eaty
if vf != 0 then overworld-collide
if has-enemy == 1 then move-enemy
if has-enemy == 1 then draw-enemy
draw-hud
sync
again
;
###########################################
#
# Utility Routines
#
###########################################
: animate-magic-neck
i := eaty-neck
i += pdir
v0 := 32
v1 := 0
loop
sprite px py 0
sync
sprite px py 0
i += v0
v1 += 1
if v1 == 3 then buzzer := v1
if v1 != 4 then
again
;
: animate-death
i := eaty-walk
sprite px py 0
sync
sprite px py 0
i := die-0
sprite px py 0
sync
sprite px py 0
i := die-1
sprite px py 0
sync
v0 := key
is-dead := 1
i := game-over
jump draw-end
: move-right
if pdir == FACE_RIGHT begin
px += 2
else
pdir := FACE_RIGHT
pframe := -32
end
;
: move-left
if pdir == FACE_LEFT begin
px += -2
else
pdir := FACE_LEFT
pframe := -32
end
;
: draw-eaty
i := eaty-walk
i += pdir
i += pframe
sprite px py 0
;
: next-frame
pframe += 32
v0 := 127
pframe &= v0
dec-life
;
: sync
loop
vf := delay
if vf != 0 then
again
vf := 5
delay := vf
;
: wait
loop
vf := delay
if vf != 0 then
again
vf := 1
delay := vf
;
: position-temp 0x00 0x00 0x00
: save-position
v0 := px
v1 := py
v2 := pdir
i := position-temp
save v2
;
: restore-position
i := position-temp
load v2
px := v0
py := v1
pdir := v2
;
: iplus16
v0 <<= v0
v0 <<= v0
v0 <<= v0
v0 <<= v0
i += v0
;
: bounce-out
loop
if vf == 0 then return
draw-eaty
px := random 127
py := random 63
px += 2
if px > 110 then px += -63
py += 1
if py > 47 then py += -32
draw-eaty
again
;
###########################################
#
# Enemies
#
###########################################
: enemy-data 00 00
: spawn-room
has-enemy := 0
if roomindex == 1 then jump spawn-enemy
if roomindex == 3 then jump spawn-enemy
if timer == 0 then return
if roomindex != 4 then return
: spawn-enemy
has-enemy := 1
v0 := random 63
v0 += 32
v1 := 0
i := enemy-data
save v1
;
: draw-enemy
i := enemy-data
load v1
i := copter
sprite v0 v1 0
;
: move-enemy
i := enemy-data
load v1
vf := random 0b11
if vf == 0 then v0 += -3
if vf == 1 then v0 += 3
vf := 127
v0 &= vf
v1 += 1
vf := 63
v1 &= vf
i := enemy-data
save v1
# check player overlap
px += 128
py += 64
v0 += 128
v1 += 64
v0 += -16 if px < v0 then jump cleanup
v0 += 32 if px > v0 then jump cleanup
v1 += -16 if py < v1 then jump cleanup
v1 += 32 if py > v1 then jump cleanup
dec-life
dec-life
dec-life
dec-life
vf := 5
buzzer := vf
: cleanup
px += -128
py += -64
;
###########################################
#
# Hud and Life Force
#
###########################################
: timer-lo 00
: life-force-hi 00
: life-force-lo 00
: life-force-temp 0x00
: life-force-tens 0x00
: life-force-ones 0x00
: draw-hud
i := heart
v1 := 2
v2 := -7
sprite v1 v2 5
v1 += 6
i := life-force-hi
draw-pair
i := life-force-lo
draw-pair
v1 := -10
i := part-tiles
i += inventory
if timer != 0 then i := bighex timer
sprite v1 v1 8
if roomindex > 4 then return
loot-px
v1 := -19
v2 := -10
i := blank
if v0 == GO_SHIP then i := go-ship
if v0 == CALL_SHIP then i := call-ship
if v0 == NECK_ESP then i := neck-esp
if v0 == PIECES then i := pieces
sprite v1 v2 8
;
: draw-part
v0 := inventory
v0 &= vf
if v0 != 0 then sprite v1 v1 8
;
: draw-pair
load v0
i := life-force-temp
bcd v0
i := life-force-tens
draw-digit
i := life-force-ones
draw-digit
;
: draw-digit
load v0
i := hex v0
sprite v1 v2 5
v1 += 5
;
: dec-life
i := life-force-hi
load v1
vf := 1
v1 -= vf
if vf != 1 begin
v0 += -1
if v0 == -1 begin
animate-death
return
else
v1 := 99
end
end
i := life-force-hi
save v1
;
: dec-timer
if timer == 0 then return
i := timer-lo
load v0
if v0 == 0 begin
if timer == 1 begin
timer := 0
loot-px
if v0 != GO_SHIP then return
is-dead := 1
i := victory
jump draw-end
else
timer += -1
v0 := TIMER_LO
end
end
v0 += -1
i := timer-lo
save v0
;
: give-life # takes argument (in hundreds) in vf
i := life-force-hi
load v0
v0 += vf
i := life-force-hi
save v0
;
###########################################
#
# Overworld Logic
#
###########################################
: draw-room
v2 := 0
loop
this-room
# col stride is 4, data stride is 2, so shift right.
v0 >>= v2
i += v0
load v1
i := overworld-tiles
iplus16
sprite v2 v1 15
v2 += 4
if v2 != 128 then
again
;
: scroll-room-left
roomindex += 1
if roomindex == 5 then roomindex := 0
v2 := 124
v3 := 0
loop
this-room
i += v3
load v1
i := overworld-tiles
iplus16
scroll-left
sprite v2 v1 15
wait
v3 += 2
if v3 != 64 then
again
px := 1
spawn-room
;
: scroll-room-right
roomindex += -1
if roomindex == -1 then roomindex := 4
v2 := 0
v3 := 62
loop
this-room
i += v3
load v1
i := overworld-tiles
iplus16
scroll-right
sprite v2 v1 15
wait
v3 += -2
if v3 != -2 then
again
px := 111
spawn-room
;
: move-overworld
v0 := KEY_NECK if v0 key begin
animate-magic-neck
loot-px
if v0 == NECK_ESP begin
# neck esp reveals all nearby items in pits
reveal-pit-items
return
end
if v0 == PIECES begin
# pieces are a single-use health pickup
vf := PIECES_LIFE give-life
v0 := 0
v1 >>= px # px / 16
v1 >>= v1
v1 >>= v1
v1 >>= v1
loot-set
return
end
if v0 == CALL_SHIP begin
# you gotta do this to end the game
if inventory == ALL_PARTS then timer := TIMER_HI
v0 := 0
v1 >>= px # px / 16
v1 >>= v1
v1 >>= v1
v1 >>= v1
loot-set
try-place-call
end
return
end
# track whether any keys are held down
v1 := 0
if py != 1 begin
v0 := KEY_UP if v0 key begin
v1 := 1
py += -1
end
end
if py != 47 begin
v0 := KEY_DOWN if v0 key begin
v1 := 1
py += 1
end
end
v0 := KEY_LEFT if v0 key begin
v1 := 1
move-left
if px < 2 then scroll-room-right
end
v0 := KEY_RIGHT if v0 key begin
v1 := 1
move-right
if px > 110 then scroll-room-left
end
# if no keys were pressed, snap to neutral pose:
if v1 == 0 then pframe := 0
if v1 != 0 then next-frame
;
###########################################
#
# Neck ESP
#
###########################################
: reveal-pit-items
sparkle-pit-items
sync
sparkle-pit-items
;
: sparkle-pit-items
v2 := 0 # byte offset to room data
loop
this-room
i += v2
load v1
# v0 sprite index
# v1 y-coord
# make sure it's a pit
if v0 == 1 begin
v3 := v1
v3 += 4
v1 >>= v2
v1 >>= v1
v1 >>= v1 # v2 / 8
loot-here
# v0 loot
# v3 y-coord
# make sure an item is down there
if v0 != 0 begin
v1 += 4
i := sparkle
v2 <<= v2
v2 += 3
sprite v2 v3 8
v2 += -3
v2 >>= v2
end
end
v2 += 8
if v2 != 64 then
again
;
###########################################
#
# Overworld Collision
#
###########################################
: overworld-collide
py += 64
this-room
v3 := 0
loop
load v1
# v0 - slice sprite typecode
# v1 - slice Y position
# v3 - slice X position
# ignore blank columns entirely
if v0 == 0 then jump overworld-continue
v1 += 64
# is eaty vertically within the slice?
v1 += 15
if py > v1 then jump overworld-continue
v1 += -30
if py < v1 then jump overworld-continue
# is eaty horizontally within the slice?
v2 := v3
v2 += 4
if px > v2 then jump overworld-continue
v2 += -16
if px < v2 then jump overworld-continue
# perform an action based on sprite id
v0 += -1
v0 >>= v0
v0 >>= v0
if v0 == 0 begin
v3 >>= v3
v3 >>= v3
v3 >>= v3
pitindex >>= v3
fall-pit
else
# tree
draw-eaty
restore-position
draw-eaty
bounce-out
end
return
: overworld-continue
v3 += 4
if v3 != 128 then
again
;
###########################################
#
# Pit Items
#
###########################################
: draw-item
v0 := ITEM_X
v1 := ITEM_Y
if has-item == ROSE begin
i := rose-0
sprite v0 v1 0
return
end
i := blank
if has-item == PART_1 then i := part-1
if has-item == PART_2 then i := part-2
if has-item == PART_3 then i := part-3
sprite v0 v1 8
;
: near-item # return result in v0
v0 := 0
if has-item == 0 then return
if px < 36 then v0 := 1
;
: wilt-rose
v0 := ITEM_X
v1 := ITEM_Y
v2 := 0
i := rose-0
loop
sprite v0 v1 0
vf := 32
i += vf
sprite v0 v1 0
sync
v2 += 1
if v2 != 4 then
again
vf := ROSE_LIFE give-life
;
: take-item
if has-item == ROSE begin
wilt-rose
else
draw-item
inventory |= has-item
end
has-item := 0
v0 := 0
v1 := pitindex
roomindex += -5
loot-set
roomindex += 5
;
###########################################
#
# Pit Logic
#
###########################################
: draw-pit
i := pit-wall
v1 := 0
v0 := -8
loop
sprite v0 v1 0
v1 += 16
if v1 != 64 then
again
i := pit-ground
v0 := 8
v1 := 48
loop
sprite v0 v1 0
v0 += 16
if v0 != 120 then
again
v1 := 33
i := pit-lf
v0 := 8
sprite v0 v1 15
i := pit-rt
v0 := -16
sprite v0 v1 15
draw-item
;
: move-pit
# track whether any keys are held down
v1 := 0
v0 := KEY_LEFT if v0 key begin
v1 := 1
if px != 24 then move-left
end
v0 := KEY_RIGHT if v0 key begin
v1 := 1
if px != 100 then move-right
end
# if no keys were pressed, snap to neutral pose:
if v1 == 0 then pframe := 0
if v1 != 0 then next-frame
;
: fly-pit
draw-eaty
animate-magic-neck
draw-eaty
loop
draw-eaty
py += -2
draw-eaty
sync
if py != 0 then
again
clear
restore-position
roomindex += -5
draw-room
draw-eaty
bounce-out
;
: fall-pit
v1 := pitindex
loot-here
has-item := v0
roomindex += 5
clear
draw-pit
px := 60
py := 0
pdir := FACE_LEFT
pframe := 0
i := eaty-walk
draw-eaty
loop
draw-eaty
py += 2
draw-eaty
sync
if py != 32 then
again
draw-hud
loop
draw-eaty
draw-hud
move-pit
dec-timer
draw-eaty
v0 := KEY_NECK if v0 key begin
near-item
if v0 == 1 begin
draw-eaty
animate-magic-neck
draw-eaty
take-item
else
fly-pit
return
end
end
draw-hud
sync
if is-dead == 0 then
again
;
###########################################
#
# Randomized Loot
#
###########################################
: randomize-loot
# distribute common/nonvital items:
v1 := 0 # room-0 offset
v2 := 0 # loot-data offset
loop
# pits can be 0-1
# ground can be 0-3
is-pit
v3 := random 0b11
if v0 == 1 then v3 := random 0b01
v0 := v3
i := loot-data
i += v2
save v0
v1 += 8
v2 += 1
if v2 != 32 then
again
# place CALL_SHIP on ground
try-place-call
# place parts on pits
v4 := PART_1
try-place-part
v4 := PART_2
try-place-part
v4 := PART_3
try-place-part
;
: try-place-call
v3 := random 31
is-v3-pit
if v0 == 1 then jump try-place-call
i := loot-data
i += v3
load v0
if v0 > 3 then jump try-place-call
i := loot-data
i += v3
v0 := CALL_SHIP
#:breakpoint call-place
save v0
;
: try-place-part
v3 := random 31
is-v3-pit
if v0 != 1 then jump try-place-part
i := loot-data
i += v3
load v0
if v0 > 3 then jump try-place-part
i := loot-data
i += v3
v0 := v4
#:breakpoint part-place
save v0
;
: is-v3-pit
v1 <<= v3
v1 <<= v1
v1 <<= v1 # offset * 8
: is-pit
# takes offset in v1,
# leaves 1 in v0 if it's a pit.
i := room-0
i += v1
load v0
if v0 != 1 then v0 := 0
;
###########################################
#
# Level Data
#
###########################################
# loot definitions are 8 bytes per room.
: loot-data
0 0 0 0 0 0 0 0 # room 0
0 0 0 0 0 0 0 0 # room 1
0 0 0 0 0 0 0 0 # room 2
0 0 0 0 0 0 0 0 # room 3
0 0 5 0 0 0 0 0 # room 4
: loot-px
# leaves result in v0
v1 >>= px
v1 >>= v1
v1 >>= v1
v1 >>= v1 # px / 16
: loot-here
# takes column in v1, leaves result in v0
v0 <<= roomindex
v0 <<= v0
v0 <<= v0 # roomindex * 8
i := loot-data
i += v0
i += v1
load v0
;
: loot-set
# takes column in v1, value in v0
i := loot-data
i += v1
v1 <<= roomindex
v1 <<= v1
v1 <<= v1 # roomindex * 8
i += v1
save v0
;
# rooms are 64 bytes each.
# each room is a series of packed pairs:
# <sprite index, y coord>
: room-0
0 0 0 0 0 0 0 0
1 8 2 8 3 8 4 8 #
0 0 0 0 0 0 0 0
1 40 2 40 3 40 4 40 #
0 0 0 0 0 0 0 0
1 8 2 8 3 8 4 8 #
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
: room-1
0 0 0 0 0 0 0 0
5 6 6 6 7 6 8 6 #
0 0 0 0 0 0 0 0
5 40 6 40 7 40 8 40 #
5 32 6 32 7 32 8 32 #
0 0 0 0 0 0 0 0
5 20 6 20 7 20 8 20 #
0 0 0 0 0 0 0 0
: room-2
0 0 0 0 0 0 0 0
1 39 2 40 3 41 4 42 #
1 6 2 5 3 4 4 3 #
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
1 3 2 4 3 5 4 6 #
1 42 2 41 3 40 4 39 #
0 0 0 0 0 0 0 0
: room-3
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
5 30 6 30 7 30 8 30 #
5 40 6 40 7 40 8 40 #
5 40 6 40 7 40 8 40 #
5 6 6 6 7 6 8 6 #
1 42 2 41 3 40 4 39 #
0 0 0 0 0 0 0 0
: room-4
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
5 40 6 40 7 40 8 40 #
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
: this-room
v0 <<= roomindex
v0 <<= v0
jump0 room-table
: room-table
i := room-0 ;
i := room-1 ;
i := room-2 ;
i := room-3 ;
i := room-4 ;
###########################################
#
# Graphics
#
###########################################
# hud tiles
: heart 0x50 0xF8 0xF8 0x70 0x20
: call-ship 0x1C 0x3C 0x7C 0x70 0x70 0x7C 0x3C 0x1C
: go-ship 0xE7 0xC3 0xA5 0x18 0x18 0xA5 0xC3 0xE7
: pieces 0x30 0x48 0x4E 0x39 0x39 0x4E 0x48 0x30
: neck-esp 0x08 0x04 0x12 0x4A 0x4A 0x12 0x04 0x08
: sparkle 0x00 0x08 0x01 0x00 0x48 0x00 0x01 0x10
: part-tiles 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 # 0 - nothing
: part-1 0x7E 0xFF 0x81 0x00 0x00 0x00 0x00 0x00 # 1 - 1
: part-2 0x00 0x00 0x24 0x3C 0x3C 0x24 0x00 0x00 # 2 - 2
0x7E 0xFF 0xA5 0x3C 0x3C 0x24 0x00 0x00 # 3 - 1,2
: part-3 0x00 0x00 0x00 0x00 0x18 0x18 0x7E 0xFF # 4 - 3
0x7E 0xFF 0x81 0x00 0x18 0x18 0x7E 0xFF # 5 - 1,3
0x00 0x00 0x24 0x3C 0x24 0x3C 0x7E 0xFF # 6 - 2,3
0x7E 0xFF 0xA5 0x3C 0x24 0x3C 0x7E 0xFF # 7 - 1,2,3
: fingat 0xC0
# overworld tiles
# packed into 4 pixel wide vertical slices,
# so I can draw as I scroll horizontally.
: overworld-tiles
: blank 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 # 0
: pit-0 0x10 0x70 0xF0 0xC0 0xB0 0xF0 0xF0 0xF0 0xF0 0xF0 0xF0 0xF0 0xF0 0x70 0x10 0x00 # 1
: pit-1 0xF0 0xF0 0x00 0xF0 0xF0 0xF0 0xF0 0xF0 0xF0 0xF0 0xF0 0xF0 0xF0 0xF0 0xF0 0x00 # 2
: pit-2 0xF0 0xF0 0x00 0xF0 0xF0 0xF0 0xF0 0xF0 0xF0 0xF0 0xF0 0xF0 0xF0 0xF0 0xF0 0x00 # 3
: pit-3 0x80 0xE0 0xF0 0x30 0xD0 0xF0 0xF0 0xF0 0xF0 0xF0 0xF0 0xF0 0xF0 0xE0 0x80 0x00 # 4
: tree-0 0x00 0x00 0x00 0x00 0x10 0x30 0xF0 0x70 0x30 0x60 0xF0 0x70 0x50 0x00 0x00 0x00 # 5
: tree-1 0x10 0x20 0x60 0xB0 0x60 0xF0 0xE0 0x50 0xF0 0xB0 0x70 0xF0 0xB0 0x30 0x30 0x00 # 6
: tree-2 0x80 0x40 0x20 0x10 0x00 0x50 0x30 0x30 0x70 0xB0 0x70 0xF0 0xD0 0xC0 0xC0 0x00 # 7
: tree-3 0x00 0x00 0x00 0x00 0x80 0xC0 0x70 0xE0 0xC0 0xE0 0x50 0xE0 0xC0 0x00 0x00 0x00 # 8
# pit background tiles
: pit-ground 0xF7 0xF7 0x7F 0x7F 0xED 0xED
: pit-wall 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF
0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF
0xFF 0xFF 0xFF 0xFF
: pit-lf 0x80 0x80 0xC0 0xC0 0xC0 0xE0 0xE0 0xE0 0xF0 0xF0 0xF0 0xF8 0xF8 0xFC 0xFE
: pit-rt 0x01 0x01 0x03 0x03 0x03 0x07 0x07 0x07 0x0F 0x0F 0x0F 0x1F 0x1F 0x3F 0x7F
# rose wilting animation
: rose-0
0x00 0x00 0x00 0x00 0x05 0xE0 0x05 0xE0
0x05 0xE0 0x06 0xE0 0x03 0xC0 0x01 0x18
0x19 0xA8 0x14 0xD0 0x0A 0x60 0x07 0xC0
0x01 0x80 0x03 0x00 0x03 0x00 0x01 0x80
: rose-1
0x00 0x00 0x00 0x00 0x01 0x00 0x0B 0x70
0x0B 0xE0 0x0D 0xE0 0x07 0xC0 0x01 0x00
0x01 0x80 0x1C 0xF0 0x22 0x68 0x1F 0xD8
0x01 0x80 0x03 0x00 0x03 0x00 0x01 0x80
: rose-2
0x00 0x00 0x00 0x00 0x00 0x00 0x02 0x40
0x03 0xE0 0x0D 0xF0 0x07 0xF0 0x0F 0x30
0x01 0x80 0x00 0xE0 0x06 0x70 0x0F 0xD0
0x0D 0xB0 0x0B 0x20 0x03 0x00 0x01 0x80
: rose-3
0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
0x00 0x00 0x01 0x20 0x13 0xC0 0x0B 0xF0
0x1B 0xB0 0x0A 0xC0 0x00 0x60 0x03 0xC0
0x05 0xA0 0x0F 0x30 0x0B 0x70 0x01 0xA0
: rose-4
0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
0x00 0x00 0x01 0x00 0x03 0xC0 0x03 0xC0
0x03 0xC0 0x03 0xC0 0x00 0x60 0x01 0xC0
0x01 0x80 0x03 0x00 0x03 0x70 0x0D 0xB8
# eaty walk animation
: eaty-walk
: walk-l0
0x00 0x00 0x00 0x00 0x1F 0xF0 0x3F 0xF8
0x19 0xF8 0x3F 0xF8 0x3F 0x9C 0x2A 0x1C
0x00 0x1C 0x07 0xFC 0x3F 0xC8 0x2F 0xD8
0x0F 0xF8 0x0F 0xF8 0x0D 0x18 0x1C 0x78
: walk-l1
0x00 0x00 0x00 0x00 0x1F 0xF0 0x3F 0xF8
0x19 0xF8 0x3F 0xF8 0x3F 0x9C 0x2A 0x1C
0x00 0x1C 0x07 0xCC 0x0F 0xD8 0x3F 0xF8
0x2F 0xF8 0x0F 0x98 0x0C 0xB8 0x1C 0x00
: walk-l2
0x00 0x00 0x00 0x00 0x1F 0xF0 0x3F 0xF8
0x19 0xF8 0x3F 0xF8 0x3F 0x9C 0x2A 0x1C
0x00 0x1C 0x07 0xFC 0x3F 0xC8 0x2F 0xD8
0x0F 0xF8 0x0F 0xF8 0x0D 0x18 0x1C 0x78
: walk-l3
0x00 0x00 0x00 0x00 0x1F 0xF0 0x3F 0xF8
0x19 0xF8 0x3F 0xF8 0x3F 0x9C 0x2A 0x1C
0x00 0x1C 0x37 0xFC 0x2F 0xF8 0x0F 0xC8
0x0F 0xD8 0x0D 0xF8 0x1D 0x18 0x00 0x78
: walk-r0
0x00 0x00 0x00 0x00 0x0F 0xF8 0x1F 0xFC
0x1F 0x98 0x1F 0xFC 0x39 0xFC 0x38 0x54
0x38 0x00 0x3F 0xE0 0x13 0xFC 0x1B 0xF4
0x1F 0xF0 0x1F 0xF0 0x18 0xB0 0x1E 0x38
: walk-r1
0x00 0x00 0x00 0x00 0x0F 0xF8 0x1F 0xFC
0x1F 0x98 0x1F 0xFC 0x39 0xFC 0x38 0x54
0x38 0x00 0x33 0xE0 0x1B 0xF0 0x1F 0xFC
0x1F 0xF4 0x19 0xF0 0x1D 0x30 0x00 0x38
: walk-r2
0x00 0x00 0x00 0x00 0x0F 0xF8 0x1F 0xFC
0x1F 0x98 0x1F 0xFC 0x39 0xFC 0x38 0x54
0x38 0x00 0x3F 0xE0 0x13 0xFC 0x1B 0xF4
0x1F 0xF0 0x1F 0xF0 0x18 0xB0 0x1E 0x38
: walk-r3
0x00 0x00 0x00 0x00 0x0F 0xF8 0x1F 0xFC
0x1F 0x98 0x1F 0xFC 0x39 0xFC 0x38 0x54
0x38 0x00 0x3F 0xEC 0x1F 0xF4 0x13 0xF0
0x1B 0xF0 0x1F 0xB0 0x18 0xB8 0x1E 0x00
# magic neck animation
: eaty-neck
: neck-l-0
0x00 0x00 0x00 0x00 0x1F 0xF0 0x3F 0xF8
0x19 0xF8 0x3F 0xF8 0x3F 0x9C 0x2A 0x1C
0x00 0x1C 0x07 0xFC 0x3F 0xC8 0x2F 0xD8
0x0F 0xF8 0x0F 0xF8 0x0D 0x18 0x1C 0x78
: neck-l-1
0x00 0x00 0x1F 0xF0 0x3F 0xF0 0x1A 0xF8
0x1D 0xF8 0x3F 0x9C 0x2A 0x1C 0x00 0x1C
0x00 0x1C 0x07 0xF8 0x3F 0xC8 0x2F 0xD8
0x0F 0xF8 0x0F 0xF8 0x0D 0x18 0x1C 0x78
: neck-l-2
0x3F 0xF0 0x18 0xF0 0x1A 0xF8 0x18 0xF8
0x3F 0x98 0x2A 0x1C 0x00 0x1C 0x00 0x1C
0x00 0x18 0x07 0xF8 0x3F 0xC8 0x2F 0xD8
0x0F 0xF8 0x0F 0xF8 0x0D 0x18 0x1C 0x78
: neck-l-3
0x00 0x00 0x1F 0xF0 0x3F 0xF0 0x1A 0xF8
0x1D 0xF8 0x3F 0x9C 0x2A 0x1C 0x00 0x1C
0x00 0x1C 0x07 0xF8 0x3F 0xC8 0x2F 0xD8
0x0F 0xF8 0x0F 0xF8 0x0D 0x18 0x1C 0x78
: neck-r-0
0x00 0x00 0x00 0x00 0x0F 0xF8 0x1F 0xFC
0x1F 0x98 0x1F 0xFC 0x39 0xFC 0x38 0x54
0x38 0x00 0x3F 0xE0 0x13 0xFC 0x1B 0xF4
0x1F 0xF0 0x1F 0xF0 0x18 0xB0 0x1E 0x38
: neck-r-1
0x00 0x00 0x0F 0xF8 0x0F 0xFC 0x1F 0x58
0x1F 0xB8 0x39 0xFC 0x38 0x54 0x38 0x00
0x38 0x00 0x1F 0xE0 0x13 0xFC 0x1B 0xF4
0x1F 0xF0 0x1F 0xF0 0x18 0xB0 0x1E 0x38
: neck-r-2
0x0F 0xFC 0x0F 0x18 0x1F 0x58 0x1F 0x18
0x19 0xFC 0x38 0x54 0x38 0x00 0x38 0x00
0x18 0x00 0x1F 0xE0 0x13 0xFC 0x1B 0xF4
0x1F 0xF0 0x1F 0xF0 0x18 0xB0 0x1E 0x38
: neck-r-3
0x00 0x00 0x0F 0xF8 0x0F 0xFC 0x1F 0x58
0x1F 0xB8 0x39 0xFC 0x38 0x54 0x38 0x00
0x38 0x00 0x1F 0xE0 0x13 0xFC 0x1B 0xF4
0x1F 0xF0 0x1F 0xF0 0x18 0xB0 0x1E 0x38
# death animation
: die-0
0x00 0x00 0x03 0xC0 0x00 0x00 0x1F 0xF0
0x3F 0xF8 0x3F 0xF8 0x1B 0xF8 0x3F 0x9C
0x2A 0x1C 0x00 0x1C 0x07 0xFC 0x0F 0xE8
0x1F 0xD8 0x2F 0xD8 0x0F 0xF8 0x1D 0x78
: die-1
0x00 0x00 0x03 0xC0 0x04 0x20 0x03 0xC0
0x00 0x00 0x1F 0xF0 0x3F 0xF8 0x3F 0xF8
0x3F 0xFC 0x3F 0x9C 0x2A 0x7C 0x0F 0xFC
0x0F 0xE8 0x0F 0xE8 0x0F 0xF8 0x1F 0xF8
: copter
0xF8 0x1F 0x20 0x04 0xF9 0x1F 0xF9 0x1F
0x89 0x11 0x73 0xCE 0x17 0xE8 0x0D 0xB0
0x07 0xE0 0x06 0x60 0xFB 0xDF 0x23 0xC4
0xFC 0x3F 0xF8 0x1F 0x88 0x11 0x70 0x0E
: title-screen
0x00 0x00 0x00 0xF8 0x07 0xF8 0x07 0xC0
0x07 0x00 0x07 0xB9 0x03 0xFB 0x03 0xE3
0x03 0x81 0x03 0xC5 0x01 0xDE 0x01 0xFE
0x01 0xFC 0x00 0xF0 0x00 0x80 0x00 0x00
0x00 0x00 0x00 0x00 0x00 0x08 0x00 0x4C
0x03 0x6C 0x9F 0xB8 0xD6 0x18 0x66 0x08
0xF3 0x0C 0xB3 0x0C 0x93 0x80 0xC0 0x00
0x00 0x75 0x00 0x27 0x00 0x25 0x00 0x25
0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
0x70 0xC8 0x61 0x28 0x41 0xE8 0x71 0x2E
0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
0xBB 0x40 0xB2 0xC0 0xA2 0x40 0xBA 0x40
0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
0x00 0x00 0x00 0x01 0x00 0x00 0x00 0x00
0x00 0x01 0x00 0x03 0x00 0x01 0x00 0x03
0x00 0x01 0x00 0x01 0x00 0x01 0x00 0x00
0x00 0x00 0x00 0x00 0x12 0x00 0x0F 0xFF
0x35 0x00 0xC0 0x00 0xD0 0x00 0x82 0xC2
0x83 0xCB 0xD0 0x1C 0x94 0x00 0xDF 0xAA
0xAE 0xEB 0xD6 0x3E 0xEB 0x00 0xF5 0x00
0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
0xC0 0x03 0x20 0x1C 0x21 0x23 0xC0 0xCC
0xC0 0x90 0x21 0xA0 0x61 0x3E 0xC3 0x9D
0x01 0x41 0x00 0xEA 0x00 0xFE 0x00 0xB8
0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
0x00 0x00 0xE0 0x00 0x20 0x00 0xC0 0x00
0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
0x00 0x00 0x80 0x00 0x00 0x00 0x00 0x00
: game-over
0x1E 0x79 0x3E 0xFD 0x30 0xCD 0x36 0xFD
0x32 0xCD 0x3E 0xCD 0x1E 0xCD 0x00 0x00
0x0E 0x63 0x1F 0x63 0x1B 0x63 0x1B 0x63
0x1B 0x77 0x1F 0x3E 0x0E 0x1C 0x00 0x00
0x83 0x7C 0xC7 0x7C 0xEF 0x60 0xBB 0x78
0x93 0x60 0x83 0x7C 0x83 0x7C 0x00 0x00
0x7D 0xF0 0x7D 0xF8 0x61 0x98 0x79 0xF0
0x61 0x98 0x7D 0x98 0x7D 0x98 0x00 0x00
: victory
0x00 0x32 0x00 0x4A 0xEE 0x7A 0xEE 0x4A
0xEE 0x4B 0xEE 0x00 0xEE 0x9B 0xFE 0xA1
0x7C 0xA1 0x7C 0xA1 0x38 0xA1 0x38 0xA1
0x10 0x99 0x00 0x00 0x00 0x00 0x00 0x00
0x2E 0x90 0x28 0xD0 0x2E 0xB0 0x28 0xB0
0xAE 0x90 0x00 0x00 0xBB 0x36 0x2A 0xB6
0x2A 0xB6 0x2B 0x36 0x2A 0xB6 0x2A 0xBE
0x3A 0x9E 0x00 0x06 0x00 0x3E 0x00 0x3C