+
+! ****************************************************************
+! 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;
+
+