ADJEC red,green,blue,clear;
ADJEC glass, silver;

NOUN red message(road2);        // It's red so there can be others elsewhere
red message(WEIGH) = CAPAC;
red message(LDESC) = Proc() {"There is a message scratched in the dirt.\n";}
red message(SDESC) = Proc() {"a message in the dirt";}
red message(ACTION) = Proc()
{
    If ((Verb == read) | (Verb == examine)) {
	"'in' is a preposition.  'enter' is a verb.\n";
	$exit(1);
    }
}

NOUN keys (town4);
keys(WEIGH) = 2;
keys(LDESC) = Proc() {"There's a set of keys here.\n";}
keys(SDESC) = Proc() {"a set of keys";}
ADJEC tool;

NOUN tool box (farm5);
toolbox = tool box;
toolbox(WEIGH) = CAPAC;
toolbox(HOLDS) = 50;
toolbox(OPENS) = TRUE;
toolbox(LOCKS) = TRUE;
toolbox(LOCKED) = TRUE;
toolbox(LIGHT) = TRUE;
toolbox(LDESC) = Proc()
{
    If ($loc($ME) == toolbox) {
        "You are in a huge wooden structure, towering up at least 80 feet "
        "above your head, with wooden walls formed of immense 10-foot by "
        "50-foot boards.  Everything here, even the grains of dust which "
        "cover the wooden floor, seems immense.  ";
	If (toolbox.OPENED)
            "Above your head, the top of the structure is open, "
            "and sunlight streams in.\n";
        Else
            "The structure is closed at the top, but enough light "
            "comes in from between the boards to enable you to see.\n";
    }
    Else {
	"Against the house is a heavy ";
	If (toolbox.OPENED)
	    "toolbox with the lid open.\n";
	Else If (toolbox.LOCKED)
            "toolbox with a rusty lock, painted with an insignia "
            "composed of blue and green squares, joined at their "
            "corners.\n";
	Else
	    "toolbox, the lid of which is ajar.\n";
    }
}
toolbox(SDESC) = Proc()
{
    If ($loc($ME) == toolbox)
	Return Sayer("Inside Huge Box", $arg(0));
    Else
	"a toolbox";
}
toolbox(ACTION) = Proc()
{
    If ($phase() == 7) {
	// This is the room action
	If ((Verb == drop) | (Verb == throw)) {
	    // We don't want to keep track of lots of small things
	    "You just lost ";
	    $sdesc(Dobj)();
	    " in a crack between the wooden floorboards!\n";
	    $move(Dobj, $ALL);
	}
    }
    Else If (Verb == lock) {
	If (toolbox == OPENED) {
	    "You must close it first.\n";
	    $exit(1);
	}
        Else If (toolbox == LOCKED) {
	    "It's already locked!\n";
	    $exit(1);
	}
        Else If ($loc(keys) == $ME) {
	    "The toolbox seals with a CLICK!\n";
	    toolbox.LOCKED = TRUE;
	    $exit(1);
	}
    }
    Else If (Verb == unlock) {
	If (!toolbox.LOCKED) {
	    "It's already unlocked!\n";
	    $exit(1);
	}
        Else If ($loc(keys) == $ME) {
	    "One of the keys fits!  The box is unlocked.\n";
	    toolbox.LOCKED = FALSE;
	    $exit(1);
	}
    }
    Else If (Verb == examine) {
	If (toolbox.OPENED)
	    "The toolbox is open.\n";
	Else If (toolbox.LOCKED)
	    "The toolbox is locked.\n";
	Else
	    "The toolbox is ajar.\n";
	$exit(1);
    }
}

NOUN silver spoon(farm6);
silver spoon(POINT) = 10;
silver spoon(WEIGH) = 1;
silver spoon(LDESC) = Proc() {"There is a beautiful silver spoon here.\n";}
silver spoon(SDESC) = Proc() {"a silver spoon";}


NOUN wetsuit(cel15);
WORN = MISC1;
wetsuit(LDESC) = Proc() {"There is a wetsuit here.\n";}
wetsuit(SDESC) = Proc()
{
    "a wetsuit";
    If (wetsuit.WORN) " (being worn)";
}
wetsuit(WEIGH) = 50;
wetsuit(ACTION) = Proc()
{
    If (Verb == wear) {
	If ($loc(wetsuit) != $ME) {
	    "You don't have the wetsuit!\n";
	    $exit(1);
	}
        Else If (wetsuit.WORN) {
	    "You are already wearing it!\n";
	    $exit(1);
	}
        Else {
	    wetsuit.WORN = TRUE;
	    "OK, you're wearing the wetsuit.\n";
	    $exit(1);
	}
    }
    Else If (Verb == remove) {
	If (wetsuit.WORN) {
	    wetsuit.WORN = FALSE;
	    "OK, you're no longer wearing the wetsuit.\n";
	    $exit(1);
	}
        Else {
	    "You are not wearing the wetsuit!\n";
	    $exit(1);
	}
    }
    Else If (Verb == drop) {
	If (wetsuit.WORN) {
	    "You'll have to remove the wetsuit first.\n";
	    Skip = TRUE;
	}
    }
}

