A downloadable game

Queso Run
Presented by Octasoft - Programmed by DD8 ©2021
The Galactic Cheese Overlord, Charles E. Queso, needs more
cheese dip and you are the pilot for the j ob. Along with your Snookie
Co-pilot, Louie Lou-Baca, you must successfully pilot your trusty ship,
the Millennial Falco, through the ever changing asteroid belt. There
are 11 routes and 2 runs per route. Louie Lou-Baca sets you up with
an easier run the first time through a route, but the second run i s
always stickier. Beware of Route 11, Run 2; the Snookie must have
been drinking alot when plotting that course. Finishing the 21 different
playable Queso Runs takes skill and patience, but i s achievable by
competent stick twiddlers. The Snookie says that Franz Yolo can fly
them all without crashing and achieving the perfect Queso Run score
of 2100 points. Are you as talented as the i nfamous Franz Yolo?
Starting the game
Ensure that there are no fastload/freeze cartridges plugged i nto your
Commodore 64 or enabled i n your emulator. Plug your j oystick i nto
Port 2, turn on or boot the machine and mount the .d64 file.
Type Load “*”,8 and tap the Return key. When finished l oading, type
Run and tap Return. The Snookie will plot the first route and away you
go. To control the Millennial Falco, use your j oystick to move the ship
left or right to avoid the asteroids. Finishing a run earns you 100
points. Crashing subtracts 50 from your score. Crashing on the very
first run of the very first route will start over on that route since you
clearly need more practice twiddling your stick. A maximum of 2100
points i s possible with no crashes on all 21 playable runs. 11-2 i s
impossible, so make sure to check your score after 11-1.

Developer notes
I wanted to make a game that used a j oystick, and thought a vertical
scroller with only l eft and right movement would work i f the code was
fast enough. I also wanted i t to be smooth and playable. I think I
accomplished these goals within the constraints of the competition.
I am open to hearing any thoughts on i mproving the speed or
efficiency of the code. I was i nspired to do a scroller by reddit user
Jo3p’s one l ine game. Oneliner 64 :: A complete arcade action game
for the commodore 64 i n one single l ine of code : vintagecomputing
Many thanks to Roman Werner and his wonderful code i n these
competitions. I have l earned so much from l ooking through his code
and breaking i t down to understand what was going on. I created my
sprite compression based on his code i n Curse of the Aztec Temple
http://www.kingroman.com/c64/CurseOfTheAztecTemple.zip from the
2020 compo. I know he did not i nvent data compression, but i t was the
first time I broke i t down and figured out what was happening.
A critical piece I found for the j oystick routine was by user Pyrofer on
Lemon64.com. w hat are your speedy j oystick reading routines i n
BASIC - Commodore 64 (C64) Forum This array concept creates a
very fast j oystick routine that works well i n Basic. In this program i t
was one poke command with one addition calculation to update the
sprite X position on the screen. The fewer commands and math, the
faster i t runs, so this routine i s pretty quick.
A huge shout out to Robin Harbron of the 8 -Bit Show And Tell
YouTube channel. His videos on various aspects of Commodore Basic
and optimizing code for speed proved quite helpful i n this project.

General Program Explanation
0 Sprite data i n a string format; base addresses for VIC,SID,Joystick
1 Border/Background, Joystick array, Seed Random Number
2 Decode sprite data and store, Route data l ocation constants
3 String Variable for path, display text, Other variables and pokes
4 Random values for Route data
5 Sprite pointer, Sprite X&Y starting values, display text to start Run
6 Display Sprite; Game l oop start; Collision detection, Sprite Change
7 Display path; Check Joystick and move Sprite; Finish Route Display
8 Variable changes for next run; Display text and wait for fire button
9 Collision sound; Clear Sprite; Check flags for end or return to l oop
Detailed Program Explanation
0 K$=”.....” - Sprite data i n ascii code embedded i n a string
V=53248 - VIC base address
F=54287 - Sound base address (voice 3)
J=56320 - Joystick 2 base address
C=0 - Route variable i nitialization
1 POKEV+32,0 - Border color (black)
POKEV+33,0 - Background color (black)
DIMX(127) - Set up Joystick Array
FORI=.TO6 - Loop to i nput j oystick movement data i nto array
X(I+117)=4*((I>3)-(i<3)) - Define +/- 4 pixel move to l eft and right i n
j oystick array
NEXT - End of j oystick array l oop
Z=RND(-3) - Seeding Random Number Generator
G=2040 - Constant for Sprite pointer
2 FORI=1TO46 - Loop to decode sprite data and poke i nto memory
S=ASC(MID$(K$,I,1)) - Reading Sprite string & convert to number
S=S+36*(S<65)-10*(S>183) - Convert to Sprite data
POKE848+I,S - Poke Sprite data i nto cassette buffer

