• Skip to main content
  • Skip to header right navigation
  • Skip to site footer
Retro Game Coders

Retro Game Coders

Retro computer/console game + dev community

  • About
    • Retro Computer Collection
    • Contact
  • Blog
  • Retro Resources
    • Retro Gaming Timeline
    • Online Retro IDE
    • Retro Pixel Art Editor
    • Dungeon Loom Map Editor
    • 6502 Programmer’s Reference
    • Emulators
      • Acorn Electron
      • Amstrad CPC Emulator
      • Online BBC Micro Emulator
      • Commodore PET Emulator
      • Browser C64 Emulator
      • DOSBox/DOS PC emulator
      • Tandy CoCo/Dragon
    • Best Retro YouTube Channels
    • New Retro Books
    • Raspberry Pi Amiga Emulation
    • MiSTer FPGA Tutorial
    • BMC64 C64 Pi
  • Community

Home » Retro Game Coders Blog » Programming

Commodore 64 Text Adventures: Objects and Actions

Commodore 64 Text Adventures Part 2

Now in our C64 text adventure it’s time to put things the player can interact with into our game

We are writing a text adventure for the C64 using commodore BASIC and we got pretty far, but it is not finished so … What should we do next?

As the code grows I am so happy that I chose to go with the Commodore 64 Visual Studio extension. This extension still produces valid C64 BASIC code but allows you to omit line numbers and use labels instead. If you are not using it currently you really should check it out.

If you do need the line numbers, though, I still got you – go get that version on Github.

Commodore 64 BASIC Programming Series

Part 1: Introduction to Commodore BASIC

Part 1.5: Installing CBM Prg Studio on Mac/Linux

Part 2: Commodore BASIC Commands GOSUB and FOR Loops

Part 3: If/Then, Game Logic and Cursor Movement

Part 4: The Magic of POKE

Part 5: C64 DOS Commands

Part 6: Working with Data Files

Part 7: Programming C64 with Visual Studio Code

Part 8: C64 BASIC String Manipulation

Part 9: C64 Text Adventure Game

Part 10: Objects and Actions in Commodore 64 Text Adventures

It’s not a fully playable game yet:

  • Up to now the player can move around and grab objects, but not interact with them.
  • We do not have help text.
  • Winning condition so the game can be completed.
  • Mysteries and hidden spaces.
  • We can win so how does the user lose.
  • Let’s pretty up the introduction screen.

Join Retro Game Coders Community
Join the Retro Game Coders Community

Play the Adventure in Your Browser

You can try out the adventure as it stands in your browser using my C64 emulator here.

As I write this I am working on my version of the 8bitworkshop browser based code editor and emulator experience to include Commodore BASIC as well as assembler and C.

I think if I succed it will make it easier for people to follow these tutorials and create their own really cool C64 (and more) games and programs.

You can now follow the tutorials and edit the code right in your web browser with the Online Retro IDE

– No downloads, configuration, etc necessary, and it is free!

Interacting with Game Objects

Objects in places
Objects in places

Our variables do include game objects, and we can place them in rooms.

This is 1980s BASIC so we are limited to data structures we can use, so we went with having several lists (arrays):

  1. The object name.
  2. Object description.
  3. Which room an object is in. If it shows as in room 0 then it is in the players inventory.

Now we need to be able to use objects.

if left$(i$,4) = "use " then gosub useobject

Initially we are able to just copy what we did for get and drop so we pick up the name and find the object’s number from the list.

How could or should we build interaction into this data setup?

We could have on/off flags for our objects, remember how we set up the game map?

IF MID$(EX$(PL),1,2)<>"00" THEN PRINT ". NORTH"

In the same way we could say “if it is 0 then the light is off, 1 then the light is on“.

For my XC-BASIC text adventure engine this is the route I went. You can play it here. It didn’t get as far as a full game unfortunately because XC-BASIC 3 came out and was incompatible with XC2. One day I might come back to it and get it working again.

After some consideration, I don’t think we should do anything complicated. At least not now.

There is a point where abstraction just creates additional complexity and extra work (especially given the tools in this version of the language).

In general, it really depends if you are writing a game or a game engine.

If we don’t go the clever data-driven route it has a benefit that it gives us the complete flexibility to just come up with whatever logic we want for any scenario. We do not have to know ahead of time how you might need things to work. Drop a piano on the character, electrocute them in a wet bathroom, send them to the vacuum of space – it’s your game!

