INCLUDE "standard.adl"; { Include the standard package } { The following are Object properties } BROKEN = 1; { Is the robot damaged? } TOLD = 2; { Have I told the robot something? } BSTATE = 17; { State of the button } B_OFF = 0; { Button is off } B_FLASH = 1; { Button is flashing } B_LIT = 2; { Button is lit } { Global variables } VAR RobSave[ 6 ], { Saved sentence for the robot } Score; { Current score } { Utility routines } ROUTINE NoGo, Sayer, Myself, Lifter, DoorCk, TrapCk, RobMov, BlueCk, Header, Die, Skore, RobEntr, HatchSD; { Locations in the dungeon } NOUN Redrm, Bluerm, Greenrm, Cellar, Endrm; { Immovable objects } NOUN button( Bluerm ), door( Cellar ), hatch( Bluerm ); { Objects which may become actors } NOUN me( Redrm ), robot( Greenrm ); me(NOTAKE) = TRUE; { Room descriptions } Redrm( LDESC ) = ($say "You are in a large room which is illuminated by a bright red glow. Exits lie to the east and south.\n" ) ; Redrm( SDESC ) = ($return (Header "Red room" %0)); Redrm( LIGHT ) = TRUE; Greenrm( LDESC ) = ($say "You are in a smallish room which is illuminated by a pleasant green glow. The only exit is to the west.\n" ) ; Greenrm( SDESC ) = ($return (Header "Green room" %0)); Greenrm( LIGHT ) = TRUE; Bluerm( LDESC ) = ($say "You are in a tiny room which is barely illuminated by a dim blue glow. There is an exit to the north," ) (IF ($eq ($prop button BSTATE) B_LIT) THEN ($say " and most of the floor has tilted up to reveal a hatch leading down into blackness. A button on the wall is glowing brightly." ) ELSE ($say " and you seem to make out something on the floor.") (IF ($prop button BSTATE) THEN ($say " A button on the wall is flashing urgently.") ELSE ($say " There is a button on the wall.") ) ) ($say " Above the button is a sign that reads:\n\n" " DANGER!\n\n" " HIGH VOLTAGE!\n\n" ) ; Bluerm( SDESC ) = (IF %0 THEN ($return "Blue room")) ($say "Blue room.\n") ; Bluerm( LIGHT ) = TRUE; Cellar( LDESC ) = ($say "You are in the cellar. Far above you can be seen a dim blue light." ) (IF ($prop door OPENED) THEN ($say " An open door leads to the north.\n" ) ELSE ($say " You can barely see the outline of a door to the north.\n" ) ) ; Cellar( SDESC ) = ($return (Header "Cellar" %0)) ; Cellar( LIGHT ) = TRUE; Endrm( LDESC ) = ($say "You exit from the dark cellar into a land filled with singing birds, blooming flowers, flowing streams, and bright blue skies. In other words, you have finished this game!\n" ) ($setg Score ($plus @Score 25)) (Skore) ($spec 3) ; Endrm( LIGHT ) = TRUE; { Verbs } VERB score, push, shout; tell = TELLER; say = tell; press = push; feel = touch; yell = shout; { Verb routines } tell( PREACT ) = (IF ($ne @Iobj robot) THEN { The only logical thing to talk to is the robot } (Sayer "Talking to yourself is said to be a sign of impending insanity" ) ELSEIF ($ge @Dobj 0) THEN { You must say strings } (Sayer "You must put what you want to say in quotes" ) ELSEIF ($ne ($loc robot) ($loc me)) THEN { The robot must be in the same place as the player } (IF (Myself) THEN ($say "You don't see the robot here.\n") ) ELSE { Everything is OK. Add 25 points to the score } (IF ($not ($prop robot TOLD)) THEN ($setg Score ($plus @Score 25)) ($setp robot TOLD TRUE) ) ($exit 0) ) ($exit 1) ; tell( ACTION ) = { Tell the player that we heard him } ($say "\"Sure thing, Boss.\"\n") { Delete the old action } ($delact robot) { Add the new action - a non-interactive actor } ($actor robot @Dobj FALSE) ; shout( PREACT ) = (IF ($and @Iobj ($ne @Iobj robot)) THEN { Shouting at things other than the robot } ($say "AAARRRGGGHHH!\n") ELSEIF ($ge @Dobj 0) THEN { Shouting things other than strings } ($say "EEEYYYAAAHHH!\n") ELSEIF ($prop robot BROKEN) THEN ($say "There is no response.\n") ELSE { Shouting at the robot - same as telling the robot } (IF ($not ($prop robot TOLD)) THEN ($setg Score ($plus @Score 25)) ($setp robot TOLD TRUE) ) ($exit 0) ) ($exit 1) ; shout( ACTION ) = { Tell the player we heard him } (IF ($ne ($loc robot) ($loc me)) THEN ($say "In the distance you hear the words, ") ) ($say "\"Sure thing, Boss\"\n") { Delete the old robot action } ($delact robot) { Add the new robot action } ($actor robot @Dobj FALSE) ; push( PREACT ) = { Expect a plain direct object } (Expect ($or ONE_OBJ PLAIN_OBJ) NO_OBJ) (CheckAvail) ; push( ACTION ) = (Sayer "That doesn't seem to do anything") ($exit 1) ; score(PREACT) = { Score can accept no objects } (Expect NO_OBJ NO_OBJ) (Skore) ($exit 1) ; { Object properties } button( SDESC ) = (IF ($eq ($prop button BSTATE) B_OFF) THEN ($say "a button") ELSEIF ($eq ($prop button BSTATE) B_FLASH) THEN ($say "an urgently flashing button") ELSE ($say "a brightly lit button") ) ; button( ACTION ) = (IF ($and (Myself) ($or ($eq @Verb push) ($eq @Verb take) ($eq @Verb touch) ) ) THEN { The player tried to do something with the button } ($say "As you reach for the button, a 10,000,000 volt bolt of lightning arcs toward your finger, disintegrating you upon impact.\n" ) (Die) ELSEIF ($and ($eq @Verb push) ($eq ($prop button BSTATE) B_OFF)) THEN { The robot pushed the button } ($setp button BSTATE B_FLASH) ($setg Score ($plus @Score 50)) ($sfus me Lifter 4) ($exit 1) ELSEIF ($eq @Verb take) THEN { Can't take the button } ($setg Skip TRUE) ) ; SimpleRobot = "I am just a simple robot"; robot( LDESC ) = ($say "There is a robot here.\n"); robot( SDESC ) = ($say "a robot"); robot( ACTION ) = (IF (Myself) THEN { I'm doing something with the robot } (IF ($eq @Verb tell) THEN (IF ($prop robot BROKEN) THEN ($say "There is no response.\n") ($exit 1) ) ELSEIF ($eq @Verb take) THEN ($say "The robot weighs at least 500 pounds!\n") ($exit 1) ) ELSEIF ($eq ($phase) 2) THEN { This is being called as the Actor ACTION } (ActAction) (IF ($and ($ne @Verb push) ($ne @Verb go) ($ne @Verb wait) ($ne @Verb take) ($or ($lt @Verb north) ($gt @Verb down))) THEN { The robot has a VERY simple vocabulary } (Sayer SimpleRobot) ($delact robot) ($exit 1) ) ELSEIF ($eq @Verb take) THEN { The robot is trying to take itself } (Sayer "Mmmph! Akkk!! GGGGRR!! No can do. Sorry") ($setg Skip TRUE) ELSE { The robot is doing something to itself } (Sayer SimpleRobot) ($delact robot) ($exit 1) ) ; robot( SAVESENT ) = RobSave; { We break me( ACTION ) out into a named routine because StdInit overwrites that property and we need to restore it } MeAct = (IF ($eq ($phase) 2) THEN { This is the Actor ACTION - call standard's actor action } (ActAction) ELSEIF ($eq @Verb take) THEN (Sayer "I thought you would never ask") ($setg Skip TRUE) ) ; { We break hatch( SDESC ) out into a named routine because the hatch isn't visible until after Lifter has executed } HatchSD = ($say "an open hatch"); HatchMSG = "The hatch doesn't budge"; hatch( ACTION ) = (IF ($eq @Verb take) THEN { Can't take the hatch } (Sayer HatchMSG) ($setg Skip TRUE) ELSEIF ($or ($eq @Verb open) ($eq @Verb push)) THEN { Can't open or push it, either } (Sayer HatchMSG) ($exit 1) ) ; hatch( OPENS ) = TRUE; hatch( NOTAKE ) = TRUE; door( SDESC ) = ($say "a door"); door( ACTION ) = (IF ($eq @Verb take) THEN ($say "You can't take a door!\n") ($setg Skip TRUE) ) ; door( OPENS ) = TRUE; { Transition routines. Note that RobMov is used in $miss. This produces the 'The robot exits to the messages. The calls to RobEntr produce the messages like 'The robot enters from the . } Bluerm( ACTION ) = ($miss RobMov NoGo NoGo NoGo NoGo TrapCk 0 0 0 0) ($hit .ME Redrm 0 0 0 0 Cellar 0 0 0 0) (RobEntr) ; Redrm( ACTION ) = ($miss NoGo BlueCk RobMov NoGo NoGo NoGo 0 0 0 0) ($hit .ME 0 Bluerm Greenrm 0 0 0 0 0 0 0) (RobEntr) ; Greenrm( ACTION ) = ($miss NoGo NoGo NoGo RobMov NoGo NoGo 0 0 0 0) ($hit .ME 0 0 0 Redrm 0 0 0 0 0 0) (RobEntr) ; Cellar( ACTION ) = ($miss DoorCk NoGo NoGo NoGo BlueCk NoGo 0 0 0 0) ($hit .ME Endrm 0 0 0 Bluerm 0 0 0 0 0) (RobEntr) ; { Routines } { (Myself) - returns 1 if "me" is the current actor; 0 otherwise } Myself = ($return ($eq .ME me)) ; { (Sayer str) - Says a string with appropriate quoting, depending on whether the robot or the player is doing the saying. } Sayer = (IF (Myself) THEN ($say %1 ".\n") ELSEIF ($eq ($loc robot) ($loc me)) THEN ($say "\"" %1 ", Boss.\"\n") ELSE ($say "You hear a muffled voice in the distance.\n") ) ; { (NoGo) - "You can't go that way" } NoGo = (Sayer "You can't go that way") ($exit 1) ; { (Header str arg0) - To accomplish the printing of header lines, each location SDESC need to return a string if a parameter is passed to it. By doing ($return (Header %0)), we can centralize the saying/returning decision. } Header = (IF ($not %2) THEN ($say %1 ".\n") ) ($return %1) ; RobMov = (IF ($and ($not (Myself)) ($eq ($loc robot) ($loc me))) THEN ($say "The robot exits to the " (IF ($eq @Verb e) THEN ($val "east") ELSEIF ($eq @Verb w) THEN ($val "west") ELSEIF ($eq @Verb s) THEN ($val "south") { The robot can't be seen leaving to the north } ) ".\n" ) ) ; RobEntr = (IF ($and ($not (Myself)) ($eq ($loc robot ) ($loc me))) THEN ($say (IF ($eq @Verb north) THEN ($val "The robot enters from the south.\n") ELSEIF ($eq @Verb east) THEN ($val "The robot enters from the west.\n") ELSEIF ($eq @Verb west) THEN ($val "The robot enters from the east.\n") { The robot can't enter from the north in this scenario } ) ) ) ; DoorCk = (IF ($not ($prop door OPENED)) THEN ($say "The door seems to be closed.\n") ($exit 1) ) ; TrapCk = (IF ($ne ($prop button BSTATE) B_LIT) THEN (NoGo) ) ; { (BlueCk) - make sure that only one actor is in the blue room at one time. } BlueCk = (IF ($or ($eq ($loc me) Bluerm) ($eq ($loc robot) Bluerm)) THEN (IF (Myself) THEN ($say "The room is too small for both you and the robot to fit.\n" ) ) ($exit 1) ELSEIF ($and ($not (Myself)) ($eq ($prop button BSTATE) B_LIT)) THEN (RobMov) ($say "You hear a loud CRASH! in the distance.\n") ($setg Score ($minus @Score 10)) ($setp robot BROKEN TRUE) ($move robot Bluerm) ($delact robot) ($exit 1) ) (RobMov) ; { (Die) - kill off the player } Die = ($setg Score ($minus @Score 50)) (Skore) ($say "Do you wish to restart the game? ") (IF ($yorn) THEN ($spec 2) ELSE ($spec 3) ) ; { (Lifter) - Lift the hatch, possibly killing the robot or the player } Lifter = (IF ($eq ($loc me) Bluerm) THEN ($say "All of a sudden, the floor lifts up, and you are crushed between it and the wall! " ) (Die) ELSE ($say "In the distance, you hear a loud CRASH!\n") (IF ($eq ($loc robot) Bluerm) THEN ($setg Score ($minus @Score 10)) ($setp robot BROKEN TRUE) ($delact robot) ) ) ($setp hatch SDESC HatchSD) ($setp button BSTATE B_LIT) ($setp Bluerm SEEN FALSE) ; { Prompt - print the status line and a prompt } PROMPT = ($spec 9 (($sdesc ($loc .ME)) 1) @Score ($turns)) ($say "> ") ; { Increment - increment the turn counter } INCREMENT = (IF (Myself) THEN { We only want to increment once per turn } ($incturn) ELSE { We don't want Looker executing for the robot } ($exit 0) ) ; { (Skore) - print out the current score. } Skore = ($say "You have scored " ($str @Score) " out of a possible 100 in " ($str ($turns)) " moves.\n") ; { Dwimming routines } DWIMI = (Dwimmer %1); DWIMD = (Dwimmer %1); START = ($spec MARGIN 69) { Set the screen to 69 wide } ($sdem INCREMENT) { Turn counter increment } (StdInit me) { Initialize standard } ($setp me ACTION MeAct) { Restore me( ACTION ) } ($setv n s e w u d 0 0 0 0) { Use our own transition vector } ($prompt PROMPT) { and our own prompter } ($setg Indent TRUE) { Indent the object descriptions } ; {*** EOF actdemo.adl ***}