Rename game files to lowercase
[spiritwrak.git] / src / anthar.inf
diff --git a/src/anthar.inf b/src/anthar.inf
new file mode 100644 (file)
index 0000000..564deca
--- /dev/null
@@ -0,0 +1,2034 @@
+
+! ****************************************************************
+! ANTHAR.INF
+! -- Add-on for SPIRITWRAK
+! (Do not use alone!)
+! ****************************************************************
+
+Object ANTHAR_GUSStop "Entrance to Greater Anthar"
+   with description "You're just west of Greater Anthar on the \
+island nation of Antharia. The bright sunlight \
+seems to make the city streets east of here glitter. \
+A stairway leads down.",
+        name "sunlight" "streets" "glitter" "stairway",
+        d_to ANTHAR_GUSStation,
+        e_to ANTHAR_West, 
+   has light;
+
+Object ANTHAR_West "Anthar West"
+   with description "You are standing in a busy section of \
+West Greater Anthar City. The city seems to thin \
+out to the west. A roadway heads east, \
+the ever-popular Flathead \
+Stadium lies to the northeast, and a pub lies to the \
+south.",
+        name "roadway" "stadium" "pub",
+        w_to ANTHAR_GUSStop,
+        e_to ANTHAR_East,
+        s_to Delbins,
+        in_to Delbins,
+        ne_to Stadium_entrance,
+        cant_go "You walk around the area, take in the local scene, and \
+                 find yourself back here.",
+        before [;
+           Smell:  "You can smell scents of local cooking coming \
+                   from the south.";
+        ],
+   has light;
+
+Object ANTHAR_East "Anthar East"
+   with description "You are standing in a busy section of \
+East Greater Anthar City. The city continues to \
+the west. There is a large odd structure to the \
+east, made mostly of glass. The ever-popular Flathead \
+Stadium lies to the northwest. A short walk down \
+to a waterfront area is to the south.",
+        name "structure" "glass" "stadium" "waterfront",
+        w_to ANTHAR_West,
+        e_to Conservatory_entrance, 
+        s_to ANTHAR_Waterfront,
+        nw_to Stadium_entrance,
+        cant_go "You walk around the area, take in the local scene, and \
+                 find yourself back here.",
+        before [;
+           Smell:  "You smell rather nice floral scents coming \
+                   from the east.";
+        ],
+   has light;
+
+
+Object ANTHAR_Waterfront "Swank Waterfront"
+   with description "A pleasant waterfront walk is your current \
+location. You can see the Great Sea stretching out \
+before you to the south, a breath-taking sight. \
+A rail runs along the south end, preventing \
+an untimely fall into the rock shore below. The \
+city is back to the north.",
+        name "waterfront" "sea" "great" "railing" "rail" "rock" "shore",
+        n_to ANTHAR_East,
+   has light;
+
+Object telescope "viewing telescope" ANTHAR_Waterfront
+   with name "telescope" "viewing" "scope",
+        capacity 1,
+        when_closed "There's a viewing telescope here, attached to the railing.",
+        when_open [ x ;
+              print "There's a viewing telescope here, attached to the \
+railing. One of the lenses seems loose";
+              if (children(self) == 0) ".";
+              else {
+                 print ". Inside you see:^";
+                 x = FULLINV_BIT + INDENT_BIT + NEWLINE_BIT + RECURSE_BIT;
+                 WriteListFrom (child(telescope), x, 1); rtrue;
+              }
+        ],
+        description "A nice tourist toy. Perfect for getting a good view.",
+        before [;
+           Open:  print "You pry loose a lens. ";
+           Close: print "You push the lens back in place. ";
+           Search: 
+              if (self hasnt open) {
+                 print "You take a peak through the telescope";
+                 if (children(self) ~= 0)
+                    " but oddly, there's something blocking your \
+                    view.";
+                 else {
+                 if (random(40)==1)
+                    " and see a ship in the distance! Wait, perhaps not. \
+It's gone.";
+                 " and see a nice expanse of the Great Sea.";
+                 }
+              }
+        ],
+        size 10,
+   has static container openable;
+
+! (Conservatory gardens)
+
+Object Conservatory_entrance "Conservatory Entrance"
+   with description "You stand before the entrance to a large public \
+conservatory. You can enter the greenhouses to the northeast \
+and southeast, or walk back to Anthar to the \
+west.",
+        name "greenhouse" "greenhouses",
+        w_to ANTHAR_East,
+        ne_to Con_Desert_garden,
+        se_to Con_Flower_garden,
+        before [;
+           Smell: "You can smell floral scents from the southeast.";
+        ],
+   has light;
+
+Object Con_Desert_garden "Desert Garden"
+   with description "A nicely arranged collection of desert plants \
+is here in the ~Desert Garden~. Bright sunlight \
+and a sandy ground enhance the overall effect. \
+The conservatory entrance is to the southwest, or \
+more gardens lie to the south and east.",
+        name "sunlight" "plants" "sand" "gardens",
+        sw_to Conservatory_entrance,
+        e_to Con_Forest_garden,
+        s_to Con_Decor_garden, 
+   has light;
+
+
+Object Con_Flower_garden "Flower Garden"
+   with description "A rather lovely flower garden lies before you. \
+The multi-colored flowers are turning the air into \ 
+perfume. The conservatory entrance is northwest, \
+or more greenhouse gardens lie to the north and \
+east. A tiny trail leads south past the flower \
+beds.",
+        name "perfume" "entrance" "trail" "greenhouse",
+        nw_to Conservatory_entrance,
+        e_to Con_Jungle_garden,
+        n_to Con_Decor_garden,
+        s_to Con_storehouse,
+        before [;
+          Smell:  "The bouquet of flowers is quite intoxicating.";
+        ],
+   has light;
+
+Nearby flowers "flowers"
+   with name "flowers" "flower" "garden",
+        description "A lovely assortment of flowers.",
+        before [;
+          Take: "Don't pick the flowers.";
+          Cast: 
+             if (the_spell_was == throck_spell)
+                "Suddenly, a few more flowers spring out of the \
+                ground!";
+        ],
+   has scenery;
+
+Object Con_storehouse "Gardener's Storehouse"
+   with description "This must be a storehouse for the conservatory \
+gardeners. There are soil stains and plant debris all over. \
+The only exit is north.",
+        name "soil" "stains" "debris" "plant",
+        n_to Con_Flower_garden,
+   has light;
+
+Nearby toolshed "toolshed"
+   with name "toolshed" "shed",
+        description "A plain toolshed.",
+        with_key shed_key,
+        capacity 10,
+        size 20,
+        when_closed "A toolshed stands closed against the wall.",
+        when_open [ x;
+         print "The toolshed is open. ";
+         x = children(self);
+         if (x == 0) "It is empty.";
+         print "Inside ";
+         if (x == 1) print "is: "; else print "are: ^";
+         x = FULLINV_BIT + INDENT_BIT + NEWLINE_BIT + RECURSE_BIT;
+         WriteListFrom (child(self), x, 1); 
+         rtrue;
+       ],
+   has static container openable lockable locked;
+
+! (contents of shed)
+Object gardeners_cap "cap" toolshed
+   with name "cap",
+        description "A cap with an odd green emblem stitched on \
+the front that looks like a clover.",
+        size 10,
+   has clothing;
+Object hedge_clipper "hedge clipper" toolshed
+   with name "clipper" "clippers",
+        description "Basically a long pair of scissors.",
+        size 15,
+;
+Object rubber_gloves "rubber gloves" toolshed
+  with name "gloves" "pair" "rubber",
+       article "a pair of",
+       description "A pair of yellow rubber gloves, slightly \
+worn. Good for gardening, or washing dishes, I suppose.",
+       size 10,
+has clothing;
+
+! (cracked -- magic has questionable source, doesn't always work)
+Object p3 "cracked parchment" toolshed
+   class parchment_class,
+   with name "cracked",
+description "~...is true that those who go by the title of \
+'Enchanters' need not wear any holy symbol through which \
+to draw magical power. Indeed, it seems as though the very \
+amulets we must wear are our only link to magical powers \
+at all. Worse yet, the powers are indeed granted from \
+powers above, but the Ancient Ones? I think not. For indeed, \
+I have found places where magic powers will not work, with or \
+without the amulet. Likewise, I have found places where \
+magic works, but praying to the Ancient Ones goes unanswered! \
+What this all...~";
+
+Object Con_Decor_garden "Decorative Plants Garden"
+  with description "\ 
+You are standing in a small well-kept garden. The plots surrounding the \
+paths are filled with a variety of general ground-cover plants, all \
+appropriate for most discerning homeowners. Exits lie north and south.",
+       name "ground-cover" "plots" "flamingo" "tinsel" "ornament",
+       n_to Con_Desert_garden,
+       s_to Con_Flower_Garden,
+  has light;
+
+Object Con_Forest_garden "Forest Garden"
+   with description "A garden path winds through this narrow \
+greenhouse, which is stocked with various forest plants. \
+The path winds back to the west and south.",
+        name "path",
+        w_to Con_Desert_garden,
+        s_to Con_Fountain,
+   has light;
+
+Nearby plants1 "plants"
+   with name "plants" "plant" "tree" "forest",
+        description "You are reminded of a hiking trip you took once.",
+        before [;
+           Cast: 
+              if (the_spell_was == throck_spell)
+                 "The forest seems a bit livelier now.";
+        ],
+   has scenery;
+
+Object Con_Jungle_garden "Jungle Garden"
+   with description "A garden path winds through this \
+long greenhouse, which is filled with plants native to \
+jungle settings. The environment is somewhat \
+humid. The path heads west and north from here.", 
+        name "path" "humid",
+        w_to Con_Flower_garden,
+        n_to Con_Fountain,
+        e_to [;
+          if (waterfall hasnt general)
+             "You can't go that way.";
+          else return Con_Nursery;
+        ],
+        before [;
+           Smell: "You smell flowers to the west.";
+        ],
+   has light;
+
+Nearby plants2 "plants"
+   with name "plants" "plant" "tree" "jungle",
+        description "Reminds you of a picture you once saw of \
+the Miznia jungles.",
+        before [;
+           Cast: 
+              if (the_spell_was == throck_spell)
+                 "The jungle seems a bit livelier now.";
+        ],
+   has scenery;
+
+Object waterfall "small waterfall" Con_Jungle_garden
+   with name "waterfall" "fall" "falls",
+        initial [;
+            if (self hasnt general)
+               print "A nice little waterfall enhances the jungle \
+setting";
+            else 
+               print "A fake waterfall hides a passage";
+            " to the east.";
+        ],
+        description [;
+            print "A small";
+            if (self has general) print " fake";
+            " waterfall drops out of a mock-stucco \
+wall to the east.";
+        ],
+        before [;
+           Pull, Push, Touch, Search, Rub:
+              give self general;
+              "You reach out, expecting to get your hands wet, but \
+              to your surprise, you feel a cloth-like substance. \
+              On closer examination, you realize that the waterfall \
+              is a clever realistic-looking fake, made of cloth \
+              and wood. Stepping around some low plants, you also \
+              notice the waterfall covers a passage east!";
+           ThrownAt:
+              move noun to Con_Jungle_garden;
+              CDefArt(noun); ", to your surprise, literally \
+              bounces off the waterfall, and lands with a thump \
+              nearby.";
+        ],
+   has static;
+
+Object Con_Nursery "Nursery"
+   with description "This small back room is apparently the \
+conservatory nursery. Bits of soil and plant \
+debris are everywhere, along with immature \
+seedling plants. A exit lies west, partially \
+covered by some cloth.",
+         name "soil" "plant" "debris" "seedling" "cloth", 
+        w_to Con_Jungle_garden,
+   has light;
+
+Object smallpot "small flower pot" Con_Nursery
+   with name "pot",
+        description "A small red-ceramic flower pot, \
+ideal for small plants, I suppose.",
+        before [;
+           Push, Take:
+              if ((location == Con_Nursery) && (self hasnt general))  {
+                 give self general;
+                 move shed_key to Con_Nursery;
+                 print "Moving the pot uncovers a small key hidden \
+underneath it.^";
+                 if (action==##Push) rtrue; else rfalse;
+              }
+           LookUnder:
+              if ((location == Con_Nursery) && (self hasnt general))  {
+                 "The pot does appear to be sitting crooked. But \
+                 you can't see whatever is under it.";
+              }
+           Cast:
+              if ((the_spell_was == huncho_spell or luncho_spell) &&
+                  (self hasnt general)) {
+                     give self general;
+                     move shed_key to Con_Nursery;
+                     rfalse;
+                  }                 
+        ],
+        size 15,
+   has container open transparent;
+
+
+Object Con_Fountain "Fountain"
+   with description "A tasteful fountain intercepts a north-south \
+garden trail here.",
+        name "trail",
+        n_to Con_Forest_garden,
+        s_to Con_Jungle_garden,
+        each_turn [;
+          if (random(20) == 1)
+             "^You hear someone whistling nearby, but there doesn't \
+seem to be anyone around.";
+        ],
+   has light;
+
+Nearby fountain "fountain"
+   with name "fountain", 
+        description "A stone basin with a central fountain spout \
+shaped like a fish. There's no water running currently.",
+        before 
+        [ x;
+           Search: 
+              if (self hasnt general) {
+                  give self general;
+              move c3 to self;
+              "You fish in the fountain for a bit and find a coin!";
+              }
+              else {
+                 print "Mostly wet plant debris";
+                 x = children(self);
+                 if (x == 0) 
+                    ", nothing interesting.";
+                 print ". You also notice:^";
+         x = FULLINV_BIT + INDENT_BIT + NEWLINE_BIT + RECURSE_BIT;
+         WriteListFrom (child(self), x, 1); rtrue;
+              }
+           Receive:
+              if (noun has is_coin)
+                 print "Hoping for a little luck, I presume?";
+        ],
+        capacity 10,
+        size 25,
+   has scenery container open;
+
+Object glasses "pair of glasses" Con_Fountain
+   with name "glasses",
+        initial "It looks like someone left their glasses here.",
+        description "Thick lenses and a heavy frame.",
+        before [;
+           Wear: "You put the glasses on for a moment, and it's like \
+                 looking through a fishtank. Deciding \
+                 against continuing your quest without adequate \
+                 vision, you take them off.";
+        ],
+        size 5,
+   has clothing;
+
+Object c3 "coin" class coin_class;
+
+Object shed_key "small key" 
+   with name "key" "small",
+        description "A small metal key.",
+        size 4,
+; 
+
+
+! (Delbin's Pub)
+
+Object Delbins "Delbin's Pub"
+   with description [;
+           print "Delbin's Pub has been a popular food and drink spot in \
+           South Anthar for quite a while. ";
+           if (self hasnt general)
+           print "Usually, you need to \
+           fight off barbarians to find a place to sit. At the moment, \
+           however, the place is unusually quiet. A group of \
+           barbarians seem paralyzed with fear near the back wall, \
+           glancing nervously at the front of the bar.";
+           else print "A group of barbarians \
+           are making a lot of noise nearby.";
+           " The exit is to the north.";
+        ],
+        name "back" "front",
+        number 0,
+        before [;
+          Listen:
+             if (self has general)
+                "The barbarians are a rather noisy bunch.";
+          Go:
+            if ((noun == n_obj) || (noun==out_obj))
+print "Delbin calls out ~Visit us again!~ as you leave.^";
+        ],
+        n_to ANTHAR_West,
+        out_to ANTHAR_West,
+        each_turn [ i ;
+           if (Morgan in Delbins) {
+              i = random(3);
+              if ((i==1) && (Delbins.number == 0)) {
+                Delbins.number = 1;
+                 "^The man in black makes a lightning fast move for the \
+glass of ale, but is countered by an equally fast move by the warrior. \
+~Lose something, thief?~ the woman says. ~No need to get violent, Morgan,~ \
+the thief says.";
+              }
+              if ((i==1) && (Delbins.number == 1)) {
+                Delbins.number = 2;
+                 "^The wizard looks at his companions. ~Say, did I ever \
+show any of you my famous disappearing glass trick?~ He starts to take \
+off his wizard's hat, but the gentleman and ranger stop him. ~Don't \
+even try it, Frobar.~ the woman warrior says.";
+              }
+              if ((i==1) && (Delbins.number == 2)) {
+                Delbins.number = 3;
+                 "^The female ranger fixates on the glass of ale. \
+~Look you two, some of us have better things to do, like fight wars.~ \
+The wizard scowls. ~Oh save it, Morgan.~ he says.";
+              }
+            }
+          ], 
+   has light;
+Nearby barbarians "barbarians"
+   with name "barbarians" "group",
+        description "A group of dirty barbarians. One of them \
+           sees you staring at them, and gives you a dirty look.",
+        life [;
+           default:
+ if (Morgan in Delbins)
+    "The barbarians are somewhat paralyzed with fear at the moment.";
+ else 
+    "The barbarians are far too busy telling rude jokes \
+at the moment.";
+        ],
+   has animate concealed;
+
+Object headdress "headdress" Delbins
+   with name "headdress",
+        initial "A gaudy headdress of some kind is \
+hanging on a nearby wall.",
+        description "A large headdress made of animal fur and colorful \
+bird feathers.",
+        size 15,
+   has clothing;
+
+Object bar "bar" Delbins
+   with name "bar",
+        description "A long flat wood bar that could probably use a \
+washing.",
+        before [;
+           Cast:
+             if (the_spell_was == egdelp_spell) {
+                print "The bar is covered with a waxy film. \
+Delbin notices this and shrugs.";
+             }
+           LetGo:
+             if (noun==ale_glass) {
+                <Take ale_glass>; rtrue; }
+        ],
+   has scenery supporter;
+
+Object ale_glass "glass of ale" bar
+   with name "glass" "ale",
+        description "A small glass filled with an amber liquid.",
+        before [;
+           Take:
+              "You receive cold stares from the three individuals \
+              at the bar. ~Get your own,~ the Ranger says and \
+              pushes you back.";
+           Drink:
+              "You receive cold stares from the three individuals \
+              at the bar. ~Get your own,~ the Thief says and \
+              takes the glass from you before you can bring it \
+              to your lips.";
+           Turn, Push, Pull, Shake:
+              "You receive cold stares from the three individuals \
+              at the bar. ~Get your own,~ the Wizard says and \
+              prevents you."; 
+           ThrownAt:
+              deadflag = 1;
+              CDefArt(noun); " hits the glass and nearly topples it! \
+              A voice from the back of the room says ~Garn! He \
+              nearly ruined a perfectly good glass of ale, he did.~ \
+              The three individuals at the bar turn to you with \
+              angry stares, but before you can respond, some \
+              barbarians pummel you to death for poor bar manners.";
+          Cast:
+             if (the_spell_was == zemdor_spell) {
+                give Delbins general;
+                remove self;
+                Achieved(8);
+                ! set up three NPCs
+                ! -- Morgan, fairly easy
+                move Morgan to Ravine_pass;
+                ! -- Frobar, a little tougher
+                move Frobar to FROBAR_Study;
+                if (Ench_mag in Frobar_mailbox)
+                   move Ench_mag to Frobar;
+                StartDaemon(Frobar);
+                ! -- Thief, trickiest
+                remove Thief;  ! he'll be back
+                if ((Painting_REAL in Museum_north) &&
+                    (glass_wall notin Museum_north))
+                    move Painting_REAL to THIEF_Storeroom;
+                    ! Thief steals painting (no door left behind!)             
+                "You quickly make the zemdor chant and watch the glass \
+of ale start to shimmer! In short time, there are three glasses filled \
+with ale on the bar!^^\
+Morgan the Ranger looks suspiciously at Frobar the Enchanter. \
+~Is this your doing, wizard?~ Frobar shakes his head. ~Surely not, \
+you know I can't do magic anymore.~ He glances briefly in your \
+direction. ~No matter,~ the thief says, and raises a glass. \
+~To the spirit of adventure!~ The three down their glasses quickly. \
+Morgan smiles. ~Now, that's good ale.~ She adjusts her broadsword. \
+~I'm off to the Egreth front. Want to help end a war, Frobar?~ \
+Frobar chuckles. ~Thank you, no. I've got, err, something to do \
+at home,~ he says and quickly leaves. ~Well, then, what about you, \
+thief?~ Morgan asks, and notices that the thief has already slipped \
+away. She shrugs and leaves the bar as well. ~Good hunting!~ Delbin \
+calls after her.";                
+             }
+             if (the_spell_was == huncho_spell or luncho_spell) 
+"You begin the chant, but something about it gets the \
+Enchanter's attention. ~If you have something to say, \
+why don't you share it?~ With a subtle gesture, the Enchanter \
+dispels the chant.";
+        ],
+;
+
+Object rag "dirty rag" bar
+   with name "rag" "dirty",
+        description "A slightly dirty cleaning rag.",
+        !weight 5,
+;
+
+
+! (Flathead stadium)
+
+Object Stadium_entrance "Entrance to Flathead Stadium"
+   with description "Here stands the entrance into the still \
+           popular Flathead Stadium, home to esoteric \
+           sports activities you never fully understood. \
+           Walkways lie southeast and southwest from here, or \
+           you can enter the stadium to the north.",
+        name "stadium" "walkways" "entrance",
+        sw_to ANTHAR_West,
+        se_to ANTHAR_East,
+        n_to Stadium_top,
+        in_to Stadium_top,
+        before [;
+           Listen:  
+       "You can hear the roars of a good crowd from \
+   inside the stadium. Must be playoff season.";
+           Go:
+              if ((noun==n_obj) || (noun==in_obj))
+                print "You walk right into the stadium. The ticket-takers \
+                must be on strike or something.^";
+        ],
+   has light;
+
+! (fake stadium entrance, for "past")
+
+Object Stadium_entrance2 "Entrance to Flathead Stadium"
+   with description "You appear to be in front of Flathead Stadium once \
+again, however something seems different. Even the stadium itself seems \
+dissimilar, newer. Walkways lie southeast and southwest from here, or \
+you can enter the stadium to the north.",
+        name "stadium" "walkways" "entrance",
+        sw_to "A strange feeling compels you to stay.",
+        se_to "A strange feeling compels you to stay.",
+        n_to [;
+            deadflag = 1;
+            "As you head towards the entrance, a mob of crazed fans \
+rushes out of the stadium (~Isn't that Babe Flathead?~ you hear someone \
+scream) and tramples you to death.";
+        ],
+        before [;
+           Listen:  
+              "The place is surprisingly quiet.";
+        ],
+   has light;
+
+
+Object stadium_sign "stadium sign" Stadium_entrance
+   with name "sign",
+        initial "A stadium event sign is pasted to one of the stadium walls here.",
+        description  
+                    "~Today's event:^\
+                       GOLEM FIGHTS!!!^^\
+                       ALL CHALLENGERS WELCOME!!!^\
+                       THREE ROUNDS, THREE BOUTS!^\
+                       BIG CASH FOR THE WINNER!^^\
+                    (All Golems have undefeated records, so^\
+                    only trained golem-wrestlers need apply!)~",
+   has static;
+
+Object stadium_statue "stadium statue" Stadium_entrance
+   with name "statue",
+        initial "A statue depicting the legendary Babe \
+Flathead greets all visitors in front of the stadium.",
+        description 
+           "According to the inscription, this statue honors the legendary Babe Flathead.",
+        before [;
+           LookUnder:
+               if (self has general) 
+                  "Oddly, the statue seems to sit slightly tilted.";
+           Push:
+              if (self has general) {
+                 remove self;
+                 move statue_base to Stadium_entrance;
+                 Achieved(9);
+                 "You give the statue a shove, and it wobbles and falls, \
+breaking into useless dust! A passing sportsfan notices your act \
+of vandalism, and says to a friend, ~Look at that. The guy wins one \
+bout of Golem wrestling, and he thinks he's better than Babe \
+Flathead.~";  
+              }
+              else "The statue seems to be firmly fixed in place.";
+        ],
+   has static;
+
+Object statue_base "square hole" Stadium_entrance2
+   with name "hole" "square",
+        describe "In front of the stadium is a square hole.",
+        description "There's a large square hole in the ground near \
+the front of the stadium.",
+        time_left 0,
+        time_out [;
+!          move stadium_sign to Stadium_entrance;
+!          move stadium_statue to Stadium_entrance;
+          print "^You hear voices behind you, and suddenly, a \
+small crowd of people pass by, pushing a statue.^^\
+~Right there,~ someone shouts, and a few people position the \
+statue into the square hole.";
+          if (children(self) == 0) {
+             print " It fits neatly in place.";
+             remove red_rod_piece;
+          }
+          else {
+             give stadium_statue general;
+             print " It fits, but seems just slightly \
+tilted.";
+          }
+!          remove statue_base;
+!          give Stadium_entrance ~general;
+          Mystical_Cave.number = Mystical_Cave.number + 1;  
+          print "^^~That's perfect,~ you hear a voice say, and \
+the crowd murmurs in agreement. Why, it's Babe Flathead himself! \
+He saunters up towards the statue, which is indeed a good \
+likeness, and starts handing out cigars. ~We'll get to \
+autographs later,~ he says while lighting your cigar as you \
+try to protest. Seconds later, the cigar explodes! You see \
+sparkling stars, which seem to change to purple flashes. You \
+blink.^";
+          PlayerTo(Mystical_Cave);
+        ], 
+        capacity 1,
+        size 15,
+has static container open;     
+
+Object Stadium_top "In Flathead Stadium, upper seats"
+   with description "\
+You are near the top cheap seats of Flathead Stadium. \
+The crowd is busy cheering whatever is going on down on the \
+field. Looking at the field, you see two small dots. The Stadium exit \
+is back south, or you can walk down to the front seats to \
+the north.",
+   name "seats" "crowd" "field" "dots" "fans",
+   s_to Stadium_entrance,
+   n_to Stadium_bottom,
+   d_to Stadium_bottom,
+   e_to "You try to push your way through the fans, but fail.",
+   w_to "You climb over a few seats, but the crowd blocks any \
+         further progress west.",
+   before [;
+       Listen:  "The crowd is deafening.";
+   ],
+has light;
+
+
+Object Stadium_bottom "In Flathead Stadium, lower seats"
+   with description "\
+You are near the good seats in Flathead Stadium. \
+The crowd is busy cheering for the current event on the \
+field. Looking at the field, you see two large dots. The \
+seats continue up and south, or you can walk down to the \
+field below.",
+  name "seats" "crowd" "field" "dots" "fans",
+  s_to Stadium_top,
+  u_to Stadium_top,
+  d_to [;
+     if (burly_man hasnt general)
+"The burly man jumps out of his seat as you try to pass. \ 
+~Hey buddy, I'm saving those seats.~ He points to an entire \
+row of seats below you. ~I've been waiting all season, and \
+I don't want an obstructed view, so look for somewhere else to \
+sit.~ He sits back in his seat.";
+     else return Near_locker_room;
+  ],
+  n_to [;
+     if (burly_man hasnt general)
+"The burly man jumps out of his seat as you try to pass. \ 
+~Hey buddy, I'm saving those seats.~ He points to an entire \
+row of seats below you. ~I've been waiting all season, and \
+I don't want an obstructed view, so look for somewhere else to \
+sit.~ He sits back in his seat.";
+     else return Near_locker_room;
+  ],
+  w_to "You try to push past a couple fans, but the angry looks make you stop.",
+  e_to "You try to push past a couple fans, but the rude looks make you stop.",
+   before [;
+       Listen:  "The crowd is deafening.";
+   ],
+has light;
+
+Object Near_locker_room "Near Locker Room"
+   with description "\
+You are near a locker room under Flathead field. \
+You can enter the locker room to the north, or start the climb back into \
+the roaring crowd to the south.",
+   name "crowd" "field" "fans",
+   s_to Stadium_bottom,
+   u_to Stadium_bottom,
+   n_to Locker_room,
+   each_turn [;
+      if (self hasnt general) {
+         give self general;
+         move pale_scroll to Near_locker_room;
+         "^A couple front row fans are getting a bit boisterous. \
+Several of them throw garbage and paper debris towards the field. \
+You notice something flutter down by your feet.";
+      }
+   ],
+   before [;
+       Listen:  "The crowd is deafening.";
+   ],
+   has light;
+
+Object Locker_room "Locker Room"
+   with description "\
+You are inside a locker room under Flathead field. You can hear the \
+crowds outside. The room is empty. There is an exit \
+to the south, and the entrance to the field is to the north.",
+   name "field" "locker" "lockers",
+   n_to Flathead_field,
+   s_to Near_locker_room,
+   before [;
+       Listen:  "You can hear the crowd outside.";
+   ],
+   has light;
+
+Object Flathead_field "Flathead Field"
+   with description "You're on Flathead field, in front of millions of zany \
+fans, a lifetime dream. Or not. Well, anyway, \
+there's a locker room to the south.",
+   name "field" "fans",
+   s_to [;
+       if (self has general)
+"You head for the showers, but the coach springs out and blocks \
+your way. ~Come on kid, keep your head in the game.~";
+       else return Locker_room;
+   ],
+   each_turn [ i;
+      if (self has general) {
+         i = random(20);
+         if (i == 1) 
+            "^Someone in the crowd yells out, ~Get him a body bag!~ \
+            We assume he was referring to the golem, not you.";
+         if (i == 5)
+            "^The crowd does 'the wave'.";
+         if (i == 7)
+            "^The crowd waves some strange colorful objects. \
+Rather distracting.";
+         if (i == 10)
+            "^Someone in the crowd screams ~Flathead that golem!~";
+      }
+   ],
+   before [;
+       Listen:  "The crowd is deafening.";
+   ],
+   has light;
+
+
+
+
+! ****************
+! People/creatures
+! ****************
+
+Object Christmas_tree_monster "Christmas tree monster" Con_Decor_garden
+   with name "tree" "monster" "Christmas",
+        initial "A Christmas Tree stands in one plot, swaying back and forth.",
+        description "\
+The Christmas Tree monster has obviously seen some good years. It towers \
+above you, wrapped with tinsel that sparkles marvelously. The \
+plastic flamingo ornaments are a rather gaudy touch. Surprisingly, it seems to \
+have taken root in the soil.",
+        each_turn [ i ;
+           i = random(10);
+           if (i==1) 
+"^The Christmas Tree Monster belts out a few bars of 'I'm dreaming \
+of a Black Cavern' arranged by Bing Frozby.";
+           if (i==2)
+"^The Christmas Tree Monster sings a few measures from Berknip's own \
+rendition of 'Silent Night', a rather morbid version.";
+           if (i==3)
+"^The Christmas Tree Monster hums a few notes from 'Dornbeasts \
+Roasting on an Open Pyre'.";
+           if (i==4)
+"^The Christmas Tree Monster whistles a part of 'Frosty the Snow Wight'.";
+           if (i==6)
+"^The Christmas Tree Monster sways in time to 'Let it snow, let it snow, \
+let it snow'.";
+           if (i==8)
+"^The Christmas Tree Monster treats you to an abridged version of \
+Handel's 'Messiah'.";
+        "^The Christmas Tree Monster hums to itself.";  
+        ],
+        before [;
+           Cut:
+              if (hedge_clipper notin player)
+                 "You'll need a gardening implement to do that.";
+              if (self has general)
+                 "The gardener said he'd make you dig for slugs, and \
+                 that doesn't sound too exciting, so let's leave the tree \
+                 alone.";
+              if (self hasnt general) {
+print "You being to clip a few of the lower branches of the Christmas Tree \
+Monster, who bellows in pain!^^\
+Out of nowhere, a short old man appears, wearing full gardener \
+regalia. He drags your hand away from the tree.^^\
+~What are ya trying to do there, kill the thing?~ he says. ";
+                 if ((glasses hasnt moved) || (glasses in Con_Fountain)) {
+                    remove glasses;
+                    remove hedge_clipper;
+"He pulls \
+out a pair of glasses and puts it on. ~Say, I don't know you,~ \
+he says. ~If you want to practice introductory horticulture, do \
+it in someone else's garden!~ He grabs the clippers from your hands \
+and stalks off.";
+                 }
+                 else {
+print "He seems \
+to be squinting at you. ~Who are you sonny?~ he asks. He starts 
+searching his pockets. ~Confound it, lost my glasses again.~ ";
+                    if (gardeners_cap hasnt worn) {
+                       remove hedge_clipper;
+"He squints again, and says, ~Well, whoever you are, the gardens are \
+for looking at, not practicing landscape design!~ He grabs the \
+clippers out of your hands and stalks off.";
+                    }
+                    if (gardeners_cap has worn) {
+                       give self general;
+                       Achieved(10);
+"He looks at you again, and notices your cap. ~You must be one of the \
+new boys. Here, look, I'm not going to show you twice.~ He takes \
+the clippers and delicately clips away several lower branches, all \
+the while singing ~It's beginning to look a lot like Christmas~. \
+He finishes trimming the tree, leaving a nice opening exposing the \
+shrub next to it, and stops singing. ~I'm starting to hate \
+that tune,~ he says under his breath. He hands the clippers back \
+to you and says, ~Now if I catch you doing this wrong again, I'm \
+going to make you dig for slugs, understand?~ He disappears as \
+quickly as he appeared.";
+                   }
+                 }
+              }
+           Cast:
+              "You start chanting, but the tree starts singing \
+              ~Plover the river and frotz the woods~ and you \
+              can't help joining in, ruining your chant.";
+        ],
+        react_before [;
+           Sing:
+              "You song is drowned out by a boisterous chorus \
+              by the tree.";
+        ],
+        life [;
+          Show: 
+             if (noun==toy_volcano)
+                "The tree abruptly stops singing, and seems \
+a trifle flustered for some reason. Moments later, it \
+resumes its chorus.";
+          default: "The tree just keeps on singing.";
+        ],
+   has animate;
+
+! (ok, the bush isn't defined as alive.  But it is...)
+Object dornberry_bush "Dornberry bush" Con_Decor_garden
+   with name "shrub" "bush",
+        initial [; 
+          print "A small shrub sits near and under the Christmas Tree";
+          if (Christmas_tree_monster hasnt general)    
+             ", almost covered by it.";
+          else
+             ".";
+        ],
+        description [;
+                if (self hasnt general)
+"The small shrub looks rather poorly tended. Just a few green leaves \
+distinguish it from the surrounding soil."; 
+                else
+"The small shrub looks quite healthy. A cluster of green leaves and \
+branches make a nice plant. It's still smaller than the tree, though.";
+                ],
+        capacity 1,
+        before [;
+            Cast:
+             if (the_spell_was == throck_spell) {
+                if (Christmas_tree_monster hasnt general)      
+"The shrub seems to shake suddenly! A new leaf grows, searchs for the \
+sunlight, fails, and withers.";
+                if ((Christmas_tree_monster has general) &&
+                    (self hasnt general)) {
+                  give self general;
+                  move dornberries to self;
+"The shrub seems to shake suddenly! A new leaf grows, searchs for the \
+sunlight, and finds it! Another leaf follows, and soon the shrub is \
+sprouting new branches. In the sunlight, flowers appear, and a cycle \
+of missed-out seasons is made-up for in minutes! The shrub is now \
+quite a thriving plant, covered with tiny red fruit.";
+                }
+                if (self has general) 
+                   "The shrub shakes a bit, but the plant remains the \
+                   same. For a Dornberry bush, it's already probably \
+                   the healthiest one you've ever seen.";
+              }
+              Receive:
+                 if (noun ~= dornberries)
+                    "I don't think the shrub can support that.";
+           ],
+   has static supporter;
+
+Object dornberries "bunch of dornberries"
+   with name "dornberries" "berries",
+        description "A bunch of tasty-looking red berries.",
+        !weight 5,
+        size 5,
+   has edible scored;
+
+! (moved here so that it shows up 'last' in room descr)
+Object plaque "plaque" Con_Decor_garden
+   with name "plaque",
+        initial "A small plaque sticks out of the soil near the two plants.",
+        description [;
+        print "The plaque reads:^^";
+        font off;
+print "~CHRISTMAS TREE MONSTER               DORNBERRY BUSH^";
+print "<Jinglebellus Adnauseam>              <Smallus Shrubus>~^";
+        font on;
+        ],
+!          ~CHRISTMAS TREE MONSTER               DORNBERRY BUSH^\
+!         <Jinglebellus Adnauseous>            <Smallus Shrubus>~",
+   has static;
+
+
+! (Characters in Flathead Stadium)
+
+
+Object burly_man "burly man" Stadium_bottom
+   with name "man" "burly",
+        description "A big man who's apparently into sports.",
+        before [;
+  Cast:
+     if ((the_spell_was == foblub_spell) && (self hasnt general)) {
+        give self general;
+        Achieved(11);
+"You begin your sermon. The man starts to tell you to knock \
+it off, but starts to listen with awe. As you finish, the man \
+tries to get up to shake your hand, but realizes he is stuck \
+fast. ~They gotta start cleaning these seats,~ he says.";
+     }
+      if (the_spell_was == espnis_spell) 
+         "You begin a description of the 1700 different kinds of \
+          holy water, but the man seems so enthralled with the \
+          game below, he just isn't paying attention.";
+      ],
+      life [;
+          Show:
+           if (noun==trophy)
+              "~You were amazing pal. Ever think of going pro?~";
+          Ask:
+            if (second=='fight' or 'game' or 'fights')
+               "~It's the three-golem special. One contestant \
+               versus three golems, one after the other. Great \
+               stuff.~";
+          default:
+            "~Give it a rest pal, I'm watching the game.~";
+      ],
+   has animate;
+
+Object coach "tough-looking coach" Locker_room
+   with name "coach",
+        description [;
+print "An old fellow with bushy eyebrows and \
+a gruff demeanor. He's dressed like a sports coach";
+if (trophy in self)
+". You also notice he's holding some sort of trophy.";
+else ".";
+        ],
+        number 1,
+        each_turn [;
+            if (self hasnt general) {
+              if (Flathead_field hasnt general) {
+                 give Flathead_field general;
+print "^The coach looks up and notices you. ~Oh, you must be the \
+replacement,~ he says. He drags you over to the field entrance. \
+~Well, I hoped you're warmed up, cuz you're up.~ He shoves you \
+north. ~Remember, these guys are tough, so give 'em your \
+best stuff.~^";
+                 PlayerTo(Flathead_field);
+              }
+              else {
+                 print "^The coach looks up and notices you. \
+~Where have you been? The ref was about to default \
+it to the golems!~ He shoves you north. ~Now get in there and \
+make me proud.~^";
+                 PlayerTo(Flathead_field);
+              }
+            }
+            if ((self has general) && (coach.number == 1)) {
+               move win_bag to player;
+               coach.number = 2;
+               "^The coach gives you a slap on the back that \
+knocks the wind out of you. ~You did it! I didn't think \
+you had it in you!~ He hands you a small bag. ~Here's the \
+winnings. I went ahead and took out my cut, of course.~^";
+            }  
+        ],
+        life [;
+           ! essentially, the only chances to do 'life' things
+           ! will occur when the coach is lingering around 
+           ! the lockerroom after the match.
+           Attack:
+               "~You want a couple rounds with the old man \
+too? Well, I'm ready.~ For an old coach, he still looks \
+like he's in pretty good shape. You decide against violent \
+action.";
+           Answer: 
+               "The coach merely nods.";
+           Ask:
+               if (second == 'trophy')
+                  "~It's a beauty all right.~";
+               if (second == 'winnings' or 'cut') 
+                  "~It's all there, count it if you want.~";
+               if (second == 'life' or 'game' or 'sport')
+                  "The coach looks momentarily reflective. \
+~Life is all about getting into the game,~ he says. \
+~Remember that, it's not about winning or losing, but \
+giving it your best shot.~";
+           Show:
+             if (noun == cereal1 || 
+                 noun == cereal2 ||
+                 noun == cereal3 ||
+                 noun == cerealbox1 ||
+                 noun == cerealbox2 ||
+                 noun == cerealbox3)
+           "~A bowlful of that each morning is bound to make a \
+champion out of you.~";
+           Order:  
+! *** note2: this seems to contradict documentation,
+! i.e. 'ask coach for trophy' results in noun==trophy and
+!       second==(?)coach or player, not the other way
+!       around.
+               if ((action==##Give) && (noun==trophy) && 
+                   (trophy in self)) {
+                  move trophy to player;
+                  remove self;
+"The coach looks lovingly at the trophy, and then at you. \
+~Fair enough kid, you earned it.~ he says, and gives it \
+to you. ~I've seen a lot of golem-wrestlers in my time, \
+but I gotta say, you're the best golem-wrestler I've ever \
+seen.~ He leaves the locker room to greet his fans.";
+               }
+           default:  "At the moment, it looks like the coach is too busy \
+               writing a Hall of Fame acceptance speech to \
+               pay you much attention.";
+         ],
+         react_before [;
+            Cast:
+              "~What's that you're saying? Speak up, I'm your \
+coach, I'm hear to listen.~";
+         ],
+   has animate transparent;
+
+Object referee "referee" Flathead_field
+   with name "referee" "ref",
+        description "A stout looking man in a funny striped shirt.",
+        each_turn [;
+           if (self hasnt general) {
+              give self general;
+"^The ref blows his whistle and says ~Round 1~. The golem, not \
+needing any encouragement, jumps into the fray.";
+           }
+        ],
+        life [;
+           Attack:
+             "Your opponent is the golem, not the referee.";
+           Ask:
+             if (second == 'time' or 'timeout')
+                "~Sorry, no timeouts!~ the ref says.";
+             if (second == 'foul')
+                "~It looked good to me.~";
+             if (second == 'round') {
+                if (wood_golem in Flathead_field)
+                   "~You're in round 1.~";
+                if (stone_golem in Flathead_field)
+                   "~You're in round 2.~";
+                if (iron_golem in Flathead_field)
+                   "~You're in round 3, the final round.~";
+             }
+           default: "The ref makes some completely \
+bewildering hand signal, that could be an insult, for \
+all you know about wrestling. In any event, nothing happens.";
+        ], 
+        before [;
+           Cast:
+if (the_spell_was == espnis_spell) {
+   deadflag = 1;
+   "You start to relate the advantages of Bingo over Double \
+Fanucci to the ref, and sooner that you can say ~Zounds~, the \
+ref is fast asleep! Unfortunately, the golem takes advantage of \
+this opportunity and breathes poison gas at you! You reflect \
+on this display of poor sportsmanship as you slowly lose \
+consciousness.";
+}
+        ],
+   has animate;
+
+! -- the golems...
+!    In general: To be fair, the golems only have a 1 in 30 chance
+!    of actually hitting.  When they do hit, however, it's pretty
+!    painful.  They also tend to have high HP, although I guess 
+!    theoretically, they could be beaten without spells.
+!    (note: I've tried this with the iron golem and never
+!     succeeded.  The odds are definitely not in the players favor)
+Object wood_golem "dangerous-looking wood golem" Flathead_field
+   with name "golem" "wood",
+        number 20,
+        description "\
+The wood golem stands at about twice your height, an animated statue \
+made completely of wood. He may move like an old cabinet, but \
+watch those hands!",
+        each_turn [ i ;
+           i = random(13);
+           if (i == 13)
+              Player_HP_CUR = Player_HP_CUR - 15;
+           if (Player_HP_CUR <= 0) {
+              deadflag = 1;
+              "^The wood golem jumps forward and flattens you, \
+              which feels similar to getting hit by a falling \
+              redwood tree.";
+           }
+           if (i == 13)
+              "^The golem staggers you with a punch that sends you \
+              reeling!";
+           if (i == 20)  
+"^The wood golem tries to move in for a clinch, and you dance \
+away.";
+           if (i == 10)
+"^The wood golem makes a lumbering swing at your head, and misses!";
+"^The wood golem makes a swipe for you, and misses.";
+        ],
+        before [;
+          Cast:
+            if (the_spell_was == egdelp_spell) {
+               remove self;
+               move stone_golem to Flathead_field;
+"The wood golem is suddenly covered with a waxy buildup! \
+Greatly embarrassed, he turns to call foul, and slips! \
+With a great thud, the golem hits the turf, and knocks \
+himself out cold!^^\
+The ref says ~Knockout!~. The crowd cheers in approval.^^\
+Several dwarves appear and cart the wood golem off. \ 
+Unfortunately, a stone golem soon walks into view!^^\
+The coach yells from the doorway ~You're doing great kid, \
+just hang in there.~^^\
+The ref says ~Round 2!~";
+            }
+        ],
+        life [ i ;
+          Attack:
+            i = random(20);
+            if (i > 10) {
+               wood_golem.number = wood_golem.number - 1;
+               if (wood_golem.number <= 0) {
+               remove self;
+               move stone_golem to Flathead_field;
+"With a thundering blow, you smash the golem into \
+kindling!^^\
+The ref says ~Knockout!~. The crowd cheers in approval.^^\
+Several dwarves appear and cart the wood golem off. \ 
+Unfortunately, a stone golem soon walks into view!^^\
+The coach yells from the doorway ~You're doing great kid, \
+just hang in there.~^^\
+The ref says ~Round 2!~";
+               }
+               else {
+                 print "Good shot! You whack the golem, and splinters fly";
+                 if (wood_golem.number > 10)
+                    ". It didn't seem to slow him down, though.";
+                 else ".";
+               }
+            }
+            "You swing, but miss.";
+        ],      
+   has animate;
+
+Object stone_golem "fierce-looking stone golem" 
+   with name "golem" "stone",
+        number 40,
+        description "\
+The stone golem is quite a towering piece of work. He looks like a crude \
+statue made of animated granite. He probably has all the \
+finesse of a giant boulder, so don't let him pin ya!",
+        each_turn [ i ;
+           i = random(13);
+           if (i == 13)
+              Player_HP_CUR = Player_HP_CUR - 20;
+           if (Player_HP_CUR <= 0) {
+              deadflag = 1;
+              "^The stone golem jumps forward and flattens you, \
+              which feels similar to getting crushed by a giant \
+              boulder.";
+           }
+           if (i == 13)
+              "^The golem hits you with a punch that sends you \
+              reeling!";
+           if (i == 20)  
+              "^The golem jabs with his left, and misses!";
+           "^The golem tries to close, and misses.";
+        ],
+        before [;
+          Cast:
+            if (the_spell_was == tossio_spell) {
+               remove self;
+               move iron_golem to Flathead_field;
+"The golem is suddenly replaced with a pile of steaming \
+linguini alfredo!^^\
+The ref yells ~Takeout!~ The crowd goes wild! \
+Several dwarves appear and serve the pasta to the crowd \
+on platters. Unfortunately, an iron golem soon \
+walks into view! ^^\
+The coach yells out from the safety of the locker room ~Okay kid, drop \
+this golem, and we can celebrate.~^^\
+The ref yells ~Round 3!~";
+            }
+        ],
+        life [ i ;
+          Attack:
+            i = random(20);
+            if (i > 10) {
+               stone_golem.number = stone_golem.number - 1;
+               if (stone_golem.number <= 0) {
+               remove self;
+               move iron_golem to Flathead_field;
+"With a thundering blow, you smash the golem into \
+gravel!^^\
+The ref says ~Knockout!~. The crowd cheers in approval.^^\
+Several dwarves appear and cart the stone golem off. \ 
+Unfortunately, an iron golem soon walks into view!^^\
+The coach yells out from the safety of the locker room ~Okay kid, drop \
+this golem, and we can celebrate.~^^\
+The ref yells ~Round 3!~";
+               }
+               else {
+                 print "Solid blow! Stone chips fly.";
+                 if (stone_golem.number > 10)
+                    ". It didn't seem to slow him down, though.";
+                 else ".";
+               }
+            }
+            "You swing, but miss.";
+        ],      
+   has animate;
+
+Object iron_golem "deadly-looking iron golem" 
+   with name "golem" "iron",
+        number 50,
+        description "\
+The iron golem resembles a huge nightmare made out of iron. \
+Towering at least 30 feet high, this animated iron statue isn't \
+something you'd want to meet in a dark alley, much less \
+in an arena filled with screaming fans.",
+        each_turn [ i ;
+           i = random(13);
+           if (i == 13)
+              Player_HP_CUR = Player_HP_CUR - 30;
+           if (Player_HP_CUR <= 0) {
+              deadflag = 1;
+              "^The iron golem jumps forward and flattens you, \
+              which feels similar to getting mashed by a giant \
+              block of iron. Oww.";
+           }
+           if (i == 13)
+              "^The golem staggers you with a punch that sends you \
+              reeling! That felt quite painful.";
+           if (i == 20)  
+             "^The golem tries to flatten you, and you evade just in time!";
+           "^The golem tries to step on you, and you dodge.";
+        ],
+        before [;
+          Cast:
+            if (the_spell_was == bekdab_spell) {
+               remove self;
+               remove referee;
+               give Flathead_field ~general;
+               give coach general;
+               move trophy to coach;
+               Achieved(12);
+"The golem suddenly develops many unsightly patches of rust. \
+Mortified, the golem calls for his oil trainer, but to no \
+avail! It soon falls apart into several rusty metal pieces!^^\
+The ref calls out ~The winner!~ and holds your hand aloft. \
+The crowd is on its feet! They'd probably be chanting your \
+name, if they knew it.^^\
+Several dwarves appear and drag off the rusty metal plates. \
+The ref explains that the prize money and a championship \
+trophy will be awarded in the \
+locker room, and exits.";
+            }
+        ],
+        life [ i ;
+          Attack:
+            i = random(20);
+            if (i > 10) {
+               iron_golem.number = iron_golem.number - 1;
+               if (iron_golem.number <= 0) {
+               remove self;
+               remove referee;
+               give Flathead_field ~general;
+               give coach general;
+               move trophy to coach;
+               Achieved(12);
+"With a thundering blow, you smash the golem into \
+ball-bearings.^^\
+The ref calls out ~The winner!~ and holds your hand aloft. \
+The crowd is on its feet! They'd probably be chanting your \
+name, if they knew it.^^\
+Several dwarves appear and collect the ball-bearings. \
+The ref explains that the trophy will be awarded in the \
+locker room, and exits.";
+               }
+               else {
+                 print "Solid blow! You make a small dent.";
+                 if (iron_golem.number > 10)
+                    ". It didn't seem to slow him down, though.";
+                 else ".";
+               }
+            }
+            "You swing, but miss.";
+        ],      
+   has animate;
+
+! (Three important NPCs)
+
+Object Morgan "Morgan the Ranger" Delbins
+   with name "ranger" "warrior" "Morgan" "captain" "maiden",
+        number 1,
+        initial [;
+             if (self in Delbins)
+                "There's a warrior-maiden sitting at the bar, her \
+eyes riveted to the glass of ale.";
+             else 
+             "Morgan the Ranger is here.";
+        ],
+        description "She's nearly twice your height, and \
+probably twice your strength too. She's armed and armored in \
+typical military Ranger gear. She gives you the impression of \
+being the type who'd hunt dragons as a hobby -- assuming there were \
+any dragons left to hunt, of course.",
+        each_turn [;
+           if ((self in Ravine_pass) && (Morgan.number == 1)) {
+              Morgan.number = 2;
+              "^The Ranger sees you approach and recognizes you. \
+              ~Well met again, Priest. I have need of your \
+        assistance to end the kobold border war that has been going \
+        on far too long.~ She pauses. ~To the \
+        west and east are two of my lieutenants and their \
+        soldiers, cut off from the rest of us by previous kobold \
+        raids. I have the power to end this war and call a truce, \
+        but to do so, I need \
+        to inform both of my lieutenants to \
+        stop fighting via \
+        windcat message carriers.~ She points to the two windcats \
+        in the wicker cage and the pile of colored flags. \
+        ~The 'red' flags indicate 'attack', the \
+        'blue', truce. When my lieutenants receive the instructions, \
+        they will verify my commands by sending additional messengers \
+        with 'attack' or 'truce' instructions to each other. \
+        Based on the two \
+        received messages, each lieutenant will act accordingly.~ \
+        She slaps you on the back, jolting you to attention. \
+        ~Herein lies my problem, Priest. I know for a fact, that \
+        one of my lieutenants is a traitor, who will \
+        disobey my orders. Any instruction I send to the traitor, \
+        the opposite will be sent by the traitor to my remaining \
+        good lieutenant. The traitor will also take the two orders \
+        he receives and do the opposite, if there is a majority, or \
+        attack outright, if there are messages of 'truce' and 'attack'. \
+        Thankfully, my good lieutenant will faithfully copy my \
+        instructions to the other lieutenant, and will follow orders \
+        received, if there is a majority, or follow a 'truce' if \
+        there are mixed messages. My greatest problem, Priest, is that \
+        I do not know which lieutenant is the traitor! If you \
+        can bring peace once and for all to Southern Egreth, many \
+        will remember your good deeds.~";
+         } 
+        ],
+        life [;
+            Answer:
+               if (special_word == 'hello') {
+                  print "~Hello";
+                  if (Morgan.number == 2)
+                     print " again";
+                  ", priest.~";
+               }
+            Attack, ThrowAt:
+               "She's well-armed and probably dangerous.";
+            Give, Show:
+               "A gracious gesture, perhaps, but she isn't \
+interested.";
+            Kiss:
+               "She nearly splits your skull with the flat of \
+a huge broadsword before you even get close. ~For a man of \
+the cloth, you've got a lot of nerve,~ she says.";
+            Ask:
+               if (((second == 'cat') || (second=='cats') ||
+                    (second == 'windcat') || (second=='windcats')) &&
+                   (Morgan.number == 2))
+                "~Right, the windcats. \
+                The speckled cat will find the lieutenant to the east. \
+                The spotted cat will find the lieutenant to the west.";
+               if (second == 'frobar' or 'wizard' or 'enchanter') {
+                  print "She laughs. ~You've never heard of \
+Frobar, the dullest Enchanter? The Enchanter who was so dull \
+that his fellow wizards forgot to invite him to the last \
+great meeting? This saved him from becoming an amphibian, so \
+perhaps dullness has its virtues";
+                  if (self in Delbins)
+                     ".~ The wizard looks rather insulted. \
+~Oh hush up, Morgan.~ the wizard says.";
+                  else ".~";
+               }
+               if (second == 'thief' or 'gentleman') {
+                  print "She smiles. ~I can't say as I know \
+much about ";
+                  if (self in Delbins)
+                     "this fellow over here,~ she says and \
+gives the gentleman a whack on the back that nearly knocks his \
+teeth out. ~But I hear he's something of a thief.~ ~Nothing \
+of the sort!~ the gentleman protests.";
+                  else 
+                     "that thief fellow. I've been told \
+he has a hideout somewhere, nearly impossible to find.~";
+               }
+               if (second=='kobold' or 'war')
+"~The war wages on, priest, even though the battle was lost \
+long ago, and there were no winners, kobold or man.~";
+               if (second=='dragon' or 'dragons')
+"Morgan becomes momentarily thoughtful. ~Some of the best \
+dragon-hunting I ever did was up in Frostham long ago. \
+Those white frost dragons are quite a vicious lot. Best not \
+to wake a sleeping white dragon unless you have a weapon handy \
+and know how to use it!~";
+            else "~Sorry, I'm not sure about that.~";
+            default: "Morgan the Ranger appears to be \
+thinking important thoughts at the moment.";
+        ],
+        before [;
+            Cast:
+               "~What's that you're mumbling there priest?~";
+        ],
+   has animate female proper;
+
+Object  Frobar "Frobar" Delbins
+ with   name "Frobar" "wizard" "sorcerer" "enchanter",
+        initial [;
+           if (self in Delbins)
+           "There's an old wizard sitting at the bar, his \
+eyes riveted to the glass of ale.";
+           else "Frobar the Enchanter is here.";
+        ],
+        description "A wizardly old figure of a man.",
+        life [;
+         Attack, ThrowAt:
+         "You make a threatening move. The wizard practically yawns! \
+~Just what the world needs, another violent Priest.~ You stop, \
+somewhat embarrassed.";
+         Answer:
+            if (special_word=='hello')
+               "The wizard nods. ~Hello, hello, and all that rubbish.~";
+         Ask:
+            if (self in Delbins)
+               "The wizard is somewhat occupied at the moment.";
+            else {
+               if (second=='magic' or 'mystic') {
+                  print "Frobar scowls. ~Magic? We've seen the last \
+of magic, let me tell you. Does anyone remember what it did \
+for us? Does anyone mention the Enchanters that saved Quendor \
+from certain ruin many a time? Of course not. A bunch of \
+ingrates";
+if (term_paper notin self)
+". I just hope they're teaching the kids at Tech what magic \
+was all about, before we got all this 'new science' stuff everyone's \
+blabbering about.~";                     
+else ".~";
+               }
+               if (second=='golem' or 'golems')
+"Frobar sighs. ~Golems used to be useful, you know. But now, \
+without magic to control them, they go off and get into all \
+sorts of mischief.~";               
+               if (second == 'thief' or 'gentleman') 
+                  "~Some fellow I've had some dealings with \
+in the past. Not a bad chap, but he does like to \
+supplement his income, if you know what I mean. Far \
+too risky a profession for my taste.~";
+               if (second == 'morgan' or 'ranger' or 'warrior')
+                  "~Morgan Grueslayer, top military Ranger \
+in her graduating class, I hear. If she asks you to join \
+her on one of her campaigns, just walk away. All that \
+fighting -- too stressful if you ask me.~";
+               if (second == 'barsap' or 'snaboz')
+!"~I don't even want to talk about it.~";
+"~Don't even get me started.~";
+            }
+         Show:
+            if (self in Delbins)
+               "The wizard is somewhat occupied at the moment.";
+            if (noun == Ench_mag) {
+               move Ench_mag to Frobar;
+               "Frobar snatches the magazine out of your hands. \
+               ~What are you doing with my mail?~ he says, irritated.";
+               }
+            if (noun has is_scroll) 
+               "~A magic scroll, eh? Doesn't do me a lot of good \
+these days.~";
+            if ((noun has is_rod) || (noun has is_sphere)) {
+               print "Frobar looks at ", (the) noun;
+               " for a moment. ~Something \
+more than meets the eye here. Couldn't tell you what, though.~";  
+               } 
+            if (noun==wood_book)
+               "~So, you're a carpenter too?~ Frobar says, somewhat \
+               sarcasticly.";
+            if ((noun==term_paper) && (glossy_scroll in self))
+            {
+               FrobarGetsPaper();
+            }            
+            "~Hmm. Not very interesting.~";                
+
+         Give:
+            if ((noun==term_paper) && (glossy_scroll in self))
+            {
+               if (self notin Delbins)
+               FrobarGetsPaper();
+               else "The wizard pushes your offering aside. \
+~I'm somewhat busy at the moment,~ he says, his eyes glued to \
+the glass of ale.";
+            }            
+            if (noun == Ench_mag) {
+               move Ench_mag to Frobar;
+               "Frobar grabs the magazine. \
+               ~What are you doing with my mail?~ he says, irritated.";
+               }
+            "~No, thank you.~";
+            
+         default: "~I'm rather busy at the moment.~";
+        ],
+        each_turn [ i ;
+            ! Handle Frobar's actions here...ALWAYS CHECK PARENT AND LOCATION
+            
+            if ((self in location) && (player in FROBAR_Bed)) {
+               print "Frobar seems annoyed. ~Get out of my bed!~ he says, \
+               and drags you to your feet. ";
+               <<Exit>>;
+            }
+                         
+            ! Misc housekeeping actions...
+            if (random(3) < 3) {
+            if ((frobar_plant in parent(self)) && (self in location)) 
+                print "^Frobar tends to the plant.^";
+            if (FROBAR_Bed in parent(self) && self in location) 
+                print "^Frobar arranges some quilts on the bed.^";            
+            if (FROBAR_shelves in parent(self) && self in location) 
+                print "^Frobar pulls a book off the shelves, glances through it, and puts it back.^";
+            if (parent(self) == FROBAR_Lounge && self in location) 
+                print "^Frobar dusts the furniture a bit.^";
+            }
+            
+           ! Random self mutterings...
+           i = random(5); 
+           if (self in location && self notin Delbins) {
+              switch(i) {
+              1 : "^Frobar mutters to himself, ~They didn't even invite \
+           me to the Last Enchanter's Guild Meeting.~";
+              2 : "^Frobar mutters to himself, ~Good old dependable Frobar. Bah!~";
+              3 : if (Ench_mag in self)
+                  "^Frobar leafs through a magazine he holds. ~What happened to \
+                  Barsap? Hah! Did they ask me? No, of course not.~";
+                  else
+                  "^Frobar checks his pockets. ~What did I do with this \
+                  month's 'Enchanter Monthly'?~ he muses outloud.";
+              default: rtrue;
+              }
+           }
+        ],
+        daemon [ i j k Mdest Mdir;
+            ! This daemon will only deal with NPC movement...
+            ! (no doors either)
+            if (random(3) ~= 1) rfalse;  ! doesn't always immed. move
+            
+            ! Count the available exits quickly
+            objectloop(i in Compass)
+                if (ZRegion(parent(self).(i.door_dir)) == 1)
+                    k ++;
+            if (k == 0) rtrue;  ! no exits...
+            
+            ! Pick a place to move to.
+            ! In Frobar's case, most of the time he only has one exit.
+            ! Also, we can block the sw exit of home here.
+            if (parent(self) == FROBAR_Foyer) {
+               Mdir = n_obj;
+               Mdest = FROBAR_Parlor;
+               MovePrintNPC(Frobar,Mdest,Mdir);                 
+               rtrue;
+            }   
+                        
+            ! Pick an exit at random and attempt to travel that way
+            j = random(k); k = 0;
+            objectloop(i in Compass) {
+                if (ZRegion(parent(self).(i.door_dir)) == 1) {
+                    k ++;
+                    if (k == j) {              
+                        Mdir = i;          
+                        Mdest = parent(self).(i.door_dir);
+                        MovePrintNPC(Frobar,Mdest,Mdir);  
+                        rtrue;                      
+                    }
+                }
+            }
+        ],
+  has animate proper;
+
+[ FrobarGetsPaper ;
+    Achieved(24);
+    move term_paper to self;
+    move glossy_scroll to player;
+    "Frobar glances over the term paper and his eyes widen. \
+~Wilbur -- why, that's my great nephew!~ He takes the paper and \
+reads. ~So true, so true,~ he mumbles and smiles. ~A fine boy, \
+perhaps he'll become a great man someday, if he stops skipping class. \
+He reminds me of my days at Tech -- all filled with dreams and hopes.~ \
+He pauses, and searches his pockets. ~I even perfected a spell, did \
+you know? Good old loyal, boring Frobar perfected a spell, and, \
+if it hadn't been for that Snaboz show-off who had to go and perfect the \
+izyuk spell, I might have even tried to publish mine.~ He finds a \
+scroll amongst his robes and hands it to you. ~You don't believe me? Here, \
+see for yourself.~";            
+];
+
+Object Thief "thief" Delbins
+   with name "thief" "character" "gentleman",
+        number 1,
+        initial [;
+            if (self in Delbins)
+               "There's a gentleman dressed in black sitting at the \
+bar, his eyes riveted to the glass of ale.";
+        ],
+        description "A lean crafty-looking individual, dressed mostly \
+in black. He seems a bit too scruffy to be a nobleman, but also \
+a bit too distinguished to be a common thug. Probably a thief, I'd \
+guess.",
+        life [;
+         Attack, ThrowAt:
+         "You make a threatening move, but the thief seems to \
+move twice as fast! You find yourself looking at the sharp end \
+of a stiletto. ~I'm too much of a gentleman to harm a Priest,~ \
+the thief says, ~so don't force me to make an exception.~";
+         Answer:
+           if (special_word == 'hello')
+              "The gentleman gives a sharp nod in your direction.";
+         Ask:
+           if (second == 'magistrate')
+"The thief gives you a knowing nod. ~The Aragain magistrate? \
+A honorless cur, if I ever saw one.~";
+           if (second == 'painting')
+"The thief shrugs. ~I hear there's a nice new painting on \
+exhibit at the royal museum. You might want to check it out.~";
+           if (second == 'lock' or 'locks')
+"The thief shrugs. ~Do I look like a locksmith?~";
+
+         Give:
+           if (noun has is_coin || noun==trophy) {
+              move noun to Thief;
+              "Confused, the thief pockets your offering. \
+~Quite generous of you, sir.~ he says.";
+           } 
+
+          default: "The gentleman glances at you with \
+dark suspicious eyes.";
+        ],
+        before [;
+            Cast:
+               "You speak the chant perfectly, but nothing \
+seems to happen! The gentleman smiles and pats his dark cloak, \
+which seems to glow briefly with mystic energy, then fade!";
+        ],
+   has animate;
+
+Object thief_cloak "dark cloak" Thief
+   with name "dark" "cloak",
+        description "A coal-black cloak, which blends into \
+the surrounding shadows.",
+before [;
+            Cast:
+               "You speak the chant perfectly, but nothing \
+seems to happen! The gentleman smiles and pats his dark cloak, \
+which seems to glow briefly with mystic energy, then fade!";
+        ],
+has clothing;        
+
+Object Delbin "Delbin" Delbins
+   with name "Delbin" "bartender" "owner",
+        number 1,
+        initial "Delbin himself is standing behind the bar.",
+        description "Delbin is a stout bald fellow with laughing eyes and \
+a heavy beard. He somehow seems both young and old at the same \
+time.",
+        each_turn [ ;
+           if (random(20) == 1)
+              "^Delbin cleans some glasses behind the bar.";
+        ],
+        react_after [;
+           Take:
+              if (noun == headdress)
+                "~You're welcome to that unsightly thing, sir. \
+Been trying to get rid of it for sometime.~";
+              if (noun == rag)
+                "Delbin give you a curious look, \
+but says nothing.";
+        ],
+        life  
+        [ i ;
+           Attack, Kiss, ThrowAt:  "Leave good old Delbin alone.";
+           Answer:
+              if (special_word == 'hello')
+                 "~Welcome to Delbin's, good sir.~";
+           Give:
+              if (noun has is_coin) {
+                 print "Delbin refuses your offering. \
+~Keep your change, sir. If you're looking for a good tip, \
+I can tell you what I hear.~^^";
+                 <<Ask Delbin 'rumor'>>;
+              }
+              if (noun == rag) {
+move rag to bar;
+"Delbin takes the rag and cleans a spot on the bar, leaving \
+it in a familiar place.";
+              }
+              "Delbin politely refuses.";
+           Show:
+              if (noun == headdress)
+"~There's a good story behind that ugly thing. Maybe if you \
+keep reminding me, I'll remember it.~";
+           print "~A nice ", (name) noun;
+           " you've got yourself there.~";
+           Ask:
+              if (second == 'ale' or 'situation') {
+                 if (Morgan in Delbins) 
+                    "~Quite a situation we've got sir. Those three at \
+the front of the bar all ordered a glass of Special Borphee Ale. Well, \
+with the shutdown of the Brewers Guild in Borphee since the Great \
+Change, I can't keep that particular beverage in stock, but I've got \
+that one left there. Seems none of them's leaving until they decide \
+who gets the ale -- and let me tell you, those three are folks who \
+don't like to be disappointed!~";
+                 "Delbin smiles. ~All out of ale sir. But I suppose \
+ye already knew that?~";
+              }
+              if (second == 'rod')
+                 "Delbin shrugs. ~Sounds vaguely familiar sir, \
+maybe I heard a rumor about it once. Can't really say, though.~";
+              if (second == 'headdress')
+"~There's a good story behind that ugly thing. Maybe if you \
+keep reminding me, I'll remember it.~";
+              if (second == 'rag')
+"~Not much more than a rag, sir.~";
+              if (second == 'minirva')
+                 "~I think that's the name of some old \
+Antharian Sea Goddess. Like a patron saint to sailors, in \
+the old days.~";
+              if (second == 'morgan' or 'warrior' or 'ranger')
+                 "~Morgan Grueslayer's a skilled ranger.~";
+              if (second == 'frobar' or 'wizard' or 'enchanter')
+                 "~Frobar's probably one of the last \
+enchanters around. He's a regular here.~";
+              if (second == 'thief' or 'gentleman')
+                 "~Don't really know that fellow's name. \
+He tips well, though.~";
+              if (second == 'rumor' or 'rumors' or 'story') {
+                 i = random(7);
+                 print "Delbin scratches his ear and says, \
+~Yes, now, what did I hear...~^^";
+                 if (i==1)
+                    "~People tell me this new Flathead king is \
+a fake, plain and simple. Hasn't stopped people from trying to \
+get on his good side, though. Now, I haven't seen the fellow \
+myself, but if you ask me, somebody somewhere is up to no good.~";
+                 if (i==2)
+                    "~They say the kobold war up north is gonna \
+end real soon. I'll believe that when it happens.~";
+                 if (i==3) {
+                    print "~Oh, this one's a good one.";
+                    if (headdress in Delbins)
+                       print " You see that headdress over there? \
+Well, this explorer fellow left it here, along with quite a story. \
+He";
+else print " Some explorer fellow";
+" claimed he found some lost ancient city in the Miznia \
+jungles. Said he made a map to the place, but lost it when bargaining \
+for his life with some jungle natives. I just nodded and let \
+the poor man talk.~";
+                 }
+                 if (i==4)
+                    "~This crazy-looking old fellow stops in \
+the other day. Said that he was a professor, at GUE Tech, but \
+that he was giving that all up! Something about his \
+research going bad, on something he called 'an ethereal gate'. \
+What all of that means, I can't say.~";
+                 if (i==5)
+                    "~Say, you sorta remind me of this other Priest \
+fellow who stopped by here a long long time ago. Delbin \
+never forgets, you know? This fellow, who didn't give a name, \
+told me he was on an important \
+quest for something called -- now what was it -- 'The \
+Rod of the Ancients', or something like that. That \
+mean anything to you?~";
+                 if (i==6) {
+                    print "~An artist friend of mine tells me that \
+this new Leonardo Flathead painting they've recently discovered \
+on display at the Royal Museum has a special secret. They \
+say that Leonardo painted over something else under the canvas, but no one's \
+saying what. They're keeping a watchful eye on it too, just \
+in case curiosity gets the better of some folk. In fact, \
+I hear they've already had a few people trying to steal the \
+thing";
+   if (Thief in Delbins)
+      "!~ The thief suddenly starts to cough, and controls himself.";
+   else "!~";
+                 }
+             ! Add further rumors here...
+                 "Delbin shrugs. ~Guess I'm getting old, \
+nothing comes to mind at the moment. Maybe if you \
+give me a moment, I'll think of something.~";
+              }
+        ],
+        before [;
+           Cast:
+if (the_spell_was == foblub_spell)
+   "You relate a fine sermon to Delbin about spirits -- \
+both the liquid kind and the not-so-liquid kind. Were \
+Delbin sitting rather than standing behind the bar, \
+he might even be glued to his seat by now. ~A fine \
+speech there, reverend.~";
+if (the_spell_was == espnis_spell)
+   "You relate a dull sermon to Delbin about the various \
+types of wood casks used in brewing Mithicus beer. \
+Delbin, being a bartender, is a good listener, and \
+manages to stay awake.";
+        ],
+   has animate proper;
+
+! ****************
+! spells/scrolls
+! ****************
+
+Object musty_scroll "musty scroll" telescope
+  class scroll_class,
+  with name "musty",
+;
+
+Object fiznav_spell "make boat sea-worthy" musty_scroll
+  class spell_class,
+  with name "fiznav",
+       magic [;
+          if (second has animate)
+             "Your chant goes unanswered. It's not intended for \
+              living creatures.";
+          else 
+             "Your chant goes unanswered. It's intended for boats apparently.";
+       ],
+;
+
+Object pale_scroll "pale scroll" 
+  class scroll_class,
+  with name "pale",
+;
+
+Object shazok_spell "call lightning from storm" pale_scroll
+  class spell_class,
+  with name "shazok",
+       magic [;
+             if (second==0 && location==GURTH_Forest) {
+                <<Cast shazok_spell storm1>>;
+             }
+             "Your chant goes unanswered. You need a genuine \
+natural storm, I suppose.";
+       ],
+;
+
+Object glossy_scroll "glossy scroll" Frobar
+   class scroll_class,
+   with name "glossy"
+;
+
+Object feeyuk_spell "allow creature to resist gravity" glossy_scroll
+   class spell_class
+   with name "feeyuk",
+        magic [;
+           if ((second == 0) || (second hasnt animate))
+              "The chant backfires, and your feet feel numb!";
+           if (second == player) {
+              has_resist_gravity = 1;
+              StartTimer(self,75);
+              "You speak the chant in clear tones. Initially, you \
+feel no different. And then, strangely, your back feels better \
+than it has in years, and your step seems lighter!";
+           }
+           CDefArt(second);
+           " is no doubt thankful for the power to resist gravity.";
+        ],
+        time_left 0,
+        time_out [;
+            has_resist_gravity = 0;
+            "You feet feel heavy again."; 
+        ],
+; 
+
+! **********
+! Misc objects
+! **********
+
+Object trophy "trophy"
+   with name "trophy",
+        description "A lovely gold and platinum grail-like trophy that looks \
+          very antique. The letter ~D~ is inscribed on the side. \
+          You notice three odd bumps on the bottom of the circular base.",
+        !weight 20,
+        size 8,
+!        capacity 1,
+!        before [;
+!           Receive:
+!              if (noun hasnt is_sphere)
+!                 "That doesn't seem to fit.";
+!              ! else fancy light tricks
+!        ],
+   has scored;
+! container open transparent;
+
+Object win_bag "bag"
+   with name "bag",
+        description "A small cloth bag.",
+        capacity 50,
+        !weight 10,
+        size 15, 
+   has container open;
+
+Object c20 "coin" win_bag class coin_class;
+Object c21 "coin" win_bag class coin_class;
+Object c22 "coin" win_bag class coin_class;
+Object c23 "coin" win_bag class coin_class;
+Object c24 "coin" win_bag class coin_class;
+Object c25 "coin" win_bag class coin_class;
+Object c26 "coin" win_bag class coin_class;
+Object c27 "coin" win_bag class coin_class;
+Object c28 "coin" win_bag class coin_class;
+Object c29 "coin" win_bag class coin_class;
+!Object c30 "coin" win_bag class coin_class;
+
+