!---------------------------------------------------------------------------
!       HelpRoutines.h, by Emily Short ([email protected])
!       Version 1.0
!       8/16/02
!
!       Being a file of straightforward routines that will make your game print
!       wodges and wodges of text about IF playing.
!
!       Some portions based on paraphrase of instructional text by
!       Stephen Granade.
!---------------------------------------------------------------------------
!
!       RIGHTS:
!
!       This library file may be treated as public domain.  It may be
!       used in source with or without credit to the original author.  It may be
!       modified at the user's discretion.  It may be freely redistributed.
!       The textual content of the routines may be lifted from their context
!       and reused elsewhere.
!
!
!       INSTALLATION:
!
!       Include "HelpRoutines" in your gamefile.
!
!
!       CONTENTS:
!
!       -- Three basic formatting routines for doing bold and italic text
!               and for awaiting a keypress.  (The only reason to define these
!               is to provide z-code/Glulx flexibility.)
!
!       -- LongIntro.  A description of IF, which prints both of
!               -- BasicBrief.  A quick description of IF in the abstract
!               -- BasicIntro.  A somewhat longer description of same, discuss
!
!       -- ExplainPrompt.  What a prompt is.
!       -- StartingInstructions.  Suggests that the player look, examine items,
!                       and check his inventory.
!       -- StuckInstructions.  A list of tips for a player in trouble
!
!       -- AllCommunication.  Prints all of the following:
!               -- Communication.  Basic instructions on how to form valid commands.
!               -- OnMovement
!               -- OnObjects
!               -- OnNPCs, which will also call one of
!                       -- AskTellNPC (Define NPC_ASKTELL before including this file)
!                       -- MenuNPC (Define NPC_MENU before including this file)
!                       -- TalkToNPC (Define NPC_TALKTO before including this file)
!                       -- TopicMenuNPC (Define NPC_TOPIC before including this file)
!               -- MetaCommands.  Introduces SAVE, QUIT, RESTART, RESTORE, UNDO.
!
!       -- StandardVerbs.  A list of standard verbs.  Self-adjusting to reflect
!           the instructions about NPCS; it will list SCORE only if you have a MAX_SCORE
!               greater than 0, and the OBJECTS/PLACES commands only if you have not defined
!               NO_PLACES.
!       -- Abbreviations.  A list of abbreviations and their meanings.
!
!       -- OnlineHelp.  How to find online IF manuals.
!       -- MoreGames.  How to find more IF.
!
!       SEE ALSO:
!               -- SampleTranscript.h: contains several sample transcripts formatted
!                       for inclusion in IF games.
!
!       CAVEAT
!
!       Note that in some cases this material may be incorrect for your game.
!       You are advised to read the resulting text and determine whether it suits
!       your ends.
!
!---------------------------------------------------------------------------


system_file;


!---------------------------------------------------------------------------
! Special effects -- bold-texting and pauses for display purposes
!---------------------------------------------------------------------------

#ifdef TARGET_GLULX;
[ ES_Pause i;
       i = KeyCharPrimitive();
       if (i=='q') rtrue;
       rfalse;
];
#ifnot;
[ ES_Pause i;
       @read_char 1 i;
       if (i == 'q') rtrue;
       rfalse;
];
#endif;

#ifdef TARGET_GLULX;
[ ESB str;      ! print something in bold
       if (str==0) rfalse;
       glk_set_style(style_Input);
       print (string) str;
       glk_set_style(style_Normal);
       rtrue;
];
#ifnot;
[ ESB str;      ! print something in bold
       if (str==0) rfalse;
       style bold;
       print (string) str;
       style roman;
       rtrue;
];
#endif;

#ifdef TARGET_GLULX;
[ ESI str;      ! print something in italics
       if (str==0) rfalse;
       glk_set_style(style_Emphasized);
       print (string) str;
       glk_set_style(style_Normal);
       rtrue;
];
#ifnot;
[ ESI str;      ! print something in italics
       if (str==0) rfalse;
       style underline;
       print (string) str;
       style roman;
       rtrue;
];
#endif;



