Code archives/Miscellaneous/Neptune's Caverns, Updated and modernized.

This code has been declared by its author to be Public Domain code.

Download source code

Neptune's Caverns, Updated and modernized. by Uhfgood2003
Basically this was as said. What I did was broke up the lines, removed the line numbers, made the variables have readable names, changed some unnamed constants to named ones, removed the goto's and the gosubs. I put it all into functions, then I commented it all and made sure some lines weren't that long on the screen, to keep it all pretty readable. This assumes you can read my code anyways but at least it's better than the original version ;-)

The goal is to work on this on the side, so learn adventure game programming inside and out. I'll start with making a system for the current game, and then make it flexible to base other games off of, finally making the parser more robust, and adding graphics capabilities later on. Should be fun.
; Neptune's Cavern's -- A text adventure listed in
; the book "Write your own program : A database adventure game"
; by Steve Rodgers and Marcus Milton orginally published
; in 1985.  Ported to BlitzBasic in 2003 by Keith Weatherby II
; Version 02 - Time to update it, with functions, removal of
; line numbers and eventually gosubs and goto's

Const ScreenWidth  = 640 ; x res
Const ScreenHeight = 480 ; y res
Const ScreenBpp    = 32  ; bits per pixel
Const ScreenMode   = 2   ; mode 2 is windowed

; room constants
Const WALL_ROOM_01    = 1
Const KNIFE_ROOM      = 2
Const DOOR_ROOM       = 3
Const WALL_ROOM_02    = 4
Const SEAWEED_ROOM    = 5
Const FLIPPER_ROOM    = 6
Const BONEFISH_ROOM   = 7
Const BRIGHT_ROOM     = 8
Const GREEN_CUFF_ROOM = 9
Const SEAHORSE_ROOM   = 10
Const BLUE_CUFF_ROOM  = 11
Const SQUARE_ROOM_01  = 12
Const DJ_CHEST_ROOM   = 13
Const MURKY_ROOM      = 14
Const BONE_ROOM       = 15
Const URCHIN_ROOM     = 16
Const RED_CUFF_ROOM   = 17
Const SQUARE_ROOM_02  = 18
Const HOLE_ROOM       = 19
Const OCTOPUS_ROOM    = 20
Const CABIN_ROOM      = 21
Const SHARK_ROOM      = 22
Const SQUARE_ROOM_03  = 23
Const SQUARE_ROOM_04  = 24

; object constants
Const KNIFE        = 1
Const FLIPPERS     = 2
Const KEY          = 3
Const SEAWEED      = 4
Const BONE         = 5
Const PLUG         = 6
Const YELLOW_CUFFS = 7 
Const GREEN_CUFFS  = 8
Const RED_CUFFS    = 9
Const BLUE_CUFFS   = 10

; misc object constants 
Const OBJECT_GONE = 0
Const CARRYING_OBJECT = 99

; noun index constants
Const N_NONE = 0
Const N_NORTH = 1
Const N_SOUTH = 2
Const N_EAST = 3
Const N_WEST = 4
Const N_DUMMY = 5
Const N_CHEST = 6
Const N_WINDOW = 7
Const N_KNIFE = 8
Const N_FLIPPERS = 9
Const N_KEY = 10
Const N_SEAWEED = 11
Const N_BONE = 12
Const N_PLUG = 13
Const N_HANDCUFFS = 14

; Verb Index constants
Const V_NONE      = 0
Const V_GO        = 1
Const V_GET       = 2
Const V_DROP      = 3
Const V_CUT       = 4
Const V_WEAR      = 5
Const V_GIVE      = 6
Const V_UNLOCK    = 7
Const V_USE       = 8 
Const V_INVENTORY = 9
Const V_HELP      = 10
Const V_LOOK      = 11
Const V_QUIT      = 12

Global NumNouns     = 14        ; number of nouns
Global NumVerbs     = 12        ; number of verbs
Global CharPosition = DOOR_ROOM ; character position (room)
Global NumInvItems  = 1         ; number of inventory items
Global NumCuffs     = 0         ; number of handcuffs
Global WinFlag      = False     ; Win flag
Global LostFlag     = False     ; Lost Flag
Global UnlockFlag   = False     ; Unlock Flag
Global FlippersFlag = False     ; Flipper Flag
Global CutFlag      = False     ; Cut Flag
Global VerbIndex    = V_NONE     ; Verb index
Global NounIndex    = N_NONE     ; Noun Index
Global NewGameFlag  = False     ; start a new game?
Global ExitFlag     = False     ; end current game?

