Lets make a Commodore 64 Text Adventure Game!
A simple tutorial by John Christian Lonningdal
Part 1 - Lets create the story!
If you are anything like me, you want to see results quickly! You can plan something to death and never
really see the fruits of it because you've played through it on your paper-prototype a hundred times
and are quite bored with it before you have written a line of code. Well, lets just jump into it and do
some quick and dirty prototyping just to get a starting point. Note that many of the code samples here
are not showing the "correct" way of doing things, but just samples to get started in the discussion of
what we can improve upon to make the final product. It will take some time, and eventually you have a
well designed system that can hopefully be reused for many text adventure games.
Ok, lets whip up a story and some elements. The evil Wizard of Kaos has stolen the magical Golden Mask that
will give him immensive powers. You have been chosen as the only hope to kill the wizard and retrieve the
golden mask. Lets write some basic code for the introduction:
There is really nothing to special here, clear screen, light grey background and an indented title
and credits along with a storyline description. Actually many adventures didnt even have this since the
actual story was printed on the box/inlay, and naturally saving precious memory. I will discuss memory
usage problems in the C64 as we go along, but to give you a note of warning early on: Basic is exceptionally
memory inefficient! While the opcodes themselves are short, there is no notion of a memory pointer for
anything, meaning that whenever you assign a string variable a string the actual string is then stored twice
in the memory. Once in the basic listing, and another on the variable stack! Think carefully about that
and you will see that you should think about memory issues early on in your program and with some simple
coding tricks your adventure can be twice as big! As a fun little bonus I have added the calculated size of
our adventure in the title (many games liked to advertise how big their adventure was).
It is wise to keep track of how much memory you have available so that you
can adjust your expectations of what you can fit in your epic adventure. Naturally, programming the thing
in basic limits you to 38909 bytes of memory (actually 2 bytes less than what the boot screen says).
If you had done it in assembly you naturally have access to the rest of the memory and could basically
turn off Basic, Kernal and IO rom if you dont use those for anything. Still even in Basic it is possible
to load 4kb of information into address range 49152-53247 ($c000-$cfff) if you later read it with peeks.
That is 4 full screens of text for you right there although you would benefit speedwise from an assembly routine
to read it and displaying it.
Ok, now that the story is established you can start planning your locations and puzzles. A good practice
here is to start at the end. Yes, start with the climax! By figuring out how it all ends you can create
the story backwards and figure out the necessary puzzles, required objects and the locations where you
find these objects. Of course you probably already have a setting for the story in your head and some
idea of what locations you want in it. For our story I wanted to have a twist where the battle at the end
depends on whether you believe in the powers of the mask or not, and depening on your beliefs the
the mask has an effect on you or not, I guess partially inspired by Terry Pratchetts elaborations on
religion and its effect on people on the Discworld.
So naturally we need a location for the end battle, the wizards palace which we will place on top of
a mountain. To actually kill the wizard we will need some sort of weapon, and in our case we will just
add a good old pointy stick in the form of a sword. On our way to the castle we will go up a narrow
path which will have a blocking boulder. This blocking boulder can only be moved if you believe in the
power of the mask. Leading to this narrow path is a crossroad with a handy merchant that just happens
to sell swords. The crossroads then also lead to your cabin where you start the game and the church
which has the Altar of the Golden Mask where you will pray. Depending on what you answer when you
pray to the altar, you will gain strength from the power of the mask or be spared from the fires of
the mask that the wizard will cast at you. So basically you will have to pray at this altar twice,
once to get strength to move the boulder and then another to renounce your beliefs so that the light
from the mask has no effect on you. To buy the sword from the merchant you will have to bring a gold
coin from your cabin where you start. So there it is, our whole adventure in details and here is
a quick map to connect all the rooms:
So with this in mind we have established some basic requirements as well that is fairly typical for all
There are naturally many more you can add, most notably the ability to DROP items although to keep
this first sample simple I will avoid that altogether. Indeed, my code will use a fairly brute force
way of solving the bare minimum requirements with no thought whatsoever on reusable code and structure.
This is just to establish the foundation for discussion and see what ways we can improve on the
framework as we extend it and rewrite it. Hopefully during this time we will introduce new rooms and
puzzles to make the adventure last longer.
Part 2 - Main loop and code structure
- Introduction text
- Room descriptions with directions you can go and objects you can see.
- Text command input
- Navigation commands for going NORTH, SOUTH, EAST and WEST
- LOOK command for showing room description again
- TAKE command for picking up objects
- EXAMINE command for examining objects
- INVENTORY command for listing what you are currently carrying.
- Other commands for interacting with objects and NPCs (BUY, PRAY, PUSH, KILL)
- Game end descriptions (success or failure)
Back to index