NEXT - End of decode l oop
B=4096 - Variable for beginning of path data
E=4496 - Variable for end of path data
3 L$=”...” - String variable for path graphic characters
C=C+1 - Increment Route
PRINT”..PLOTTING ROUTE”C - Clear screen, yellow text color and
display text
POKEV+39,5 - Sprite color (green)
L=1 - Variable for Run number
POKEF+5,240 - Set Attack/Decay Envelope for Voice 3
POKEF+9,15 - Set Volume to 15
D=10 - Initial screen l ocation for path
4 FORI=BTOE - Loop to create random path data
D=D+INT(RND(1)*3-1) - Random number from -1to1 and add to D
D=D+(D>20)-(D<5) - Set boundaries for l eft and right side of path
POKEI,D - Store path data
NEXT - End of path data l oop
FORI=1TO20 - finish l ine data l oop
POKEE+I,D - Store data for finish l ine
NEXT - End of finish l ine data l oop
Q=31 - Sprite to Background collision constant
5 POKEG,13 - Set Sprite pointer to sprite l ocation i n cassette buffer
POKEV+1,95 - Set Y position of sprite on screen
PRINT”.ROUTE”C”RUN”L”....” - Yellow Text for current l evel and
cursor down 6 rows, character color blue
POKEV,8*PEEK(B)+41 - Set X position of sprite relative to path
POKEV+Q,0 - Set collision to 0
6 POKEV+21,1 - Display Sprite
P=9 - Set Pitch variable for crash sound
FORI=BTOE+20 - Start of Play l oop
IFPEEK(V+Q)=1THENT=T-50 - Collision detect and reduce score

PRINT”..OOPS! .”T - Cursor Home and display crash text and score
POKEG,10 - Display crash sprite (memory contents from 640-703)
POKEF+3,129 - Start crash sound
7 PRINTTAB(PEEK(I))L$ - Display path character string
POKEV,PEEK(V)+X(PEEK(J)) - Update sprite X position
using j oystick i nput and j oystick array values (-4 or +4 pixels)
NEXT - End of Play l oop
T=T+100 - Add 100 to score for finishing run
PRINT”..ROUTE”C”RUN”L”WIN!..”T; - Display finish text and score
8 L=L+1 - Increment l evel (Run)
L$=”....” - New path graphic for Run 2
PRINT”. . PRESS FIRE .” - Display text for button press continue
WAITJ,16,16 - Wait for Fire button press
PRINT”.” - Clear screen
ONLGOTO,5,3 - Goto 5 for Run 2 and Goto 3 for new Route
9 FORI=.TO43 - Start of Sound crash pitch down l oop
P=P-.2 - Decrement Pitch .2
POKEF,P - change pitch i n SID voice 3 register
NEXT - End of Sound crash pitch down l oop
POKEF+3,0 - Turn off Sid Voice 3
POKEV+21,0 - Turn off sprite
PRINT”.” - Clear Screen
ON-(T>0)GOTO5 - Start Route over after crash - If score i s 0 then
this will skip to next l ine which i s nothing and game ends
IFC=1ANDL=1THENT=0 - Reset score to 0 i f crash on route1 run1
GOTO5 - Start Route over


queso run.d64 170 kB
Queso Run .pdf 101 kB

Development log

Leave a comment

Log in with itch.io to leave a comment.