NOUN signpost(Roadx);
signpost(RDLOC)=10;
signpost(WEIGH)=CAPAC;
signpost(LDESC) = Proc() {"There is a signpost by the side of the road.\n";}
signpost(SDESC) = Proc() {"a signpost";}
signpost(ACTION) = Proc()
{
    If ((Verb == read) | (Verb == examine)) {
        "Pointing east, it says: 'Unuchevala: 10 miles'\n";
        $exit(1);
    }
}

NOUN globe(toolbox);
globe(WEIGH) = 20;
globe(LDESC) = Proc()
{
    If (globe.LIGHT)
        "A globe of stone glows brightly here.\n";
    Else
        "There is a strange globe of polished stone here.\n";
}
globe(SDESC) = Proc()
{
    If (globe.LIGHT)
        "a glowing globe of stone";
    Else
        "a stone globe";
}
globe(ACTION) = Proc()
{
    If (Verb == rub) {
	If (globe.LIGHT) {
	    "The light from the stone globe fades away.\n";
	    globe.LIGHT = FALSE;
	}
        Else {
	    "The stone globe glows brightly!\n";
	    globe.LIGHT = TRUE;
	}
	MyLoc = -1;
	$exit(1);
    }
    Else If (Verb == examine) {
	If (globe.LIGHT) {
	    "The globe is glowing.\n";
	    $exit(1);
	}
    }
}


NOUN crowbar (town3);
crowbar(WEIGH) = 100;
crowbar(LDESC) = Proc() {"There is a long crowbar here.\n";}
crowbar(SDESC) = Proc() {"a crowbar";}

crydie = Proc()
{
    "What POWER!  The magic crystal releases a flood of energy in "
    "a split-second!  Unfortunately, you were a little close...\n";
    die();
}
// Dragon Stuff
AWAKE = MISC1;

NOUN dragon (cel06);


white=clear;
NOUN green crystal(cel07);
NOUN red crystal(cel08);
NOUN blue crystal(cel10);
NOUN clear crystal(cel09);

diamond = clear crystal;
sapphire =  blue crystal;
ruby = red crystal;
emerald = green crystal;

WORKD = MISC1;

green crystal(WEIGH)=15;
green crystal(POINT)=35;
green crystal(LDESC) = Proc() {"There is a beautiful green crystal here!\n";}
green crystal(SDESC) = Proc() {"a green crystal";}

green crystal(ACTION) = Proc()
{
    If (Verb == take) {
	If ((!dragon.KILLED) & ($loc($ME) == cel07)) {
	    If (!dragon.AWAKE) {
		"You hear a stirring nearby.\n";
		Tempr = Tempr + 2;
		dragon.AWAKE = TRUE;
		cel06.SEEN = FALSE;
	    }
            Else {
		Tempr = 0;
	    }
	}
    }
    Else If (Verb == drop) {
	If ((!dragon.KILLED) & ($loc($ME) == cel07)) {
	    Tempr = Tempr - 2;
            If (Tempr <= 0) {
                dragon.AWAKE = FALSE;
                "You hear a deep  Y A W N  nearby.\n";
            }
            cel06.SEEN = FALSE;
        }
    }
    Else If (Verb == touch) {
	If (Dobj == <red crystal>) {
	    If ($loc($ME) == toolbox) {
		"The red and green crystals flare briefly!\n";
		Grow();
		$move($ME, cel01);
		MyLoc = -1;
	    }
            Else {
		"Nothing happens.\n";
	    }
	    $exit(1);
        }
	Else If (Dobj == <blue crystal>) {
	    If (!Wizrd & (<green crystal>.WORKD > 2)) {
		"Nothing happens.\n";
	    }
            Else {
		<green crystal>.WORKD = <green crystal>.WORKD + 1;
		"The blue and green crystals flare briefly!\n";
		$move($ME, toolbox);
		Shrink();
		MyLoc = -1;
	    }
	    $exit(1);
        }
	Else If (Dobj == <clear crystal>) {
	    "Nothing happens.\n";
	    $exit(1);
	}
    }
    Else If ($verb == break) {
	If (Dobj == <green crystal>) {
	    crydie();
	}
    }
}

