585 lines
30 KiB
QBasic
585 lines
30 KiB
QBasic
10 REM Pneuma - A space adventure
|
|
20 REM ========== backstory and instructions ==========
|
|
30 PRINT "********************************" : PRINT
|
|
35 PRINT " Pneuma - A space adventure" : PRINT
|
|
40 PRINT "********************************": PRINT
|
|
45 PRINT "To get instructions, type 'help'"
|
|
50 PRINT
|
|
60 PRINT "You wake up in your bunk, in the sleeping quarters of the starship Pneuma. You can't"
|
|
65 PRINT "remember much. You went to bed feeling sick and after a feverish few hours tossing and"
|
|
70 PRINT "turning, feeling like you were burning up, you eventually fell asleep." : PRINT
|
|
75 PRINT "Now, your sheets and night clothes are damp with sweat, and you have a raging thirst."
|
|
80 PRINT "You have a sore throat and the mother of all headaches, like your brain has been boiling"
|
|
85 PRINT "in your skull. In fact, you're no longer sure exactly where you are ... you seem to be"
|
|
90 PRINT "suffering from some sort of amnesia ...": PRINT
|
|
95 REM set up environment
|
|
100 GOSUB 2700
|
|
500 REM setup room descriptions
|
|
510 GOSUB 3000
|
|
520 REM setup up interative descriptions
|
|
530 GOSUB 5000
|
|
540 REM setup dialogue
|
|
550 GOSUB 7000
|
|
700 REM ========== main loop ==========
|
|
701 IF WPL <> 99 THEN GOSUB 8400 : REM wraith-hound movement
|
|
702 REM show room details
|
|
703 PRINT "You are in the " ; LO$ ( PL ) : PRINT
|
|
705 GOSUB 4010 : REM print room description
|
|
706 GOSUB 8000 : REM tracker info if carried
|
|
707 IF WPL <> 99 THEN GOSUB 8200 : REM wraith-hound proximity check
|
|
709 IF WPL = PL THEN GOSUB 11000 : REM fight wraith-hound
|
|
710 INPUT "What now? " ; I$
|
|
715 PRINT
|
|
716 MOVE = 1
|
|
720 IF LEFT$ ( LOWER$ ( I$ ) , 4 ) = "get " THEN MOVE = 0 : GOSUB 1400
|
|
730 IF LEFT$ ( LOWER$ ( I$ ) , 5 ) = "take " THEN MOVE = 0 : GOSUB 1700
|
|
740 IF LEFT$ ( LOWER$ ( I$ ) , 5 ) = "drop " THEN MOVE = 0 : GOSUB 2000
|
|
750 IF LEFT$ ( LOWER$ ( I$ ) , 8 ) = "examine " THEN MOVE = 0 : GOSUB 2300
|
|
760 IF LEFT$ ( LOWER$ ( I$ ) , 4 ) = "look" THEN MOVE = 0 : GOSUB 4010
|
|
765 IF LEFT$ ( LOWER$ ( I$ ) , 4 ) = "help" THEN MOVE = 0 : GOSUB 4130
|
|
767 IF LEFT$ ( LOWER$ ( I$ ) , 4 ) = "use " THEN MOVE = 0 : GOSUB 9000
|
|
770 IF LOWER$ ( I$ ) = "i" OR LOWER$ ( I$ ) = "inventory" THEN MOVE = 0 : GOSUB 1000
|
|
775 IF LEFT$ ( LOWER$ ( I$ ) , 8 ) = "talk to " THEN MOVE = 0 : GOSUB 2630
|
|
780 IF LEFT$ ( LOWER$ ( I$ ) , 1 ) = "q" THEN GOSUB 2600
|
|
785 IF LEFT$ ( LOWER$ ( I$ ) , 3 ) = "go " THEN GOSUB 1100
|
|
790 IF LOWER$ ( I$ ) = "f" OR LOWER$ ( I$ ) = "forward" THEN GOSUB 1200
|
|
800 IF LOWER$ ( I$ ) = "a" OR LOWER$ ( I$ ) = "aft" THEN GOSUB 1200
|
|
810 IF LOWER$ ( I$ ) = "p" OR LOWER$ ( I$ ) = "port" THEN GOSUB 1200
|
|
820 IF LOWER$ ( I$ ) = "s" OR LOWER$ ( I$ ) = "starboard" THEN GOSUB 1200
|
|
830 IF LOWER$ ( I$ ) = "u" OR LOWER$ ( I$ ) = "up" THEN GOSUB 1200
|
|
840 IF LOWER$ ( I$ ) = "d" OR LOWER$ ( I$ ) = "down" THEN GOSUB 1200
|
|
895 IF MOVE = 1 THEN GOTO 700 ELSE GOTO 710
|
|
900 STOP
|
|
995 REM ========== actions ==========
|
|
1000 REM list the player's inventory
|
|
1005 PRINT "You have the following items:" : PRINT
|
|
1010 FOR I = 0 TO OC - 1
|
|
1020 IF OL ( I ) = 0 THEN PRINT OB$ ( I )
|
|
1030 NEXT I
|
|
1035 PRINT
|
|
1040 RETURN
|
|
1100 REM fully written out move (e.g. 'go aft')
|
|
1110 D$ = MID$ ( LOWER$(I$) , 4 , 1 )
|
|
1120 GOSUB 1300
|
|
1130 RETURN
|
|
1200 REM abbreviated move (e.g. 'a' or 'aft')
|
|
1210 D$ = LOWER$( I$ )
|
|
1220 GOSUB 1300
|
|
1230 RETURN
|
|
1300 REM go to the player's new location (PL)
|
|
1310 IF D$ = "f" THEN NPL = VAL ( MID$ ( EX$ ( PL ) , 1 , 2 ) )
|
|
1320 IF D$ = "a" THEN NPL = VAL ( MID$ ( EX$ ( PL ) , 3 , 2 ) )
|
|
1330 IF D$ = "p" THEN NPL = VAL ( MID$ ( EX$ ( PL ) , 5 , 2 ) )
|
|
1340 IF D$ = "s" THEN NPL = VAL ( MID$ ( EX$ ( PL ) , 7 , 2 ) )
|
|
1345 IF D$ = "u" THEN NPL = VAL ( MID$ ( EX$ ( PL ) , 9 , 2 ) )
|
|
1350 IF D$ = "d" THEN NPL = VAL ( MID$ ( EX$ ( PL ) , 11 , 2 ) )
|
|
1355 IF NPL = 0 THEN PRINT "You can't go that way." : PRINT ELSE PL = NPL
|
|
1360 RETURN
|
|
1400 REM get command
|
|
1405 F=-1: R$=""
|
|
1410 R$ = MID$(LOWER$(I$), 5) : REM R$ is the requested object
|
|
1420 REM get the object ID
|
|
1430 FOR I= 0 TO OC-1
|
|
1440 IF OB$(I) = R$ THEN F=I : REM object exists
|
|
1450 NEXT I
|
|
1460 REM can't find the item?
|
|
1470 IF F=-1 THEN PRINT "You can't take that." : PRINT : RETURN
|
|
1480 IF OL(F) <> PL THEN PRINT "That item doesn't appear to be around here." : PRINT : RETURN
|
|
1490 IF OL(F)=0 THEN PRINT "You already have that item." : PRINT: RETURN
|
|
1520 OL(F)=0 : REM add the item to the inventory
|
|
1530 PRINT "You've picked up ";OB$(F); "." : PRINT
|
|
1540 RETURN
|
|
1700 REM take command
|
|
1710 F=-1: R$=""
|
|
1720 R$ = MID$(LOWER$(I$), 6) : REM R$ is the requested object
|
|
1730 GOTO 1420 : REM use the same logic as the get command
|
|
2000 REM drop command
|
|
2010 F=-1: R$=""
|
|
2020 R$ = MID$(LOWER$(I$), 6) : REM R$ is the requested object
|
|
2030 FOR I= 0 TO OC-1
|
|
2040 IF OB$(I) = R$ THEN F=I : REM object exists
|
|
2050 NEXT I
|
|
2060 REM can't find it?
|
|
2070 IF F=-1 THEN PRINT "You don't have that." : PRINT: RETURN
|
|
2080 IF OL(F) <> 0 THEN PRINT "You aren't carrying that." : PRINT: RETURN
|
|
2090 OL(F) = PL : PRINT "You've dropped ";OB$(F); ".": PRINT: REM add the item to the current room
|
|
2095 IF F = SUIT THEN SUIT_WORN = 0
|
|
2110 RETURN
|
|
2300 REM examine command
|
|
2310 F=-1 : R$=""
|
|
2320 R$ = MID$(LOWER$(I$), 9) : REM R$ is the object to examine
|
|
2330 FOR I = 0 TO IC-1
|
|
2340 IF IO$(I) = R$ THEN F=I : REM object exists
|
|
2350 NEXT I
|
|
2360 REM can't find it?
|
|
2370 IF F=-1 THEN PRINT "You can't examine that." : PRINT : RETURN
|
|
2380 IF IL(F) <> PL THEN PRINT "There isn't one of these here." : PRINT : RETURN
|
|
2390 GOSUB 6000 : REM print result of examination
|
|
2400 RETURN
|
|
2600 REM quit command
|
|
2610 PRINT "Farewell spacefarer ..."
|
|
2620 STOP
|
|
2630 REM talk to command
|
|
2635 F=-1 : R$ = ""
|
|
2640 R$ = MID$(LOWER$(I$), 9) : REM R$ is the person to talk to
|
|
2645 FOR I = 0 TO PC-1
|
|
2650 IF P$(I) = R$ THEN F=I : REM person exists
|
|
2655 NEXT I
|
|
2660 REM can't find them?
|
|
2665 IF F=-1 THEN PRINT "You've not met them." : PRINT : RETURN
|
|
2670 IF PLOC(F) <> PL THEN PRINT "They aren't here." : PRINT : RETURN
|
|
2675 GOSUB 7500 : REM print dialogue
|
|
2695 RETURN
|
|
2700 REM ========== set up environment ===========
|
|
2705 RC = 18 : REM room count
|
|
2710 DIM LO$ ( RC )
|
|
2715 INV = 0 : LO$ ( INV ) = "Inventory"
|
|
2720 GAL = 1 : LO$ ( GAL ) = "Galley"
|
|
2725 REC = 2 : LO$ ( REC ) = "Recreation/Dining Room"
|
|
2730 ARM = 3 : LO$ ( ARM ) = "Armoury"
|
|
2735 BDG = 4 : LO$ ( BDG ) = "Bridge"
|
|
2740 SLP = 5 : LO$ ( SLP ) = "Sleeping Quarters"
|
|
2745 MED = 6 : LO$ ( MED ) = "Medical Centre"
|
|
2750 GYM = 7 : LO$ ( GYM ) = "Gymnasium"
|
|
2755 LAC = 8 : LO$ ( LAC ) = "Lower Aft Corridor"
|
|
2760 ENG = 9 : LO$ ( ENG ) = "Engine Room"
|
|
2765 STO = 10 : LO$ ( STO ) = "Storeroom"
|
|
2770 MEN = 11 : LO$ ( MEN ) = "Menagerie"
|
|
2775 LAB = 12 : LO$ ( LAB ) = "Laboratory"
|
|
2780 LFC = 13 : LO$ ( LFC ) = "Lower Forward Corridor"
|
|
2785 POD = 14 : LO$ ( POD ) = "Pod Bay"
|
|
2790 AMC = 15 : LO$ ( AMC ) = "Aft Main Corridor"
|
|
2795 MMC = 16 : LO$ ( MMC ) = "Mid Main Corridor"
|
|
2800 FMC = 17 : LO$ ( FMC ) = "Forward Main Corridor"
|
|
2805 REM encoded room exits, two digits per direction f, a, p, s, u, d
|
|
2810 DIM EX$ ( RC )
|
|
2815 EX$ ( GAL ) = "020000150008"
|
|
2820 EX$ ( REC ) = "000100160000"
|
|
2825 EX$ ( ARM ) = "000000170000"
|
|
2830 EX$ ( BDG ) = "001700000000"
|
|
2835 EX$ ( SLP ) = "000015000000"
|
|
2840 EX$ ( MED ) = "070016000000"
|
|
2845 EX$ ( GYM ) = "000617000013"
|
|
2850 EX$ ( LAC ) = "100000090100"
|
|
2855 EX$ ( ENG ) = "000008000000"
|
|
2860 EX$ ( STO ) = "120800110000"
|
|
2865 EX$ ( MEN ) = "000010000000"
|
|
2870 EX$ ( LAB ) = "001000130000"
|
|
2875 EX$ ( LFC ) = "140012000700"
|
|
2880 EX$ ( POD ) = "001300000000"
|
|
2890 EX$ ( AMC ) = "160001050000"
|
|
2895 EX$ ( MMC ) = "171502060000"
|
|
2900 EX$ ( FMC ) = "041603070000"
|
|
2905 OC = 5 : REM object count
|
|
2910 DIM OB$ ( OC )
|
|
2915 PULSE = 0 : OB$ ( PULSE ) = "pulse rifle"
|
|
2920 SUIT = 1 : OB$ ( SUIT ) = "space suit"
|
|
2922 KNIFE = 2 : OB$ ( KNIFE ) = "knife"
|
|
2924 TRACKER = 3 : OB$ ( TRACKER ) = "tracker"
|
|
2926 SYRINGE = 4 : OB$ ( SYRINGE ) = "syringe"
|
|
2930 REM object locations
|
|
2932 REM location 0 = player's inventory
|
|
2934 DIM OL ( OC )
|
|
2936 OL ( PULSE ) = ARM
|
|
2937 OL ( SUIT ) = POD
|
|
2939 OL ( KNIFE ) = GAL
|
|
2940 OL ( TRACKER ) = GYM
|
|
2941 OL ( SYRINGE ) = MED
|
|
2942 IC = 5 : REM interactive object count
|
|
2944 DIM IO$ (IC)
|
|
2946 MEDLOG = 0 : IO$ ( MEDLOG ) = "medical log"
|
|
2948 PORTHOLE = 1 : IO$ (PORTHOLE) = "porthole"
|
|
2950 CONSOLE = 2 : IO$(CONSOLE) = "console"
|
|
2952 ENGINE = 3 : IO$(ENGINE)= "engine control"
|
|
2954 TERMINAL = 4 : IO$(TERMINAL) = "library terminal"
|
|
2960 REM interative object locations
|
|
2962 DIM IL ( IC )
|
|
2964 IL ( MEDLOG) = MED
|
|
2966 IL (PORTHOLE) = POD
|
|
2968 IL (CONSOLE) = BDG
|
|
2970 IL (ENGINE) = ENG
|
|
2971 IL (TERMINAL) = REC
|
|
2972 PC = 3 : REM person count
|
|
2974 DIM P$ ( PC )
|
|
2976 CHEF = 0 : P$ ( CHEF ) = "chef"
|
|
2978 RUNNER = 1 : P$ ( RUNNER ) = "runner"
|
|
2980 PILOT = 2 : P$ ( PILOT ) = "pilot"
|
|
2981 REM person locations
|
|
2983 DIM PLOC ( PC )
|
|
2985 PLOC ( CHEF ) = GAL
|
|
2987 PLOC ( RUNNER ) = GYM
|
|
2989 PLOC ( PILOT ) = BDG
|
|
2990 PL = SLP : REM initial player location
|
|
2992 WPL = MEN : REM wraith-hound initial location
|
|
2994 SUIT_WORN = 0 : REM is space suit worn?
|
|
2995 SHUTDOWN = 0 : REM are engines shut down?
|
|
2999 RETURN
|
|
3000 REM ========== room descriptions ==========
|
|
3010 DIM RD$ ( RC, 5 )
|
|
3015 REM inventory
|
|
3020 DATA "", "", "", "", ""
|
|
3025 REM galley
|
|
3030 DATA "The galley contains gleaming, stainless steel cupboards along the aft wall. A food"
|
|
3040 DATA "preparation surface is on the port wall, currently covered in rotting food. A chef"
|
|
3050 DATA "stands at the work surface, methodically chopping food even though everything has"
|
|
3060 DATA "already been thoroughly diced. There are doors in the starboard and forward walls and"
|
|
3070 DATA "a stairway leads downwards in the far corner."
|
|
3075 REM recreation room
|
|
3080 DATA "Space is clearly at a premium in this ship. The room doubles as both a dining and"
|
|
3090 DATA "recreation area. Long tables for dining are located on the port side, while couches"
|
|
3100 DATA "and low tables are scattered around the remaining space. A library terminal is switched"
|
|
3105 DATA "on in the corner. There are doors in the aft and starboard walls.", ""
|
|
3120 REM armoury
|
|
3130 DATA "Locked cabinets line the starboard wall. Each cabinet has a prominently displayed"
|
|
3140 DATA "notice on its door reading 'Weapons to be removed only when authorised by the Chief"
|
|
3150 DATA "Security Officer'. However, the door to one cupboard has been prized open, it is"
|
|
3160 DATA "warped and bent. This cupboard appears to be empty. The only exit is a starboard door.", ""
|
|
3170 REM bridge
|
|
3180 DATA "The bridge is the heart of the ship. A vast array of glowing screens and switches fill"
|
|
3190 DATA "every surface. On the screens are complex graphics providing detailed information about"
|
|
3200 DATA "the status of every system on the ship. Many of them are showing red warning symbols."
|
|
3210 DATA "There is a console directly in front of you, a pilot gripping the throttle."
|
|
3220 DATA "An aft exit leads back into the main corridor."
|
|
3225 REM sleeping quarters
|
|
3230 DATA "The sleeping quarters is filled with bunks, one up, one down. Several of the bunks"
|
|
3240 DATA "contain sleeping forms, some gently shoring. The room has a partition to separate"
|
|
3250 DATA "male and female bunks. Against the forward wall are two corresponding sets of heads."
|
|
3260 DATA "The room is messy, with discarded personal items everywhere ... on bunks, on the floor."
|
|
3270 DATA "There is a door in the port wall."
|
|
3275 REM medical centre
|
|
3280 DATA "The medical centre looks relatively normal, but there is evidence of discarded items"
|
|
3290 DATA "lying around the room. Blood filled syringes are scattered on a workbench, as well as"
|
|
3300 DATA "some bloodied bandanges. The words 'I'm losing myself' are scrawled messily in blood on"
|
|
3310 DATA "one wall. In the corner you can see a terminal. On the terminal screen is a portion"
|
|
3320 DATA "of the medical log. Exits lead port and forward."
|
|
3325 REM gymnasium
|
|
3330 DATA "The gymnasium is full of exercise equipment. A female runner is sprinting furiously on a"
|
|
3340 DATA "treadmill. She looks exhausted and emaciated, but she keeps running at top speed, almost at"
|
|
3350 DATA "a sprint. Her eyes remain fixed on the treadmill console. There are aft and port exits,"
|
|
3360 DATA "as well as a stairwell leading to the lower deck in the far corner.", ""
|
|
3370 REM lower aft corridor
|
|
3380 DATA "This is a featureless, utilitarian corridor. A stairwell leads upwards. There are also"
|
|
3390 DATA "exits leading starboard and forward.", "", "", ""
|
|
3400 REM engine room
|
|
3430 DATA "The engine room is characterised by a continual rumble, as though incredible energies are"
|
|
3440 DATA "barely being contained. There is an engine control in the far corner, festooned with"
|
|
3450 DATA "switches and engine readouts. A single exit leads out into the corridor.", "", ""
|
|
3460 REM storeroom
|
|
3480 DATA "The storeroom is full of crates, most neatly stacked, but with some scattered across the"
|
|
3490 DATA "floor, their contents spilling out. Along the port wall is a door marked 'Test specimens'."
|
|
3500 DATA "From behind the door, strange animal noises are audible ... snuffling sounds and the"
|
|
3510 DATA "occasional primate shriek. A dead man wearing a scuffed and torn lab coat is lying face down"
|
|
3520 DATA "in front of the specimen door. Two other exits lead forward and aft."
|
|
3525 REM menagerie
|
|
3530 DATA "The room is a hellhole. Cages stand open, while various animals roam about: chimpanzees,"
|
|
3540 DATA "dogs, and rats. Some of the rats are dead, having been savaged and eviscerated. The floor"
|
|
3550 DATA "and walls are smeared with animal faeces, and the smell is almost overpowering. A capsule,"
|
|
3552 DATA "its door ajar, is marked 'BIOWEAPON CONTAINMENT'. The capsule is empty."
|
|
3555 DATA "A single door to port leads back into the storeroom."
|
|
3560 REM laboratory
|
|
3570 DATA "The laboratory is full of scientific equipment, chemical glassware, electronic analysers,"
|
|
3580 DATA "fume cupboards, and two couches. The place looks disorded, like the rest of the ship, the"
|
|
3590 DATA "result of frenetic activity. A number of experiments seem to be in progress, with logbooks"
|
|
3600 DATA "and tablets covered in dense calculations and notes. Whatever has been happening in here,"
|
|
3610 DATA "it has been done with extreme urgency. Exits lead aft and to starboard."
|
|
3615 REM lower forward corridor
|
|
3620 DATA "This is a featureless, utilitarian corridor. A stairwell leads upwards. There are also"
|
|
3630 DATA "doors leading to port and forward.", "", "", ""
|
|
3660 REM pod bay
|
|
3670 DATA "You are in a large room, with a row of spacesuits hanging on the port wall. At the forward"
|
|
3680 DATA "end of the room is a small, two seater vehicle, capable of operating in space outside the"
|
|
3690 DATA "main ship for limited periods. In front of the small ship is the pod bay door, leading out"
|
|
3700 DATA "into space. There is a porthole on the far wall. There is a single exit leading aft.", ""
|
|
3710 REM aft main corridor
|
|
3720 DATA "The main corridor stretches away from you towards the front of the ship. It is featureless"
|
|
3730 DATA "and utilitarian. The lighting is dim. You can see doors either side of you, to port and"
|
|
3740 DATA "to starboard.", "", ""
|
|
3760 REM mid main corridor
|
|
3770 DATA "The main corridor stretches away from you both forward and aft. It is featureless"
|
|
3780 DATA "and utilitarian. The lighting is dim. You can see doors either side of you, to port and"
|
|
3790 DATA "to starboard.", "", ""
|
|
3810 REM forward main corridor
|
|
3820 DATA "The main corridor stretches away from you towards the rear of the ship. It is featureless"
|
|
3830 DATA "and utilitarian. The lighting is dim. You can see doors either side of you, to port and"
|
|
3840 DATA "to starboard, as well as a third door leading forward.", "", ""
|
|
3860 REM assign to room descriptions
|
|
3870 FOR ROOM = 0 to RC-1
|
|
3880 FOR I = 0 TO 4
|
|
3885 READ DESC$ : RD$ (ROOM, I) = DESC$
|
|
3890 NEXT I
|
|
3900 NEXT ROOM
|
|
4000 RETURN
|
|
4010 REM ========== print room description ==========
|
|
4020 FOR LINE = 0 TO 4
|
|
4030 IF RD$(PL, LINE) <> "" THEN PRINT RD$(PL, LINE)
|
|
4040 NEXT LINE
|
|
4055 GOSUB 4070
|
|
4060 RETURN
|
|
4070 REM print objects
|
|
4080 FOR I = 0 TO OC-1
|
|
4090 IF OL ( I ) = PL THEN PRINT : PRINT "You can see: ";OB$ ( I ); "."
|
|
4100 NEXT I
|
|
4110 PRINT
|
|
4115 IF PL = LAB THEN GOSUB 9700
|
|
4120 RETURN
|
|
4130 REM ========== print help ==========
|
|
4140 PRINT "For movement, try [go] a[ft], f[orward], p[ort], s[tarboard], u[p] or d[own]."
|
|
4150 PRINT "For actions, try get, take, drop, examine, look, use, i[nventory], q[uit]."
|
|
4155 PRINT "To examine, pick up, use or drop items, refer to them exactly as they are described."
|
|
4157 PRINT
|
|
4160 RETURN
|
|
5000 REM ========== interactive item descriptions ==========
|
|
5010 DIM ID$(IC, 20)
|
|
5020 REM medical log
|
|
5030 DATA "The last few entries of the medical log are still visible on the screen:", " "
|
|
5040 DATA "'2142-6-13: Three days since chimpanzee Nova was innoculated with agent #53."
|
|
5050 DATA " However, subject Nova showing no signs of adaptation to planetary destination"
|
|
5060 DATA " atmosphere. In fact, she appears listless, though punctuated with periods of"
|
|
5070 DATA " extreme agression.", " "
|
|
5090 DATA " 2142-6-14: This morning, Dr Pearson was bitten by Nova. Very quickly he exhibited"
|
|
5100 DATA " signs of a high fever and is now resting in his quarters.", " "
|
|
5120 DATA " 2142-6-15: After a brief period of catatonia, Pearson got up on his own, returned"
|
|
5130 DATA " to the medical bay and began to compulsively prepare more agent #53 samples. He"
|
|
5140 DATA " is otherwise uncommunicative.", " "
|
|
5160 DATA " 2142-6-17: Pearson's compulsive behaviour continues unabated. We have a hypothesis"
|
|
5170 DATA " for what the virus, which we have now designated HO-1, does to the brain. However,"
|
|
5180 DATA " we are struggling to isolate Pearson and may have to seal the medical bay.", " "
|
|
5200 DATA " 2142-6-17: Hollow (HO-1) confirmed as airborne, and other cases appearing around the ship."
|
|
5210 DATA " Shipwide lockdown declared but crew cohesion and discipline already breaking down.'"
|
|
5215 REM porthole
|
|
5220 DATA "Looking through the porthole, you seen a spacesuit clad figure floating outside."
|
|
5230 DATA "Although he is tethered to an anchor point on the ship's hull, he is otherwise floating"
|
|
5240 DATA "freely, his arms and legs splayed out to his sides.", " "
|
|
5260 DATA "Peering at the figure more closely, as he slowly rotates, a light from the ship"
|
|
5270 DATA "briefly illuminates his face. He's clearly dead, his oxygen ran out some time ago."
|
|
5280 DATA "His expression is frozen in a rictus of pain. He was screaming almost until the end ..."
|
|
5290 DATA "", "", "", "", "", "", "", "", "", "", "", "", ""
|
|
5300 REM console
|
|
5310 DATA "The console shows the state of the ship's engines. The pilot"
|
|
5320 DATA "appears to have the throttle jammed wide open with his right arm. The muscles in his"
|
|
5340 DATA "forearm are taught, there's no way he's going to release the throttle. He left hand"
|
|
5350 DATA "works its way around the console switches. After a few moments you realise that he is"
|
|
5360 DATA "executing the same sequence of switches over and over again.", " "
|
|
5370 DATA "His eyes are glazed, mentally he is somewhere else. He is"
|
|
5380 DATA "mumbling to himself but you cannot make out the words, although he appears to be"
|
|
5390 DATA "reciting some sort of launch checklist.", " "
|
|
5392 DATA "One screen shows the mission parameters:"
|
|
5394 DATA " 1. Explore potentially habitable worlds"
|
|
5396 DATA " 2. Conduct research to develop gene therapies to aid adaptation to planetary conditions"
|
|
5398 DATA " 3. Conduct research to develop custom biologic weapons systems, to protect colonists", " "
|
|
5400 DATA "If the engines are online, the ship will be careering through space at maximum"
|
|
5410 DATA "speed. Rescue will be impossible unless the engines are offline."
|
|
5420 DATA "", "", ""
|
|
5430 REM engine control
|
|
5440 DATA "The control panel is grubby, smeared with oil and grime. This is clearly"
|
|
5450 DATA "the engineering heart of the ship. Most of the readouts mean nothing to you,"
|
|
5460 DATA "whatever your duties were on this ship, you were clearly not a warp engineer.", " "
|
|
5470 DATA "Many of the lights on the front panel are flashing red. Not all is well with"
|
|
5480 DATA "the Pneuma. Even to your untrained eye, it's obvious that the ship's engines appear to"
|
|
5490 DATA "be on the point of burnout, having been run at full capacity for many hours.", " "
|
|
5500 DATA "To the top left of the panel, a screen reads:", " "
|
|
5510 DATA "'WARNING: CORE BREACH IMMINENT'", " "
|
|
5520 DATA "Just below the screen is a large red button, shielded by a cover that can be"
|
|
5530 DATA "flipped aside.", "", "", "", "", "", ""
|
|
5540 REM library terminal
|
|
5550 DATA "A ancient text is open in the terminal: 'The Origin of Consciousness in the Breakdown"
|
|
5560 DATA "of the Bicameral Mind by Julian Jaynes, 1976.'", "", "", "", "", "", "", "", "", ""
|
|
5570 DATA "", "", "", "", "", "", "", "", ""
|
|
5940 FOR OBJECT = 0 TO IC-1
|
|
5950 FOR I = 0 TO 19
|
|
5960 READ DESC$ : ID$ (OBJECT, I) = DESC$
|
|
5970 NEXT I
|
|
5980 NEXT OBJECT
|
|
5990 RETURN
|
|
6000 REM ========== print interative object description ==========
|
|
6010 FOR LINE = 0 TO 19
|
|
6020 IF ID$(F, LINE) <> "" THEN PRINT ID$(F, LINE)
|
|
6030 NEXT LINE
|
|
6035 PRINT
|
|
6040 RETURN
|
|
7000 REM ========== character speech ==========
|
|
7010 REM chef
|
|
7015 DIM PD$(PC, 4)
|
|
7020 DATA "Carrots, potatoes, I'm going to make a nice beef stew."
|
|
7030 DATA "This stew is going to be delicious."
|
|
7060 REM runner
|
|
7070 DATA "24:50, that's my new personal best. Not much further to go!"
|
|
7080 DATA "24:50, that's my new personal best. Not much further to go!"
|
|
7110 REM pilot
|
|
7120 DATA "Main engines online, supercruise on my mark."
|
|
7130 DATA "Five ... four ... three ... two ... one ... mark!"
|
|
7140 FOR PERSON = 0 TO PC-1
|
|
7150 FOR I = 0 TO 1
|
|
7160 READ DESC$ : PD$ (PERSON, I) = DESC$
|
|
7170 NEXT I
|
|
7180 PD$(PERSON, 2) = PD$(PERSON, 0)
|
|
7190 PD$(PERSON, 3) = PD$(PERSON, 1)
|
|
7200 NEXT PERSON
|
|
7210 RETURN
|
|
7500 REM ========== print character speech ==========
|
|
7510 FOR LINE = 0 TO 4
|
|
7520 PRINT PD$(F, LINE)
|
|
7530 NEXT LINE
|
|
7535 PRINT
|
|
7550 RETURN
|
|
8000 REM ========== wraith-hound tracking ==========
|
|
8010 IF OL ( TRACKER ) <> INV THEN RETURN
|
|
8015 IF WPL = 99 THEN PRINT "Tracking: Wraith-hound terminated." : GOTO 8030
|
|
8020 PRINT "Tracking: Wraith-hound current location is the "; LO$ ( WPL )
|
|
8030 PRINT
|
|
8040 RETURN
|
|
8200 REM ========== wraith-hound proximity check ==========
|
|
8210 DIR$ = ""
|
|
8220 IF VAL ( MID$ ( EX$ ( PL ) , 1 , 2 ) ) = WPL THEN DIR$ = "forward of you"
|
|
8230 IF VAL ( MID$ ( EX$ ( PL ) , 3 , 2 ) ) = WPL THEN DIR$ = "aft of you"
|
|
8240 IF VAL ( MID$ ( EX$ ( PL ) , 5 , 2 ) ) = WPL THEN DIR$ = "to port"
|
|
8250 IF VAL ( MID$ ( EX$ ( PL ) , 7 , 2 ) ) = WPL THEN DIR$ = "to starboard"
|
|
8260 IF VAL ( MID$ ( EX$ ( PL ) , 9 , 2 ) ) = WPL THEN DIR$ = "above you"
|
|
8270 IF VAL ( MID$ ( EX$ ( PL ) , 11 , 2 ) ) = WPL THEN DIR$ = "below you"
|
|
8280 IF DIR$ <> "" THEN PRINT "You hear a snarling, spitting noise "; DIR$; ". The tracker is pinging ..."
|
|
8285 PRINT
|
|
8290 RETURN
|
|
8400 REM ========== wraith-hound movement ==========
|
|
8410 REM decide to move one third of the time
|
|
8420 MOVE = RNDINT(1, 3)
|
|
8430 IF MOVE <> 1 THEN RETURN
|
|
8440 REM randomly determine direction
|
|
8450 DIR = RNDINT(1, 6)
|
|
8460 IF DIR = 1 THEN INDEX = 1
|
|
8470 IF DIR = 2 THEN INDEX = 3
|
|
8480 IF DIR = 3 THEN INDEX = 5
|
|
8490 IF DIR = 4 THEN INDEX = 7
|
|
8500 IF DIR = 5 THEN INDEX = 9
|
|
8510 IF DIR = 6 THEN INDEX = 11
|
|
8520 NWPL = VAL ( MID$ ( EX$ ( WPL ) , INDEX , 2 ) ) : REM potential next location
|
|
8530 IF NWPL = 0 THEN GOTO 8450 : REM can't go that way
|
|
8540 WPL = NWPL
|
|
8550 RETURN
|
|
9000 REM ========== use an item ==========
|
|
9010 F=-1: R$=""
|
|
9020 R$ = MID$(LOWER$(I$), 5) : REM R$ is the requested object
|
|
9025 IF R$ <> "red button" THEN GOTO 9030
|
|
9027 GOSUB 9500
|
|
9028 RETURN
|
|
9030 REM get the object ID
|
|
9040 FOR I= 0 TO OC-1
|
|
9050 IF OB$(I) = R$ THEN F=I : REM object exists
|
|
9060 NEXT I
|
|
9070 REM can't find the item?
|
|
9080 IF F=-1 THEN PRINT "You haven't seen that item." : PRINT : RETURN
|
|
9090 IF OL(F) <> 0 THEN PRINT "You haven't picked up that item." : PRINT : RETURN
|
|
9100 REM item exists and is in inventory
|
|
9110 IF F <> SYRINGE THEN GOTO 9140
|
|
9112 IF OB$( SYRINGE ) = "blood filled syringe" THEN PRINT "The syringe is full." : PRINT : RETURN
|
|
9115 IF SUIT_WORN = 1 THEN PRINT "You can't puncture a spacesuit with a syringe!" : PRINT : RETURN
|
|
9120 OB$( SYRINGE ) = "blood filled syringe"
|
|
9130 PRINT "You use the syringe to take a blood sample from your arm." : PRINT : RETURN
|
|
9140 IF F <> TRACKER THEN GOTO 9160
|
|
9150 PRINT "The tracker is always on." : PRINT
|
|
9160 IF F <> SUIT THEN GOTO 9200
|
|
9170 IF OL(F) <> 0 THEN PRINT "You don't have a space suit." : PRINT : RETURN
|
|
9175 IF SUIT_WORN = 1 THEN PRINT "You're already wearing the space suit." : PRINT : RETURN
|
|
9180 SUIT_WORN = 1
|
|
9190 PRINT "You put on the space suit." : PRINT
|
|
9400 RETURN
|
|
9500 REM special button routine
|
|
9510 IF PL <> ENG THEN PRINT "There is no red button here." : PRINT : RETURN
|
|
9520 IF SHUTDOWN = 0 THEN GOTO 9540
|
|
9525 SHUTDOWN = 0
|
|
9530 PRINT "Engine restart initiated ... engines online." : PRINT
|
|
9535 ID$ (ENGINE, 10) = "'WARNING: CORE BREACH IMMINENT'" : RETURN
|
|
9540 SHUTDOWN = 1
|
|
9550 PRINT "Engine shutdown initiated ... engines offline." : PRINT
|
|
9555 ID$ (ENGINE, 10) = "'ENGINES OFFLINE'"
|
|
9560 RETURN
|
|
9700 REM ========== laboratory conversation ==========
|
|
9710 PRINT "Dr Lascoe is stood in the laboratory. He is armed. He speaks to you." : PRINT
|
|
9720 PRINT "'It's you! You were infected with HO-1, but you seem to be normal."
|
|
9730 PRINT " Hollow destroys consciousness, it shuts down all self awareness in the brain."
|
|
9740 PRINT " The patient still functions to a degree, but they're an automaton, endlessly"
|
|
9750 PRINT " running the same mental subroutines like a piece of clockwork until the body"
|
|
9760 PRINT " breaks down.'" : PRINT
|
|
9770 PRINT "'I've been hiding in here to avoid contagion. Someone released the wraith-hound"
|
|
9780 PRINT " from containment, but I've been able to keep it away with this weapon."
|
|
9790 PRINT " But if you're immune, I can develop a vaccine from your blood.'" : PRINT
|
|
9800 IF OL(SYRINGE) = 0 AND OB$(SYRINGE) = "blood filled syringe" THEN GOTO 9820
|
|
9810 PRINT "'You need to get me a sample of your blood.'" : PRINT : RETURN
|
|
9820 PRINT "'Ah, I see you have a blood sample, excellent.'" : PRINT
|
|
9830 IF SUIT_WORN = 1 THEN GOTO 9855
|
|
9840 PRINT " I still don't want to take the risk that you are contagious. Put on a space"
|
|
9850 PRINT " suit and then I'll let you approach me.'" : PRINT: RETURN
|
|
9855 PRINT "'Good, you're wearing a suit to avoid contaminating me.'" : PRINT
|
|
9860 IF SHUTDOWN = 1 THEN GOTO 9885
|
|
9870 PRINT "'Rescue will be impossible while the engines are running out of control."
|
|
9880 PRINT " You'll need to take them offline.'": PRINT : RETURN
|
|
9885 PRINT "'Good job on taking the engines offline, you've saved us both!"
|
|
9890 PRINT " I'll work up the serum and we can wait for rescue.'" : PRINT
|
|
9900 GOSUB 10000
|
|
9910 RETURN
|
|
10000 REM ========== finale ==========
|
|
10010 PRINT "Congratulations, you have save Pneuma and helped Dr Lascoe develop"
|
|
10020 PRINT "vaccine against HO-1, the Hollow virus."
|
|
10030 PRINT : PRINT " THE END" : PRINT
|
|
10040 STOP
|
|
11000 REM ========== fight ==========
|
|
11010 PRINT "The wraith-hound arrives. It is an abomination! A weapon system that"
|
|
11020 PRINT "nature would never have created unaided. Everything about it is just"
|
|
11030 PRINT "plain wrong on so many levels. One thing is clear, it is designed"
|
|
11035 PRINT "purely for hunting and killing." : PRINT
|
|
11040 INPUT "Do you r[un] or f[ight]?"; I$
|
|
11050 PRINT
|
|
11060 IF LOWER$ ( I$ ) = "f" OR LOWER$ ( I$ ) = "fight" THEN GOTO 11190
|
|
11065 IF LOWER$ ( I$ ) = "r" OR LOWER$ ( I$ ) = "run" THEN GOTO 11070
|
|
11067 PRINT "Command unrecognised, you must fight!" : PRINT : GOTO 11190
|
|
11070 REM run away to a random adjoining room
|
|
11080 DIR = RNDINT(1, 6)
|
|
11090 IF DIR = 1 THEN INDEX = 1
|
|
11100 IF DIR = 2 THEN INDEX = 3
|
|
11110 IF DIR = 3 THEN INDEX = 5
|
|
11120 IF DIR = 4 THEN INDEX = 7
|
|
11130 IF DIR = 5 THEN INDEX = 9
|
|
11140 IF DIR = 6 THEN INDEX = 11
|
|
11150 NPL = VAL ( MID$ ( EX$ ( PL ) , INDEX , 2 ) ) : REM potential next location
|
|
11160 IF NPL = 0 THEN GOTO 11080 : REM can't go that way
|
|
11170 PL = NPL : PRINT "You are in the " ; LO$ ( PL ) : PRINT
|
|
11175 GOSUB 4010
|
|
11180 RETURN
|
|
11190 REM fight
|
|
11200 FEROCITY = 60 : REM ferocity factor for wraith-hound
|
|
11205 STAMINA = 50 : REM your stamina
|
|
11210 IF OL(PULSE) <> INV AND OL(KNIFE) <> INV THEN PRINT "You have no weapons, and must fight bare handed." : PRINT : GOTO 11280
|
|
11220 IF OL(PULSE) = INV AND OL(KNIFE) <> INV THEN PRINT "Luckily, you have a pulse rifle." : PRINT: FEROCITY=50 : GOTO 11280
|
|
11230 IF OL(PULSE) <> INV AND OL(KNIFE) = INV THEN PRINT "You only have a knife with which to fight." : PRINT : FEROCITY = 55 : GOTO 11280
|
|
11240 INPUT "Which weapon do you choose? 1 - Pulse rifle, 2 - Knife: "; WPN
|
|
11245 PRINT
|
|
11250 IF WPN<1 OR WPN>2 THEN GOTO 11240
|
|
11260 IF WPN=1 THEN FEROCITY = 50
|
|
11270 IF WPN=2 THEN FEROCITY = 55
|
|
11280 REM the battle
|
|
11290 IF RND(1)>0.5 THEN PRINT "The wraith-hound attacks!" ELSE PRINT "You attack!"
|
|
11300 PRINT
|
|
11305 GOSUB 11430
|
|
11310 IF RND(1)>0.5 THEN PRINT "You wound the creature." : PRINT: FEROCITY = FEROCITY-5 : GOTO 11330
|
|
11320 PRINT "The wraith-hound wounds you." : PRINT : STAMINA = STAMINA-5
|
|
11330 GOSUB 11430
|
|
11340 IF FEROCITY > 0 THEN GOTO 11390
|
|
11350 PRINT "You slayed the wraith-hound!" : PRINT
|
|
11360 REM remove creature from the game
|
|
11370 WPL = 99 : REM inaccessible location
|
|
11380 RETURN
|
|
11390 IF STAMINA > 0 THEN GOTO 11420
|
|
11400 PRINT "You were slayed by the wraith-hound! You have failed to save the Pneuma." : PRINT
|
|
11410 STOP
|
|
11420 GOTO 11280 : REM next round of the battle
|
|
11430 REM ========== delay loop ==========
|
|
11440 FOR T = 1 TO 80000
|
|
11450 NEXT T
|
|
11460 RETURN
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|