Therefore you get something like these:

objectactions:
rem actions for using objects
if f=1 and pl=3 then print "boom! the furnace explodes, filling the room with fire and smoke!":gosub waitkey:gosub gameover: rem matches in furnace room
if f=1 and pl=2 then print "suddenly the furnace roars to life, filling the room with heat and light!":ex$(2)="010604000300":m=m-1: if m<=0 then print "You are out of matches":ol(f-1)=-1: return : rem remove matches from inventory
if f=1 and pl <> 2 then print "you strike a match and light it, illuminating the room for a moment.":m=m-1: if m<=0 then print "You are out of matches":ol(f-1)=-1: rem remove matches from inventory
if f=2 and pl=4 then print "click! the door has unlocked!":ex$(4)="020005000000":ol(f-1)=-1: rem remove key from inventory
if f=2 and pl<>4 then print "you try to use the key, but it doesn't fit any locks here."
RETURN

In the first scenario, lighting the matches (f=1) in the service hatch (pl=3) ignites a gas leak, blowing up the furnace.

On the other end of the drama scale, using a key can unlock a door (or not).

Replacing Parts of Strings in C64 BASIC

Again, as mentioned earlier, we could work on parts of the fixed length strings but for convenience in my example we just write in a new copy of the data that reveals a new exit.

Here is how we can add the room into the data more surgically. Remember to read if there is an south door we do mid$(ex$(pl),5,2) . We look at the character position and get two characters back.

To change just the correct characters in a C64 BASIC string is involved:

10 a$="abcdefgh"
20 print a$
30 a$=left$(a$,3)+"x"+mid$(a$,len(a$)-4,4)
40 print a$
In C64 BASIC you must reconstruct the string to replace a part of it

Later versions have MID$ for assignment as well as retrieval
In C64 BASIC you must reconstruct the string to replace a part of it

In later versions of Commodore BASIC it turns out you can do the MID$ in reverse and write characters at that position mid$(ex$(pl),5,2)="05" – much more convenient.

That way ex$(4)="020000000000"becomes 020005000000

💬 Questions or comments? Head over to the community to discuss!

Adding New Screens (Help Text, Winning, and Intro)