Dim DataOne$( 24 )          ; Room description part 1
Dim DataTwo$( 24 )          ; room description part 2
Dim Exits( 24, 4 )          ; Exits
Dim NounName$( NumNouns )   ; Noun descriptions
Dim VerbName$( NumVerbs )   ; Verb Descriptions
Dim ObjectName$( 10 )       ; Object Descriptions
Dim ObjectList( 10 )        ; Object index

; Init graphics mode
Graphics ScreenWidth, ScreenHeight, ScreenBpp, ScreenMode

	; main loop, keep executing, until the
	; exit flag is encountered.
	While( ExitFlag = False )

		; If we're not in a new game
		; Then initialize it, and execute
		If NewGameFlag = False
			NewGameFlag = True
			Initialize()
			Look()
		End If

		; accept text
		GameInput()
		
		; sort responses into verb/noun and execute
		Sort()
		
		; Win or lose the game will end
		If WinFlag  = True Then EndGame() 
		If LostFlag = True Then EndGame()
		
	Wend ; end while exit flag is false

End ; end main program

; ************* INPUT      *************
Function GameInput()

	; we use element 0 as a temp
	; make sure to clear everything
	; out for this particular time.
	VerbName$( V_NONE ) = "" 
	NounName$( N_NONE ) = ""
	Response$ = ""
	
	; prompt user, and make sure the response is
	; in all capital letters, as I check against
	; caps
	Response$ = Input( "What do you do next? " ) 
	Response$ = Upper$( Response$ )
	
	; clear the screen to 
	; make things a bit more tidy
	; then reset cursor to the first
	; position
	Cls 
	Locate( 0, 0 )
	
	; run through each character of response
	For StringPos = 1 To Len( Response$ )
		
		; Check for space, then extract.
		If Mid$( Response$, StringPos, 1 ) = " " Then 
		
			; extract the verb from first 3 characters
			; and then put it into temporary string
			VerbName$( V_NONE ) = Left$( Response$, 3 )
			
			; Start from after the space and grab the next
			; 3 characters and put it into temp noun string 
			NounName$( N_NONE ) = Mid$( Response$, StringPos + 1, 3 ) 
			
			; jump to the end of the loop
			; to disreguard any other characters
			StringPos = Len( Response$ )
		
		End If ; space
		
	Next ; for string pos
	
	; jump ship if there is a noun
	If NounName$( N_NONE ) <> "" Then Return
	
	; get the first 3 letters
	Response$ = Left$( Response$, 3 ) 
	
	; check for exit
	If Response$ = "QUI" Then 
	
		ExitFlag = True
		Return
	
	End If
	
	; If any of these are directions, then
	; automatically make the verb "go" and
	; make the noun the direction 
	;
	;;;;;;;;;;;;;;;
	;
	; Since the "If Response" line was too
	; long I decided to split it up for each
	; part, that's why each piece has pretty
	; much the same code.	
	
	If Response$ = "NOR" Then 
	
		VerbName$( V_NONE ) = "GO " 
		NounName$( N_NONE ) = Response$ 
		Return
	
	End If

	If Response$ = "SOU" Then 
	
		VerbName$( V_NONE ) = "GO " 
		NounName$( N_NONE ) = Response$ 
		Return
	
	End If

	If Response$ = "EAS" Then 
	
		VerbName$( V_NONE ) = "GO " 
		NounName$( N_NONE ) = Response$ 
		Return
	
	End If

	If Response$ = "WES" Then 
	
		VerbName$( V_NONE ) = "GO " 
		NounName$( N_NONE ) = Response$ 
		Return
	
	End If
	
	; if any of these are general actions then
	; put a dummy noun in temp noun string and
	; put the action in the verb temp string
	;
	;;;;;;;
	;
	; Did the same here as with the direction verbs
	
	If Response$ = "HEL" Then 
	
		NounName$( N_NONE ) = "DOO" 
		VerbName$( V_NONE ) = Response$ 
		Return
	
	End If

	If Response$ = "INV" Then 
	
		NounName$( N_NONE ) = "DOO" 
		VerbName$( V_NONE ) = Response$ 
		Return
	
	End If

	If Response$ = "LOO" Then 
	
		NounName$( N_NONE ) = "DOO" 
		VerbName$( V_NONE ) = Response$ 
		Return
	
	End If

	If Response$ = "QUI" Then 
	
		NounName$( N_NONE ) = "DOO" 
		VerbName$( V_NONE ) = Response$ 
		Return
	
	End If
	
	; otherwise the parser can't understand it.
	Print "I don't understand your words. "

End Function ; input