red crystal(WEIGH)=15;
red crystal(POINT)=15;
red crystal(LDESC) = Proc() {"There is a beautiful red crystal here!\n";}
red crystal(SDESC) = Proc() {"a red crystal";}
red crystal(ACTION) = Proc()
{
    If (Verb == touch) {
	If (Dobj == <clear crystal>) {
	    If (Wizrd | (<clear crystal>.WORKD < 2)) {
		"The red and clear crystals flare briefly!\n";
		<clear crystal>.WORKD = <clear crystal>.WORKD + 1;
		<clear crystal>.LIGHT = TRUE;
                "The clear crystal blazes forth with a magical "
                "incandescence brilliant enough to penetrate even "
                "the deepest darkness!!\n\n";
		$sfus($ME, CRout, 7);
		$exit(1);
	    }
            Else {
		"Nothing happens.\n";
		$exit(1);
	    }
        }
	Else If (Dobj == <green crystal>) {
	    If ($loc($ME) == toolbox) {
		"The red and green crystals flare briefly!\n";
		Grow();
		$move($ME, cel01);
		MyLoc  = -1;
            }
            Else {
		"Nothing happens.\n";
	    }
	    $exit(1);
        }
	Else If (Dobj == <blue crystal>) {
	    If (($loc($ME) == desert) | ($loc($ME) == field)) {
		"The red and blue crystals flare briefly!\n";
		$move($ME, cel08);
		MyLoc = -1;
            }
	    Else {
		"Nothing happens.\n";
	    }
	    $exit(1);
	}
    }
    Else If (Verb == break) {
	If (Dobj == <red crystal>) {
	    crydie();
	}
    }
}


blue crystal(WEIGH)=15;
blue crystal(POINT)=15;
blue crystal(LDESC) = Proc() {"There is a beautiful blue crystal here!\n";}
blue crystal(SDESC) = Proc() {"a blue crystal";}
blue crystal(ACTION) = Proc()
{
    If (Verb == touch) {
	If (Dobj == <red crystal>) {
                If (($loc($ME) == desert) | ($loc($ME) == field)) {
		"The red and blue crystals flare briefly!\n";
		$move($ME, cel08);
		MyLoc = -1;
            }
	    Else {
		"Nothing happens.\n";
	    }
	    $exit(1);
        }
	Else If (Dobj == <green crystal>) {
	    If (!Wizrd | (<green crystal>.WORKD > 2)) {
		"Nothing happens.\n";
            }
	    Else {
		"The blue and green crystals flare briefly!\n";
		$move($ME, toolbox);
		Shrink();
		MyLoc = -1;
		<green crystal>.WORKD = <green crystal>.WORKD + 1;
	    }
	    $exit(1);
        }
	Else If (Dobj == <clear crystal>) {
	    "Nothing happens.\n";
	    $exit(1);
	}
    }
    Else If (Verb == break) {
	If (Dobj == <blue crystal>) {
	    crydie();
	}
    }
}

CRout = Proc()
{
    <clear crystal>.LIGHT = FALSE;
    "The glowing magical crystal seems to have gone dark.\n";
}

clear crystal(WEIGH)=15;
clear crystal(POINT)=40;
clear crystal(LDESC) = Proc()
{
    "There is a beautiful clear crystal here";
    If (<clear crystal>.LIGHT) {
	" (GLOWING!)";
    }
    "!\n";
}
clear crystal(SDESC) = Proc()
{
    "a clear crystal";
    If (<clear crystal>.LIGHT) {
	" (GLOWING!)";
    }
}
clear crystal(ACTION) = Proc()
{
    If (Verb == touch) {
	If (Dobj == <red crystal>) {
	    If (Wizrd | (<clear crystal>.WORKD < 2)) {
		"The red and clear crystals flare briefly!\n";
		<clear crystal>.WORKD = <clear crystal>.WORKD + 1;
		<clear crystal>.LIGHT = TRUE;
                "The clear crystal blazes forth with a magical incandescence "
                "brilliant enough to penetrate even the deepest "
                "darkness!!\n\n";
		$sfus($ME, CRout, 7);
		$exit(1);
	    }
            Else {
		"Nothing happens.\n";
		$exit(1);
	    }
	}
        Else If (Dobj == <green crystal>) {
	    "Nothing happens.\n";
	    $exit(1);
	}
        Else If (Dobj == <blue crystal>) {
	    "Nothing happens.\n";
	    $exit(1);
	}
    }
    Else If (Verb == break) {
	If (Dobj == <red crystal>) {
	    crydie();
	}
    }
}


NOUN	wood(cel20);
ROUTINE	KillDragon;
DRdem = Proc(isLdesc) // Dragon Daemon.  Increases temper in $my presence
{
    If (dragon.KILLED | !dragon.AWAKE) {
	If (isLdesc) "\n";
	Return 0;
    }
    If ($loc($ME) == $loc(dragon)) {
	If ($loc(<green crystal>) == $ME) {      // even worse!
	    Tempr = Tempr + 1;
	}
	Tempr = Tempr + 1;
	If (wood.FLAME & ($loc(wood) == $loc($ME))) {
	    KillDragon();
	    Return 0;
	}
    }
    If (Tempr >= 7) {
        "Jeez, I didn't know ice dragons could reach their boiling point! "
        "In a final flare of rage, he opens his mouth and breathes his frigid "
        "breath in a blast in your direction.  It's a bit much for you.";
	die();
    }
    Else If (Tempr >= 6)
	"Gee, he looks like he's really at the edge!";
    Else If (Tempr >= 5)
	"This is one upset dragon!  Be careful!";
    Else If (Tempr >= 3)
	"He's getting angrier...";
    Else
        "He looks a little peeved.";
    If (isLdesc) "\n";
}

