! $Id: howtoplay.h,v 1.3 2017/10/24 13:36:34 michael Exp $
! ----------------------------------------------------------------------------
!   howtoplay.h for Inform 6, by Michael J. Coyne
!	How to Play text Copyright 2003 Fredrik Ramsberg
!
! ----------------------------------------------------------------------------
!   Installation: add the lines:
!
!       Include "Menus";    ! optional
!       Include "Howtoplay";
!
!   anywhere in your game AFTER the Include "VerbLib"; directive
!
! ----------------------------------------------------------------------------
!   Based on the structure of Roger Firth's ccpl.h
!
!   Implements a HELP verb which uses Menus.h (or any compatible menu
!   package) to display a menu of Fredrik Ramsberg's "How to Play"
!   instructions from "A Beginner's Guide to Playing Interactive Fiction".
!   Fredrik's full text can be found at:
!   http://IFGuide.ramsberg.net
!
!   Define NO_HOWTO_GRAMMAR to prevent the Help verb from being included.  You
!   will then have to provide an alternate means of running HowToMenu.select()
!
!   If you are not using Menus, then HowToMenu.select will just dump the
!   text to the screen.
!
!   If you wish to include this in an existing menu in your game instead of
!   just having it available through the help verb, you can do this:
!
!   Menu MyMenu "My Menu Object"
!      with   description "Please select one of the following items.^",
!            number 2;
!
!   Option   ->   "How to Play"
!      with   description [;
!               howtoplay.description();
!         ];
!
!	$Log: howtoplay.h,v $
!	Revision 1.3  2017/10/24 13:36:34  michael
!	Make it work properly with DMenus as found on IF Archive.
!
!	Revision 1.2  2003/05/24 13:36:34  michael
!	Removed DOS carriage-returns introduced by opening on DOS machine.
!	
!	Revision 1.1  2003/05/24 13:32:44  michael
!	Initial revision.
!	
! ---------------------------------------------------------------------------- !

system_file;

#ifndef MENU;
Class   Menu with select [;
         howtoplay.description();
      ];
#endif;
#ifndef OPTION;
Class   Option;
#endif;

[ bf text; style bold; print (string) text; style roman; ];

Menu    HowToMenu
   with   short_name [;
              print "How to Play ", (string) Story;
            rtrue;
         ];

