Skip to content

Instantly share code, notes, and snippets.

@jackiekircher
Last active November 2, 2015 06:20
Show Gist options
  • Save jackiekircher/f6daff9cb757c18a219a to your computer and use it in GitHub Desktop.
Save jackiekircher/f6daff9cb757c18a219a to your computer and use it in GitHub Desktop.
O C T O V O R E

O C T O V O R E

a game of hungry hungry octopods

play as a starving octopus who just has to eat everything in sight, from crumbs to fishies to donuts. you control its ever-extending arms as it frenzies for food.

you must collect every piece of food to advance to the next level. can you beat all 9?

for an extra challenge, try raising the clock speed above the default 120 cycles/frame ;)

controls

menu

  • 4 (C) to procede through menus and start the game

  • R (D) to toggle between menu options

left arm

the left arm controls WASD style, but shifted up a row

  • 2 (2) to steer the left arm up

  • Q (4) to steer the left arm left

  • W (5) to steer the left arm down

  • E (6) to steer the left arm right

right arm

the right arm similarly controls WASD style, but shifted down a row

  • S (8) to steer the right arm up

  • Z (A) to steer the right arm left

  • X (0) to steer the right arm down

  • C (B) to steer the right arm right

shoutouts

thank you to

@ColourTann - for the name octovore!

@lindseybieda - for brainstorming the central mechanics with me!

play!

play it online at octojam.com/octojam-ii/games/octovore