dragon(WEIGH) = CAPAC;
dragon(LDESC) = Proc()
{
    If (dragon.AWAKE)
        "There is a fierce ice dragon glaring balefully in your direction.  ";
    Else
        "There is a large white dragon sleeping peacefully in the middle "
        "of the cavern floor.  ";
    DRdem(1);
}
dragon(SDESC) = Proc()
{
    If (dragon.AWAKE)
        "a fierce dragon.  ";
    Else
        "a somnolent dragon.  ";
    If (MyLoc != $loc($ME)) {
        DRdem(0);
    }
}

dragon(ACTION) = Proc()                 // Man, the things you can try here...
{
    If (dragon.AWAKE) {                 // This is the harder stuff
        If (Verb == strike) {
            "This just seems to get him angrier!\n";
            Tempr = Tempr + 1;
            $exit(1);
        }
        Else If (Verb == throw) {
            If (Iobj == dragon) {
                If (Dobj.WEIGH > 75) {
                    "This just bruises him!  Now he's getting mad!\n";
                    Tempr = Tempr + 1;
                    $exit(1);
                }
                Else {
                    "That object is just too light to hurt him.\n";
                    $exit(1);
                }
            }
            Else { // Dobj action
                "This amuses the dragon no end!\n";
                $exit(1);
            }
        }                                       // end of Throw  case
    }
    Else { // he's snoozing
        If (Verb == wake) {
            "You manage to waken him.  He's not happy.\n";
            Tempr = 1;
            dragon.AWAKE = TRUE;
            If (($loc(wood) == $loc($ME)) & wood.FLAME) {
                KillDragon();
            }
            $exit(1);
        }
        Else If (Verb == strike) {
            "Now you woke him up!  He's upset, too!\n";
            Tempr = 2;
            dragon.AWAKE = TRUE;
            $exit(1);
        }
        Else If (Verb == throw) {
            If (Iobj == dragon) {
                If (Dobj.WEIGH > 75) {
                    "It's just heavy enough to waken him.  The bruise "
                    "doesn't help his temper any either.\n";
                    dragon.AWAKE = TRUE;
                    Tempr = 3;
                    $exit(1);
                }
                Else {
                    "That object is just too light to wake him.\n";
                    $exit(1);
                }
            }
            Else {
                "Don't hurt yourself trying!\n";
                $exit(1);
            }
        }					// end of Throw  case
    }
}


NOUN money;
money(WEIGH) = 1;
money(LDESC) = Proc() {"There is a stack of money here!\n";}
money(SDESC) = Proc() {"a stack of money";}
money(POINT) = 30;
stack = money;
FOUND = MISC1;


NOUN bed (farm7);
bed(WEIGH) = CAPAC;
bed(SDESC) = Proc() {"an old, rickety bed";}

bed(ACTION) = Proc()
{
    If (Verb == move) {
	If (bed.OPENED) {
	    "Stop messing with the bed, it's fragile!\n";
	    $exit(1);
	}
        "Moving the bed seems to have loosened one of the wall panels "
        "on the west wall.\n";
	bed.OPENED = TRUE;
	$exit(1);
    }
    Else If ((Verb == look) & (Iobj == bed)) {
	If (Prep == under) {
	    If (!money.FOUND) {
		"You find some money under the bed!\n";
		$move(money, $loc($ME));
		money.FOUND = TRUE;
		$exit(1);
	    }
        }
	Else If (bed.OPENED) {
	    "The bed has been moved.\n";
	    $exit(1);
	}
    }
}

NOUN panel (farm7);
panel(OPENS) = TRUE;
panel(WEIGH) = CAPAC;
panel(ACTION) = Proc()
{
    If ((Verb == open) | (Verb == pry)) {
	If ((Iobj == crowbar) & ($loc(crowbar) == $ME)) {
	    If (!bed.OPENED) {
		"There aren't any loose enough.\n";
		$exit(1);
	    }
            "The loose panel comes away, revealing a secret stairway "
            "down, down...\n";
	    panel.OPENED = TRUE;
        }
        Else {
	    "You can't seem to get the panel open.\n";
	}
	$exit(1);
    }
}


NOUN bottle(town6);
bottle (WEIGH) = 5;
bottle (LDESC) = Proc() {"There is a bottle here.\n";}
bottle (SDESC) = Proc() {"a bottle";}
bottle (TRANS) = TRUE;
bottle (ACTION) = Proc()
{
    If (Verb == open) {
	"Hm, the bottle is somehow sealed shut.\n";
	$exit(1);
    }
    Else If (Verb == break) {
	"Wow, is that heavy glass!  It won't break!\n";
	$exit(1);
    }
    Else If (Verb == strike) {
	If (Iobj == bottle)
	    "Weird thing to do with it.\n";
	Else
	    "Nice try, but it isn't even scratched.\n";
	$exit(1);
    }
}