!---------------------------------------------------------------------------
! Introductions
!---------------------------------------------------------------------------

[ LongIntro;
       BasicBrief();
       new_line;
       BasicIntro();
];

[ BasicBrief;
       print (ESB) "INTERACTIVE FICTION^";
       print "The game you are playing is a work of Interactive Fiction.  In interactive fiction
               you play the main character of a story.  You type commands
               which determine the actions of the character and the flow of the plot.  Some IF
               games include graphics, but most do not: the imagery is provided courtesy of your
               imagination.  On the other hand, there's a wide range of action available:
               whereas in other games you may be restricted to shooting, movement, or searching
               items you can click on with a mouse, IF allows you a wide range of verbs.^";
];

[ BasicIntro;
       print "There are various kinds of IF in the world.  Some of them put more
               emphasis on solving puzzles; some want to move you through a coherent plot
               of some kind; some want to offer you something to explore.^^";
       print "In games with a lot of challenging puzzles, you can expect to spend a fair
               amount of time wandering around trying to figure out what you should do
               next; this is part of the fun.  (If you like that sort of thing, anyway.)
               When you start a game, you can usually get a sense fairly early on of what
               kind of game it is and what the author expects you to do.  Read the
               opening text carefully: it may tell you things about the character you are
               playing, your goals within the game, and so on.^^";
       print "If the game tells you to type ABOUT or INFO the first time you play, you
               should always do so: this information may include special commands or
               other material without which you won't be able to finish.  This is like
               the game manual in a commercial game, so don't ignore it.^^";
       print (ESB) "HOW THE WORLD IS ASSEMBLED^^";
       print "Space: Most IF games are set in a world made up of rooms without internal
               division.  Movement between rooms is possible; movement within a room does
               not always amount to anything.  >WALK OVER TO THE DESK is rarely a useful
               sort of command.  On the other hand, if something is described
               as being high or out of reach, it is sometimes relevant to stand on an
               object to increase your height.  This kind of activity tends to be
               important only if prompted by the game text.^^";
       print "Containment: One thing that IF does tend to model thoroughly is
               containment.  Is something in or on something else?  The game keeps track
               of this, and many puzzles have to do with where things are -- in the
               player's possession, lying on the floor of the room, on a table, in a box,
               etc.^^";
       print "Types of Action: Most of the actions you can perform in the world of IF
               are brief and specific.  >WALK WEST or >OPEN DOOR are likely to be
               provided.  >TAKE A JOURNEY or >BUILD A TABLE are not.  Things like >GO TO
               THE HOTEL are on the borderline: some games allow them, but most do not.
               In general, abstract, multi-stage behavior usually has to be broken down
               in order for the game to understand it.^^";
       print "Other Characters: Other characters in IF games are sometimes rather
               limited.  On the other hand, there are also games in which character
               interaction is the main point of the game.  You should be able to get a
               feel early on for the characters -- if they seem to respond to a lot of
               questions, remember what they're told, move around on their own, etc.,
               then they may be fairly important.  If they have a lot of stock responses
               and don't seem to have been the game designer's main concern, then they
               are most likely present either as local color or to provide the solution
               to a specific puzzle or set of puzzles.  Characters in very
               puzzle-oriented games often have to be bribed, threatened, or cajoled into
               doing something that the player cannot do -- giving up a piece of
               information or an object, reaching something high, allowing the player
               into a restricted area, and so on.^";
       rtrue;
];


!---------------------------------------------------------------------------
! Explain Prompt, Starting Instructions, Stuck Instructions
!---------------------------------------------------------------------------


[ ExplainPrompt;
       print (ESB) "PROMPT^";
       print "The ", (ESB) ">", " sign is where the game says, ~Okay, what do you
               want to do now?~  You may respond by typing an instruction -- usually an
               imperative verb, possibly followed by prepositions and objects.  So, for
               instance, LOOK, LOOK AT FISH, TAKE FISH.^";
];