Adding a basic screen of text is as easy as setting up the subroutine (either a numbered line or preferably in the Visual Studio approach, a label: and gosub to it:

help:
rem show help screen                          :                                       :
gosub newscreen
print "you have woken up in a dark and damp    basement, with no memory of how you got here."
print ""
print "your head is pounding and you feel      disoriented. you need to find a way out."
print ""
print "enter the command you want to use:"
print "  North, South, East, West, Up, Down"
print "  (n, s, e, w, u, d)"
print ""
print "  get , take "
print "  drop "
print "  examine "
print "  l, look"
print "  i, inventory"
print "  h, help"
print "  q, quit, exit"
print ""
print ""
gosub waitkey
RETURN



We already set up subroutines for waiting for a keypress and clearing the screen with the chosen text colours etc so this just builds on existing code.

The “winning condition” is the same, and I even have a return at the end so the player can keep exploring the game, but instead you could take the player out of the game if you wished by using goto gameover: which happens to be right at the end of the code listing, the natural end of the program.

What about if we want a more complex screen, perhaps something drawn in a PETSCII screen editor?

Here is how I display the introduction screen with the drawing of the house drawn using petscii.krissz.hu:

INTRO:
for i = 0 to 999 
read c:
get i$: if i$ <> "" then return
poke 1024+i,c  
next i
data 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32
data 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32
data 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32
data 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32
data 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 85, 73, 32, 32, 32, 32, 32, 32, 32, 32, 32, 71, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32
data 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 74, 75, 32, 32, 32, 32, 32,233,223, 32, 32, 93, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32
data 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,233,105, 95,223, 32, 71, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32
data 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,233,105, 78, 77, 95,223,208, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32
data 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,233,105, 78, 85, 73, 77, 95,234, 32, 32, 32, 85, 73, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32
data 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 85, 73, 32, 32, 32,236, 32, 32, 74, 75, 32, 32,251, 32, 32, 85, 85, 73, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32
data 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 85, 32, 73, 85, 73, 32, 97,112,110, 32, 32,112,110,225, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32
data 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 97,109,125, 32, 32,109,125,225, 32,104, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32
data 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,104, 92, 32, 97,112,110, 79, 80,112,110,225,104,102,104, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32
data 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,102,102,102, 92, 97,109,125,116,103,109,125,225,102,102,102,102, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32
data 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,102,102, 32, 32,104,104,104,104,160,120,104,104,104,104, 32,102,102, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32
data 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,104,104,104,104,104,248,120,104,104,104,104,104, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32
data 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,104,104,104,104,104,104,104,120,160,104,104,104,104,104,104, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32
data 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,160,120, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32
data 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32
data 32, 32, 32, 32, 32, 32, 32, 32, 32,112,114, 73, 32, 32, 85, 73, 32, 93, 85, 73, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32
data 32, 32, 32, 32, 32, 32, 32, 32, 32, 93, 93, 93, 93, 72, 66, 32, 85, 93,107, 75, 85, 73, 32, 93, 93, 85, 73, 93, 72, 85, 73, 85, 73, 32, 32, 32, 32, 32, 32, 32
data 32, 32, 32, 32, 32, 32, 32, 32, 32, 93, 32, 93, 74, 75, 93, 32, 74,125, 74, 75, 66, 32, 32,107,115, 93, 93, 93, 72, 74, 73,107, 75, 32, 32, 32, 32, 32, 32, 32
data 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 93, 93, 74, 75, 74, 75, 74, 75, 74, 75, 32, 32, 32, 32, 32, 32, 32
data 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32
data 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32

rem colour data
for i = 0 to 999: 
read c:
poke 55296+i,c
get i$: if i$ <> "" then return 
next i
data 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14
data 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14
data 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14
data 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14
data 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 14, 14, 14, 14, 14, 14, 14, 14, 14, 10, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14
data 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 14, 14, 14, 14, 14, 15, 12, 14, 14,  8, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14
data 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 12, 12, 14,  2, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14
data 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 12, 12, 12, 12, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14
data 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 12, 12, 12, 12, 14, 14, 14,  1, 15, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14
data 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  1, 15, 14, 14, 14, 15, 14, 14, 12, 11, 14, 14, 11, 14, 14,  1,  1, 15, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14
data 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  1, 14, 15,  1, 15, 14, 15, 15, 12, 14, 14, 15, 12, 11, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14
data 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 12, 11, 14, 14, 12, 11, 11, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14
data 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 13,  5, 14, 12, 15, 12, 12, 11, 15, 12, 11, 11, 14,  5, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14
data 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 13,  5,  5,  5, 12, 10,  2, 11, 11, 10,  2, 11, 11, 11, 14,  5, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14
data 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 13,  5, 14, 14, 14,  5,  5, 14, 10, 10, 14,  5,  5, 14, 14, 14,  5, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14
data 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  5,  5,  5, 14,  8,  8, 14,  5,  5,  5, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14
data 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  5,  5,  5,  5, 14,  2,  2, 14,  5,  5,  5,  5, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14
data 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  2,  2, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14
data 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14
data 14, 14, 14, 14, 14, 14, 14, 14, 14,  1,  1,  1, 14, 14,  1,  1, 14,  1,  1,  1, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14
data 14, 14, 14, 14, 14, 14, 14, 14, 14, 10, 10, 10, 10, 10, 10, 14, 10, 10, 10, 10, 10,  1, 14,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 14, 14, 14, 14, 14, 14, 14
data 14, 14, 14, 14, 14, 14, 14, 14, 14,  2, 14,  2,  2,  2,  2, 14, 10, 10, 10, 10, 10, 14, 14, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 14, 14, 14, 14, 14, 14, 14
data 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 14, 14, 14, 14, 14, 14, 14
data 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14
data 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 1

gosub waitkey
RETURN

Unfortunately, seeing as this is inefficient even for BASIC, it takes a long time to render. This likely won’t make it into the final game!

The actual screen data is in, appropriately, data statements. Each time we read c we retrieve the next item of data (a character code) and put it into the variable c.

We loop a full screen of characters, using poke to put them into memory starting at 1024 which is the top-left of the screen. Next we do it all over again but this time getting colour information for each character position incrementally adding to colour cell memory, 55296.

Because it takes so long I added an escape for the player, and it gets old quickly if you play multiple times, if you press a key the routines short-circuit.

INTRO:
for i = 0 to 999 
read c:
get i$: if i$ <> "" then return
poke 1024+i,c  
next i

More Advanced IF Logic in C64 BASIC

You might notice that each time the player strikes a match we reduce the number remaining by 1. I did this to show you how such a mechanism might be implemented. Just keep in mind this could be a neat thing or frustrating for the player unless there are multiple ways to succeed that do not rely on you having matches left to use!

if f=1 and pl <> 2 then print "you strike a match and light it, illuminating the room for a moment.":m=m-1: if m<=0 then print "You are out of matches":ol(f-1)=-1: rem remove matches from inventory

When you get to zero I remove the matches from inventory, by setting its location to -1, and again as a demonstration for how to do that, but realistically you would still possess an empty book of matches. Perhaps after removing the original we could swap into your possession an empty matchbook object with a fresh description? Or just change the name/description of the existing object?

This example does highlight something a lot of people seem to miss about C64 BASIC and that is the ability to use AND and OR, plus the ability to have more than one command if the logic is true.

Even in old magazine code listings I see unnecessary GOTO statements to handle this kind of thing, but perhaps that is because they were repurposing the same code for different machines at the time.

An odd quirk of C64 BASIC is as well as using AND you can also do IF F=1 THEN IF PL<>2 THEN and it actually works … I would say and/or are easier to read.

Keep an Eye on Memory

So far we can fit into our free BASIC memory, but as we build out the adventure we might start to run out, so with that in mind keep watching your fre(0) memory:

gosub clrscr
POKE 53281,6 : POKE 53280,14
print "Goodbye!"
print ""
print "memory free",fre(0)
print ""

Full Adventure Code Now (So Far)

rem text adventure game by chris garrett 2025 retrogamecoders.com

rem set up variables etc
gosub INIT

displayroom:
rem show room details
gosub clrscr
if pl=0 then pl = pp                    : rem player location can not be 00 as that is inventory
pp = pl                                 : rem backup the location in case illegal move made
print rv$+lo$(pl)+ro$
print ""
if pl=5 then gosub YOUWIN
print "Objects visible:"+lb$
for i = 0 to oc-1                       : rem check object locations from the first object to object count
if ol(i) = pl then print ". ";ob$(i)    : rem if the object is in current location print it
next i
print ""
print wt$+"exits available:"+lb$
rem check each possible exit
if mid$(ex$(pl),1,2)<>"00" then print ". north"
if mid$(ex$(pl),3,2)<>"00" then print ". east"
if mid$(ex$(pl),5,2)<>"00" then print ". south"
if mid$(ex$(pl),7,2)<>"00" then print ". west"
if mid$(ex$(pl),9,2)<>"00" then print ". up"
if mid$(ex$(pl),11,2)<>"00" then print ". down"


getcommand:
i$=""
print ""
print yl$+"what now?"+lb$
input i$
if left$(i$,3) = "go " then gosub fullmove
if i$ = "n" then gosub abrmove
if i$ = "e" then gosub abrmove
if i$ = "s" then gosub abrmove
if i$ = "w" then gosub abrmove
if i$ = "u" then gosub abrmove
if i$ = "d" then gosub abrmove
if left$(i$,1) = "i" then gosub inventory
if left$(i$,4) = "get " then gosub getobject
if left$(i$,5) = "take " then gosub takeobject
if left$(i$,1) = "h" then gosub help
if left$(i$,4) = "quit" then gosub gameover
if left$(i$,4) = "exit" then gosub gameover
if left$(i$,5) = "drop " then gosub dropobject
if left$(i$,8) = "examine " then gosub examineobject
if left$(i$,4) = "look" or left$(i$,1) = "l" then ?"":print rd$(pl):?"":gosub waitkey
if left$(i$,1) = "q" then goto gameover
if left$(i$,4) = "use " then gosub useobject
goto displayroom

fullmove:
rem fully written out move (eg. GO SOUTH or GO S)
d$ = mid$(i$,4,1)
gosub moves
return

abrmove:
rem abbreviated move (eg. N)
d$ = i$
gosub moves
return


MOVES:
rem go to the new player location (PL)
if d$ = "n" then pl = val(mid$(ex$(pl),1,2))
if d$ = "e" then pl = val(mid$(ex$(pl),3,2))
if d$ = "s" then pl = val(mid$(ex$(pl),5,2))
if d$ = "w" then pl = val(mid$(ex$(pl),7,2))
if d$ = "u" then pl = val(mid$(ex$(pl),9,2))
if d$ = "d" then pl = val(mid$(ex$(pl),11,2))

return

INVENTORY:
rem objects the player is carrying
print ""
print "Objects in your possession:"
for i = 0 to oc-1                       : rem check object location from the first object to object count
if ol(i) = 0 then print ". ";ob$(i)     : rem if the object is in zero print it
next i
print ""

waitkey:
print cy$+rv$+"        press a key to continue         "+ro$
waitingforkey:
get i$
if i$="" goto waitingforkey
RETURN

takeobject:
rem alternative action to get
f=-1:r$=""
r$ = mid$(i$,6)         : rem r$ is object requested
goto getobjid

getobject:
rem allow player to get available object and put in inventory
f=-1:r$=""
r$ = mid$(i$,5)         : rem r$ is object requested

getobjid:
rem get the object id
for i = 1 to oc 
if ob$(i-1) = r$ then f=i : rem it exists
next i

rem can't find it? 
print ""
if f=-1 then print "can't see that here, check spelling and be specific?" : goto donegetting
if ol(f-1)=pl then goto gotit
if ol(f-1)=0 then print "you already have that" : goto donegetting
print "I can't see that around here"
goto donegetting

gotit:
ol(f-1)=0 : rem set the object location to inventory aka room zero
print ""
print "got the ";obj$(f-1)

donegetting:
print ""
gosub waitkey
RETURN


DROPOBJECT:
rem drop objects the player is carrying

f=-1:r$=""
r$ = mid$(i$,6)         : rem r$ is object requested

rem get the object id
for i = 1 to oc 
if ob$(i-1) = r$ then f=i : rem it exists
next i

rem can't find it? 
print ""
if f=-1 then print "can't seem to find that, check spelling and be specific?" : goto donedropping
if ol(f-1)=0 then print "ok, dropped!" : ol(f-1)=pl : goto donedropping
print "no can do, are you sure you have that?"


donedropping:
gosub waitkey
RETURN

examineobject:
rem examine objects the player is carrying

f=-1:r$=""
r$ = mid$(i$,9)         : rem r$ is object requested

rem get the object id
for i = 1 to oc 
if ob$(i-1) = r$ then f=i : rem it exists
next i

rem can't find it? 
print ""
if f=-1 then print "can't seem to find that, check spelling and be specific?" : goto doneexamining
if ol(f-1)=0 then print od$(f-1) : goto doneexamining
print "no can do, are you sure you have that?"


doneexamining:
gosub waitkey
RETURN

useobject:
rem use an object the player is carrying

f=-1:r$=""
r$ = mid$(i$,5)         : rem r$ is object requested

rem get the object id
for i = 1 to oc 
if ob$(i-1) = r$ then f=i : rem it exists
next i

rem can't find it? 
print ""
if f=-1 then print "can't seem to find that, check spelling and be specific?" : goto doneusing
if ol(f-1)=0 then gosub objectactions : goto doneusing
print "no can do, are you sure you have that?"


doneusing:
gosub waitkey
RETURN


objectactions:
rem actions for using objects
if f=1 and pl=3 then print "boom! the furnace explodes, filling the room with fire and smoke!":gosub waitkey:gosub gameover: rem matches in furnace room
if f=1 and pl=2 then print "suddenly the furnace roars to life, filling the room with heat and light!":ex$(2)="010604000300":m=m-1: if m<=0 then print "You are out of matches":ol(f-1)=-1: return : rem remove matches from inventory
if f=1 and pl <> 2 then print "you strike a match and light it, illuminating the room for a moment.":m=m-1: if m<=0 then print "You are out of matches":ol(f-1)=-1: rem remove matches from inventory
if f=2 and pl=4 then print "click! the door has unlocked!":ex$(4)="020005000000":ol(f-1)=-1: rem remove key from inventory
if f=2 and pl<>4 then print "you try to use the key, but it doesn't fit any locks here."
RETURN

help:
rem show help screen                          :                                       :
gosub newscreen
print "you have woken up in a dark and damp    basement, with no memory of how you got here."
print ""
print "your head is pounding and you feel      disoriented. you need to find a way out."
print ""
print "enter the command you want to use:"
print "  North, South, East, West, Up, Down"
print "  (n, s, e, w, u, d)"
print ""
print "  get , take "
print "  drop "
print "  examine "
print "  i, look"
print "  i, inventory"
print "  h, help"
print "  q, quit, exit"
print ""
print ""
gosub waitkey
RETURN

YOUWIN:
rem show win screen

gosub newscreen
print "Congratulations! You have escaped the   murder house!"
print ""
print "now you know where the exit is feel free to go back in and explore, just do not hang around too long!"
print ""
gosub waitkey
gosub clrscr
RETURN


newscreen:
rem clear screen and set up colours
POKE 53281,6 : POKE 53280,6: rem screen colours
lb$=chr$(154): wt$=chr$(5): rem light blue, white
yl$=chr$(158): cy$=chr$(159): rem yellow and cyan
rv$=chr$(18): ro$=chr$(146): bl$=chr$(13) + chr$(187) + chr$(32): rem reverse on and off to make listing the code easier

clrscr:
print wt$: print chr$(147): print chr$(19);: rem clear screen, white text
RETURN



INIT: 
rem set up the game and the display
gosub newscreen

rem objects and locations 
rem =====================
rem objects
oc = 2 : rem object count
dim ob$(oc)
ob$(0)="matches": m=6 : rem matches, 6 in inventory to start
ob$(1)="key"

rem object descriptions
dim od$(oc)
od$(0)="a small book of promotional matches advertising patty's bar and grill, north lakes"
od$(1)="a large and heavy key made out of brass."

rem locations
rc = 6 : rem room count
dim lo$(rc)
lo$(0)="inventory"
lo$(1)="dank basement"
lo$(2)="furnace room"
lo$(3)="service hatch"
lo$(4)="a store room?"
lo$(5)="outside the house"
lo$(6)="cramped stairwell"


rem room descriptions                          :                                       :                                       :
dim rd$(rc)
rd$(0)=""
rd$(1)="a chillingly damp, bare-bricked room    with poured cement floor and timber     beamed ceiling. window frames are       boarded along one wall."
rd$(2)="this room is obviously a later addition, thrown together with drywall, and just large enough to section off the furnace from the main basement. you smell gas."
rd$(3)="up above the furnace, this tiny space   must have been built to allow access to hvac ducting. the smell of gas is strong here, and the furnace hums ominously."
rd$(4)="the dark and dusty room is empty, with  a single light bulb hanging from the    ceiling. there is an old wooden door on the far wall covered in cobwebs." 
rd$(5)="outside the house, you can see the front door and a path leading to the street."
rd$(6)="a tiny, twisty stairwell that was       previously obscured by the dark."



rem object's locations
rem loc 0 = player's inventory
dim ol(oc)
ol(0)=0 : rem matches are in inventory at the start of the game
ol(1)=6 : rem key is in the stairwell

rem exit names
dim en$(6)
en$(0)="north"
en$(1)="east"
en$(2)="south"
en$(3)="west"
en$(4)="up"
en$(5)="down"


rem room exits
rem     N E S W U D
dim ex$(20)
ex$(1)="000002000000"
ex$(2)="010004000300"
ex$(3)="000000000002"
ex$(4)="020000000000"
ex$(5)="040000000000"
ex$(6)="000000020000"


rem player
rem ======
pl = 1 : rem player location
pp = 1 : rem player previous location


WELCOMESCREEN:
rem welcome screen
gosub newscreen
gosub INTRO
gosub newscreen

? "             murder house"
? "         a text adventure game"
? "           by chris garrett"
? "                 2025"
?""
? lg$
? "          retrogamecoders.com"
?""
?" press h for help or other key to start"
?""

waitforstartkey:
get i$
if i$="" then goto waitforstartkey
if i$="h" then gosub help
if i$ <> "h" and i$ <> "" then RETURN
RETURN

INTRO:
for i = 0 to 999 
read c:
get i$: if i$ <> "" then return
poke 1024+i,c  
next i
data 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32
data 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32
data 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32
data 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32
data 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 85, 73, 32, 32, 32, 32, 32, 32, 32, 32, 32, 71, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32
data 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 74, 75, 32, 32, 32, 32, 32,233,223, 32, 32, 93, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32
data 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,233,105, 95,223, 32, 71, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32
data 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,233,105, 78, 77, 95,223,208, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32
data 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,233,105, 78, 85, 73, 77, 95,234, 32, 32, 32, 85, 73, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32
data 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 85, 73, 32, 32, 32,236, 32, 32, 74, 75, 32, 32,251, 32, 32, 85, 85, 73, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32
data 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 85, 32, 73, 85, 73, 32, 97,112,110, 32, 32,112,110,225, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32
data 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 97,109,125, 32, 32,109,125,225, 32,104, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32
data 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,104, 92, 32, 97,112,110, 79, 80,112,110,225,104,102,104, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32
data 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,102,102,102, 92, 97,109,125,116,103,109,125,225,102,102,102,102, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32
data 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,102,102, 32, 32,104,104,104,104,160,120,104,104,104,104, 32,102,102, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32
data 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,104,104,104,104,104,248,120,104,104,104,104,104, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32
data 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,104,104,104,104,104,104,104,120,160,104,104,104,104,104,104, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32
data 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,160,120, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32
data 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32
data 32, 32, 32, 32, 32, 32, 32, 32, 32,112,114, 73, 32, 32, 85, 73, 32, 93, 85, 73, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32
data 32, 32, 32, 32, 32, 32, 32, 32, 32, 93, 93, 93, 93, 72, 66, 32, 85, 93,107, 75, 85, 73, 32, 93, 93, 85, 73, 93, 72, 85, 73, 85, 73, 32, 32, 32, 32, 32, 32, 32
data 32, 32, 32, 32, 32, 32, 32, 32, 32, 93, 32, 93, 74, 75, 93, 32, 74,125, 74, 75, 66, 32, 32,107,115, 93, 93, 93, 72, 74, 73,107, 75, 32, 32, 32, 32, 32, 32, 32
data 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 93, 93, 74, 75, 74, 75, 74, 75, 74, 75, 32, 32, 32, 32, 32, 32, 32
data 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32
data 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32

rem colour data
for i = 0 to 999: 
read c:
poke 55296+i,c
get i$: if i$ <> "" then return 
next i
data 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14
data 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14
data 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14
data 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14
data 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 14, 14, 14, 14, 14, 14, 14, 14, 14, 10, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14
data 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 14, 14, 14, 14, 14, 15, 12, 14, 14,  8, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14
data 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 12, 12, 14,  2, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14
data 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 12, 12, 12, 12, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14
data 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 12, 12, 12, 12, 14, 14, 14,  1, 15, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14
data 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  1, 15, 14, 14, 14, 15, 14, 14, 12, 11, 14, 14, 11, 14, 14,  1,  1, 15, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14
data 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  1, 14, 15,  1, 15, 14, 15, 15, 12, 14, 14, 15, 12, 11, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14
data 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 12, 11, 14, 14, 12, 11, 11, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14
data 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 13,  5, 14, 12, 15, 12, 12, 11, 15, 12, 11, 11, 14,  5, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14
data 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 13,  5,  5,  5, 12, 10,  2, 11, 11, 10,  2, 11, 11, 11, 14,  5, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14
data 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 13,  5, 14, 14, 14,  5,  5, 14, 10, 10, 14,  5,  5, 14, 14, 14,  5, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14
data 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  5,  5,  5, 14,  8,  8, 14,  5,  5,  5, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14
data 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  5,  5,  5,  5, 14,  2,  2, 14,  5,  5,  5,  5, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14
data 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  2,  2, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14
data 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14
data 14, 14, 14, 14, 14, 14, 14, 14, 14,  1,  1,  1, 14, 14,  1,  1, 14,  1,  1,  1, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14
data 14, 14, 14, 14, 14, 14, 14, 14, 14, 10, 10, 10, 10, 10, 10, 14, 10, 10, 10, 10, 10,  1, 14,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 14, 14, 14, 14, 14, 14, 14
data 14, 14, 14, 14, 14, 14, 14, 14, 14,  2, 14,  2,  2,  2,  2, 14, 10, 10, 10, 10, 10, 14, 14, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 14, 14, 14, 14, 14, 14, 14
data 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 14, 14, 14, 14, 14, 14, 14
data 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14
data 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 1

gosub waitkey
RETURN

gameover:
gosub clrscr
POKE 53281,6 : POKE 53280,14
print "Goodbye!"
print ""
print "memory free",fre(0)
print ""






Category: ProgrammingTag: basic programming, Commodore 64 (C64)
Previous Post:PET-Type Commodore PET Shoot-em-upPet-Type: Commodore PET Horizontal Shootemup in C
Next Post:Online Retro Programming IDE: BBC CC65, C64 BASIC and Vic 20 Added!Online Retro IDE

Retro Game Coders

Retro computer/console game + dev programming community by Chris Garrett

  • Bluesky
  • Threads
  • Facebook
  • Instagram
  • YouTube
  • Mastodon

Maker Hacks ・ D6Combat・chrisg.com

© Copyright 2026 Chris Garrett

Privacy ﹒ Terms of Service

Return to top