NOUN ship(bottle);
ship (LDESC) = Proc() {"There is a golden model ship here!\n";}
ship (SDESC) = Proc() {"a golden model ship";}
ship (WEIGH) = 5;
ship (POINT) = 50;
model = ship;

NOUN well(town5);
well(NOTAKE) = TRUE;
well(OPENED) = TRUE;
well (ACTION) = Proc()
{
    If (Iobj == well) {
	If (Verb == drop) {
	    TWN5y();
	}
    }
}

NOUN painting(cel08);
painting(ACTION) = Proc()
{
    If (Verb == take) {
	"You can't take the painting.\n";
	Skip = TRUE;
    }
    Else {
	"Fiddling with the painting is silly.\n";
	$exit(1);
    }
}

NOUN grate(riverx);
grate(Loc21) = GRATELOC;
grate(ACTION) = Proc()
{
    If (Verb == take) {
	"You can't take the grate.\n";
	Skip = TRUE;
    }
    Else {
	"Fiddling with the grate is useless.\n";
	$exit(1);
    }
}

NOUN insignia;
insignia(NOTAKE) = TRUE;
insignia (WEIGH) = CAPAC;
insignia (ACTION) = Proc()
{
    If (Verb == examine) {
        "The insignia consists of ";
	If ($loc($ME) == cel01)
            "red and green squares ";
	Else If ($loc($ME) == cel04)
            "red and clear squares ";
	Else If ($loc($ME) == cel08)
            "red and blue squares ";
	Else If ($loc($ME) == farm5)
            "blue and green squares ";
        "joined at the corners.\n";
	$exit(1);
    }
    "There's nothing useful to do with the insignia.\n";
    $exit(1);
}
square=insignia;

NOUN glass box(cel08);
glass box(HOLDS)=1;
glass box(TRANS)=TRUE;
glass box(OPENS)=TRUE;
glass box(OPENED)=FALSE;
glass box(SHRNK)=TRUE;          // First seen as a tiny box
glass box(LDESC) = Proc()
{
    If ($ME.SHRNK == <glass box>.SHRNK) {
	"There is a big glass case here.\n";
	<glass box>.WEIGH = CAPAC;
	<glass box>.HOLDS = 50;
    }
    Else {
	If ($ME.SHRNK) {
            "Before you looms a huge glass wall, inscribed with the words, "
            "'program error!'\n";
        }
	Else {
	    "There is a tiny glass box with a snap lid here.\n";
	    <glass box>.WEIGH = 5;
	    <glass box>.HOLDS = 1;
	}
    }
}
glass box(SDESC) = Proc()
{
    If ($ME.SHRNK == <glass box>.SHRNK) {
	"a glass case";
	<glass box>.WEIGH = CAPAC;
	<glass box>.HOLDS = 50;
    }
    Else {
	If ($ME.SHRNK) {
            "a huge glass wall, inscribed with the words, "
            "'program error'";
	}
        Else {
	    "a tiny glass box";
	    <glass box>.WEIGH = 5;
	    <glass box>.HOLDS = 1;
	}
    }
}
glass box(ACTION) = Proc()
{
    If (Verb == examine) {
	If (<glass box>.OPENED)
	    "The case is opened.\n";
	Else
	    "The case is closed (pun not intended).\n";
	$exit(1);
    }
}
case=glass box;

NOUN statue(glass box);
sand = statue;
sand(SHRNK)=TRUE;
sand(WEIGH)=1;
sand(LDESC) = Proc()
{
    If (sand.SHRNK & !$ME.SHRNK) {
	sand.POINT = 0;
	"There is a grain of sand here.\n";
    }
    Else {
	"There is a beautiful porcelain statue here!\n";
	sand.POINT = 50;
    }
}
sand(SDESC)= Proc()
{
    If (sand.SHRNK & !$ME.SHRNK) {
	sand.POINT = 0;
	"a grain of sand";
    }
    Else {
	"a porcelain statue";
	sand.POINT = 50;
    }
}
sand(ACTION) = Proc()
{
    If (Verb == take) {
	If (sand.SHRNK & !$ME.SHRNK) {
	    "You fumble the grain of sand and lose it on the ground.\n";
	    $move(sand, $ALL);
	    Skip = TRUE;
	}
    }
}

NOUN hole;
hole(NOTAKE) = TRUE;
hole(ACTION) = Proc()
{
    "You can't do anything useful with the hole.\n";
    $exit(1);
}

NOUN rock(road5);
rock(LDESC) = Proc() {"There is a plain-looking rock here.\n";}
rock(SDESC) = Proc() {"an ordinary rock";}
rock(ACTION) = Proc()
{
    If ((Verb == take) & (Dobj == rock)) {
	"Mmph!  Heavy!\n";
    }
}
rock(WEIGH)=100;