[ StartingInstructions;
       print (ESB) "GETTING STARTED^";
       print "The first thing you want to do when starting a game is acquaint yourself
               with your surroundings and get a sense of your goal.  To this end, you should:^^";
       print (ESB) "Read the introductory text carefully.  ", "Sometimes it contains clues.^";
       print (ESB) "Look at the room description.  ", "Get an idea of what sort of
               place you're in.  Usually the description will tell you two important things:
               where the exits from the room are, and what the objects are that you can
               interact with.  Type LOOK if you want to see the room description again.^";
       print (ESB) "Look at the things in the room.  ", "Individual descriptions of items
               can help you out.^";
       print (ESB) "Examine yourself.  ", "Information about your character may be
               important.^";
       print (ESB) "TAKE INVENTORY.  ", "Sometimes you'll be holding something important.^";
       print (ESB) "Explore.  ", "Move from room to room, and check out every location
               available.^";
];

[ StuckInstructions;
       print (ESI) "[These suggestions are lengthy, so the game will periodically
               pause while printing them.  To stop the instructions mid-flow, press
               Q at a pause; to continue, press any other key.]^^";
       print (ESB) "Explore.  ", "Examine every object mentioned in room descriptions, and
               everything in your inventory.  Examine yourself, too.
               Look inside all closed containers.  Open
               all doors and go through them.  If anything is locked, that's probably a
               puzzle, and you should try to get it unlocked.^^";
       print (ESB) "Try out all your senses.  ", "If the game mentions an interesting
               texture, odor, or sound, try SMELLing, TOUCHing, LISTENing, etc.^^";
       print (ESB) "Be thorough.  ", "If you *still* can't figure out what to do, try opening
               windows, looking under beds, etc.  Sometimes objects are well-hidden.^^";
       print (ESB) "Reread.  ", "Look back at things you've already seen; sometimes this will
               trigger an idea you hadn't thought of.^^";
       if (ES_Pause()) jump end;
       print (ESB) "Take hints from the prose of the game.  ",
               "Things that are described in great
               detail are probably more important than things that are given one-liners.
               Play with those objects.  If a machine is described as having component
               parts, look at the parts, and try manipulating them.   Likewise, notice
               the verbs that the game itself uses.  Try using those yourself.  Games
               often include special verbs -- the names of magic spells, or other special
               commands.  There's no harm in attempting something if the game mentions
               it.^^";
       print (ESB) "Rephrase.  ",
               "If you have something in mind that you want to do, but can't
               get the game to respond, try alternative wordings.  Often synonyms are
               provided.  Game designers usually try to anticipate all the synonyms you
               are likely to come up with, but they may not have thought of yours.^^";
       if (ES_Pause()) jump end;
       print (ESB) "Try variations.  ",
               "Sometimes an action doesn't work, but *does* produce some
               kind of unusual result.  These are often indications that you're on the
               right track, even if you haven't figured out quite the right approach
               yet.  Pressing the red button alone may only cause a grinding noise from
               inside the wall, so perhaps pressing the blue and *then* the red will open
               the secret door.^^";
       print (ESB) "Try to understand the game's internal logic.  ",
               "Sometimes there is a system
               in play that does not operate in the normal world -- a kind of magic, for
               instance, or technology we don't have on modern-day earth.  If you've been
               introduced to such a system in the game, ask yourself how you might apply
               it to the situations that are still causing you problems.^^";
       if (ES_Pause()) jump end;
       print (ESB) "Check the *whole* screen.  ",
               "Are there extra windows besides the main
               window?  What's going on in those?  Check out the status bar, if there is
               one -- it may contain the name of the room you're in, your score, the time
               of day, your character's state of health, or some other important
               information.  If there's something up there, it's worth paying attention
               to that, too.  When and where does it change?  Why is it significant?  If
               the bar is describing your character's health, you can bet there is
               probably a point at which that will be important.^^";
       print (ESB) "Consider the genre of the game.  ",
               "Mysteries, romances, and thrillers all
               have their own types of action and motivation.  What are you trying to do,
               and how do conventional characters go about doing that?  What's the right
               sort of behavior for a detective/romance heroine/spy?^^";
       if (ES_Pause()) jump end;
       print (ESB) "Play with someone else.  ", "Two heads are usually better than one.^^";
       print (ESB) "Try typing HINT, HELP, INFO, ABOUT: ", "one or more of these are often
               implemented as a source of suggestions about how to get past difficult
               spots.  If that doesn't work, try emailing the author or (better yet)
               posting a request for hints on the newsgroup rec.games.int-fiction.  For
               best results, put the name of the game you want help with in the subject
               line; then leave a page or so of blank ~spoiler space~ (so that no one
               will read about where you got to in the game unless they've already played
               it), and describe your problem as clearly as possible.  Someone will
               probably be able to tell you how to get around it.^^";
       if (ES_Pause()) jump end;

       print (ESB) "Email the author: ",
               "If you're stuck somewhere that just makes no sense at all, it's possible
               that you're facing a bug.  If you think you are, you should email the
               author (politely) to report the problem and ask for a way around it.^";
       .end;
       "Good luck!";
];


