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); }