; ************* SORT         *************
Function Sort()

	; make sure the indices are reset
	VerbIndex = V_NONE
	NounIndex = N_NONE


	; run through each of the verbs in the list
	For VerbCount = 1 To NumVerbs
	
		; if the temp verb string is equal to any of the
		; verbs in the list (via first 3 letters) then...
		VStr$ = Left$( VerbName$( VerbCount ), 3 )
		If VerbName$( V_NONE ) = VStr$ Then 
			
			; set the verb index to the current count
			VerbIndex = VerbCount
			
			; jump to end of loop by making
			; count the equal to the number of verbs 
			VerbCount = NumVerbs
		
		End If ; verb is in list
		
	Next ; verb count
	
	; run through each of the nouns in the list
	For NounCount = 1 To NumNouns

		; if the temp noun string is equal to any of the
		; nouns in the list then...
		If NounName$( N_NONE ) = NounName$( NounCount ) Then 
		
			; set the noun index to the current count
			NounIndex = NounCount 

			; jump to end of loop by making noun
			; count the equal to the number of nouns 
			NounCount = NumNouns
		
		End If ; noun in list
	
	Next ; noun count
	
	; neither noun or verb is in list
	If NounIndex = N_NONE Or VerbIndex = V_NONE Then 
		
		; state words are unknown
		Print "Say what?" 
		Return
		
	End If ; noun or verb isn't in list
	
	; So if everything is a go
	; then based on the current
	; verb, execute one of the
	; game functions.
	Select VerbIndex 
	
		Case 1  Go()         ; make a move to one of the exits         
		Case 2  GameGet()    ; get all items    
		Case 3  GameDrop()   ; drop the plug   
		Case 4  GameCut()    ; cut the seaweed   
		Case 5  GameWear()   ; wear the flippers   
		Case 6  GameGive()   ; allows you to give bone and seaweed   
		Case 7  GameUnlock() ; This unlocks the chest in the game
		Case 8  GameUse()    ; use an item in general   
		Case 9  Inventory()  ; display the items you have   
		Case 10 GameHelp()   ; display key words   
		Case 11 Look()       ; show room description
	
	End Select ; verb index

End Function ; sort

; ************* GO           *************
; move to different rooms
Function Go() 

	; If one of the nouns but
	; not one of the four directions
	If NounIndex > N_WEST Then 
	
		; print a message
		Print "Go where?" 
		Return
		
	End If ; noun index > 4
	
	; If there's not an exit in the room
	If Exits( CharPosition, NounIndex ) = 0 Then 
	
		; print as such
		Print "No Exit That Way" 
		Return
	
	End If ; no exit

	; if we're in the sea urchin room and you're not
	; wearing any flippers, and then you manage to move
	; in two of the directions, then you lose (ie die)	
	If CharPosition = URCHIN_ROOM 
	
		; trying to move in urchin room
		If( NounIndex = N_NORTH Or NounIndex = N_WEST ) 
		
			If FlippersFlag = False Then 

				; means we lost 
				LostFlag = True 
				Return

			End If ; flippers not on
			
		End If ; if we're going north or west
		
	End If ; in urchin room
	
	; update the new character position (room) 
	; based on what direction we just went to.
	CharPosition = Exits( CharPosition, NounIndex ) 
	
	; let's see the description now
	Look()
	
	Return

End Function ; Go

; ************* GET          *************
; grabs any of the 10 items you can get
Function GameGet()

	; If we're in the room with the chest
	; and someone tries to pick it up, then
	If NounIndex = N_CHEST 
	
		; Davy Jones' Locker
		If CharPosition = DJ_CHEST_ROOM Then 
	
			; tell them it's heavy, or print
			; something equally witty.
			Print "It's too heavy!" 
			Return
		
		End If ; Chest room
		
	End If ; D.J.'s Locker
	
	; If they try to pick up items that
	; can't be picked up...
	If NounIndex < N_KNIFE Then 
	
		; print a message about their
		; appearent stupidity.
		Print "Don't be Silly" 
		Return
	
	End If ; item isn't grabable
	
	; If you already have the item, and the item
	; isn't handcuffs, then
	If ObjectList( NounIndex - 7 ) = CARRYING_OBJECT 
	
		; hand cuffs
		If NounName$( N_NONE ) <> "HAN" Then 
	
			; state a message that you already have it
			Print "You've already got it!" 
			Return
		
		End If ; handcuffs
		
	End If ; if you already have the item
	
	; run through the cuffs	
	For ObjectIndex = YELLOW_CUFFS To BLUE_CUFFS
		
		; If player is trying to pick up handcuffs
		; while in the room with handcuffs then
		If ObjectList( ObjectIndex ) = CharPosition 
		
			; if the word is handcuffs
			If NounIndex = N_HANDCUFFS Then 
			
				; bump up the noun index to the next
				; position (next pair of handcuffs)
				NounIndex = ObjectIndex + 7 
				
				; increase amount of cuffs
				NumCuffs = NumCuffs + 1  
				
				; jump to the end of the loop
				ObjectIndex = 10
			
			End If ; cuffs
			
		End If ; trying to pick up hand cuffs
		
	Next ; run through cuffs
	
	; If any objects other than cuffs are being picked up
	If ObjectList( NounIndex - 7 ) = CharPosition Then 
	
		; confirmation message
		Print "O.K." 
		
		; make sure the object is set to carried
		ObjectList( NounIndex - 7 ) = CARRYING_OBJECT 
		
		; increase number of inventory items
		NumInvItems = NumInvItems + 1 
		Return
		
	End If ; objects being picked up
	
	; else you can't pick it up
	Print "It isn't here!" 

	Return