!---------------------------------------------------------------------------
! Standard Verbs list
!---------------------------------------------------------------------------

[ StandardVerbs flag;
       print "Here is a list of the standard instructions in games like this.
               You should be aware that the game you are playing may introduce some other
               verbs, as well.  This list is just a place to start:^^";
#ifdef TARGET_GLULX;
       glk_set_style(style_Preformatted);
#ifnot;
       font off;
#endif;
       print "LOOK       ";
       print "EXAMINE    ";
       print "SEARCH     ";
       print "LOOK UNDER ";
       print "^";
       print "^";

       print "INVENTORY  ";
       print "TAKE       ";
       print "DROP       ";
       print "EMPTY      ";
       print "^";

       print "REMOVE     ";
       print "PUT ON     ";
       print "PUT IN     ";
       print "TRANSFER   ";
       print "^";
       print "^";

       print "NORTH [N]  ";
       print "SOUTH [S]  ";
       print "EAST  [E]  ";
       print "WEST      [W]  ";
       print "^";

       print "[NE]       ";
       print "[NW]       ";
       print "[SE]       ";
       print "[SW]       ";
       print "^";

       print "UP         ";
       print "DOWN       ";
       print "IN         ";
       print "OUT        ";
       print "^";

       print "GO         ";
       print "ENTER      ";
       print "EXIT       ";
       print "GET OFF    ";
       print "^";
       print "^";

       print "CLIMB      ";
       print "SWIM       ";
       print "JUMP       ";
       print "JUMP OVER  ";
       print "^";
       print "^";

       print "LOCK       ";
       print "UNLOCK     ";
       print "OPEN       ";
       print "CLOSE      ";
       print "^";

       print "SWITCH ON  ";
       print "SWITCH OFF ";
       print "SET        ";
       print "TURN       ";
       print "^";

       print "PULL       ";
       print "PUSH       ";
       print "PUSH NORTH ";
       print "THROW AT   ";
       print "^";

       print "SWING      ";
       print "WAVE       ";
       print "RUB        ";
       print "SQUEEZE    ";
       print "^";

       print "EAT        ";
       print "DRINK      ";
       print "WEAR       ";
       print "TAKE OFF   ";
       print "^";

       print "LISTEN     ";
       print "TASTE      ";
       print "TOUCH      ";
       print "SMELL      ";
       print "^";

       print "BURN       ";
       print "DIG        ";
       print "CUT        ";
       print "TIE        ";
       print "^";

       print "BLOW       ";
       print "BREAK      ";
       print "FILL       ";
       print "CONSULT    ";
       print "^";

       print "WAIT       ";
       print "SLEEP      ";
       print "SING       ";
       print "THINK      ";
       print "^";
       print "^";

       print "GIVE       ";
       print "SHOW       ";
       print "WAKE       ";
       print "KISS       ";
       print "^";

       print "ATTACK     ";
       print "BUY        ";

#ifdef NPC_ASKTELL;
       print "TELL       ";
       print "ANSWER     ";
       print "^";
       print "ASK        ";
       print "ASK FOR    ";
#endif;
#ifdef NPC_TOPIC;
       print "TELL       ";
       print "ASK        ";
#endif;
#ifdef NPC_TALKTO;
       print "TALK TO    ";
#endif;
#ifdef NPC_MENU;
       print "TALK TO    ";
#endif;
       print "^";

#ifdef TARGET_GLULX;
       glk_set_style(style_Normal);
#ifnot;
       font on;
#endif;

       print "^^The following commands control the game itself:^^";
#ifdef TARGET_GLULX;
       glk_set_style(style_Preformatted);
#ifnot;
       font off;
#endif;
       print "RESTART    RESTORE    SAVE^";
       print "QUIT       UNDO       PRONOUNS^";
       print "SCRIPT ON  SCRIPT OFF VERIFY^";
#ifndef NO_PLACES;
       print "OBJECTS    PLACES     ^";
#endif;
#ifdef MAX_SCORE;
       if (max_score > 0)
       {       print "SCORE      ";
               print "NOTIFY ON  ";
               print "NOTIFY OFF ";
               flag = 1;
       }
#endif;
#ifdef TASKS_PROVIDED;
       if (max_score > 0)
       {
               print "FULL SCORE";
               flag = 1;
       }
#endif;
       if (flag) print "^";
#ifdef TARGET_GLULX;
       glk_set_style(style_Normal);
#ifnot;
       font on;
#endif;
];

[ Abbreviations;
       print "Standard abbreviations are as follow:^^";
       print "D -- DOWN.^";
       print "E -- EAST.^";
       print "G -- AGAIN.  Repeat the previous command.^";
       print "I -- INVENTORY.  See what you're holding.^";
       print "L -- LOOK.  See what's around you.^";
       print "N -- NORTH.^";
       print "NE -- NORTHEAST.^";
       print "NW -- NORTHWEST.^";
       print "Q -- QUIT.^";
       print "S -- SOUTH.^";
       print "SE -- SOUTHEAST.^";
       print "SW -- SOUTHWEST.^";
       print "U -- UP.^";
       print "W -- WEST.^";
       print "X -- EXAMINE (something).^";
       print "Z -- WAIT.^";
       new_line;
];

!---------------------------------------------------------------------------
! Communication etc.
!---------------------------------------------------------------------------

[ AllCommunication;
       Communication();
       OnMovement();
       OnObjects();
       OnNPCs();
       MetaCommands();
];

[ Communication;
       print (ESB) "BASIC COMMUNICATION^";
       print "In order to communicate with the game, you will need to enter
               instructions beginning with imperative verbs -- as though you were
               giving orders to someone else to carry out.  For instance, >CLOSE THE
               DOOR or >LOOK UNDER THE RUG.^^";
       print "You may use articles (~the~ and ~a~), but you do not need to.  >CLOSE DOOR
               will also work for the game's purposes.^";
];
[ OnMovement;
       print (ESB) "ROOMS AND TRAVEL^";
       print "At any given time, you are in a specific location, or room.  When you
               go into a room, the game will print a description of what you can see
               there.  This description will contain two vital kinds of information:
               things in the room you can interact with or take, and a list of
               exits, or ways out.  If you want to see the description again, you may
               just type LOOK.^^";
       print "When you want to leave a location and go to another one, you may
               communicate this to the game using compass directions: eg, GO NORTH.
               For simplicity's sake, you are allowed to omit the word GO, and
               to abbreviate the compass directions.  So you have
               NORTH, SOUTH, EAST, WEST, NORTHEAST, SOUTHEAST, NORTHWEST,
               SOUTHWEST, UP, and DOWN, or in short form N, S, E, W, NE, SE, NW, SW,
               U, and D.^^";
       print "In some locations, IN and OUT will also be useful.^^";
];
[ OnObjects;
       print (ESB) "OBJECTS^";
       print "Throughout the game there will be assorted objects that you can
               do things with.  Most importantly, you may TAKE or GET items, and (when
               you are tired of them) DROP them again.  INVENTORY (abbreviated I)
               will list the items you are currently holding.^^";
       print "There are usually assorted things you may do with these objects.
               OPEN, CLOSE, WEAR, EAT, LOCK, and UNLOCK are especially common.^^";
       print "Occasionally, you will find that the game does not recognize the
               name of an object even though it has been described as being in the room
               with you.  If this is the case, the object is just there for scenery,
               and you may assume that you do not need to interact with it.^";
];
[ OnNPCs;
       print (ESB) "OTHER CHARACTERS^";
#ifdef NPC_MENU;
       MenuNPC();
       rtrue;
#endif;
#ifdef NPC_TALKTO;
       TalkToNPC();
       rtrue;
#endif;
#ifdef NPC_TOPIC;
       TopicMenuNPC();
       rtrue;
#endif;
       AskTellNPC();
       rtrue;
];

[ AskTellNPC;
       print "From time to time you will meet other people and creatures. You will be unable to
               converse with the people in plain English; instead, a more constrained system of
               communication is used. There are four common ways to talk to characters:^^";
       print "Ask them about an object.^";
       print (ESB) ">ASK PAUL ABOUT HIS BROTHER^";
       print (ESB) ">ASK GLENDA ABOUT RUBY SLIPPERS^^";
       print "Show them an object.^";
       print (ESB) ">SHOW WARRANT TO DRUG LORD^";
       print (ESB) ">SHOW BUCKET OF WATER TO EVIL WITCH^^";
       print "Tell them about an object.^";
       print (ESB) ">TELL ICE CREAM VENDOR ABOUT HIS TRUCK^";
       print (ESB) ">TELL DOROTHY ABOUT FLYING MONKEYS^^";
       print "Command them.^";
       print (ESB) ">FREDDY, HELLO^";
       print (ESB) ">TINY TIM, PUT THE UKELELE ON THE TABLE^";
       print (ESB) ">TIN MAN, GET UP. CARRY US^^";
       print "FREDDY, HELLO is not an actual command, but is phrased like one. (Note that not
               all games implement this command, but it's worth knowing about just in case.)
               Notice that you can give characters more than one command on a line. Most
               characters will be less than responsive to commands.^";
];

[ MenuNPC;
       print "From time to time you will meet other people and creatures. You may use the command
               >TALK TO CHARACTER, and the game will give you a menu of options, which you may
               use to converse with the character in plain English.^^";
       print "You may also find it useful to show them things:^^";
       print (ESB) ">SHOW WARRANT TO DRUG LORD^";
       print (ESB) ">SHOW BUCKET OF WATER TO EVIL WITCH^^";
       print "or give them instructions:^";
       print (ESB) ">FREDDY, HELLO^";
       print (ESB) ">TINY TIM, PUT THE UKELELE ON THE TABLE^^";
       print "but if you're just not getting through, rely on the menus.^";
];
[ TalkToNPC;
       print "From time to time you will meet other people and creatures. You will be unable to
               converse with the people in plain English; instead, you may use the command
               >TALK TO CHARACTER, and the game will decide what you should say at this
               juncture.^";
];

