ADL Scenario Source Code

    INCLUDE "stdproc.adl";

    /* Object properties specific to this scenario */

    BITPROP
    	BROKEN;		// The window can be broken

    /* Locations in this scenario */

    NOUN
        room1,
        room2;

    room1(LIGHT) = TRUE;
    room2(LIGHT) = TRUE;

    /* The vocabulary for this scenario */

    ADJEC
        sun,
        red,
        blue;

    NOUN
        wall,
        floor,
        sun window(room2),
        door(room1),
        red ball(room1),
        blue ball(room1);

    PREP
        against;

    hard = red;	wooden = red;
    soft = blue;	foamy = blue;
    sunwindow = sun window;
    bounce = throw;

    /* Location descriptions */

    room1(LDESC) = Proc()
    {
        "You are in your bedroom.  All of your really FUN toys have been ";
        "put away, out of your reach.  There is another room to the east.\n";
    }
    room1(SDESC) = Proc() {"Bedroom\n";}

    room2(LDESC) = Proc()
    {
        "You are in the nursery.  A pretty yellow sunbeam is shining on the ";
        "floor.  There is another room to the west.\n";
    }
    room2(SDESC) = Proc() {"Nursery\n";}

    /* Transition routines */
    cg = Proc() {"You can't go that way.\n";}

    room1(ACTION) = Proc()
    {
        $miss(cg,cg,0,cg,cg,cg,cg,cg,cg,cg);
        $hit($ME,0,0,room2,0,0,0,0,0,0,0);
    }

    room2(ACTION) = Proc()
    {
        $miss(cg,cg,cg,0,cg,cg,cg,cg,cg,cg);
        $hit($ME,0,0,0,room1,0,0,0,0,0,0);
    }

    /* Object specific routines */

    BallAct = Proc(Obj)				// ACTION rout for balls
    {
        If (Verb == throw) {
    	If (Dobj != Obj) {
    	    /* We're the iobj; don't perform an action */
    	    $exit(0);
    	}
    	If (Iobj != wall) {
    	    "You throw the ball at the floor, where it bounces a few ";
    	    "times, then is still.\n";
    	}
            Else {
    	    "The ball sails through the air, then bounces off the wall ";
    	    "onto the floor.\n";
    	}
    	$move(Dobj, $loc($ME));
    	$exit(1);
        }
    }

    red ball(LDESC) = Proc() {"There is a hard, wooden red ball here.\n";}
    red ball(SDESC) = Proc() {"a red ball";}
    red ball(ACTION) = Proc() { BallAct( <red ball> ); }

    blue ball(LDESC) = Proc() {"There is a soft, foamy blue ball here.\n";}
    blue ball(SDESC) = Proc() {"a blue ball";}
    blue ball(ACTION) = Proc() { BallAct( <blue ball> ); }

    NoAct =	Proc(Obj)			// ACTION rout for wall and floor
    {
        If ((Verb != throw) | (Iobj != Obj)) {
    	Silly();
        }
    }

    wall(NOTAKE) = TRUE;
    wall(ACTION) = Proc() { NoAct(wall); }

    floor(NOTAKE) = TRUE;
    floor(ACTION) = Proc() { NoAct(floor); }

    sun window(NOTAKE) = TRUE;
    sun window(LDESC) = Proc()
    {
        "There is a large sun window here";
        If (<sun window>.BROKEN)
    	", shattered into a thousand pieces!\n";
        Else
    	".\n";
    }
    sun window(SDESC) = Proc()
    {
        If (<sun window>.BROKEN)
    	"a broken window";
        Else
    	"a sun window";
    }
    sun window(ACTION) = Proc()
    {
        If ((Verb == throw) & (Iobj == <sun window>)) {
    	If (Dobj == <red ball>) {
    	    "The red ball sails through the window, shattering it!\n";
    	    $move(<red ball>, $ALL);
    	    <sun window>.BROKEN = TRUE;
    	    $exit(1);
            }
    	Else If (Dobj == <blue ball>) {
    	    If (<sun window>.BROKEN) {
    		"The blue ball sails through the broken window!\n";
    		$move(<blue ball>, $ALL);
    	    }
                Else {
    		"The blue ball bounces harmlessly off the window.\n";
    		$move(<blue ball>, room2);
    	    }
    	    $exit(1);
    	}
            Else {
    	     Silly();
    	}
        }
        Else If (Verb == open) {
    	"You can't open a sun window!\n";
    	$exit(1);
        }
        Else If (Verb == take) {
    	Silly();
        }
    }

    door(NOTAKE) = TRUE;
    door(LDESC) = Proc() { "There is a closed door here.\n"; }
    door(SDESC) = Proc() { "a door"; }
    door(ACTION) = Proc()
    {
        If ((Verb == throw) & (Iobj == door)) {
    	"The " $name(Dobj) " bounces harmlessly off of the door.\n";
    	$exit(1);
        }
        Else If (Verb == open) {
    	"The doorknob is too high for you to reach.\n";
    	$exit(1);
        }
        Else If (Verb == take) {
    	Silly();
        }
    }

    /* Scenario dependant routines */

    Parent = Proc()				// The parent fuse
    {
        If ($loc($ME) == room1)
    	"Suddenly, the door to your bedroom opens! ";
        Else
    	"You hear the door in your bedroom opening! ";

        "Your parents enter the room. ";
        IF (<sun window>.BROKEN)
    	"Daddy notices the broken window, and turns a funny red color. "
    	"\"I see that you haven't learned your lesson, dear,\" says "
    	"Mommy.  \"I'm afraid that you will have to stay in here for "
    	"at least another hour! "
    	"Mommy and Daddy leave you alone again.  Let's see what other "
    	"fun things there are to do around here...\n";
        ELSE
    	"\"Have you learned your lesson, kiddo?\" asks Daddy.  Seeing "
    	"your cute little face seems to have charmed them!  You're off "
    	"the hook!  Mommy and Daddy take you out to see \"The Care "
    	"Bears Eat New York\", and you live happily ever after.\n";
        $spec(QUIT);
    }

    VAR
        Rand[ 10 ];

    (Rand + 0) = "You wonder if the blue ball will bounce off of the window.\n";
    (Rand + 1) = "You wonder if the red ball will bounce off of the window.\n" ;
    (Rand + 2) = "You find a piece of lint on the floor, and eat it.  Yum!\n" ;
    (Rand + 3) = "You can hear Kitty meowing outside.\n" ;
    (Rand + 4) = "You hear Mommy singing in the kitchen.\n" ;
    (Rand + 5) = "You practice making disgusting noises.  THPPP!  ZZZKKK!\n" ;
    (Rand + 6) = "You hear Daddy hit his head on the garage door.\n" ;
    (Rand + 7) = "You lick the wall, to see what it tastes like.\n" ;
    (Rand + 8) = "You pretend that you're an airplane.  Zoom!\n" ;
    (Rand + 9) = "You make spider shadows with your hands.\n";

    Random = Proc()			// Random message daemon
    {
        Var which;

        $incturn();			// Increment the turn counter
        $move(wall, $loc($ME));	// Move the wall to my current location
        $move(floor, $loc($ME));	// Move the floor to my current location
        which = $rand(20);
        If (which == 1) {
    	If ($loc(<blue ball>) != $ALL) {
    	    $say(Rand[0]);
            }
        }
        Else If (which == 2) {
    	If ($loc(<red ball>) != $ALL) {
    	    $say(Rand[1]);
    	}
        }
        Else If (which <= 10) {
    	$say(Rand[which - 1]);
        }
    }

    NOUN	ME(room1);			/* The main actor in this play */

    (Indent) = TRUE;			/* Indent object descriptions */

    START = Proc()
    {
        "\n\n\n\n";			// A few newlines for good measure
        "It all started so innocently!  Kitty asked you for a haircut, ";
        "so you took Daddy's neato electric razor, and gave her a Mohawk. ";
        "Unfortunately, Mommy and Daddy didn't think it was so neat, and ";
        "they stuck you in here for a fifteen minute time out period...\n\n";

        StdInit(ME);			// Initialize standard
        $sdem(Random);			// Set up the random message daemon
        $sfus(ME, Parent, 15);		// Set up mommy and daddy
        $define("both", "red,blue");	// Set up "both" to work
        $define("balls", "ball");		// with the balls
    }

    /* Dwimming routines */

    DWIMI = Proc(Obj) { Return Dwimmer(Obj); }
    DWIMD = Proc(Obj) { Return Dwimmer(Obj); }