IFOUND = MISC1;
NOUN ivory(riverx);
ivory(WEIGH) = 5;
ivory(POINT) = 30;
ivory(Loc21) = GRATELOC;
ivory(LDESC) = Proc()
{
    "There is a beautiful piece of ivory ";
    If (!ivory.IFOUND) {
	"wedged in the grate.\n";
	ivory.IFOUND = TRUE;
    }
    Else {
	"here.\n";
    }
}
ivory(SDESC) = Proc()
{
    "a piece of ivory";
    If (!ivory.IFOUND) {
	" (wedged in the grate)";
	ivory.IFOUND = TRUE;
    }
}


NOUN matches(cel12);
matches(LDESC) = Proc() {"There is a book of waterproof matches here.\n";}
matches(SDESC) = Proc() {"a book of matches";}
matches(ACTION) = Proc()
{
    If (((Verb == light) | (Verb == burn)) & (Dobj == matches)) {
	"OK, you light a match, which quickly burns out.\n";
	$exit(1);
    }
}
matches(WEIGH) = 1;
book = matches;

WoodBurn = Proc()
{
    If ($loc(wood) == $loc($ME)) {
	"The wood burns down to a pile of ashes, which blows away.\n";
    }
    $move(wood, $ALL);
    wood.FLAME = FALSE;
}


// NOUN wood(cel20);
wood(LDESC) = Proc()
{
    "There is a pile of ";
    If (wood.FLAME) "burning ";
    "wood here.\n";
}
wood(SDESC) = Proc()
{
    "a pile of ";
    If (wood.FLAME) "burning ";
    "wood";
}
wood(WEIGH) = 100;
wood(ACTION) = Proc()
{
    If (wood.FLAME) {
	"The wood is too hot to touch.\n";
	If ((Verb == take)  | (Verb == drop)) {
	    Skip = TRUE;
	    Return 0;
        }
	Else {
	    $exit(1);
	}
    }
    Else If ((Verb == burn) | (Verb == light)) {
	If (!Iobj) {
	    "You must tell me how to do that!\n";
	    $exit(1);
	}
        Else If (Iobj != matches) {
	    "That doesn't seem to work.\n";
	    $exit(1);
        }
	Else If ($loc(wood) == $ME) {
	    "You can't manage that while you are holding the wood.\n";
	    $exit(1);
	}
        "You strike a match and apply it to the wood, which bursts "
        "into flames.\n";
	If (dragon.AWAKE & ($loc($ME) == $loc(dragon))) {
	    KillDragon();
        }
	Else {
	    wood.FLAME = TRUE;
	    $sfus($ME, WoodBurn, 3);
	}
	$exit(1);
    }
}


KillDragon = Proc()
{
    "The dragon, attracted by the bright flame of the burning wood, snaps it "
    "up in its jaws.  Suddenly, the dragon realizes what it has done!  It "
    "tries to spit out the wood, but it is too late!  The dragon evaporates "
    "with a deafening whistle and a burst of steam!  ";
    If (($loc(bottle) == $loc($ME)) | ($loc(bottle) == $ME)) {
        "The sound of the whistle shatters the bottle, "
        "releasing the golden ship model!  ";
	$move(ship, $loc($ME));
	$move(bottle, $ALL);
    }
    "Upon the death of the dragon, the ice melts with astonishing speed.\n";
    $dfus($ME, WoodBurn);
    $move(wood, $ALL);
    dragon.KILLED = TRUE;
    $move(dragon, $ALL);
    cel06.SEEN = FALSE;
    cel05.SEEN = FALSE;
    cel03.SEEN = FALSE;
    cel10.SEEN = FALSE;
    cel08.SEEN = FALSE;
}

NOUN goblet(cel19);
FREED = MISC1;
goblet(WEIGH) = 5;
goblet(POINT) = 25;
goblet(LDESC) = Proc()
{
    If (!goblet.FREED)
	"There is a beautiful golden goblet frozen in the ice!\n";
    Else
	"There is a beautiful golden goblet here!\n";
}
goblet(SDESC) = Proc()
{
    "a golden goblet";
    If (!goblet.FREED) " (frozen in the ice)";
}
goblet(ACTION) = Proc()
{
    If (!goblet.FREED) {
        "There's not much you can do with the goblet while it's frozen "
        "in the ice.\n";
	$exit(1);
    }
}

