home *** CD-ROM | disk | FTP | other *** search
/ CD PowerPlay 6 / TheCompleteAdventureCollection1995 / CDPP6.ISO / utility / agtsrc / command.pa3 < prev    next >
Encoding:
Text File  |  1993-05-30  |  30.3 KB  |  684 lines

  1.  
  2.   {COMMAND.PA2}
  3.  
  4.   {Set_Token_Parameters}
  5.  
  6.   PROCEDURE Set_Token_Parameters;
  7.   VAR i : Token;
  8.  
  9.   BEGIN
  10.     FOR i := AtLocation TO DoneWithTurn
  11.     DO P[i] := 1;                 {set all parameter values to 1}
  12.  
  13.     {Now deal with exceptions, i.e., parameter values of 0 and 2}
  14.  
  15.     {*************************************************************************}
  16.     {*                C O N D I T I O N    T O K E N S                       *}
  17.     {*************************************************************************}
  18.  
  19.     {**********************   PLAYER CONDITIONS   ****************************}
  20.     {                 Type of   Number Of}
  21.     {TOKEN NAME     Parameters Parameters     Explanation}
  22.     {=============== =============  ==== ====================================}
  23.     P[IsCarryingSomething {None} ] := 0; {Player is carrying something}
  24.     P[IsCarryingNothing {None} ] := 0; {Player is carrying nothing}
  25.     {worth at least PTS# points}
  26.     P[IsWearingSomething {None} ] := 0; {Player is wearing something}
  27.     P[IsWearingNothing {None} ] := 0; {Player is wearing nothing}
  28.     P[FirstVisitToRoom {None} ] := 0; {Player is in current room for first time}
  29.     P[NewLife {None} ] := 0;      {Player is starting game or has just been resurrected}
  30.  
  31.     {**********************   ITEM CONDITIONS   **********************************}
  32.     {                 Type of   Number Of}
  33.     {TOKEN NAME     Parameters Parameters     Explanation}
  34.     {=============== =============  ==== ========================================}
  35.     P[IsLocated {ITEM#  loc#} ] := 2; {ITEM# is located in room loc#}
  36.     P[Together {ITEM# ITEM#} ] := 2; {ITEM# and ITEM# are in same place}
  37.  
  38.     {*********************   NOUN CONDITIONS   *******************************}
  39.     {                 Type of   Number Of}
  40.     {TOKEN NAME     Parameters Parameters     Explanation}
  41.     {=============== =============  ==== ====================================}
  42.     P[NOUNPresent {none} ] := 0;  {NOUN ITEM is in room, carried or worn}
  43.     P[NOUNIsWearing {none} ] := 0; {NOUN ITEM is being worn}
  44.     P[NOUNIsCarrying {none} ] := 0; {NOUN ITEM is being carried}
  45.     P[NOUNIsNowhere {none} ] := 0; {NOUN ITEM is located NOWHERE (room 0)}
  46.     P[NOUNIsSomewhere {none} ] := 0; {NOUN ITEM is located somewhere}
  47.     P[NOUNInRoom {none} ] := 0;   {NOUN ITEM is located in current room}
  48.     P[NOUNIsON {none} ] := 0;     {NOUN ITEM is ON}
  49.     P[NOUNIsOFF {none} ] := 0;    {NOUN ITEM is OFF}
  50.     P[NOUNIsOpen {none} ] := 0;   {NOUN ITEM is Open}
  51.     P[NOUNIsClosed {none} ] := 0; {NOUN ITEM is Closed}
  52.     P[NOUNIsLocked {none} ] := 0; {NOUN ITEM is Locked}
  53.     P[NOUNIsUnLocked {none} ] := 0; {NOUN ITEM is UnLocked}
  54.     P[NOUNIsEdible {none} ] := 0; {NOUN ITEM is Edible}
  55.     P[NOUNIsDrinkable {none} ] := 0; {NOUN ITEM is Drinkable}
  56.     P[NOUNIsPoisonous {none} ] := 0; {NOUN ITEM is Poisonous}
  57.     P[NOUNIsMovable {none} ] := 0; {NOUN ITEM is Movable}
  58.  
  59.     {*****************   MISCELLANEOUS CONDITIONS   **************************}
  60.     {                 Type of   Number Of}
  61.     {TOKEN NAME     Parameters Parameters     Explanation}
  62.     {=============== =============  ==== ====================================}
  63.     P[LightPresent {none} ] := 0; {Room has necessary light}
  64.     P[RoomNeedsLight {none} ] := 0; {Room needs a light}
  65.     P[AnswerIsCorrect {none} ] := 0; {last answer was correct}
  66.     P[AnswerIsWrong {none} ] := 0; {last answer was wrong}
  67.     P[CounterEquals {ctr# num} ] := 2; {Counter # is equal to num}
  68.     P[CounterGT {ctr# num} ] := 2; {Counter # is greater than num}
  69.     P[CounterLT {ctr# num} ] := 2; {Counter # is less than num}
  70.     P[VariableEquals {var# num} ] := 2; {Variable # is equal to num}
  71.     P[VariableGT {var# num} ] := 2; {Variable # is greater than num}
  72.     P[VariableLT {var# num} ] := 2; {Variable # is less than num}
  73.     P[CompareVariables {V1 V2} ] := 2; {TRUE if V1 < V2 }
  74.     P[VariableChance {V N} ] := 2; {TRUE if V < Random(1..N)}
  75.     P[NamePresent {none} ] := 0;  {TRUE if Name being addressed is at location or No Name addressed}
  76.     P[PromptForYES {none} ] := 0; {Prompts for Y or N -- Ok if Yes}
  77.     P[PromptForNO {none} ] := 0;  {Prompts for Y or N -- Ok if No}
  78.     P[VerbIsDirection {none} ] := 0; {Verb is movement or direction}
  79.     P[NounIsCreature] := 0;       {TRUE if noun is a creature}
  80.     P[ObjectIsCreature] := 0;     {TRUE if object is a creature}
  81.     P[ObjectPresent] := 0;        {TRUE if object is present in room}
  82.     P[LogicalNOT {none} ] := 0;   {Logical NOT of current condition}
  83.     P[LogicalOR {none} ] := 0;    {Logical OR of conditions}
  84.  
  85.     {*************************************************************************}
  86.     {*                    A C T I O N     T O K E N S                        *}
  87.     {*************************************************************************}
  88.  
  89.     {******************* PLAYER ACTION TOKENS ********************************}
  90.     {                 Type of   Number Of}
  91.     {TOKEN NAME     Parameters Parameters     Explanation}
  92.     {=============== =============  ==== ====================================}
  93.     P[GoToRandomRoom {R1 R2} ] := 2; {Send player to Room >= R1 and <= R2}
  94.     P[SendToVariableRoom] := 2;   {Item# Var# -- will send Item# to room number Var#}
  95.     P[GetNOUN {none} ] := 0;      {NOUN is now being carried}
  96.     P[WearNOUN {none} ] := 0;     {NOUN is now being worn}
  97.     P[DropNOUN {none} ] := 0;     {Drops NOUN into current room}
  98.     P[RemoveNOUN {none} ] := 0;   {Removes NOUN and drops into room}
  99.     P[DropEverything {none} ] := 0; {Drop all items being carried}
  100.     P[RemoveEverything {none} ] := 0; {Remove all items being worn}
  101.     P[KillPlayer {none} ] := 0;   {Makes player dead}
  102.  
  103.     {************** ITEM/NOUN/LOCATION ACTION TOKENS *************************}
  104.     {                 Type of   Number Of}
  105.     {TOKEN NAME     Parameters Parameters     Explanation}
  106.     {=============== =============  ==== ====================================}
  107.     P[PutNOUNInCurrentRoom {none} ] := 0; {Put NOUN in current room}
  108.     P[SendToRoom {ITEM# loc#} ] := 2; {Put ITEM# in room loc#}
  109.     P[SendTreasuresToRoom {loc# pts#} ] := 2; {Send all carried ITEMs whose}
  110.     {points > pts# to loc#}
  111.     P[RelocateAll {loc1 loc2} ] := 2; {Move all items at loc1 to loc2}
  112.     P[DestroyNOUN {none} ] := 0;  {NOUN is now NOWHERE (room 0)}
  113.     P[SwapLocations {ITEM1 ITEM2} ] := 2; {swap locations of ITEM1 & ITEM2}
  114.     P[SendToItem {ITEM1 ITEM2} ] := 2; {Put ITEM1 in location of ITEM2}
  115.     P[ReDirectTo] := 0;           {Re-Direct command to different VERB-NOUN-OBJECT}
  116.     P[RandomMessage] := 2;        {Select message between Num1 and Num2 and print it}
  117.     P[OpenNOUN {none} ] := 0;     {NOUN is now open}
  118.     P[CloseNOUN {none} ] := 0;    {NOUN is now closed}
  119.     P[LockNOUN {none} ] := 0;     {NOUN is now locked}
  120.     P[UnlockNOUN {none} ] := 0;   {NOUN is now unlocked}
  121.  
  122.     {**************** MISCELLANEOUS ACTION TOKENS ****************************}
  123.     {                 Type of   Number Of}
  124.     {TOKEN NAME     Parameters Parameters     Explanation}
  125.     {=============== =============  ==== ====================================}
  126.     P[ShowScore {none} ] := 0;    {Show current SCORE}
  127.     P[ShowInventory {none} ] := 0; {Show current INVENTORY}
  128.     P[WaitForReturn {none} ] := 0; {Prints 'Hit RETURN' message}
  129.     P[TimePasses {none} ] := 0;   {Show 'Time passes...' message}
  130.     P[CLEARSCREEN {none} ] := 0;  {Clears screen}
  131.     P[LookAtRoom {none} ] := 0;   {Cause a VERBOSE look at room}
  132.     P[BlankLine {none} ] := 0;    {Prints a blank line}
  133.     P[Tone {H M} ] := 2;          {makes a sound at H hertz for M milliseconds}
  134.     P[GetNumberInput {num1 num2} ] := 2; {Prompt for player to input a number}
  135.     {where num1 <= number <= num2}
  136.     {if num1=num2, then no range will be given in prompt}
  137.     P[ChangePassageway {dir# loc#} ] := 2; {Creates or closes a passageway}
  138.     {from current_room to loc# via dir#}
  139.     {dir# = 1 = north ... 12 = exit}
  140.     P[SetVariableTo {var# num#} ] := 2; {Set Variable var# to num#}
  141.     P[AddToVariable {var# num#} ] := 2; {Add num# to Variable var#}
  142.     P[SubtractFromVariable {var# num#} ] := 2; {Subtract num# from Variable #}
  143.     P[AddVariables {V1 V2} ] := 2; {Add V2 to V1 and put answer in V1}
  144.     P[SubtractVariables {V1 V2} ] := 2; {Subtract V2 from V1 and put answer in V1}
  145.     P[RandomVariable {V N} ] := 2; {Set variable V to random number [1 .. N]}
  146.     P[QuitThisCMD {none} ] := 0;  {Quit evaluating this CMD}
  147.     P[QuitAllCMDs {none} ] := 0;  {Finished with all special CMDs}
  148.     P[DoneWithTurn {none} ] := 0; {All Done this turn -- get input next}
  149.     P[WinGame {none} ] := 0;      {Player wins game at end of turn}
  150.     P[EndGame {none} ] := 0;      {game ends at end of turn}
  151.   END;                            {Set_Token_Parameters}
  152.  
  153.  
  154.   {        READ_Special_CMDS}
  155.   {Read Special_CMD file (if it exists) and}
  156.   {initialize the various special commands}
  157.   PROCEDURE Read_Special_CMDs;
  158.   LABEL Exit, DoneWithFile;
  159.   VAR i, j, n1, DataElement : Integer;
  160.     sentence : s;
  161.     fname, st, st2, verb, noun, prep, object_word : words;
  162.     ErrorInCommand : Boolean;
  163.  
  164.     {Process Token}
  165.     PROCEDURE Process(cmdTOKEN : Token);
  166.     VAR NumPara : Integer;
  167.     BEGIN                         {Process}
  168.       IF NOT ErrorInCommand THEN  {process only legal commands}
  169.         BEGIN
  170.           NumPara := P[cmdTOKEN];
  171.           IF ((DataElement+NumPara) > MaxSizeCommand) THEN
  172.             BEGIN
  173.               ErrorInCommand := True;
  174.               WriteLn('For Command # ', Last_CMD, '  ', verb, ' ', noun, ' ', object_word);
  175.               WriteLn('Maximum DATA size exceeded');
  176.             END
  177.           ELSE
  178.             BEGIN
  179.               SpecialCMD[Last_CMD]^.Data[DataElement] := Ord(cmdTOKEN);
  180.               IF NumPara > 0 THEN
  181.                 BEGIN
  182.                   sentence := But_First(sentence); {strips off Token}
  183.                   SpecialCMD[Last_CMD]^.Data[DataElement+1] := Value(sentence);
  184.                   IF ((cmdTOKEN = PrintMessage) AND (SpecialCMD[Last_CMD]^.Data[DataElement+1] = 0)) THEN
  185.                     BEGIN
  186.                       ErrorInCommand := True;
  187.                       WriteLn('For Command # ', Last_CMD, '  ', verb, ' ', noun, ' ', object_word);
  188.                       WriteLn('PrintMessage 0');
  189.                     END;
  190.                 END;
  191.               IF NumPara = 2 THEN
  192.                 BEGIN
  193.                   sentence := But_First(sentence); {strips off first parameter}
  194.                   SpecialCMD[Last_CMD]^.Data[DataElement+2] := Value(sentence);
  195.                 END;
  196.               DataElement := DataElement+NumPara+1;
  197.               {advance to place for next condition/action}
  198.             END;                  {ELSE}
  199.         END;                      {NOT ErrorInCommand}
  200.     END;                          {Process}
  201.  
  202.   BEGIN                           {read_Special_CMDs}
  203.     Skip_A_Line := False;
  204.     fname := Command_File_Name;
  205.     Last_CMD := 0;                {zero upper index limit to start with}
  206.     IF NOT File_Exists(fname) THEN
  207.       BEGIN
  208.         Any_Special_Cmds := False; {no special commands - so set flag and exit}
  209.         GOTO Exit;
  210.       END;
  211.     WriteLn;
  212.     WriteLn('Please be patient, just a minute or two longer!');
  213.     Any_Special_Cmds := True;     {special commands - so set flag}
  214.     Assign(datafile, Command_File_Name);
  215.     Reset(datafile);
  216.     {zero out the command information}
  217.     FOR i := 1 TO MaxCommand DO
  218.       BEGIN
  219.         New(SpecialCMD[i]);       {must create space in heap}
  220.         WITH SpecialCMD[i]^ DO
  221.           BEGIN
  222.             VerbNum := 0;
  223.             VerbCMD := '';
  224.             NounCMD := '';
  225.             ObjectCMD := '';
  226.             FOR j := 1 TO MaxSizeCommand DO
  227.               Data[j] := Ord(QuitThisCMD);
  228.           END;                    {WITH}
  229.       END;                        {for i := 1 to MaxCommand}
  230.  
  231.     ErrorInCommand := False;      {to start with}
  232.     REPEAT                        {until (sentence = 'END OF FILE') or (EOF(datafile))}
  233.       ReadLn(datafile, sentence);
  234.       Capitalize(sentence);
  235.       st := first_word(sentence);
  236.       IF (EOF(datafile)) THEN GOTO DoneWithFile;
  237.       IF (st = 'COMMAND') OR (st = 'C_') THEN
  238.         BEGIN
  239.           IF NOT ErrorInCommand THEN Last_CMD := Last_CMD+1; {update upper limit number}
  240.           {If last command was illegal, ignore it and write over it}
  241.           sentence := But_First(sentence);
  242.           IF Last_CMD > MaxCommand THEN
  243.             BEGIN
  244.               WriteLn('Too many commands!  Processing halted');
  245.               Halt;
  246.             END;
  247.           n1 := 0;
  248.           verb := 'ANY';
  249.           noun := 'ANY';
  250.           object_word := 'ANY';
  251.           st2 := first_word(sentence);
  252.           IF st2 <> '' THEN
  253.             BEGIN
  254.               ErrorInCommand := False; {to start with}
  255.               Handle_Word_Combinations(sentence);
  256.               CheckForName(sentence);
  257.               Parse(sentence, verb, noun, prep, object_word, ErrorInCommand);
  258.               IF verb = '' THEN verb := 'ANY';
  259.               IF noun = '' THEN noun := 'ANY';
  260.               IF object_word = '' THEN object_word := 'ANY';
  261.               n1 := Verb_Number(verb);
  262.               IF NameNum <> 0 THEN n1 := NameNum; {Name used for sort key}
  263.               IF ErrorInCommand THEN
  264.                 BEGIN
  265.                   WriteLn('in COMMAND ', sentence);
  266.                   WriteLn;
  267.                 END;
  268.             END;
  269.           SpecialCMD[Last_CMD]^.VerbNum := n1;
  270.           SpecialCMD[Last_CMD]^.VerbCMD := verb;
  271.           SpecialCMD[Last_CMD]^.NounCMD := noun;
  272.           SpecialCMD[Last_CMD]^.ObjectCMD := object_word;
  273.           DataElement := 1;
  274.           REPEAT                  {within COMMAND}
  275.             ReadLn(datafile, sentence);
  276.             Capitalize(sentence);
  277.             st := first_word(sentence);
  278.             IF st = 'NOT' THEN
  279.               BEGIN
  280.                 Process(LogicalNOT);
  281.                 sentence := But_First(sentence);
  282.                 st := first_word(sentence);
  283.               END;
  284.             IF st = 'ATLOCATION' THEN
  285.               Process(AtLocation)
  286.             ELSE IF st = 'ATLOCATIONGT' THEN
  287.               Process(AtLocationGT)
  288.             ELSE IF st = 'ATLOCATIONLT' THEN
  289.               Process(AtLocationLT)
  290.             ELSE IF st = 'FIRSTVISITTOROOM' THEN
  291.               Process(FirstVisitToRoom)
  292.             ELSE IF st = 'NEWLIFE' THEN
  293.               Process(NewLife)
  294.             ELSE IF st = 'LOADWEIGHTEQUALS' THEN
  295.               Process(LoadWeightEquals)
  296.             ELSE IF st = 'LOADWEIGHTGT' THEN
  297.               Process(LoadWeightGT)
  298.             ELSE IF st = 'LOADWEIGHTLT' THEN
  299.               Process(LoadWeightLT)
  300.             ELSE IF st = 'PRESENT' THEN
  301.               Process(Present)
  302.             ELSE IF st = 'ISWEARING' THEN
  303.               Process(IsWearing)
  304.             ELSE IF st = 'ISWEARINGNOTHING' THEN
  305.               Process(IsWearingNothing)
  306.             ELSE IF st = 'ISWEARINGSOMETHING' THEN
  307.               Process(IsWearingSomething)
  308.             ELSE IF st = 'ISCARRYING' THEN
  309.               Process(IsCarrying)
  310.             ELSE IF st = 'ISCARRYINGSOMETHING' THEN
  311.               Process(IsCarryingSomething)
  312.             ELSE IF st = 'ISCARRYINGNOTHING' THEN
  313.               Process(IsCarryingNothing)
  314.             ELSE IF st = 'ISCARRYINGTREASURE' THEN
  315.               Process(IsCarryingTreasure)
  316.             ELSE IF st = 'LIGHTPRESENT' THEN
  317.               Process(LightPresent)
  318.             ELSE IF st = 'ROOMNEEDSLIGHT' THEN
  319.               Process(RoomNeedsLight)
  320.             ELSE IF st = 'ISNOWHERE' THEN
  321.               Process(IsNowhere)
  322.             ELSE IF st = 'ISSOMEWHERE' THEN
  323.               Process(IsSomewhere)
  324.             ELSE IF st = 'INROOM' THEN
  325.               Process(InRoom)
  326.             ELSE IF st = 'ISLOCATED' THEN
  327.               Process(IsLocated)
  328.             ELSE IF st = 'TOGETHER' THEN
  329.               Process(Together)
  330.             ELSE IF st = 'ISON' THEN
  331.               Process(IsON)
  332.             ELSE IF st = 'ISOFF' THEN
  333.               Process(IsOFF)
  334.             ELSE IF st = 'ISGROUPMEMBER' THEN
  335.               Process(IsGroupMember)
  336.             ELSE IF st = 'ISOPEN' THEN
  337.               Process(IsOpen)
  338.             ELSE IF st = 'ISCLOSED' THEN
  339.               Process(IsClosed)
  340.             ELSE IF st = 'ISLOCKED' THEN
  341.               Process(IsLocked)
  342.             ELSE IF st = 'ISUNLOCKED' THEN
  343.               Process(IsUnLocked)
  344.             ELSE IF st = 'ISEDIBLE' THEN
  345.               Process(IsEdible)
  346.             ELSE IF st = 'ISDRINKABLE' THEN
  347.               Process(IsDrinkable)
  348.             ELSE IF st = 'ISPOISONOUS' THEN
  349.               Process(IsPoisonous)
  350.             ELSE IF st = 'ISMOVABLE' THEN
  351.               Process(IsMovable)
  352.             ELSE IF st = 'NOUNPRESENT' THEN
  353.               Process(NOUNPresent)
  354.             ELSE IF st = 'NOUNISWEARING' THEN
  355.               Process(NOUNIsWearing)
  356.             ELSE IF st = 'NOUNISCARRYING' THEN
  357.               Process(NOUNIsCarrying)
  358.             ELSE IF st = 'NOUNISNOWHERE' THEN
  359.               Process(NOUNIsNowhere)
  360.             ELSE IF st = 'NOUNISSOMEWHERE' THEN
  361.               Process(NOUNIsSomewhere)
  362.             ELSE IF st = 'NOUNINROOM' THEN
  363.               Process(NOUNInRoom)
  364.             ELSE IF st = 'NOUNISLOCATED' THEN
  365.               Process(NOUNIsLocated)
  366.             ELSE IF st = 'NOUNISON' THEN
  367.               Process(NOUNIsON)
  368.             ELSE IF st = 'NOUNISOFF' THEN
  369.               Process(NOUNIsOFF)
  370.             ELSE IF st = 'NOUNISOPEN' THEN
  371.               Process(NOUNIsOpen)
  372.             ELSE IF st = 'NOUNISCLOSED' THEN
  373.               Process(NOUNIsClosed)
  374.             ELSE IF st = 'NOUNISLOCKED' THEN
  375.               Process(NOUNIsLocked)
  376.             ELSE IF st = 'NOUNISUNLOCKED' THEN
  377.               Process(NOUNIsUnLocked)
  378.             ELSE IF st = 'NOUNISEDIBLE' THEN
  379.               Process(NOUNIsEdible)
  380.             ELSE IF st = 'NOUNISDRINKABLE' THEN
  381.               Process(NOUNIsDrinkable)
  382.             ELSE IF st = 'NOUNISPOISONOUS' THEN
  383.               Process(NOUNIsPoisonous)
  384.             ELSE IF st = 'NOUNISMOVABLE' THEN
  385.               Process(NOUNIsMovable)
  386.             ELSE IF st = 'NOUNPOINTSEQUALS' THEN
  387.               Process(NOUNpointsEquals)
  388.             ELSE IF st = 'NOUNPOINTSGT' THEN
  389.               Process(NOUNpointsGT)
  390.             ELSE IF st = 'NOUNPOINTSLT' THEN
  391.               Process(NOUNpointsLT)
  392.             ELSE IF st = 'NOUNWEIGHTEQUALS' THEN
  393.               Process(NOUNweightEquals)
  394.             ELSE IF st = 'NOUNWEIGHTGT' THEN
  395.               Process(NOUNweightGT)
  396.             ELSE IF st = 'NOUNWEIGHTLT' THEN
  397.               Process(NOUNweightLT)
  398.             ELSE IF st = 'FLAGON' THEN
  399.               Process(FlagON)
  400.             ELSE IF st = 'FLAGOFF' THEN
  401.               Process(FlagOFF)
  402.             ELSE IF st = 'SCOREEQUALS' THEN
  403.               Process(ScoreEquals)
  404.             ELSE IF st = 'SCOREGT' THEN
  405.               Process(ScoreGT)
  406.             ELSE IF st = 'SCORELT' THEN
  407.               Process(ScoreLT)
  408.             ELSE IF st = 'NUMBEREQUALS' THEN
  409.               Process(NumberEquals)
  410.             ELSE IF st = 'NUMBERGT' THEN
  411.               Process(NumberGT)
  412.             ELSE IF st = 'NUMBERLT' THEN
  413.               Process(NumberLT)
  414.             ELSE IF st = 'TURNSEQUALS' THEN
  415.               Process(TurnsEquals)
  416.             ELSE IF st = 'TURNSGT' THEN
  417.               Process(TurnsGT)
  418.             ELSE IF st = 'TURNSLT' THEN
  419.               Process(TurnsLT)
  420.             ELSE IF st = 'ANSWERISCORRECT' THEN
  421.               Process(AnswerIsCorrect)
  422.             ELSE IF st = 'ANSWERISWRONG' THEN
  423.               Process(AnswerIsWrong)
  424.             ELSE IF st = 'COUNTEREQUALS' THEN
  425.               Process(CounterEquals)
  426.             ELSE IF st = 'COUNTERGT' THEN
  427.               Process(CounterGT)
  428.             ELSE IF st = 'COUNTERLT' THEN
  429.               Process(CounterLT)
  430.             ELSE IF st = 'VARIABLEEQUALS' THEN
  431.               Process(VariableEquals)
  432.             ELSE IF st = 'VARIABLEGT' THEN
  433.               Process(VariableGT)
  434.             ELSE IF st = 'VARIABLELT' THEN
  435.               Process(VariableLT)
  436.             ELSE IF st = 'CHANCE' THEN
  437.               Process(Chance)
  438.             ELSE IF st = 'VARIABLECHANCE' THEN
  439.               Process(VariableChance)
  440.             ELSE IF st = 'COMPAREVARIABLES' THEN
  441.               Process(CompareVariables)
  442.             ELSE IF st = 'NAMEPRESENT' THEN
  443.               Process(NamePresent)
  444.             ELSE IF st = 'NAMEISNUMBER' THEN
  445.               Process(NameIsNumber)
  446.             ELSE IF st = 'NOUNISNUMBER' THEN
  447.               Process(NOUNIsNumber)
  448.             ELSE IF st = 'OBJECTISNUMBER' THEN
  449.               Process(ObjectIsNumber)
  450.             ELSE IF st = 'PROMPTFORYES' THEN
  451.               Process(PromptForYES)
  452.             ELSE IF st = 'PROMPTFORNO' THEN
  453.               Process(PromptForNO)
  454.             ELSE IF st = 'VERBISDIRECTION' THEN
  455.               Process(VerbIsDirection)
  456.             ELSE IF st = 'MAKEVARROOMNUM' THEN
  457.               Process(MakeVarRoomNum)
  458.             ELSE IF st = 'MAKEVARNOUNNUM' THEN
  459.               Process(MakeVarNounNum)
  460.             ELSE IF st = 'MAKEVAROBJECTNUM' THEN
  461.               Process(MakeVarObjectNum)
  462.             ELSE IF st = 'GOTOVARIABLEROOM' THEN
  463.               Process(GoToVariableRoom)
  464.             ELSE IF st = 'SENDTOVARIABLEROOM' THEN
  465.               Process(SendToVariableRoom)
  466.             ELSE IF st = 'GETVARIABLEIT' THEN
  467.               Process(GetVariableIt)
  468.             ELSE IF st = 'PRINTVARIABLEMESSAGE' THEN
  469.               Process(PrintVariableMessage)
  470.             ELSE IF st = 'NOUNISCREATURE' THEN
  471.               Process(NounIsCreature)
  472.             ELSE IF st = 'OBJECTISCREATURE' THEN
  473.               Process(ObjectIsCreature)
  474.             ELSE IF st = 'OBJECTPRESENT' THEN
  475.               Process(ObjectPresent)
  476.             ELSE IF st = 'NOT' THEN {"NOT" is used in CMD file, LogicalNOT is token}
  477.               Process(LogicalNOT)
  478.             ELSE IF st = 'OR' THEN {"OR" is used in CMD file, LogicalOR is token}
  479.               Process(LogicalOR)
  480.             ELSE IF st = 'GOTOROOM' THEN
  481.               Process(GoToRoom)
  482.             ELSE IF st = 'GOTORANDOMROOM' THEN
  483.               Process(GoToRandomRoom)
  484.             ELSE IF st = 'GETIT' THEN
  485.               Process(GetIt)
  486.             ELSE IF st = 'SOMETHINGINSIDE' THEN
  487.               Process(SomethingInside)
  488.             ELSE IF st = 'SHOWCONTENTS' THEN
  489.               Process(ShowContents)
  490.             ELSE IF st = 'WEARIT' THEN
  491.               Process(WearIt)
  492.             ELSE IF st = 'DROPIT' THEN
  493.               Process(DropIt)
  494.             ELSE IF st = 'REMOVEIT' THEN
  495.               Process(RemoveIt)
  496.             ELSE IF st = 'GETNOUN' THEN
  497.               Process(GetNOUN)
  498.             ELSE IF st = 'WEARNOUN' THEN
  499.               Process(WearNOUN)
  500.             ELSE IF st = 'DROPNOUN' THEN
  501.               Process(DropNOUN)
  502.             ELSE IF st = 'REMOVENOUN' THEN
  503.               Process(RemoveNOUN)
  504.             ELSE IF st = 'ADDTOGROUP' THEN
  505.               Process(AddToGroup)
  506.             ELSE IF st = 'REMOVEFROMGROUP' THEN
  507.               Process(RemoveFromGroup)
  508.             ELSE IF st = 'MOVETHEGROUP' THEN
  509.               Process(MoveTheGroup)
  510.             ELSE IF st = 'REDIRECTTO' THEN
  511.               BEGIN
  512.                 Process(ReDirectTo); {store token}
  513.                 sentence := But_First(sentence); {strip off REDIRECTTO}
  514.                 Handle_Word_Combinations(sentence);
  515.                 CheckForName(sentence);
  516.                 Parse(sentence, verb, noun, prep, object_word, ErrorInCommand);
  517.                 IF verb = '' THEN verb := 'ANY';
  518.                 IF noun = '' THEN noun := 'ANY';
  519.                 IF object_word = '' THEN object_word := 'ANY';
  520.                 n1 := Verb_Number(verb);
  521.                 IF NameNum <> 0 THEN n1 := NameNum; {Name used for sort key}
  522.                 n1 := n1+2000;    {make n1 > 1999 to signify re-direction}
  523.                 Last_CMD := Last_CMD+1; {go to next command to store data}
  524.                 IF Last_CMD <= MaxCommand THEN
  525.                   BEGIN           {store data on VERB-NOUN-OBJECT combination for re-direction}
  526.                     SpecialCMD[Last_CMD]^.VerbNum := n1;
  527.                     SpecialCMD[Last_CMD]^.VerbCMD := verb;
  528.                     SpecialCMD[Last_CMD]^.NounCMD := noun;
  529.                     SpecialCMD[Last_CMD]^.ObjectCMD := object_word;
  530.                   END
  531.                 ELSE
  532.                   BEGIN
  533.                     WriteLn('Too many commands!  Processing halted');
  534.                     Halt;
  535.                   END;
  536.               END                 {ReDirectTo}
  537.             ELSE IF st = 'RANDOMMESSAGE' THEN
  538.               Process(RandomMessage)
  539.             ELSE IF st = 'OPENIT' THEN
  540.               Process(OpenIt)
  541.             ELSE IF st = 'CLOSEIT' THEN
  542.               Process(CloseIt)
  543.             ELSE IF st = 'LOCKIT' THEN
  544.               Process(LockIt)
  545.             ELSE IF st = 'UNLOCKIT' THEN
  546.               Process(UnlockIt)
  547.             ELSE IF st = 'OPENNOUN' THEN
  548.               Process(OpenNOUN)
  549.             ELSE IF st = 'CLOSENOUN' THEN
  550.               Process(CloseNOUN)
  551.             ELSE IF st = 'LOCKNOUN' THEN
  552.               Process(LockNOUN)
  553.             ELSE IF st = 'UNLOCKNOUN' THEN
  554.               Process(UnlockNOUN)
  555.             ELSE IF st = 'DROPEVERYTHING' THEN
  556.               Process(DropEverything)
  557.             ELSE IF st = 'REMOVEEVERYTHING' THEN
  558.               Process(RemoveEverything)
  559.             ELSE IF st = 'KILLPLAYER' THEN
  560.               Process(KillPlayer)
  561.             ELSE IF st = 'PUTINCURRENTROOM' THEN
  562.               Process(PutInCurrentRoom)
  563.             ELSE IF st = 'SENDTOROOM' THEN
  564.               Process(SendToRoom)
  565.             ELSE IF st = 'PUTNOUNINCURRENTROOM' THEN
  566.               Process(PutNOUNInCurrentRoom)
  567.             ELSE IF st = 'SENDNOUNTOROOM' THEN
  568.               Process(SendNOUNToRoom)
  569.             ELSE IF st = 'SENDALLTOROOM' THEN
  570.               Process(SendAllToRoom)
  571.             ELSE IF st = 'SENDTREASURESTOROOM' THEN
  572.               Process(SendTreasuresToRoom)
  573.             ELSE IF st = 'RELOCATEALL' THEN
  574.               Process(RelocateAll)
  575.             ELSE IF st = 'DESTROY' THEN
  576.               Process(Destroy)
  577.             ELSE IF st = 'DESTROYNOUN' THEN
  578.               Process(DestroyNOUN)
  579.             ELSE IF st = 'SWAPLOCATIONS' THEN
  580.               Process(SwapLocations)
  581.             ELSE IF st = 'SENDTOITEM' THEN
  582.               Process(SendToItem)
  583.             ELSE IF st = 'SENDNOUNTOITEM' THEN
  584.               Process(SendNOUNToItem)
  585.             ELSE IF st = 'SHOWSCORE' THEN
  586.               Process(ShowScore)
  587.             ELSE IF st = 'PLUSSCORE' THEN
  588.               Process(PlusScore)
  589.             ELSE IF st = 'MINUSSCORE' THEN
  590.               Process(MinusScore)
  591.             ELSE IF st = 'SHOWINVENTORY' THEN
  592.               Process(ShowInventory)
  593.             ELSE IF st = 'WAITFORRETURN' THEN
  594.               Process(WaitForReturn)
  595.             ELSE IF st = 'TIMEPASSES' THEN
  596.               Process(TimePasses)
  597.             ELSE IF st = 'DELAY' THEN
  598.               Process(xDelay)
  599.             ELSE IF st = 'CLEARSCREEN' THEN
  600.               Process(CLEARSCREEN)
  601.             ELSE IF st = 'DESCRIBETHING' THEN
  602.               Process(DescribeThing)
  603.             ELSE IF st = 'LOOKATROOM' THEN
  604.               Process(LookAtRoom)
  605.             ELSE IF st = 'PRINTMESSAGE' THEN
  606.                 Process(PrintMessage)
  607.             ELSE IF st = 'BLANKLINE' THEN
  608.               Process(BlankLine)
  609.             ELSE IF st = 'TONE' THEN
  610.               Process(Tone)
  611.             ELSE IF st = 'GETNUMBERINPUT' THEN
  612.               Process(GetNumberInput)
  613.             ELSE IF st = 'ASKQUESTION' THEN
  614.               Process(AskQuestion)
  615.             ELSE IF st = 'CHANGEPASSAGEWAY' THEN
  616.               Process(ChangePassageway)
  617.             ELSE IF st = 'TURNFLAGON' THEN
  618.               Process(TurnFlagON)
  619.             ELSE IF st = 'TURNFLAGOFF' THEN
  620.               Process(TurnFlagOFF)
  621.             ELSE IF st = 'TOGGLEFLAG' THEN
  622.               Process(ToggleFlag)
  623.             ELSE IF st = 'TURNCOUNTERON' THEN
  624.               Process(TurnCounterON)
  625.             ELSE IF st = 'TURNCOUNTEROFF' THEN
  626.               Process(TurnCounterOFF)
  627.             ELSE IF st = 'SETVARIABLETO' THEN
  628.               Process(SetVariableTo)
  629.             ELSE IF st = 'ADDTOVARIABLE' THEN
  630.               Process(AddToVariable)
  631.             ELSE IF st = 'SUBTRACTFROMVARIABLE' THEN
  632.               Process(SubtractFromVariable)
  633.             ELSE IF st = 'ADDVARIABLES' THEN
  634.               Process(AddVariables)
  635.             ELSE IF st = 'SUBTRACTVARIABLES' THEN
  636.               Process(SubtractVariables)
  637.             ELSE IF st = 'RANDOMVARIABLE' THEN
  638.               Process(RandomVariable)
  639.             ELSE IF st = 'NOUNTOVARIABLE' THEN
  640.               Process(NounToVariable)
  641.             ELSE IF st = 'OBJECTTOVARIABLE' THEN
  642.               Process(ObjectToVariable)
  643.             ELSE IF st = 'QUITTHISCMD' THEN
  644.               Process(QuitThisCMD)
  645.             ELSE IF st = 'QUITALLCMDS' THEN
  646.               Process(QuitAllCMDs)
  647.             ELSE IF st = 'DONEWITHTURN' THEN
  648.               Process(DoneWithTurn)
  649.             ELSE IF st = 'WINGAME' THEN
  650.               Process(WinGame)
  651.             ELSE IF st = 'ENDGAME' THEN
  652.               Process(EndGame)
  653.             ELSE IF (Copy(st, 1, 4) <> 'END_') THEN
  654.               BEGIN
  655.                 WriteLn('Illegal Token: ', sentence);
  656.                 WriteLn('For Command: ', verb, ' ', noun, ' ', object_word);
  657.                 WriteLn;
  658.               END;
  659.           UNTIL (Copy(st, 1, 4) = 'END_');
  660.         END;                      {IF COMMAND}
  661.  
  662. DoneWithFile:
  663.     UNTIL (POS('END OF FILE', sentence) <> 0) OR (EOF(datafile));
  664.     Close(datafile);
  665.     {Now determine indices for index sequential searches of SpecialCMDs}
  666.     IF ErrorInCommand THEN Last_CMD := Last_CMD-1;
  667.     {If last command was illegal, then ignore it}
  668.     FOR i := 1 TO Last_CMD DO
  669.       BEGIN
  670.         j := SpecialCMD[i]^.VerbNum;
  671.         IF j < 2000 THEN
  672.           BEGIN                   {Not a ReDirectTo command}
  673.             IF i < StartingIndex[j] THEN StartingIndex[j] := i;
  674.             {get minimum starting index for each verb}
  675.             IF i > EndingIndex[j] THEN EndingIndex[j] := i;
  676.             {get maximum ending index for each verb}
  677.           END;
  678.       END;                        {i := 1 TO Last_CMD}
  679. Exit:
  680.     Skip_A_Line := True;
  681.   END;                            {READ_SPECIAL_CMDS}
  682.  
  683.  
  684.