X-Git-Url: https://jxself.org/git/?a=blobdiff_plain;f=src%2Fanthar.inf;fp=src%2Fanthar.inf;h=564deca1a68aed6ead281fbb717df8e68fd5b204;hb=8cf6c360a875867b3cb9b78b9e73a0e72d527d17;hp=0000000000000000000000000000000000000000;hpb=eabbe6652d6c382ba6fe25cba07074f73020b4d0;p=spiritwrak.git diff --git a/src/anthar.inf b/src/anthar.inf new file mode 100644 index 0000000..564deca --- /dev/null +++ b/src/anthar.inf @@ -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) { + ; 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 " ~^"; + font on; + ], +! ~CHRISTMAS TREE MONSTER DORNBERRY BUSH^\ +! ~", + 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. "; + <>; + } + + ! 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.~^^"; + <>; + } + 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) { + <>; + } + "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; + +