NOUN newspaper(town2);
paper = newspaper;
newspaper(LDESC) = Proc()
{
    "There is a newspaper fluttering in the breeze here.\n";
}
newspaper(SDESC) = Proc() {"a newspaper";}
newspaper(ACTION) = Proc()
{
    If ((Verb == read) | (Verb == examine)) {
	"		UNUCHEVALA NEWS -- VOLUME II NUMBER 1\n"
        "\n"
        "VANDALS THREATEN COWLEY\n"
        "\n"
        "\tLast night,  unknown vandals attacked the farm of Mr. Cowley, "
        "north of town.  They sprayed \"DIE, HEATHENS\" on  his front "
        "door (in reference to his admittedly strange  beliefs).   Cowley "
        "says that this is not the first such threat he has received. "
        "However, he says that he will deal with the vandals in his own "
        "way.   Unfortunately,  we have been unable to contact Mr. Cowley "
        "personally, since he has not been seen hereabouts "
        "since last night.\n"
        "\n"
        "DROUGHT IMMINENT, SAY LOCAL FARMERS\n"
        "\n"
        "\tThe  Unuchevala  River has recently  been  falling,  and "
        "little relief is in sight for our  local farmers.   \"I'm agonna "
        "leave here, purty soon,\" said one farmer  (who chose to "
        "remain anonymous).   \"It's all that danged Cowley's fault, "
        "messin'  about  with  things  that  ain't natrawl-like.  I "
        "caint even raise 'nuff to feed myself, not mentionin' the "
        "resta the town.\"\n"
        "\n"
	"WEATHER -- Continued dry, with no rain in sight.\n"
        "\n";
	$exit(1);
    }
    Else If ((Verb == burn) | (Verb == light)) {
	If (!Iobj) {
	    "You must tell me how to do that!\n";
	    $exit(1);
        }
	Else If (Iobj != matches) {
	    "That doesn't seem to work.\n";
	    $exit(1);
        }
	Else If ($loc(newspaper) == $ME) {
	    "You can't manage to do that while holding the newspaper.\n";
	    $exit(1);
	}
        "The newspaper lights easily, burning down to ashes which blow away.\n";
	If (($loc($ME) == $loc(dragon)) & dragon.AWAKE) {
            // give the player a hint
            "The dragon notices the flash and approaches the newspaper, "
            "but the fire dies down before the dragon can reach it.\n";
	}
	$move(newspaper, $ALL);
	$exit(1);
    }
}

NOUN ice;
ice(NOTAKE) = TRUE;
ice(ACTION) = Proc()
{
    If ((Verb == break) | (Verb == hit)) {
	If (Dobj == ice) {
	    If (!Iobj) {
		"You must tell me how to do that.\n";
		$exit(1);
	    }
	    If ($loc($ME) == cel19) {
		If (Iobj.WEIGH > 20) {
		    If (!goblet.FREED) {
			"You manage to free the goblet.\n";
			goblet.FREED = TRUE;
			$move(goblet, cel19);
			$exit(1);
		    }
		}
            }
	    Else If ($loc($ME) == cel13) {
		If (!cel13.HOLED) {
		    If (Iobj.WEIGH > 75) {
                        "You swing at the ice with the " $name(Iobj)
                        ", which breaks through and sinks into "
                        "the icy waters below!\n";
                        $ME.HAS = $ME.HAS - Iobj.WEIGH;
			$move(Iobj, $ALL);
			cel13.HOLED = TRUE;
			$exit(1);
		    }
		}
	    }
	    "The ice chips a bit, but does not break.\n";
	    $exit(1);
   	}
    }
    "You can't do that!\n";
    $exit(1);
}

NOUN socket(cel20);

outlet = socket;
receptacle = socket;

NOUN toaster, token(toaster);
toaster(WEIGH) = 5;
PLUGGED = MISC1;
toaster(LDESC) = Proc() {"There is an old-fashioned toaster here.\n";}
toaster(SDESC) = Proc() {"a toaster";}
toaster(ACTION) = Proc() {
    If (Verb == take) {
        If (toaster.PLUGGED)
            "You can't take the toaster while it's plugged in!\n";
        Else If ($loc(token) == toaster) {
            "Something rattles inside the toaster as you take it.\n";
            $move(toaster, $ME);
        }
        Skip = TRUE;
    }
    Else If (Verb == plug) {
        If (((Iobj == toaster) & !Dobj & (Prep == in)) |
            ((Dobj == toaster) & (Iobj == socket) & (Prep == in)))
        {
            If ($loc(socket) != $loc($ME))
                "I don't see a socket here.\n";
            Else If (toaster.PLUGGED)
                "It's already plugged in!\n";
            Else {
                If ($loc(token) == toaster) {
                    "As you plug the toaster in, a bell rings, and "
                    "something pops out!\n";
                    $move(token, $loc($ME));
                }
                Else
                    "OK, the toaster is plugged in.\n";
                $move(toaster, $loc($ME));
                toaster.PLUGGED = TRUE;
            }
            $exit(1);
        }
        Else {
            "I can't do that!\n";
            $exit(1);
        }
    }
    Else If (Verb == unplug) {
        If (!((Dobj == toaster) & (!Iobj | (Iobj == socket))))
            "Why would anybody want to do such a thing?\n";
        Else If (!toaster.PLUGGED)
            "It's already unplugged!\n";
        Else {
            "You unplug the toaster.\n";
            toaster.PLUGGED = FALSE;
        }
        $exit(1);
    }
}

token(WEIGH) = 1;
token(LDESC) = Proc() {"There is a bus token here.\n";}
token(SDESC) = Proc() {"a bus token";}
token(ACTION) = Proc() {
    If (Verb == examine) {
        "The token reads, \"This token redeemable for one (1) trip by "
        "bus along the Unuchevala - Doscale route.  No cash value.\"\n"
        $exit(1);
    }
}

