diff --git a/Makefile b/Makefile index 5378c5a..fcce176 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -all: decman.tap listing.txt +all: decman.tap listing.txt decman.wav listing.txt: decman.tap echo "DEC-Man Listing for the 2026 BASIC 10Liner Competition (PUR-80 Category) by mcphail (btl AT mcphail.uk)" > $@ @@ -12,7 +12,10 @@ listing.txt: decman.tap decman.tap: pac.bas zmakebas -l -i 1 -s 1 -n DEC-Man -a 1 -o $@ $^ +decman.wav: decman.tap + tape2wav $^ $@ + clean: - rm -f *.tap listing.txt + rm -f *.tap listing.txt *.wav .PHONY: all clean \ No newline at end of file diff --git a/b10l.gif b/b10l.gif deleted file mode 100644 index f3b8a1d..0000000 Binary files a/b10l.gif and /dev/null differ diff --git a/decman.gif b/decman.gif new file mode 100644 index 0000000..442f2af Binary files /dev/null and b/decman.gif differ diff --git a/decman.wav b/decman.wav new file mode 100644 index 0000000..7ab4d61 Binary files /dev/null and b/decman.wav differ diff --git a/instructions.txt b/instructions.txt new file mode 100644 index 0000000..6e06e1f --- /dev/null +++ b/instructions.txt @@ -0,0 +1,124 @@ + ___      ___     __        ___ ___   ____  ____   +|   \    /  _]   /  ]      |   T   T /    T|    \  +|    \  /  [_   /  / _____ | _   _ |Y  o  ||  _  Y +|  D  YY    _] /  / |     ||  \_/  ||     ||  |  | +|     ||   [_ /   \_l_____j|   |   ||  _  ||  |  | +|     ||     T\     |      |   |   ||  |  ||  |  | by mcphail +l_____jl_____j \____j      l___j___jl__j__jl__j__j btl AT mcphail.uk +                                                   + - An exciting arcade game for the ZX Spectrum +------------------------------------------------------------------------------ + +You are DEC-Man and must search the haunted castle for delicious protein pills +whilst avoiding "Stinky", the terrifying ghost who will ruin your day! Use the +magical teleporter to zip to the other end of the main corridor to escape his +spectral clutches. If you survive, you get to come back another day! + +---Controls------------------------------------------------------------------- + + Up - "E" + Down - "D" + Left - "O" + Right - "P" + +---Features------------------------------------------------------------------- + + - Exciting action! + - Several colours! + - Thrilling* sound! + - An intelligent enemy who will hunt you down! + - Working teleporter! + + * - not actually thrilling. + +---Loading-------------------------------------------------------------------- + +The "decman.tap" file can be loaded in any standard ZX Spectrum emulator, of +which there are many. I recommend FUSE, which is available for Windows, Mac +and Linux. Alternatively, the "decman.wav" file can be played through the tape +socket of an original ZX Spectrum and loaded with 'LOAD ""' in the usual way. +The game will auto-run when loaded. + +---Listing-------------------------------------------------------------------- + +Press "CAPS-Shift"+"SPACE" (Shift and Space on an emulator) to BREAK into the +program then type "LIST" (using the 'K' key) then "ENTER" to see the listing. +It can be seen that all lines are maximum 80 characters. For convenience, a +full listing is included in the "listing.txt" file which accompanies this +game. This has been produced using the "listbasic" utility from the FUSE +suite of tools. Note that line 1 has 4 extra colour-control characters added +which are represented in the listing as € symbols, to prove the 80-character +limit has not been exceeded. + +---Submission----------------------------------------------------------------- + +This game is being submitted for the 2026 BASIC 10Liner competition. It has +been written by me, mcphail, and is all my own work. No AI has been used in +the production of this game. I can be reached at "btl AT mcphail.uk". + +It uses standard Sinclair BASIC, as shipped on the original 16 and 48K +ZX Spectrum computers in the UK. + +I believe this submission meets all the criteria for the PUR-80 category. + +---Notes---------------------------------------------------------------------- + +This game was written in VSCode using my "speccydev" dev container. The source +code and build system is available at: + https://boarstone.mcphail.uk/mcphail/BASIC10Liner2026 . +I used the "zmakebas" utility to build the code into the .tap file. + +Sinclair BASIC is a poor choice for this competition due to its verbose +keyword structure, and the Spectrum is a tricky target as there are no subtle +ways to print characters to the screen without using lengthy "PRINT" commands. +Furthermore, there is no "ELSE" keyword so an "IF...THEN" construct +effectively ends a line. On the other hand, "DATA" statements can be placed +anywhere in the program and function definitions can be made before or after +the function is actually called. This allows the creative programmer to move +some data and logic to the dead spaces at the end of lines. + +I only use 2 "IF...THEN" statements in the program. Most of the logic is +constructed using boolean comparisons as part of "LET" assignments. This saves +a little space and prevents premature line closure. + +Most of the graphics are created by POKEing the screen attribute area to make +coloured blocks. It isn't pretty, but it is character-efficient and the +squares can be PEEKed for collision detection. + +Lines 1-3 create the play board. The coordinates of the walls in the upper- +left quadrant are read in and mirrored to the other 3 quadrants. As there was +a little spare space in these lines, the defined function "b" is located here. +This will be described later. + +Line 4 creates the teleport squares and starts the main game loop. + +Line 5 reads the keyboard input. If a direction key is pressed, it uses +defined function "a" to check if that direction does not contain a wall and +sets the new intended character direction if that is the case. Line 6 will +keep the player going in the original direction if there has not been a valid +change in direction. + +Line 7 teleports the player to the other end of the main corridor if they are +on the teleport square and prints the player at the new location. + +Line 8 will move the ghost up or down to match the player's row if there is no +wall in the way. If the ghost cannot move up or down, it will try to move left +or right towards the player (calling defined function "b" to do this as there +was no space left on this line), again if there is no wall in the way. The +algorithm is a bit 'loose', which creates emergent behaviour where the ghost +will sometimes branch away from a pursuit and try to head-off the player at +the next corner, which is quite fun! + +Line 9 will cause the ghost to back up a square if it cannot move towards the +player due to walls. This keeps the ghost in motion at all times. A check is +made for a player-ghost collision and the game restarted if that is the case. + +Line 10 increments the pill counter if one has been eaten, and either restarts +the game loop or plays the victory sound if the board has been cleared. The +defined function "a" is stuck on the end here, and is used multiple times in +the program to check for wall collisions by player or ghost. + +DEC-Man is, of course, a play on Pacman and "DEC" for "10", in the spirit of +the competition. + +---Have fun and thanks for the opportunity to make this!---------------------- \ No newline at end of file