ADL Scenario Source Code

    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) = 25;
    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)=25;
    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 (<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)=25;
    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 (!<clear crystal>.WORKD) {
    		"The red and clear crystals flare briefly!\n";
    		<clear crystal>.WORKD = TRUE;
    		<clear crystal>.LIGHT = TRUE;
                    "The clear crystal blazes forth with a magical "
                    "incandescence brilliant enough to penetrate even "
                    "the deepest darkness!!\n\n";
    		$move($ME, cel04);
    		MyLoc = -1;
    		$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 If (!RBTouch) {
    		"The red and blue crystals flare briefly!\n";
    		RBTouch = TRUE;
                }
    	    Else {
    		"Nothing happens.\n";
    	    }
    	    $exit(1);
    	}
        }
        Else If (Verb == break) {
    	If (Dobj == <red crystal>) {
    	    crydie();
    	}
        }
    }

    blue crystal(WEIGH)=15;
    blue crystal(POINT)=25;
    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";
    		RBTouch = TRUE;
    		$move($ME, cel08);
    		MyLoc = -1;
                }
    	    Else If (!RBTouch) {
    		"The red and blue crystals flare briefly!\n";
    		RBTouch = TRUE;
                }
    	    Else {
    		"Nothing happens.\n";
    	    }
    	    $exit(1);
            }
    	Else If (Dobj == <green crystal>) {
    	    If (<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)=25;
    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 (!<clear crystal>.WORKD) {
    		"The red and clear crystals flare briefly!\n";
    		<clear crystal>.WORKD = TRUE;
    		<clear crystal>.LIGHT = TRUE;
                    "The clear crystal blazes forth with a magical incandescence "
                    "brilliant enough to penetrate even the deepest "
                    "darkness!!\n\n";
    		$move($ME, cel04);
    		MyLoc = -1;
    		$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...";
        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) = 25;
    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) = 25;
    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);
        SCORE = SCORE + 100;
        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";
    			$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);
    }