socket(NOTAKE) = TRUE;
socket(SDESC) = Proc() {"a socket";}
socket(ACTION) = Proc() {
    If ((Dobj != toaster) & ((Verb == plug) | (Verb == unplug))) {
        "You really shouldn't play with electrical sockets.\n";
        $exit(1);
    }
    Else If (Verb == take) {
        "The socket is firmly attached to the wall.\n";
        Skip = TRUE;
    }
}

NOUN bus(Roadx);
bus(LIGHT) = TRUE;
bus(NOTAKE) = TRUE;
bus(RDLOC) = 5;
bus(WEIGH) = CAPAC;
MOVING = MISC1;
bus(LDESC) = Proc() {
    If ($loc($ME) == bus) {
        "You are on board a rusty old bus";
        If (bus.MOVING) {
            ", which is travelling ";
            If ($loc(bus) == city) "east";
            Else "west";
            " down a dusty road.";
        }
        Else
            ".  The only way to go is out.";
        "  There is a slot by the door, above which is a sign "
        "reading, \"FARE: 25 CENTS\"\n";
    }
    Else {
        "There is a rusty old bus here, ";
        If ((HWY7 == 11) | ($loc(bus) == city))
            "facing east.\n";
        Else If (HWY7 == 5)
            "facing west.\n";
    }
}
bus(SDESC) = Proc() {
    If ($loc($ME) == bus)
        Return Sayer("Bus", $arg(0));
    Else
        "a bus";
}
bus(ACTION) = Proc() {
    If ($loc($ME) == bus) {
        If (GOVERB) {
            If (bus.MOVING) {
                "You can go nowhere while the bus is moving.\n";
                GOVERB = FALSE;
            }
            Else If (Verb == exit) {
                If ($loc(bus) == city)
                    $move($ME, city);
                Else {
                    $move($ME, road7);
                    Get7($cont(Roadx));
                }
                GOVERB = FALSE;
            }
        }
    }
    Else If (Verb == enter) {
        If ($loc($ME) != $loc(bus)) {
            "You see no bus here.\n";
            $exit(1);
        }
        "You board the bus.\n";
        If ($loc($ME) == road7)
            Dump7($cont(road7));              // Put the bus at Roadx
        $move($ME, bus);
        $exit(1);
    }
    Else If (Verb == take) {
        "Get real!\n";
        $exit(1);
    }
    Else If (Verb == examine) {
        If (($loc($ME) == road7) & (HWY7 == 5))
            "There is smoke pouring out from the engine compartment.  ";
        "The door is open, and you may enter if you wish.\n";
        $exit(1);
    }
}

BStop = Proc() {
    bus.MOVING = FALSE;
    If ($loc(bus) == city) {
        "The bus grinds to a halt with a loud noise that "
        "leads you to believe that it has done its last run.\n";
        $move(bus, Roadx);
        bus.RDLOC = 11;
        HWY7 = 11;
    }
    Else {
        "The bus swings around so that it faces east, then "
        "turns itself off.\n";
        $move(bus, city);
    }
}


NOUN bag(building);
bag(WEIGH) = 3;
bag(LDESC) = Proc() {"There is a large canvas bag here.\n";}
bag(SDESC) = Proc() {"a bag";}
bag(OPENS) = TRUE;
bag(HOLDS) = 15;
sack = bag;

NOUN silver rod(bag);
silver rod(WEIGH) = 8;
silver rod(POINT) = 100;
WAVED = MISC1;
silver rod(LDESC) = Proc() {"There is a large silver rod here.\n";}
silver rod(SDESC) = Proc() {"a silver rod";}
silver rod(ACTION) = Proc() {
    If ((Verb == wave) & (Dobj == <silver rod>)) {
        "A faint humming noise comes from the rod!";
        If (!<silver rod>.WAVED & ($loc($ME) == cel08)) {
            "  The painting seems subtly altered.\n";
            <silver rod>.WAVED = TRUE;
        }
        Else
            "\n";
        $exit(1);
    }
}

NOUN slot(bus);
slot(NOTAKE) = TRUE;
slot(OPENED) = TRUE;
slot(SDESC) = Proc() {"a coin slot";}
slot(ACTION) = Proc() {
    If ((Verb == drop) & (Iobj == slot)) {
        If ($loc($ME) != bus)
            "You see no slot here.\n";
        Else If (!Dobj)
            "You must tell me what to drop into the slot.\n";
        Else If (Dobj != token)
            "The " $name(Dobj) " doesn't fit into the slot.\n";
        Else {
            "As you drop the token into the slot, the bus starts to "
            "move with a nauseating jerking motion!\n";
            bus.MOVING = TRUE;
            If ($loc(bus) == city) {
                $sfus($ME, BStop, 3);
                $move(token, $ALL);
            }
            Else {
                $sfus($ME, BStop, 4);
                $move(token, bag);
            }
        }
        Skip = TRUE;
    }
    Else If (Verb == take) {
        "The slot is not easily graspable.\n";
        Skip = TRUE;
    }
}
