module
33

The course disc boots the Einstein into XtalDOS, where BBCBASIC starts BBC BASIC. It holds four files:
| File | What it is |
|---|---|
BBCBASIC.COM | BBC BASIC itself - Einstein BBCBASIC Version 2.31, R.T. Russell, 1984. Locked. |
ANIMAL.BBC | The guessing game that learns, read in S29. CHAIN "ANIMAL". Locked. |
ANIMAL.DAT | Everything ANIMAL has learned. It rewrites this file when you tell it to save. |
GAME.BBC | DRIFT, the game this course builds, finished. CHAIN "GAME". Locked. |
Everything else - 160K of it - is room for your own work. The DOS's DIR, at 0:, says:
0:*GAME .BBC :*BBCBASIC.COM
0:*ANIMAL .BBC : ANIMAL .DAT
28k Size, 160k Free, 190k Total
The stars mark the three locked files. You can LOAD and LIST them, but not save over them without being asked first - and the answer to that question should be N (S6).
The whole game, as it is on the disc: 211 lines, 5,214 bytes in memory. S20 to S28 build it a piece at a time, as ADV1 to ADV9; ADV9 is this listing.
10 REM DRIFT - A TEXT ADVENTURE
20 MODE 0:PROCSETUP
30 PROCTITLE
40 PROCLOOK
50 REPEAT
60 PROCSTATUS
70 INPUT LINE "WHAT NOW",C$
80 PROCPARSE(C$)
90 PROCDO
100 IF OVER%=0 THEN PROCAIR
105 IF OVER%=0 THEN PROCNOISE
110 UNTIL OVER%
120 PROCFINISH
130 END
1000 DEF PROCSETUP
1010 DIM ROOM$(4),E%(4,4),DIR$(4)
1020 RESTORE 3000:FOR R%=1 TO 4:READ ROOM$(R%),E%(R%,1),E%(R%,2),E%(R%,3),E%(R%,4):NEXT
1025 FOR R%=1 TO 4:READ DIR$(R%):NEXT
1030 DIM D$(4):RESTORE 3100:FOR R%=1 TO 4:READ D$(R%):NEXT
1040 DIM O$(4),OD$(4),L%(4),F%(4):RESTORE 3200:FOR I%=1 TO 4:READ O$(I%),OD$(I%),L%(I%),F%(I%):NEXT
1050 DIM V$(30),VN%(30):RESTORE 3300:NV%=0:REPEAT NV%=NV%+1:READ V$(NV%),VN%(NV%):UNTIL V$(NV%)="END"
1060 R%=1:POWER%=0:LOCK%=0:OVER%=0:AIR%=30
1090 ENDPROC
1100 DEF PROCLOOK
1110 COLOUR 11:PRINT ROOM$(R%):COLOUR 15
1120 PROCWRAP(D$(R%))
1130 PROCEXITS
1140 PROCITEMS
1150 ENDPROC
1200 DEF PROCEXITS
1210 LOCAL D%,X$
1220 FOR D%=1 TO 4
1230 IF E%(R%,D%) THEN X$=X$+" "+DIR$(D%)
1240 NEXT
1250 PRINT "EXITS:";X$
1260 ENDPROC
1300 DEF PROCMOVE(D%)
1310 IF E%(R%,D%)=0 THEN PRINT "YOU CAN'T GO THAT WAY.":ENDPROC
1320 IF E%(R%,D%)=4 AND POWER%=0 THEN PRINT "THE BRIDGE DOOR IS SEALED SHUT.":ENDPROC
1330 R%=E%(R%,D%):PROCLOOK
1340 ENDPROC
1400 DEF PROCITEMS
1410 LOCAL I%
1420 FOR I%=1 TO 4
1430 IF L%(I%)=R% AND F%(I%)=0 THEN PRINT "YOU CAN SEE ";OD$(I%);"."
1440 NEXT
1450 ENDPROC
1500 DEF PROCGET(I%)
1510 IF I%=0 THEN PRINT "YOU CAN'T SEE THAT HERE.":ENDPROC
1520 IF L%(I%)=0 THEN PRINT "YOU ALREADY HAVE IT.":ENDPROC
1530 IF L%(I%)<>R% THEN PRINT "YOU CAN'T SEE THAT HERE.":ENDPROC
1540 IF F%(I%) THEN PRINT "IT WON'T MOVE.":ENDPROC
1550 L%(I%)=0:PRINT "TAKEN."
1560 ENDPROC
1600 DEF PROCDROP(I%)
1610 IF I%=0 THEN PRINT "YOU AREN'T CARRYING THAT.":ENDPROC
1620 IF L%(I%)<>0 THEN PRINT "YOU AREN'T CARRYING THAT.":ENDPROC
1630 L%(I%)=R%:PRINT "DROPPED."
1640 ENDPROC
1700 DEF PROCINV
1710 LOCAL I%,N%
1720 PRINT "YOU ARE CARRYING:"
1730 FOR I%=1 TO 4
1740 IF L%(I%)=0 THEN PRINT " ";OD$(I%):N%=N%+1
1750 NEXT
1760 IF N%=0 THEN PRINT " NOTHING."
1770 ENDPROC
1800 DEF PROCPARSE(C$)
1810 LOCAL S%
1815 C$=FNTRIM$(FNCAPS$(C$))
1820 S%=INSTR(C$," ")
1830 IF S%=0 THEN V$=C$:N$="" ELSE V$=LEFT$(C$,S%-1):N$=FNTRIM$(MID$(C$,S%+1))
1840 VN%=FNVERB(V$)
1850 IF VN%=5 THEN VN%=FNVERB(N$):N$="":IF VN%>4 THEN VN%=0
1870 ENDPROC
1900 DEF PROCDO
1910 IF VN%>=1 AND VN%<=4 THEN PROCMOVE(VN%):ENDPROC
1920 IF VN%=6 THEN PROCLOOK:ENDPROC
1930 IF VN%=7 THEN PROCGET(FNOBJ(N$)):ENDPROC
1940 IF VN%=8 THEN PROCDROP(FNOBJ(N$)):ENDPROC
1950 IF VN%=9 THEN PROCINV:ENDPROC
1960 IF VN%=10 THEN PROCOPEN(FNOBJ(N$)):ENDPROC
1970 IF VN%=11 THEN PROCREAD(FNOBJ(N$)):ENDPROC
1980 IF VN%=12 THEN PROCUSE(FNOBJ(N$)):ENDPROC
1985 IF VN%=13 THEN PROCHELP:ENDPROC
1987 IF VN%=14 THEN OVER%=3:ENDPROC
1990 PRINT "I DON'T UNDERSTAND."
1995 ENDPROC
2000 DEF PROCWRAP(T$)
2010 LOCAL S%
2020 REPEAT
2030 S%=FNBREAK(T$)
2040 PRINT LEFT$(T$,S%-1)
2050 T$=MID$(T$,S%+1)
2060 UNTIL T$=""
2070 ENDPROC
2080 DEF FNBREAK(T$)
2082 LOCAL S%
2084 IF LEN(T$)<40 THEN =LEN(T$)+1
2086 S%=41
2088 REPEAT S%=S%-1:UNTIL MID$(T$,S%,1)=" " OR S%=1
2090 IF S%=1 THEN =40
2092 =S%
2100 DEF FNCAPS$(A$)
2110 LOCAL I%,C%,B$
2120 FOR I%=1 TO LEN(A$)
2130 C%=ASC(MID$(A$,I%,1))
2140 IF C%>=97 AND C%<=122 THEN C%=C%-32
2150 B$=B$+CHR$(C%)
2160 NEXT
2170 =B$
2200 DEF FNTRIM$(A$)
2210 REPEAT
2220 IF LEFT$(A$,1)=" " THEN A$=MID$(A$,2)
2230 UNTIL LEFT$(A$,1)<>" "
2240 =A$
2300 DEF FNVERB(W$)
2310 LOCAL J%,K%
2320 FOR J%=1 TO NV%
2330 IF V$(J%)=W$ THEN K%=VN%(J%)
2340 NEXT
2350 =K%
2400 DEF FNOBJ(W$)
2410 LOCAL J%,K%
2420 FOR J%=1 TO 4
2430 IF W$<>"" AND INSTR(W$,O$(J%)) THEN K%=J%
2440 NEXT
2450 =K%
2500 DEF PROCOPEN(I%)
2510 IF I%<>4 OR R%<>2 THEN PRINT "YOU CAN'T OPEN THAT.":ENDPROC
2520 IF LOCK% THEN PRINT "IT IS ALREADY OPEN.":ENDPROC
2530 LOCK%=1:L%(2)=2
2540 PRINT "THE LOCKER SWINGS OPEN."
2550 PROCITEMS
2560 ENDPROC
2600 DEF PROCREAD(I%)
2610 IF I%<>1 THEN PRINT "YOU CAN'T READ THAT.":ENDPROC
2620 IF L%(1)<>0 AND L%(1)<>R% THEN PRINT "YOU CAN'T SEE THAT HERE.":ENDPROC
2630 PROCWRAP("THE CAPTAIN'S LAST LOG: 'MAIN POWER FAILED. ALL CREW TO THE PODS. NAVIGATION CODE 4712.'")
2640 ENDPROC
2700 DEF PROCUSE(I%)
2710 IF I%=2 THEN PROCCELL:ENDPROC
2720 IF I%=3 THEN PROCCONSOLE:ENDPROC
2730 PRINT "NOTHING HAPPENS."
2740 ENDPROC
2800 DEF PROCCELL
2810 IF L%(2)<>0 THEN PRINT "YOU AREN'T CARRYING A CELL.":ENDPROC
2820 IF R%<>3 THEN PRINT "THERE IS NOWHERE TO PUT IT.":ENDPROC
2830 L%(2)=-1:POWER%=1
2840 PROCWRAP("THE CELL CLICKS INTO THE REACTOR. LIGHTS FLICKER ON ALL OVER THE SHIP, AND SOMEWHERE A DOOR HISSES OPEN.")
2850 PROCBEEP(148)
2860 ENDPROC
2900 DEF PROCCONSOLE
2910 IF R%<>4 THEN PRINT "YOU CAN'T SEE THAT HERE.":ENDPROC
2920 INPUT "ENTER THE CODE",K$
2930 IF K$="4712" THEN OVER%=1:ENDPROC
2940 PRINT "ACCESS DENIED."
2950 ENDPROC
3000 DATA CRYO BAY,0,2,0,0
3010 DATA CORRIDOR,4,3,0,1
3020 DATA ENGINEERING,0,0,0,2
3030 DATA BRIDGE,0,0,2,0
3040 DATA NORTH,EAST,SOUTH,WEST
3100 DATA "YOU WAKE IN THE CRYO BAY. YOUR SLEEP POD STANDS OPEN. THE OTHER PODS ARE EMPTY AND DARK."
3110 DATA "A CORRIDOR RUNS THROUGH THE SHIP. TO THE NORTH IS THE BRIDGE DOOR, AND BESIDE IT A WALL LOCKER."
3120 DATA "THE ENGINE ROOM. THE REACTOR IS COLD, AND THE SOCKET FOR ITS POWER CELL IS EMPTY."
3130 DATA "THE BRIDGE. STARS WHEEL SLOWLY PAST THE WINDOW. THE NAVIGATION CONSOLE IS LIT, WAITING FOR A CODE."
3200 DATA PAD,A DATA PAD,1,0
3210 DATA CELL,A POWER CELL,-1,0
3220 DATA CONSOLE,THE CONSOLE,4,1
3230 DATA LOCKER,THE LOCKER,2,1
3300 DATA N,1,NORTH,1,E,2,EAST,2,S,3,SOUTH,3,W,4,WEST,4
3310 DATA GO,5,WALK,5,L,6,LOOK,6,GET,7,TAKE,7,DROP,8
3320 DATA I,9,INV,9,INVENTORY,9,OPEN,10,READ,11,USE,12,PUT,12
3330 DATA HELP,13,QUIT,14,END,0
3400 DATA THE HULL CREAKS.,SOMETHING TAPS ON THE HULL.,A LIGHT FLICKERS AND DIES.
4000 DEF PROCSTATUS
4010 COLOUR 129:PRINT "AIR ";AIR%;" ";:COLOUR 128:PRINT
4020 ENDPROC
4100 DEF PROCAIR
4110 AIR%=AIR%-1
4120 IF AIR%=10 THEN PRINT "WARNING: AIR RUNNING LOW."
4130 IF AIR%=0 AND OVER%=0 THEN OVER%=2
4140 ENDPROC
4200 DEF PROCFINISH
4210 IF OVER%=1 THEN PROCWRAP("THE ENGINES ROAR INTO LIFE. THE SHIP TURNS FOR HOME. YOU HAVE MADE IT."):PRINT "AIR TO SPARE: ";AIR%:PROCTUNE
4220 IF OVER%=2 THEN PROCWRAP("THE AIR IS GONE. THE SHIP DRIFTS ON, SILENT, AMONG THE STARS.")
4230 IF OVER%=3 THEN PRINT "YOU GIVE UP."
4240 ENDPROC
4300 DEF PROCHELP
4310 PROCWRAP("TRY: N, S, E, W, LOOK, GET, DROP, INVENTORY, OPEN, READ, USE, QUIT.")
4320 ENDPROC
4400 DEF PROCTITLE
4410 CLS:COLOUR 11:PRINT TAB(15,6);"D R I F T"
4420 COLOUR 15:PRINT TAB(9,10);"A SHIP ADRIFT IN SPACE"
4430 PRINT TAB(11,16);"PRESS ANY KEY";
4440 K$=GET$:CLS
4450 ENDPROC
4500 DEF PROCBEEP(P%)
4510 LOCAL T%
4520 SOUND 1,-15,P%,TRUE:T%=TIME:REPEAT UNTIL TIME>T%+30:SOUND 1,0,P%,FALSE
4530 ENDPROC
4600 DEF PROCTUNE
4610 PROCBEEP(100):PROCBEEP(116):PROCBEEP(128):PROCBEEP(148)
4620 ENDPROC
4700 DEF PROCNOISE
4710 LOCAL I%,M$
4720 IF RND(6)>1 THEN ENDPROC
4730 RESTORE 3400:FOR I%=1 TO RND(3):READ M$:NEXT
4740 PRINT M$
4750 ENDPROC