End Function ; GameGet

; ************* DROP         *************
Function GameDrop()

	; if you try to drop an item
	; that can't be dropped, then
	If NounIndex < N_KNIFE Then 
	
		; print a message about
		; the mental faculties of
		; the player
		Print "Don't be silly" 
		Return
	End If
	
	; if the item is a cuff
	For ObjectIndex = YELLOW_CUFFS To BLUE_CUFFS
	
		; and you have the item in your possesion
		If ObjectList( ObjectIndex ) = CARRYING_OBJECT 
		
			; what's the word?
			If NounIndex = N_HANDCUFFS Then 
		
				; take it out of your inventory
				NounIndex = ObjectIndex + 7 
				
				; remove number of cuffs owned
				NumCuffs = NumCuffs - 1 
				
				; drop to end of the loop
				ObjectIndex = 10
			
			End If ; noun is handcuffs
			
		End If ; have cuffs
		
	Next ; cuff items
	
	; If you don't have the item to drop then
	If ObjectList( NounIndex - 7 ) <> CARRYING_OBJECT Then
	
		; remind the player that they
		; need some therapy for dropping
		; objects they don't have 
		Print "You haven't got it!" 
		Return
		
	End If ; don't have an item to drop
	
	; otherwise acknowledge item drop
	Print "O.K." 
	
	; update item position (room )
	ObjectList( NounIndex - 7 ) = CharPosition 
	
	; decrease number of inventory items
	NumInvItems = NumInvItems - 1
	
	; If we drop the plug in the room with the drain
	; then yay! we win!
	If CharPosition = HOLE_ROOM 
		
		; the word is plugged
		If NounIndex = N_PLUG WinFlag = True
	
	End If ; hole room
	
	Return

End Function ; GameDrop

; ************* CUT          *************
Function GameCut()

	; If you don't have the knife
	If ObjectList( KNIFE ) <> CARRYING_OBJECT Then
	
		; remind the player an invisible knife
		; is as sharp as their wit 
		Print "You've nothing sharp enough!" 
		Return
		
	End If ; don't have knife
	
	; If you're trying to cut anything
	; other than the sea weed
	If NounIndex <> N_SEAWEED Then 
	
		; tell the player they can't cut it
		; and should give up right now.
		Print "You can't cut that!" 
		Return
	
	End If ; cutting anything other than seaweed
	
	; If you're in any other room
	; than the sea weed room..
	If CharPosition <> SEAWEED_ROOM Then 
	
		; you can't really do it
		Print "You can't do that" 
		Return
		
	End If ; not sea weed room
	
	; If you've cut it already	
	If CutFlag = True Then 
	
		; tell them no use in cutting the
		; cheese err, uhh, seaweed again
		Print "You've already done that!" 
		Return
		
	End If ; already cut
	
	; then all tests have passed, you may proceed
	; mighty adventurer and warrior!
	Print "The seaweed falls away to reveal an open window."
	
	; sea weed is now in the floor
	ObjectList( SEAWEED ) = SEAWEED_ROOM 
	
	; just made a new exit
	Exits( 5, 2 ) = BLUE_CUFF_ROOM
	
	; make sure they know they can't cut it again 
	CutFlag = True
	
	; change the description to reflect an open window.
	TempData$ = Left$( DataTwo$( SEAWEED_ROOM ), 9 )
	DataTwo$( SEAWEED_ROOM ) = TempData$ + "an open window in it" 
	Return 

End Function ; GameCut

