DEV website instance!

More actions

By now you should have no problem following the below code for hanging the cloak. The only directive that needs explaining is IFNEAR CLOAK, which tests for the cloak being present, whether or not it is carried by the player. IFNEAR is a shorthand for IFHAVE followed by OR followed by IFHERE.

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

That leaves just two more actions to be defined – READ and LOOK:

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

Recall the as-you-go parsing of compound IFs. The above one says that if the player said READ or READ MESSAGE, and is at the bar, and the bar is lit then the message is displayed and the game terminated. Recall also that the value of message was originally set to 4 and decremented any time the player did something in darkness other than leaving the bar. The message description is a text switch and will give the "you win" win description for values 1 through 4, and the "you lose" one for message values of zero or less.

Finally, LOOK. If no object is given, it just needs to call the DESCRIBE.HERE procedure, which we have already constructed for use by the REPEAT loop. If an object is nominated and is nearby (carried or just present) and the object in question is the message, that's already covered by the READ action – so just CALL READ. Otherwise DESCRIBE ARG2 does the job.

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

An that's it. Well, sort of...

Previous page            Next page


Back to the tutorial index
To the Mipmip home page
Feel free to leave a comment!
Mike Arnautov (06 May 2025)