{
"tickrate" : "120",
"fillColor" : "#5B1B96",
"fillColor2" : "#E03B22",
"blendColor" : "#68E022",
"backgroundColor" : "#8BDCE8",
"buzzColor" : "#68E022",
"quietColor" : "#000000",
"shiftQuirks" : false,
"loadStoreQuirks" : false,
"vfOrderQuirks" : false,
"enableXO" : true
}
#-------------------------------------------#
# octovore
# a game of hungry hungry octopods
#
# author: jackie kircher
# @jackiekircher
#
# shoutouts:
# @ColourTann for the name octovore
# @lindseybieda for brainstorming
#
# play online at
# octojam.com/octojam-ii/games/octovore
#-------------------------------------------#
#-- sprites --------------------------------#
: octopus #11x13 (SUPERCHIP)
0x1F 0x00 0x3F 0x80 0x3F 0x80 0x3F 0x80
0x3F 0x80 0x1A 0x80 0x1F 0x00 0x0A 0x00
0x2A 0x80 0x4A 0x40 0x51 0x40 0x91 0x20
0x4A 0x40 0x00 0x00 0x00 0x00 0x00 0x00
: octopus-tangled #11x13 (SUPERCHIP)
0x1F 0x00 0x3F 0x80 0x3F 0x80 0x3A 0x80
0x35 0x00 0x1A 0x80 0x1F 0x00 0x0A 0x00
0x2A 0x80 0x4A 0x40 0x51 0x40 0x91 0x20
0x4A 0x40 0x00 0x00 0x00 0x00 0x00 0x00
: dancing-octopus-right #11x13 (SUPERCHIP)
0x1F 0x00 0x3F 0x80 0x3F 0xA0 0x3F 0xA0
0xBF 0xA0 0x9A 0xA0 0x9D 0x20 0x4A 0x40
0x2A 0x80 0x4A 0x40 0x51 0x40 0x91 0x20
0x4A 0x40 0x00 0x00 0x00 0x00 0x00 0x00
: dancing-octopus-left #11x13 (SUPERCHIP)
0x1F 0x00 0x3F 0x80 0xBF 0x80 0xBF 0x80
0xBF 0xA0 0xAB 0xA0 0x97 0x20 0x4A 0x40
0x2A 0x80 0x4A 0x40 0x51 0x40 0x91 0x20
0x4A 0x40 0x00 0x00 0x00 0x00 0x00 0x00
: full-octopus1
0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
0x00 0x01 0x00 0x03 0x00 0x07 0x00 0x0F
0x00 0x1F 0x00 0x1F 0x0F 0xBF 0x1D 0xFF
: full-octopus2
0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
0x00 0x00 0x00 0x00 0x00 0x00 0xFE 0x00
0xFF 0x00 0xFF 0x80 0xFF 0xC0 0xFF 0xC0
0xFF 0xE0 0xFF 0xE0 0xFF 0xF0 0xFF 0xF0
: full-octopus3
0xFF 0xFF 0xFF 0xF0 0xFF 0xE1 0xFF 0xB0
0x66 0x0C 0x12 0x02 0x11 0x09 0x60 0x95
0x84 0x91 0x08 0x8E 0x49 0x00 0x86 0x00
0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
: full-octopus4
0x3F 0xFF 0x7E 0xFF 0x7F 0xFF 0x7F 0x7F
0x00 0x01 0x00 0x06 0x00 0x18 0x00 0x20
0x00 0x40 0x00 0x49 0x00 0x31 0x00 0x00
0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
: full-octopus5
0x80 0x40 0x40 0x80
# I don't like that these are full 16x16 sprites but
# it's both the easiest and cleanest way to animate
: full-octopus-animate-up
0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
0x00 0x00 0x00 0x00 0x00 0x00 0x0F 0xE0
0x10 0x10 0x20 0x08 0x40 0x04 0x80 0x02
0x00 0x02 0x00 0x01 0x00 0x01 0x00 0x00
: full-octopus-animate-down
0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
0x0F 0xE0 0x00 0x10 0x00 0x08 0x00 0x04
0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
: dot
0x80
: vertical-line #1x15
0x80 0x80 0x80 0x80 0x80 0x80 0x80 0x80
0x80 0x80 0x80 0x80 0x80 0x80 0x80
: horizontal-line-8 #8x1
0xFF
: horizontal-line-4 #4x1
0xF0
: horizontal-line-2 #2x1
0xC0
: empty
0x00 0x00 0x00 0x00 0x00 0x00 0x00
: title-text-O #
0x07 0xF0 0x1F 0xF8 0x3F 0xFC 0x7F 0xFE
0xFE 0x7E 0xFC 0x3E 0xF8 0x1E 0xF0 0x1E
0xF0 0x1E 0xF0 0x3E 0xF8 0x3E 0xFC 0x7C
0xFF 0xFC 0x7F 0xF8 0x7F 0xF0 0x1F 0xE0
: title-text-C #
0x1F 0xF8 0x3F 0xF8 0x7F 0xF8 0x7E 0x38
0xFC 0x00 0xF8 0x00 0xF8 0x00 0xF0 0x00
0xF0 0x00 0xF0 0x1C 0xF8 0x3C 0xFC 0x7C
0xFF 0xFC 0x7F 0xF8 0x7F 0xF0 0x1F 0xC0
: title-text-T #
0x00 0x0F 0x03 0xFF 0x1F 0xFF 0xFF 0xFF
0xFF 0xF8 0xFF 0xC0 0xF3 0xC0 0x03 0xC0
0x03 0xC0 0x03 0xC0 0x03 0xC0 0x03 0xC0
0x03 0xC0 0x03 0xC0 0x03 0xC0 0x03 0x80
: title-text-V #
0x00 0x1E 0x30 0x1E 0x70 0x3E 0xF0 0x3C
0xF0 0x7C 0xF0 0x78 0xF0 0xF8 0xF8 0xF0
0x79 0xF0 0x79 0xE0 0x7B 0xE0 0x7F 0xC0
0x3F 0xC0 0x3F 0x80 0x1F 0x00 0x1E 0x00
: title-text-R #
0x1F 0x80 0x7F 0xC0 0x7F 0xE0 0xF8 0xE0
0xF0 0xE0 0xF1 0xE0 0xFF 0xE0 0xFF 0xC0
0xFF 0xE0 0xF3 0xF0 0xF1 0xF0 0xF0 0xF0
0xF0 0xF0 0xF0 0xE0 0xF0 0x00 0xE0 0x00
: title-text-E #
0x01 0xC0 0x07 0xC0 0x1F 0xC0 0x7F 0x00
0xFC 0x00 0xF0 0x00 0xF0 0x00 0xFC 0x00
0xFC 0x00 0xF8 0x00 0xF0 0xF0 0xF3 0xF0
0xFF 0xF0 0xFF 0xC0 0xFF 0x00 0x7C 0x00
: press-start-text1
0xE0 0xAE 0xAA 0xCC 0x8A 0x8A
: press-start-text2
0x00 0xE6 0x88 0xCE 0x82 0xEC
: press-start-text3
0x00 0x60 0x80 0xE0 0x20 0xC0
: press-start-text4
0x00 0x45 0x4D 0x14 0x24 0x3E 0x04 0x04
: press-start-text5
0x00 0xE0 0x5C 0x54 0x54 0x5C
: press-start-text6
0x00 0x6E 0x84 0xE4 0x24 0xC4
: press-start-text7
0x00 0xEE 0xAA 0xEC 0xAA 0xAA
: press-start-text8
0x00 0xE0 0x40 0x40 0x40 0x40
: easy-text1
0xEE 0xAA 0xCE 0x8A 0xE0
: easy-text2
0x6A 0x8A 0xEE 0x22 0xCC
: normal-text1
0x8B 0xCA 0xAA 0x9B 0x88
: normal-text2
0xBA 0xAB 0xB2 0xAA 0x2A
: normal-text3
0x2E 0x6A 0xAE 0x2A 0x20
: normal-text4
0x80 0x80 0x80 0x80 0xC0
: hard-text1
0xAE 0xAA 0xEE 0xAA 0xA0
: hard-text2
0xEC 0xAA 0xCA 0xAA 0xAC
: congratulations-text1
0xF0 0x87 0x84 0x84 0x84 0x84 0x84 0xF7
: congratulations-text2
0x00 0xA2 0xB2 0xAA 0xAA 0xA6 0xA6 0xA2
: congratulations-text3
0x00 0x73 0x82 0x82 0x9B 0x8A 0x8A 0x72
: congratulations-text4
0x00 0xDE 0x52 0x52 0x9E 0x52 0x52 0x52
: congratulations-text5
0x00 0xF9 0x22 0x22 0x21 0x20 0x20 0x23
: congratulations-text6
0x03 0xC7 0x07 0x07 0x86 0x44 0x40 0x8C
0x0C
# food
: fish-left #7x3
0x30 0x4A 0x84 0x7A 0x00 0x00 0x00
: fish-right #7x4
0x18 0xA4 0x42 0xBC 0x00 0x00 0x00
: speck #3x3
0x40 0xA0 0x40 0x00 0x00 0x00 0x00
: sushi #4x4
0x60 0x90 0xF0 0x60 0x00 0x00 0x00
: shrimp-fried-left #7x7
0x60 0x90 0x90 0x68 0x18 0x06 0x04
: shrimp-fried-right #7x7
0x04 0x06 0x18 0x68 0x90 0x90 0x60
: donut #7x7
0x38 0x44 0x92 0xAA 0x92 0x44 0x38
: chips #9x11 (SUPERCHIP)
0xFF 0x80 0x40 0x80 0x40 0x80 0x8C 0x80
0x92 0x80 0x92 0x80 0xA2 0x80 0xA4 0x80
0x99 0x00 0x81 0x00 0xFF 0x80
: food-table
i := empty return
i := fish-left return
i := fish-right return
i := speck return
i := sushi return
i := shrimp-fried-left return
i := shrimp-fried-right return
i := donut return
;
:const FISHLEFT 1
:const FIGHRIGHT 2
:const SPECK 3
:const SUSHI 4
:const SHRIMPFRIEDLEFT 5
:const SHRIMPFRIEDRIGHT 6
:const DONUT 7
:const CHIPS 8
#-- setup ----------------------------------#
# registers
:alias arm1_x va
:alias arm1_y vb
:alias arm2_x vc
:alias arm2_y vd
# directions
# these are all weird looking so that two cardinal directions
# can be added together to make a diagonal direction
#
# UP + DOWN -> 0
# UP + RIGHT -> UPRIGHT
#
:const UP -1
:const LEFT -3
:const DOWN 1
:const RIGHT 3
:const UPLEFT -4
:const UPRIGHT 2
:const STOP 0
:const DOWNLEFT -2
:const DOWNRIGHT 4
:const FALSE 0
:const TRUE 1
:const ARM1XOFFSET 1
:const ARM1YOFFSET 7
:const ARM2XOFFSET 8
:const ARM2YOFFSET 7
:const EASYSPEED 5
:const NORMSPEED 2
:const HARDSPEED 1
# game-state
: arm1-direction -3 # default to LEFT
: arm2-direction 3 # default to RIGHT
: game-mode 1 # default to puzzle mode
: difficulty 2 # default to NORMSPEED
: current-level 1 # defualt to level 1
: food-remaining 0
: octopus-coords 0 0
: board-food
# type --- taken --- x pos --- y pos
0x00 0x01 0x00 0x00
0x00 0x01 0x00 0x00
0x00 0x01 0x00 0x00
0x00 0x01 0x00 0x00
0x00 0x01 0x00 0x00
0x00 0x01 0x00 0x00
0x00 0x01 0x00 0x00
0x00 0x01 0x00 0x00
0x00 0x01 0x00 0x00
0x00 0x01 0x00 0x00
0x00 0x01 0x00 0x00
0x00 0x01 0x00 0x00
0xFF 0x00 0x00 0x00
: setup
hires
;
: sweep-board
v4 := -4
loop
v4 += 4
while v4 < 48
v0 := 0x00
v1 := 0x01
v2 := 0x00
v3 := 0x00
i := board-food
i += v4
save v3
again
clear
;
: menu-screen
draw-menu-title-text
draw-menu-mode-text
v3 := 0xC
v4 := 0xD
# choose game mode (currently there's only puzzle)
v9 := 1
v8 := 1
vf := 60
delay := vf
loop
# blink text
vf := delay
if vf == 0 begin
draw-menu-mode-text
if v9 == 0 then vf := 60
if v9 == 1 then vf := 15
delay := vf
v9 ^= v8
end
# if v4 key then select-player
if v3 -key then
again
# delay to avoid double inputs
v0 := 10
delay := v0
loop
v0 := delay
if v0 != 0 then
again
if v9 == 1 then draw-menu-mode-text
draw-menu-difficulty-text
# choose difficulty
loop
if v4 key then change-difficulty
if v3 -key then
again
;
: select-player
i := game-mode
load v0
# toggle the player select sushi
if v0 == 1 begin
v1 := 21
v2 := 48
i := sushi
sprite v1 v2 4
v1 := 71
v2 := 48
i := sushi
sprite v1 v2 4
end
if v0 == 2 begin
v1 := 71
v2 := 48
i := sushi
sprite v1 v2 4
v1 := 21
v2 := 48
i := sushi
sprite v1 v2 4
end
# toggle the game mode
if v0 == 1 then v1 := 2
if v0 == 2 then v1 := 1
i := game-mode
v0 := v1
save v0
# delay to avoid double inputs
v0 := 10
delay := v0
loop
v0 := delay
if v0 != 0 then
again
;
: change-difficulty
i := difficulty
load v0
# toggle the selection sushi
if v0 == NORMSPEED begin
# deselect normal
v1 := 49
v2 := 49
i := sushi
sprite v1 v2 4
# select hard
v1 := 49
v2 := 55
i := sushi
sprite v1 v2 4
end
if v0 == HARDSPEED begin
# deselect hard
v1 := 49
v2 := 55
i := sushi
sprite v1 v2 4
# select easy
v1 := 49
v2 := 43
i := sushi
sprite v1 v2 4
end
if v0 == EASYSPEED begin
# deselect easy
v1 := 49
v2 := 43
i := sushi
sprite v1 v2 4
# select normal
v1 := 49
v2 := 49
i := sushi
sprite v1 v2 4
end
# toggle the difficulty
if v0 == NORMSPEED then v1 := HARDSPEED
if v0 == HARDSPEED then v1 := EASYSPEED
if v0 == EASYSPEED then v1 := NORMSPEED
i := difficulty
v0 := v1
save v0
# delay to avoid double inputs
v0 := 10
delay := v0
loop
v0 := delay
if v0 != 0 then
again
;
: set-state
i := food-remaining
save v0
v0 := v1
v1 := v2
i := octopus-coords
save v1
;
#-- drawing --------------------------------#
: draw-menu-title-text
v1 := 12
v2 := 18
i := title-text-O
sprite v1 v2 0
v1 := 26
v2 := 15
i := title-text-C
sprite v1 v2 0
v1 := 30
v2 := 14
i := horizontal-line-8
sprite v1 v2 1
v1 := 38
v2 := 11
i := title-text-T
sprite v1 v2 0
v1 := 53
v2 := 8
i := title-text-O
sprite v1 v2 0
v1 := 64
v2 := 21
i := title-text-V
sprite v1 v2 0
v1 := 77
v2 := 17
i := title-text-O
sprite v1 v2 0
v1 := 91
v2 := 14
i := title-text-R
sprite v1 v2 0
v1 := 103
v2 := 10
i := title-text-E
sprite v1 v2 0
;
: draw-menu-mode-text
# v1 := 28
# v2 := 45
# i := puzzle-text
# sprite v1 v2 0
# i := puzzle-text2
# v1 += 16
# sprite v1 v2 10
#
# v1 := 78
# v2 := 45
# i := versus-text
# sprite v1 v2 0
# i := versus-text2
# v1 += 16
# sprite v1 v2 12
#
# v1 := 21
# v2 := 48
# i := sushi
# sprite v1 v2 4
v2 := 48
v1 := 37
i := press-start-text1
sprite v1 v2 6
v1 := 45
i := press-start-text2
sprite v1 v2 6
v1 := 53
i := press-start-text3
sprite v1 v2 6
v2 := 47
v1 := 58
i := press-start-text4
sprite v1 v2 8
v2 := 48
v1 := 69
i := press-start-text5
sprite v1 v2 6
v1 := 78
i := press-start-text6
sprite v1 v2 6
v1 := 86
i := press-start-text7
sprite v1 v2 6
v1 := 94
i := press-start-text8
sprite v1 v2 6
;
: draw-menu-difficulty-text
# easy
v2 := 43
v1 := 56
i := easy-text1
sprite v1 v2 5
v1 := 64
i := easy-text2
sprite v1 v2 5
# normal
v2 := 49
v1 := 56
i := normal-text1
sprite v1 v2 5
v1 := 64
i := normal-text2
sprite v1 v2 5
v1 := 72
i := normal-text3
sprite v1 v2 5
v1 := 80
i := normal-text4
sprite v1 v2 5
# hard
v2 := 55
v1 := 56
i := hard-text1
sprite v1 v2 5
v1 := 64
i := hard-text2
sprite v1 v2 5
# selction sushi
v2 := 49
v1 := 49
i := sushi
sprite v1 v2 4
;
: draw-octopus
i := octopus-coords
load v1
# v1 -> octopus x pos
# v2 -> octopus y pos
v2 := v1
v1 := v0
# draw the octopus
i := octopus
sprite v1 v2 0
# start arm1 (left) below the head
v1 += ARM1XOFFSET
v2 += ARM1YOFFSET
arm1_x := v1
arm1_y := v2
draw-arm1
# start arm2 (right) below the head
v1 += ARM2XOFFSET
arm2_x := v1
arm2_y := v2
draw-arm2
# reset arm directions
i := arm1-direction
v0 := LEFT
save v0
i := arm2-direction
v0 := RIGHT
save v0
;
# draws the tentacle
: draw-arm1
i := dot
sprite arm1_x arm1_y 1
;
: draw-arm2
i := dot
sprite arm2_x arm2_y 1
;
: draw-board
# v0 -> food-type
# v1 -> food-taken
# v2 -> food-x
# v3 -> food-y
v4 := -4
loop
v4 += 4
i := board-food
i += v4
load v3
while v0 != 0xFF
if v1 == 0 begin
v0 <<= v0
v0 <<= v0
select-food
sprite v2 v3 7
end
again
countdown
;
: select-food
jump0 food-table
;
#-- levels ---------------------------------#
# level 1 --------------------------------#
: level-1
# food-counter
3
# starting-position
58 24
: level-1-food
# type - taken - x pos - y pos
5 0 10 10
7 0 112 10
2 0 60 48
0xFF 0 0 0
: create-level-1
i := level-1
load v2
# v0 -> number of foods
# v1 -> starting x pos
# v2 -> starting y pos
set-state
draw-octopus
# load the food into the board
v4 := -4
loop
v4 += 4
i := level-1-food
i += v4
load v3
while v0 != 0xFF
i := board-food
i += v4
save v3
again
draw-board
;
# level 2 --------------------------------#
: level-2
# food-counter
7
# starting-position
14 6
: level-2-food
# type - taken - x pos - y pos
4 0 42 8
4 0 42 22
4 0 42 52
4 0 58 52
4 0 74 52
4 0 106 16
4 0 106 40
0xFF 0 0 0
: create-level-2
i := level-2
load v2
# v0 -> number of foods
# v1 -> starting x pos
# v2 -> starting y pos
set-state
draw-octopus
# load the food into the board
v4 := -4
loop
v4 += 4
i := level-2-food
i += v4
load v3
while v0 != 0xFF
i := board-food
i += v4
save v3
again
draw-board
;
# level 3 --------------------------------#
: level-3
# food-counter
6
# starting-position
58 24
: level-3-food
# type - taken - x pos - y pos
2 0 20 8
4 0 2 34
3 0 68 23
1 0 58 50
1 0 96 11
6 0 108 54
0xFF 0 0 0
: create-level-3
i := level-3
load v2
# v0 -> number of foods
# v1 -> starting x pos
# v2 -> starting y pos
set-state
draw-octopus
# load the food into the board
v4 := -4
loop
v4 += 4
i := level-3-food
i += v4
load v3
while v0 != 0xFF
i := board-food
i += v4
save v3
again
draw-board
;
# level 4 --------------------------------#
: level-4
# food-counter
6
# starting-position
58 4
: level-4-food
# type - taken - x pos - y pos
1 0 28 32
1 0 60 32
1 0 92 32
2 0 44 42
2 0 76 42
1 0 60 52
0xFF 0 0 0
: level-4-walls
v1 := 0
v2 := 20
i := horizontal-line-8
v4 := -1
loop
v4 += 1
while v4 < 16
sprite v1 v2 1
v1 += 8
again
;
: create-level-4
i := level-4
load v2
# v0 -> number of foods
# v1 -> starting x pos
# v2 -> starting y pos
set-state
draw-octopus
# load the food into the board
v4 := -4
loop
v4 += 4
i := level-4-food
i += v4
load v3
while v0 != 0xFF
i := board-food
i += v4
save v3
again
level-4-walls
draw-board
;
# level 5 --------------------------------#
: level-5
# food-counter
7
# starting-position
58 46
: level-5-food
# type - taken - x pos - y pos
5 0 10 10
4 0 28 30
1 0 28 48
2 0 82 16
3 0 100 28
3 0 120 28
6 0 113 47
0xFF 0 0 0
: level-5-walls
v1 := 18
v2 := 42
i := horizontal-line-8
v4 := -1
loop
v4 += 1
while v4 < 11
sprite v1 v2 1
v1 += 8
again
v1 := 106
i := horizontal-line-4
sprite v1 v2 1
v1 := 0
v2 := 22
i := horizontal-line-8
v4 := -1
loop
v4 += 1
while v4 < 4
sprite v1 v2 1
v1 += 8
again
v1 := 32
i := horizontal-line-4
sprite v1 v2 1
i := vertical-line
v1 := 35
v2 := 61
sprite v1 v2 15
v2 := 12
sprite v1 v2 10
v1 := 18
v2 := 43
sprite v1 v2 15
v2 := 58
sprite v1 v2 9
v1 := 109
v2 := 43
sprite v1 v2 15
v2 := 58
sprite v1 v2 9
v1 := 64
v2 := 3
v4 := -1
loop
v4 += 1
while v4 < 3
sprite v1 v2 13
v2 += 13
again
;
: create-level-5
i := level-5
load v2
# v0 -> number of foods
# v1 -> starting x pos
# v2 -> starting y pos
set-state
draw-octopus
# load the food into the board
v4 := -4
loop
v4 += 4
i := level-5-food
i += v4
load v3
while v0 != 0xFF
i := board-food
i += v4
save v3
again
level-5-walls
draw-board
;
# level 6 --------------------------------#
: level-6
# food-counter
6
# starting-position
16 39
: level-6-food
# type - taken - x pos - y pos
2 0 10 10
4 0 34 30
4 0 52 10
1 0 70 30
5 0 88 26
5 0 93 26
0xFF 0 0 0
: level-6-walls
v1 := 126
v2 := 37
i := horizontal-line-8
v4 := -1
loop
v4 += 1
while v4 < 11
sprite v1 v2 1
v1 += 8
again
v1 := 126
v2 := 53
v4 := -1
loop
v4 += 1
while v4 < 13
sprite v1 v2 1
v1 += 8
again
v1 := 86
v2 := 21
sprite v1 v2 1
v1 := 94
sprite v1 v2 1
v1 := 85
i := vertical-line
sprite v1 v2 15
v2 := 36
sprite v1 v2 1
v1 := 102
i := vertical-line
sprite v1 v2 15
v2 := 21
sprite v1 v2 15
v2 := 51
sprite v1 v2 3
v1 := 126
v2 := 53
v4 := -1
loop
v4 += 1
while v4 < 3
sprite v1 v2 15
v2 += 15
again
sprite v1 v2 4
;
: create-level-6
i := level-6
load v2
# v0 -> number of foods
# v1 -> starting x pos
# v2 -> starting y pos
set-state
draw-octopus
v4 := -4
loop
v4 += 4
i := level-6-food
i += v4
load v3
while v0 != 0xFF
i := board-food
i += v4
save v3
again
level-6-walls
draw-board
;
# level 7 --------------------------------#
: level-7
# food-counter
8
# starting-position
93 8
: level-7-food
# type - taken - x pos - y pos
7 0 25 53
7 0 35 53
7 0 45 53
7 0 55 53
3 0 15 58
3 0 11 60
3 0 70 58
3 0 74 60
0xFF 0 0 0
: level-7-walls
v1 := 20
i := horizontal-line-8
v4 := -1
loop
v4 += 1
while v4 < 6
v2 := 13
sprite v1 v2 1
v2 := 62
sprite v1 v2 1
v1 += 8
again
v1 := 27
v4 := -1
loop
v4 += 1
while v4 < 5
v2 := 20
sprite v1 v2 1
v2 := 40
sprite v1 v2 1
v1 += 8
again
v1 := 21
v4 := -1
loop
v4 += 1
while v4 < 5
v2 := 30
sprite v1 v2 1
v2 := 50
sprite v1 v2 1
v1 += 8
again
v2 := 17
i := vertical-line
v4 := -1
loop
v4 += 1
while v4 < 3
v1 := 20
sprite v1 v2 15
v1 := 67
sprite v1 v2 15
v2 += 15
again
;
: create-level-7
i := level-7
load v2
# v0 -> number of foods
# v1 -> starting x pos
# v2 -> starting y pos
set-state
draw-octopus
# load the food into the board
v4 := -4
loop
v4 += 4
i := level-7-food
i += v4
load v3
while v0 != 0xFF
i := board-food
i += v4
save v3
again
level-7-walls
draw-board
;
# level 8 --------------------------------#
: level-8
# food-counter
6
# starting-position
59 30
: level-8-food
# type - taken - x pos - y pos
1 0 24 7
2 0 98 7
1 0 116 24
2 0 6 46
7 0 61 53
6 0 114 7
0xFF 0 0 0
: level-8-walls
i := horizontal-line-8
v1 := 110
v4 := -1
loop
v4 += 1
if v4 == 2 then i := horizontal-line-4
while v4 < 3
v2 := 17
sprite v1 v2 1
v2 := 33
sprite v1 v2 1
v1 += 8
again
i := horizontal-line-8
v1 := 126
v4 := -1
loop
v4 += 1
if v4 == 2 then i := horizontal-line-4
while v4 < 3
v2 := 40
sprite v1 v2 1
v2 := 56
sprite v1 v2 1
v1 += 8
again
i := horizontal-line-8
v1 := 20
v2 := 17
sprite v1 v2 1
v1 := 28
sprite v1 v2 1
v1 := 93
v2 := 17
sprite v1 v2 1
v1 := 101
sprite v1 v2 1
v1 := 56
v2 := 48
sprite v1 v2 1
v1 := 64
sprite v1 v2 1
i := vertical-line
v1 := 19
v2 := 62
sprite v1 v2 15
v2 := 13
sprite v1 v2 5
v1 := 36
v2 := 62
sprite v1 v2 15
v2 := 13
sprite v1 v2 5
v1 := 92
v2 := 62
sprite v1 v2 15
v2 := 13
sprite v1 v2 5
v1 := 109
v2 := 62
sprite v1 v2 15
v2 := 13
sprite v1 v2 15
v2 := 28
sprite v1 v2 6
v1 := 18
v2 := 40
sprite v1 v2 15
v2 := 55
sprite v1 v2 2
v1 := 55
v2 := 48
sprite v1 v2 15
v2 := 63
sprite v1 v2 4
v1 := 72
v2 := 48
sprite v1 v2 15
v2 := 63
sprite v1 v2 4
;
: create-level-8
i := level-8
load v2
# v0 -> number of foods
# v1 -> starting x pos
# v2 -> starting y pos
set-state
draw-octopus
# load the food into the board
v4 := -4
loop
v4 += 4
i := level-8-food
i += v4
load v3
while v0 != 0xFF
i := board-food
i += v4
save v3
again
level-8-walls
draw-board
;
# level 9 --------------------------------#
: level-9
# food-counter
6
# starting-position
58 33
: level-9-food
# type - taken - x pos - y pos
5 0 22 14
6 0 54 51
5 0 70 6
6 0 70 20
5 0 107 4
6 0 1 25
0xFF 0 0 0
: level-9-walls
i := horizontal-line-8
v1 := 36
v2 := 31
v4 := -1
loop
v4 += 1
while v4 < 6
sprite v1 v2 1
v1 += 8
again
v1 := 20
v2 := 46
v4 := -1
loop
v4 += 1
while v4 < 11
sprite v1 v2 1
v1 += 8
again
v1 := 19
v2 := 10
v4 := -1
loop
v4 += 1
while v4 < 4
sprite v1 v2 1
v1 += 8
again
v1 := 36
v2 := 20
sprite v1 v2 1
v1 := 44
sprite v1 v2 1
i := dot
v1 := 51
sprite v1 v2 1
i := horizontal-line-8
v1 := 0
v2 := 18
sprite v1 v2 1
v2 := 36
sprite v1 v2 1
v1 := 8
sprite v1 v2 1
v1 := 16
i := horizontal-line-2
sprite v1 v2 1
i := horizontal-line-8
v1 := 65
v2 := 16
sprite v1 v2 1
v1 := 73
sprite v1 v2 1
v1 := 81
i := horizontal-line-2
sprite v1 v2 1
i := horizontal-line-8
v1 := 102
v2 := 0
sprite v1 v2 1
v1 := 110
sprite v1 v2 1
v1 := 118
i := horizontal-line-2
sprite v1 v2 1
i := horizontal-line-8
v1 := 20
v2 := 55
v4 := -1
loop
v4 += 1
while v4 < 3
sprite v1 v2 1
v1 += 8
again
v1 := 68
v2 := 55
v4 := -1
loop
v4 += 1
while v4 < 5
sprite v1 v2 1
v1 += 8
again
i := vertical-line
v1 := 18
v2 := 10
sprite v1 v2 15
v2 := 25
sprite v1 v2 12
v1 := 36
v2 := 21
sprite v1 v2 10
v1 := 64
v2 := 0
sprite v1 v2 15
v2 := 15
sprite v1 v2 10
v1 := 83
v2 := 16
sprite v1 v2 15
v1 := 101
v2 := 0
sprite v1 v2 15
v2 := 15
sprite v1 v2 15
v2 := 30
sprite v1 v2 2
v1 := 120
v2 := 0
sprite v1 v2 15
v2 := 15
sprite v1 v2 15
v2 := 30
sprite v1 v2 2
v1 := 43
v2 := 47
sprite v1 v2 8
v2 := 56
v1 := 68
sprite v1 v2 8
;
: create-level-9
i := level-9
load v2
# v0 -> number of foods
# v1 -> starting x pos
# v2 -> starting y pos
set-state
draw-octopus
# load the food into the board
v4 := -4
loop
v4 += 4
i := level-9-food
i += v4
load v3
while v0 != 0xFF
i := board-food
i += v4
save v3
again
level-9-walls
draw-board
;
#-- movement -------------------------------#
: steer-arm1
:alias input v1
i := arm1-direction
load v0
# v1 -> new arm direction
v2 := 0
input := 0x2 #2
if input key then v2 += UP
input := 0x4 #q
if input key then v2 += LEFT
input := 0x5 #w
if input key then v2 += DOWN
input := 0x6 #e
if input key then v2 += RIGHT
# can't stop won't stop
if v2 == 0 then return
# no going back
v1 := v0
v1 += v2
if v1 == 0 then return
v0 := v2
i := arm1-direction
save v0
;
: steer-arm2
:alias input v1
i := arm2-direction
load v0
# v1 -> new arm direction
v2 := 0
input := 0x8 #s
if input key then v2 += UP
input := 0xA #z
if input key then v2 += LEFT
input := 0x0 #x
if input key then v2 += DOWN
input := 0xB #c
if input key then v2 += RIGHT
# can't stop won't stop
if v2 == 0 then return
# no going back
v1 := v0
v1 += v2
if v1 == 0 then return
v0 := v2
i := arm2-direction
save v0
;
: move-arm1
i := arm1-direction
load v0
v1 := 0
v2 := 0
translate-movement
arm1_x += v1
arm1_y += v2
draw-arm1
;
: move-arm2
i := arm2-direction
load v0
v1 := 0
v2 := 0
translate-movement
arm2_x += v1
arm2_y += v2
draw-arm2
;
: translate-movement
# arguments:
# v0 -> direction
# v1 -> x
# v2 -> y
if v0 == UPLEFT then v1 += -1
if v0 == LEFT then v1 += -1
if v0 == DOWNLEFT then v1 += -1
if v0 == UPRIGHT then v1 += 1
if v0 == RIGHT then v1 += 1
if v0 == DOWNRIGHT then v1 += 1
if v0 == UPLEFT then v2 += -1
if v0 == UP then v2 += -1
if v0 == UPRIGHT then v2 += -1
if v0 == DOWNLEFT then v2 += 1
if v0 == DOWN then v2 += 1
if v0 == DOWNRIGHT then v2 += 1
;
: collect-food
i := board-food
load v3
v4 := 0
v5 := 0
loop
while v0 != 0xFF
if v1 == 0 begin
# draw the food twice - the first time we're guaranteed
# collisions and if an arm has hit the food the redraw
# will set vf appropriately
v0 <<= v0
v0 <<= v0
select-food
sprite v2 v3 7
sprite v2 v3 7
if vf == 1 begin
v5 := 1
# the arm has hit the food! collect it
v0 >>= v0
v0 >>= v0
v1 := TRUE
i := board-food
i += v4
save v1
# and undraw it again
v0 <<= v0
v0 <<= v0
select-food
sprite v2 v3 7
i := food-remaining
load v0
v0 += -1
i := food-remaining
save v0
end
end
v4 += 4
i := board-food
i += v4
load v3
again
vf := 0
if v5 == 1 then vf := 1
;
: check-collision
if vf == 1 begin
# flash all foods that haven't been collected
# and collect food that triggered conflict
collect-food
# if food was collected the game shouldn't end yet
if vf == 1 then return
restart-level
end
;
#-- game progression -----------------------#
: next-level
v9 := 1
v1 := 1
v2 := 3
v3 := 0xF
if v1 -key then v9 := 0
if v2 -key then v9 := 0
if v3 -key then v9 := 0
if v9 == 1 then jump skip-level
i := food-remaining
load v0
if v0 > 0 then return
dance
: skip-level
sweep-board
i := current-level
load v0
v0 += 1
i := current-level
save v0
if v0 == 2 then create-level-2
if v0 == 3 then create-level-3
if v0 == 4 then create-level-4
if v0 == 5 then create-level-5
if v0 == 6 then create-level-6
if v0 == 7 then create-level-7
if v0 == 8 then create-level-8
if v0 == 9 then create-level-9
if v0 == 10 then victory
;
: restart-level
i := octopus-coords
load v1
i := octopus
sprite v0 v1 0
i := octopus-tangled
sprite v0 v1 0
countdown
sweep-board
i := current-level
load v0
if v0 == 1 then create-level-1
if v0 == 2 then create-level-2
if v0 == 3 then create-level-3
if v0 == 4 then create-level-4
if v0 == 5 then create-level-5
if v0 == 6 then create-level-6
if v0 == 7 then create-level-7
if v0 == 8 then create-level-8
if v0 == 9 then create-level-9
;
: redraw-level
i := current-level
load v0
clear
if v0 == 4 then level-4-walls
if v0 == 5 then level-5-walls
if v0 == 6 then level-6-walls
if v0 == 7 then level-7-walls
if v0 == 8 then level-8-walls
if v0 == 9 then level-9-walls
;
: countdown
v1 := 0
loop
v1 += 1
while v1 < 7
draw-arm1
draw-arm2
v0 := 20
delay := v0
loop
v0 := delay
if v0 != 0 then
again
again
;
: dance
v0 := 40
delay := v0
loop
v0 := delay
if v0 != 0 then
again
clear
redraw-level
i := octopus-coords
load v1
# v1 -> octopus x pos
# v2 -> octopus y pos
v2 := v1
v1 := v0
i := dancing-octopus-left
sprite v1 v2 0
# v9 -> track octopus dance state
v9 := 0
# v8 -> will XOR will v9 to alternate state
v8 := 1
v4 := 0
loop
v4 += 1
while v4 < 9
sprite v1 v2 0
if v9 == 1 then i := dancing-octopus-left
if v9 == 0 then i := dancing-octopus-right
sprite v1 v2 0
v9 ^= v8
v0 := 15
delay := v0
loop
v0 := delay
if v0 != 0 then
again
again
;
#-- main -----------------------------------#
: main
setup
menu-screen
i := game-mode
load v0
if v0 == 1 then puzzle-mode
# if v0 == 2 then versus
;
: puzzle-mode
clear
create-level-1
loop
steer-arm1
steer-arm2
vf := delay
if vf == 0 begin
move-arm1
check-collision
move-arm2
check-collision
next-level
i := difficulty
load v0
vf := v0
delay := vf
end
again
;
#: versus
#;
: victory
clear
v2 := 14
v1 := 40
i := congratulations-text1
sprite v1 v2 8
v1 := 48
i := congratulations-text2
sprite v1 v2 8
v1 := 56
i := congratulations-text3
sprite v1 v2 8
v1 := 64
i := congratulations-text4
sprite v1 v2 8
v1 := 72
i := congratulations-text5
sprite v1 v2 8
v1 := 80
i := congratulations-text6
sprite v1 v2 9
v1 := 45
v2 := 30
i := full-octopus1
sprite v1 v2 0
v1 := 61
v2 := 30
i := full-octopus2
sprite v1 v2 0
v1 := 61
v2 := 46
i := full-octopus3
sprite v1 v2 0
v1 := 45
v2 := 46
i := full-octopus4
sprite v1 v2 0
v1 := 77
v2 := 46
i := full-octopus5
sprite v1 v2 4
v9 := 0
v8 := 1
v4 := 0
i := full-octopus-animate-up
loop
if v4 == 2 begin
if v9 == 1 then i := full-octopus-animate-up
if v9 == 0 then i := full-octopus-animate-down
v9 ^= v8
v4 := 0
end
v1 := 57
v2 := 29
sprite v1 v2 0
vf := 80
if v4 == 1 then vf := 25 # speed up the rise and fall
delay := vf
loop
vf := delay
if vf != 0 then
again
v4 += 1
again
;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment