! Make your own Inform Adventure!
! Designed for beginners.
! Please read Inform's Designer Manual chapters 1 and 2.
! by Harry M. Hardjono 2/12/98
! Inform is created by Graham Nelson. Thanks Graham!
!
! This program is filled with spaghetti codes elements:
!   Global variables, jumps (gotos), repeating codes,
!   stack overflow problems, abrupt terminations,
!   and other things. :)
!
! Functions that you should modify:
! 1. [Main] - Easy
! 2. [Help] - Easy
! 3. [StoryBoard] - Hard
!    You may need to use Global variables and custom routines.


! Global program variables
Array buffer -->60;
Array parse -->60;
Global n = 0; ! General purpose variable

! Global user variables
! Modify these as you see fit.
Global n3 = 0;  ! n3 is variable for randomization.
Global n4 = 0;  ! n4 is the number of visits on node 4.

!#########################################################
! [Main] is the first function executed by the program.
! You can modify the message here to display disclaimers.
! Alternatively, just call StoryBoard().
!---------------------------------------------------------
[Main;
print "Choose your own Inform Adventure!^";
print "Proceed?^";
if (YesOrNo()) StoryBoard();
];

!#########################################################
! [YesOrNo] returns true if the answer is "yes".
! It returns false if the answer is "no".
!---------------------------------------------------------
[YesOrNo;
for (::) {
 buffer->0 = 60;
 parse->0 = 1;
 print "Please type ~yes~ or ~no~> ";
 read buffer parse;
 if ((parse-->1 == 'yes') || (parse-->1 == #n$y)) rtrue;
 if ((parse-->1 == 'no') || (parse-->1 == #n$n))  rfalse;
}
];

!#########################################################
! [Action] takes a parameter. You call it like this:
! Action(range);  where range is an integer 1-9.
! It returns a digit. It returns 0 when text needs "Refresh"
!
! You don't have to touch this function at all.
! It automatically takes care of program administration
! and command actions.
!---------------------------------------------------------
[Action range;
for (::) {
 buffer->0 = 60;
 parse->0 = 1;
 n = -1;
 print "> ";
 read buffer parse;
 switch (parse-->1) {
  #n$0: n = 0;
  #n$1: if (range >= 1) n=1;
        else jump OutOfRange;
  #n$2: if (range >= 2) n=2;
        else jump OutOfRange;
  #n$3: if (range >= 3) n=3;
        else jump OutOfRange;
  #n$4: if (range >= 4) n=4;
        else jump OutOfRange;
  #n$5: if (range >= 5) n=5;
        else jump OutOfRange;
  #n$6: if (range >= 6) n=6;
        else jump OutOfRange;
  #n$7: if (range >= 7) n=7;
        else jump OutOfRange;
  #n$8: if (range >= 8) n=8;
        else jump OutOfRange;
  #n$9: if (range >= 9) n=9;
        else jump OutOfRange;
  'help'   : Help();
  'restart': StoryBoard();
             ! Repeat too often, and the stack overflows.
  'restore': restore SuccessRestore;
             print "Restore failed!^";
  'save'   : save SuccessSave;
             print "Save failed!^";
  'quit'   : print "Really quit?^";
             ! Elegant programs do not use 'quit'.
             if (YesOrNo()) quit;
  'xyzzy'  : print "My head and tail are at my sides.
                    What am I?^";
  'plugh'  : print "Coin.^";
  default: print "Type ~help~ for info.^";
 }

jump EndOfAction;

.OutOfRange;
print "The choices allowed are integers from 1 to ", range, ".^";
jump EndOfAction;

.SuccessSave;
print "Save successful.^";
jump EndOfAction;

.SuccessRestore;
print "Restore successful.^";
print "Wait a minute! If restore is successful, then
       this segment will not be executed, right?^";
jump EndOfAction;

.EndOfAction;
if (n >= 0) return n;

}
];

!#########################################################
! [Help] is the help screen called when the user types
! "help" at the command prompt. You should customize it
! to include relevant information and credits.
!---------------------------------------------------------
[Help;
print "You can RESTART, SAVE, RESTORE, QUIT, or
       choose the appropriate action with a single digit number.
       Type ~0~ to repeat the text.^";
];

!#########################################################
! [StoryBoard] is the heart of the story.
! As the name implies, this is where the program spends
! most of its execution time.
!
! Make sure labels are consistent.
! You don't need the Introduction, but it's nice to have.
! Make sure all switch cases is terminated by proper jumps
!  or the program will terminate abruptly.
! Don't forget to include the default case for
!  the redisplaying text on the switch command.
! Action(number) is called for user input where the
!  number corresponds with the number of available choices.
!---------------------------------------------------------
[StoryBoard;

Introduction;
print "Hear ye! Hear ye! You can go to a bunch of nodes!^^";

Node1Init;
Node1Display;
print "This is Node 1.^";
print "You can go to these nodes:^";
print "1. Node 1^";
print "2. Node 2^";
print "3. Node 3^";
print "4. Node 4^";
switch (Action(4)) {
 1: jump Node1Init;
 2: jump Node2Init;
 3: jump Node3Init;
 4: jump Node4Init;
 default: jump Node1Display;
}

Node2Init;
Node2Display;
print "This is Node 2.^";
print "You can go to these nodes:^";
print "1. Node 2^";
print "2. Node 4^";
switch (Action(2)) {
 1: jump Node2Init;
 2: jump Node4Init;
 default: jump Node2Display;
}

Node3Init;
n3 = random (0,1); ! See Designer Manual for other Inform commands.
Node3Display;
print "This is Node 3.^";
print "You can go to these nodes:^";
print "1. Node 1^";
if (n3) print "2. Node 2^";
else    print "2. Node 3^";
switch (Action(2)) {
 1: jump Node1Init;
 2: if (n3) jump Node2Init;
    else    jump Node3Init;
 default: jump Node3Display;
}

Node4Init;
n4++;  ! Increment counter for each visit
Node4Display;
print "This is Node 4.^";
print "Number of visit: ", n4, ".^";
print "You can go to these nodes:^";
print "1. Node 1^";
print "2. Node 3^";
print "3. Node 4^";
switch (Action(3)) {
 1: jump Node1Init;
 2: jump Node3Init;
 3: jump Node4Init;
 default: jump Node4Display;
}

];