Nessie

Developer(s): Peter Shaw
Date: 1983
Type: Program
Platform(s): TS 2068
Tags: Arcade

Nessie is a shooting game. Two rows of Loch Ness monster sections scroll across the screen in opposite directions, and you move a launcher left and right along the bottom with 5 and 8 and fire with 0. You have 20 missiles; hitting the upper row scores 20 and the lower row 10, and clearing a row earns a bonus of 1,000 or 2,000 points and brings the row back. The highest score of the session is kept.

Nessie is one of the programs in Peter Shaw’s book Games for your Timex-Sinclair 2000. This keyboard version came from an Oliger disk that also held the book’s Egg Savior, Box Bounce and Spider ‘n’ Fly.

Program Analysis

Structure

The monsters are two 32-character strings, a$ and b$, made of user-defined graphics. Each pass of the main loop rotates them in opposite directions with string slicing and reprints them, then reads the keys and redraws the launcher. Firing (line 1000) moves the missile up the screen while the rows keep moving, and checks the character at the missile’s column when it reaches each row.

Notable Techniques

  • Scrolling by rotation: LET b$=b$(2 TO )+b$(1) and LET a$=a$(LEN a$)+a$( TO (LEN a$)-1).
  • Movement uses logical expressions: LET h=h+(INKEY$="8" AND h<30)-(INKEY$="5" AND h>0).

Potential Issues

  • A hit near either edge of the screen appears to fail with “Subscript wrong”: lines 4000 and 5000 blank a$(b-4 TO b+4), which runs past the ends of the string when the launcher is within four columns of an edge.

The program was saved on the disk without an auto-run line; on this tape it starts automatically. It was tested in ZEsarUX: the scrolling rows, the launcher and firing work.

Related Content

Image Gallery

Source Code

   10 REM Nessie
   20 LET hi=0: GO SUB 9000
   30 GO SUB 8000
   40 LET s=0: LET mis=20: GO SUB 7000
   50 PRINT AT 5,0;a$''b$
   60 LET h=h+(INKEY$="8" AND h<30)-(INKEY$="5" AND h>0)
   70 IF INKEY$="0" THEN LET mis=mis-1: GO SUB 1000
   75 IF mis<1 THEN GO TO 500
   80 PRINT AT 20,h; INK 6;" abc   "
   90 LET b$=b$(2 TO )+b$(1)
  100 LET a$=a$(LEN a$)+a$( TO (LEN a$)-1)
  101 PRINT AT 0,0; PAPER 5; INK 0;"SCORE ";s,"MISSLES ";mis;" "
  110 IF b$="                                " THEN GO SUB 2000
  120 IF a$="                                " THEN GO SUB 3000
  140 GO TO 50
  500 PRINT AT 10,12; FLASH 1;"GAME OVER"
  501 PRINT AT 0,0; PAPER 5; INK 0;"SCORE ";s,"MISSLES ";mis;" "
  510 PRINT AT 12,10;"You scored ";s
  520 IF s>hi THEN LET hi=s
  525 PRINT ''TAB 4;"Highest score today ";hi
  530 INPUT "PRESS ANY KEY TO PLAY AGAIN"; LINE a$: GO TO 30
 1000 LET b=h+2
 1010 FOR f=19 TO 4 STEP -1
 1012 PRINT AT f,b;"h"
 1019 BEEP .001,-(f-30)
 1020 PRINT AT 5,0;a$''b$
 1030 LET h=h+(INKEY$="8" AND h<30)-(INKEY$="5" AND h>0)
 1040 PRINT AT 20,h; INK 6;" abc "
 1050 LET b$=b$(2 TO )+b$(1)
 1060 LET a$=a$(LEN a$)+a$( TO (LEN a$)-1)
 1070 IF f=5 THEN IF a$(b)<>" " THEN GO TO 4000
 1080 IF f=7 THEN IF b$(b)<>" " THEN GO TO 5000
 1090 PRINT AT f,b;" "
 1100 NEXT f: RETURN 
 2000 PRINT AT 10,7; FLASH 1;"BONUS 1000 POINTS"
 2010 LET b$="defg    defg    defg    defg    "
 2011 LET s=s+1000
 2015 BEEP .1,20: BEEP .2,15
 2020 FOR p=1 TO 150: NEXT p
 2040 PRINT AT 10,7;"                 ": RETURN 
 3000 PRINT AT 10,7; FLASH 1;"BONUS 2000 POINTS"
 3010 LET a$="defg    defg    defg    defg    "
 3011 LET s=s+2000
 3015 BEEP .1,20: BEEP .2,15
 3030 PRINT AT 10,7;"                 ": RETURN 
 4000 LET a$(b-4 TO b+4)="        "
 4010 LET s=s+20
 4011 BEEP .05,-5
 4020 RETURN 
 5000 LET b$(b-4 TO b+4)="        "
 5010 LET s=s+10
 5011 BEEP .05,-5
 5020 RETURN 
 7000 BORDER 7: PAPER 7: INK 4: CLS 
 7010 FOR a=0 TO 3: PRINT PAPER 5;"                                ";: NEXT a
 7020 RETURN 
 8000 LET a$="defg    defg    defg    defg    "
 8010 LET b$="defg    defg    defg    defg    "
 8020 LET h=15
 8022 LET s=0
 8030 RETURN 
 8900 REM **********************
 8910 REM 
 8920 REM         Graphics
 8930 REM 
 8940 REM   abc   -    abc
 8950 REM 
 8960 REM   defg  -    defg
 8970 REM 
 8980 REM   h     -    h
 8990 REM 
 8999 REM **********************
 9000 FOR a=USR "a" TO USR "h"+7
 9010 READ user: POKE a,user
 9020 NEXT a: RETURN 
 9030 DATA 0,0,0,127,255,255,255,255
 9040 DATA 0,24,60,255,255,255,255,255
 9050 DATA 0,0,0,254,255,255,255,255
 9060 DATA 0,96,248,252,127,63,15,7
 9070 DATA 1,15,31,63,255,255,240,192
 9080 DATA 128,240,248,255,255,63,31,7
 9090 DATA 2,15,15,255,255,252,248,192
 9100 DATA 24,60,60,24,60,26,0,0

Note: Type-in program listings on this website use ZMAKEBAS notation for graphics characters.