# Cloak of Darkness tutorial source code # name Cloak of Darkness version Tutorial.1.0 author Mike Arnautov date 24 Feb 2024 style 12 #---------------------------------------------------------------------- text YOU.ARRIVE The Cloak of Darkness Hurrying through the rain-swept November night, you're glad to see the bright lights of the Opera House. It's surprising that there aren't more people about but, hey, what do you expect in a cheap demo game...? #---------------------------------------------------------------------- # Game specification mandates just the four cardinal directions verb NORTH verb EAST verb SOUTH verb WEST # verb GET, TAKE # Both the player and game code can use these interchangeably verb INVENTORY verb DROP verb READ # For reading the message in the bar room verb HANG # To hang the cloak on the hook verb LOOK verb QUIT # Not in the spec, but every game should allow quitting # noise THE, THAT, VELVET, GO # Player command words to be ignored #---------------------------------------------------------------------- object HOOK %A small brass hook is screwed to one wall. &It is just a small brass hook[/ with a cloak hanging on it]. #---------------------------------------------------------------------- object CLOAK A velvet cloak[ (worn)/] %A black velvet cloak [/lies on the floor/hangs on the hook]. &It is a handsome cloak, of velvet trimmed with satin, and slightly spattered with raindrops. Its blackness is so deep that it almost seems to suck light from the room. #---------------------------------------------------------------------- object MESSAGE The message[ has been carelessly trampled, making it difficult to read. You can just distinguish the words/, neatly marked in the sawdust, reads]... +YOU HAVE [LOST/WON] !!! #---------------------------------------------------------------------- place FOYER You are standing in a spacious hall, splendidly decorated in red and gold, with glittering chandeliers overhead. The entrance from the street is to the north, and there are doorways south and west. place CLOAKROOM The walls of this small room were clearly once lined with hooks, though now only one remains. The exit is a door to the east. place BAR [It is too dark here to see anything!/The bar, much rougher than you'd have guessed after the opulence of the foyer to the north, is completely empty. A message is scratched in the sawdust on the floor.] #---------------------------------------------------------------------- init goto foyer # Move the player to the start location apport cloak, inhand # Give him the cloak apport hook, cloakroom # Put the hook where it belongs set message, 4 # Limits the number of moves in the bar say you.arrive #---------------------------------------------------------------------- repeat ifflag status, moved # Has the player moved? call describe.here # If so describe their new location fin #---------------------------------------------------------------------- flags variable MOVED # Optional STATUS variable flag, maintained by the kernel #---------------------------------------------------------------------- proc DESCRIBE.HERE local optr # Local pointer to objects say here # show description of current location itobj optr, here # Loop through objects at this location say optr # Show such objects fin # Loop terminator #---------------------------------------------------------------------- repeat set status, no.amatch # Suppress approximate matching of command words input # Get player's next command ifeq status, 2 and iflt arg2, 0 # Can't find 2nd command word in the vocabulary or iflt arg1, 0 # Can't find 1st command word in the vocabulary quip "Pardon?" # Command parse failure -- abort the main loop fin #---------------------------------------------------------------------- repeat ifkey quit # If the word QUIT occurs in the command say "As you wish." stop # Exit the game fin call here # Execute code, if any, associated with this location respond north, east, south, west, "There is no such exit here." call arg1 # Handle player command call bail.out # Command not handled - report an error #---------------------------------------------------------------------- proc bail.out local qualifier # Local varaible initialised to zero ifeq status, 1 # If a single word command given ifflag arg1, object # If that word is an object name ifnear arg1 else quip "There is no # here!", arg1 fin else set qualifier, 1 # The word is not an object name, assume verb fin quip "You need to say what you want to [do with the /]{arg1}.", qualifier fin quip "You can't do that!" # Generic no can do #---------------------------------------------------------------------- at foyer move south, bar move west, cloakroom respond north "You've only just arrived, and besides, the weather outside seems to be getting worse." #---------------------------------------------------------------------- at cloakroom move east, foyer at bar move north, foyer ifloc cloak, cloakroom else # The cloak is not in the cloakroom sub message, 1 # Count attempted actions in the dark quip "Blundering around in the dark isn't a good idea!" fin #---------------------------------------------------------------------- action inventory local optr # Local variable which will be used as a pointer to objects local count # Counts listed objects, automatically initialised to zero itobj optr, inhand # Loop through objects in player's inventory say optr # Show object's description add count, 1 # Increment count of listed objects fin ifeq count, 0 # If nothing listed, ... say "You are not carrying anything." # ... say empty-handed fin quit # Command fully handled, so terminate the REPEAT loop #---------------------------------------------------------------------- action take inventory call inventory # Execute code associated with the INVENTORY command #---------------------------------------------------------------------- action take cloak ifhere cloak # If cloak is at this location get cloak set cloak, 1 # The cloak is now carried set bar, 0 # and the bar is now dark quip "You [/pick/take] the cloak[/ up/ off the hook].", cloak fin #---------------------------------------------------------------------- action drop cloak ifhave cloak # True only if the player has the cloak ifat cloakroom # True only if player is at cloakroom drop cloak # Move the cloak from player's inventory to cloakroom set cloak, 1 # It is now lying on the floor set bar, 1 # The bar is now lit quip "You drop the cloak." fin quip "This is not a good place to leave your cloak." fin #---------------------------------------------------------------------- action hang cloak ifnear cloak ifat cloakroom # True only if the player is at the cloakroom ifeq cloak, 2 # Already hanging -- nothing to do quip "It is already hanging on the hook!" fin ifhave, cloak # True only if the cloak is in the players' possession drop cloak # Make sure it is not carried fin set hook, 1 # Include the cloak in the hook's description set cloak, 2 # Set the cloak to have no description set bar, 1 # Bar is now lit quip "You hang the cloak on the hook." fin fin #---------------------------------------------------------------------- action read ifeq status, 1 # Player said READ - we'll default to READ MESSAGE or ifkey message # Player actually said READ MESSAGE and ifat bar #Player is at the bar and ifeq bar, 1 # If the bar is lit say message # "Lost" or "won", depends on the message's value stop fin #---------------------------------------------------------------------- action look ifeq status, 1 call describe.here # The procedure does not QUIT... quit # ... so QUIT explicitly fin ifnear arg2 ifkey message # If the object to be describe is the message... call read # ... just call the code for READ. fin describe arg2 # Otherwise give long object description quit fin #----------------------------------------------------------------------
|