[ TopicMenuNPC;
       print "From time to time you will meet other people and creatures. You will be unable to
               converse with the people in plain English; instead, a more constrained system of
               communication is used. There are three common ways to talk to characters:^^";
       print "Bring up a topic for conversation.^";
       print (ESB) ">TELL BOB ABOUT THE FLAG^";
       print (ESB) ">ASK BETTY ABOUT CHOCOLATE CAKE^^";
       print "These can also be abbreviated to A and T, and the game will also
               keep track of which person you're talking to, if you've already started a
               conversation.  This allows briefer commands, like so:^^";
       print (ESB) ">A CAKE^";
       print (ESB) ">T FLAG^^";
       print "If there is more than one thing you are allowed to ask Betty about the chocolate
               cake, the game will give you a menu of options in the window at the bottom of the
               screen.  Otherwise, it will carry out your instruction immediately.^^";
       print "Show them an object.^";
       print (ESB) ">SHOW WARRANT TO DRUG LORD^";
       print (ESB) ">SHOW BUCKET OF WATER TO EVIL WITCH^^";
       print "Command them.^";
       print (ESB) ">TINY TIM, PUT THE UKELELE ON THE TABLE^";
       print (ESB) ">TIN MAN, GET UP. CARRY US^^";
       print "Most characters will be less than responsive to commands.^";
];

[ MetaCommands;
       print (ESB) "METACOMMANDS^";
       print "There are a few simple commands for controlling the function of the
               game itself.  These are:^^";
       print (ESB) "SAVE", " -- Saves a snapshot of the game as it is now.^";
       print (ESB) "RESTORE", " -- Puts the game back to a previously saved state.  (Note:
               you may keep as many saved games as you like.)^";
       print (ESB) "RESTART", " -- Puts the game back to its initial state.^";
       print (ESB) "QUIT", " -- Ends the game.^";
];


!---------------------------------------------------------------------------
! About the IF community online
!---------------------------------------------------------------------------

[ OnlineHelp;
       print (ESB) "IF HELP ONLINE^^";
               print "Some online sources of introductory help for IF games include:^^";
               print "Frederik Ramsberg's Beginner's Guide, http://www.octagate.com/Fredrik/IFGuide/^";
               print "Interactive Fiction -- Getting Started, http://adamcadre.ac/content/if.txt^";
               print "A Brief Introduction to Interactive Fiction, http://www.tads.org/if.htm^^";
               print "For more information about IF, the IF community, and other games to play,
                       you should also try:^^";
               print "Brasslantern, http://www.brasslantern.org/^";
               print "Baf's Guide to Interactive Fiction, http://www.wurb.com/if/index^^";
               print "You may also ask for specific information and game hints on the newsgroup
                       rec.games.int-fiction.^^";
               print "If you are not familiar with newsgroups and don't have
                       a newsreader already set up, you may access it by going to http://groups.google.com/
                       and selecting ~rec~, then ~rec.games~, then ~rec.games.int-fiction.~  You will
                       be presented with a long list of things that people are already talking about.
                       If you've never read this newsgroup before, you should look for a thread with the
                       word ~FAQ~ in the title, and read it: this will give you instructions about how
                       to post without breaking any of the community's rules of etiquette.  (They're
                       not especially fussy, but following them will get you prompter and more polite
                       assistance.)^^";
               print "Once you've done that, you may post
                       a new message with a clearly labelled subject (like ~[HINT REQUEST] Jigsaw~ or
                       ~Looking for Mystery Games~).  Afterwards, wait a few hours and check the newsgroup again
                       to see whether anyone has an answer for you.^^";
];


[ MoreGames;
       print (ESB) "MORE SOURCES OF IF^^";
       print "There are more games like this at the IF Archive, www.ifarchive.org.^^";
       print "Instructions on setting them up are available from Frederik Ramsberg's
               Beginner's Guide, http://www.octagate.com/Fredrik/IFGuide/^";
       print "Guides to good IF (for beginners or in general) are to be found at the Beginner's
               Guide just mentioned, or at Baf's Guide to Interactive Fiction,
               http://www.wurb.com/if/index.";
];