; ************* WEAR         *************
; wear the flippers
Function GameWear()

	; If the player is wearing them and
	; tries to put them on again then
	If FlippersFlag = True 
	
		; is the word flippers?
		If NounName$( N_NONE ) = "FLI" Then 
	
			; again point to their mental stability
			Print "You've already got them on!" 
			Return
	
		End If ; the word is flippers
		
	End If ; flippers on
	
	; If you have the flippers and you wear them
	If ObjectList( FLIPPERS ) = CARRYING_OBJECT 
	
		; The word is?
		If NounName$( N_NONE ) = "FLI" Then 
		
			; yay, we have them on
			FlippersFlag = True 
			
			; now we're no longer carrying them
			ObjectList( FLIPPERS ) = OBJECT_GONE 
			
			; congratulate them on their cunning
			; use of manual dexterity
			Print "They fit nicely!" 
			Return
		
		End If ; flippers yay!
		
	End If ; have flippers, put them on
	
	; If they're trying to put on some cuffs
	If NounIndex = N_HANDCUFFS 
	
		; we have more than - cuffs?
		If NumCuffs > 0 Then
	
			; Then smack them upside the head
			; for wanting to do such a thing. 
			Print "That's really silly!" 
			Return
		
		End If ; yes, but you tried to put them on
		
	End If ; noun is handcuffs
	
	; if all else fails, then tell
	; them they can't fit into that size 6
	Print "You can't wear that!" 
	Return

End Function ; wear

; ************* GIVE         *************
; well gee i wonder what this could be...
; this is for the seaweed and the bone
Function GameGive()

	; if we're in the sea horsey room and we
	; try to give them some seaweed
	If CharPosition = SEAHORSE_ROOM 
	
		; is the word? seaweed this time
		If NounIndex = N_SEAWEED Then
		
			; if we haven't got the seaweed
			If ObjectList( SEAWEED ) <> CARRYING_OBJECT Then 
			
				; sic the seahorses on them!
				Print "You haven't got it" 
				Return
			
			End If ; haven't got seaweed
		
			; otherwise all is well and good
	        
			; no longer have the seaweed
			ObjectList( SEAWEED ) = OBJECT_GONE
			
			; now there's a key
			ObjectList( KEY ) = SEAHORSE_ROOM
			
			; clue them in
			Print "Something glints in the corner" 
			Return
	
		End If ; seaweed's the word
		
	End If ; sea horse room
	
	; If we're in the bone fish room and we try to give
	If CharPosition = BONEFISH_ROOM 
	
		; I have a bone (noun) to pick with you
		If NounIndex = N_BONE Then 

			; Do we have the object?
			If ObjectList( BONE ) <> CARRYING_OBJECT Then 
			
				; no then point to the player
				; and make the "loco" motion
				Print "You haven't got it" 
				Return
			
			End If ; have the bone
			
			; okay well everything looks in order
			
			; no longer carrying the bone
			ObjectList( BONE ) = OBJECT_GONE 
			
			; a new exit emerges
			Exits( 7, 2 ) = DJ_CHEST_ROOM
			
			; let the player know he's not losing his mind
			Print "The Fish snatches the bone and retires to a corner"
			
			; reset the room description for the bonefish room
			D1$ = "You are in a cavern. In the corner"
			D2$ = "a Bonefish is chewing a thigh-bone" 
			
			; split up for readability.
			DataOne$( BONEFISH_ROOM ) = D1$
			DataTwo$( BONEFISH_ROOM ) = D2$
			
			Return
	
		End If ; them bones...
		
	End If ; have bone will travel
	
	; if we're facing the octopus
	If CharPosition = OCTOPUS_ROOM Then 
	
		; you can't give anything to an octopus
		; especially when it involves binding him
		; with rainbow colored handcuffs
		Print "That won't do any good!" 
		Return
	
	End If ; octopus room
	
	; there you are trying to give
	; objects to imaginary people again
	Print "Give it to whom?" 
	Return

End Function ; give

; ************* UNLOCK       *************
; Unlock Davy Jones' Locker
Function GameUnlock()

	; If you don't have the key
	If ObjectList( KEY ) <> CARRYING_OBJECT Then
	
		; tell them to jimmy the lock with
		; the knife, of course that won't
		; work but maybe this will convince
		; them that they are crazy. 
		Print "You haven't even got a key!" 
		Return
	
	End If ; no key
	
	; okay so you have the key, but guess what, you
	; have no place to put that key... 
	If NounIndex = N_DUMMY
	
		; are we in that door room?
		If CharPosition = DOOR_ROOM Then 
		
			; ask the player where they're trying to put that?
			Print "There isn't even a keyhole!" 
			Return
		
		End If ; door room

		; or the otherside?
		If CharPosition = GREEN_CUFF_ROOM Then 
		
			; ask the player where they're trying to put that?
			Print "This is the otherside of the keyless door." 
			Print "DUH!!"
			Return
		
		End If ; green cuff room
		
	End If ; right object, wrong key
	
	; if you're not in the room with the chest
	If CharPosition <> DJ_CHEST_ROOM Then 
	
		; tell them the should know better
		; than to try other things than
		; unlocking...
		Print "I don't see a lock anywhere, do you?" 
		Return
	
	End If ; not chest room, or not trying to unlock

	; trying to key something else?
	; maybe a car? but we're underwater
	If NounIndex <> N_CHEST Then 
	
		; tell them the should know better
		; than to try other things than
		; unlocking...
		Print "Uhh, trying to key something else?"
		Print "Can we say 'childish'?" 
		Return
	
	End If ; not chest room, or not trying to unlock
	
	; well if it is unlocked then
	If UnlockFlag = True Then 
	
		; tell them "YOU JUST DID IT YOU IDIOT!"
		Print "It's already unlocked!" 
		Return
	
	End If ; unlocked
	
	; okay well we're in the right room
	; the chest is here, and locked, and
	; we have a key to open it
	
	; unlock the chest
	UnlockFlag = True
	
	; put the handcuffs in there 
	ObjectList( YELLOW_CUFFS ) = DJ_CHEST_ROOM
	
	; tell them they done the right thing 
	Print "The key turns easily"
	
	; make sure the description reflects the fact that is just
	; an empty chest now.
	D1$ = "You are in a room with an open chest in the middle."
	D2$ = ""
	
	; split for comfort
	DataOne$( DJ_CHEST_ROOM ) = D1$
	DataTwo$( DJ_CHEST_ROOM ) = D2$
	
	Return