Option   ->   howtoplay
   with   short_name [;
              print "How to Play ", (string) Story;
            rtrue;
         ],
         description [;
         print "These general instructions are an excerpt from:
         ~A Beginner's Guide to Playing Interactive Fiction~. 
         The full text can be found at http://IFGuide.ramsberg.net",

         (bf) "^^The game starts";
         print "
         ^When you start a game, you will first see an introduction, usually
         consisting of one or a few screenfuls of text, giving you some
         background on who you are, where you are, and perhaps even what your
         objectives in the game are. Whenever the game has printed a
         screenful of text, it will wait until you press ENTER or some other
         key, so that you get a chance to read everything before it scrolls
         off the top of the screen.^",

         (bf) "^How to interact";
         print "
         ^When the introduction is over, you will get a prompt, usually ~>~,
         but it may be a little different from game to game. The prompt means
         that the game is now waiting for you to tell it what you want to do.
         You do this by typing in imperative commands, as if you were
         commanding someone. Let's say the introduction told you that you are
         in a kitchen, and that you can see a closed glass jar standing on
         the kitchen counter. Commands you could try at this point include
         TAKE THE JAR, or OPEN THE JAR, or perhaps EXAMINE THE JAR
         (Throughout this document, things that are written in capital
         letters are complete commands that can be typed into an IF game.
         They don't have to be typed in capital letters when entered into a
         game). If you want to, you can skip the articles: TAKE JAR will work
         just at well as TAKE THE JAR. If there are several different jars
         you could mean, the game may ask you which one you mean. Just type
         one or more words that uniquely identifies one of the items. For
         instance, if the game says ~Which jar do you mean, the blue glass
         jar or the green glass jar?~, you might reply BLUE to take the blue
         one. You can also choose to ignore the question altogether, just
         typing a new command.^",

         (bf) "^Movement";
         print "
         ^To go to another location, most games expect you to type in which
         direction you want to go. You can type GO SOUTH, but just SOUTH will
         also do the trick, as will S (which is the commonly accepted
         abbreviation for SOUTH). Other directions and their abbreviations
         are NORTH (N), EAST (E), WEST (W), NORTHEAST (NE), SOUTHEAST (SE),
         NORTHWEST (NW), SOUTHWEST (SW), UP (U), DOWN (D), IN and OUT. If you
         are aboard a ship of some kind you may also be able to use FORE,
         AFT, STARBOARD and PORT.^
         ^Other ways to move around may include commands like ENTER CAR, GO
         CAR, SIT ON MOTORCYCLE, GET ON BIKE, CLIMB ONTO SHIP, JUMP ONTO
         PLATFORM, DIVE INTO LAKE, BOARD SHIP, EXIT CAR, EXIT, LEAVE, GET
         OUT. Exactly which commands are ";
#ifdef DIALECT_US;
         print "recognized";
#ifnot;
         print "recognised";
#endif;
         print " vary from game to game as well as from situation to
         situation in those games. When interacting with IF games, always
         try to express yourself as simply as possible.
         If you have tried several ways of expressing yourself and the game
         refuses to understand what you want to do, you are most probably on
         the wrong track; it's time to try something completely different.^",

         (bf) "^Common verbs";
         print "
         ^As you know by now, you can use the verb TAKE to pick up items in
         the game. Of course, you can also use DROP to drop items. Most
         modern games actually ";
#ifdef DIALECT_US;
         print "recognize";
#ifnot;
         print "recognise";
#endif;
         print " a hundred different verbs or more. With some of the most
         used verbs, you can also use multiple items, like this: TAKE GREEN
         BALL AND SCREWDRIVER or DROP ALL or PUT ALL BUT HAMMER IN BAG.
         You'll find that ALL is often a very useful word, although it only
         works with certain verbs, most notably TAKE and
         DROP. Here are some of most important verbs, with examples:^";

         font off;
         print "^
         LOOK or L       L or LOOK AT BOB or LOOK IN JAR or LOOK UNDER BED^
         TAKE            TAKE KNIFE^
         DROP            DROP KNIFE^
         EXAMINE or X    EXAMINE KNIFE or X KNIFE^
         SEARCH          SEARCH DESK^
         INVENTORY or I  I^
         OPEN            OPEN DRAWER^
         CLOSE           CLOSE DRAWER^
         LOCK            LOCK DOOR WITH RUSTY KEY^
         UNLOCK          UNLOCK DOOR WITH RUSTY KEY^
         ASK             ASK JOHN ABOUT POLICE OFFICER^
         TELL            TELL JOHN ABOUT MURDER^
         SAY             SAY HELLO TO JOHN^
         GIVE            GIVE RABBIT TO BOB^
         SHOW            SHOW KNIFE TO POLICE OFFICER^
         WAIT or Z       Z^
         AGAIN or G      G^";
         font on;

         print "^Other verbs you will need from time to time include ATTACK,
         BUY, COVER, DRINK, EAT, FILL, JUMP, KISS, KNOCK, LISTEN, MOVE, PULL,
         PUSH, REMOVE, READ, SIT, SLEEP, STAND, THROW, TIE, TOUCH, TURN,
         TYPE, UNTIE, WEAR. There are lots more. Hopefully they will seem
         natural to you when you need them.^",

         (bf) "^How time works";
         print "
         ^Almost all IF games count time in turns, rather than hours and
         minutes. Every time you type something and press ENTER, one turn
         passes. This also means that until you press ENTER, no time passes.
         You could think of a turn as being something like a minute, but how
         long it actually is depends on what you do during that turn. If you
         want time to pass, but don't want to perform any actions, just type
         WAIT or Z. This will prove useful while waiting for someone to
         arrive or something to get ready in the oven etc (in the game world,
         not in the real world!).^

         ^There are games that use real-time instead of turn-based play, but
         they are few and far between, and they will tell you about their
         real-time system at the beginning of the game.^",

         (bf) "^Talking to people";
         print "
         ^The most useful ways of talking to people usually involve the verbs
         ASK and TELL. When using them, try to pin down the best keyword for
         what you are interested in, rather than longer constructs. For
         example, TELL BOB ABOUT HOW I SAW SHEILA GIVE A STRANGE AMULET TO
         ANOTHER WOMAN is not likely to yield any useful results, but TELL
         BOB ABOUT AMULET or perhaps TELL BOB ABOUT SHEILA may indeed be
         useful. In other words, you tell the game the subject you want to
         talk about or ask about, not exactly what to say. The game will try
         to make reasonable assumptions on what you want to say regarding the
         subject.^";

         print "^Also note that many games are quite primitive when it comes
         to modelling people. The author has to put in an enormous amount of
         work to make people in the game behave realistically and respond
         well to conversation. In general, don't expect too much from people
         in the game, but there are of course games that shine in this area
         too. You'll also see that some authors prefer menu-based
         conversation, to facilitate interaction.^

         ^To tell someone else to do something, type the name of the person,
         a comma, and then a command. Example: BOB, BREAK THE JAR. Just like
         in real life, most people won't automatically do something just
         because you tell them to. If you think Bob knows what to do with the
         jar, you can also try GIVE JAR TO BOB or SHOW JAR TO BOB.^",

         (bf) "^Special verbs";
         print "^All games ";
#ifdef DIALECT_US;
         print "recognize";
#ifnot;
         print "recognise";
#endif;
         print " some verbs that don't do anything in the game world, but
         tells the game something about how you want it to behave,
         or some special task you want it to peform. These verbs include:^";

         font off;
         print "^
         UNDO            Takes back the last move you made.^
         QUIT or Q       Ends the current game.^
         RESTART         Starts the game over from the beginning.^
         SAVE            Saves your current position to a file on disk.^
         RESTORE         Loads a previously saved game position.^
         HELP or ABOUT   Shows some information about the game and its
                        author, in some cases even hints to some of the
                     puzzles.^
         VERBOSE         Tells the game you want a long description of every
                         room you enter, even if you've been there before.^
         BRIEF           Tells the game you want a long description the first
                         time you enter a room, and a short description when
                     you come back. This is the default mode.^
         SUPERBRIEF      Tells the game you always want short descriptions of
                     all rooms.^";
         font on;

         print (bf) "^Getting stuck and unstuck";
         print "
         ^While playing IF, you will get stuck. This is part of the deal --
         where there are puzzles, there will also be stuckness. If you grow
         tired of being stuck in the same spot for too long, you can either
         type HELP in the game to see if there are any hints available, or
         you can ask other players for hints. A good place to ask for hints
         is the newsgroup rec.games.int-fiction (can be reached at 
         http://groups.google.com/groups?group=rec.games.int-fiction ).
         That's also one of the best
         places to meet other IF players, discuss games you've played, get
         tips on games you should play and more.^

         ^Oh, one last thing about playing interactive fiction. Make a map as
         you play. You are very likely to need it.";

];

#Ifdef dmenus_h;
[ HowToSub;      ShowMenu(HowToMenu); ];
#Ifnot dmenus_h;
[ HowToSub;      HowToMenu.select(); ];
#Endif;

#IFNDEF NO_HOWTO_GRAMMAR;
Verb meta 'help' 'howto' 'instructions'
    *             -> HowTo;
#ENDIF;

! ---------------------------------------------------------------------------- !
