scroll left and right work in stdef and hidef adds octo test roms adds schip fonts to memory
1321 lines
25 KiB
Plaintext
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
|