End Function ; unlock

; ************* USE          *************
; well we can only use the handcuffs.
Function GameUse()

	; not in the octopus room?
	If CharPosition <> OCTOPUS_ROOM Then 
	
		; anyone can plainly see you can't
		; use anything in this game except
		; rainbow colored handcuffs
		Print "You can't do that here" 
		Return
	
	End If ; not in octopus room

	; not using handcuffs?
	If NounIndex <> N_HANDCUFFS Then 
	
		; anyone can plainly see you can't
		; use anything in this game except
		; rainbow colored handcuffs
		Print "You want to do what?" 
		Return
	
	End If ; or have any hand cuffs
	
	; don't have enough hand cuffs?
	If NumCuffs < 4 Then 
	
		; then the octopus will eat you
		Print "You haven't got enough pairs!" 
		Return
	
	End If ; not enough cuffs
	
	; all is well, show the octopus' discomfort and know
	; that animal rights activists will be up in arms	
	Print "Now the octopus can't move.  He doesn't amused "
	Print "at these nasty turn of events.  Handcuffs! Pfft!" 
	
	; we no longer have cuffs
	For ObjectIndex =  YELLOW_CUFFS To BLUE_CUFFS
	 
		ObjectList( ObjectIndex ) = OBJECT_GONE 
	
	Next ; no cuffs
	
	; no cuffs here
	NumCuffs = 0 
	
	; we have a new exit
	Exits( 20, 4 ) = HOLE_ROOM
	
	; reflect the current state of affairs, and realize
	; that octopus could pull you apart if he wasn't bound
	D1$ = "You are in a corridor with a current going west "
	D2$ = "A colorful, handcuffed octopus sits sulking."
	DataOne$( OCTOPUS_ROOM ) = D1$
	DataTwo$( OCTOPUS_ROOM ) = D2$
	 
	Return

End Function ; Use

; ************* INVENTORY    *************
; show inventory
Function Inventory()

	; display the contents of your knapsack
	Print 
	Print "You are carrying : "
	
	; I guess we don't have anything 
	If NumInvItems = 0 Then
	
		; what a revalation 
		Print "Nothing!" 
		Return
	
	End If ; no items
	

	; if we got 'em flaunt 'em	
	For ObjectIndex = 1 To 10
		
		If ObjectList( ObjectIndex ) = CARRYING_OBJECT Then 
			Print "A " + ObjectName$( ObjectIndex )
		End If
		
	Next ; for objects
	 
	Return

End Function ; inventory

; ************* HELP         *************
; display help for those sissy's who can't
; cut it on their own.
Function GameHelp()

	Print 
	Print "These are the verbs you may use : " 
	
	; go through each verb
	For VerbCount = 1 To NumVerbs 
	
		; Display them.  Better than the neverending story!
		Print VerbName$( VerbCount ) 
	Next
	
	Print 
	Print "(You need only type the first three letters)" 
	
	Return

End Function ; help

