home *** CD-ROM | disk | FTP | other *** search
-
- {COMMAND.PA2}
-
- {Set_Token_Parameters}
-
- PROCEDURE Set_Token_Parameters;
- VAR i : Token;
-
- BEGIN
- FOR i := AtLocation TO DoneWithTurn
- DO P[i] := 1; {set all parameter values to 1}
-
- {Now deal with exceptions, i.e., parameter values of 0 and 2}
-
- {*************************************************************************}
- {* C O N D I T I O N T O K E N S *}
- {*************************************************************************}
-
- {********************** PLAYER CONDITIONS ****************************}
- { Type of Number Of}
- {TOKEN NAME Parameters Parameters Explanation}
- {=============== ============= ==== ====================================}
- P[IsCarryingSomething {None} ] := 0; {Player is carrying something}
- P[IsCarryingNothing {None} ] := 0; {Player is carrying nothing}
- {worth at least PTS# points}
- P[IsWearingSomething {None} ] := 0; {Player is wearing something}
- P[IsWearingNothing {None} ] := 0; {Player is wearing nothing}
- P[FirstVisitToRoom {None} ] := 0; {Player is in current room for first time}
- P[NewLife {None} ] := 0; {Player is starting game or has just been resurrected}
-
- {********************** ITEM CONDITIONS **********************************}
- { Type of Number Of}
- {TOKEN NAME Parameters Parameters Explanation}
- {=============== ============= ==== ========================================}
- P[IsLocated {ITEM# loc#} ] := 2; {ITEM# is located in room loc#}
- P[Together {ITEM# ITEM#} ] := 2; {ITEM# and ITEM# are in same place}
-
- {********************* NOUN CONDITIONS *******************************}
- { Type of Number Of}
- {TOKEN NAME Parameters Parameters Explanation}
- {=============== ============= ==== ====================================}
- P[NOUNPresent {none} ] := 0; {NOUN ITEM is in room, carried or worn}
- P[NOUNIsWearing {none} ] := 0; {NOUN ITEM is being worn}
- P[NOUNIsCarrying {none} ] := 0; {NOUN ITEM is being carried}
- P[NOUNIsNowhere {none} ] := 0; {NOUN ITEM is located NOWHERE (room 0)}
- P[NOUNIsSomewhere {none} ] := 0; {NOUN ITEM is located somewhere}
- P[NOUNInRoom {none} ] := 0; {NOUN ITEM is located in current room}
- P[NOUNIsON {none} ] := 0; {NOUN ITEM is ON}
- P[NOUNIsOFF {none} ] := 0; {NOUN ITEM is OFF}
- P[NOUNIsOpen {none} ] := 0; {NOUN ITEM is Open}
- P[NOUNIsClosed {none} ] := 0; {NOUN ITEM is Closed}
- P[NOUNIsLocked {none} ] := 0; {NOUN ITEM is Locked}
- P[NOUNIsUnLocked {none} ] := 0; {NOUN ITEM is UnLocked}
- P[NOUNIsEdible {none} ] := 0; {NOUN ITEM is Edible}
- P[NOUNIsDrinkable {none} ] := 0; {NOUN ITEM is Drinkable}
- P[NOUNIsPoisonous {none} ] := 0; {NOUN ITEM is Poisonous}
- P[NOUNIsMovable {none} ] := 0; {NOUN ITEM is Movable}
-
- {***************** MISCELLANEOUS CONDITIONS **************************}
- { Type of Number Of}
- {TOKEN NAME Parameters Parameters Explanation}
- {=============== ============= ==== ====================================}
- P[LightPresent {none} ] := 0; {Room has necessary light}
- P[RoomNeedsLight {none} ] := 0; {Room needs a light}
- P[AnswerIsCorrect {none} ] := 0; {last answer was correct}
- P[AnswerIsWrong {none} ] := 0; {last answer was wrong}
- P[CounterEquals {ctr# num} ] := 2; {Counter # is equal to num}
- P[CounterGT {ctr# num} ] := 2; {Counter # is greater than num}
- P[CounterLT {ctr# num} ] := 2; {Counter # is less than num}
- P[VariableEquals {var# num} ] := 2; {Variable # is equal to num}
- P[VariableGT {var# num} ] := 2; {Variable # is greater than num}
- P[VariableLT {var# num} ] := 2; {Variable # is less than num}
- P[CompareVariables {V1 V2} ] := 2; {TRUE if V1 < V2 }
- P[VariableChance {V N} ] := 2; {TRUE if V < Random(1..N)}
- P[NamePresent {none} ] := 0; {TRUE if Name being addressed is at location or No Name addressed}
- P[PromptForYES {none} ] := 0; {Prompts for Y or N -- Ok if Yes}
- P[PromptForNO {none} ] := 0; {Prompts for Y or N -- Ok if No}
- P[VerbIsDirection {none} ] := 0; {Verb is movement or direction}
- P[NounIsCreature] := 0; {TRUE if noun is a creature}
- P[ObjectIsCreature] := 0; {TRUE if object is a creature}
- P[ObjectPresent] := 0; {TRUE if object is present in room}
- P[LogicalNOT {none} ] := 0; {Logical NOT of current condition}
- P[LogicalOR {none} ] := 0; {Logical OR of conditions}
-
- {*************************************************************************}
- {* A C T I O N T O K E N S *}
- {*************************************************************************}
-
- {******************* PLAYER ACTION TOKENS ********************************}
- { Type of Number Of}
- {TOKEN NAME Parameters Parameters Explanation}
- {=============== ============= ==== ====================================}
- P[GoToRandomRoom {R1 R2} ] := 2; {Send player to Room >= R1 and <= R2}
- P[SendToVariableRoom] := 2; {Item# Var# -- will send Item# to room number Var#}
- P[GetNOUN {none} ] := 0; {NOUN is now being carried}
- P[WearNOUN {none} ] := 0; {NOUN is now being worn}
- P[DropNOUN {none} ] := 0; {Drops NOUN into current room}
- P[RemoveNOUN {none} ] := 0; {Removes NOUN and drops into room}
- P[DropEverything {none} ] := 0; {Drop all items being carried}
- P[RemoveEverything {none} ] := 0; {Remove all items being worn}
- P[KillPlayer {none} ] := 0; {Makes player dead}
-
- {************** ITEM/NOUN/LOCATION ACTION TOKENS *************************}
- { Type of Number Of}
- {TOKEN NAME Parameters Parameters Explanation}
- {=============== ============= ==== ====================================}
- P[PutNOUNInCurrentRoom {none} ] := 0; {Put NOUN in current room}
- P[SendToRoom {ITEM# loc#} ] := 2; {Put ITEM# in room loc#}
- P[SendTreasuresToRoom {loc# pts#} ] := 2; {Send all carried ITEMs whose}
- {points > pts# to loc#}
- P[RelocateAll {loc1 loc2} ] := 2; {Move all items at loc1 to loc2}
- P[DestroyNOUN {none} ] := 0; {NOUN is now NOWHERE (room 0)}
- P[SwapLocations {ITEM1 ITEM2} ] := 2; {swap locations of ITEM1 & ITEM2}
- P[SendToItem {ITEM1 ITEM2} ] := 2; {Put ITEM1 in location of ITEM2}
- P[ReDirectTo] := 0; {Re-Direct command to different VERB-NOUN-OBJECT}
- P[RandomMessage] := 2; {Select message between Num1 and Num2 and print it}
- P[OpenNOUN {none} ] := 0; {NOUN is now open}
- P[CloseNOUN {none} ] := 0; {NOUN is now closed}
- P[LockNOUN {none} ] := 0; {NOUN is now locked}
- P[UnlockNOUN {none} ] := 0; {NOUN is now unlocked}
-
- {**************** MISCELLANEOUS ACTION TOKENS ****************************}
- { Type of Number Of}
- {TOKEN NAME Parameters Parameters Explanation}
- {=============== ============= ==== ====================================}
- P[ShowScore {none} ] := 0; {Show current SCORE}
- P[ShowInventory {none} ] := 0; {Show current INVENTORY}
- P[WaitForReturn {none} ] := 0; {Prints 'Hit RETURN' message}
- P[TimePasses {none} ] := 0; {Show 'Time passes...' message}
- P[CLEARSCREEN {none} ] := 0; {Clears screen}
- P[LookAtRoom {none} ] := 0; {Cause a VERBOSE look at room}
- P[BlankLine {none} ] := 0; {Prints a blank line}
- P[Tone {H M} ] := 2; {makes a sound at H hertz for M milliseconds}
- P[GetNumberInput {num1 num2} ] := 2; {Prompt for player to input a number}
- {where num1 <= number <= num2}
- {if num1=num2, then no range will be given in prompt}
- P[ChangePassageway {dir# loc#} ] := 2; {Creates or closes a passageway}
- {from current_room to loc# via dir#}
- {dir# = 1 = north ... 12 = exit}
- P[SetVariableTo {var# num#} ] := 2; {Set Variable var# to num#}
- P[AddToVariable {var# num#} ] := 2; {Add num# to Variable var#}
- P[SubtractFromVariable {var# num#} ] := 2; {Subtract num# from Variable #}
- P[AddVariables {V1 V2} ] := 2; {Add V2 to V1 and put answer in V1}
- P[SubtractVariables {V1 V2} ] := 2; {Subtract V2 from V1 and put answer in V1}
- P[RandomVariable {V N} ] := 2; {Set variable V to random number [1 .. N]}
- P[QuitThisCMD {none} ] := 0; {Quit evaluating this CMD}
- P[QuitAllCMDs {none} ] := 0; {Finished with all special CMDs}
- P[DoneWithTurn {none} ] := 0; {All Done this turn -- get input next}
- P[WinGame {none} ] := 0; {Player wins game at end of turn}
- P[EndGame {none} ] := 0; {game ends at end of turn}
- END; {Set_Token_Parameters}
-
-
- { READ_Special_CMDS}
- {Read Special_CMD file (if it exists) and}
- {initialize the various special commands}
- PROCEDURE Read_Special_CMDs;
- LABEL Exit, DoneWithFile;
- VAR i, j, n1, DataElement : Integer;
- sentence : s;
- fname, st, st2, verb, noun, prep, object_word : words;
- ErrorInCommand : Boolean;
-
- {Process Token}
- PROCEDURE Process(cmdTOKEN : Token);
- VAR NumPara : Integer;
- BEGIN {Process}
- IF NOT ErrorInCommand THEN {process only legal commands}
- BEGIN
- NumPara := P[cmdTOKEN];
- IF ((DataElement+NumPara) > MaxSizeCommand) THEN
- BEGIN
- ErrorInCommand := True;
- WriteLn('For Command # ', Last_CMD, ' ', verb, ' ', noun, ' ', object_word);
- WriteLn('Maximum DATA size exceeded');
- END
- ELSE
- BEGIN
- SpecialCMD[Last_CMD]^.Data[DataElement] := Ord(cmdTOKEN);
- IF NumPara > 0 THEN
- BEGIN
- sentence := But_First(sentence); {strips off Token}
- SpecialCMD[Last_CMD]^.Data[DataElement+1] := Value(sentence);
- IF ((cmdTOKEN = PrintMessage) AND (SpecialCMD[Last_CMD]^.Data[DataElement+1] = 0)) THEN
- BEGIN
- ErrorInCommand := True;
- WriteLn('For Command # ', Last_CMD, ' ', verb, ' ', noun, ' ', object_word);
- WriteLn('PrintMessage 0');
- END;
- END;
- IF NumPara = 2 THEN
- BEGIN
- sentence := But_First(sentence); {strips off first parameter}
- SpecialCMD[Last_CMD]^.Data[DataElement+2] := Value(sentence);
- END;
- DataElement := DataElement+NumPara+1;
- {advance to place for next condition/action}
- END; {ELSE}
- END; {NOT ErrorInCommand}
- END; {Process}
-
- BEGIN {read_Special_CMDs}
- Skip_A_Line := False;
- fname := Command_File_Name;
- Last_CMD := 0; {zero upper index limit to start with}
- IF NOT File_Exists(fname) THEN
- BEGIN
- Any_Special_Cmds := False; {no special commands - so set flag and exit}
- GOTO Exit;
- END;
- WriteLn;
- WriteLn('Please be patient, just a minute or two longer!');
- Any_Special_Cmds := True; {special commands - so set flag}
- Assign(datafile, Command_File_Name);
- Reset(datafile);
- {zero out the command information}
- FOR i := 1 TO MaxCommand DO
- BEGIN
- New(SpecialCMD[i]); {must create space in heap}
- WITH SpecialCMD[i]^ DO
- BEGIN
- VerbNum := 0;
- VerbCMD := '';
- NounCMD := '';
- ObjectCMD := '';
- FOR j := 1 TO MaxSizeCommand DO
- Data[j] := Ord(QuitThisCMD);
- END; {WITH}
- END; {for i := 1 to MaxCommand}
-
- ErrorInCommand := False; {to start with}
- REPEAT {until (sentence = 'END OF FILE') or (EOF(datafile))}
- ReadLn(datafile, sentence);
- Capitalize(sentence);
- st := first_word(sentence);
- IF (EOF(datafile)) THEN GOTO DoneWithFile;
- IF (st = 'COMMAND') OR (st = 'C_') THEN
- BEGIN
- IF NOT ErrorInCommand THEN Last_CMD := Last_CMD+1; {update upper limit number}
- {If last command was illegal, ignore it and write over it}
- sentence := But_First(sentence);
- IF Last_CMD > MaxCommand THEN
- BEGIN
- WriteLn('Too many commands! Processing halted');
- Halt;
- END;
- n1 := 0;
- verb := 'ANY';
- noun := 'ANY';
- object_word := 'ANY';
- st2 := first_word(sentence);
- IF st2 <> '' THEN
- BEGIN
- ErrorInCommand := False; {to start with}
- Handle_Word_Combinations(sentence);
- CheckForName(sentence);
- Parse(sentence, verb, noun, prep, object_word, ErrorInCommand);
- IF verb = '' THEN verb := 'ANY';
- IF noun = '' THEN noun := 'ANY';
- IF object_word = '' THEN object_word := 'ANY';
- n1 := Verb_Number(verb);
- IF NameNum <> 0 THEN n1 := NameNum; {Name used for sort key}
- IF ErrorInCommand THEN
- BEGIN
- WriteLn('in COMMAND ', sentence);
- WriteLn;
- END;
- END;
- SpecialCMD[Last_CMD]^.VerbNum := n1;
- SpecialCMD[Last_CMD]^.VerbCMD := verb;
- SpecialCMD[Last_CMD]^.NounCMD := noun;
- SpecialCMD[Last_CMD]^.ObjectCMD := object_word;
- DataElement := 1;
- REPEAT {within COMMAND}
- ReadLn(datafile, sentence);
- Capitalize(sentence);
- st := first_word(sentence);
- IF st = 'NOT' THEN
- BEGIN
- Process(LogicalNOT);
- sentence := But_First(sentence);
- st := first_word(sentence);
- END;
- IF st = 'ATLOCATION' THEN
- Process(AtLocation)
- ELSE IF st = 'ATLOCATIONGT' THEN
- Process(AtLocationGT)
- ELSE IF st = 'ATLOCATIONLT' THEN
- Process(AtLocationLT)
- ELSE IF st = 'FIRSTVISITTOROOM' THEN
- Process(FirstVisitToRoom)
- ELSE IF st = 'NEWLIFE' THEN
- Process(NewLife)
- ELSE IF st = 'LOADWEIGHTEQUALS' THEN
- Process(LoadWeightEquals)
- ELSE IF st = 'LOADWEIGHTGT' THEN
- Process(LoadWeightGT)
- ELSE IF st = 'LOADWEIGHTLT' THEN
- Process(LoadWeightLT)
- ELSE IF st = 'PRESENT' THEN
- Process(Present)
- ELSE IF st = 'ISWEARING' THEN
- Process(IsWearing)
- ELSE IF st = 'ISWEARINGNOTHING' THEN
- Process(IsWearingNothing)
- ELSE IF st = 'ISWEARINGSOMETHING' THEN
- Process(IsWearingSomething)
- ELSE IF st = 'ISCARRYING' THEN
- Process(IsCarrying)
- ELSE IF st = 'ISCARRYINGSOMETHING' THEN
- Process(IsCarryingSomething)
- ELSE IF st = 'ISCARRYINGNOTHING' THEN
- Process(IsCarryingNothing)
- ELSE IF st = 'ISCARRYINGTREASURE' THEN
- Process(IsCarryingTreasure)
- ELSE IF st = 'LIGHTPRESENT' THEN
- Process(LightPresent)
- ELSE IF st = 'ROOMNEEDSLIGHT' THEN
- Process(RoomNeedsLight)
- ELSE IF st = 'ISNOWHERE' THEN
- Process(IsNowhere)
- ELSE IF st = 'ISSOMEWHERE' THEN
- Process(IsSomewhere)
- ELSE IF st = 'INROOM' THEN
- Process(InRoom)
- ELSE IF st = 'ISLOCATED' THEN
- Process(IsLocated)
- ELSE IF st = 'TOGETHER' THEN
- Process(Together)
- ELSE IF st = 'ISON' THEN
- Process(IsON)
- ELSE IF st = 'ISOFF' THEN
- Process(IsOFF)
- ELSE IF st = 'ISGROUPMEMBER' THEN
- Process(IsGroupMember)
- ELSE IF st = 'ISOPEN' THEN
- Process(IsOpen)
- ELSE IF st = 'ISCLOSED' THEN
- Process(IsClosed)
- ELSE IF st = 'ISLOCKED' THEN
- Process(IsLocked)
- ELSE IF st = 'ISUNLOCKED' THEN
- Process(IsUnLocked)
- ELSE IF st = 'ISEDIBLE' THEN
- Process(IsEdible)
- ELSE IF st = 'ISDRINKABLE' THEN
- Process(IsDrinkable)
- ELSE IF st = 'ISPOISONOUS' THEN
- Process(IsPoisonous)
- ELSE IF st = 'ISMOVABLE' THEN
- Process(IsMovable)
- ELSE IF st = 'NOUNPRESENT' THEN
- Process(NOUNPresent)
- ELSE IF st = 'NOUNISWEARING' THEN
- Process(NOUNIsWearing)
- ELSE IF st = 'NOUNISCARRYING' THEN
- Process(NOUNIsCarrying)
- ELSE IF st = 'NOUNISNOWHERE' THEN
- Process(NOUNIsNowhere)
- ELSE IF st = 'NOUNISSOMEWHERE' THEN
- Process(NOUNIsSomewhere)
- ELSE IF st = 'NOUNINROOM' THEN
- Process(NOUNInRoom)
- ELSE IF st = 'NOUNISLOCATED' THEN
- Process(NOUNIsLocated)
- ELSE IF st = 'NOUNISON' THEN
- Process(NOUNIsON)
- ELSE IF st = 'NOUNISOFF' THEN
- Process(NOUNIsOFF)
- ELSE IF st = 'NOUNISOPEN' THEN
- Process(NOUNIsOpen)
- ELSE IF st = 'NOUNISCLOSED' THEN
- Process(NOUNIsClosed)
- ELSE IF st = 'NOUNISLOCKED' THEN
- Process(NOUNIsLocked)
- ELSE IF st = 'NOUNISUNLOCKED' THEN
- Process(NOUNIsUnLocked)
- ELSE IF st = 'NOUNISEDIBLE' THEN
- Process(NOUNIsEdible)
- ELSE IF st = 'NOUNISDRINKABLE' THEN
- Process(NOUNIsDrinkable)
- ELSE IF st = 'NOUNISPOISONOUS' THEN
- Process(NOUNIsPoisonous)
- ELSE IF st = 'NOUNISMOVABLE' THEN
- Process(NOUNIsMovable)
- ELSE IF st = 'NOUNPOINTSEQUALS' THEN
- Process(NOUNpointsEquals)
- ELSE IF st = 'NOUNPOINTSGT' THEN
- Process(NOUNpointsGT)
- ELSE IF st = 'NOUNPOINTSLT' THEN
- Process(NOUNpointsLT)
- ELSE IF st = 'NOUNWEIGHTEQUALS' THEN
- Process(NOUNweightEquals)
- ELSE IF st = 'NOUNWEIGHTGT' THEN
- Process(NOUNweightGT)
- ELSE IF st = 'NOUNWEIGHTLT' THEN
- Process(NOUNweightLT)
- ELSE IF st = 'FLAGON' THEN
- Process(FlagON)
- ELSE IF st = 'FLAGOFF' THEN
- Process(FlagOFF)
- ELSE IF st = 'SCOREEQUALS' THEN
- Process(ScoreEquals)
- ELSE IF st = 'SCOREGT' THEN
- Process(ScoreGT)
- ELSE IF st = 'SCORELT' THEN
- Process(ScoreLT)
- ELSE IF st = 'NUMBEREQUALS' THEN
- Process(NumberEquals)
- ELSE IF st = 'NUMBERGT' THEN
- Process(NumberGT)
- ELSE IF st = 'NUMBERLT' THEN
- Process(NumberLT)
- ELSE IF st = 'TURNSEQUALS' THEN
- Process(TurnsEquals)
- ELSE IF st = 'TURNSGT' THEN
- Process(TurnsGT)
- ELSE IF st = 'TURNSLT' THEN
- Process(TurnsLT)
- ELSE IF st = 'ANSWERISCORRECT' THEN
- Process(AnswerIsCorrect)
- ELSE IF st = 'ANSWERISWRONG' THEN
- Process(AnswerIsWrong)
- ELSE IF st = 'COUNTEREQUALS' THEN
- Process(CounterEquals)
- ELSE IF st = 'COUNTERGT' THEN
- Process(CounterGT)
- ELSE IF st = 'COUNTERLT' THEN
- Process(CounterLT)
- ELSE IF st = 'VARIABLEEQUALS' THEN
- Process(VariableEquals)
- ELSE IF st = 'VARIABLEGT' THEN
- Process(VariableGT)
- ELSE IF st = 'VARIABLELT' THEN
- Process(VariableLT)
- ELSE IF st = 'CHANCE' THEN
- Process(Chance)
- ELSE IF st = 'VARIABLECHANCE' THEN
- Process(VariableChance)
- ELSE IF st = 'COMPAREVARIABLES' THEN
- Process(CompareVariables)
- ELSE IF st = 'NAMEPRESENT' THEN
- Process(NamePresent)
- ELSE IF st = 'NAMEISNUMBER' THEN
- Process(NameIsNumber)
- ELSE IF st = 'NOUNISNUMBER' THEN
- Process(NOUNIsNumber)
- ELSE IF st = 'OBJECTISNUMBER' THEN
- Process(ObjectIsNumber)
- ELSE IF st = 'PROMPTFORYES' THEN
- Process(PromptForYES)
- ELSE IF st = 'PROMPTFORNO' THEN
- Process(PromptForNO)
- ELSE IF st = 'VERBISDIRECTION' THEN
- Process(VerbIsDirection)
- ELSE IF st = 'MAKEVARROOMNUM' THEN
- Process(MakeVarRoomNum)
- ELSE IF st = 'MAKEVARNOUNNUM' THEN
- Process(MakeVarNounNum)
- ELSE IF st = 'MAKEVAROBJECTNUM' THEN
- Process(MakeVarObjectNum)
- ELSE IF st = 'GOTOVARIABLEROOM' THEN
- Process(GoToVariableRoom)
- ELSE IF st = 'SENDTOVARIABLEROOM' THEN
- Process(SendToVariableRoom)
- ELSE IF st = 'GETVARIABLEIT' THEN
- Process(GetVariableIt)
- ELSE IF st = 'PRINTVARIABLEMESSAGE' THEN
- Process(PrintVariableMessage)
- ELSE IF st = 'NOUNISCREATURE' THEN
- Process(NounIsCreature)
- ELSE IF st = 'OBJECTISCREATURE' THEN
- Process(ObjectIsCreature)
- ELSE IF st = 'OBJECTPRESENT' THEN
- Process(ObjectPresent)
- ELSE IF st = 'NOT' THEN {"NOT" is used in CMD file, LogicalNOT is token}
- Process(LogicalNOT)
- ELSE IF st = 'OR' THEN {"OR" is used in CMD file, LogicalOR is token}
- Process(LogicalOR)
- ELSE IF st = 'GOTOROOM' THEN
- Process(GoToRoom)
- ELSE IF st = 'GOTORANDOMROOM' THEN
- Process(GoToRandomRoom)
- ELSE IF st = 'GETIT' THEN
- Process(GetIt)
- ELSE IF st = 'SOMETHINGINSIDE' THEN
- Process(SomethingInside)
- ELSE IF st = 'SHOWCONTENTS' THEN
- Process(ShowContents)
- ELSE IF st = 'WEARIT' THEN
- Process(WearIt)
- ELSE IF st = 'DROPIT' THEN
- Process(DropIt)
- ELSE IF st = 'REMOVEIT' THEN
- Process(RemoveIt)
- ELSE IF st = 'GETNOUN' THEN
- Process(GetNOUN)
- ELSE IF st = 'WEARNOUN' THEN
- Process(WearNOUN)
- ELSE IF st = 'DROPNOUN' THEN
- Process(DropNOUN)
- ELSE IF st = 'REMOVENOUN' THEN
- Process(RemoveNOUN)
- ELSE IF st = 'ADDTOGROUP' THEN
- Process(AddToGroup)
- ELSE IF st = 'REMOVEFROMGROUP' THEN
- Process(RemoveFromGroup)
- ELSE IF st = 'MOVETHEGROUP' THEN
- Process(MoveTheGroup)
- ELSE IF st = 'REDIRECTTO' THEN
- BEGIN
- Process(ReDirectTo); {store token}
- sentence := But_First(sentence); {strip off REDIRECTTO}
- Handle_Word_Combinations(sentence);
- CheckForName(sentence);
- Parse(sentence, verb, noun, prep, object_word, ErrorInCommand);
- IF verb = '' THEN verb := 'ANY';
- IF noun = '' THEN noun := 'ANY';
- IF object_word = '' THEN object_word := 'ANY';
- n1 := Verb_Number(verb);
- IF NameNum <> 0 THEN n1 := NameNum; {Name used for sort key}
- n1 := n1+2000; {make n1 > 1999 to signify re-direction}
- Last_CMD := Last_CMD+1; {go to next command to store data}
- IF Last_CMD <= MaxCommand THEN
- BEGIN {store data on VERB-NOUN-OBJECT combination for re-direction}
- SpecialCMD[Last_CMD]^.VerbNum := n1;
- SpecialCMD[Last_CMD]^.VerbCMD := verb;
- SpecialCMD[Last_CMD]^.NounCMD := noun;
- SpecialCMD[Last_CMD]^.ObjectCMD := object_word;
- END
- ELSE
- BEGIN
- WriteLn('Too many commands! Processing halted');
- Halt;
- END;
- END {ReDirectTo}
- ELSE IF st = 'RANDOMMESSAGE' THEN
- Process(RandomMessage)
- ELSE IF st = 'OPENIT' THEN
- Process(OpenIt)
- ELSE IF st = 'CLOSEIT' THEN
- Process(CloseIt)
- ELSE IF st = 'LOCKIT' THEN
- Process(LockIt)
- ELSE IF st = 'UNLOCKIT' THEN
- Process(UnlockIt)
- ELSE IF st = 'OPENNOUN' THEN
- Process(OpenNOUN)
- ELSE IF st = 'CLOSENOUN' THEN
- Process(CloseNOUN)
- ELSE IF st = 'LOCKNOUN' THEN
- Process(LockNOUN)
- ELSE IF st = 'UNLOCKNOUN' THEN
- Process(UnlockNOUN)
- ELSE IF st = 'DROPEVERYTHING' THEN
- Process(DropEverything)
- ELSE IF st = 'REMOVEEVERYTHING' THEN
- Process(RemoveEverything)
- ELSE IF st = 'KILLPLAYER' THEN
- Process(KillPlayer)
- ELSE IF st = 'PUTINCURRENTROOM' THEN
- Process(PutInCurrentRoom)
- ELSE IF st = 'SENDTOROOM' THEN
- Process(SendToRoom)
- ELSE IF st = 'PUTNOUNINCURRENTROOM' THEN
- Process(PutNOUNInCurrentRoom)
- ELSE IF st = 'SENDNOUNTOROOM' THEN
- Process(SendNOUNToRoom)
- ELSE IF st = 'SENDALLTOROOM' THEN
- Process(SendAllToRoom)
- ELSE IF st = 'SENDTREASURESTOROOM' THEN
- Process(SendTreasuresToRoom)
- ELSE IF st = 'RELOCATEALL' THEN
- Process(RelocateAll)
- ELSE IF st = 'DESTROY' THEN
- Process(Destroy)
- ELSE IF st = 'DESTROYNOUN' THEN
- Process(DestroyNOUN)
- ELSE IF st = 'SWAPLOCATIONS' THEN
- Process(SwapLocations)
- ELSE IF st = 'SENDTOITEM' THEN
- Process(SendToItem)
- ELSE IF st = 'SENDNOUNTOITEM' THEN
- Process(SendNOUNToItem)
- ELSE IF st = 'SHOWSCORE' THEN
- Process(ShowScore)
- ELSE IF st = 'PLUSSCORE' THEN
- Process(PlusScore)
- ELSE IF st = 'MINUSSCORE' THEN
- Process(MinusScore)
- ELSE IF st = 'SHOWINVENTORY' THEN
- Process(ShowInventory)
- ELSE IF st = 'WAITFORRETURN' THEN
- Process(WaitForReturn)
- ELSE IF st = 'TIMEPASSES' THEN
- Process(TimePasses)
- ELSE IF st = 'DELAY' THEN
- Process(xDelay)
- ELSE IF st = 'CLEARSCREEN' THEN
- Process(CLEARSCREEN)
- ELSE IF st = 'DESCRIBETHING' THEN
- Process(DescribeThing)
- ELSE IF st = 'LOOKATROOM' THEN
- Process(LookAtRoom)
- ELSE IF st = 'PRINTMESSAGE' THEN
- Process(PrintMessage)
- ELSE IF st = 'BLANKLINE' THEN
- Process(BlankLine)
- ELSE IF st = 'TONE' THEN
- Process(Tone)
- ELSE IF st = 'GETNUMBERINPUT' THEN
- Process(GetNumberInput)
- ELSE IF st = 'ASKQUESTION' THEN
- Process(AskQuestion)
- ELSE IF st = 'CHANGEPASSAGEWAY' THEN
- Process(ChangePassageway)
- ELSE IF st = 'TURNFLAGON' THEN
- Process(TurnFlagON)
- ELSE IF st = 'TURNFLAGOFF' THEN
- Process(TurnFlagOFF)
- ELSE IF st = 'TOGGLEFLAG' THEN
- Process(ToggleFlag)
- ELSE IF st = 'TURNCOUNTERON' THEN
- Process(TurnCounterON)
- ELSE IF st = 'TURNCOUNTEROFF' THEN
- Process(TurnCounterOFF)
- ELSE IF st = 'SETVARIABLETO' THEN
- Process(SetVariableTo)
- ELSE IF st = 'ADDTOVARIABLE' THEN
- Process(AddToVariable)
- ELSE IF st = 'SUBTRACTFROMVARIABLE' THEN
- Process(SubtractFromVariable)
- ELSE IF st = 'ADDVARIABLES' THEN
- Process(AddVariables)
- ELSE IF st = 'SUBTRACTVARIABLES' THEN
- Process(SubtractVariables)
- ELSE IF st = 'RANDOMVARIABLE' THEN
- Process(RandomVariable)
- ELSE IF st = 'NOUNTOVARIABLE' THEN
- Process(NounToVariable)
- ELSE IF st = 'OBJECTTOVARIABLE' THEN
- Process(ObjectToVariable)
- ELSE IF st = 'QUITTHISCMD' THEN
- Process(QuitThisCMD)
- ELSE IF st = 'QUITALLCMDS' THEN
- Process(QuitAllCMDs)
- ELSE IF st = 'DONEWITHTURN' THEN
- Process(DoneWithTurn)
- ELSE IF st = 'WINGAME' THEN
- Process(WinGame)
- ELSE IF st = 'ENDGAME' THEN
- Process(EndGame)
- ELSE IF (Copy(st, 1, 4) <> 'END_') THEN
- BEGIN
- WriteLn('Illegal Token: ', sentence);
- WriteLn('For Command: ', verb, ' ', noun, ' ', object_word);
- WriteLn;
- END;
- UNTIL (Copy(st, 1, 4) = 'END_');
- END; {IF COMMAND}
-
- DoneWithFile:
- UNTIL (POS('END OF FILE', sentence) <> 0) OR (EOF(datafile));
- Close(datafile);
- {Now determine indices for index sequential searches of SpecialCMDs}
- IF ErrorInCommand THEN Last_CMD := Last_CMD-1;
- {If last command was illegal, then ignore it}
- FOR i := 1 TO Last_CMD DO
- BEGIN
- j := SpecialCMD[i]^.VerbNum;
- IF j < 2000 THEN
- BEGIN {Not a ReDirectTo command}
- IF i < StartingIndex[j] THEN StartingIndex[j] := i;
- {get minimum starting index for each verb}
- IF i > EndingIndex[j] THEN EndingIndex[j] := i;
- {get maximum ending index for each verb}
- END;
- END; {i := 1 TO Last_CMD}
- Exit:
- Skip_A_Line := True;
- END; {READ_SPECIAL_CMDS}
-
-
-