; ************* LOOK         *************
; show the room
Function Look()

	; display room descriptions
	Print 
	Print DataOne$( CharPosition ) 
	Print DataTwo$( CharPosition ) 
	
	; If we're in the shark room then
	If CharPosition = SHARK_ROOM Then 
	
		; we're most likely dead
		LostFlag = True  
		Return
	
	End If ; shark room
	
	; run through each object
	For ObjectIndex = 1 To 10
		
		; as long as we're not in the sea weed window room
		; or the bones of long dead explorers room then...
		If ObjectIndex <> BONE Or CharPosition <> BONE_ROOM
		
			; display the object in that room
			If ObjectList( ObjectIndex ) = CharPosition Then
			
				; yep print it 
				Print "A " + ObjectName$( ObjectIndex ) + " is here"
			
			End If ; object in room
		
		End If ; not seaweed or bone room
		
	Next ; each object
	
	; Display exits if it's there.	
	Print 
	Print "Exits : "
	If Exits( CharPosition, 1 ) > 0 Then Print "North  " 
	If Exits( CharPosition, 2 ) > 0 Then Print "South  "
	If Exits( CharPosition, 3 ) > 0 Then Print "East   "
	If Exits( CharPosition, 4 ) > 0 Then Print "West   "
	Print 
	Print 
	Return

End Function ; Looky loo

; ************* INITIALIZE   *************
Function Initialize()
	
	; clear screen, make sure to point at
	; beginning of the data.
	Cls 
	Locate( 0, 0 ) 
	Restore GameData
	
	; Display title screen
	Print "Neptune's Caverns"
	Print "You have found the magic plug that"
	Print "belongs at the bottom of the sea and"
	Print "decide to replace it before the water"
	Print "drains away.  With your scuba gear you"
	Print "dive into the ocean and begin your "
	Print "adventure..."
	Print
	Print "(If you need assistance type HELP)"
		
	; init variables
	NumNouns     = 14        ; number of nouns
	NumVerbs     = 12        ; number of verbs
	CharPosition = DOOR_ROOM ; character position (room)
	NumInvItems  = 1         ; number of inventory items
	NumCuffs     = 0         ; number of handcuffs
	WinFlag      = False     ; Win flag
	LostFlag     = False     ; Lost Flag
	UnlockFlag   = False     ; Unlock Flag
	FlippersFlag = False     ; Flipper Flag
	CutFlag      = False     ; Cut Flag
	VerbIndex    = V_NONE         ; Verb index
	NounIndex    = N_NONE         ; Noun Index

	; read room descriptions into string array
	For RoomIndex = 1 To 24
	

		; description 1 in data one, 
		; and description 2 in data 2
		; using element 0 as a temp
		Read DataOne$( 0 )
		Read DataTwo$( 0 )
						
		; dump temp data into 20 rooms 
		DataOne$( RoomIndex ) = DataOne$( 0 ) 
		DataTwo$( RoomIndex ) = DataTwo$( 0 )

		; I've decided to give rooms 17, 18, 
		; 23, 24 their own data. instead of
		; sharing room 12's specifically.
	
		; run through each exit
		For ExitNum = 1 To 4 
			
			; read exit data
			Read Exits( RoomIndex, ExitNum ) 
			
		Next ; exits 
		
	Next ; rooms
	
	; run through each object
	For ObjectIndex = 1 To 10
	
		; read the names into the name array 
		Read ObjectName$( ObjectIndex )
		
		; read the actual object numbers
		; into the object list.
		Read ObjectList( ObjectIndex ) 
	
	Next ; each object
	
	; run through each noun
	For NounCount = 1 To NumNouns 
		
		; read description
		Read NounName$( NounCount ) 
		
	Next ; nouns
	
	; run through each verb
	For VerbCount = 1 To NumVerbs 
	
		; verb descriptions for help
		Read VerbName$( VerbCount ) 
		
	Next ; verbs
	
	Return 

End Function ; initialize

; ************* END GAME     *************
; guess what... this is the end of the game
; we get to tell the player how they royally
; screwed up, or successfully completed the
; task.
Function EndGame()

	; display results
	
	If CharPosition = SHARK_ROOM Then ; Shark bait buddy
		
		Print "With a snap, the shark bites off your head " 
		Print
		Print
		
	Else If CharPosition = URCHIN_ROOM Then ; urchin's of doom
		
		Print "You have stepped on a poisonous sea-urchin"
		Print "You die a horrible death." 
		Print
		Print
		
	Else
		
		; I guess we plugged up that drain
		Print "With a 'THUNK' the plug drops into the "
		Print "hole and the swirling waters grow still"
		Print "Congratulations! You saved the seas! " 
		Print
		Print
		
	End If ; win or lost
	
	; Want to try this again?
	Response$ = Upper( Input$( "Do you wish to play again? " ) )
	
	; yes?
	If Left$( Response$, 1 ) = "Y" Then 
	
		; reset everything
		NewGameFlag = False
	
	Else ; no
	
		; let's get out of here!
		ExitFlag = True
	
	End If ; play again
		
	Return

End Function ; end game

; the rest is the actual game data
.GameData
; ************* DESCRIPTIONS *************
; First lines are first descriptions, then
; second descriptions, then exits. 

	Data "You are on the seabed.  The way west is "
	Data "blocked by a high coral reef."
	Data 0, 0, 2, 0 
	
	Data "You are on the seabed.  To the south a "
	Data "barnacled wall towers above you."
	Data 0, 0, 3, 1 
	
	Data "You are in front of a wooden door.  You "
	Data "can see no handle."
	Data 0, 0, 4, 2 
	
	Data "You are on the seabed.  To the south a "
	Data "barnacled wall towers above you."
	Data 0, 0, 5, 3
	
	Data "You are on the seabed.  To the south a barnacled "
	Data "wall has a square patch of seaweed growing on it."
	Data 0, 0, 6, 4 
	
	Data "You are on the seabed.  To the south is a "
	Data "barnacled wall.  A cliff blocks the way east."
	Data 0, 0, 0, 5 
	
	Data "You are in a long, low cavern.  At the far "
	Data "end a large bonefish is swimming around."
	Data 0, 0, 8, 0 
	
	Data "You are in a brightly lit chamber.  The walls, "
	Data "floor, and room grlow in shimmering light."
	Data 0, 14, 0, 7

	Data "You are in a dimly lit cavern with a huge "
	Data "door at the far end.  You can see no handle."
	Data 0, 15, 0, 0 
	
	Data "You are in a room full of hungry seahorses. "
	Data "They nuzzle your hand in a friendly manner."
	Data 0, 16, 0, 0 
	
	Data "You are in a small room.  The north wall has a small "
	Data "window in it through which you can see the seabed"
	Data 5, 17, 12, 0 
	
	Data "You are in an amazingly square room.  The walls, "
	Data "floor and room are all square as are all the exits. "
	Data 0, 18, 0, 11
	
	Data "You are in a tiny little room that is occupied "
	Data "by a chest inscribed with the initials D.J."
	Data 7, 0, 0, 0 
	
	Data "You are in a cold, murky room.  Grey mud swirls "
	Data "around you and you feel a faint current to the east."
	Data 8, 0, 15, 0 
	
	Data "You are in a gloomy and eerie place.  All around "
	Data "you are the bones of long dead explorers!"
	Data 9, 21, 16, 14 
	
	Data "You are in a square room.   The south exit has the words 'Do not enter!'"
	Data "above it.  The north and west doorways are crawling with sea urchins."
	Data 10, 22, 17, 15
	
	Data "You are in an amazingly square room.  You know there "
	Data "may be other square rooms all as exciting as this one."
	Data 11, 23, 18, 16 
	
	Data "Wow, it's amazingly square i've never seen this "
	Data "before... I bet the exits are squre too... yep."
	Data 12, 24, 0, 17 
	
	Data "You are in a circular room with a very strong current that "
	Data "swirls around the room and down a hole in the floor."
	Data 0, 0, 20, 0 
	
	Data "You are in a corridor with a strong current going west.  Your way "
	Data "is blocked by tthe arms of a large rainbow colored octopus."
	Data 0, 0, 21, 0
	
	Data "You're in a shipwrecked captain's cabin. "
	Data "You feel the flow of water to the west."
	Data 15, 0, 0, 20 
	
	Data "You see a rush of swirling water and "
	Data "face the jaws of a great white shark."
	Data 0, 0, 0, 0 
	
	Data "Square rooms never cease to amaze me.  I could die "
	Data "and go to heaven if I ever see another in my life."
	Data 17, 0, 24, 0 
	
	Data "This square room looks like any other squre room."
	Data "You know, square walls, floor, and exits as well."
	Data 18, 0, 0, 23

; ************* OBJECTS      *************
	Data "KNIFE", 2
	Data "PAIR OF FLIPPERS", 6
	Data "KEY", 0
	Data "CLUMP OF SEAWEED", 0
	Data "ROTTEN OLD BONE", 15
	Data "MAGIC PLUG", 99
	Data "YELLOW PAIR OF HANDCUFFS", 0
	Data "GREEN PAIR OF HANDCUFFS", 9
	Data "RED PAIR OF HANDCUFFS", 17
	Data "BLUE PAIR OF HANDCUFFS", 11

; ** NOUNS ** ;
	Data "NOR"
	Data "SOU"
	Data "EAS"
	Data "WES"
	Data "DOO"
	Data "CHE"
	Data "WIN"
	Data "KNI"
	Data "FLI"
	Data "KEY"
	Data "SEA"
	Data "BON"
	Data "PLU"
	Data "HAN"

; ** VERBS ** ;
	Data "GO "
	Data "GET"
	Data "DROP"
	Data "CUT"
	Data "WEAR"
	Data "GIVE"
	Data "UNLOCK"
	Data "USE"
	Data "INVENTORY"
	Data "HELP"
	Data "LOOK"
	Data "QUIT"

Comments

None.

Code Archives Forum