!============================================================================== ! $Id: risorg.inf,v 1.7 2006/03/09 03:45:00 michael Exp $ ! ! $Log: risorg.inf,v $ ! Revision 1.7 2006/03/09 03:45:00 michael ! Updated copyright date. ! ! Revision 1.6 2006/03/09 03:38:19 michael ! Bugfixes and context-driven hints. Final, final version. ! ! Revision 1.5 2004/04/24 01:33:11 michael ! - minor bugfixes, Glulx compatibility, Inform 6.31 tweaks ! ! Revision 1.4 2003/11/27 16:16:26 michael ! Fixed rtrue bug on end-game timer. Updated release information. ! ! Revision 1.3 2003/09/26 03:37:34 michael ! Few final bugfixes for Comp03. Smelling, searching NPCs, version info. ! ! Revision 1.2 2003/09/24 20:59:21 michael ! Initial competition release ! ! Revision 1.1 2003/07/05 03:06:48 michael ! Initial release to beta-testers ! ! !============================================================================== Include "risabbr"; Constant Story "Risorgimento Represso"; Constant Headline "^An Interactive Invigoration ^Copyright (c) 2003,2006 by Michael J. Coyne.^ Players new to Interactive Fiction should type HELP for instructions on how to play.^^"; Release 4; Serial "060308"; ! set this to use hints Constant USE_HINTS; Constant DEATH_MENTION_UNDO; Constant AMUSING_PROVIDED; Constant TASKS_PROVIDED; Constant NUMBER_TASKS = 30; Constant MAX_SCORE = 50; Array task_scores --> 1 1 1 4 1 1 4 2 4 4 2 1 1 1 1 1 1 1 (-2) 1 4 2 1 4 1 1 2 2 1 5; Constant MAX_CARRIED = 10; Constant SACK_OBJECT = Rasp_Satchel; Constant period = "."; Constant period_newline = ".^"; Default SEENO_MSG1 "Try as you might, you can see no "; Default SEENO_MSG2 " here."; Default MAX_LOCATION_LENGTH = 40; ! The below are for pname.h... Replace MakeMatch; Replace Identical; Replace NounDomain; Replace TryGivenObject; ! The above are for pname.h... Replace LookUnderSub; Replace TaskScore; Default COMMENT_CHARACTER '!'; Include "Parser"; Include "seeno"; Include "pname"; Include "yesno"; CompassDirection -> wall_obj "wall" with name 'wall' 'walls'; !------------------------------------------------------------------------------! Object LibraryMessages ! must be defined between Parser and Verblib with before [; Attack: if (noun == player) { if (verb_word == 'abuse') "This is neither the time nor the place for self-abuse."; "Shedding a bitter, regretful tear for the inhumanity of the world, you prepare to take the only road you feel is left open to you. Carefully, you compose yourself, ready to face death. Then, suddenly, you think of all the hundreds of young hearts you'll be breaking, and reconsider."; } if (noun has animate) "Somehow, you don't feel that would help things."; else print "Aside from the emotional scarring, ", (the) noun, " remain"; if ( noun hasnt pluralname ) print "s"; " undamaged by your brutal and senseless attack."; Burn: if (location == Lecture_Hall) "Whilst setting fire to ", (the) noun, " would set the fire bell off and get you out of here, you have neither matches nor lighter."; "As you contemplate setting fire to ", (the) noun, ", you realise Ninario showed extreme foresight in providing you neither matches nor torches."; Climb: "Ah, the places we could go if everything in the world could be climbed."; Eat: if (noun has animate) "You'd have to be much hungrier before you tried that."; if (noun hasnt edible) "Your stomach has been rendered so delicate by two years of Worrell College food, you're pretty sure ", (the) noun, " would disagree with you."; rfalse; Fill: if (TestScope(Can_Water) || TestScope(Fountain) || TestScope(Helmet_Water) || TestScope(Chamberpot_Water)) "That wouldn't really help your cause at the moment."; Jump: if (verb_word == 'jump') "You start feeling jumpy."; else if (verb_word == 'hop') "You hop to it."; else if (verb_word == 'skip') "If only you had a skipping rope."; else if (verb_word == 'jaunt') "You strike a jaunty pose."; "You leap sprightly into the air."; Kiss: "It's doubtful ", (the) noun, " would notice or care."; Listen: if (noun == player) "You hear the slow and steady thumping of your heart, and the rhythmic pattern of your breathing."; "You prick up your ears, but hear nothing out of the ordinary."; LMode1: " is now in its ~brief~ printing mode, which gives long descriptions of places never before visited and short descriptions otherwise."; LMode2: " is now in its normal ~verbose~ mode, which always gives long descriptions of locations (even if you've been there before)."; LMode3: " is now in its ~superbrief~ mode, which always gives short descriptions of locations (even if you haven't been there before)."; Mild: "You express your frustrations gently and eloquently."; Pray: "If only you had a prayer..."; Rub: if (noun == player) "You give yourself a quick dusting off. Not too shabby: well, not anymore."; if (noun has animate) print_ret (The) noun, " might not appreciate that the same way you evidently would."; print_ret (The) noun, " ", (isorare)noun, " clean enough, at least by your student-based standards."; Sing: print "You belt out the lyrics to a few of your current favourites, and realise the Faculty of Music were justified completely in banning you from their building.^"; if (Ninario in location) "^Ninario removes his hands slowly from his ears as you stop singing. ~Dear merciful magic!~ he exclaims. ~Remind me not to teach you any spells involving singing of the incantations.~"; if (Shopkeeper in location) "^~Oh dear,~ says ", (the) Shopkeeper, ", peering nervously over her shoulder. ~I shouldn't do that if I were you, luv, it might disturb mum.~"; if (Crone in location) { if (Crone.out == true) "^Apparently the singing, while bad, isn't ", (i) "quite", " bad enough to raise the dead, for ", (the) Crone, " remains still."; "^~Goodness me!~ cries ", (the) Crone, " ~I hope that's a spell, not an attempt at singing!~"; } if (Hermit in location) "^~I used to be grateful that, in spite of my eyes going, I still had my hearing,~ mutters ", (the) Hermit, ". ~Now I'm not so sure.~"; if (Guard in location) "^", (The) Guard, " bellows along with you lustily. ~Ah deean't knaw th' worrds, but th' toon's reet keppy, fair eneeaf.~"; if (location == Lecture_Hall) "^A few of the less comatose students glance in your direction, but even singing this appalling can't rouse them.^ ^~Students shall refrain from torturing cats while the lecture is in progress,~ intones ", (the) Prof, (string)period; rtrue; Sleep: "You've had so many all-night swotting sessions this year you're good for a long while yet."; Smell: if (noun == player) { if (Sewer_Vat.reach_in == true || Arktos has worn) "You perform a quick olfactory check, and realise you are exuding extremely unpleasant odours."; if (Butter has worn) "You exude a pleasant, buttery odour."; "You perform a quick olfactory check, and conclude that your natural odours are under complete control."; } "Your nostrils detect no out-of-place odours."; Sorry: "You apologise profusely, but no one seems to care."; Strong: "A Catholic upbringing will tell, they say. You can almost feel Sister Ligouri's ruler whap you across the back of the head."; Swim: if (location == Lecture_Hall) "In shirt and trousers? In the middle of a crowded lecture hall? You must be barking."; else if (noun == Fountain || (noun == nothing && location == W_Courtyard)) "There's only about a foot of water in the fountain. If there's not enough room to demonstrate your medal-worthy butterfly stroke, forget it."; else if (noun == Sewer_Vat || (noun == nothing && location == Sewer)) "In the vat? That could prove deadly."; else if (noun ofclass Jug) { if (child(noun) == 0) { print "There isn't any water in it, and even if there were, it only holds ", noun.maximum, " pint"; if (noun.maximum > 1) print "s"; ". A bit less than they have at the swimming baths."; } print "In ", noun.current, " pint"; if (noun.current > 1) print "s"; " of water? This world is magical, but not that magical."; } "Have you looked at yourself? You're dressed in flowing sorcery-student robes. And before you ask, no, you're not the naturist sort."; Take: if (noun == player) "Most of the people you know say they can't take you anymore. Why should you feel differently?"; if (lm_n == 12) "Sadly, you're carrying too many things to take ", (the) noun, " as well."; rfalse; Taste: if (noun == player ) { if (Butter has worn && Arktos has worn) "You taste of a rather unpleasant mix of butter and arktos essence."; if (Arktos has worn) "You taste of arktos essence. It's not terribly pleasant."; if (Butter has worn) "You taste vaguely of butter."; "You have the divine flavour of a beautifully-aged wine: full-bodied and vigorous, yet sweet and yielding to the tongue."; } if (noun has animate) "You're positive that would be one of the more disgusting and distasteful experiences of your life."; rfalse; Think: "You pause and reflect."; Tie: if (verb_word == 'fix') print_ret (The) noun, " doesn't need fixing."; if (second == nothing) "That won't really do much good at the moment."; "Attaching ", (the) noun, " to ", (the) second, " won't be of much help."; Touch: if (noun == player) { if (action_to_be == ##Kiss) { if (verb_word == 'hug' or 'embrace') "You wrap your arms around yourself, trying to glean some small measure of comfort from their embrace. You feel a bit better."; "That would be a neat trick."; } "You feel just fine."; } if (noun has pluralname) "They feel precisely the way they should."; else "It feels precisely the way it should."; SwitchOn: if (noun has animate) "Turning ", (the) noun, " on isn't the way to progress in this game."; rfalse; WakeOther: if (noun == player) <>; "That would presuppose ", (the) noun, " ", (isorare) noun, " asleep, which ", (ItorTheyAre)noun, " not."; Wave: if (Shopkeeper in location) "^~All right, luv?~ asks ", (the) Shopkeeper, " watching you wave ", (the) noun, " about madly."; print "You wave ", (the) noun, " about madly, but nothing happens.^"; if (location == Lecture_Hall) "^", (The) Prof, " glances in your direction and sighs."; if (Ninario in location) "^Ninario ducks under your flailing arms. ~Really! Is that strictly necessary?~"; if (Crone in location && Crone.out == false) "^", (The) Crone, " looks at you curiously. ~I've never seen ", (i) "this", " spell before,~ she mutters."; if (Hermit in location) "^~And you're certain you had to visit ", (i) "my", " mountaintop today?~ asks ", (the) Hermit, " looking a trifle vexed."; if (Guard in location) "^~Watch thah hands,~ mutters ", (the) Guard, " as you flail your arms about."; rtrue; Miscellany: if (lm_n == 9) "^A pool of black inky darkness washes over you. It is now pitch black in here."; if (lm_n == 19) { if (school_clothes hasnt general) print "Intelligent and easygoing, you've done well during your two years at university. The students and fellows at Worrell College accept you, even though you only joined the college this year. You're a bit concerned about this term's chemistry course, but your tutor thought it would make for a good broadening of your Classics focus.^^"; give school_clothes general; if (location == Lecture_Hall) { "At the moment, you're dressed in your usual casual Classics-student type clothes: neatly pressed shirt, and a smart pair of trousers. Worrell is one of the more traditional colleges at the university, and your attire is certainly smart enough to fit the bill."; } else { print "The normal, ordinary sorcery student-type robes that seem to have materialised on your body in this strange and mystical land suit you well."; if (Butter has worn && Arktos has worn) print " They have a rather unpleasant mix of butter and arktos essence smeared all over them."; else if (Butter has worn) print " There is butter smeared all over them."; else if (Arktos has worn) print " There is arktos essence smeared all over them."; if (Sewer_Vat.reach_in == true) print " One arm is covered in sewage following your explorations in the vat."; new_line; rtrue; } } if (lm_n == 26) { if (lm_o provides FakeObj) rtrue; if (lm_o has animate && action_to_be == ##Eat) rtrue; } if (lm_n == 30) "Try as you might, you can't see that here."; if (lm_n == 32) "Try as you might, you can't do that to something you're not holding."; if (lm_n == 37) "Doing that to inanimate objects doesn't seem to do much."; if (lm_n == 38) "Using that verb will not appreciably help."; if (lm_n == 44) "It's unclear what you're referring to."; ]; !============================================================================== Include "Verblib"; Include "risorg"; !============================================================================== ! Object classes Array Case_Array buffer (MAX_LOCATION_LENGTH + WORDSIZE); Attribute is_liquid; Attribute readable; Attribute is_substance; ! These are bitfield constants used in NPC topic fields Default FLAG_x1 $1; Default FLAG_x2 $2; Default FLAG_x3 $4; Default FLAG_x4 $8; Default FLAG_x5 $10; Default FLAG_x6 $20; Default FLAG_x7 $40; Default FLAG_x8 $80; Default FLAG_x9 $100; Default FLAG_x10 $200; Default FLAG_x11 $400; Default FLAG_x12 $800; Default FLAG_x13 $1000; Default FLAG_x14 $2000; Default FLAG_x15 $4000; Default FLAG_x16 $8000; ! These defaults are to define various wall and floor surfaces Default OUTSIDE 000; Default WOOD 100; Default HARDWOOD 101; Default WET_WOOD 102; Default ROUGH_WOOD 103; Default SMOOTH_STONE 104; Default COLD_STONE 105; Default DAMP_STONE 106; Default ROUGH_STONE 107; Default WET_STONE 108; Default SLIMY_STONE 109; Default STONE_TILES 110; Default DIRT 111; Default WET_DIRT 112; Default CONCRETE 113; Default WET_CONCRETE 114; Default PAPER 115; Default THICK_CARPET 116; Default WET_CARPET 117; Default SHORT_GRASS 118; Default LONG_GRASS 119; Default WET_GRASS 120; Default MARBLE 121; Default WET_MARBLE 122; Default COBBLES 123; Default WET_COBBLES 124; Default MOUNTAIN_STONE 125; ! Ended up not using these last ones !Default LAWN_GRASS 126; !Default MEADOW_GRASS 127; !Default PEBBLED_STONE 128; !Default WORN_CARPET 129; Property Walls; Property Floor; Property Nin_Visited; Class Room with before [; Touch: if (noun ofclass CompassDirection) { TouchWalls(noun, self.Floor, self.Walls); rtrue; } rfalse; ], compass_look [obj; TouchWalls(obj, self.Floor, self.Walls); rtrue; ], ! all rooms default to stone walls Walls SMOOTH_STONE, Floor SMOOTH_STONE, Nin_Visited false, has light; Class Outroom class Room, ! outdoor rooms have no walls, and dirt underfoot with compass_look [obj; if (obj == u_obj) <>; "You don't see anything interesting in that direction, other than what's already been mentioned."; ], Walls OUTSIDE, Floor DIRT; Class Autodoor with name 'door', parse_name [wd num; wd = NextWord(); while (WordInProperty(wd, self, name)) { if (action_to_be == ##Open && self hasnt open) num = num + 10; else if (action_to_be == ##Close && self has open) num = num + 10; else if (action_to_be == ##Unlock && self has locked) num = num + 10; else if (action_to_be == ##Lock && self hasnt locked) num = num + 10; else ++num; wd = NextWord(); } return num; ], react_before [; Go: if (noun.door_dir() == self.door_dir()) { if (self == Lib_Doors && Library.library_cleaned == false) rfalse; return self.AutoOpen(); } Enter: if (noun == self) return self.AutoOpen(); Lock: if (noun == self) return self.AutoLock(); Unlock: if (noun == self) return self.AutoUnlock(); ], before [; Search: if (self has open) { print "Looking through ", (the) self, " you see "; if (self.door_to() ofclass Outroom) print "the ", (name)self.door_to(), " area"; else if (self.door_to() hasnt proper) print "the ", (ToLower)self.door_to(); else print "the interior of ", (name)self.door_to(); print_ret ", but you'll have to step through to make out any further details."; } <>; ], AutoLock [ks_save; if (self has locked) { print_ret (The) self, " is already locked."; } if (second ~= nothing) { if (second ~= self.with_key) print_ret (The) second, " doesn't seem to fit the lock of ", (the) self, (string)period; } if (TestScope(self.with_key)) { if (self.with_key notin player) { print "(first taking ", (the) self.with_key, ")^"; ; } if (self has open) { print "(first closing ", (the) self, ")^"; ks_save = keep_silent; keep_silent = true; ; ! restore state of keep_silent keep_silent = ks_save; } ! if it's still open, return false if (self has open) rfalse; ! now lock the door print "You lock ", (the) self, " with ", (the)self.with_key, (string) period_newline; give self locked; rtrue; } else "You don't have a key that fits the lock of ", (the) self, (string) period; ], AutoUnlock[; if (self hasnt locked) { "But ", (the) self, " is already unlocked!"; } if (second ~= nothing) { if (second ~= self.with_key) print_ret (The) second, " doesn't seem to fit the lock of ", (the) self, (string)period; } if (TestScope(self.with_key)) { if (self.with_key notin player) { print "(first taking ", (the) self.with_key, ")^"; ; } print "You unlock ", (the) self, " with ", (the)self.with_key, (string) period_newline; give self ~locked; rtrue; } else "You don't have a key that fits the lock of ", (the) self, (string) period; ], AutoOpen [ ks_save; if (self has open) { print "You step through the doorway "; if (self.door_to() ofclass Outroom) print "out into the ", (name)self.door_to(), " area"; else if (self.door_to() hasnt proper) print "into the ", (ToLower)self.door_to(); else print "into ", (name)self.door_to(); print (string) period_newline; rfalse; } if (self has locked) { if (TestScope(self.with_key)) { if (self.with_key notin player) { print "(first taking ", (the) self.with_key, ")^"; ; } print "You unlock ", (the) self, " with ", (the)self.with_key, ", open ", (itorthem) self, " and step "; if (self.door_to() ofclass Outroom) print "out into the ", (name)self.door_to(), " area"; else if (self.door_to() hasnt proper) print "into the ", (ToLower)self.door_to(); else print "into ", (name)self.door_to(); print (string) period_newline; give self ~locked; } else { print "You attempt to open ", (the) self, " and step through nonchalantly, but "; if (self has pluralname) print "they "; else print "it "; print_ret (isorare) self, " locked."; } } else { print "You open ", (the) self, " and step "; if (self.door_to() ofclass Outroom) print "out into the ", (name)self.door_to(), " area"; else if (self.door_to() hasnt proper) print "into the ", (ToLower)self.door_to(); else print "into ", (name)self.door_to(); print (string) period_newline; } ! save state of keep_silent ks_save = keep_silent; keep_silent = true; ; ! restore state of keep_silent keep_silent = ks_save; if (self hasnt open) rtrue; ]; Class Cheese with name 'cheese' 'cheeses' 'piece' 'slice', article "some", has edible; Class Substance with name 'chemicals' 'powders' 'substance', before [obj; EmptyT: if (parent(self) ofclass Purse) { obj = parent(self); <>; } rfalse; Insert: if (parent(self) == player or SACK_OBJECT) rfalse; obj = parent(self); if (obj ofclass Purse) { <>; } if (self in second) print_ret (The) self, " ", (isorare)self, " already in ", (the) second, (string)period; if (second ofclass Purse || second == Pillow) { <>; } "That's not really a suitable container for ", (the) self, (string)period; Lick,Taste: if (self == Charcoal) "You weren't that fond of dad's outdoor grille cooking that you need to taste the charcoal to remind you of it."; "Not a good idea to do that with unknown substances."; Mix: if (self in Ball_Mill) { print_ret (The) self, " is in the ball mill already. If you want to mix it, just turn the crank."; } if (TestScope(Ball_Mill)) { ; if (second ~= Ball_Mill) { if (second in Ball_Mill) print_ret "^", (The) second, " is in the ball mill already. If you want to mix it, just turn the crank."; if (second ofclass Purse && child(second)) { obj = child(second); ; } else ; } rtrue; } "You remember from your chemistry lectures that these kinds of compounds really need something like a mortar and pestle in order to be mixed together properly."; Take,Remove: if (self == Blackpowder) rfalse; "If you try to carry ", (the)self, " around in your hands, ", (ItorThey)self, " will get everywhere. Besides, for all you know ", (ItorTheyAre)self, " corrosive to skin."; Transfer: if (self == Blackpowder) rfalse; if (second ofclass Purse || second == Ball_Mill or Pillow) { if (second hasnt open) { print "(opening ", (the) second, " first)^"; give second open; } if (self in second) print_ret (The) self, " ", (isorare)self, " already in ", (the) second, (string)period; if (children(second) == second.capacity) { print (The) second, " already contains "; WriteListFrom(child(second), ENGLISH_BIT); print (string)period; } else { ! allow the transfer to proceed print "You remove ", (the) self, " from ", (the)parent(self), " and place ", (itorthem)self, " in ", (the)second, (string)period; if (parent(self) == Ball_Mill) { if (self == Sulphur or KNO3 or Charcoal) Ball_Mill.proper_ingredients--; else Ball_Mill.improper_ingredients--; } if (second == Ball_Mill) { if (self == Sulphur or KNO3 or Charcoal) Ball_Mill.proper_ingredients++; else Ball_Mill.improper_ingredients++; } move self to second; } new_line; rtrue; } "That's not really a suitable container for ", (the) self, (string)period; ], has is_substance; Class Purse with name 'bags' 'pouches', capacity 1, before [obj; Empty: if (child(self)) { "Perhaps you should empty it into something, so you don't get ", (the)child(self), " all over the place."; } "But ", (the) self, " is empty!"; EmptyT: if (child(self) == 0) "But ", (the) self, " is empty!"; if (child(self) ofclass Substance) { if (self notin player) { print "(taking ", (the) self, " first)^"; ; } if (second == self) "You can't empty ", (the) self, " into itself!"; if (self hasnt open) { give self open; print "(opening ", (the) self, " first)^"; } if (second == Ball_Mill) { if (Ball_Mill hasnt open) { give Ball_Mill open; print "(opening the ball mill cover first)^"; } if (children(Ball_Mill) == Ball_Mill.capacity) { "There's no more room in the ball mill."; } print "You empty ", (the) self, " into the ball mill, coating the bottom of the mill with ", (the)child(self), (string) period_newline; if (child(self) == Sulphur or KNO3 or Charcoal) Ball_Mill.proper_ingredients++; else Ball_Mill.improper_ingredients++; move child(self) to Ball_Mill; rtrue; } if (second == Plot) { if (child(self) == KNO3 or NH42SO4) { print "While "; if (child(self) == KNO3) print "potassium nitrate"; else print "ammonium sulphate"; give child(self) general; " is an excellent fertiliser, you don't have any seeds to plant even if you render this plot arable once again."; } "The earth is already dead and lifeless. Why abuse it further?"; } if (second ofclass Purse || second == Pillow) { if (second hasnt open) { give second open; print "(opening ", (the) second, " first)^"; } if (child(second) == 0) { print "You pour ", (the)child(self), " into ", (the) second, (string) period_newline; move child(self) to second; rtrue; } else "But ", (the) second, " already has some ", (name)child(second), " in it."; } "Strewing the contents of ", (the) self, " all over ", (the) second, " will only make an awful mess."; } Insert: if (self notin player) { print "(taking ", (the) self, " first)^"; ; } LetGo: if (child(self) == Blackpowder) rfalse; <>; Mix: if (child(self)) { obj = child(self); <>; } Receive: if (noun ofclass Substance) rfalse; print_ret (The) self, " is ideal for holding powders and substances, but poorly suited for holding ", (the) noun, (string) period; Search: if (self hasnt open) <>; ], has openable container; Class Jug with capacity 1, current 0, before [obj; Drink: if (child(self)) { obj = child(self); <>; } else "But ", (the) self, " is empty!"; EmptyT: if (self notin player) { print "(taking ", (the) self, " first)^"; ; } if (second == d_obj or Carpet) <>; if (second == magic_clothes or player) { if (Sewer_Vat.reach_in == true) { remove child(self); if (self == Watering_Can) self.draining = false; self.current = 0; Sewer_Vat.reach_in = false; "You empty ", (the) self, " over your filthy arm, washing off all the sewage."; } "But that would get your robes sopping wet!"; } if (second == Fountain or Murder_Hole or Toilet_Hole) { remove child(self); if (self == Watering_Can) self.draining = false; self.current = 0; if (second == Fountain) { if (player in W_Courtyard) "You empty ", (the) self, " into the fountain."; else "You can't do that from up here!"; } if (second == Toilet_Hole) "You pour the water into the hole. There is a quick magical whoosh, and the hole is empty once again."; Bailey.Floor = WET_DIRT; "You pour the water into the murder hole. It splashes down to the bailey floor below."; } if (second == self) { "Emptying ", (the) self, " into itself won't really help."; } if (second == Port_Machine) { <>; } if (second ofclass Jug) { if (second notin player && second ~= Funnel) { print "(taking ", (the) second, " first)^"; ; } if (second notin player && second ~= Funnel) rfalse; if (self.current == 0) print_ret "But ", (the) self, " is empty!"; if (second.current == second.maximum) print_ret "But ", (the) second, " is already full!"; if ((second.current + self.current) >= (second.maximum + self.maximum )) "They're both completely full already."; second.current = second.current + self.current; if (second.current > second.maximum) { self.current = second.current - second.maximum; second.current = second.maximum; } else self.current = 0; if (second == Helmet && Helmet has worn) { give Helmet ~worn; print "(removing ", (the) Helmet, " first)^"; } if (second == Helmet && Helmet hasnt general) { give Helmet general; print "Working off your sudden inspiration, you"; } else print "You"; print " pour the contents of ", (the) self, " into ", (the) second; if (self == Chamberpot) { if (second == Watering_Can) { move Can_Water to second; if (Watering_Can.hole == true) { StartTimer(Watering_Can, 2); Watering_Can.draining = true; } } ! helmet is second else if (second == Helmet) move Helmet_Water to second; else ! must be funnel move child(self) to second; } else if (self == Watering_Can) { if (second == Chamberpot) move Chamberpot_Water to second; else if (second == Helmet) move Helmet_Water to second; else ! must be funnel move child(self) to second; if (self.current == 0) self.draining = false; } ! noun must be helmet ! (can't be funnel, as can't move from funnel) else { if (second == Watering_Can) { move Can_Water to second; if (Watering_Can.hole == true) { StartTimer(Watering_Can, 2); Watering_Can.draining = true; } } else if (second == Chamberpot) move Chamberpot_Water to second; else ! must be funnel move child(second) to Funnel; } if (self.current == 0) { if (child(self)) remove child(self); ". ", (The) self, " is now empty."; } else ", leaving some excess behind in ", (the) self, (string) period; } if (second == spectacles) { if (spectacles.clean == false || spectacles.dirty == true) { spectacles.clean = true; spectacles.dirty = false; Achieved(4); remove child(self); self.current = 0; "You pour the water all over the spectacles, washing the lenses clean."; } "How clean do they need to be?"; } print_ret (The) second, " likely wouldn't benefit from having water poured over ", (itorthem)second, (string) period; Empty,LetGo: if (self.current == 0) print_ret (The) self, " is already empty."; if ((Ninario in location) && (location == Study)) { "Ninario grabs your wrist as you prepare to empty ", (the) self, " all over his floor. ~What in the name of all magic do you think you're doing?~ he asks angrily. ~You're going to ruin the floor. Mm-yes!~"; } remove child(self); self.current = 0; switch (location.Floor) { CONCRETE: location.Floor = WET_CONCRETE; MARBLE: location.Floor = WET_MARBLE; DIRT: location.Floor = WET_DIRT; SMOOTH_STONE, COLD_STONE, ROUGH_STONE, STONE_TILES: !PEBBLED_STONE: location.Floor = WET_STONE; WOOD, HARDWOOD, ROUGH_WOOD: location.Floor = WET_WOOD; !WORN_CARPET, THICK_CARPET: THICK_CARPET: location.Floor = WET_CARPET; SHORT_GRASS, LONG_GRASS: !MEADOW_GRASS, LAWN_GRASS: location.Floor = WET_GRASS; default: location.Floor = location.Floor; } print "You empty ", (the) self, " all over the "; if (location == Middle_Tree or Top_Tree) "leaves of the tree."; if (location ofclass Outroom) "ground."; "floor."; Fill: if (self notin player && self ~= Funnel) { print "(taking ", (the) self, " first)^"; ; } if (self notin player && self ~= Funnel) rfalse; if (self.current == self.maximum) print_ret (The) self, " is full already."; if (second ofclass Jug or Water) { <>; } if (second == nothing) { if (TestScope(Fountain_Water)) <>; if (self == Chamberpot) { if (TestScope(Can_Water)) <>; if (TestScope(Helmet_Water)) <>; } else if (self == Helmet) { if (TestScope(Can_Water)) <>; if (TestScope(Chamberpot_Water)) <>; } else if (self == Funnel) { if (TestScope(Can_Water)) <>; if (TestScope(Chamberpot_Water)) <>; } else { if (TestScope(Chamberpot_Water)) <>; if (TestScope(Helmet_Water)) <>; } } if (second == HCl) { <>; } if (second == Fountain or Fountain_Water) { if (self has worn) { give self ~worn; print "(removing ", (the) self, " first)^"; } self.current = self.maximum; if (self == Chamberpot) move Chamberpot_Water to self; else if (self == Helmet) move Helmet_Water to self; else { if (self.hole == true) { StartTimer(self, 2); self.draining = true; } move Can_Water to self; } if (self == Helmet && Helmet hasnt general) { give Helmet general; "Working from your sudden bright idea, you dip ", (the) self, " into the fountain and fill it right to the top."; } "You dip ", (the) self, " into the fountain and fill it right to the top."; } else "There doesn't appear to be any water here with which to fill it."; Receive: if (self notin player) { print "(taking ", (the) self, " first)^"; ; } if (second ofclass Water) <>; else if (noun == HCl) <>; if (self == Chamberpot) "Ninario might not appreciate you putting things like that into his ", (name)self, (string)period; if (self == Helmet) "You wouldn't want to wear it again if you did that."; "Watering cans are supposed to hold water."; Search: if (child(self)) { if (child(self) ofclass Water) print (The) self, " contains ", self.current, " pint"; if (self.current > 1) print "s"; print_ret " of water."; } else print_ret (The) self, " is empty."; Transfer: if (second ofclass Jug) <>; rfalse; ! "You don't want to put the water in that!"; ], invent [; if (child(self)) { print (a)self, " containing ", self.current, " pint"; if (self.current > 1) print "s"; print " of water"; } else { if (self == Helmet) print "a ", (name)self; else print "an empty ", (name)self; if (self has worn) print " (perched on your head)"; } rtrue; ], has container open; Class Water with description "The water is clear and glittering.", article "some", before [obj; Examine: rfalse; Insert: if (second ofclass Jug) { obj = parent(self); <>; } "You can't simply take water like that!"; ], has is_liquid; Class Prop with before [; Search: <>; Take,Pull,Push,PushDir,Transfer: "You strain and tug, but can't do it."; ], has scenery; Class Furniture with before [; Take,Pull,Push,PushDir,Transfer: print (The) self; if (self has pluralname) print " look "; else print " looks "; print_ret "so peaceful, you decide to leave ", (itorthem) self, " alone."; ], has static supporter; Class Portal with name 'green' 'glowing' 'portal' 'potral' 'protal', description "The green portal glows and shimmers, pulsating before you.", initial [; "A green glowing portal, shimmering and coruscating, lies north of you."; ], before [; Pull,Push,PushDir: "You can't manipulate the glowing green portal in this way."; Take,Touch: "Your hand passes right through the portal as though it's not there."; ], has light; Class Bed_Window with name 'bedroom' 'window' 'windows', description [; print "This ordinary frame window faces "; if (self == N_Bed_Window) print "north"; else print "west"; print " out over the courtyard."; if (self has general) " Some senseless fool has smashed it to pieces."; else { new_line; rtrue; } ], before [; Attack: if (self hasnt general) { print "You deal the window a mighty blow. It has evidently not been constructed with destructive vandals like you in mind. It breaks, shards of glass cascading down into the courtyard outside.^"; give self general open; if (Ninario in Study) { print "^As the last jagged pieces of glass fall from the frame, you hear the pattering of feet and Ninario "; if (Bedroom_Door hasnt open) { give Bedroom_Door open; print "throws open the door and "; } print "enters the room."; if (W_Bed_Window has general && N_Bed_Window has general) { TwoWindows(); rtrue; } else OneWindow(); rtrue; } else if (W_Bed_Window has general && N_Bed_Window has general) { "^Well at least now Ninario has a matching set of smashed windows."; } else "^Ninario's going to be thrilled when he returns home."; } else "You've already done as much damage as you can to that window."; Enter: if (self has open) { print "You slide your legs out over the sill, and slowly lower yourself until you're hanging by your fingertips. Then, you let go."; print " You land sharply on the ground, rolling with the impact.^"; if (self == N_Bed_Window) PlayerTo(N_of_Tower); else PlayerTo(W_Courtyard); rtrue; } else { NoWinJump(); rtrue; } JumpThrough: <>; Open: if (self has general) "The window, having been smashed, is now of the easy, low-maintenance, never-needs-opening variety."; rfalse; Close: if (self has general) "You attempt to close the window, but fail. You close your eyes and drift along the pathways of memory. You see someone smashing the window, sending shards of glass cascading down. The figure turns, and you are gazing into your own face. You open your eyes in shock at the realisation. You are the one who broke the window! What madness could have seized you and forced you to commit such a wanton act of violence? You shake your head sadly in dismay."; rfalse; Search: if (self == W_Bed_Window) <>; else "A large dirt courtyard sits below the window. A huge stone wall runs along the north side of the courtyard, but from here, it's hard to tell how far it extends."; Tie: if (self has general) "Lacking the tools and equipment for smelting glass, you decide against it."; ], after [; Open: "You push the northern window up and breathe in the sweet fresh air deeply."; Close: "You shove the window down, closing it."; ], has scenery ~open openable; Class Study_Window with name 'bay' 'study' 'window' 'windows', description [; print "A beautiful bay window facing "; if (self == E_Study_Window) print "east out over a large area of tilled earth."; else print "south out over the courtyard."; if (self has general) " It has been ruthlessly destroyed."; else { new_line; rtrue; } ], warn false, before [; Attack: if (self hasnt general) { if (Ninario in location) { print "Ninario grabs your arm as you pull back your hand to smash the window. "; if (E_Study_Window.warn == true || S_Study_Window.warn == true) "~Gracious me!~ he cries. ~Don't you listen? Leave the windows alone!~"; else if (W_Bed_Window has general || N_Bed_Window has general) { print "~Well, now at least I know who's been smashing my bedroom windows,~ he says angrily. ~Leave my windows alone.~"; } else print "~Intolerable incantations!~ he cries. ~What are you trying to do? Don't smash my windows! Mm-yes. No.~ He sits back down at his desk, keeping his eye on you."; self.warn = true; new_line; rtrue; } print "You pull back your arm and smash the window. Shards of glass shower down into the courtyard outside."; give self general open; if (S_Study_Window has general && E_Study_Window has general) print " Your strange, two-fold penchant for both order and chaos has given Ninario a matching set of broken study windows."; new_line; rtrue; } else "You've already done as much damage as you can to that window."; Enter: if (self has open) { print "You slide your legs out over the sill, and slowly lower yourself until you're hanging by your fingertips. Then, you let go."; if (Ninario in location) { print " As you drop, you hear a sigh from Ninario. "; if (self == S_Study_Window) print "~Batty, completely batty.~"; else print "~Mad, completely mad.~"; } print " You land sharply on the ground, rolling with the impact.^"; if (self == S_Study_Window) PlayerTo(S_of_Tower); else PlayerTo(Garden_Plot); rtrue; } else { NoWinJump(); rtrue; } JumpThrough: <>; Open: if (self has general) "The beauty of smashed windows is that there's no more fiddling around with all that opening and closing nonsense."; rfalse; Close: if (self has general) "You run down to the courtyard, pick up the shards of glass and painstakingly reassemble them. You melt the glass and reform the window, pane by pane. Well, at any rate, that's what you'd have to do if you wanted to close the smashed window."; rfalse; Tie: if (self has general) "If you wanted a lovely, traditional, unsmashed window, perhaps you should have left it alone."; ], after [; Close: "You pull the window closed and push the latch carefully back into position."; ], has scenery ~open openable; !============================================================================== ! Global flags Global Thirsty = true; Global vis_flag = 0; !============================================================================== ! The game objects Room Lecture_Hall "Lecture Hall" with description [; if (self hasnt visited) { StartDaemon(Prof); } "An ordinary, run-of-the-mill lecture hall. Its many banks of tiered seats run up towards the large and heavy double doors at the west end. Down at floor level, at the east end of the hall, ", (the) Prof, " is teaching the lesson. Tiers upon tiers of bored students sit in the seats."; ], compass_look [obj; if (obj == e_obj) "The professor lectures away down at the east end of the room."; if (obj == w_obj) <>; TouchWalls(obj, self.Floor, self.Walls); rtrue; ], Walls CONCRETE, Floor CONCRETE, each_turn [; notebook.Celt_Notes++; if (turns == 4) "^You really feel you must get out of this room."; if (turns == 7 && lecture_portal notin location) { move Rumbling to Lecture_Hall; "^A brief low rumbling comes from under your desk."; } if (turns == 9 or 14) "^A mild sense of panic is beginning to set in. You feel the boredom of the lecture seeping into your body, leeching the strength from your limbs. You must get out of here!"; if (turns == 11 && lecture_portal notin location) "^The rumbling under your desk increases in intensity."; if (turns == 19) { deadflag = 3; print "^The soporific nature of the lecture has proven too much for you. Your ", (name)Prof, "'s droning voice loosens all the muscles in your body, and soon, you find yourself appreciating the lecture and taking an active interest in the subject. You graduate with a First in ", (i) "Celtic Elements in Early Teutonic Settlements", " and devote your life to the subject."; } ], before [; Exit: if (player in lecture_seat) rfalse; <>; ], cant_go "As desperate as you are to escape, you can't claw your way through the walls.", d_to [; <>; ], w_to [; <>; ], e_to [; "The lecture is boring enough at this distance that you don't want to get any closer to ", (the) Prof, " right now."; ], n_to [; if (lecture_portal in self) <>; rfalse; ]; Furniture -> lecture_desk "desk" with name 'desk' 'deks', description "Perfectly ordinary lecture hall desk.", describe [; if (child(self) == 0) rtrue; new_line; <>; ], before [; Enter: <>; LookUnder: if (turns < 7 && yogurt hasnt concealed) rfalse; if (lecture_portal in location) { "It looks like that glowing green portal was the only thing under the desk. Sigh."; } if (player in lecture_seat) move player to location; move lecture_portal to location; give Portal_Hint ~concealed; print "You look under the desk. To your surprise"; if (yogurt has concealed) print " the yogurt cup has vanished completely. Instead"; print ", a strange green glowing ball sits there. As you watch, it expands suddenly and bursts open into a large green portal, throwing you, the desk and all its contents into the air as it does so."; if (yogurt hasnt concealed) print " Your yogurt cup sails gracefully through the air and disappears with a solid-sounding whump into the portal."; remove yogurt; "^^~Students shall refrain from moving the furniture,~ says ", (the) Prof, " as you land with a crash.^ ^A green glowing portal, shimmering and coruscating, lies north of you."; ReachUnder: if (yogurt hasnt concealed) "You dig around under ", (the) self, " but don't feel anything."; "You dig around blindly under the desk, but can't locate the yogurt cup."; Search: if (child(self) == yogurt) "An empty cup of yogurt, the remains of your elevenses, sits on the desk."; if (child(self)) { print "Perched on the desk"; WriteListFrom(child(self), ENGLISH_BIT + ISARE_BIT); print_ret (string) period; } "The desk is empty."; ], react_before [; Listen: if (noun == nothing) { if (lecture_portal in location) "The portal is emitting a low, throbbing hum."; else { print "You hear the steady drone of ", (the) Prof, " giving a very boring lecture, and the odd snore from the class."; if (Rumbling in location) print " You can also hear a low rumbling coming from under your desk."; new_line; rtrue; } } rfalse; ]; Furniture -> lecture_seat "seat" with name 'chair' 'seat', description "The seat is attached to the desk and has been worn smooth by the bottoms of many generations.", react_before [; if (player in self) { if (action == ##Go) { if (noun == u_obj) <>; print "(getting out of your desk first)^"; ; new_line; rfalse; } } ], before [; LookUnder: <>; Take: "The seat is attached to the desk."; ], after [; Enter: "You slide quietly back into your seat."; ], react_after [; Exit: "~Students shall please remain seated while the lecture is in progress,~ intones ", (the) Prof, " as you stand up."; ], has scenery enterable; Prop -> seats "banks of tiered seats" with name 'many' 'banks' 'of' 'tiered' 'teired' 'desks' 'seats', parse_name ParseNameOf, article "many", description "Bank upon bank of tiered seats line the hall.", before [; Enter: "You already have a seat of your own."; ], has pluralname; Prop -> overhead "overhead projector" with name 'overhead' 'projector', description "Perfectly ordinary overhead projector."; Object -> Lecture_Doors "large heavy double doors" with name 'large' 'heavy' 'double' 'door' 'doors', description "Large, imposing and heavy double doors leading out to the hallway and freedom.", tried_door 0, before [; Enter,Open: if (self.tried_door == 2) { "Hopeless now, you yank furiously at the doors, weeping in your despair. ^^", (The) Prof, " glares. ~Ahem! Students... that is to say, ", (i) "one", " student in ", (i) "particular", " shall ", (i) "refrain", " from attempting to leave while the lecture is in progress,~ he snarls, looking fixedly at you."; } self.tried_door++; if ( self.tried_door == 1 ) "The doors rattle as you pull at the handle. They are locked.^^~Students shall please remain in the hall until the lecture ends,~ drones your ", (name)Prof, (string)period; if ( self.tried_door == 2 ) "The doors rattle more loudly as you tug at them more insistently.^^~Students shall please refrain from attempting to leave while the lecture is in progress,~ growls your ", (name)Prof, (string)period; Search: <>; ], has scenery pluralname door openable lockable locked; Object -> Prof "professor" with name 'professor' 'prof' 'teacher' 'lecturer' 'bozo' 'doctor' 'sir' 'instructo' 'tutor' 'mentor' 'guru' 'master' 'fool' 'proffesso' 'proffesor', description [; print (The) Prof, " is dressed in the same clothes he's been wearing since the start of term. He is standing by the overhead projector and droning on and on"; if (Lecture_Doors.tried_door == 1) print ". He glances up at you every now and then, as though checking what you're up to"; if (Lecture_Doors.tried_door == 2) print ". He keeps stopping his lecture to glare up at you for seconds at a time"; print_ret (string) period; ], before [; Bargain: "This type of single-minded academic simply can't be bargained with."; Kiss,Touch: "Getting a First would be nice, but you don't need one that badly."; Listen: print_ret (The) Prof, " is giving a very boring lecture."; MeetNPC: print_ret (The) Prof, " peers up into the seats as you shout a cheery greeting, trying to pinpoint the shouter. ~Please don't any of you make the mistake that I am fond of you,~ he mutters."; Attack,Smell,Take,Search: "That would mean you'd have to get closer to him, and if you do, the penetrating waves of boredom will kill you."; Talk: <>; WakeOther: "Contrary to what the boredom level might indicate, ", (the) Prof, " is in fact awake."; ], life [; Answer: if (noun == 'hello' or 'hi') <>; else <>; Ask,Tell: "~Students shall remain seated and listen to the lecture. Questions may be posed at the end of the session,~ drones ", (the) Prof, (string)period; ], orders [; HurryUp: "~The lecture will proceed at its own pace,~ intones the professor."; Meet,MeetNPC: <>; default: "~Please, I'm trying to give a lecture here.~"; ], number_of_comments 0, daemon [; if (location == Lecture_Hall) { if (self.number_of_comments == 9) "^", (The) Prof, " drones boringly on with the lecture."; self.number_of_comments++; switch (self.number_of_comments) { 1: print "^~Now if you remember, in the course syllabus, I mentioned we would begin by discussing the settling instincts of early German nomad tribes,~ lectures "; 2: print "^~It's fascinating to note that as the early Teutons shifted from nomads to village-dwellers, they started by building huts,~ declaims "; 3: print "^~But what is particularly fascinating is the fact that, under some circumstances...~ intones "; 4: print "^~... and some very unique conditions, when parts of these huts have collapsed in certain ways...~ drawls "; 5: print "^~... they could, by expert scholars, be reasoned to have been built in the shape of early Celtic crosses,~ mumbles "; 6: print "^~Indeed, it is this very fact upon which my whole research has been founded,~ rambles "; 7: print "^~It was some thirty years ago now I first received a grant from the Teutonic Study Foundation...~ maunders "; 8: print "^~...and proceeded to finally realise my dream of spending every waking moment immersed in Teutonic and Celtic lore,~ blathers "; 9: print "^~Now, let us proceed on to the meat of the lecture, though I warn you, some of this material is not quite as exciting as the title of the course may indicate,~ drones "; } print_ret (the) Prof, (string) period; } ], has scenery animate male; Object -> students "bored and disinterested students" with name 'student' 'students' 'class' 'classmate' 'mates' 'chums' 'girls' 'boys' 'chaps' 'women' 'men' 'guys' 'everyone' 'everybody' 'someone' 'somebody' 'pupil' 'pupils' 'kids' 'dispirite' 'bored' 'disintere', description "The students look extremely bored, disinterested and dispirited.", before [; Attack,Search: "Even that wouldn't rouse this crowd."; Bargain: "No one seems interested in doing any deals."; Kiss,Touch: "None of the students are attractive enough to tempt you."; Listen: "You hear the odd snore of the noisier sleepers, the regular steady breathing of the quieter ones, but otherwise the class is silent."; MeetNPC: "You greet some of your fellow students. A few of them glance in your direction and scowl."; Smell: "They smell like any other group of students. In other words, some are extremely clean, others extremely not."; Talk: <>; Take: "Isn't it always the way? There are so many, you can't decide which one you want."; WakeOther: "The ones who are asleep are the lucky ones. Leave them be."; ], life [; Answer: if (noun == 'hello' or 'hi') <>; else <>; Ask,Tell: if (second == 'prof' or 'professor' or 'lecturer') "One of the students sitting nearby shakes her head. ~The sad thing is, he's the most interesting lecturer in this field.~"; "A couple of the students turn to look at you, but you can elicit no other response."; ], orders [; Meet,MeetNPC: <>; Open: if (noun == Lecture_Doors) "A student sitting nearby smiles at you. ~You've never taken a course with this chap, have you? He always keeps the doors locked until the end of the lecture.~"; default: "~I'm bored, but not that bored,~ responds one of the students."; ], has scenery animate pluralname; Prop -> Hall_Prop "lecture hall" with name 'lecture' 'hall' 'room', FakeObj, before [; Enter: "You're already in the lecture hall."; Examine: <>; Rub: "The university has paid staff for doing that, and you really don't want to run foul of their union by trying to clean the room yourself."; Search: "Apart from what you can see, there doesn't appear to be anything hidden away in the room."; default: "It's just a lecture hall. It's probably not worth trying to do that."; ]; Prop Rumbling "rumbling" with name 'low' 'rumbling', FakeObj, before [; if (lecture_portal in Lecture_Hall) "Now that the portal has arrived, the rumbling sound has been replaced by the low throbbing hum of the portal."; default: "It's a very odd low rumbling sound, almost subsonic."; ]; Object yogurt "empty cup of yogurt" lecture_desk with name 'raspberry' 'empty' 'cup' 'of' 'yogurt' 'yoghurt' 'yoghourt' 'silvery' 'foil' 'flap', parse_name ParseNameOf, article "an", description "A fly crawls slowly along the rim of the empty cup of raspberry yogurt, nosing around the silvery foil flap that used to cover the cup.", gone false, before [; if (self has concealed && action ~= ##Find) "But the yogurt has rolled under the desk!"; Close: "The foil wrapper has been peeled back, so the yogurt cup can no longer be closed effectively."; Find: if (yogurt has concealed) <>; Lick,Taste: "Ah, the tantalising flavour of raspberry yogurt."; Open: "You've already opened the yogurt. That's how you ate it."; Smell: "The interior smells very strongly of raspberries."; ReachIn,Remove,Take,Empty,LetGo,Transfer: give self concealed; move self to location; "You start to move your hand towards the yogurt cup, but you hit it accidentally, and knock it to the floor, where it rolls underneath the desk."; ], has container open; Object fly "fly" yogurt with name 'fly' 'insect' 'bug' 'creepy-cr' 'creepy' 'crawlie' 'crawly', description [; <>; ], before [; Lick,Smell,Taste: "That would be pretty disgusting."; Examine: <>; default: <>; ], has scenery; Portal lecture_portal "green glowing portal" with description "The green portal glows and shimmers, pulsating hypnotically. Oddly, no one else pays it the slightest attention.", before [; Close: "You're not quite sure how to do that."; Enter: give school_clothes ~worn; remove school_clothes; move magic_clothes to player; give magic_clothes worn moved; StopDaemon(Prof); print "Desperate to find out where your yogurt has gone and desperate to escape the mind-numbing tryptophanic journey of this lecture, you leap into the portal. The swirling colours spin past you in a blur of gaseous green fluorescence. Dull reverberations push against your ears in a throbbing pressure of sound. Then, everything goes green.^"; Achieved(0); HitKey(); PlayerTo(Library); give LectMenu concealed; give CaerMenu ~concealed; rtrue; Listen: "The portal is emitting a low, throbbing hum."; Open: "The portal looks open already."; ]; Room Library "Library" with library_cleaned false, description [; if (self hasnt visited) { print "Crash! You land with a whump of displaced air and a frantic flurry of lecture notes. As the notes cascade down in a soft blanket of Teutonic white, you hear a voice. ~Mm-yes. Most satisfactory. I appear even to have brought your local precipitation along with your good self.~^ ^As the papers slowly settle, you make out a figure in a long robe standing in front of you. As the figure leans forward to look at the lecture notes, you see a wizened and bespectacled old face with small beady features buried in a mass of white hair, beard and wrinkles. ^^~However,~ he continues, picking up some of your lecture notes, ~it seems a most unusual form of precipitation. No doubt localised to the university. I must give the idea some study one day.~^ ^He drops the notes and extends a hand. ~Welcome, my dear student. Please excuse the mess, but I'm sure you know the disorder a life of study - mm-yes - the work of the scholar - can bring. Oh, by the way, my name is Ninario, but my friends - erm, my acquaintances - call me Ninny.~ He pauses and frowns slightly.^ ^You shake his hand bemusedly, unsure what to make of your new surroundings. You are in a large rectangular room, with walls of grey stone. A huge set of double doors lie on the east wall. Opposite the doors are six windows, stretching from floor to ceiling. The sunlight streaming in through these reveals your lecture papers have added little to this fellow's mess - the floor is knee deep in loose papers, and books with dark leather covers are scattered at various points, like raisins buried in a mass of white bread. There are also several precarious-looking stacks of books standing up tall.^ ^Ninario picks up a book from the floor absently and looks around in some consternation, trying to find somewhere to put it. He settles for placing it on top of a large tower of books. The pile, already unsteady, takes unkindly to this latest affront, and collapses, separating into its component volumes and disappearing into the mass of white. Ninario expels a sigh of the long-suffering variety and returns his attention to you.^ ^~No doubt you are somewhat confused and disoriented by your journey. Perhaps, given the mess, it would be best if we retired to my study so I can explain why I've brought you here. Why don't you meet me there in a few minutes, just after I... erm, well, yes, attend to some other business. It's through the small oaken door across the hall.~^ ^Somehow, Ninario struggles through the vast mountains of paper, and leaves the room. You are all alone in this strange and new place.^"; } else { print "Large and rectangular, the library has solid walls of grey stone. Overpopulated bookshelves line the northern wall. A huge set of "; if (Lib_Doors has open) print "open "; else print "closed "; print "double doors lie on the east wall. Opposite the doors are six windows, stretching from floor to ceiling. By the sunlight streaming in through these, you can see the floor is "; if (self.library_cleaned == false) "knee deep in loose papers, and books with dark leather covers are scattered at various points, like raisins buried in a mass of white bread. This room is incredibly messy."; else "made of beautifully polished hardwood."; } ], compass_look [obj; if (obj == e_obj) <>; if (obj == w_obj) <>; TouchWalls(obj, self.Floor, self.Walls); rtrue; ], Nin_Visited true, Walls SMOOTH_STONE, Floor PAPER, before [; Exit: if (player in location) <>; rfalse; ], cant_go "The only way out appears to be the double doors leading east.", n_to "The northern wall is filled with bookshelves.", s_to "The smooth grey stone of the southern wall clearly does not contain any doors, secret or otherwise.", w_to "The windows aren't the opening kind, and you're not feeling adventurous enough to jump through the glass.", u_to [; <>; ], e_to [; if (self.library_cleaned == false) "You try to struggle through the mountain of paper to get to the door but you have sunk in so far you can't move."; give StudyMenu ~concealed; give MainHallMenu ~concealed; return Lib_Doors; ]; Prop -> Lib_Window "library windows" with name 'six' 'glass' 'window' 'windows', description "The six large windows reach from floor to ceiling, filling the western wall.", before [; Attack: "Your attack bounces harmlessly off. These windows have evidently been magically reinforced, with the aim of defeating destructive vandals such as yourself."; Close: "They're already closed permanently."; JumpThrough: <>; Open,Unlock: "You can't find a latch or lock anywhere. These windows are not the opening kind."; Search: give self general; print "A large dirt courtyard sits below the window. A huge stone wall runs along the west side of the courtyard, but from here, you can't tell how far it extends. A huge portcullis is "; if (Portcullis has open) print "raised "; else print "lowered "; print "in front of a large opening in the middle of the wall, directly across the courtyard. Beyond the portcullis is a short passageway, followed by a set of iron-banded wooden doors"; if (Caer_Door has open) print ". They have been blasted apart, and hang limply from their hinges. "; else print ", massive and imposing. "; "A large white fountain sits majestically in the middle of the courtyard, water cascading down its pristine alabaster surfaces."; ], has pluralname; Object -> mess "mass of papers" with name 'library' 'mass' 'papers' 'mess' 'scrolls' 'room' 'paper' 'stacks' 'piles' 'stack' 'pile' 'libary' 'libray' 'mountain' 'mountains' 'of', parse_name ParseNameOf, description [; if (Library.library_cleaned == true) "You now see the floor is made of beautifully polished hardwood. This room is spotlessly clean."; "It is a mass of papers, books, scrolls and other paraphernalia."; ], before [; Climb,Enter,Jump,JumpOver: if (Library.library_cleaned == true) "With the library as clean as it is, the mountain of papers is no longer worthy of your mountaineering skills."; "You attempt to climb on top of the papers, but you're sunk in too deeply."; Lick: "As entertaining as it might be, it would take an awfully long time to lick the entire library clean."; Push,Rub,ReachUnder: if (Library.library_cleaned == true) "The library is as clean as you can make it."; Library.library_cleaned = true; Library.Floor = HARDWOOD; move Rasp_Satchel to Library; move Lab_Key to Library; give Keyhint ~concealed; give Sathint ~concealed; Achieved(1); "You shift the worst of the mess, getting the place into some semblance of order; to your surprise you not only manage that, but also uncover a small steel key and a shiny red satchel."; Search: if (Library.library_cleaned == true) "The room is so spotless now, you can easily see there's nothing more to be found here."; "This room is messy enough that searching it will be difficult."; Take: if (Library.library_cleaned == false) <>; "There are far too many of them."; ], has scenery; Prop -> books "books" with name 'books' 'shelves' 'bookshelv' 'bookshelf' 'shelf' 'bookcase' 'case' 'overpopul', article "some", description "Various books with strange-sounding titles. Judging by the level of dust on all the books, you expect Ninario keeps them in here because he never reads them.", before [; Attack,Burn: "You're enough of a scholar that the idea of deliberately destroying a book is abhorrent to you."; Take,Read,Search: if (self has general) "You caused enough damage last time that you don't want to risk touching another."; give self general; "Clouds of dust rise into the air as you remove a book from one of the shelves at random. You open it and several dozen pages disintegrate into papery dust. Hurriedly, you close the book and put it back on the shelf."; ], has pluralname readable; Room Stairwell "Stairwell" with description "There are no windows here near the stairwell of this squat and serviceable tower, but dim dusty sunlight filters down from above and from the ends of the hallway. A wrought-iron spiral staircase ascends and descends here, its brass railing polished smooth by the passage of many hands. The corridor also extends north and south.", cant_go "From here, you can head north or south along the hall, or take the stairs up or down.", compass_look [obj; if (obj == u_obj) "The rickety stairs lead up into bright sunlight above."; if (obj == d_obj) "The rickety stairs lead down to the ground floor of the tower."; if (obj == n_obj) "To the north, the hallway comes to an end, with doors leading east and west from it."; if (obj == s_obj) "To the south, the hallway comes to an end, with doors leading east and west from it."; TouchWalls(obj, self.Floor, self.Walls); rtrue; ], n_to [; print "You head north up the hall.^"; return U_North_Hall; ], s_to [; print "You head south down the hall.^"; return U_South_Hall; ], d_to [; print "You descend the stairs to the ground floor.^"; return Main_Hall; ], u_to [; print "You ascend the winding stairs into the warm sunshine on top of the tower.^"; return Tower_Roof; ]; Room U_South_Hall "South Hallway" with description [; print "Daylight seeps almost apologetically into the passage through the narrow window in the south wall. A set of "; if (Lib_Doors has open) print "open "; else print "closed "; print "double doors lead west to the library and a smaller oaken door lies "; if (Study_Door has open) print "open to the east. "; else print "closed to the east. "; print "The dim sunlight reveals a set of stairs to the north.^"; if (location hasnt visited) { print "^Ninario wanders down the hall from the north, drying his hands on his robe.^ ^~Ah, there you are, my dear student,~ he beams. ~Let's step into my study, and we can sort all this out.~ Ninario opens the door to the east and escorts you into the study.^"; give location visited; give Study_Door open; HitKey(); PlayerTo(Study); } rtrue; ], compass_look [obj; if (obj == n_obj) "The hallway extends north to a set of stairs."; if (obj == e_obj) <>; if (obj == s_obj) <>; TouchWalls(obj, self.Floor, self.Walls); rtrue; ], before [; Exit: if (player in location) <>; rfalse; ], cant_go "The study lies east, the library west and the hallway leads north.", n_to [; print "You head north up the hall.^"; return Stairwell; ], s_to [; <>; ], w_to Lib_Doors, e_to Study_Door; Object Narrow_Window "window" with name 'narrow' 'window' 'windows' 'slit', description [; print "The window is an open, narrow slit in the "; if (self in U_South_Hall) print "southern"; else print "northern"; " wall, which admits a small amount of daylight. It is far too narrow to fit through, or even see through very well."; ], before [; Attack: "Smashing windows is difficult when they contain no glass."; Enter,JumpThrough: "The window is far too narrow to fit through."; Search: "The window is so narrow all you can see is packed dirt in the courtyard below."; ], found_in Workshop Toilet U_North_Hall U_South_Hall, has scenery; Autodoor Lib_Doors "huge double doors" with parse_name [wd num; wd = NextWord(); while (wd == 'huge' or 'double' or 'doors' or 'door' or 'red' or 'mahogany' or 'door') { if ((action_to_be == ##Open && self hasnt open) || (action_to_be == ##Unlock && self has locked)) { if (wd == 'door') if (TestScope(Study_Door) && Study_Door hasnt open) rfalse; num = num + 10; } else if ((action_to_be == ##Close && self has open) || (action_to_be == ##Lock && self hasnt locked)) { if (wd == 'door') if (TestScope(Study_Door) && Study_Door has open) rfalse; num = num + 10; } else { if (wd == 'door') if (TestScope(Study_Door)) rfalse; ++num; } wd = NextWord(); } return num; ], description [; print "The library's double doors are huge slabs of red mahogany. "; if (self has open) "They are currently open."; "They are currently closed."; ], found_in Library U_South_Hall, door_dir [; if (self in Library ) return e_to; return w_to; ], door_to [; if (self in Library) return U_South_Hall; return Library; ], has scenery pluralname door open openable; Autodoor Study_Door "small oaken door" with name 'small' 'oaken' 'door' 'delicatel' 'carved' 'bas-relief' 'bas' 'relief', description [; if (self in U_South_Hall || self has open) { print "The small oaken door, decorated with a delicately carved bas-relief of a leaping rabbit,"; if (self in U_South_Hall) " leads to the study."; else " leads back to the hall."; } else "A closed oaken door leading back to the hall."; ], found_in Study U_South_Hall, DeadWood true, before [; Knock: if (self in Study) "But you're already in the room!"; if (Ninario in Study) { print "~Mm-yes? Please come in!~ Ninario calls through the "; if (self has open) print "open "; "door."; } ], door_dir [; if (self in U_South_Hall) return e_to; return w_to; ], door_to [; if (self in U_South_Hall) return Study; return U_South_Hall; ], has scenery door openable; Room Study "Study" with description [; print "More orderly than the library to the west, but still rather cluttered, this room looks like it is used on a regular basis. Although it lacks the appointment of a proper bed, the settee in the corner, loaded with pillows, tells you Ninario sleeps in here more often than not. A desk sits in the corner, loaded with papers, half-written spell scrolls, and various mouldy old books. A long, glowing strip of parchment hangs from the northern wall. Large glass windows on the southern and eastern walls admit bright shining sunlight into the room. "; if (E_Study_Window has general && S_Study_Window has general) print "The glass in both windows has been destroyed by your reckless violence."; else if (S_Study_Window has general) print "The glass in the southern window has been destroyed by your reckless violence. "; else if (E_Study_Window has general) print "The glass in the eastern window has been destroyed by your reckless violence. "; print "West, the "; if (Study_Door has open) print "open "; else print "closed "; "door leads back to the hallway."; ], Nin_Visited true, Floor HARDWOOD, compass_look [obj; if (obj == s_obj) <>; if (obj == e_obj) <>; if (obj == w_obj) <>; TouchWalls(obj, self.Floor, self.Walls); rtrue; ], before [; Exit: if (player in location) <>; rfalse; Go: if (noun == w_obj) { if (player in Settee) { print "(pulling yourself off the settee first)^"; move player to location; } give Ninario ~general; rfalse; } ], cant_go "The only way out of here is west out the door unless you're game for trying the windows.", d_to [; <>; ], e_to [; <>; ], s_to [; <>; ], w_to Study_Door; Furniture -> Settee "settee" with name 'settee' 'couch' 'soft' 'white' 'pillows' 'cushions' 'sofa' 'chesterfi' 'divan' 'loveseat' 'setee' 'sette', description "The settee is loaded down with soft white pillows.", describe [; if (child(self) == 0) rtrue; new_line; <>; ], react_before [; if (player in self) { if (action == ##Go) if (noun == u_obj) <>; } ], after [; Enter: print "You throw yourself noisily onto the settee."; if (Ninario in location) print " ~Please!~ exclaims Ninario. ~I'm trying to work.~"; new_line; rtrue; ], before [; LookUnder: print "You pry up all the cushions, move all the pillows and look under the settee, but find nothing of particular interest"; if (child(self)) { print ", apart from "; WriteListFrom(child(self),ENGLISH_BIT); print " nestled amongst the cushions"; } if (Ninario in location) ".^^~If you're looking for spare change, one of my fellow wizards visited last week and cleared it all out,~ Ninario tells you."; print (string)period; new_line; rtrue; Search: if (child(self)) { print "Nestled amongst the pillows on the settee"; WriteListFrom(child(self),ENGLISH_BIT + ISARE_BIT); print_ret (string) period; } "You dig through the pillows and cushions, but don't find anything of interest."; Take,Pull,Push,PushDir,Transfer: "The settee and its assorted pillows and cushions are so beautifully arranged, you decide to leave them as they are."; ], has enterable; Object -> Bearskin_Rug "bearskin rug" with name 'bearskin' 'rug', description [; print "The black bearskin rug is old, mouldy and foul-smelling."; if (child(self) ~= 0) { print " "; <>; } new_line; rtrue; ], describe [; if (self hasnt general) { rtrue; } print "^A bearskin rug lies across the "; if (location == Tower or Tower_Roof) print "tower floor"; else if (parent(self) has supporter) print (name) parent(self); else if (location ofclass Outroom) print "ground"; else print "floor"; if (child(self) ~= 0) { print ". Sitting on the rug"; WriteListFrom(child(self), ENGLISH_BIT + ISARE_BIT); } print_ret (string) period; ], react_after [; if (self has worn) { if (action == ##Go) print "^The rug makes movement difficult, but you manage it.^"; rfalse; } ], after [; Disrobe: give self supporter; print "The stench of the rug wins in the end, and you duck back out from under it. Phew!^"; if (Ninario in location) "^Ninario gazes at you pensively. ~I wonder if my next apprentice will be quite as odd as you seem to be.~"; if (Shopkeeper in location) "^", (The) shopkeeper, " gazes at you for a long while, then nods. ~Well, luv, if I had any doubts that you really were a wizard's apprentice, they're gone now. You're certainly odd enough to fit the bill.~"; if (Crone in location) "^", (The) Crone, " stares at you for a few moments. ~I hope, for all your effort shuffling around in that thing, that you're in the middle of casting a very powerful smell... err, spell.~"; if (Hermit in location) "^~Huh,~ mutters ", (the) Hermit, ". ~The bear appears to have turned into a wizard's apprentice.~"; if (Guard in location) "^", (The) Guard, " stares at you in astonishment. ~Stthrange queer things tha diz, fair eneeaf,~ he says."; rtrue; Drop: if (Shopkeeper in location) "Dropped.^ ^~It's nice luv, but it doesn't really fit in,~ says ", (the) Shopkeeper, (string)period; Insert: "You roll the bearskin rug up tightly and manage to shove it into ", (the) second, (string) period; Take: if (self in location) { if (location.Walls == OUTSIDE) "You haul the bearskin rug up from the ground."; "You haul the bearskin rug up from the floor."; } Wear: print "You duck under the rug. The smell and heat are oppressive, but it's possible to peer through the mouth to see your way around.^"; if (Ninario in location) "^Ninario chuckles. ~You don't make a terribly convincing bear.~"; if (Shopkeeper in location) "^", (The) Shopkeeper, " shakes her head at you, and smiles. ~You'll need more than a furry rug to look like a bear, luv.~"; if (Crone in location) "^", (The) Crone, " cackles loudly. ~Hah! This is a new one. I thought I knew all the obscure spells, but you must have some kind of doozy brewing there.~"; if (Hermit in location) "^~Huh,~ mutters ", (the) Hermit, ". ~The wizard's apprentice appears to have turned into a bear.~"; if (Guard in location) "^", (The) Guard, "'s eyes narrow. ~Ez-tha gotten et?~ he asks, peering at the bearskin rug suspiciously."; rtrue; ], before [obj i; Enter: if (self notin location) "The rug needs to be on the ground in order for you to do that."; if (Ninario in location) { if (self hasnt moved) "~Ahem!~ coughs Ninario loudly. ~Let's not get footprints on my favourite rug.~"; "~Footprints all over my favourite rug,~ sighs Ninario as you step onto it briefly."; } "You step onto the rug briefly, and then get back off."; LookUnder,Push: if (self notin location) { print "The rug needs to be on the "; if (location ofclass Outroom) print "ground"; else print "floor"; " in order for you to do that."; } if (self hasnt moved) { print "You pull back the rug, but don't find anything other than the hardwood floor.^"; if (Ninario in location) print "^~What were you expecting?~ asks Ninario looking at you amusedly. ~A trap door?~^"; rtrue; } if (real_location == Shed) <>; print "You pull back the rug, but don't find anything interesting.^"; if (Ninario in location) print "^~Looking for trap doors?~ asks Ninario.^"; if (Crone in location) "^~Are you expecting trap doors to appear just because you drop a rug on the floor?~ ~ cackles ", (the) Crone, " in delight.^ ^~Hmmm,~ she muses, ~a trap door. That's an interesting idea all the same. I'd better mention it to that Implementor when I see him again.~"; if (Hermit in location) "^~Just like society,~ mutters ", (the) Hermit, ". ~You think all your problems can be swept under the rug.~"; if (Shopkeeper in location) "^~No,~ ", (the) Shopkeeper, " says, shaking her head. ~I still don't like it.~"; if (Guard in location) "^~Careful~ warns ", (The) Guard, ". ~It mud still be alive!~. He peers at the rug suspiciously."; rtrue; PutOn: if (second == Trapdoor) "You indulge yourself by placing ", (the) self, " over the trap door, simply for the thrill of pulling it back and seeing the trap door. How exciting!"; Receive: if (noun == Hastener) { if (Ninario in location) "~Ahem!~ coughs Ninario loudly as you prepare the wood hastener. ~My rug does not need hastening, thank you very much.~"; } if (noun == Arktos) { if (Arktos hasnt open) print "(opening ", (the) Arktos, " first)^"; if (Ninario in location) "~Ahem!~ coughs Ninario loudly as you prepare the jar. ~My rug does not need arktos essence smeared all over it.~"; move Arktos to self; "You smear the oily brown concoction all over the bearskin rug.^ ^The jar itself vanishes, a handy consequence of the Thalionic Antimagic Litter Campaign."; } if (noun == Butter) { if (Ninario in location) "~Ahem!~ coughs Ninario loudly as you prepare the butter. ~My rug does not require any buttering.~"; move Butter to self; "You smear the creamy yellow butter all over the bearskin rug."; } if (self notin location) { print "The rug needs to be on the "; if (location ofclass Outroom) print "ground"; else print "floor"; " in order for you to do that."; } Smell: "The rug is a foul-smelling bouquet of unpleasant odours."; Take: if (self in player) { rfalse; } if (player in self) { move player to location; print "(getting off the bearskin rug first)^"; } if (Ninario in location) { if (self hasnt moved) { if (spectacles in Ninario && (spectacles.clean == false || spectacles.dirty == true)) "~What's that? What's going on?~ calls Ninario, peering desperately at the floor as you slowly pull at the rug. He slams a foot down on the rug. ~I hope that big brown blur sliding across the floor isn't a certain apprentice attempting to take my rug. Mm-yes. No.~"; "Ninario's foot slams down on the rug. ~I know you apprentices are prone to running around and picking up everything that isn't nailed down, but don't even think about it. That's ", (i) "my", " rug.~"; } } for (i = 0: i < children(self): i++) { obj = child(self); if (obj ~= Butter or Arktos) { move obj to location; print "(dislodging ", (the) obj, ")^"; } } rfalse; Taste,Lick: "That wouldn't be terribly tasty; rather, it would taste terrible."; Touch: "The fur of the rug feels coarse and heavy."; ], has enterable supporter clothing; Object -> Ninario "Ninario" with name 'Ninario' 'Ninny' 'Nin' 'wizard' 'mentor' 'him' 'sorcerer' 'magician' 'tutor' 'master' 'sir' 'himself', Nin_Chat 0, Nin_Topics 0, Nin_Topics2 0, buttered false, add_to_scope spectacles Symbols, description [; if (location == Study) { print "Ninario is a short, somewhat tubby figure, with long white hair and a big bushy beard. He is dressed in long flowing robes, similar to the ones you are now wearing, but decorated with strange mystic symbols of some kind."; if (spectacles in self) { print " He is wearing a "; if (spectacles.clean == true && spectacles.dirty == false) print "spotless"; else print "filthy"; " pair of wire-rimmed spectacles."; } else { new_line; rtrue; } } if (Ninario in location) "Ninario looks none the worse for wear from his brief imprisonment, though his long flowing robes are looking a trifle tattered and torn."; else "It's a bit difficult to see him, but you know he's behind that door."; ], daemon [; if (parent(self) ~= location) { move self to location; print "^Ninario trots along after you.^"; if (location.Nin_Visited == false) { self.Nin_Chat = 0; location.Nin_Visited = true; switch(location) { Cell: print "^Ninario gazes around the small cell and shakes his head. ~I wasn't locked in here very long, but it's a very unpleasant little room. Why, the stench alone would shake the strongest wizard. Mm-yes.~ He shudders.^"; Tower: if (self.Nin_Topics & FLAG_x3 == FLAG_x3) print "^~This might be the perfect place to launch that carpet from,~ muses Ninario.^"; else print "^~Ooh, this is most awfully high,~ frets Ninario, peering over the edge. ~I wonder if Renaldo was planning to throw me off here. He certainly had that in mind for ", (i) "you", " after he found out you were from a scientifically-evolved society. He managed to wring that from me, I'm afraid to say.~^"; default: ; } } } rtrue; ], initial [; if (location == Study && self hasnt general) { self.Nin_Chat = 0; give self general; if (location hasnt visited) { print "Ninario waves you to a seat on the settee and then proceeds to settle himself down at the desk.^ ^~Let me explain why you are here and how you arrived from the university. I have brought you here because I have need of an apprentice. It's a bit of a social requirement amongst wizards. To that end, I used a spell to retrieve you from the Wizardry Internship Programme at Oxbridge University in Vechlee.^ ^~What's that you say? You didn't sign up for a Wizardry Internship Programme? Well perhaps ", (a) Prof, " put your name on the.... You don't even attend Oxbridge University? Oh dear. Perhaps I contacted another university in Vechlee by mis.... I beg your pardon? You've never heard of Vechlee? But it's the largest city in the whole of Thalion, my young... Oh dear. Never heard of Thalion... Eh? England? No, I've never heard of it, dear student. Oh my, oh my. You seem to be from an altogether different time and place.^ ^~Mm-yes,~ continues Ninario, ~I thought I detected some small interferences in the spell. Of course, the incantation I used to retrieve you was not, in fact, my own, and the people from whom I, um, acquired it were not disposed to explain its proper operation. I had no idea its efficacy would allow it to extend to other dimensions. Mm-yes. I fear something must have gone wrong after I'd made contact with Oxbridge, and somehow the spell ended up reaching into your bizarrely-named ", (i) "England", " and extracting you from your scholarly pursuits. Most vexing.^ ^~Still, never mind. We'll soon sort things out. Mm-yes. I would conjecture some type of bridge has formed between our two realities, a rift in our world, if you will. It must be repaired, perhaps through sending you home... or if you'd rather stay, perhaps I can find a spell to close it.~^ ^He turns to his desk and begins groping around on it. ~I know that spell is here somewhere. If only I could... now where on earth have my spectacles gone?~ He sighs in exasperation. ~I can't possibly find that spell, let alone cast it, without them. Mm-yes. No.~^ ^He pokes around the desk, frowning to himself, and then suddenly brightens. ~Of course! That can be your first little job, my dear student. Perhaps you can find my spectacles for me, while I get on with some other work here, and then we can see about sending you home... or at least getting that rift closed.~^^"; ; print "^Ninario waves a hand vaguely in the direction of the hallway and the rest of his tower. ~Well, I'm sure you'll find them!~ he says cheerfully, and then turns back to his desk.^ ^You get off the settee."; rtrue; } switch(random(2)) { 1: "Ninario sits at his desk, working."; 2: switch(random(100)) { 1 to 20: print "Ninario looks up from his desk as you enter."; if (spectacles in Ninario && (spectacles.clean == false || spectacles.dirty == true)) " ~Hello? Mm-yes? Who's there?~"; if (Helmet has worn) " His eyes flick up to the rusty old helmet on your head and he chuckles to himself."; if (Chamberpot has worn) " His eyes flick up to the chamberpot on your head and he laughs out loud."; new_line; rtrue; 21 to 30: "Ninario scratches his head as he studies something at his desk."; 31 to 50: "Ninario huddles over his desk, muttering to himself, failing to take notice of you."; 51 to 70: print "Ninario glances up at you as you enter."; if (spectacles in Ninario && (spectacles.clean == false || spectacles.dirty == true)) " ~Hello? Mm-yes? Who's there?~"; if (Helmet has worn) " His eyes flick up to the rusty old helmet on your head and he chuckles to himself."; if (Chamberpot has worn) " His eyes flick up to the chamberpot on your head and he laughs out loud."; new_line; rtrue; 71 to 85: print "Ninario looks up as you enter."; if (spectacles in Ninario && (spectacles.clean == false || spectacles.dirty == true)) " ~Hello? Mm-yes? Who's there?~"; print " ~Mm-yes, hello there.~"; if (Helmet has worn) " He glances at the rusty old helmet on your head and chuckles to himself."; if (Chamberpot has worn) " He glances at the chamberpot on your head and laughs out loud."; new_line; rtrue; 86 to 90: "~Well, cast a spell on me and call me enchanting. Mm-yes,~ murmurs Ninario as you enter."; 91 to 93: print "As you enter, Ninario is reading some papers on his desk. ~Dangerous "; if (spectacles in Ninario && (spectacles.clean == false || spectacles.dirty == true)) { print_ret (i) "what?", "~ he mutters to himself. ~I can't read a word this thing says.~"; } "magicking?~ he mutters to himself. ~I'll show them dangerous magicking. They can't censure me.~"; 94 to 96: print "As you enter, Ninario leaps up in alarm. ~How on earth did you get into my tower, you young rascal?~ He peers at you closely"; if (spectacles in Ninario && (spectacles.clean == false || spectacles.dirty == true)) " trying to see you through the glasses."; print ". ~Oh, mm-yes, we met before. Of course.~ He sits back down again."; if (Helmet has worn) " ~You mustn't have been wearing that rusty old helmet when you arrived,~ he says."; if (Chamberpot has worn) " ~Perhaps you weren't wearing a chamberpot on your head when you arrived,~ he says."; new_line; rtrue; 97 to 99: "As you enter, Ninario's head snaps up from the desk, his snore cutting off in midstream. ~I was just resting my eyes. Mm-yes.~"; 100: print "Ninario leaps to his feet, his chair crashing to the ground as you enter. ~I swear to you, I know nothing about the spurious castings in question! I was casting those spells for a friend. Nothing to do with me. Mm-yes. No.~"; if (spectacles in Ninario && (spectacles.clean == false || spectacles.dirty == true)) " He peers at you closely. ~Perhaps you're not whom I thought you were,~ he mutters, picking up his chair and sitting down. He peers at you again, straining to see through the glasses. ~But then again, who can tell?~"; " Then, as he looks at you more closely, he nonchalantly picks up his chair and sits down again. ~Ahem! I thought you were someone else. Mm-yes.~"; } } } if (location == Study) { give Bearskin_Rug general; if (spectacles in Ninario && (spectacles.clean == false || spectacles.dirty == true)) "Ninario sits at his desk, trying desperately to work, but having great difficulty."; if (Study hasnt general) give Study general; else print "Ninario sits at his desk, working.^"; rtrue; } if (self.Nin_Topics & FLAG_x1 == FLAG_x1) "Ninario is here, glancing around nervously."; "Ninario is here, glancing around a bit bemusedly."; ], each_turn [; if (Ninario notin real_location) rfalse; if (location ~= Study && (self.Nin_Topics & FLAG_x1 ~= FLAG_x1)) rfalse; if (self.Nin_Chat == 1 && location == Study) { if (spectacles in Ninario && (spectacles.clean == false || spectacles.dirty == true)) "^~What the magic does this thing say?~ mutters Ninario, trying desperately to read something on his desk."; switch(random(50)) { 1 to 10: print "^Ninario mutters to himself as he works at his desk.^"; 11 to 20: print "^Ninario shuffles the papers on his desk.^"; 21 to 25: print "^Ninario fiddles absently with something at his desk.^"; 26 to 30: print "^Ninario undergoes a brief fit of coughing.^"; 31 to 35: print "^Ninario blows his nose noisily on his sleeve.^"; 36 to 40: print "^Ninario fidgets in his chair.^"; 41 to 45: print "^Ninario picks up a piece of paper, gazes at it for a long while, and then puts it back down.^"; 46 to 48: print "^Ninario mutters something about the Wizards Guild under his breath.^"; 49: print "^~Fresh scrolls,~ Ninario mutters to himself. ~Must get fresh scrolls.~ He peers closely at a piece of paper in his hand. ~Or does that say fresh rolls? Hmmm.~^"; 50: print "^~Saltpetre,~ mutters Ninario. ~Only three measures left. Must get more.~ He makes a note on a piece of paper.^"; } } if (self.Nin_Chat == 3) { switch(location) { Study: ; First_Floor_Hall: if (location.Nin_Visited == false) { location.Nin_Visited = true; print "^~What a shambles!~ says Ninario, gazing around the hall. ~Did you do that?~ he asks indicating the clouds of dust billowing into the room from the south. He rubs his hands together with glee. ~Well done! You've certainly got a future in wizardry ", (i) "or", " science, my dear student! I'm rather proud of you. Mm-yes.~^"; } default: print "^~I really hope you know how to get us out of here,~, says Ninario anxiously. ~Lead on, my young apprentice!~^"; } } self.Nin_Chat = random(4); rtrue; ], before [; if (Ninario in Cell && Cell_Door hasnt open && action ~= ##Examine or ##Listen or ##Talk or ##Ask or ##MeetNPC) "Ninario is behind the locked door of the cell, so doing that would be difficult at the moment."; Bargain: "~I'm not the Vechlee market square,~ says Ninario sharply."; Listen: if (Ninario in Cell && Cell_Door hasnt open) "You can hear the occasional muffled ~Mm-yes! I'll show those Guild members!~ through the door."; "Ninario mutters to himself every now and then."; MeetNPC: if (location == Study) { print "Ninario peers at you as though he's never seen you before in his life. Then recognition dawns on his face. ~Ah, yes, of course, we met in the library, didn't we? You're the student who"; if (spectacles in self) print " found "; else print "'s looking for"; " my spectacles, so we can see about closing that rift.~ He turns back to the papers on his desk."; } else { if (Ninario in Cell && real_location ~= Cell) <>; if (self.Nin_Topics & FLAG_x1 == FLAG_x1) "~Yes, yes, my dear student, but we must really concentrate on escaping.~"; self.Nin_Topics = self.Nin_Topics | FLAG_x1; "Ninario suddenly seems to notice you, and shakes off his stupor. He grasps your hand warmly. ~My dear student, I can't tell you how happy I am to see you! I wasn't looking forward to attending my execution later today. Mm-yes. No. Lead the way to freedom and my long, execution-free life!~"; } Smell: "Ninario gives off a slightly musty smell, stale but not distasteful."; Talk: if (Ninario in Cell && real_location ~= Cell) <>; if (location ~= Study) { if (self.Nin_Topics & FLAG_x1 ~= FLAG_x1) <>; "~I rather think we'd be better off concentrating on escaping, my dear pupil.~"; } "Ninario looks at you expectantly. ~Well, my dear pupil, ask me something, then.~"; Take,Kiss,Touch,Search: if (location ~= Study) if (self.Nin_Topics & FLAG_x1 ~= FLAG_x1) <>; "~Hands off,~ says Ninario, pushing you away. ~This isn't that kind of student-teacher relationship.~"; ], life [obj; if (Ninario in Cell && real_location ~= Cell) <>; Answer: if (noun == 'hello' or 'hi') <>; "Ninario looks at you expectantly. ~If you want something, my dear pupil, then please ask.~"; Ask: if (location ~= Study) { if (self.Nin_Topics & FLAG_x1 ~= FLAG_x1) <>; if (WordInProperty(second, Toilet_Hole, pname)) { if (self.Nin_Topics & FLAG_x2 == FLAG_x2) print "~Well,~ Ninario frowns, ~as I said,"; else print "Ninario looks at you in surprise. ~Are you suggesting what I think you're suggesting?~ He tugs at his beard pensively.^^~Well,"; self.Nin_Topics = self.Nin_Topics | FLAG_x2; "I ", (i) "suppose", " we could escape through the garderobe. But what if we got stuck partway?~ He shudders. ~And my robes would get so dirty... ~ He glances down at his somewhat tattered robes. ~Mm-yes, well, perhaps that argument isn't valid at the moment. Well, I leave it up to you, my dear student. If you think that's the thing to do, lead the way. I shall follow.~"; } else if (WordInProperty(second, Red_Carpet, name)) "~Yes, a flying carpet could certainly prove useful.~"; else if (WordInProperty(second, Symbols, name)) { if (self.Nin_Topics & FLAG_x4 == FLAG_x4) { "~Mm-yes, well, they haven't improved since the last time you asked about them.~"; } self.Nin_Topics = self.Nin_Topics | FLAG_x4; "Ninario looks down sadly at his somewhat tattered robes. ~Mm-yes, well, if I'd known I was going to be hauled off by the Wizards Guild, I might have changed out of my bunny night attire. I'm sure you understand why; look at the state they're in.~"; } else if (WordInProperty(second, Asiago, name) || WordInProperty(second, Bel_Paese, name) || WordInProperty(second, Wensleydale, name) || WordInProperty(second, Camembert, name) || WordInProperty(second, Gouda, name) || WordInProperty(second, Emmental, name) || WordInProperty(second, Stilton, name) || WordInProperty(second, Miranda, name) || WordInProperty(second, Cheshire, name) || WordInProperty(second, Roquefort, name) || second == 'venezuela' or 'venezeula' or 'beaver' or 'caerphill' or 'philly') { "~Mm-yes,~ muses Ninario, ~I'm not certain how discussing cheese will help in this situation, so perhaps we'd better concentrate on escaping.~"; } else switch(second) { 'cell', 'prison': if (location == Cell) "Ninario gazes around the small cell. ~It's as you see it, my dear student.~"; else "~My cell?~ asks Ninario. ~Well, there's not much in there, really. I think it was a toilet before they turned it into an impromptu cell for me. Mm-yes.~"; 'escape', 'escaping', 'getting', 'out': "~Escape certainly would be a good idea, my dear student. Mm-yes indeed.~"; default: "~I rather think we'd be better off concentrating on escaping, my dear pupil.~"; } } if (WordInProperty(second, Stone_Bottle, name)) "~It's a highly concentrated paint stripper,~ says Ninario. ~I think I have a bottle around somewhere. Don't open it in the basement, whatever you do.~"; if (WordInProperty(second, Port_Machine, name) || WordInProperty(second, gears, name) || second == 'manual' or 'oil') "~You know,~ muses Ninario, ~it's been so many years since I left the caer, I can't even remember how much water you have to put in that machine to open the portcullis. Mm-yes. No. You'll just have to experiment.~"; if (WordInProperty(second, Ball_Mill, pname)) "~There's one in the workshop.~"; if (WordInProperty(second, Bed, name)) { if (self.Nin_Topics & FLAG_x9 == FLAG_x9 ) print "~Weren't you listening the first time?~ Ninario asks pointedly. ~I do have better things to do than to keep telling you that "; else print "~My bed?~ repeats Ninario. ~Well, "; self.Nin_Topics = self.Nin_Topics | FLAG_x9; if (Bedroom hasnt visited) "it's up the hall in my bedroom.~ He waves his hand vaguely. ~You're welcome to sleep there if you're tired. I usually bunk in here. I'm far too busy to travel all the way down the hall. Mm-yes.~"; "you've seen the thing, you know as much as I do. It's a little too ultra-modern in design for my taste, but exceedingly comfortable. Of course, I usually sleep in here. If you're tired, you're welcome to use the bed.~"; } if (WordInProperty(second, Silk_Purse, name) || WordInProperty(second, Leather_Pouch, name) || WordInProperty(second, Flask, name) || WordInProperty(second, EW_Dish, name) || WordInProperty(second, Ceramic_Bowl, name) || second == 'purses' or 'pouches' or 'potions' or 'liquids' or 'substance' or 'substances' or 'crystal' or 'crystals' or 'dishes') "~I've got various purses, pouches and dishes of chemicals down in the laboratory. If you bring them up here, I'll gladly identify any of them for you.~"; if (WordInProperty(second, papers, name) || WordInProperty(second, desk, name)) "Ninario glances at the desk. ~I'll get around to cleaning it all off someday.~"; if (WordInProperty(second, Cannon, name)) { if (self.Nin_Topics & FLAG_x7 == FLAG_x7) print "Ninario sighs. ~Students never pay attention. Mm-yes. No. As I have already explained, "; else print "Ninario chuckles. ~Mm-yes, that rickety old thing. "; self.Nin_Topics = self.Nin_Topics | FLAG_x7; "I purchased it a short while ago. Reclaimed military issue. I was using it for some experiments in incendiaries. If only I had time to pursue the matter further.~ He shakes his head."; } if (WordInProperty(second, Cannonball, name)) "~Mm-yes,~ muses Ninario. ~There may be one still in the workshop.~"; if (WordInProperty(second, Toilet_Hole, pname)) { if (self.Nin_Topics & FLAG_x1 ~= FLAG_x1) { self.Nin_Topics = self.Nin_Topics | FLAG_x1; "~Oh yes, it's up the hall on your right-hand side. Mm-yes.~"; } else { if (self.Nin_Topics & FLAG_x2 == FLAG_x2) { print "~Well,~ Ninario frowns, ~as I said earlier, it's "; } else if (self.Nin_Topics & FLAG_x1 == FLAG_x1) { self.Nin_Topics = self.Nin_Topics | FLAG_x2; if (Toilet hasnt visited) print "~Oh, haven't you seen it yet? You should. It's "; else print "~Ah, you've visited it?~ smiles Ninario. ~It's "; } "a most ingenious invention. All manner of, um, evacuations are whisked magically away to the sewer vat in the basement. Then, once a month I head down there and give the channel a quick unblocking. Mm-yes. Most efficacious.~"; }; } if (WordInProperty(second, Blackpowder, name)) { if (self.Nin_Topics & FLAG_x11 == FLAG_x11) print "~Forgotten already?~ asks Ninario. ~Well, no matter. What"; else { print "~Did you want to make some black powder? Dear me. Mm-yes. Well, if you want to make something suitable for the cannon upstairs, what"; self.Nin_Topics = self.Nin_Topics | FLAG_x11; } " you need to do is mix some saltpetre, charcoal and sulphur together and grind it up nicely in a ball mill. Mm-yes. I normally use three measures of saltpetre, and one each of charcoal and sulphur. Those aren't the precise quantities, but it works. And of course you'll want to find a powder bag of some kind to put it in.~"; } if (WordInProperty(second, Ninario, name)) "Ninario shrugs. ~I'm a wizard, as you know. There's not really much to tell. Other than, don't believe what you read about me in Wizarding Weekly.~"; if (WordInProperty(second, Caer_Door, name)) "~They open and they close,~ he says shortly, not looking up from his desk."; if (WordInProperty(second, Rusted_Key, name)) "Ninario slaps around his clothing for a time, then gives up with a frown. ~Hmm, I was sure I had the workshop key with me. Oh well. Be a good student and locate it, would you?~"; if (WordInProperty(second, Newspaper, name)) { if (Toilet hasnt visited && second == 'paper') <>; "~Wizarding Weekly? That paper's very good usually, but this last issue... terrible, terrible. Shoddy journalism, mm-yes indeed.~"; } if (WordInProperty(second, Symbols, name)) { if (self.Nin_Topics & FLAG_x6 == FLAG_x6) { "Ninario glares at you for a long while, and then shakes his head. ~Interfering nosy busy-body students,~ he mutters."; } if (self.Nin_Topics & FLAG_x5 == FLAG_x5) { self.Nin_Topics = self.Nin_Topics | FLAG_x6; "Ninario glares at you. ~They are ", (i) "magic", " rabbits of course, and thus completely justified artistically.~ He sniffs haughtily. ~A wizard's night attire is sacrosanct,~ he mutters to himself."; } self.Nin_Topics = self.Nin_Topics | FLAG_x5; "Ninario draws his robes protectively around himself. ~Mm-yes,~ he says, somewhat huffily. ~I have rabbits on my pyjam... err, my robes. What of it?~"; } if (WordInProperty(second, Bearskin_Rug, name) || second == 'pet' or 'friend') "Ninario sighs. ~She was a pet, a dear friend, for many, many years. Mm-yes. Once she was gone, I couldn't bear to part with her.~ He pats the rug tenderly. ~And of course,~ he continues clinically, ~the rest of her was extremely useful. Spell components, you know. Mm-yes indeed. And if you ever need to look like a bear in a hurry? An invaluable disguise.~"; if (WordInProperty(second, Sewer_Pipe, name)) { if (self.Nin_Topics & FLAG_x3 == FLAG_x3) { "~I've already told you all I know about the outflow pipe.~"; } else { self.Nin_Topics = self.Nin_Topics | FLAG_x3; "~Just watch where you're standing when you unblock the pipe,~ he warns you. ~Mm-yes, indeed.~"; } } if (WordInProperty(second, Portcullis, name)) "~It opens and it closes,~ he says shortly, not looking up from his desk."; if (WordInProperty(second, Sewer_Vat, name) || WordInProperty(second, Sewer_Channel, name)) "~It's in the basement. Probably needs unblocking, too.~"; if (WordInProperty(second, Spectacles, name)) { if (spectacles in self) if (spectacles.clean == false || spectacles.dirty == true) "~Well, to be honest,~ says Ninario, ~there seems to be something wrong with the lenses. They're not nearly as useful as they were before. Mm-yes. No. In fact, I'd go so far as to say I can see better without them at the moment.~"; else "~They're working splendidly, thank you.~"; if (self.Nin_Topics & FLAG_x4 == FLAG_x4) print "Ninario gives you a slightly embarrassed glance. ~Mm-yes, well, as I said earlier, there's a strong possibility that they may have ended up"; else print "Ninario taps a finger pensively against his chin. ~Now let's see,~ he murmurs, ~I had the spectacles in the library, when I greeted the new student. Then I went to the facilities and I know I had them then, to read the paper while I, um, mm-yes. Then I put them down on the seat and after that... oh dear. I hope I didn't end up dropping them"; self.Nin_Topics = self.Nin_Topics | FLAG_x4; " down the drain... um... again. Mm-yes.~"; } if (WordInProperty(second, Staircase, name)) "Ninario waves a hand dismissively. ~It's been years since anyone died on those stairs. They're fine.~"; if (WordInProperty(second, HCl, name)) "~The vial of liquid?~ says Ninario. ~Whatever you do, don't get any on you. It's muriatic acid. Eats through metal like rabbits through a field of carrots. Mm-yes.~"; if (WordInProperty(second, Workshop_Door, name)) "~The workshop is off the main hall, through the rusty door,~ he says. ~But I'll have to give you the key. Mm-yes.~ He slaps around his clothing for a time, then gives up with a frown. ~Hmm, I was sure I had it with me. Oh well. Be a good student and locate it, would you?~"; if (WordInProperty(second, Hastener, pname)) "~It's used for hastening the growth of wood,~ Ninario says shortly."; if (WordInProperty(second, Stuffing, pname)) "~Useful for filling pillows,~ mutters Ninario, concentrating on something at his desk."; if (WordInProperty(second, Pillow, name)) "~Usually stuffed with feathers,~ mutters Ninario, concentrating on something at his desk."; if (WordInProperty(second, Linen, name)) "~I like to keep a supply of clean linen near the bed,~ says Ninario, ~in case of, erm, chamberpot complications.~"; if (WordInProperty(second, Chamberpot, name) || second == 'complicat') "Ninario scowls briefly at you. ~We all have to go during the night sometimes. Mm-yes. And sometimes the toilet is just too far away.~"; if (WordInProperty(second, Asiago, name) || WordInProperty(second, Bel_Paese, name) || WordInProperty(second, Wensleydale, name) || WordInProperty(second, Camembert, name) || WordInProperty(second, Gouda, name) || WordInProperty(second, Emmental, name) || WordInProperty(second, Stilton, name) || WordInProperty(second, Miranda, name) || WordInProperty(second, Cheshire, name) || WordInProperty(second, Roquefort, name) || second == 'venezuela' or 'venezeula' or 'beaver' or 'caerphill' or 'philly') { "~Why is everyone who comes through here so fixated by cheese?~ mutters Ninario. ~I told my last student that I only eat Venezuelan beaver cheese and a fight almost broke out.~"; } switch(second) { 'death', 'died', 'dying': "~It comes to us all in the end,~ mumbles Ninario."; 'drain': "~It leads to the sewer vat in the basement,~ says Ninario, giving a vague wave in the direction of the rest of the tower. ~Down the stairs.~"; 'me', 'myself', 'yourself', 'you': "~Aren't you the student I summoned here accidentally? The one who needs to be sent home? Oh dear, if you don't know, I certainly don't. Mm-yes.~ Ninario starts muttering to himself, looking concerned."; 'rubbish', 'heap', 'garbage', 'tip', 'helmet', 'helm', 'hat', 'dump': "~You're welcome to anything you find in the rubbish heap,~ says Ninario magnanimously. He pauses and frowns. ~Erm, including any and all communicable diseases you may contract, for which I bear no responsibility. Mm-yes. No.~"; 'light', 'source', 'silvery-w', 'cylinder', 'rod', 'magnesium', 'flare', 'silvery', 'lamp': "~I think there's one in the laboratory,~ says Ninario, busy with something at his desk."; 'emily', 'short', 'personals', 'personal', 'ad': "~I don't know anything about any of the personal ads in that magazine,~ says Ninario quickly. ~I rarely read them... and of course, I'd certainly never take out an ad myself. Mm-yes. No.~"; 'england', 'uk', 'britain': "~As I say, I've never heard of it before,~ frowns Ninario. ~It's an island, you say? That's interesting, so is Thalion. I wonder if we inhabit transdimensional versions of the same piece of land. Mm-yes. Most fascinating.~"; 'transdime', 'versions', 'geography': "~Mm-yes, well, it's possible that our two worlds have the same physical geography,~ says Ninario, ~given that we both seem to speak Angli perfectly well.~"; 'angli', 'english': "~It's the language we're speaking,~ says Ninario. ~Obviously the same in both our worlds, albeit with a different name for the tongue. Mm-yes.~"; 'wisdom': "~Oh, I'm full of it,~ says Ninario cheerfully."; 'hermes', 'trismegis', 'trimegist', 'teacher', 'wisdom': "~Hermes Trimegistus, or Trismegistus, was a figure largely of myth, who grew out of the god Hermes, though influenced by several other cultures along the way. Any scholar you ask will have a different opinion of whether he was a god, the grandson of a god, or a very early alchemist who adopted the name of Hermes to flatter himself. Mm-yes. All that aside, all these tales have one characteristic that they associate with him; he is presented as a teacher imparting wisdom to the common man.~"; 'water': "~There's a fountain full of it in the courtyard,~ says Ninario, waving his hand vaguely."; 'alchemy', 'alchemist', 'babble', 'pseudo-sc', 'pseudosci', 'lead', 'gold', 'transmuta': "~Alchemy is supposed to be a philosophy about the transmutation of elements, but mostly it's a horde of faded old alchemists trying to turn lead into gold,~ says Ninario. ~Pseudoscientific babble. Mm-yes indeed.~"; 'leporoman', 'entrails', 'depraved': "~Leporomancy is divination using... rabbit entrails,~ shudders Ninario. ~Barbaric!~"; 'tyromancy': "~Cheese for divination,~ chuckles Ninario. ~Have you ever heard anything more foolish?~"; 'oneiroman': "~That's divination through dreams,~ says Ninario. ~Not strictly science, of course.~"; 'necromanc': "~That one's a bit dangerous,~ says Ninario. ~I shy away from messing around with dead gits.~"; 'divining', 'divinatio', 'poppycock': "~Well, there are all kinds of methods of divination,~ shrugs Ninario. ~Most of them are pure poppycock, naturally.~ He stops and scowls. ~But of course, of all of them, the depraved art of leporomancy is the most evil.~"; 'basement': "~Down the staircase,~ mutters Ninario. ~Take a light with you.~"; 'kitchen': "~It's downstairs,~ murmurs Ninario, ~well-stocked with all the essentials of life. Well, as long as your only essential is butter. Mm-yes.~"; 'butter', 'margarine', 'margerine': "~I've got some butter in the kitchen,~ says Ninario. ~I never use margarine, myself. Mm-yes. No.~"; 'charcoal': "~It's a key ingredient in black powder. Usually black.~"; 'copper', 'sulphate', 'sulfate', 'cuso4': "~Copper sulphate is excellent for destroying fungus,~ says Ninario. ~Mm-yes. I used it to clear out the mushrooms I was growing behind the tower.~"; 'ammonium', 'NH42SO4': "~Ammonium sulphate is a decent fertiliser,~ says Ninario. ~Not as good as copper sulphate, but quite effective. Mm-yes.~"; 'garden', 'plot', 'earth', 'dirt': "~The garden plot?~ says Ninario. ~Well, it's barren now, but I used it for a time to farm mushrooms.~"; 'library', 'maids', 'maid', 'cleaning': "~I must thank you for cleaning the library the way you did, my dear student. You've certainly started things off on the right foot. I do hire maids from time to time, but they keep quitting rather abruptly.~"; 'quit', 'quitting', 'abrupt', 'abruptly': "~I think it's all the accidental sudden explosions that makes them quit,~ confides Ninario."; 'accidenta', 'accidents', 'sudden', 'explosion', 'blast', 'raw', 'annoy': "~Well, accidents will happen. Science and magic are tricky businesses. But when one blasts raw sewage back up the toilet while the maid is cleaning it, one is bound to annoy her. Mm-yes indeed.~"; 'fountain', 'marble', 'figurines': "~I don't want to talk about it,~ mutters Ninario. ~It was a gift.~"; 'shed': "~It's out in the courtyard somewhere,~ he says, waving a hand toward the south. ~It can't have wandered far.~"; 'house', 'building', 'castle', 'tower', 'safe', 'caer', 'wall': "Ninario shrugs. ~This tower has been a serviceable place to live over the years. It's also been very safe, mostly thanks to that wall around the whole caer. Mm-yes.~"; 'principles', 'vow', 'vowing', 'vowed', 'publicly', 'loudly', 'principle', 'principal', 'principals', 'compromise', 'compromising': "Ninario looks a bit sheepish. ~Mm-yes, well, ever since certain repeated failures to pass the Guild's entrance exam, I vowed, rather loudly and publicly, to never join. So even if I wanted to, I wouldn't, as a matter of principle.~"; 'entrance', 'examinati', 'failing', 'join', 'joining', 'requireme', 'managed', 'failed', 'exam', 'repeated', 'failures', 'failure': if (self.Nin_Topics2 & FLAG_x1 == FLAG_x1) "Ninario's face takes on a pained expression. ~Let's not discuss that again, please. Once was embarrassing enough. Mm-yes.~"; self.Nin_Topics2 = self.Nin_Topics2 | FLAG_x1; "Ninario looks a trifle embarrassed. ~Mm-yes, well, I took the Guild's entrance exam ten times. I always did very well on the technical parts, but failed the quest portion nine times. And the, erm, tenth time, I never even made it to the quest, as I, ahem, accidentally set fire to the instructor while she was explaining the nature of the quest. It was then I decided the Guild was all very well for some wizards, but not quite the thing for me. Mm-yes.~"; 'laborator', 'lab': "~South from the main hall,~ he says shortly, not looking up from his work."; 'theft', 'stealing', 'steal', 'thievery', 'ownership', 'subjectiv': "~", (ToFirstUpper)second, " is such a nasty word,~ mutters Ninario. ~And ownership is so subjective.~"; 'supplies', 'cupboard': print "~I know nothing about how the theft in question was committed,~ declares Ninario, sounding defiant. "; if (self.Nin_Topics2 & FLAG_x4 == FLAG_x4) print "~The young lady I mentioned was hired to handle"; else print "~A young lady I hired from the Thieves Guild handled all"; " such niggling details.~"; 'internshi', 'student', 'retrieval', 'scroll', 'thief', 'thieves', 'nimble', 'rival', 'young', 'lady': if (self.Nin_Topics2 & FLAG_x4 == FLAG_x4) print "~Well, as I mentioned"; else { self.Nin_Topics2 = self.Nin_Topics2 | FLAG_x4; print "Ninario waves a hand dismissively. ~Well"; } print_ret ", the university absolutely ", (i) "refused", " to give me a student of my own unless I joined the guild. So I hired a very nimble young lady from a rival guild... err, well, mm-yes, the Thieves Guild, to obtain the necessary scroll. After all, you can't expect me to compromise my principles and join the Wizards Guild. Mm-yes. No, indeed.~"; 'magic', 'science', 'spell', 'spells', 'scientifi', 'methods', 'research', 'work', 'job', 'component': if (self.Nin_Topics & FLAG_x16 == FLAG_x16) print "~Well, as I told you, that's"; else print "Ninario's eyes light up. ~Ah,"; self.Nin_Topics = self.Nin_Topics | FLAG_x16; " one of my favourite topics.~ He waves you towards the settee. ~Sit down and I'll tell you all about it.~^ ^He settles himself into his chair. ~Magic is, naturally, a fascinating field of study. Just look at the curious incident that brought you here from some other world. Mm-yes. Yet our common language would seem to indicate some connection between our realities. Perhaps ours is an older version of your world, or a parallel one with similar language and culture, but some divergent historical event. Magic is needed to bridge our two worlds, but there are some things it just cannot do.^ ^~For example, I can cast a spell to make an explosion of smoke, or a loud bang. Mm-yes. But I cannot cast a spell to take that explosion and direct it, say towards firing a cannon, or even propelling a cannonball. For that, I require science. Mm-yes. And let me tell you, my dear student, of late, I find myself resorting more and more to scientific methods to solve problems. Indeed, it is this area most of my recent research concentrates on, for I believe it to be the way of the future. Mm-yes. In fact,~ he coughs, ~I believe my pursuit of science is the primary reason for the Wizards Guild's animosity towards me. Well, that and the fact I have been known to cast the odd spell, despite not being a member of their Guild. Not that I haven't tried to join, mm-yes, no. However, I never managed to meet the entrance requirements.~ He coughs again."; 'mushrooms', 'mushroom', 'fungus', 'farming', 'farm': "Ninario cocks an eyebrow at you. ~Magic mushrooms, naturally.~"; 'parchment', 'glowing', 'strip', 'guild', 'wizard^s', 'wizard', 'wizards', 'persecuti': if (self.Nin_Topics & FLAG_x10 == FLAG_x10) { "~Ooh, don't get me started on that again,~ cries Ninario. ~I'll end up getting all annoyed and cranky.~ He mutters to himself for a few minutes, coming to terms with his anger."; } else { self.Nin_Topics = self.Nin_Topics | FLAG_x10; print "Ninario glares in the direction of the parchment and shakes his head. ~"; if (parchment hasnt general) print "You should have a look at it yourself. It's a monstrous piece of work. A sheer travesty of justice. "; else print "You've read the thing. It says it all. "; "Those are all the complaints the Wizards Guild have against me, all the charges they've leveled. They're all trumped-up, naturally. Five hundred and sixty-three counts of magicking without a licence... I mean, really! I can understand them wanting to make a point, but honestly, five hundred charges?^^ ~Mm-yes. Look at this here.~ He points to an entry. ~This is the most serious offence and all I did was cast a spell to make the bed. But what do they call it? Seditious breakdown of the class structure. Hah!~^^ He points to a couple of other items. ~And then look at these! Did you ever see anything so outrageous? I mean, Negligent and Dangerous Magicking causing Grievous Bodily Harm? I warned those bystanders they were in the way. Mm-yes. Fortunately that's a less serious charge, but still... that's the blasted Wizards Guild for you.~^^ Ninario falls silent, muttering to himself now and then about his unwarranted persecution at the hands of the Wizards Guild."; } 'plotkin', 'plotkins', 'money', 'cash', 'cash-flow': "~The plotkin is the unit of currency here in Thalion,~ says Ninario. ~I'd give you some to spend, just in case, but, well, mm-yes, there are some issues in the cash-flow situation at the moment. Specifically, no cash is flowing.~"; 'potassium', 'nitrate', 'kno3', 'saltpetre', 'saltpeter': "~It's a key ingredient in black powder. Usually white. I should have some somewhere.~"; 'sending', 'going', 'home', 'leaving': if (spectacles in self) { print "Ninario pushes his spectacles farther up his nose, and rolls up the sleeves of his robe. ~Very well,~ he declares, ~it's time to get down to business.~ He gropes around on the desk, strewing papers left and right, and finally pulls out a worn and faded scroll. ~Mm-~ he mutters, peering intently at the scroll with "; if (spectacles.clean == false || spectacles.dirty == true) { print "seeming great difficulty, ~yes, I ", (i) "think", " this is it. I can't be sure, of course, but it looks like it.~^"; } else { print "interest, ~yes. ~ He reads through it quickly, his lips moving as he says the words to himself. Then he nods. ~Mm-yes, I have it now.~^"; } print "^He begins chanting in a low sonorous voice, glancing at the scroll now and then. The chant builds from its low resonant beginnings to a high frenzied shriek as Ninario waves his arms and shouts with growing intensity. The power whips around, pulling and tugging at you from every direction. The fabric of reality splits apart, as the rift in the fragile continuum of this magical world widens.^"; if (spectacles.clean == false || spectacles.dirty == true) { deadflag = 1; print "^There is a final wrenching pull, and you are sent.^"; HitKey(); "^Darkness surrounds you, silence. You open your mouth to shout out to Ninario, but no sound emerges. You are having great difficulty breathing. You feel your lungs constricting slowly in your chest, your blood beginning to bubble out from your nose and mouth. Suddenly, you realise the darkness is not complete. Small pinpoints of light, like those of stars, surround you. As the cold hard vacuum of space engulfs you, you understand that somehow, Ninario's spell has gone totally and completely wrong."; } else { move self to Cell; give self ~general; self.Nin_Topics = 0; move Rusted_Key to Study; give parchment general; Achieved(6); HitKey(); print "^There is a final wrench of sound and two robed figures tumble from the tear.^ ^~Merciful magic!~ exclaims Ninario, blenching.^ ^The newcomers loom over Ninario, grim and menacing. One, a stern-looking fellow, waves his hand; the tear slows its gyrations, and stabilises.^ ^~It's the Wizards Guild,~ whispers Ninario, his face ashen. ~I never thought they'd go through with it.~^ ^The grim-looking wizard steps forward and places his hand on Ninario's shoulder. ~Ninario the so-called wizard, as head of the guild, I, Renaldo, hereby apprehend you in connection with all the prior charges against you, as well as the two latest.~ Renaldo waves at the strip of parchment on the wall and it glows briefly as two new lines are added.^ ^~Two charges?~ cries Ninario, peering at it. ~You can't charge me twice for the same offence. Mm-yes. No.~^ ^~First charge is for the first offence: theft of an Internship Student Retrieval Scroll,~ barks Renaldo. ~Second charge is for the attempted theft of a student using said spell. Fortunately, we detected your shoddy attempt to nab one of our students and deflected the spell.~ Renaldo glances witheringly at you. ~This "; print_ret (i) "article", ", I presume, was the result of your botched spell.~^ ^Ninario puts on a bold face. ~How dare you come here, and accuse me in the sanctity - mm-yes - of my, erm, campestral demesne. A wizard's caer is his own private kingdom. Don't think I don't know the real reason behind this. Mm-yes. It's not about a few miserable spells, it's about stifling any and all scientific...~^ ^~Enough!~ snarls Renaldo. ~Save it for your defence, Ninario. You're coming back to Guild Headquarters in Vechlee for execution and then trial. Come on, Virgil, help me grab him.~^ ^The two grab Ninario and leap into the portal, dragging him in after them, feet first. ~My dear student!~ cries Ninario, as his lower torso disappears into the rift. ~You must come and rescue me! As your summoner, I'm the only one who can repair the rift. We need each other! Mm-...~^ ^The last inevitable ", (i) "yes", " is cut off as the rest of Ninario is dragged bodily through the portal.^ ^As the portal snaps shut, something falls from it, and lands with a clanging sound on the floor."; } } else "~My dear student!~ exclaims Ninario. ~Nothing would please me more than to move events along, and get you sent home. Mm-yes, indeed. However, without my spectacles, I can't possibly cast the spell properly. I wonder where they've got to? I had them when I greeted the new student in the library...~"; 'staying', 'stay', 'rift', 'closing', 'portal': if (spectacles in self) { print "~Ah, so you'd like to stay here now, would you?~ asks Ninario. ~Certainly, if I can manage to close the rift, that's a possibility.~^^"; <>; } "~My dear student!~ exclaims Ninario. ~Nothing would please me more than to close the rift and let you stay. Mm-yes, indeed. However, without my spectacles, I can't possibly cast the proper spell to get the rift closed. I wonder where they've gone to? I had them when I greeted the new student in the library...~"; 'sulphur', 'sulfur': "~It's a key ingredient in black powder. Usually yellow.~"; 'methane', 'ch4': "~Methane gas is a well-known byproduct of, shall we say, natural waste. Mm-yes.~"; 'unblock', 'unblocking', 'detonate', 'explosives', 'incident': "~I usually just detonate the methane in the basement to unblock the sewer vat,~ shrugs Ninario. ~Cheap, painless.~ He frowns. ~Wreaks havoc on the piping, and of course you've got to make ", (i) "completely", " sure no one's using it; I don't think Renaldo's ", (i) "ever", " forgotten that particular day.~"; 'particular', 'apology', 'giggling', 'day', 'sky-high': "~He was blown sky-high,~ murmurs Ninario, a smile spreading across his features."; 'renaldo', 'contempti', 'sorcerer': "~That contemptible sorcerer has had it in for me ever since the incident with the toilet,~ says Ninario, shaking his head. ~If I'd been able to control my fits of giggling, he might have accepted my apology, too.~"; 'thalionic', 'antimagic', 'litter', 'campaign': "~A brilliant scheme, devised by Turthalion to cut down on unwanted objects,~ says Ninario. He frowns briefly. ~He refers to it as ", (i) "tidying up the object tree", " for some inexplicable reason.~"; 'turthalio', 'michael': "~Well, Turthalion really means ", (i) "master of Thalion", " in the old Elvish tongue, and Thalion itself means ", (i) "might", " or ", (i) "strength", ". Turthalion is a relatively new wizard, largely untested, but his work looks promising.~"; 'elvish', 'tongue', 'elves', 'sword', 'swords': "~It's odd,~ murmurs Ninario, ~how we've got old Elvish languages, old Elvish swords, but no elves, old or otherwise.~ He shrugs."; 'thalion', 'vechlee', 'blumph', 'here', 'land', 'country': if (self.Nin_Topics2 & FLAG_x2 == FLAG_x2) print "Ninario frowns. ~Well, as I already said, "; else { self.Nin_Topics2 = self.Nin_Topics2 | FLAG_x2; print "~Well, my young student,~ beams Ninario, ~"; } "Thalion is the peerless jewel of this continent, and the benevolent Turthalion its ruler.~ Ninario frowns. ~Of course, he's somewhat threatened by the power of the Wizards Guild, but, well, who isn't? Vechlee is our largest city, and headquarters of the Wizards Guild, whereas Turthalion rules from the smaller and somewhat nicer port of Blumph.~"; default: "~Mm-yes, indeed,~ murmurs Ninario. ~To explain all about that, I have to go back to many, many years ago. I was just a young boy then, and well, you know how young boys are.~ Ninario regales you at length with humourous anecdotes about his childhood, amusing you greatly, but largely leaving your question unanswered. ~So there you are,~ he concludes. ~That explains it.~ He falls silent, fond memories leaving him smiling."; } Show: if (location ~= Study) { if (noun ofclass Cheese) { "Ninario glances at ", (the) noun, " and shudders. ~Keep that away from me. I only eat Venezuelan beaver cheese.~"; } switch (noun) { Bearskin_Rug: "Ninario frowns. ~I seem to remember telling you that was ", (i) "my", " rug. If you weren't rescuing me, I'd be very put out about that.~"; Red_Carpet: self.Nin_Topics = self.Nin_Topics | FLAG_x3; print "~That might be exactly what we need to get out of here. I wonder "; if (location == Tower) "if we can launch it from here?~"; "where we can launch from?~"; default: "Ninario sighs. ~I'm very impressed that you managed to find ", (a) noun, " but I'd be much more interested in something that will help us escape.~"; } } if (spectacles in Ninario && (spectacles.clean == false || spectacles.dirty == true)) { "~I seem to be having great difficulty seeing what you have there,~ says Ninario, peering at you through the glasses."; } if (noun ofclass Purse && child(noun) ~= 0) { if (noun hasnt open) { give noun open; print "(opening ", (the) noun, " first)^"; } obj = child(noun); <>; } switch (noun) { magic_clothes: "~Lovely robes,~ says Ninario, ~though somewhat lacking in individual expression.~ He smoothes his own robes modestly."; Lab_Key: "~That's the key to my laboratory,~ says Ninario. ~I must have dropped it in the library.~"; Stone_Bottle: "~That's a highly concentrated paint stripper,~ says Ninario. ~Don't open it in the basement, whatever you do.~"; magnesium: if (self has general) "~Lovely magnesium flare,~ says Ninario, not seeming to pay much attention to you."; "~Lovely cylinder,~ mutters Ninario, not seeming to pay much attention to you. ~Now all you have to do is figure out how to activate it.~"; Hastener: <>; notebook: <>; Blackpowder: "~Mm-yes. Be careful. Students look funny after they've had bits blown off.~"; KNO3: give KNO3 general; "~Ah,~ says Ninario, ~saltpetre. I ", (i) "thought", " I only had a bit left.~"; NH42SO4: give NH42SO4 general; "~Those are ammonium sulphate crystals. Not really terribly useful, except as a fertiliser. They're left over from other experiments.~"; Sulphur: give Sulphur general; "~Is it yellow?~ asks Ninario without looking up. ~If it is, it's sulphur.~"; Charcoal: give Charcoal general; "~That looks like charcoal to me. Mm-yes,~ says Ninario."; CuSO4: give CuSO4 general; "~That's copper sulphate,~ says Ninario."; HCl: give HCl general; "~Sweet sainted spells!~ cries Ninario, shying away from the vial. ~Keep that muriatic acid away from me. It's highly corrosive.~"; Rasp_Satchel: if (self.Nin_Topics & FLAG_x12 == FLAG_x12) print "~Oh!~ says Ninario in surprise. ~You've found another one. Intrigued, he looks at the satchel. ~Mm-yes, most fascinating. Just like the other one you found, this "; else { give Rasp_Satchel general; self.Nin_Topics = self.Nin_Topics | FLAG_x12; print "Ninario, intrigued, looks at the satchel. ~Mm-yes. Most fascinating. It "; } "appears to be some form of magical storage device.~ He sniffs at it. ~It looks to me like a mundane object transformed magically into a container.~"; Chamberpot: if (self.Nin_Topics & FLAG_x13 == FLAG_x13) "Ninario sighs. ~Mm-yes. You have my chamberpot. I know that, you know that. You don't have to keep showing it to me as though it's the 'Apprentice of the Year' trophy.~ He glances at the chamberpot. ~Though, to tell the truth, it's much nicer than the usual trophy.~"; self.Nin_Topics = self.Nin_Topics | FLAG_x13; "~That's the chamberpot from under my bed!~ says Ninario in surprise. ~Really, you young people are so very odd. Do all apprentices run around picking up everything that isn't fixed in place?~"; spectacles: <>; Pillow: if (self.Nin_Topics & FLAG_x14 == FLAG_x14) "~Yes, you've already shown me that,~ says Ninario a bit sharply. ~If it's so fascinating to you, why don't you find a new use for it? It might make a good powder bag.~"; self.Nin_Topics = self.Nin_Topics | FLAG_x14; print "Ninario frowns. ~Hmmm... I have a pillow like that on my bed. "; if (Stuffing notin Pillow) "Of course, mine is filled with stuffing.~"; " In fact, it's almost identical.~ He peers at you suspiciously."; Newspaper: <>; default: print "~Do all apprentices go around picking up everything that isn't fixed in place? I'm very impressed that you managed to find ", (a) noun, " but "; if (spectacles in self) "run along now, I'm a very busy chap. Mm-yes indeed.~"; "I'd be much more impressed if you managed to find my spectacles.~"; } Give: if (location ~= Study) { switch(noun) { Butter, Margarine: remove noun; Ninario.buttered = true; "Ninario sighs. ~Oh very well. I hope there's a good reason for all this.~^ ^He takes ", (the) noun, " and smears it liberally over himself. ~There,~ he says when he's finished. ~Now I'm all slippery and pliable.~"; Red_Carpet: self.Nin_Topics = self.Nin_Topics | FLAG_x3; print "Ninario glances over the carpet. ~I wonder if we can use this to get out of here...~. He hands it back to you. "; if (location == Tower) "~I wonder if we can launch it from here?~"; "~We'll have to find somewhere to launch from.~"; Bearskin_Rug: "~The deed is done. You might as well hang onto the dratted thing now,~ mutters Ninario darkly."; default: "~Well that's very kind, but why don't you hang on to ", (ItorThem)noun, " for now. I seem to remember you had a very handy satchel, and the pockets in this robe are somewhat undersized.~"; } } if (spectacles in Ninario && (spectacles.clean == false || spectacles.dirty == true)) { "~I seem to be having great difficulty seeing what you have there,~ says Ninario, peering at you through the glasses."; } switch (noun) { notebook: print "Ninario glances through the exercise book"; if (self.Nin_Topics & FLAG_x15 == FLAG_x15) ". ~Mm-yes,~ he says, handing it back to you. ~This appears to be the same sleep-inducing exercise book you showed me earlier.~"; self.Nin_Topics = self.Nin_Topics | FLAG_x15; ", and shudders. ~Mm-yes, a most dangerous sleep-inducing agent.~ He hands it back to you."; spectacles: if ( self.Nin_Topics & FLAG_x8 ~= FLAG_x8 ) { self.Nin_Topics = self.Nin_Topics | FLAG_x8; Achieved(5); move spectacles to self; print "Ninario's eyes light up. ~Ah, yes! Those are the very things I need! However did you find them?~ "; } else { move spectacles to self; print "~Ah!~ cries Ninario. ~You've found my glasses again. I was sure you'd returned them, you know, but then I couldn't find them. And now here they are again.~ "; } print "He takes the glasses and places them on his nose. ~"; if (spectacles.clean == true && spectacles.dirty == false) print "Look at that!~ he exclaims. ~You've even cleaned the lenses. I can't remember when they've been so clear. "; print "Wonderful. Well, when you're ready, just come back and ask me to close that rift, and we'll see what we can do about it.~"; if (spectacles.clean == false || spectacles.dirty == true) " He turns back to his desk. ~What on earth does that say?~ he mutters, peering at a piece of paper."; new_line; rtrue; default: "~Well that's very kind, but I don't mind if you hold on to ", (ItorThem)noun, ". I probably have half-a-dozen tucked away in storage somewhere. Mm-yes indeed.~"; } Tell: if (second == 'red' or 'flying' or 'carpet') <>; if (location == Study) "~My dear student, I'm interested in what you have to say, but I'm a very busy chap. Mm-yes indeed.~"; "~We really must concentrate on escaping, my dear student.~"; ], orders [; if (location ~= Study) { if (Cell_Door has open && (self.Nin_Topics & FLAG_x1 ~= FLAG_x1)) <>; } Close,Lock: if (noun == Rift) { if (Ninario in Cell && Cell_Door hasnt open) "~Mm-yes,~ comes Ninario's muffled voice through the door. ~I think getting me out of here is a larger priority at the moment.~"; <>; } if (noun == Cell_Door) "Ninario glances at the wreckage of the door. ~I'm afraid that would prove rather difficult at the moment. Mm-yes.~"; if (noun == Study_Door) { if (Study_Door hasnt open) "Ninario's eyes flick briefly to the closed door and he shakes his head, turning back to his work."; "Ninario sighs. ~Might I suggest closing it yourself? And if you intend to persist with the ordering about, perhaps you might consider closing it with yourself on the other side?~"; } Enter: if (noun == Toilet_Hole) "Ninario glances at the small opening to the toilet distastefully. ~After you, I'm sure, my dear student. Mm-yes.~"; "~You lead, and I'll follow,~ says Ninario. ~Mm-yes.~"; Follow: if (location == Study) "~I'm afraid I'm simply too busy to tag along after you, my dear student. Mm-yes indeed.~"; if (Ninario in Cell && Cell_Door hasnt open) "~Of course I'll follow you, my dear student,~ comes Ninario's muffled voice through the door. ~Just get this door open!~"; StartDaemon(self); "~Of course I'll follow you, my dear student. I'm counting on you to lead us out of here.~"; Give: if (location ~= Study) "~I'm afraid nothing I have will assist in our escape.~"; if (noun == nothing) "~I can't quite figure out what you want, my dear student,~ frowns Ninario."; if (noun == spectacles) { if (spectacles in self) { if (spectacles.clean == true && spectacles.dirty == false) { "~Erm, well, I think I'll hang on to them. They're so nice and clean, I wouldn't want to risk them getting dirty again.~"; } else { move spectacles to player; "~Erm, oh. Well, all right, if you need them. Just don't drop them down the garderobe or anything foolish like that. I don't know what I'd do if they got into the sewer vat. I'd most likely never wear them again.~ Shuddering, Ninario removes the spectacles and hands them to you."; } } "~Mm-yes, well, if I knew where they were, I wouldn't need to find them.~"; } if (noun == HelpObj) { if (location ~= Study) "~Well, I'm ready and willing. Just tell me what you need me to do, mm-yes.~"; if (spectacles in self) "~Well, I'm certainly ready and willing. If you're ready for me to try to close the rift, please say so. Mm-yes.~"; "~I'd love to help you, but I've got to have my spectacles first. Now I wonder where they've got to?~"; } if (noun == player) "Ninario sighs. ~Very well, if it will make you happy, I give you yourself.~ He shakes his head. ~Mad, utterly mad.~"; if (noun == Bearskin_Rug) "~You're quite welcome to anything you find lying around, but the rug is my favourite. Great sentimental value.~"; if ((noun in location && noun has scenery or static) || (noun in Ninario)) "~You're quite welcome to anything you find lying around, but ", (the) noun, " ", (isorare) noun, " an integral part of my work.~"; "Ninario looks at you quizzically. ~You're the one who brought ", (itorthem)noun, " in here!~"; Go: if (Ninario in Cell && Cell_Door hasnt open) <>; if (location == Study) "~I'm perfectly content right where I am, thank you,~ says Ninario."; else if (location == First_Floor_Hall && noun == d_obj or e_obj && Ninario in location) "~It sounds a trifle dangerous down there,~ murmurs Ninario, peering down the stairs. ~Perhaps we'd best find another way.~"; else if (location == Cell && noun == d_obj) "Ninario glances at the small opening to the toilet distastefully. ~After you, I'm sure, my dear student. Mm-yes.~"; else "~Mm-yes, well, I'm afraid I'm still a trifle disoriented after that blast. You lead the way, and I'll follow.~"; Help: if (location ~= Study) "~Well, I'm ready and willing. Just tell me what you need me to do, mm-yes.~"; if (spectacles in self) "~Well, I'm certainly ready and willing. If you're ready for me to try to close the rift, please say so. Mm-yes.~"; "~I'd love to help you, but I've got to have my spectacles first. Now I wonder where they've got to?~"; HurryUp: if (location ~= Study) { if (Ninario in Cell && Cell_Door hasnt open) <>; "~Mm-yes, well, I'm moving as fast as I can,~ protests Ninario. ~You try moving around on a set of creaky five hundred year old pins.~"; } <>; LetIn: if (noun == player) "~You're already in!~ says Ninario."; Meet,MeetNPC: <>; Open,Unlock: if (Ninario in Cell && Cell_Door hasnt open) { if (noun == Rift) "~Mm-yes,~ says Ninario's voice. ~I heard that. Objection number one is that the rift is already open, which is the whole reason you're here. Objection number two is that I am currently locked behind this door!~"; } if (noun == Rift) "~My dear student, the rift has already been opened; that's the whole problem. Mm-yes indeed.~"; if (noun == Cell_Door) { "Ninario glances at the wreckage of the door. ~I think we've addressed the opening of the door problem adequately for the moment.~"; } if (noun == Study_Door) { if (Study_Door has open) "Ninario's eyes flick briefly to the open door and he shakes his head, turning back to his work."; if (self.Nin_Topics2 & FLAG_x3 == FLAG_x3) "~I've already demonstrated once how it opens. I'm sure you remember well enough that you can now handle it all by yourself.~ Ninario shakes his head in exasperation."; self.Nin_Topics2 = self.Nin_Topics2 | FLAG_x3; give Study_Door open; "Ninario sighs, gets up, stomps over to the door and opens it. ~Perhaps this will prompt you to step through it and stop pestering me with these demands,~ he says somewhat icily. He returns to his desk, muttering to himself about students who can't seem to do anything for themselves."; } Rub: if (Ninario in Cell && Cell_Door hasnt open) "~Whatever it is you're asking me to clean, cleanliness of sundry articles is not the most pressing dilemma facing us at the moment,~ advises Ninario through the closed door. ~I know I'm being executed this afternoon, but I'd really rather not show up at all than show up all squeaky clean. We'd best concentrate on getting this door open!~"; if (noun == spectacles) { if (spectacles notin Ninario) "~Mm-yes, well, to do that, I'd need to know where they where.~"; if (spectacles.clean == false || spectacles.dirty == true) { Achieved(4); spectacles.clean = true; spectacles.dirty = false; "Ninario removes the spectacles and peers at them. ~Mm-yes, my goodness. They're certainly very dirty. What on earth did you do to them?~ He cleans them diligently on a corner of his robe, and then puts them back on his nose."; } "Ninario removes the spectacles and peers at them. ~Mm-yes, well they look pretty clean already.~ He replaces them on his nose."; } else "~I don't have time for a lot of cleaning right now. Why not clean ", (the) noun, " yourself? Mm-yes.~"; SendHome: if (noun == player) <>; StayHere: if (noun == player) <>; Take: if (noun == player) <>; Tie: if (noun == Rift) <>; if (noun == Staircase) <>; "~I don't have time to run around fixing everything. I'll attend to it later.~"; Wear: if (noun == Butter or Margarine) <>; default: if (Ninario in Cell && Cell_Door hasnt open) "~Mm-yes,~ murmurs Ninario through the closed door. ~I can't hear you very well, so tell you what. Get this door open, and we'll see about doing whatever it is you want, all right?~"; "Ninario shakes his head. ~If I did everything everybody wanted of me, I'd never have a moment to myself.~"; ], has animate male proper transparent; Object -> parchment "glowing strip of parchment" with name 'glowing' 'strip' 'of' 'parchment' 'notice' 'message' 'piece' 'sign' 'text' 'lines' 'densely-s' 'spaced' 'densely' 'hundreds', parse_name ParseNameOf, description "The long glowing strip of parchment is composed of hundreds of lines of densely spaced text.", before [; Read,Search: print "The first few lines read ", (i) "Case for the Wizards Guild versus Ninario, styling himself 'wizard'. Pending charges:", "^^The parchment continues, listing hundreds of items such as ", (i) "Magicking without a Guild Membership, Involuntary Magical Manslaughter", " and various other bizarre offences.^"; if (self has general) { print "^There are two very recent entries near the bottom. The first reads ", (i) "Theft of Wizardic Instruments, Incantations or Personnel,", " and the second is almost identical. It reads ", (i) "Attempted Theft of Wizardic Instruments, Incantations or Personnel.^"; } rtrue; Take: "Well, you thought it was an odd thing for Ninario to display proudly and now you understand. The Guild appear to have magically affixed the parchment to the wall."; ], has scenery readable; Prop -> chair "chair" with name 'ninario^s' 'nin^s' 'ninny^s' 'chair', description "It's a perfectly ordinary wooden desk chair.", DeadWood true, before [; Examine: rfalse; default: "Just leave Ninario's chair alone."; ]; Furniture -> desk "desk" with name 'ninario^s' 'ninny^s' 'desk', description "The desk is a sturdy utilitarian affair. In line with much of the rest of Ninario's life, it is a mess.", DeadWood true, describe [; if (child(self) == papers) rtrue; new_line; <>; ], before [; Receive: if (Ninario in Study) { if (noun == spectacles) <>; "~Ahem!~ coughs Ninario, removing ", (the) noun, " from his desk. ~This is Ninario's area. Students can find their own area for making a mess.~ He hands ", (itorthem) noun, " back to you."; } rfalse; Rub: "Ninario's filing system may look chaotic, but at least he knows where everything is. Just leave it that way."; Search: print "Resting on the messy desk"; WriteListFrom(child(self),ENGLISH_BIT + ISARE_BIT); print_ret (string) period; ]; Object -> -> papers "papers, quills and blank scrolls" with name 'papers' 'quills' 'books' 'blank' 'scrolls' 'mess' 'mouldy' 'moldy' 'old' 'various', article "some", description "The books, quills, papers and scrolls are strewn all over the desk.", before [; Rub: <>; Search: <>; Take,Remove,LetGo,Transfer: "It's such a mess you can't tell which papers are useful and which aren't."; ], has pluralname scenery; Study_Window -> E_Study_Window "eastern window" with name 'eastern' 'east' 'e//', before [; Search: "A large plot of tilled earth lies below this window, as though there was a garden at one time, but it is now barren and lifeless. A huge stone wall runs along the east side of the courtyard, but from here, it's hard to tell how far it extends."; ], after [; Open: "You lift the latch and push open the eastern window. A cool westerly breeze flows into the room. The papers on the desk flutter."; ], has scenery ~open openable; Study_Window -> S_Study_Window "southern window" with name 'southern' 'south' 's//', before [; Search: "You look out over the southern part of the courtyard. A pebbled walk extends south to the door of a small wooden shed. Beyond the shed, a huge stone wall runs along the south side of the courtyard, but from here, it's hard to tell how far it extends."; ], after [; Open: "You lift the latch and push open the southern window."; ], has scenery ~open openable; Room U_North_Hall "North Hallway" with description [; print "A small narrow window on the northern wall admits bright warm sunlight into this end of the hall. A bedroom lies "; if (Bedroom_Door has open) print "through the open"; else print "beyond the closed"; print " door to the west. East is a"; if (Toilet_Door has open) print "n open"; else print " closed"; " solid stone door. The stairs are to the south."; ], compass_look [obj; if (obj == n_obj) <>; if (obj == e_obj) <>; if (obj == w_obj) <>; if (obj == s_obj) "The hallway extends south to a set of stairs."; TouchWalls(obj, self.Floor, self.Walls); rtrue; ], cant_go "You can head through the stone door to the east, the wooden door to the west, or go back south to the stairs.", n_to [; <>; ], s_to [; print "You head south down the hallway.^"; return Stairwell; ], e_to Toilet_Door, w_to Bedroom_Door; Autodoor Toilet_Door "solid stone door" with name 'solid' 'stone' 'door', description [; print "The solid stone door "; if (self in Toilet) print "leads back to the hallway. It "; if (self in U_North_Hall && self has open) " is open, revealing the garderobe to the east."; if (self has open) "is open."; "is closed."; ], found_in Toilet U_North_Hall, door_dir [; if (self in U_North_Hall) return e_to; return w_to; ], door_to [; if (self in U_North_Hall) return Toilet; return U_North_Hall; ], has scenery door ~open openable; Autodoor Bedroom_Door "wooden door" with name 'wooden' 'bedroom' 'door', description [; print "This "; if (self has open) print "open"; else print "closed"; print " wooden door leads "; if (self in U_North_Hall) "to Ninario's bedroom."; if (self in Bedroom) "back to the hallway."; ], DeadWood true, found_in Bedroom U_North_Hall, door_dir [; if (self in U_North_Hall) return w_to; return e_to; ], door_to [; if (self in U_North_Hall) return Bedroom; return U_North_Hall; ], has scenery door open openable; Room Bedroom "Bedroom" with description [; if (self hasnt visited) { Ninario.Nin_Topics = Ninario.Nin_Topics &~ FLAG_x9; } print "Thick carpeting covers the floor of Ninario's extravagantly decorated bedroom. Spacious windows in the north and west walls admit generous amounts of light. The door back to the hallway lies to the east.^"; if (N_Bed_Window has general && W_Bed_Window has general) print "^Both windows have been smashed by some vandal who finds that sort of thing amusing.^"; else if (N_Bed_Window has general) print "^The northern window has been smashed by some vandal who evidently finds that sort of thing amusing.^"; else if (W_Bed_Window has general) print "^The western window has been smashed by some vandal who evidently finds that sort of thing amusing.^"; "^A large chest full of linen sits open against the south wall.^ ^A large, old-fashioned canopied four-poster bed also lies here, complete with frilly lace pillows, spotless white silk sheets, and a tastefully elegant lace skirting, reaching from the mattress all the way down to the floor."; ], compass_look [obj; if (obj == w_obj) <>; if (obj == n_obj) <>; if (obj == e_obj) <>; TouchWalls(obj, self.Floor, self.Walls); rtrue; ], before [; Exit: if (player in location) <>; rfalse; ], Floor THICK_CARPET, cant_go "The way out is the door to the east, unless you'd like to try the windows.", e_to Bedroom_Door, n_to [; <>; ], w_to [; <>; ]; Bed_Window -> N_Bed_Window "northern window" with name 'northern' 'north' 'n//', after [; Open: "You push the northern window up and breathe in the sweet fresh air deeply."; Close: "You shove the window down, closing it."; ], has scenery ~open openable; Bed_Window -> W_Bed_Window "western window" with name 'western' 'west' 'w//', after [; Open: "You push the western window up and lean out for a few moments, gazing out at the courtyard below."; Close: "You shove the window down, closing it."; ], has scenery ~open openable; Prop -> Chest "chest" with name 'chest' 'box' 'wooden', description "The plain wooden chest is full of linen.", DeadWood true, before [; Close: "The chest is so full of linen that it won't close properly."; Examine: rfalse; Lick,Taste: "Pleasantly woody."; LetGo: "You're fairly certain you don't have any pressing need for piles of linen."; Receive: "The chest is already full of linen."; Open: "The chest is already open."; Search: <>; Take,LetGo,Transfer,Push,PushDir,Pull: "You don't want to lug around a chest of someone else's linen, not until you get your laundry business up and running anyway."; default: "Just leave ", (the) self, " alone."; ], has container open; Prop -> -> Linen "linen" with name 'frilly' 'white' 'linen', article "some", description "It's just more frilly white linen.", before [; Examine: rfalse; Lick,Taste: "It's a little dry for your taste."; LookUnder,ReachUnder,Search: <>; Receive: "Don't go putting things into the linen."; Take,Remove,Transfer,Push,PushDir,Pull: "You're fairly certain you don't have any pressing need for piles of linen."; default: "Just leave ", (the) self, " alone."; ]; Prop -> Bed_Props with parse_name [i; while (true) { switch(NextWord()) { 'pillows': self.item_num = 1; i++; 'bedsheet', 'bedclothe', 'sheet', 'sheets', 'spotless', 'silk': self.item_num = 2; i++; 'mattress': self.item_num = 3; i++; 'frilly', 'lace', 'white': i++; default: return i; } } ], short_name [; switch(self.item_num) { 1: print "frilly lace pillows"; 2: print "sheets"; 3: print "mattress"; } rtrue; ], description [; switch(self.item_num) { 1: "Frilly lace pillows line the bed."; 2: "The sheets are white silk and spotless."; 3: "The mattress feels soft and comfortable."; } ], item_num 1, FakeObj, before [; Enter: <>; Examine: rfalse; Lick,Taste: "You must really like frilly white lace."; Lift,LookUnder,ReachUnder,Search: <>; Receive: "Placing things on ", (the) self, " isn't necessary."; Take,Pull,Push,PushDir,Transfer: <>; Tie: if (self.item_num == 2) "Planning an escape route through the windows is all very well, but the tower has a perfectly serviceable entrance on the ground floor."; Touch: if (self.item_num == 2) "The sheets are cool and silky to the touch."; "So soft and comfortable!"; default: "Perhaps you should just leave ", (the) self, " alone."; ]; Prop -> Skirting "skirting" with name 'tastefull' 'elegant' 'tasteful' 'frilly' 'white' 'fringe' 'lace' 'skirting', description "The white frilly fringe of skirting runs all around the bed, and hangs from the mattress down to the floor.", before [; Examine: rfalse; Lick,Taste: "You must really like frilly white lace."; Lift,LookUnder,Pull,Push,ReachUnder,Search: <>; Receive: "Don't go shoving things under the skirting."; Take,Remove,Transfer,PushDir: "You tug and shove at the skirting, but it's pretty firmly tucked in place."; default: "Just leave ", (the) self, " alone."; ]; Furniture -> Carpet "carpet" with name 'thick' 'carpet', before [; Examine,Touch: <>; ], has scenery; Object -> Bed "large canopied bed" with name 'large' 'old-fashi' 'four-post' 'four' 'poster' 'ultra-mod' 'fourposte' 'canopy' 'canopied' 'bed', description "A large, old-fashioned canopied four-poster bed. Well, it's old-fashioned where you come from. It could be the height of modern furnishings in this world. It has a white frilly fringe of skirting all around it, reaching from the mattress to the floor.", describe [; if (child(self) == 0) rtrue; print "^Arrayed beautifully on the bed"; WriteListFrom(child(self), ENGLISH_BIT + ISARE_BIT); print_ret (string) period; ], before [; Enter,SitDown: "You lie down on the bed for a short time, but you aren't tired, so you get back up."; Lick,Taste: Chest.item_num = 3; <>; LookUnder: if (Chamberpot.under_bed == true) { Chamberpot.under_bed = false; give Chamberpot ~concealed; print "You lift up the skirting on the bed, apprehension gnawing at you. Surely there wouldn't be... yes, of course. Why do people always leave things under their bed? You shake your head in despair. Well, at least it makes sense for an elderly fellow like Ninario to have a small ceramic chamberpot under his bed.^^"; <>; } ReachUnder: <>; Search: print "You search all around the bed"; if (child(self) == 0 && Chamberpot.under_bed == false) ", but don't find anything of interest."; if (child(self) ~= 0) { print ". Apart from "; WriteListFrom(child(self), ENGLISH_BIT + DEFART_BIT); print " on the bed, you "; } if (Chamberpot.under_bed == true) { if (child(self) ~= 0) print "find a small ceramic chamberpot"; else print ", and manage to find a small ceramic chamberpot"; print " hidden under the skirting. Why do people always leave things under their bed? You shake your head in despair. Well, at least a chamberpot is a reasonable item to find under an elderly fellow's bed.^^"; Chamberpot.under_bed = false; give Chamberpot ~concealed; <>; } else "don't find anything of interest."; Smell: "You lean over the bed and breathe in deeply. Mmm! The sweet intoxicating perfume of lilacs."; Take,Pull,Push,PushDir: "The bed is so beautifully made, you don't want to disturb it."; ], has static supporter; Object -> -> Pillow "frilly lace pillow" with name 'frilly' 'lace' 'white' 'pillow' 'slit' 'fabric', description [; if (self in Hermit) "The pillow cushions the hermit's backside as he sits on the rock."; print "The pillow has a long slit along one end, where the frilly lace has pulled away, ripping the fabric."; if (child(self)) { if (child(self) ~= Stuffing || self has general) { print " "; <>; } } new_line; rtrue; ], capacity 1, before [; Empty: if (child(self) == Stuffing) <>; rfalse; Receive: if (noun ~= Blackpowder && ~(noun ofclass Substance)) "You're pretty certain putting ", (the) noun, " into the frilly lace pillow won't help your situation."; Search: if (child(self) == Stuffing) { give self general; "Unsurprisingly for a frilly and fluffy lace pillow, it is full of stuffing."; } if (child(self) == 0) "The pillow is empty."; "There is ", (a) child(self), " stuffed inside it."; ], after [; Receive: "You pour the ", (the) noun, " carefully into the pillow, being careful not to spill any."; Take: if (self hasnt moved) print "You pick up the frilly lace pillow, a little reluctant to disturb the perfection of the bed, but really, it's got more feng-shui without it.^"; if (action_to_be ~= ##Eat) rtrue; rfalse; ], invent [; ! When listing objects in player's inventory if (c_style & FULLINV_BIT) { if (child(self)) { print "a pillow containing ", (a) child(self); } else print "a frilly lace pillow"; rtrue; } ! When listing objects in room description if (inventory_stage == 1) if (child(self)) { print "a pillow containing ", (a) child(self); } else print "a frilly lace pillow"; rtrue; ], has container open; Object -> -> -> Stuffing "stuffing" with pname 'stuffing' 'feathers' 'feather', article "some", description "The pillow stuffing is made up of hundreds of tiny feathers.", before [; Take,Remove,LetGo,Transfer: remove self; move feathers to location; print "As you pull the stuffing out of the pillow, it separates into its component feathers, which drift slowly down to the "; if (location.Walls == OUTSIDE) print "ground."; else print "floor."; if (location == Study && Ninario in Study) " ~Caustic conjurations!~ exclaims Ninario as the stuffing rains down around the room. ~What do you think you're doing?~"; if (location == Middle_Tree or Top_Tree) move feathers to End_Lane; new_line; rtrue; ]; Jug -> Chamberpot "chamberpot" with name 'chamberpo' 'chamber' 'pot' 'potty' 'ceramic' 'rabbit' 'motif' 'rabbit-mo' 'handiwork', maximum 3, under_bed true, description [; print "A beautifully decorated ceramic chamberpot, in rabbit motif, capable of holding 3 pints of water. It is currently"; switch (self.current) { 0: " empty."; 1: " one-third full."; 2: " two-thirds full."; 3: " full to the brim."; } ], after [; Take: if (self hasnt moved) "You pick up the small chamberpot, admiring its beautiful rabbit-motifed handiwork. Last year's ", (i) "History of the Chamberpot", " course enables you to confidently classify it as an early Renaissance 3-pinter. Fortunately, it seems to have been cleaned thoroughly since its last use, as you can't resist hanging on to such a fine piece."; Wear: if (Bearskin_Rug has worn) "You slip the chamberpot on under the rug, feeling a trifle silly."; else print "You place the chamberpot on your head, feeling a trifle silly.^"; if (Ninario in location) "^Ninario stares at you in amazement. ~Words fail me,~ he says, gazing at the pot."; if (Shopkeeper in location) "^", (The) Shopkeeper, " watches in amazement. ~Are you wearing what I think you're wearing on your head, luv?~, she asks, gazing at the pot. Her eyes narrow suspiciously. ~You're not one of them ", (i) "Plumbers Union", " types, are you?~"; if (Crone in location) "^", (The) Crone, " cackles loudly. ~Does Ninario know what you're doing with his chamberpot?~"; if (Hermit in location) "^", (The) Hermit, " gazes at you. ~I heard you university types did a lot of pot, but I never believed it until now,~ he mutters."; rtrue; ], before [; if (self.under_bed == true && action ~= ##Take) { "You can't see any such thing."; } Take: if (self.under_bed == true) <>; ThrowAt: if (second has animate) "That wouldn't be very nice at all."; remove self; "You hurl ", (the) noun, " at ", (the) second, ", just missing it. The chamberpot, unused to such violence, smashes on impact."; Use: "You may be a student, and you may not be the most fastidious person in the world, but you draw the line at using chamberpots, especially someone else's."; Wear: if (Helmet has worn) "But you've already got the helmet on your head!"; if (self.current > 0) { "Just before placing the chamberpot on your head, you remember that it is full of water, and decide against it."; } ], has concealed clothing; Object feathers "tiny feathers" with name 'hundreds' 'of' 'tiny' 'feather' 'feathers' 'stuffing', parse_name ParseNameOf, article "hundreds of", description "These hundreds of tiny feathers are all that remain of the stuffing from the pillow.", initial [; print "There are hundreds of tiny feathers strewn all over the "; if (location == Tower_Roof or Tower) "top of the tower."; if (location ofclass Outroom) "ground."; "floor."; ], before [; Examine: rfalse; default: if (Ninario in location) { if (N_Bed_Window has general || W_Bed_Window has general) "~Just leave them there,~ sighs Ninario. ~I'll do a general tower-cleaning when I get around to cleaning up the mess you made smashing the windows.~"; "~Just leave them there,~ sighs Ninario. ~You seem to have a penchant for messes. I'll clean up later.~"; } if (location ofclass Outroom) print "The hundreds of feathers are strewn all over the ground."; else print "The hundreds of feathers are strewn all around the room."; if (location == Study or U_South_Hall or or U_North_Hall or Library or Stairwell or Main_Hall or Kitchen or Laboratory or Workshop or Gatehouse) print " Ninario's magic cleaning spells will take care of them."; else print " Picking them all up would be far too time-consuming. Besides, they're biodegradable."; new_line; rtrue; ], has pluralname; Room Toilet "Garderobe" with description "The peak of ancient plumbing technology, the garderobe is a fairly simple affair: a short stone bench jutting out from the wall with the usual-sized hole roughly in the middle of it, and a rack for reading material attached to the wall. The only odd thing is the lack of any toilet paper. Perhaps it's all accomplished magically. A small narrow window on the northern wall admits some light into this room.", Floor COLD_STONE, Walls COLD_STONE, compass_look [obj; if (obj == d_obj) <>; if (obj == n_obj) <>; if (obj == w_obj) <>; TouchWalls(obj, self.Floor, self.Walls); rtrue; ], before [; Exit: if (player in location) <>; rfalse; ], cant_go "The hallway is back to the west.", w_to Toilet_Door, n_to [; <>; ], d_to "The garderobe transports anything dropped into it to the sewage vat. You might not want to do that."; Object -> Toilet_Rack "wire rack" with name 'wire' 'reading' 'rack', description "The wire rack has room for one or two selections of reading material.", capacity 2, describe [; if (child(self) == 0) rtrue; print "^The rack contains choice reading material for those occasionally necessary long visits to the toilet. At the moment, it contains "; WriteListFrom(child(self), ENGLISH_BIT); print_ret (string) period; ], before [; Receive: if (noun == Cannonball or Branch or Watering_Can or Chamberpot or EW_Dish or Ceramic_Bowl or Scrying_Bowl or Flask or Bearskin_Rug or Red_Carpet or Helmet) print_ret (The) self, " won't accommodate ", (the) noun, " easily without some major modifications."; ], has static container open; Object -> -> Newspaper "copy of Wizarding Weekly" with name 'copy' 'of' 'wizarding' 'weekly' 'newspaper' 'paper' 'rag' 'mag' 'magazine', parse_name ParseNameOf, description "Wizarding Weekly, a collection of the latest news, gossip and innuendo in the field of magic.", art_number 0, before [; Read,Search: if (self notin player) { print "(taking ", (the) self, " first)^"; ; } self.art_number++; if (self.art_number == 1) print "(reading the first article)^"; else { if (self.art_number > 7) { print "(flipping back to the first article)^"; self.art_number = 1; } else print "(reading the next article)^"; } switch(self.art_number) { 1: "^ *** THEFT SHOCKS HALLOWED HALLS ***^ ^Staff and students at Oxbridge University learned last week that even their hallowed halls are not safe from seditious burglary. In an embarrassing incident for campus security, thieves broke into the Supplies Cupboard in broad daylight, and purloined an Internship Student Retrieval scroll. The Wizards Guild is investigating."; 2: "^ *** RENEGADE WIZARD TOPS 500 CHARGES ***^ ^Court documents filed today by the Wizards Guild indicate that renegade wizard Ninario now tops the list of illegal spellusers, with some 581 spells cast, all without guild sanction. Guild members are worried Ninario's conduct may undermine guild authority in these trying times, especially in light of the recent Plumbers Union resurgence. ~Ninario is precisely the kind of amateur, unprofessional bungler who gives legitimate wizards a bad name,~ said Renaldo, head of the Wizards Guild. ~He thinks he can run around casting spells, totally guild-free. Well, his spellcasting days are numbered.~ Renaldo refused to clarify, stating only that ~the wheels are in motion.~"; 3: "^ *** PLUMBERS UNION RESURFACES ***^ ^Recent bulletins from our reporters in rural areas indicate the ancient Plumbers Union is actively recruiting members once again. The infamous banned order is reportedly holding mysterious rituals and advocating strange-sounding practices, such as ~double-billing on weekends~, and the dangerous and unsanitary use of non-magic toilets. A spokescaster for the Wizards Guild says the uprising should be flushed out before too long."; 4: "^ *** CHEESE BLATANTLY MENTIONED ***^ ^In what is becoming an alarming tradition, cheese was blatantly mentioned at the Vechlee Victuallers Meeting yesterday, when local cheesewright Eliza Stilton stood up and expounded on the relative merits of block versus truckles. After this surprising outburst, Stilton then discussed the subtle differences between Cheshire and Roquefort. She then finished up with a scathing attack on Caerphilly, and its completely unsuitable tyromantic capabilities. Local villagers are still in shock. ~I think it's awful,~ said one, who requested anonymity. ~Stilton shouldn't have said the things she did about Caerphilly. She's the cheesewright here in Vechlee, a trusted woman on the subject, and she's in a position to do a lot of hurt to a lot of innocent cheeses.~"; 5: "^ *** COMPANY RECALLS REFURBISHED CANNON ***^ ^Mortar Remains, suppliers of refurbished cannonry, announced today they are recalling their self-sparking BrutalMaimer(tm) models from customers. A company spokesperson cited safety concerns. ~These cannon are meant for military use only, and should never have been refurbished and resold to the general public. They are extremely susceptible to sparking when gunpowder is loaded into the barrel, and the general public are unschooled in the proper use of the required powder bags. In addition, the large-bore calibre means there is a danger of large objects, such as dogs, cats, children, apprentices and other pets falling into the mouth of the cannon and being launched, accidentally or otherwise.~ The company vehemently denied reports that pressure from the Wizards Guild was behind the recall."; 6: "^ *** PERSONALS ***^ ^Young-at-heart wizard, lonely, seeks witch of a woman for companionship, maybe more. Contact ", (i) "Magic Bunny", " via crystal ball network if interested. Please, no scrying after midnight!"; 7: "^ *** PERSONALS ***^ ^Emily: please come back. Forgive me. I promise to allow the cheese to be part of our life. ^ -- Renaldo"; } ], has readable; Prop Toilet_Hole "hole" with pname 'toilet' 'hole' 'opening' 'bench' 'garderobe' 'washroom' 'lavatory' 'can' 'crapper' 'bog' 'john' 'facilitie' 'lavvy' 'head' 'bathroom' 'outhouse' 'thunderpo' 'commode' 'gents' 'ladies' 'netty' 'privy' 'wc' 'water-clo' '.p' 'water' 'closet', description "The opening is a circular hole leading into inky blackness.", found_in Toilet Cell, pour false, before [ ; Enter: if (verb_word == 'sit') <>; else <>; Receive: if (noun == Stone_Bottle) { if (noun has general && self in Toilet) "You've already done this once before. The sewer vat doesn't need to be cleared out again already."; if (noun hasnt open) move noun to Sewer_Vat; else { move Stone_Bottle to Will_Woodcraft; Stone_Bottle.sealed = true; move Wiz_Label to Stone_Bottle; give Stone_Bottle general ~moved ~open; Sewer_Vat.clean = true; } StartTimer(Stone_Bottle, 1); print "You "; if (self.pour == true) print "pour the contents of "; else print "drop "; print (the) noun, " into the hole. There is a quick magical whoosh, and the hole is empty once again.^"; if (self.pour == true) { print "^The bottle itself vanishes, a handy consequence of the Thalionic Antimagic Litter Campaign.^"; self.pour = false; } rtrue; } if (noun == spectacles) spectacles.dirty = true; if (self in Cell) { if (noun == Margarine or Butter) { remove noun; Ninario.buttered = true; print "You spread ", (the) noun, " liberally all around the rim of the toilet.^"; if (Ninario in location) print "^~Very clever,~ murmurs Ninario. ~I must remember that next time the toilet gets blocked up.~"; } move noun to Outside_Vechlee; print "You drop ", (the) noun, " into the hole. It vanishes down the pipe, and the hole is empty once again.^"; if (Ninario in location) print "^~How primitive!~ sniffs Ninario. ~The Wizards Guild don't even have a magical garderobe.~^"; } else { move noun to Sewer_Vat; print "You drop ", (the) noun, " into the hole. There is a quick magical whoosh, and the hole is empty once again.^"; } rtrue; Search: "The opening is a circular hole leading into inky blackness."; Smell: "It's not the freshest of odours."; Use: if (Ninario in location) "You're a casual, easygoing sort of person, but you still don't use the toilet with the door open and people in the room."; if ((self in Toilet && Toilet_Door has open) || (self in Cell && Cell_Door has open)) "You're a casual, easygoing sort of person, but you still don't use the toilet with the door open."; "You settle down on the toilet for a short time, but nothing much happens. You don't need to go, so you stand back up, fastening everything back up as you do so. Why do new and exciting experiences always affect you the same way?"; ], has container open; Outroom Tower_Roof "Tower" with description [; if (location hasnt visited) give TowerMenu ~concealed; "Sun beats down from high overhead, warming the flagstones of the tower. A commanding and breathtaking view of the fields and pastures surrounding the caer greets you in every direction. In addition, there is a good view of the courtyard below, with its beautiful alabaster fountain. You also see the portcullis and catch a glimpse of the double wooden doors beyond it. The stairs in the centre of the tower lead back down to the first floor."; ], Floor ROUGH_STONE, Walls ROUGH_STONE, compass_look [obj; if (obj == e_obj or se_obj or s_obj or ne_obj or nw_obj) "Pastures and fields extend away to the ", (name)obj, " as far as the eye can see."; if (obj == w_obj) "Looking west, you can see a dry dusty road just outside the caer, running northeast and southwest."; if (obj == n_obj) "Looking north from here, you can just make out a small farmstead buried amidst the rolling fields and pastures."; if (obj == sw_obj) "Looking southwest from here, you can see the clustered buildings and spires of a small town or fortress on the horizon."; if (obj == u_obj) <>; "You don't see anything interesting in that direction, other than what's already been mentioned."; ], before [; Exit: if (player in location) <>; if (player in Cannon) { move player to location; "You tug and strain and pull yourself out of the cannon."; } rfalse; ], after [; Exit: if (Pillow in Cannon) give Pillow ~concealed; ], Carpet_Go [; PlayerTo(Dusty_Road); rfalse; ], cant_go "If you do that, you'll tumble over the edge.", u_to "If you leap into the air like that, you'll tumble over the edge.", d_to [; if (Cord in player) { move Cord to Tower_Roof; print "(dropping the end of the cord first)^"; } print "You clatter down to the first floor, the rickety stairs shaking and groaning in protest.^"; return Stairwell; ]; Object -> Cannon "cannon" with name 'cannon' 'gun' 'brutal' 'maimer' 'brutalmai' 'carronade' 'massive' 'swivel' 'base' 'artillery' '10-pounde' 'pounder' 'barrel' 'bore' 'breech' 'muzzle' 'loader' 'trunnions' 'trunnion' 'framing', aimed_at n_obj, add_to_scope Portcullis Caer_Door Fountain Dirt_Obj Caerwall_Obj, capacity 2, Blackpowder_in_Bag false, tried false, initial [; if (self hasnt general) { give self general; "A massive cannon sits here, resting on a huge swivel base."; } print "A cannon sits here, aimed "; if (self.aimed_at ofclass CompassDirection) "to ", (the)self.aimed_at, ", out over the caer wall."; "at ", (the) self.aimed_at, (string) period; ], description [; print "The cannon is large and menacing. It looks a very powerful model, with a bore some ten inches in diameter. There is a small plaque affixed to the side of the barrel and a pull cord hangs from the breech end. Heavy trunnions and framing support the cannon, mounting it securely to a large and weighty swivel base. The base rotates, allowing the cannon to be aimed at different targets.^"; print "^The cannon currently points "; if (self.aimed_at ofclass CompassDirection) "to ", (the)self.aimed_at, ", out over the caer wall."; "at ", (the) self.aimed_at, (string) period; ], before [; AimAt: if (second == nothing) { if (noun == self) "You can't aim ", (the) self, " at itself."; <>; } if (second == self) "You can't aim ", (the)second, " at itself."; if (player in self) "You'll have to get out of ", (the)self, " first."; if (second == self.aimed_at) "But ", (the)self, " is already pointed to ", (the) second, "!"; if (second == d_obj) <>; if (second == u_obj or Sky) print_ret (The) self, " can't tilt back far enough to point straight up."; if (second == Targets) "You'll have to specify which target you want to aim at."; print "You grasp ", (the) self, " and pull and tug until it swivels around on the huge base to point "; if (second ofclass CompassDirection) print "to ", (the)second, ", out over the caer wall"; else print "at ", (the) second; if (second == Caer_Door && Portcullis hasnt open) { self.aimed_at = Portcullis; "; because the portcullis is down, it's effectively aimed there instead."; } if (second == Portcullis && Portcullis has open) { self.aimed_at = Caer_Door; print "; because the portcullis is up, it's effectively aimed at the huge wooden doors instead."; if (Caer_Door has open) " Of course, with the doors already smashed open, it doesn't help you much."; new_line; rtrue; } self.aimed_at = second; if (self.aimed_at == Caer_Door && Caer_Door has open) { " Of course, with the doors already smashed open, it doesn't help you much."; } print_ret (string) period; Burn: <>; Empty: if (player in Cannon) <>; if (child(self) == 0) "You tilt ", (the) self, " and aim it briefly at the floor, but nothing rolls out."; Enter,Climb: if (player in Cannon) "You're already inside it!"; if (Cannonball in player) "You can't manage to clamber up on ", (the)self, " while holding that cannonball."; if (Cannonball in Cannon) print_ret (The) self, " is designed to fire only one projectile at a time, and there's already a cannonball in there."; if (Bearskin_Rug has worn) "You'll never fit in there while you're wearing that bearskin rug."; print "You sit on top of the barrel and slide your feet into ", (the)self, (string)period; if (Butter has worn || Butter in self) { print " The butter makes all the difference. "; if (Cord in player) print "Being careful not to let go of the cord, you "; else print "You "; move player to Cannon; if (Pillow in Cannon) give Pillow concealed; if (Butter in Cannon) { move Butter to player; give Butter ~concealed worn; } "slide yourself into ", (the)self, " up to your armpits."; } else { Cannon.tried = true; " Pushing and straining, you attempt to push the rest of your body in, but there's too much friction. You can't squeeze yourself in."; } LetGo: if (player in Cannon) { if (noun == player) rfalse; "That's difficult to do with your body blocking the barrel."; } if (noun == Cannonball) { move Cannonball to Tower_Roof; if (child(self)) { if (child(self) ~= Butter) print "You tilt the cannon and aim at it the floor, forcing ", (the) noun, " and ", (the) child(self), " to roll back out.^"; move child(self) to Tower_Roof; rtrue; } "You tilt the cannon and aim at it the flagstones, forcing the cannonball to roll back out."; } PushDir: <>; Receive: if (noun == Blackpowder) { "If you just drop the black powder in like that, it will scatter all over the inside of the cannon, losing its concussive force."; } if (noun ofclass Purse && noun ~= Silk_Purse or Leather_Pouch && Blackpowder in noun) "While ", (the) noun, " does have black powder in it, it's not truly a proper powder bag. In fact, you're pretty sure it will just smash if you drop it into the cannon."; if ((noun ofclass Purse && noun ~= Silk_Purse or Leather_Pouch) || noun == Chamberpot) print_ret (The) noun, " will probably smash if you drop it into the cannon."; Search: if (Butter in Cannon) { print "The inside of the cannon is liberally smeared with butter"; if (children(self) > 1) { print ". It also contains "; WriteListFrom(child(self), ENGLISH_BIT + CONCEAL_BIT); print_ret (string)period; } else ", but it is otherwise empty."; } Take: "The cannon is far too massive to pick up and cart around."; Turn,Push,Pull: if (self.aimed_at == n_obj) self.aimed_at = w_obj; else if (self.aimed_at == w_obj or Portcullis or Caer_Door or Fountain) self.aimed_at = s_obj; else if (self.aimed_at == s_obj) self.aimed_at = e_obj; else if (self.aimed_at == e_obj) self.aimed_at = n_obj; "You push and tug at the swivel base and rotate the cannon. It now points to ", (the)self.aimed_at, ", out over the caer wall."; ], after [; LetGo: if (noun == Cannonball) rfalse; if (noun == Pillow or Leather_Pouch or Silk_Purse && Blackpowder in noun) self.Blackpowder_in_Bag = false; "You reach into ", (the)self, " and grab ", (the) noun, ", hauling ", (itorthem)noun, " back out."; Receive: if (noun == Cannonball) { StopTimer(Cannonball); "You strain and heave and manage to haul the cannonball up to the muzzle of the cannon. You give it a final push and it rolls down the barrel, giving a great clang as it reaches the bottom."; } if (noun == Butter) { give Butter concealed; "You smear the butter all over the inside of the barrel."; } if (noun == Pillow or Leather_Pouch or Silk_Purse && Blackpowder in noun) self.Blackpowder_in_Bag = true; ], react_before [; Insert: if (second == Cannon && player in Cannon) { if (noun == player) rfalse; "That's difficult to do with your body blocking the barrel."; } Take,Remove: if (player in Cannon && noun in Cannon) { if (noun == player) rfalse; "That's difficult to do with your body blocking the barrel."; } ], react_after [; Drop: if (player in self) { move noun to Tower_Roof; print (The) noun, " tumble"; if (noun hasnt pluralname) print "s"; print " out of your hands and onto the flagstones of the tower"; if (noun ofclass Jug && noun.current > 0) { print ", the water pouring out of it"; } if (noun == Chamberpot or Flask or HCl or EW_Dish or Ceramic_Bowl) { remove noun; print ".^^Unfortunately, it smashes upon impact"; } print_ret (string)period; } ], has static container open enterable; Object -> Cord "end of the cord" with name 'end' 'of' 'pull' 'cord' 'pull-cord', parse_name ParseNameOf, article "the", description "A fairly ordinary looking pull-cord. It hangs straight down from the breech end of the cannon.", warn false, YesFire [; <>; ], NoFire [; Cord.warn = false; "You'd best aim it at something else then."; ], before [obj; Insert: "You can't put the cord in that!"; Pull: if (player in Cannon) { if (Cord notin Player) "You lean out, straining, but you can't reach the cord from inside the cannon. Perhaps it's a safety measure."; if (Cannon.Blackpowder_in_Bag == true) { if (Cannon.aimed_at ~= Caer_Door && self.warn == false) { self.warn = true; print "You pause and reflect. You have only one charge of black powder. Are you sure you want to fire yourself "; if (Cannon.aimed_at == n_obj or nw_obj or w_obj or sw_obj or s_obj or se_obj or e_obj or ne_obj) print "to"; else print "at"; print " ", (the)Cannon.aimed_at, "? At unbelievably tremendous speeds? From a cannon called the BrutalMaimer(tm)?^"; YesNo.Ask(self.YesFire,self.NoFire,0); rtrue; } for (obj=child(Cannon): obj~=0: obj=child(Cannon)) remove obj; Cannon.Blackpowder_in_Bag = false; give Butter ~worn; remove Butter; move Cord to Tower_Roof; if (Cannon.aimed_at == Portcullis) { deadflag = 1; print "You give the cord a good yank. There is a earsplitting blast, and the cannon shoots you forth! You go rocketing through the air and slam headfirst into the sturdy iron bars of the portcullis."; if (Helmet has worn) print " Not even the helmet is enough to save you."; if (Chamberpot has worn) print " The chamberpot fails to help, smashing as your head strikes the gate."; " Iron, well-known for its stubborn unwillingness to yield to the impact of soft, vulnerable flesh, puts forth a rather excellent argument as to why it should win this encounter. Unfortunately, your head agrees. It does not survive the impact and as a direct consequence, neither does the rest of you."; } if (Cannon.aimed_at == Caer_Door) { print "You give the cord a good yank. There is an earsplitting blast and the cannon belches you forth in a hot fury of smoke and flame. You fly through the air and sail cleanly along the bailey passage to crash bodily into the doors of the caer, wrenching them from their hinges. "; if (Helmet has worn || Chamberpot has worn) { if (Chamberpot has worn) { remove Chamberpot; print "The chamberpot shields your head from some of the blow, but still smashes upon impact. Your ears ring,"; } else print "The helmet shields your head from the worst of the blow, but your ears still ring,"; print " though whether from the sound of the cannon or the headfirst crash into the doors is hard to say. You"; } else print "Your unprotected head bears the brunt of the assault, and with the memory of the cannon blast ringing in your ears, you pass out.^ ^A short time later, you awaken and"; print " stumble dazedly to your feet to look around.^"; Achieved(9); give Caer_Door open; PlayerTo(Dusty_Road); rtrue; } print "You give the cord a good yank. There is an earsplitting blast and the cannon shoots you forth! You rocket through the air and crash headfirst into "; if (Cannon.aimed_at == n_obj or nw_obj or w_obj or sw_obj or s_obj or se_obj or e_obj or ne_obj) print "the caer wall"; else print (the) Cannon.aimed_at; if (Helmet has worn || Chamberpot has worn) { print ". Not even "; if (Chamberpot has worn) print (the) Chamberpot; else print (the) Helmet; print " is enough to save you"; } deadflag = 1; if (Cannon.aimed_at == n_obj or nw_obj or w_obj or sw_obj or s_obj or se_obj or e_obj or ne_obj) print ". The caer wall"; else print ". ", (The) Cannon.aimed_at; print_ret " stubbornly refuses to yield to your impact, and you crumple to the ground, your head a distant memory of its former gloriously rounded self."; } } ! otherwise the player is not in the cannon if (Cannon.Blackpowder_in_Bag == true) { if (Cannonball in Cannon) { if (Cannon.aimed_at ~= Caer_Door && self.warn == false) { self.warn = true; print "You remember that you have only one charge of black powder. Are you sure you want to launch the cannonball "; if (Cannon.aimed_at == n_obj or nw_obj or w_obj or sw_obj or s_obj or se_obj or e_obj or ne_obj) print "to"; else print "at"; print " ", (the)Cannon.aimed_at, "?^"; YesNo.Ask(self.YesFire,self.NoFire,0); rtrue; } print "You give the cord a good yank. There is a shockingly loud concussive blast, the cannon rocking alarmingly on its swivel base, but the cannonball shoots forth!^"; Cannon.Blackpowder_in_Bag = false; for (obj=child(Cannon): obj~=0: obj=child(Cannon)) remove obj; if (Cannon.aimed_at == Caer_Door) { print "^It flies through the air, sails along the bailey and crashes into the doors with a resounding boom, wrenching them mercilessly from their hinges. The sound echoes throughout the caer, and you stand gazing in awe at the destructive power of the BrutalMaimer(tm).^"; move Cannonball to Dusty_Road; Achieved(10); give Caer_Door open; rtrue; } if (Cannon.aimed_at == Portcullis) { print "^It slams into the portcullis, denting it severely, but failing to get it to raise. You recall bitterly that portcullises are usually constructed with a view to withstanding battering rams and catapults.^"; move Cannonball to W_Courtyard; rtrue; } if (Cannon.aimed_at == Fountain) { print "^It sails through the air in a high arc and lands with a splash directly in the fountain.^"; move Cannonball to Fountain; rtrue; } remove Cannonball; "^You watch in dismay as it sails just over the top of the caer wall and away into the distance."; } else "There's no ammunition loaded into the cannon, so pulling the cord now would waste the powder."; } "You pull the cord and from inside the cannon hear the dull clack of flint striking frizzen. Nothing more happens. There is no powder to ignite inside the cannon."; Take,Lift: if (player in Cannon) <>; if (Cord in player) "You're already holding the end of the cord."; move Cord to player; "You are now holding the end of the cord."; ], has scenery; Prop -> Can_Plaque "small brass plate" with name 'small' 'brass' 'plate' 'sign' 'plaque', description [; font off; print "BrutalMaimer(tm) Self-Sparking Model^ ^Just load with powder bag and shot, then pull cord to fire.^ ^BrutalMaiming(tm) Guarantee not applicable if firing solid shot."; font on; new_line; rtrue; ]; Prop -> Targets "targets" with name 'different' 'targets' 'target', description [; print "From up here, you could aim the cannon at any of the walls of the caer, the fountain, or "; if (Portcullis has open) { print "the large double doors out of the caer."; if (Caer_Door has open) print " Of course, as the doors have already been blasted open, that wouldn't be terribly useful."; new_line; rtrue; } else "the portcullis. You could also aim it at the large double doors of the caer, but until the portcullis is up, that won't do much good."; ], before [; Examine: rfalse; default: "You'll have to specify which target you're talking about."; ]; Prop Field_Obj "fields and pastures" with name 'field' 'fields' 'pasture' 'pastures' 'charming' 'patchwork' 'beautiful' 'colours' 'colors' 'colour' 'color' 'meadow', description "The fields and pastures are laid out in a charming patchwork of beautiful colours.", FakeObj, found_in Atop_West_Wall Dusty_Road Farm_Gate Tower_Roof, before [; Enter: if (real_location == Tower_Roof or Atop_West_Wall) "From up here? Tricky."; <>; Examine: rfalse; default: "Mucking about with the fields won't really help in any meaningful way."; ]; Prop Flagstones "flagstones" with name 'rough' 'warm' 'uneven' 'flag' 'stones' 'flagstone' 'flag-ston', description "The flagstones are rough and uneven.", found_in Tower_Roof Tower, before [; Examine: rfalse; Take,Pull,Push,Pushdir,Transfer: "Whoever constructed this tower did a very good job. You can't manage to pry up any of the flagstones."; default: "The flagstones aren't doing any harm where they are. Just leave them be."; ]; Room Main_Hall "Main Hall" with description [; print "Sunlight streams into the main hall of the tower from the large passage west out to the courtyard. An open doorway leads into the kitchen to the northeast. A polished steel door leads south, and a rusty metal door stands "; if (Workshop_Door has open) print "open "; else print "closed "; "to the northwest. The spiral staircase ascends to the first floor, and also descends down into inky darkness."; ], compass_look [obj; if (obj == d_obj) "The rickety stairs lead down into darkness."; if (obj == u_obj) "The rickety stairs lead up to the first floor."; if (obj == w_obj) <>; if (obj == ne_obj) "The open doorway leads into the kitchen."; if (obj == nw_obj) <>; if (obj == s_obj) <>; TouchWalls(obj, self.Floor, self.Walls); rtrue; ], before [; Exit: if (player in location) <>; rfalse; ], Floor STONE_TILES, cant_go "There are exits to the northwest, northeast, and the south. You can also head west to the courtyard, or take the stairs up or down.", w_to [; print "You head down the stone passageway and emerge into the bright sunshine of the courtyard.^"; return W_Courtyard; ], nw_to Workshop_Door, ne_to [; print "You step through the doorway, into the kitchen.^"; return Kitchen; ], s_to Lab_Door, u_to [; print "You ascend gingerly to the first floor.^"; return Stairwell; ], d_to [; print "You descend cautiously down the rickety staircase.^"; return Basement; ]; Prop H_Passage "passage" with name 'passage' 'tunnel', description [; print "The stone passage leads "; if (self in Main_Hall) "west to the courtyard."; "east into the tower."; ], found_in W_Courtyard Main_Hall, before [; Examine: rfalse; Enter,Go: if (self in Main_Hall) <>; <>; default: "It's a passage. That would be difficult."; ]; Prop Staircase "winding spiral staircase" with name 'winding' 'spiral' 'staircase' 'stairs' 'stair' 'brass' 'case' 'railing' 'rickety' 'wrought' 'iron' 'wrought-i' 'old-fashi', description [; if (self in U_North_Hall or U_South_Hall) "You can't make out too many of the details from here, but the staircase looks like the old-fashioned wrought-iron kind."; print "The rickety wrought-iron staircase "; if (self in Tower_Roof) print "descends to the first floor."; if (self in Basement) print "ascends to the ground floor."; if (self in Stairwell) print "leads down to the ground floor, and up to the top of the tower."; " Its brass railing has been worn smooth by the passage of countless hands along its surface; it could do with some serious reinforcement work, but it looks serviceable."; ], before [; if (self in U_North_Hall or U_South_Hall && action_to_be ~= ##Examine) "You'll have to get closer to the staircase first."; Climb,Enter,Go,Use: if (self in Tower_Roof) <>; else <>; Tie: if (second == nothing) "Let someone else worry about fixing the staircase."; ], found_in Tower_Roof Stairwell Main_Hall Basement U_North_Hall U_South_Hall; Room Kitchen "Kitchen" with description [; if (location hasnt visited) give KitchenMenu ~concealed; "A few rusted pots and pans line this rather spartan kitchen area. A fireplace sits in the northern wall, but no fire has been laid there. A well-scrubbed oak table occupies the middle of the room. Southwest is the doorway back to the main hall."; ], compass_look [obj; if (obj == n_obj) <>; if (obj == sw_obj) "The doorway to the southwest leads back to the main hall."; TouchWalls(obj, self.Floor, self.Walls); rtrue; ], before [; Exit: if (player in location) <>; rfalse; ], Floor STONE_TILES, cant_go "The only way out is southwest back to the main hall.", sw_to [; print "You step back into the main hall.^"; return Main_Hall; ]; Object -> Oak_Table "table" with pname '.x' 'well-scru' '.x' 'solid' '.x' 'oak' '.x' 'sturdy' '.x' 'finest' 'table', description [; print "Beautifully crafted of the finest oak, the table is clean and well-scrubbed, as befits a surface where meals are prepared. The tabletop is smooth and level, the four legs sturdy beams of oak"; if (child(self) ~= 0) { print ". Someone has left "; WriteListFrom(child(self), ENGLISH_BIT); print " sitting on it"; } print_ret (string) period; ], DeadWood true, before [; Enter,Climb: "You'll just get the beautiful surface all dirty if you do that."; Pull,Push,PushDir: "Let's leave the kitchen furnishings as they are."; Take,Transfer: "It's solid oak and consequently extremely heavy."; ], describe [; if (child(self) == 0) rtrue; print "^Although the kitchen gives the impression of never being used someone has left "; WriteListFrom(child(self), ENGLISH_BIT); " sitting on the table here."; ], has static supporter; Object -> -> Butter with parse_name [wd prev num; wd = NextWord(); while (wd == 'stick' or 'of' or 'butter' or 'marg' or 'margarine' or 'margerine') { if (wd == 'marg' or 'margarine' or 'margerine') { if (TestScope(Margarine)) rfalse; ++num; self.Marg = true; } else ++num; prev = wd; wd = NextWord(); } if (prev == 'of') { --num; } return num; ], Marg false, MargAsk false, description [; if (self has worn) "The butter is smeared all over your clothing."; if (self in Bearskin_Rug) "The butter is smeared all over the rug."; if (self has general) "There are teeth marks all over one end of this creamy yellow stick of butter."; "A creamy yellow stick of butter."; ], short_name [; if (self in Bearskin_Rug) print "generous smearing of butter"; else print "creamy yellow stick of butter"; rtrue; ], invent [; ! When listing objects in player's inventory if (c_style & FULLINV_BIT) { if (self has worn) print "a generous smearing of butter (all over your clothes)"; else print "a stick of butter"; rtrue; } ], YesMarg [; "Good. This is butter, not margarine."; ], NoMarg [; "Well, take a good long look then. This is butter."; ], before [; if (self.Marg == true && self.MargAsk == false) { self.Marg = false; self.MargAsk = true; print "Can't you tell the difference between butter and margarine?^"; YesNo.Ask(self.YesMarg,self.NoMarg,0); rtrue; } Disrobe: if (self has worn) "It would be difficult to get the butter off now."; rfalse; Eat: if (Butter has worn) "It's smeared all over your clothes!"; if (self has general) "You're not sure you could stomach another large chunk of butter right now."; give self general; "You take a big bite out of the end of the stick of butter. It's very smooth and creamy and slides easily down your throat without sticking. It's delicious, as butter goes, though eating it by itself isn't exactly your cup of tea."; Lick,Taste: "It's smooth and creamy: delicious, as butter goes."; PutOn: if (self notin player) { print "(taking ", (the) self, " first)^"; ; } if (second == player or magic_clothes) <>; if (second == Cannon) <>; else { if (second == Ninario) { if (location == Study) <>; remove Butter; Ninario.buttered = true; "Ninario sighs as you apply the butter to him. ~I hope you know what you're doing, my young apprentice,~ he murmurs."; } if (second has animate) "That's the sort of thing that should be done only by two consenting adults."; } rfalse; Smell: "Mmmm, a pleasant buttery odour."; Take,Transfer: if (Butter has worn || Butter in Cannon or Bearskin_Rug) "You can't do that now that the butter's been smeared all around like that."; Wear: if (self has worn) "You already have butter smeared all over your clothing."; rfalse; ], after [; Wear: give self concealed; "You smear the stick of butter all over your clothing, making yourself slippery and pliable."; ], has edible clothing; Prop -> Fireplace "fireplace" with name 'fireplace' 'fire' 'place', description [; print "Worn, grey stone masonry surrounds this ancient-looking fireplace. The fireplace is free of ashes, and bears no signs of being used recently, so the stains of smoke on the grey brick must have been there for some time.^"; if (child(self) ~= 0) { new_line; <>; } rtrue; ], describe [; if (child(self) == 0) rtrue; new_line; <>; ], before [; Enter: "You step into the fireplace for a few seconds, but finding nothing of interest, you duck back out."; Search: if (child(self) == 0) "The fireplace gapes emptily, free even of ashes or kindling."; print "Lining the bottom of the fireplace, as though awaiting the next great conflagration,"; WriteListFrom(child(self), ENGLISH_BIT + ISARE_BIT); print_ret (string) period; ], has ~scenery static open container; Prop Pots "pots and pans" with pname 'pots' 'pans' '.p' 'pots' 'and' 'pans', article "some", description [; print "Miscellaneous pots and pans line the walls of the kitchen."; if (self in Kitchen) " They are all rusted, and look like they are never used. You wonder whether Ninario does any cooking or even eats in here."; " They look in pristine condition, and you wonder if they have ever been used."; ], found_in Kitchen Guild_Kitchen, before [; Examine: rfalse; default: if (self in Kitchen) "The pots and pans are too rusted to be of real use."; "If it was your kitchen, you wouldn't like someone fooling about with your nice clean pots and pans."; ]; Autodoor Workshop_Door "rusty metal door" with name 'rusty' 'rusted' 'metal' 'workshop' 'work' 'door', description [; print "Corroded stains line the pitted steel surface of the"; if (self has open) " open door."; " closed door."; ], found_in Main_Hall Workshop, door_dir [; if (self in Workshop) return se_to; return nw_to; ], door_to [; if (self in Workshop) return Main_Hall; return Workshop; ], with_key Rusted_Key, has scenery door ~open openable lockable locked; Object Rusted_Key "old iron key" with name 'old' 'iron' 'key' 'clanging' 'something', description [; if (self hasnt moved) "It's an old iron key, doubtless jarred loose from Ninario's robes when he was pulled through the portal."; "An old iron key, large and unwieldy."; ], initial [; "An old iron key lies here, doubtless jarred loose from Ninario's robes when he was pulled through the portal."; ]; Autodoor Lab_Door "polished steel door" with name 'polished' 'steel' 'lab' 'door', description [; print "Highly polished steel makes this "; if (self has open) print "open"; else print "closed"; " door gleam brightly in the sunlight."; ], found_in Main_Hall Laboratory, door_dir [; if (self in Laboratory) return n_to; return s_to; ], door_to [; if (self in Laboratory) return Main_Hall; return Laboratory; ], with_key Lab_Key, has scenery door ~open openable lockable locked; Object Lab_Key "small steel key" with name 'small' 'steel' 'key', description "A small steel key.", initial [; "A small steel key lies on the floor here, uncovered in your tidying of the room."; ]; Room Laboratory "Laboratory" with description [; if (location hasnt visited) give LabMenu ~concealed; print "The southern half of the tower is completely taken up by this large laboratory. From the profusion of chemicals and powders strewn about, you conclude that this room sees much use. It seems that Ninario is more than simply a wizard; he is engaged in scientific endeavour as well. Black streaks of soot on the walls bear mute evidence to the violent failure (or perhaps success) of past experiments. What little sunlight there is filters in through the numerous small windows lining the walls. The "; if (Lab_Door has open) print "open"; else print "closed"; print " door to the north leads back to the main hall.^"; if (Table has general) print "^The remains of a scarred and stained table rest"; else print "^A scarred and stained table rests"; " against the southern wall."; ], compass_look [obj; if (obj == n_obj) <>; if (obj == s_obj) <>; TouchWalls(obj, self.Floor, self.Walls); rtrue; ], before [; Exit: if (player in location) <>; rfalse; ], Floor STONE_TILES, Walls ROUGH_STONE, cant_go "The way out is back north to the main hall.", n_to Lab_Door, s_to [; <>; ]; Object -> S_Windows "windows" with name 'window' 'slit' 'slits' 'windows', description "The windows are small narrow slits in the southern wall, which admit some daylight. They're far too narrow to fit through, or even see through very well.", before [; Attack: "Smashing windows is difficult when there is no glass in them."; Examine: rfalse; Enter,JumpThrough: "The windows are too narrow to fit through."; Search: give self general; "You catch a glimpse of the courtyard area south of the tower. You make out a shed, and a stone pathway heading along the base of the tower."; default: "You can safely leave them be."; ], has scenery pluralname; Object -> Table "table" with name 'scarred' 'stained' 'rickety' 'metal' 'table' 'tabletop' 'remains' 'rust' 'rusty' 'stains' 'scars' 'legs' 'tablelegs' 'lines' 'scratches' 'scores' 'dull', description [; if (self has general) print "The twisted remains of a "; else print "A "; print "rickety metal table, presumably once gleaming and unmarred. Now its surface is scratched and scored with lines, the steel dull and dirty. It bears the stains and scars of many a chemical experiment.^"; if (child(self) == 0) rtrue; if (Silk_Purse hasnt moved || Leather_Pouch hasnt moved) print "^The table holds various bags and pouches: the components of some of Ninario's experiments. Amongst the items of interest"; else print "^Sitting atop the table"; WriteListFrom(child(self), ENGLISH_BIT + ISARE_BIT); print_ret (string) period; ], describe [; if (child(self) == 0) rtrue; if (Silk_Purse hasnt moved || Leather_Pouch hasnt moved) print "^The table holds various bags and pouches: the components of some of Ninario's experiments. Amongst the items of interest"; else print "^Sitting atop the table"; WriteListFrom(child(self), ENGLISH_BIT + ISARE_BIT); print_ret (string) period; ], before [obj; Attack,Climb,Enter,Pull,Push,PushDir,Take: if (self has general) "The table has collapsed, and is not up to this sort of treatment any longer."; give self general; print "There is a groaning protest from the rickety metal table and it abruptly collapses"; if (child(self) ~= 0) print ", scattering its contents across the floor"; for (obj=child(self): obj ~= 0: obj=child(self)) { move obj to location; } print_ret (string) period; Receive: if (self has general) "The table has collapsed, and is not up to having things put on it any longer."; if (noun == Cannonball) { move Cannonball to self; give self general; for (obj=child(self): obj ~= 0: obj=child(self)) { move obj to location; } "The hefty cannonball crashes down onto the rickety metal table. There is a moment of pent-up silence as the legs of the table begin to shake. Then, a creaking and groaning of metal fills your ears, and the table collapses, scattering its contents across the floor."; } Rub: "You would need some serious scrubbing power to clean up all that rust."; ], has static supporter; Object -> -> magnesium with short_name [; if (self has general) print "magnesium flare"; else print "silvery-white cylinder"; rtrue; ], parse_name [i; if (self has general) { while (NextWord() == 'fine' or 'line' or 'silvery' or 'white' or 'silvery-w' or 'metal' or 'magnesium' or 'flare' or 'lamp' or 'cylinder' or 'rod' or 'arrow' or 'tiny' or 'illuminat') i++; } else { while (NextWord() == 'fine' or 'line' or 'silvery' or 'white' or 'silvery-w' or 'metal' or 'cylinder' or 'rod' or 'illuminat' or 'tiny' or 'arrow') i++; } return i; ], description [; if (self has light) "The magnesium cylinder has been twisted and glows intensely, providing illumination. It glows so brightly that looking directly at it is difficult."; print "A small cylinder of some silvery-white metal. Inscribed on the side in tiny letters are the words ", (i) "#12 Illuminator, Commercial Grade.", " A fine line encircles the middle of the rod, a tiny arrow printed beside it, pointing around the circumference of the cylinder."; if (self has general) print " The flare is currently off."; new_line; rtrue; ], before [; Attack,Open: if (self hasnt general) { Achieved(2); give self general; } if (self hasnt light) <>; "It's already lit!"; Turn,Wave: if (self hasnt general) { Achieved(2); give self general; } if (self has light) <>; <>; SwitchOn,Burn: if (self notin player) { print "(taking ", (the) self, " first)^"; ; } if (self hasnt general) "If only you could figure out how to do that, you'd be in business, luminously speaking."; if (self has light) "It's already on!"; give self light; "You give the cylinder a sharp twist and it suddenly bursts forth in blazing white light. Then, as your eyes struggle to adjust, the cylinder dims to a more reasonable level. It is now quite usable as a light source."; SwitchOff,Close: if (self notin player) { print "(taking ", (the) self, " first)^"; ; } if (self hasnt general) "Once you figure out how to turn it on, then you can work on figuring out how to turn it off."; if (self hasnt light) "It's already off!"; give self ~light; "You twist the two halves of the cylinder, and it goes out."; ]; Purse -> -> Silk_Purse "silk purse" with name 'silk' 'purse' 'drawstrings' 'small' 'card' '#16', description [; print "A small silk purse, with yellow drawstrings. A small card attached to the drawstrings reads ", (i) "#16", (string)period; if (self has open && child(self) ~= 0) { print " Inside ", (the) self; WriteListFrom(child(self), ENGLISH_BIT + ISARE_BIT); print (string)period; } new_line; rtrue; ], before [; Pull: if (self has open) <>; <>; ], after [; Close: "You pull the drawstrings together, sealing ", (the) self, (string) period; ]; Substance -> -> -> Sulphur "yellow powder" with parse_name [i; if (self has general) { while (NextWord() == 'yellow' or 'powder' or 'sulphur' or 'sulfur' or 'powdered') i++; } else { while (NextWord() == 'yellow' or 'powder') i++; } return i; ], short_name [; if (self has general) print "powdered sulphur"; else print "yellow powder"; rtrue; ], article "some", description [; "A small amount of ", (name)self, (string)period; ], before [; Smell: print_ret (The) self, " has no discernible odour."; ]; Object -> -> Hastener with pname 'small' 'tube' 'hastener' 'reddish' 'paste' 'cap' '.x' 'wood', short_name [; print "small red tube"; rtrue; ], description [; print "A short red tube. Small printing on the side reads ", (i) "All-Purpose Wood Hastener", (string)period; if (self has open) print " The tube seems to contain a reddish paste."; new_line; rtrue; ], before [; Eat,Lick,Taste: if (self has general) "You've already had one brief taste of the wood hastener and that was more than enough."; if (self hasnt open) { print "(opening ", (the) self, " first)^"; give self open; } give self general; "The reddish paste has an extremely earthy taste and it's not entirely pleasant. In fact, it makes you feel a trifle ill."; Empty,EmptyT: "It would be better to smear the wood hastener over whatever wood you would like to hasten."; LetGo: <>; PutOn: if (second == player) <>; if (self notin player) { print "(taking ", (the) self, " first)^"; ; } if (self hasnt open) { print "(opening ", (the) self, " first)^"; give self open; } if (second has animate) "You're almost positive that ", (the) second, " ", (isorare)second, "n't made of wood."; if (second provides DeadWood) { if (second.DeadWood == true) "You spread some of the wood hastener on ", (the) second, " but it doesn't have any obvious effect. Perhaps it only works on living wood."; ". Nothing happens; ", (ItorTheyAre)second, " not made of wood."; } else if ((second == d_obj && location.Floor == WOOD or HARDWOOD or WET_WOOD or ROUGH_WOOD) || (second == nw_obj or ne_obj or se_obj or sw_obj or s_obj or n_obj or w_obj or e_obj && location.Walls == WOOD or HARDWOOD or WET_WOOD or ROUGH_WOOD)) "You spread some of the wood hastener on ", (the) second, " but it doesn't have any obvious effect."; if (second == Tree or Branch) { if (Tree hasnt general) { give Tree general; Branch.short_name = "firm strong branch"; Achieved(11); "You spread some of the wood hastener on ", (the) second, ". There is a grinding crackling noise from the tree and it suddenly bursts forth in a tremendous growth spurt as its growth is hastened.^ ^There is a tremendous flapping of surprise from the hawk, following by a squawk of pleasure as it settles back down in its drastically altered home."; } if (second == Trees) { "You spread some of the wood hastener on the towering evergreen trees. They shake and shudder for a few seconds, but their growth doesn't appear to hasten. Perhaps wood hastener isn't as effective with older established trees as it is with younger fast-growing ones."; } "You spread some of the wood hastener on ", (the) second, ", but it has no effect."; } if (second == Cell_Door && Cell_Door hasnt open) { give Cell_Door open; give EscapeHint ~concealed; Achieved(28); StartDaemon(Soldiers); StartTimer(Soldiers, Soldiers.Reason * 3); move Ninario to First_Floor_Hall; StartDaemon(Ninario); "You spread some of the wood hastener on the green wood of the door. For a moment, nothing seems to happen, but then the door begins to swell, undulating within its frame, the wood warping and bulging oddly. It expands against the frame, pushing and straining. Something's got to give! You cover your head and duck just as the frame gives way, and the door bursts apart, bits of wood flying around the room.^ ^As the door disintegrates, an alarm bell begins to ring, a shrill clamouring clang.^ ^~Brazen bewitchments!~ you hear a voice cry from inside the small room. ~I've never seen ", (i) "that", " spell before. Mm-yes. No.~^ ^You hear a shuffling from inside the cell, and Ninario wanders out into the hall, looking a trifle dazed from the blast, blinking owlishly around him."; } if (second == spectacles) { spectacles.dirty = true; print "You smear the wood hastener all over the lenses"; } else print "You spread some of the wood hastener on ", (the) second; ". Nothing happens; ", (ItorTheyAre)second, " not made of wood."; Receive: "The tube already has wood hastener in it."; Search: if (self hasnt open) { print "(opening ", (the) self, " first)^"; give self open; } "The tube contains a reddish paste."; Smell: if (self has open) "The reddish paste has a very concentrated earthy smell."; "The tube doesn't have any distinctive smell."; Wear: "At last check, you appear not to be made of wood. Thus, you don't need wood hastener used on you."; ], after [; Close: "You screw the cap back on, closing the tube."; Examine: self.short_name = "tube of wood hastener"; rfalse; Open: "You unscrew the cap, revealing a reddish paste."; ], has openable; Purse -> -> Leather_Pouch "leather pouch" with name 'small' 'leather' 'pouch' 'strings' 'tag' '#6', description [; print "A small black leather pouch. Small narrow strings of leather are wound into the lip of the pouch, for holding it closed. A small tag attached to the drawstrings reads ", (i) "#6", (string)period; if (self has open && child(self) ~= 0) { print " Inside ", (the) self; WriteListFrom(child(self), ENGLISH_BIT + ISARE_BIT); print (string)period; } new_line; rtrue; ], before [; Pull: if (self has open) <>; <>; ], after [; Close: "You pull the drawstrings together, sealing ", (the) self, (string) period; ]; Substance -> -> -> Charcoal with name 'charcoal' 'coal' 'dust' 'black' 'grainy' 'substance' 'powder', short_name [; if (self has general) print "charcoal"; else print "black grainy substance"; rtrue; ], article [; if (self has general) print "some"; else print "a"; ], description [; if (self has general) "Fine black grains of charcoal."; "A black grainy substance that looks a trifle like coal dust."; ], before [; Smell: give self general; print_ret (The) self, " has an odd coal-like smell."; ], after [; Examine: give self general; ]; Object -> Shelf "shelf" with name 'shelf' 'bottles', description [; print "The small wooden shelf sits above the table."; if (child(self) ~= 0) { print " Resting on it"; WriteListFrom(child(self), ENGLISH_BIT + ISARE_BIT); print_ret (string) period; } new_line; rtrue; ], describe [; print "^Sitting above the table is a"; if (child(self) == 0) "n empty shelf."; print " shelf containing "; WriteListFrom(child(self), ENGLISH_BIT); print_ret (string) period; ], has static supporter; Object -> -> Stone_Bottle with name 'small' 'stone' 'bottle' 'of' 'paint' 'stripper' 'wizstrip' 'seal' 'waxen' 'waxy' 'hermetic' 'hermetick', parse_name ParseNameOf, short_name [; print "small stone bottle"; rtrue; ], add_to_scope [; if (Wiz_Label in self) AddToScope(Wiz_Label); ], description [; if (self has general) print "It's another bottle of WizStrip. It"; else print "The small bottle"; print " looks exactly like those stone bottles of ginger beer"; if (Wiz_Label in self) { print ", but the label on the side reads ", (i) "WizStrip Paint Stripper, Industrial Strength", ". Then in smaller letters: ", (i) "WARNING: Highly reactive. Do not mix with methane"; } print (string)period_newline; if (self.sealed == true) print "^Unlike the last bottle, this one appears to have a waxy hermetic seal around the lip.^"; rtrue; ], sealed false, Meth_Warn false, time_left, before [; if (self in Sewer_Vat && Sewer_Vat.clean == false) { if (action == ##Find) "You know precisely where it is. It's sinking deeper and deeper into the filth in the vat."; "You'll have to dig the stone bottle out of the sewer vat before you can do that."; } Close: if (self.sealed == true) "The bottle is already hermetically sealed, hence closed."; Drink,Eat,Taste,Lick: "The paint stripper is highly corrosive. That would be unwise."; Empty: "You might want to save the paint stripper for a specific purpose rather than wasting it like this."; EmptyT: if (self notin player) { print "(taking ", (the) self, " first)^"; ; } if (self.sealed == true) { <>; } if (second == self) "Thankfully, the rift hasn't yet caused enough damage that you can successfully empty ", (the) self, " into itself."; if (second == d_obj or Carpet or Bearskin_Rug) "Don't pour paint stripper on the floor!"; if (second == Fountain) "You'd contaminate Ninario's drinking water if you did that!"; if (second == Murder_Hole) "If you do that, you'll get paint stripper all over the ground in the bailey."; if (second == Toilet_Hole) { if (self hasnt open) { give self open; print "(opening the stone bottle first)^"; } Toilet_Hole.pour = true; <>; } if (second == player or magic_clothes) "That could conceivably irreparably damage your beautiful robes or your soft delicate skin."; if (second == self) "Thankfully, the rift hasn't yet caused enough damage that you can successfully empty ", (the) self, " over itself."; "Emptying ", (the) self, " over ", (the) second, " would just waste it to no useful purpose."; Open,Unlock: if (self.sealed == true) "There's a waxy hermetic seal of some kind around the lid of the bottle. You can't seem to open it."; Receive: "The small stone bottle already contains paint stripper."; Search: if (self hasnt open) { <>; } "The bottle contains yellowish oily paint stripper."; Smell: if (self has open) "The paint stripper has an acrid nose-tingling odour that makes your eyes water and the hairs in your nostril stand on hand."; "The closed stone bottle smells like every other stone bottle you've ever sniffed."; ], after [; Close: "You carefully seal the stone bottle."; Examine: self.short_name = "bottle of WizStrip"; rfalse; Open: "You prise the lid from the stone bottle, revealing yellowish oily paint stripper."; ], describe [; if (self.sealed == true && self in Will_Woodcraft) { "^About the only item of stock that seems to have been left behind is a familiar-looking stone bottle."; } rfalse; ], time_out [; if (self has general) { remove Gas; Achieved(3); if (location == Toilet) "^Suddenly, a violent explosion rocks the depths of the tower, and a massive gurgling and sucking sound echoes up from the hole, carrying with it a foul stench."; "^Suddenly, a violent explosion rocks the depths of the tower, and a massive gurgling and sucking sound echoes up from the basement."; } else print "^Nothing happens. No violent explosion rocks the room, no gurgling and sucking sounds echo from the vat. You realise with dismay that the WizStrip won't react with the sewage unless the bottle is open, and the stone bottle is, even now, sinking farther and farther into the sewer vat"; if (location == Sewer) print_ret (string) period; else " in the basement."; ], has openable; Object -> -> -> Wiz_Label "label" with name 'label', description [; "The label on the bottle reads ", (i) "WizStrip Paint Stripper, Industrial Strength", ". Then in smaller letters: ", (i) "WARNING: Highly reactive. Do not mix with methane"; ], before [; Take,Remove: remove self; "You painstakingly pick at the label. It comes off in annoyingly discrete little chunks, but eventually the bottle is label-free. Unfortunately, the label doesn't survive the process."; ], has scenery; Purse -> -> Flask "flask" with name 'glass' 'flask', description [; print "The glass flask "; if (child(self) ~= 0) { print "contains "; WriteListFrom(child(self), ENGLISH_BIT); } else print "is empty"; ". Inscribed on its side is the cryptic lettering ", (i) "#19 #7 #8(3)", (string)period; ], before [; Open,Close: "This flask does not have a top."; Search: <>; ], has ~openable open; Substance -> -> -> KNO3 with short_name [; if (self has general) print "potassium nitrate"; else print "white powdery substance"; rtrue; ], article [; if (self has general) print "some"; else print "a"; ], parse_name [i; if (self has general) { while (NextWord() == 'white' or 'powdery' or 'substance' or 'powder' or 'kno3' or 'potassium' or 'nitrate' or 'saltpetre' or 'saltpeter') i++; } else { while (NextWord() == 'white' or 'powdery' or 'substance' or 'powder' or 'kno3') i++; } return i; ], description [; if (self has general) "The potassium nitrate is a white granular powder."; "A white granular powdery substance."; ], before [; Smell: print_ret (The)self, " is odourless."; ]; Object -> -> HCl "vial of liquid" with name 'vial' 'of' 'liquid' 'hydrochlo' 'acid' 'hcl' 'muriatic' 'clear' 'colorless' 'colourles', parse_name ParseNameOf, short_name [; if (self has general) print "vial of muriatic acid"; else print "vial of liquid"; rtrue; ], evap 0, description [; print "The vial contains "; if (self has general) print "muriatic acid"; else print "a clear colourless liquid"; ". On the side of the vial is the cryptic lettering ", (i) "#1 #17", (string)period; ], each_turn [; if (self has open) { self.evap++; if (self.evap == 1) rtrue; if (self.evap < 4) print "^With the stopper off the valve, the muriatic acid fumes slightly as it reacts with the air. It seems to be slowly evaporating away."; else if (self.evap < 5) print "^The muriatic acid continues to fume as it reacts with the air. There won't be much of it left if this continues!"; else if (self.evap == 5) { remove self; "^With a final sad frothing bubble, the last of the muriatic acid fumes away into the air.^ ^The vial itself vanishes, a handy consequence of the Thalionic Antimagic Litter Campaign."; } new_line; rtrue; } ], before [; Drink,Eat,Lick,Taste: if (self has general) "It's muriatic acid. That would be unwise."; "You're not certain what this liquid is. Until that time, it wouldn't be wise to ingest it in any way."; Empty: "Perhaps you should pour it into or over something specific, so you don't spill the liquid all over the place."; EmptyT: if (self notin player) { print "(taking ", (the) self, " first)^"; ; } if (Ninario in location) { give self general; "Ninario grabs your wrist. ~Are you mad? That's muriatic acid!~"; } if (second == d_obj or Carpet) <>; if (second == Chamberpot) { print "The muriatic acid would completely ruin the finish on the chamberpot. "; if (child(Chamberpot) ~= 0) "Besides which, it already has water in it."; "In any case, the vial is a perfectly acceptable vessel for the acid."; } if (second == Shed_Door or Shed_Lock or Helmet or Watering_Can or Stone_Bottle) { if (second == Shed_Door or Shed_Lock) { if (Shed_Door has locked) { if (self hasnt open) print "You pull the stopper from the vial, and"; else print "You"; give Shed_Door ~locked; Shed_Lock.eaten = true; print " pour the muriatic acid over the rusted lock. It bubbles and roils as it eats away at the oxidation, chewing through the metal. Within a few minutes, there is substantially less of the lock.^"; } else "But the shed door isn't locked!"; } if (second == Helmet) { if (self hasnt open) print "You pull the stopper from the vial, and"; else print "You"; print " pour the muriatic acid over the rusty helmet. It eats away some of the rusty metal, but the helmet is still functional.^"; } if (second == Watering_Can) { if (child(Watering_Can) == 0) { if (Watering_Can.hole == true) "The watering can already has one hole in it. If you give it any more, it will be completely useless for holding water."; if (self hasnt open) print "You pull the stopper from the vial, and"; else print "You"; Watering_Can.hole = true; print " pour the muriatic acid into the watering can. A flurry of activity ensues as the acid eats away at the rusty metal. You now have a slightly holed watering can.^"; } else "You'll need to empty the watering can first."; } if (second == Stone_Bottle) { if (Stone_Bottle.sealed == true) { if (self hasnt open) print "You pull the stopper from the vial, and"; else print "You"; print " pour the muriatic acid over the waxy hermetic seal around the lip of the stone bottle. The acid bubbles and foams, but soon dissipates, without affecting the seal in the slightest. It must be impervious to this sort of attack.^"; } else "Pouring ", (the) self, " all over ", (the) second, " wouldn't do much good."; } remove self; "^The vial itself vanishes, a handy consequence of the Thalionic Antimagic Litter Campaign."; } if (second == player or magic_clothes) "That could conceivably irreparably damage your beautiful robes or your soft delicate skin."; "Emptying the vial of liquid over ", (the) second, " would just waste it to no useful purpose."; Fill: print "The vial already contains "; if (self has general) "muriatic acid."; else "the clear colourless liquid."; LetGo: <>; Receive: <>; Search: <>; Smell: if (self hasnt open) { print "(pulling the stopper from the vial first)^"; ; } "The liquid has an acidic penetrating odour, extremely pungent and unpleasant."; ], after [; Open: "You pull the stopper from the vial. The acid fumes slightly as it reacts with the air."; Close: self.evap = 0; "You replace the stopper, sealing the vial."; ], has openable; Purse -> -> EW_Dish "earthenware dish" with name 'earthenwa' 'dish', description [; print "A small earthenware dish with a wide flat lip. Scratched into the earthenware surface of the dish are the letters ", (i) "#29 #16 #8(4)", (string)period; if (child(self) ~= 0) { print " The dish contains "; WriteListFrom(child(self), ENGLISH_BIT); print (string)period; } new_line; rtrue; ], before [; Open,Close: "The small earthenware dish does not have a cover of any kind."; ], has open ~openable; Substance -> -> -> CuSO4 with short_name [; if (self has general) print "copper sulphate crystals"; else print "small blue crystals"; rtrue; ], parse_name [i; if (self has general) { while (NextWord() == 'small' or 'blue' or 'crystals' or 'copper' or 'sulphate' or 'sulfate' or 'CuSO4') i++; } else { while (NextWord() == 'small' or 'blue' or 'crystals') i++; } return i; ], article "some", description [; if (self has general) "Some small blue crystals of copper sulphate."; "A handful of small blue crystals."; ], before [; Smell: print_ret (The) self, " are odourless."; ], has pluralname; Purse -> -> Ceramic_Bowl "ceramic bowl" with name 'ceramic' 'bowl', description [; print "A small ceramic bowl. Scrawled on the lip are the letters ", (i) "(#7 #1(4))2 #16 #8(4)", (string)period; if (child(self) ~= 0) { print "^^The bowl contains "; WriteListFrom(child(self), ENGLISH_BIT); print (string)period; } new_line; rtrue; ], before [; Open,Close: "The ceramic bowl does not have a cover of any kind."; ], has open ~openable; Substance -> -> -> NH42SO4 with short_name [; if (self has general) print "crystalline ammonium sulphate"; else print "translucent crystalline substance"; rtrue; ], parse_name [i; if (self has general) { while (NextWord() == 'transluce' or 'crystalli' or 'salt' or 'substance' or 'ammonium' or 'sulphate' or 'sulfate' or 'NH42SO4') i++; } else { while (NextWord() == 'transluce' or 'crystalli' or 'substance') i++; } return i; ], article [; if (self has general) print "some"; else print "a"; ], description [; if (self has general) "Some translucent crystals of ammonium sulphate."; "A translucent crystalline substance. It looks like a salt of some kind."; ], before [; Smell: print_ret (The) self, " are odourless."; ]; Substance Blackpowder "black powder" with name 'blackpowd' 'gunpowder' 'black' 'powder', article "some", description "The mixing in the ball mill has forced the saltpeter into the pores of the charcoal and sulphur, resulting in beautifully fine-grained black powder.", before [; Smell: print_ret (The) self, " smells faintly of rotten eggs. Must be the sulphur."; ], after [; Take: "You scoop the grains of black powder into your hand."; ]; Room Workshop "Workshop" with description [; if (location hasnt visited) give WorkshopMenu ~concealed; print "Odd devices and machines fill this room. Half-finished projects lie abandoned in the middle of the floor, and various completed ones are pushed up against the walls. A window on the northern wall admits some light into the room. The main hall lies through the "; if (Workshop_Door has open) print "open doorway"; else print "rusty steel door"; " to the southeast."; ], compass_look [obj; if (obj == se_obj) <>; if (obj == n_obj) <>; TouchWalls(obj, self.Floor, self.Walls); rtrue; ], before [; Exit: if (player in location) <>; rfalse; ], Floor ROUGH_STONE, Walls ROUGH_STONE, cant_go "From here, you can only head back southeast to the main hall.", n_to "The window is too narrow to fit through.", se_to Workshop_Door; Prop -> Devices "strange devices" with name 'strange' 'devices' 'machines' 'set' 'of' 'balances' 'mirrors' 'lenses' 'optics' 'telescope' 'half-fini' 'projects', parse_name ParseNameOf, description "They appear to be various devices that Ninario has constructed in the course of his scientific investigations. You recognise a set of balances, some mirrors and lenses for optics experiments, and a rudimentary telescope.", before [; Examine: rfalse; default: "Some of the devices appear very delicate, so it might be best not to fiddle with them."; ]; Object -> Hand_Drill "hand drill" with name 'hand' 'hand-dril' 'cranking' 'hand-cran' 'hand-oper' 'drill' 'bit' 'medium-si', description "A manual hand drill, with a medium-sized drill bit in it. Quite possibly state-of-the-art in this world.", describe [; "^A sturdy hand drill lies here."; ], before [; SwitchOn,Turn: "The drill is the hand-operated variety. Simply drill something and you'll begin turning it."; SwitchOff: "The drill is the hand-operated variety. It doesn't need to be turned off."; Use: <>; ]; Object -> goggles "pair of black goggles" with name 'pair' 'of' 'black' 'welding' 'goggles' 'goggle' 'lenses', parse_name ParseNameOf, article "a", description [; if (self in Hermit) "The goggles sit comfortably over the hermit's eyes, as though made for them."; "These goggles are comprised of two individual eye-sized cups, joined by a rubber bridge for the nose. There is also a thick sturdy strap to hold the goggles on your head. The lenses are almost completely opaque."; ], describe [; "^A pair of black goggles have been carelessly discarded here."; ], after [; Disrobe: if (Bearskin_Rug has worn) { print "You remove the bearskin rug, "; if (Helmet has worn) { print "take off the helmet, take off the goggles, put the helmet back on, "; } else print "take off the goggles, "; print "and then put the bearskin rug back on.^"; } else if (Helmet has worn) { print "You remove the helmet, take off the goggles, and then put the helmet back on.^"; } else { print "You remove the goggles from your head.^"; } if (Shopkeeper in location) print "^~And how was your little trip through the darkness, luv?~ asks ", (the) Shopkeeper, (string) period_newline; rtrue; Wear: if (Bearskin_Rug has worn) { if (Helmet has worn) print "The goggles won't fit over the helmet, so you remove the rug, remove the helmet, slip the goggles on, put the helmet back on, and then duck back under the rug. Then you pause to catch your breath.^"; else print "You slip the goggles on under the bearskin rug.^"; } else if (Helmet has worn) print "The goggles won't fit over the helmet, so you remove the helmet, slip the goggles on and then put the helmet back on.^"; else print "You slip on the goggles.^"; if (Shopkeeper in location) print "^~Can you see with them goggles on, luv?~ asks ", (the) Shopkeeper, " curiously.^"; if (Crone in location) print "^", (The) Crone, "'s eyes narrow and she looks around suspiciously. ~Am I missing something? Is something about to happen?~^"; if (Hermit in location) print "^", (The) Hermit, " squints up at the goggles. ~Those must be great for blocking out light,~ he says wistfully.^"; if (Guard in location) print "^", (The) Guard, " looks at you, frowning. ~T'ain't so bright as awl tha',~ he murmurs."; rtrue; ], react_after [; if (self has worn) { if (action == ##Go) print "^With the goggles on, you're forced to move slowly and carefully.^"; rfalse; } ], has pluralname clothing; Prop -> Ball_Mill "ball mill" with pname '.x' 'ball' 'mill' 'contrapti' 'rotating' 'drum' 'cylindric' 'device' 'machine' 'metal' 'cover' 'crank' 'lever' 'mechanism', capacity 6, proper_ingredients 0, improper_ingredients 0, description [; print "A cylindrical ball mill, used for grinding chemicals together. It is fairly large, but the crank on the side shows that it is nevertheless meant to be turned by hand. It has a metal cover which is currently "; if (self has open) { print "open. The mill's interior surfaces are covered with porcelain to allow for easy non-sparking mixing of compounds. "; <>; } "closed."; ], initial [; "One of the machines catches your eye. It is a cylindrical drum device, with a lever on one side."; ], before [; LetGo: if (noun == Sulphur or KNO3 or Charcoal) Ball_Mill.proper_ingredients--; else Ball_Mill.improper_ingredients--; Receive: if (Ball_Mill hasnt open) { give Ball_Mill open; print "(opening the ball mill cover first)^"; } if (noun == Cannonball or Branch) print_ret (The) noun, " won't fit into the ball mill!"; if (noun == Watering_Can or Chamberpot or EW_Dish or Ceramic_Bowl or Scrying_Bowl or Flask or Helmet) "There's a good chance ", (the) noun, " would break if you put it into the ball mill, so you reconsider."; if (noun == Sulphur or KNO3 or Charcoal) Ball_Mill.proper_ingredients++; else Ball_Mill.improper_ingredients++; rfalse; Search: if (self hasnt open) { print "(opening the cover first)^"; give self open; } if (children(self) == 1) <>; print "Inside the ball mill, you can see "; WriteListFrom(child(self), ENGLISH_BIT); print_ret (string) period; Smell: "The heady odours of many different chemicals fill your nostrils."; Turn,Pull: if (self has open) { print "(closing the cover first)^"; give self ~open; } if (children(self) == 1) "You give the ball mill a vigorous turning and hear the lead balls clacking noisily against each other."; if (self.proper_ingredients == 3 && self.improper_ingredients == 0) { remove Sulphur; remove KNO3; remove Charcoal; move Blackpowder to self; Achieved(8); self.proper_ingredients = 0; "You give the ball mill a vigorous turning, hearing the lead balls clack noisily against each other, relentlessly forcing the elements to combine with each other, grinding and grinding."; } "You give the ball mill a vigorous lengthy turning."; ], has ~scenery static openable container; Object -> -> Lead_Balls "heavy lead balls" with name 'heavy' 'lead' 'balls', article "some", description [; "Lead balls line the inside. When the mill is rotated, the lead balls crush the different elements together, forming new chemical compounds."; ], before [; Examine: rfalse; Lick,Taste: "That might result in lead poisoning."; Smell: <>; Touch: "The lead balls are cold to the touch."; default: "The lead balls are an integral part of the ball mill. It won't work correctly without them."; ]; Prop -> Furnace "blast furnace" with name 'forge' 'oven' 'kiln' 'blast' 'furnace' 'stone' 'door', description [; print "A small blast furnace, with a heavy stone door. It is cold to the touch."; if (child(self) ~= 0 && self has open) <>; new_line; rtrue; ], initial [; print "A stone blast furnace of the sort used for smelting iron sits here, "; if (Furnace has open) "gaping open."; "firmly shut."; ], before [; Burn: "You don't have any way of lighting the blast furnace. You also don't need to cast any iron, so don't worry about it."; Receive: if (noun == Branch) print_ret (The) noun, " is too long to fit into the blast furnace."; Search: if (self hasnt open) { print "(opening the blast furnace door first)^"; give self open; } if (child(self) == 0) "The blast furnace is empty."; print " Nestled snugly inside the blast furnace"; WriteListFrom(child(self), ENGLISH_BIT + ISARE_BIT); print_ret (string) period; ], has ~scenery static openable container; Object Cannonball "cannonball" Furnace with name 'cannonbal' 'ball', description "A cast iron cannonball, about eight inches in diameter. It looks extremely heavy.", time_left, react_before [; Climb: if (noun == Staircase) rfalse; if (self in player) "Not with the cannonball in your arms, you don't."; Disrobe: if (self in player && noun ~= self) "Your hands are pretty much completely occupied with the cannonball."; Take: if (self in player && noun ~= self) "You can't take ", (the) noun, " while holding the heavy cannonball."; rfalse; ], each_turn [; if (self in player) "^The cannonball is getting heavier by the second."; ], before [item; Enter: "You stand on top of the cannonball briefly, but quickly overbalance and fall off."; Push,Pull: "The cannonball is heavy, but it definitely seems you could turn it in various directions."; PushDir: AllowPushDir(); rtrue; Remove,Take: if (self in player) "You already have that."; objectloop(item in player) { if (item hasnt worn) "You'll need both hands free to pick up the heavy cannonball."; } rfalse; ThrowAt: "It's all you can do to lug the cannonball around, let alone throw it at anything."; ], describe [; "^A large cast iron cannonball sits here, looking extremely heavy."; ], after [; Drop: StopTimer(self); print "Your arms give out and you drop the cannonball. It thumps solidly to the "; if (location ofclass Outroom) "ground."; "floor."; PushDir: "(pushing the cannonball along with you)"; Take: StartTimer(self, 3); "You heft the cannonball. It weighs a good five or six stone! You won't be able to carry it very far."; ], time_out [; if (self in player) { print "^"; <>; } ]; Prop Nin_Building "tower" with name 'edifice' 'hall' 'tower' 'squat' 'serviceab' 'parapet' 'top' 'low' 'short', description [; "Ninario's tower is a short and squat two-storied affair, its shape much reminiscent of the contours of the wizard himself. It is constructed of rough grey stone, with a low parapet running around the top."; ], found_in W_Courtyard N_of_Tower Garden_Plot S_of_Tower Tower_Roof, before [; Enter: if (self in W_Courtyard) <>; if (self in Tower_Roof) <>; "You can't enter the tower from here!"; Climb: if (self in Tower_Roof) <>; if ((self in W_Courtyard && W_Bed_Window has open) || (self in N_of_Tower && N_Bed_Window has open)) { print "You grasp the rough stone walls firmly and haul yourself up the side of the tower and pull yourself, panting, into the bedroom.^"; PlayerTo(Bedroom); rtrue; } if ((self in S_of_Tower && S_Study_Window has open) || (self in Garden_Plot && E_Study_Window has open)) { print "You grasp the rough stone walls firmly and haul yourself up the side of the tower"; if (Ninario in Study) { give E_Study_Window ~open; give S_Study_Window ~open; ". Just before you reach the window however, Ninario wanders over and leans out. ~Ahem!~ he says, gazing down at you. ~If I had wanted a cat-burglar apprentice, I would have talked to the young lady who purloined that student retrieval scroll for me. I would appreciate if you restricted your climbing activities to the various staircases provided for the purpose. Mm-yes, indeed!~ He closes the windows firmly, wagging a finger at you.^ ^Disappointed, you slide back down to the ground."; } else { print " and pull yourself, panting, into the study, where you collapse noisily on the floor for a few moments before regaining your feet.^"; PlayerTo(Study); rtrue; } } "Unfortunately, the windows above are closed, and can't be opened from the outside... and it would be too difficult to climb all the way up to the top."; Examine: if (self in Tower_Roof) <>; rfalse; default: "You don't need to worry about the tower quite so much."; ]; Outroom W_Courtyard "Courtyard" with description [; if (location hasnt visited) give CourtMenu ~concealed; print "The whole interior of the caer is given over to a simple, large courtyard, enclosed by a tall wall of stone on all four sides. To the west, a large bailey passage tunnels through the thick wall of the caer to the outside world. On either side of the bailey, stairs ascend to the top of the outer wall. A flagstone path curves northeast and southeast around the base of the tower, and also extends west from the tower doorway to the large "; if (Portcullis has open) print "open portcullis"; else print "portcullis sealing off the bailey passage"; print " directly across the courtyard. Beyond the portcullis is a short passageway, followed by a set of iron-banded wooden doors"; if (Caer_Door has open) print ". They have been blasted apart, and hang limply from their hinges."; else print ", massive and imposing."; print " To the east is the passage back into the tower. ^^A large white fountain, shimmering with cascading water, sits majestically in the middle of the courtyard.^"; if (W_Bed_Window has general) "^Just north of the doorway into the tower, you can see many shards of glass from Ninario's bedroom window strewing the ground."; rtrue; ], Floor DIRT, Walls OUTSIDE, compass_look [obj; if (obj == n_obj or s_obj or sw_obj or nw_obj) "The wall of the caer stretches out before you."; if (obj == w_obj) { print "The flagstone path extends west from here to the "; if (Portcullis has open) print "open portcullis"; else print "portcullis sealing off the bailey passage "; " directly across the courtyard."; } if (obj == e_obj) "East, the stone passage heads back into the main hall of the tower."; if (obj == ne_obj) "The flagstone path leads northeast around the base of the tower to an open area north of the tower."; if (obj == se_obj) "The flagstone path leads southeast around the base of the tower to an open area south of the tower, where you can see a small shed."; TouchWalls(obj, self.Floor, self.Walls); rtrue; ], before [; Exit: if (player in location) <>; rfalse; ], w_to [; if (Portcullis has open) { print "You head west along the path, passing under the raised portcullis and into the bailey.^"; return Portcullis; } else "The portcullis blocks further passage to the west."; ], Carpet_Go [; PlayerTo(Market_Square); rfalse; ], cant_go "From here, you can follow the path northeast or southeast around the tower, head west to the portcullis, climb up to the top of the wall, or head east back into the tower.", u_to [; print "You clamber up the stairs beside the bailey.^"; return Atop_West_Wall; ], e_to [; print "You head down the stone passageway back into the gloom of the tower.^"; return Main_Hall; ], ne_to [; print "You follow the path northeast around the corner of the tower.^"; return N_of_Tower; ], se_to [; print "You follow the path southeast around the corner of the tower.^"; return S_of_Tower; ]; Prop -> Fountain "large elaborate fountain" with name 'large' 'elaborate' 'fountain', description "Clear glittering water cascades down over the pristine alabaster surfaces of the fountain. Small marble figurines line the rim of the fountain. The base of the fountain is full of water.", add_to_scope [; if (W_Bed_Window has general && location == W_Courtyard) AddToScope(Shards); AddToScope(Figurines); AddToScope(Fountain_Water); ], before [; if (location == Tower_Roof && action ~= ##Examine or ##Search or ##AimAt or ##FireAt or ##Fire) "You can't do that from up here on the tower."; if (location == Library or Bedroom && action ~= ##Examine) "You can't do that from up here in the ", (ToLower)location, (string)period; Attack: <>; Empty: if (TestScope(Watering_Can) && (Watering_Can.current < Watering_Can.maximum)) <>; else if (TestScope(Chamberpot) && (Chamberpot.current < Chamberpot.maximum)) <>; else "You don't appear to have any vessels with room for water."; EmptyT: if (second ofclass Jug) <>; Enter: "You would get your feet all wet if you did that."; Fill: "The fountain is already full of water."; ReachIn: "You swish your hand around in the water, but don't come up with anything."; Receive: if (noun ofclass Water) { remove noun; "You pour the water into the fountain."; } if (noun ofclass Jug) { <>; } if (noun == magic_clothes) { <>; } if (noun == Stone_Bottle || noun ofclass Substance) "You'd contaminate Ninario's drinking water if you did that!"; "That would get ", (the) noun, " all wet!"; Search: print "The fountain is full of clear glittering water that continuously cascades from the top down into the base."; if (Cannonball in self) " There appears to be a large cannonball sitting in the water."; new_line; rtrue; ], has container open; Prop -> Figurines "figurines" with name 'small' 'marble' 'figurines' 'rabbits' 'bunnies', article "some", description "The delicate figurines are exquisitely sculpted in marble, yet somehow they lack the statuesque majesty of most sculptures. Perhaps this is because they are exquisitely sculpted marble rabbits. They line the fountain, spraying water into it around the sides of their prominent front teeth.", before [; if (location == Tower_Roof && action ~= ##Examine or ##Search or ##AimAt or ##FireAt or ##Fire) "You can't do that from up here on the tower."; if (location == Library or Bedroom && action ~= ##Examine) "You can't do that from up here in the ", (ToLower)location, (string)period; Attack: if (Ninario in Study) "Just as you are preparing to turn the helpless little marble rabbits into helpless little marble fragments, you hear a tapping from the library windows. Glancing up, you see Ninario looking down at you, frowning. He wags his finger at you and shakes his head. You see his lips form the words, ~Mm-yes. No!~"; else "You prepare to launch your vicious attack on the helpless marble rabbits, and suddenly, you stop and remember reading ~Watership Down~ for the first time as a young child. Why, that rabbit on the end looks just like Fiver. And there's little Hlao-roo. You shed a beautiful crystal tear of regret at your lost childhood and halt your monstrous assault. Frith and Inl@'e! It would be like stomping on Hazel-rah and all the loyal companions of your childhood."; ], has pluralname; Prop Courtyard "courtyard" with name 'courtyard', description [; if (location == W_Courtyard or S_of_Tower or N_of_Tower or Garden_Plot) <>; "The large dirt courtyard is spread out below, a huge stone wall running along the edge of it."; ], found_in W_Courtyard S_of_Tower N_of_Tower Garden_Plot Tower_Roof, FakeObj, before [; Examine: rfalse; default: "You don't have to worry about doing that to the courtyard."; ]; Prop Dirt_Obj "dirt" with name 'dry' 'packed' 'dirt' 'grounds', description "The floor of the courtyard is dry, packed dirt.", FakeObj, found_in W_Courtyard S_of_Tower N_of_Tower Garden_Plot, before [; Examine: rfalse; Dig: <>; default: "You mentally check your list of things to worry about and are pleased to discover that the dirt in the courtyard is not on there."; ]; Prop Caerwall_Obj "caer wall" with name 'caer' 'wall', description "The caer wall runs around the entire perimeter of the courtyard.", FakeObj, found_in W_Courtyard S_of_Tower N_of_Tower Garden_Plot, before [; Climb: if (real_location == W_Courtyard) <>; if (real_location ~= W_Courtyard or S_of_Tower or N_of_Tower or Garden_Plot) "You can't do that from here!"; "It's far too tall to climb."; Examine: rfalse; default: "You shouldn't worry about the caer wall so much."; ]; Object Fountain_Water "water from the fountain" W_Courtyard with pname '.x' 'fountain' 'water', article "some", before [; if (location == Tower_Roof && action ~= ##Examine or ##Search or ##AimAt or ##FireAt or ##Fire) "You can't do that from up here on the tower."; if (location == Library or Bedroom && action ~= ##Examine) "You can't do that from up here in the ", (ToLower)location, (string)period; EmptyT: if (TestScope(Can_Water)) <>; if (TestScope(Chamberpot_Water)) <>; if (TestScope(Helmet_Water)) <>; Enter: <>; Examine: "The water is clear and glittering."; Drink: if (Thirsty == true) { Thirsty = false; "You take a long satisfying drink from the fountain."; } "You're not thirsty."; Insert: <>; Take: if ((Chamberpot notin player) && (Watering_Can notin player)) "You have nothing suitable for carrying the water."; if (Chamberpot in player && (Chamberpot.current < Chamberpot.maximum)) <>; if (Watering_Can in player && (Watering_Can.current < Watering_Can.maximum)) <>; if (Helmet in player && (Helmet.current < Helmet.maximum)) <>; "All the vessels you have are already full."; ], has scenery is_liquid; Water Chamberpot_Water "water in the chamberpot" with pname '.x' 'chamberpot' 'water', before [; Drink: if (Thirsty == true) { Thirsty = false; remove self; Chamberpot.current = 0; "Shrugging aside your mental objections to drinking water from any chamberpot, let alone someone else's, you take a long satisfying drink, draining the chamberpot."; } "You're not thirsty."; Drop,Empty: <>; EmptyT: <>; ]; Water Can_Water "water in the can" with pname '.x' 'can' 'water', before [; Drink: if (Thirsty == true) { Thirsty = false; remove self; Watering_Can.draining = false; Watering_Can.current = 0; "The watering can is not an ideal drinking vessel, but you take a long satisfying drink, spilling the rest of the water in the process. The water has a rusty, metallic taste."; } "You're not thirsty."; Drop,Empty: <>; EmptyT: <>; ]; Water Helmet_Water "water in the helmet" with pname '.x' 'helmet' 'water', before [; Drink: if (Thirsty == true) { Thirsty = false; remove self; Helmet.current = 0; "You take a long drink from the water in the helmet, draining it. The water tastes a little metallic and rusty, but otherwise not bad."; } "You're not thirsty."; Drop,Empty: <>; EmptyT: <>; ]; Prop Stairs "stairs" with name 'sturdy' 'stone' 'stairs' 'stair' 'step' 'steps', description [; if (self in W_Courtyard) "Sturdy stone stairs, chipped and weathered, ascend to the top of the wall on either side of the bailey."; if (self in Atop_West_Wall) "The chipped and weathered stairs lead back down to the courtyard."; ], before [; Climb: if (self in W_Courtyard) <>; else <>; ], found_in W_Courtyard Atop_West_Wall, has pluralname; Object Portcullis "portcullis" with name 'portculli' 'port' 'heavy' 'iron' 'gate' 'gates', description [; if (self has open) "The portcullis has been raised up into the stone wall."; print "The portcullis is a heavy iron gate, blocking passage to the west."; if (location ~= Tower_Roof) print " As you look at it more closely, you can see heavy chains attached to the top of the gate."; new_line; rtrue; ], add_to_scope Caer_Door, before [; if (location == Tower_Roof && action ~= ##Examine or ##Search or ##AimAt or ##FireAt or ##Fire) "You can't do that from up here on the tower."; if (location == Library or Bedroom && action ~= ##Examine) "You can't do that from up here in the ", (ToLower)location, (string)period; Search: <>; Lift: if (self has open) "The portcullis is already raised."; "Perhaps there's a mechanism somewhere to do that."; Open,Unlock: if (self has open) "The portcullis is already raised."; "You'll have to find some way to raise it."; Close,Lock: if (self has open) "After all the trouble you went to raising it, you decide to leave it up."; "The portcullis is already closed."; ], found_in Bailey W_Courtyard, door_dir [; if (self in Bailey) return e_to; return w_to; ], door_to [; if (self in Bailey) return W_Courtyard; return Bailey; ], has scenery door openable; Object chains "chains" with name 'chains', found_in W_Courtyard Bailey Gatehouse, description [; if (self in Gatehouse) "The heavy chains rise up out of holes in the floor to loop around some of the gears on the machine."; if (Portcullis has open) "Now that the portcullis has been raised, the chains have been drawn up into the walls of the bailey."; "The heavy chains run from the portcullis up into the stone walls of the bailey itself."; ], before [; Examine: rfalse; default: "Manipulating the chains directly doesn't seem to do much."; ], has scenery; Prop Stone_Path "stone path" with name 'stone' 'path' 'pathway' 'flag' 'stones' 'flagstone', found_in W_Courtyard N_of_Tower Garden_Plot S_of_Tower, description [; print "The path is made up of large flagstones, and runs around the tower "; if (self in N_of_Tower) "to the southwest and southeast."; if (self in S_of_Tower) "to the northwest and northeast."; if (self in Garden_Plot) "to the northwest and southwest."; if (self in W_Courtyard) { print "to the northeast and southeast. From here, it also extends west across the courtyard to the "; if (Portcullis has open) print "portcullis opening "; else print "closed portcullis "; "in the western wall."; } else new_line; rtrue; ], before [; if (location == Study && action_to_be ~= ##Examine) "It would be hard to do that from up here in the study."; Follow: if (location == W_Courtyard) <>; if (location == N_of_Tower) <>; if (location == Garden_Plot) <>; <>; ]; Room Bailey "Bailey" with description [; print "This short stone passageway leads from the portcullis to the east to the large double doors out of the caer to the west. Looking up, you can see several holes bored through the stone ceiling, presumably for dropping boiling oil or water down on the heads of invaders. West, "; if (Caer_Door has open) "the huge iron-banded double doors have been blasted apart, and hang limply from their hinges."; "huge iron-banded double doors loom imposingly."; ], compass_look [obj; if (obj == e_obj) "The courtyard lies back to the east."; if (obj == w_obj) <>; TouchWalls(obj, self.Floor, self.Walls); rtrue; ], before [; Exit: if (player in location) { if (Caer_Door has open) <>; <>; } rfalse; ], Floor DIRT, Walls ROUGH_STONE, cant_go "You can only go west towards the doors or east back to the courtyard.", u_to "The murder holes are too high overhead to reach.", e_to Portcullis, w_to Caer_Door; Object Caer_Door "huge wooden doors" with name 'huge' 'wooden' 'iron-banded' 'doors' 'door' 'lock', description [; if (location == Bailey) { if (self has open) "The twisted remains of the doors lead out of the caer to a dry and dusty road beyond."; else "These wooden doors lead outside the caer. They are large and imposing, and reinforced with large strips of iron. They loom here imposingly, blocking your way out of the caer."; } else if (location == Dusty_Road) { print "The twisted remains of the doors lead back to the bailey. "; } else { print "The wooden doors look large and imposing, reinforced with large strips of iron. "; } if (self has open) "They have been mercilessly blasted apart by your earlier violence."; "They loom imposingly, blocking the way out of the caer."; ], DeadWood true, found_in Bailey Dusty_Road, before [; if (location == Tower_Roof && action ~= ##Examine or ##Search or ##AimAt or ##FireAt or ##Fire) "You can't do that from up here on the tower."; if (location == W_Courtyard && action ~= ##Examine) "You can't do that from here."; if (location == Library or Bedroom && action ~= ##Examine) "You can't do that from up here in the ", (ToLower)location, (string)period; Close,Lock: if (self has open) "The doors have been wrenched from their hinges."; "The doors are already securely well-closed and fastened."; HandDrill: if (self has open) "The doors have been wrenched from their hinges."; "You begin drilling the doors, slowly turning the drill. After several minutes of fruitless drilling, your hand aches, and you realise it's going to take something a lot more powerful to get through these doors."; Open,Unlock: if (self has open) "The doors have been wrenched from their hinges."; "The doors appear well and truly locked, and you don't have a key to fit the massive lock."; Search: if (self has open) { print "Looking through ", (the) self, " you see "; if (self.door_to() ofclass Outroom) print "the ", (name)self.door_to(), " area"; else if (self.door_to() hasnt proper) print "the ", (ToLower)self.door_to(); else print "the interior of ", (name)self.door_to(); print_ret ", but you'll have to step through to make out any further details."; } <>; Take: "The doors are far too large to take. Besides, you're not certain you even like the colour."; ], door_dir [; if (self in Bailey) return w_to; return e_to; ], door_to [; if (self in Bailey) return Dusty_Road; return Bailey; ], has scenery door pluralname; Outroom N_of_Tower "North of Tower" with description [; print "The northern part of the courtyard is a wide and open space, with hard-packed dirt underfoot. To the north, the wall of the caer runs east and west. The main courtyard can be reached by heading southwest along the stone path, while to the southeast, the path continues around the base of the tower, to where the courtyard opens out into a wide plot of earth.^"; if (N_Bed_Window has general) "^The ground here is strewn with many shards of glass."; rtrue; ], Carpet_Go [; PlayerTo(Market_Square); rfalse; ], compass_look [obj; if (obj == n_obj or nw_obj or ne_obj or w_obj) "The wall of the caer stretches out before you."; if (obj == ne_obj) "The flagstone path leads northeast around the base of the tower to an open area north of the tower."; if (obj == se_obj) "The flagstone path continues southeast around the base of the tower to where the courtyard opens out into a wide plot of earth."; if (obj == sw_obj) "The main area of the courtyard lies back to the southwest."; if (obj == s_obj) "The grey stone wall of Ninario's tower lies directly south of you."; TouchWalls(obj, self.Floor, self.Walls); rtrue; ], cant_go "From here, you can follow the stone path southeast or southwest around the tower.", u_to [; <>; ], sw_to [; print "You follow the path southwest back to the courtyard.^"; return W_Courtyard; ], se_to [; print "You follow the path southeast to the garden plot.^"; return Garden_Plot; ]; Object Shards "shards of glass", with name 'shards' 'of' 'glass', parse_name ParseNameOf, article "many", before [; default: "The shards of glass are strewn all over the ground, under the remains of a smashed window above. They're sharp and dangerous, and you should leave them alone. You've caused enough damage already today."; ], has scenery pluralname; Outroom Garden_Plot "Garden Plot" with description [; print "A large plot of earth has been cleared here, as though there was a garden at one time, but it is now barren and lifeless. To the east is the wall of the caer running north and south. Paths head northwest and southwest around the base of the tower.^"; if (E_Study_Window has general) "^Shards of glass from the study window litter the ground here."; rtrue; ], Carpet_Go [; PlayerTo(Market_Square); rfalse; ], compass_look [obj; if (obj == n_obj or ne_obj or se_obj or e_obj) "The wall of the caer stretches out before you."; if (obj == nw_obj) "The flagstone path leads northwest around the base of the tower to an open area north of the tower."; if (obj == sw_obj) "The flagstone path leads southwest around the base of the tower to an open area south of the tower, where you can see a small shed."; if (obj == w_obj) "The grey stone wall of Ninario's tower lies directly west of you."; TouchWalls(obj, self.Floor, self.Walls); rtrue; ], u_to [; <>; ], cant_go "You can go either northwest or southwest along the stone path.", e_to "You wander around on the cleared plot of earth, but don't find anything of interest.", nw_to [; print "You follow the path northwest around the base of the tower.^"; return N_of_Tower; ], sw_to [; print "You follow the path southwest around the base of the tower.^"; return S_of_Tower; ]; Prop -> Plot "plot of earth" with name 'plot' 'of' 'earth' 'garden', parse_name ParseNameOf, description "The plot of earth is barren and lifeless. It must not have been tilled or planted in years.", add_to_scope [; if (N_Bed_Window has general) AddToScope(Shards); ], before [; Dig: "You dig away merrily in the dirt, enjoying yourself immensely. You don't, however, uncover anything interesting. You stand back up, dusting the earth off your hands."; Enter: <>; ]; Outroom S_of_Tower "South of Tower" with description [; if (location hasnt visited) give Shedhint ~concealed; print "The path around the tower branches here, with a small pebbled walk heading south to the door of a small wooden shed. Beyond the shed the wall of the caer runs east and west. The stone path heads northwest to the courtyard, and northeast to where it opens out into a wide plot of earth.^"; if (S_Study_Window has general) "^Shards of glass from the study window litter the ground here."; rtrue; ], Carpet_Go [; PlayerTo(Market_Square); rfalse; ], before [; GoIn: <>; ], compass_look [obj; if (obj == se_obj or sw_obj or w_obj) "The wall of the caer stretches out before you."; if (obj == nw_obj) "The flagstone path leads northwest around the base of the tower back to the main courtyard."; if (obj == ne_obj) "The flagstone path heads northeast around the base of the tower to where the courtyard opens out into a wide plot of earth."; if (obj == n_obj) "The grey stone wall of Ninario's tower lies directly north of you."; if (obj == s_obj) <>; TouchWalls(obj, self.Floor, self.Walls); rtrue; ], cant_go "You can head northeast to the garden plot, northwest to the courtyard or south to the shed.", u_to [; <>; ], nw_to [; print "You follow the path northwest, back to the courtyard.^"; return W_Courtyard; ], ne_to [; print "You follow the path northeast to the garden plot.^"; return Garden_Plot; ], s_to [; if (Shed_Door has open) { print "You step into the shed.^"; return Shed_Door; } if (Shed_Door has locked) "You try to enter the shed, but the lock is rusted shut."; give Shed_Door open; give Shed light; print "Its lock now damaged and useless, the shed door opens easily, and you step inside.^"; return Shed_Door; ]; Prop -> Pebbled_Walk "pebbled walk" with name 'pebbled' 'walk', description "The small pebbled walk runs from the stone path to the door of the shed.", add_to_scope [; if (S_Study_Window has general) AddToScope(Shards); ], before [; if (location ~= S_of_Tower && action_to_be ~= ##Examine) "You can't really do that from here."; Follow: <>; ]; Object Shed_Door "shed door" with name 'shed' 'door', parse_name [wd num; wd = NextWord(); while (WordInProperty(wd, self, name)) { if (action_to_be == ##Open && real_location == Shed or S_of_Tower) { if (self hasnt open || wd == 'shed') num = num + 10; else if (real_location == Shed) num = 0; else ++num; } else if (action_to_be == ##Close && real_location == Shed or S_of_Tower) { if (self has open) { if (Trapdoor has open && wd ~= 'shed' && real_location == Shed) num = 0; else num = num + 10; } else if (wd ~= 'shed' && real_location == Shed) { if (Trapdoor has open) num = 0; else ++num; } else ++num; } else if (action_to_be == ##Unlock && self has locked) num = num + 10; else if (action_to_be == ##Lock && self hasnt locked) num = num + 10; else ++num; wd = NextWord(); } return num; ], description [; print "The small wooden shed is remarkable in its unremarkableness. It looks like it hasn't been used in years."; if (real_location ~= S_of_Tower) { new_line; rtrue; } print " The door is "; if (self has open) "open."; print "closed"; if (self has locked) print ", the heavy iron lock badly rusted"; print_ret (string)period; ], DeadWood true, found_in Shed S_of_Tower, before [; if (real_location ~= S_of_Tower or Shed && action_to_be ~= ##Examine) "You can't really do that from here."; Enter: if (self in S_of_Tower) <>; <>; HandDrill: <>; Lock: if (self has locked) "After so many years of neglect, the lock is rusty enough that locking it is the least of your worries."; "You've managed to circumvent the lock. You can leave it alone now."; Open: if (self has locked) "After so many years of neglect, the lock has rusted shut."; Pull: if (self has locked) "You tug at the door, but its lock seems well and truly secure."; if (self has open) { if (self in S_of_Tower) "The shed door is already open."; <>; } if (self in S_of_Tower) <>; "The shed door is already closed."; Push: if (self has locked) <>; if (self has open) { if (self in Shed) "The shed door is already open."; <>; } if (self in Shed) <>; "The shed door is already closed."; Rub: if (self in Shed) <>; rfalse; Search: if (self in S_of_Tower) { if (self has open) "The small shed must have once been used to store gardening implements. There may still be some items in there, but you'll have to enter the shed to investigate further."; else "The shed door is closed."; } Unlock: if (self has locked) "After so many years of neglect, the lock has rusted shut."; "You've managed to circumvent the lock. You can leave it alone now."; ], door_dir [; if (self in Shed) return n_to; return s_to; ], door_to [; if (self in Shed) return S_of_Tower; return Shed; ], after [; Open: give Shed light; if (Trapdoor has open) give UnderShed light; "Its lock now damaged and useless, the shed door opens easily."; Close: give Shed ~light; give UnderShed ~light; ], has scenery door openable lockable locked; Object Shed_Lock "lock" with name 'lock' 'rust' 'rusty' 'hinge' 'hinges', description [; if (self.drilled == true) "The lock has been rendered superfluous through methodical drilling out of its tumblers."; if (self.eaten == true) "The lock has been rendered superfluous through the judicious use of muriatic acid."; "The lock is a heavy iron affair. Rust covers it, and you doubt you could open it even if you had the right key."; ], before [; HandDrill: if (self.drilled == true) "The lock needs no further drilling."; if (self.eaten == true) <>; self.drilled = true; give Shed_Door ~locked; "You place the end of the drill against the rusted lock and slowly and methodically begin drilling out the tumblers. Long after your hand tires of cranking the drill, you finally have enough of the lock drilled away that you can open the door."; Close: <>; Lock: <>; Open: <>; Unlock: <>; ], found_in Shed S_of_Tower, drilled false, eaten false, has scenery; Room Shed "Inside the Shed" with description [; print "A small shed once used to store gardening implements. It is now mostly empty, with only a few broken remnants of garden tools remaining. A large trap door "; if (Trapdoor has open) print "gapes open here, revealing worn stone steps leading downward."; else print "lies in the floor of the shed."; if (Shed_Door has open) " Daylight streams through the open door to the north."; " The door to the north leads back outside."; ], compass_look [obj; if (obj == n_obj) <>; if (obj == d_obj) <>; TouchWalls(obj, self.Floor, self.Walls); rtrue; ], before [; GoIn: <>; Exit: if (player in location) <>; rfalse; ], Floor WOOD, Walls WOOD, cant_go [; if (location == thedark) print "As far as you can remember from when you could see, t"; else print "T"; "he way out is back north, unless you'd like to try the trap door below you."; ], n_to [; if (Shed_Door has open) { print "You step out of the shed.^"; } else { give Shed_Door open; give self light; if (Trapdoor has open) give UnderShed light; print "You open the shed door, and step outside.^"; } return Shed_Door; ], d_to [; if (Trapdoor has open) { print "You descend the worn stone steps.^"; } else { give Trapdoor open; if (Shed has light) give UnderShed light; print "You open the trap door, and descend the worn stone steps.^"; } return Trapdoor; ], has ~light; Jug -> Watering_Can "watering can" with name 'old' 'watering' 'can', maximum 5, hole false, draining false, time_left, description [; print "Spotted with rust, the old watering can has seen better days. "; if (self.hole == true) { print "There is a substantial hole in its side"; if (self.current > 0) print ", through which water slowly drips. "; else print ". "; } print "Despite the rust, the can looks still capable of holding water: 5 pints worth, to judge from the rusty ", (i) "5", " stamped into the side. It is currently "; switch(self.current) { 0: "empty."; 1: "one-fifth full."; 2: "two-fifths full."; 3: "three-fifths full."; 4: "four-fifths full."; 5: "full to the brim."; } ], initial [; "An old watering can, spotted with rust, sits amongst the broken tools."; ], each_turn [; if (self.hole == true) { if (self.current == 0) { StopTimer(self); if (self.draining == true) print "^The last bit of water in the can drains out.^"; self.draining = false; rtrue; } else "^Water drips slowly out of the watering can."; } ], time_out [; if (self.hole == true) if (self.current > 0) { self.current--; if (self.current == 0) remove Can_Water; else { StartTimer(self, 1); self.draining = true; } } ], before [; HandDrill: if (self.hole == true) "The watering can already has one hole in it. If you give it any more, it will be completely useless for holding water."; self.hole = true; if (self.current > 0) { StartTimer(self, 1); self.draining = true; } "You place the end of the drill against the watering can and quickly drill a hole through the rusty metal. You now have a slightly holed watering can."; Tie: if (self.hole == true) "Unfortunately, you've seen no sign of any welding equipment in this world."; ]; Prop -> Shed_Tools "broken garden tools" with name 'broken' 'garden' 'tools' 'rake' 'hoe' 'remnants' 'shovel', article "some", description "The broken tools sit here, neglected and rusted.", before [; Examine: rfalse; Rub: "You move some of the old tools around, but it doesn't get any tidier in here."; Search: "You rummage through the old tools, but they're all too broken and rusted to be of use to you."; default: "The tools are too broken and rusted to be of use."; ]; Object Trapdoor "trap door" with pname 'trapdoor' '.p' 'trap' 'door', description [; print "The trap door is a simple square of wood. "; if (self has open) "It is currently open."; "It is currently closed."; ], DeadWood true, before [; Enter: <>; Search: if (self has open) { if (self in Shed) "Looking through ", (the) self, " you see some worn stone steps leading downwards into a slimy passage."; print_ret (The) self, " opens up into the shed."; } <>; ], after [; Open: if (Shed has light) give UnderShed light; if (self in Shed) "You open the trap door, revealing worn stone steps leading downward."; else "You open the trap door."; Close: give UnderShed ~light; if (self in Shed) "You slam the trap door closed."; "You climb up a couple of steps, grab the trap door, and swing it closed."; ], found_in Shed UnderShed, door_dir [; if (self in Shed) return d_to; return u_to; ], door_to [; if (self in Shed) return UnderShed; return Shed; ], has scenery door openable; Prop Stone_Steps "worn stone steps" with name 'worn' 'stone' 'steps' 'stairs', article "some", description [; if (self in Shed) "The worn stone steps descend into darkness."; if (Trapdoor hasnt open) "The worn stone steps lead up to the closed trap door."; "The worn stone steps lead up to the shed."; ], before [; default: if (self in Shed && Trapdoor hasnt open) "You can't see any steps here!"; ], found_in Shed UnderShed, has pluralname; Room UnderShed "Slimy Passage" with description [; print "This narrow passage under the shed is dark, slimy and unpleasant. The passage continues north, and worn stone steps end at the "; if (Trapdoor has open) print "open "; "trap door above."; ], Floor SLIMY_STONE, Walls SLIMY_STONE, compass_look [obj; if (obj == u_obj) <>; if (obj == n_obj) "The slimy passage continues north into darkness."; TouchWalls(obj, self.Floor, self.Walls); rtrue; ], cant_go [; if (location == thedark) "It's so dark that the only direction you're sure of is the trapdoor above you."; "You can head farther north along the passage or up through the trap door."; ], u_to [; if (Trapdoor has open) { print "You ascend the worn stone steps into the shed.^"; return Trapdoor; } give Trapdoor open; print "You open the trap door, and ascend the worn stone steps into the shed.^"; return Trapdoor; ], n_to [; print "You scuttle along the narrow slimy passage.^"; return Slimy_Ledge; ], before [; Exit: if (player in location) <>; rfalse; Smell: if (noun == nothing) "A mouldy stench permeates this slimy passage."; rfalse; ], has ~light; Room Slimy_Ledge "Slimy Ledge", with description "The passage from the south ends here at a small slimy ledge that juts out over an open room below. The room down there appears to have been put into use as a rubbish tip for all of Ninario's cast-off spellcasting implements, bits of machinery and general odds and ends. The huge heap of rubbish takes up most of the floor space. North of the heap, a tunnel leads out of the room. Mouldy remnants of wood suggest steps might once have led up to this ledge but they have long since rotted away. It looks possible to clamber down into the room, but climbing back up would be another story.", Floor SLIMY_STONE, Walls SLIMY_STONE, before [; Exit: if (player in location) <>; rfalse; Climb: <>; Smell: if (noun == nothing) "The damp wet smell of stone fills your nostrils."; rfalse; ], compass_look [obj; if (obj == d_obj or n_obj) <>; if (obj == s_obj) "The slimy passage heads back south to the trap door."; TouchWalls(obj, self.Floor, self.Walls); rtrue; ], cant_go [; if (location == thedark) "You're extremely unsure of your footing in the dark, but you certain you can, at the least, safely head back south."; "You can head south back down the passage or clamber down to the rubbish heap."; ], n_to [; <>; ], s_to [; print "You crawl back south down the slimy passage.^"; return UnderShed; ], d_to [; print "You slip and slide dangerously down to the floor of the room.^"; return Rubbish_Room; ], has ~light; Outroom Atop_West_Wall "Atop the West Wall" with description "The landscape of this strange place stretches out from the caer west to the horizon. Cultivated fields are spread out below, a multicoloured cloak draped over the shoulders of the land. A dry ribbon of road runs past the caer heading northeast and southwest through the fields. Villages, visible as small clusters of buildings, dot the farmlands. The fields continue flat and level for quite some distance, gradually leading into more hilly country. Beyond the hills, far in the distance, the many spires and towers of a city or large fortress rise up to touch the sky.^ ^The caer wall stretches away to the north and south. The wall is very wide here, encompassing the entire width of the bailey below. A small stone building perches on the wall to the west. The courtyard is back down the stairs to the east.", Floor ROUGH_STONE, Walls ROUGH_STONE, compass_look [obj; if (obj == nw_obj or ne_obj) "Pastures and fields extend away to the ", (name)obj, " as far as the eye can see."; if (obj == d_obj or e_obj) "The courtyard lies back down the stairs."; if (obj == s_obj or n_obj) "The caer wall stretches away to ", (the) obj, ", beginning its circuit of the caer."; if (obj == w_obj) "Looking west, you can see a dry dusty road just outside the caer, running northeast and southwest."; if (obj == sw_obj) "Looking southwest from here, you can see the clustered buildings and spires of a small town or fortress on the horizon."; if (obj == u_obj) <>; "You don't see anything interesting in that direction, other than what's already been mentioned."; ], Carpet_Go [; PlayerTo(Dusty_Road); rfalse; ], before [; GoIn: <>; Jump: "It's just a little too far for you to feel comfortable jumping off the battlements."; ], cant_go "The courtyard is back down the stairs, the gatehouse is to the west, and the wall continues north and south from here.", w_to [; print "You step inside the gatehouse.^"; return Gatehouse; ], e_to [; <>; ], n_to "Rather than walking around the perimeter of the entire wall to end up right back here, you opt to save everyone's time and just stay put.", s_to [; <>; ], d_to [; print "You descend the weathered stone steps to the courtyard.^"; return W_Courtyard; ]; Prop Gate_Building "building" with name 'small' 'stone' 'building' 'gatehouse' 'battlemen', description [; if (self in Atop_West_Wall) "A small square stone building, perched on the western half of the wall."; else <>; ], found_in Atop_West_Wall Gatehouse, before [; Enter: <>; ]; Room Gatehouse "Gatehouse" with description [; if (location hasnt visited) { give HydroHints ~concealed; give LiqMenu ~concealed; } "The area above the bailey is a small, square stone room, bare and featureless but for the holes riddling the floor, used for pouring boiling oil or water over invaders in the bailey below. A doorway east leads back out to the top of the wall."; ], before [; Exit: if (player in location) <>; rfalse; ], compass_look [obj; if (obj == w_obj) <>; if (obj == d_obj) <>; if (obj == e_obj) "The doorway east leads back to the wall."; TouchWalls(obj, self.Floor, self.Walls); rtrue; ], cant_go [; <>; ], e_to [; print "You step out of the gatehouse and back onto the wall.^"; return Atop_West_Wall; ], d_to [; if (Portcullis has open) { if (Butter has worn) { print "You strain and squeeze, and feel yourself sliding through the hole. The butter makes all the difference. There is a slippery popping sound, and you tumble down into the bailey.^"; return Bailey; } "You strain and squeeze, but you can't manage to fit through the murder holes."; } "If you drop through the holes while the portcullis is closed, you'll end up stuck in the bailey!"; ]; Object -> Port_Machine "machine" with name 'machine' 'mechanism' 'device' 'scarred' 'rusted' 'strange' 'hydrolyti' 'counter-b', description "The machine looms ominously against the western wall of this room. It is scarred and pitted with age, the rusting metal of its construction flaking away. Various gears, hoses and wheels line the front of the machine and large chains rise up out of holes in the floor to loop around some of the gears on the machine.^ ^The most comprehensible part of the whole thing is a small funnel or spout that sticks out of the right hand side. There is a small brass plate affixed to the front of the machine.", initial [; "A scarred and rusted machine fills the western wall of the room."; ], before [; Burn: rfalse; Take,Pull,Push,PushDir: "The machine is far too big to move around in that fashion."; ], has static; Prop -> gears "gears, wheels and hoses" with name 'gears' 'wheels' 'hoses' 'gear' 'wheel', description "Gears, wheels and hoses of all shapes and sizes line the machine.", before [; Examine: rfalse; default: "The gears and wheels are too large to manipulate. Perhaps they would move if you could get the machine to run."; ]; Prop -> plaque "small brass plate" with name 'small' 'brass' 'plate' 'sign' 'plaque', description [; font off; print " Hydrolytic Counterbalancing Machine^"; print " MARK IV ^ *** THESE MACHINES ARE FACTORY CALIBRATED *** ^ *** FOR SPECIFIC QUANTITIES OF FLUIDS *** ^ (See manual for specifications) ^ Use of other than calibrated quantities ^ will not harm the machine but may ^ result in improper operation."; font on; new_line; rtrue; ]; Jug -> Funnel "funnel" with name 'funnel' 'spout' 'hole', maximum 5, description "The funnel sticks out from the right-hand side of the machine. The rust staining its metal bears evidence to its use for receiving liquid.", each_turn [; if (self.current == 0) rfalse; print "^The water swishes around the funnel and drains away into the bowels of the machine. "; if (Portcullis has open) { self.current = 0; remove child(self); " However, nothing further happens as the portcullis has already been raised."; } if (self.current < 4) { self.current = 0; remove child(self); "There is a grinding, shuddering noise. The machine shakes and the wheels, groaning, seem to strain against it, trying to move, but failing. The machine seems almost to sigh as it gives up and the wheels stop straining."; } if (self.current > 4) { self.current = 0; remove child(self); "With a great shuddering noise, the machine starts to shake. The wheels strain and groan, and suddenly, spin wildly about. The machine roars with fury and glee as it applies all the excessive power at its command. A great rumbling and a great clattering noise comes from below. The clattering stops with a great crash. After a second, the clattering sounds again, and an even greater crash issues from the machine. Then, all is silent. Nothing has changed, save for the steam rising gently from the top of the machine."; } if (self.current == 4) { self.current = 0; remove child(self); Achieved(7); give Portcullis open; if (Cannon.aimed_at == Portcullis) Cannon.aimed_at = Caer_Door; move Hose to location; "The machine lets out a great shuddering noise, and begins to shake. The wheels strain and groan, and then suddenly start turning. A great rumbling and a clattering noise come from below. The portcullis is opening!^ ^The machine strains and rumbles and suddenly with a hissing of air, one of the hoses snaps free and falls to the ground.^ ^As if the snapping of the hose was a signal to stop, the wheels slow, and the clattering subsides. The machine falls silent."; } ], before [; Receive: if (Portcullis hasnt open) { if (second == HCl) "Pouring muriatic acid into the machine would only damage it."; if (second ofclass Water) <>; else "The funnel is meant for liquids."; } else "The machine has served its purpose."; ], has scenery; Prop Murder_Hole "murder holes" with name 'murder' 'hole' 'holes' 'opening', article "some", description [; print "The murder holes open into the "; if (self in Gatehouse) print "bailey below"; else print "gatehouse above"; ". They are used to pour boiling oil and water over attackers, while they attempt to break through the portcullis."; ], found_in Gatehouse Bailey, before [; Attack: "Your brutal and senseless attack passes through the holes like they weren't even there."; Search: print "Looking "; if (self in Gatehouse) print "down into"; else print "up through"; print " the holes, you can see the "; if (self in Gatehouse) "bailey below."; else "gatehouse above."; Enter: if (self in Gatehouse) <>; <>; Receive: if (self in Bailey) "How do you propose to do that from down here?"; if (noun ofclass Water) { remove noun; "You pour the water into the hole. It splashes down to the bailey floor below."; } if (noun == Chamberpot) { remove Chamberpot; "You drop ", (the) noun, " into one of the holes. It falls to the bailey floor below, and smashes on impact."; } move noun to Bailey; print "You drop ", (the) noun, " into the hole. "; if (noun has pluralname) print " They fall "; else print " It falls "; "to the bailey floor below."; Use: if (self in Bailey) "How do you propose to do that from down here?"; "This isn't a garderobe, you know."; ], has container open pluralname; Object Hose "black rubber hose" with name 'short' 'length' 'black' 'rubber' 'hose', description [; print "A short length of black rubber hose"; if (Valve.Hose_On == true) { print ", one end attached to the nozzle"; if (Vent.Hose_On == true) print ", the other inserted into the air intake vent"; } else if (Vent.Hose_On == true) { print ", one end attached to the nozzle"; } print_ret (string)period; ], invent [; ! When listing objects in player's inventory if (c_style & FULLINV_BIT) { print "a black rubber hose"; if (Valve.Hose_On == true) print " (attached to the nozzle)"; if (Vent.Hose_On == true) print " (inserted into air intake vent)"; rtrue; } ], initial [; "A short length of rubber hose, wrenched from the machine when the portcullis opened, lies on the floor."; ], describe [; print "^A short length of rubber hose lies here"; if (Valve.Hose_On == true) { print ", one end attached to the nozzle"; if (Vent.Hose_On == true) print ", the other inserted into the air intake vent"; } else if (Vent.Hose_On == true) { print ", one end attached to the nozzle"; } print_ret (string)period; ], before [; Insert: if (second == Vent or Valve) <>; Tie: if (second == Cord) "The hose is a little too rigid to allow you to easily knot it around the cord."; if (second == Cannon) "Tying the hose to the cannon and launching yourself, slingshot-style, over the wall is an excellent idea in theory, but in practice, the hose just isn't springy enough."; if (second == Vent) { if (Vent.Hose_On == true) "One end of the hose has already been slid into the air intake vent."; if (Valve.Hose_On == true) { print "You take the other end of the hose and slide it through the grille on the air intake vent, laying the hose carefully across the floor as you do so."; move Hose to location; } else print "You take one end of the hose and slide it through the grille on the air intake vent."; Vent.Hose_On = true; new_line; rtrue; } else if (second == Valve) { if (Valve.Hose_On == true) "One end of the hose has already been slid over the nozzle."; if (Vent.Hose_On == true) { print "You take the other end of the hose and slide it over the nozzle, setting the hose on the floor as you do so."; move Hose to location; } else print "You slide one end of the hose over the nozzle."; Valve.Hose_On = true; new_line; rtrue; } "It's unclear what good that would do."; ], after [; Insert: "You curl up the hose and place it in ", (the) second, (string)period; Take: if (Valve.Hose_On == true || Vent.Hose_On == true) { Valve.Hose_On = false; Vent.Hose_On = false; "You detach the hose and pick it up."; } ]; Outroom Dusty_Road "Dusty Road" with description "The dusty road is a dry brown ribbon of earth running northeast and southwest. The sun shines down from high overhead, the warm baking heat of high summer. A meandering country fence runs along the edge of the road to the northwest. East, the huge wooden doors into the caer hang dispiritedly from their hinges, twisted hunks of wood and iron.", Carpet_Go [; PlayerTo(Tower_Roof); rfalse; ], compass_look [obj; if (obj == ne_obj) "The dusty road winds away to the northeast. You can just make out what looks like a farm on the horizon."; if (obj == sw_obj) "The dusty road winds away to the southwest, leading to the clustered buildings and spires of a small town or fortress on the horizon."; if (obj == e_obj) "The huge wooden doors into the caer hang dispiritedly from their hinges, twisted hunks of wood and iron."; if (obj == nw_obj or n_obj or w_obj or se_obj or s_obj) "Pastures and fields extend away to the ", (name)obj, " as far as the eye can see."; if (obj == u_obj) <>; "You don't see anything interesting in that direction, other than what's already been mentioned."; ], cant_go "From here you can head east back into the bailey, or along the road to the northeast or southwest.", nw_to "You step over the fence and wander around the field for a short while, clearing your head before you return to the road.", w_to [; <>; ], n_to [; <>; ], ne_to [; print "You walk northeast along the road, your feet kicking up a small cloud of dust. The road is long and twisting but eventually ends at a farm gate.^"; return Farm_Gate; ], e_to [; print "You step through the twisted remains of the doors back into the bailey.^"; return Caer_Door; ], sw_to [; print "You march down the long southwest road, dust billowing around your feet. The road is long and straight, an arrow fired directly southwest. After a lengthy walk, you arrive at the Vechlee town gate and step through into the bustle of the town.^"; return Vechlee_Gate; ]; Prop Road_Obj "dry dusty road" with name 'dry' 'dusty' 'road', description "The road is a dry dusty ribbon of earth.", FakeObj, found_in Dusty_Road Farm_Gate, before [; Examine: rfalse; Lick,Taste: "It's dry and dusty."; Dig: <>; default: "You shouldn't worry about the road so much. It can take care of itself."; ]; Prop Fence "wooden fence" with name 'wooden' 'fence' 'fences', description "The fence is a long low wooden barrier, built by the owner of the fields to keep livestock in the meadow, although there are no signs of livestock there right now.", found_in Dusty_Road Farm_Gate, before [; Climb: if (self in Farm_Gate) <>; <>; ], DeadWood true; Room Basement "Basement" with description [; if (real_location hasnt visited) give BasementMenu ~concealed; "The slow drip of water echoes through this dark and damp room. The walls and floor are wet with moisture, and the air seems stuffy and unclean. A doorway opens to the north, and a most unwholesome odour emanates from that direction. The spiral staircase climbs back up to the main hall here, and a narrow slimy passage heads south."; ], Floor DAMP_STONE, Walls DAMP_STONE, compass_look [obj; if (obj == n_obj) "A dank and dark room lies to the north."; if (obj == s_obj) "A narrow slimy passage heads south."; if (obj == u_obj) "The spiral staircase ascends to the main hall above."; TouchWalls(obj, self.Floor, self.Walls); rtrue; ], cant_go [; if (location == thedark) "You're unsure of all the directions in the dark, but you know the stairs are here, leading back up to the main hall and daylight."; "You can take the doorway north, the passage south, or head back up the stairs."; ], n_to [; print "Braving the foul odour, you step through the doorway.^"; return Sewer; ], u_to [; print "You trudge back up the rickety stairs into the brightness of the main hall.^"; return Main_Hall; ], s_to [; print "You head south down the slimy passage.^"; return Rubbish_Room; ], before [; Exit: if (player in location) <>; rfalse; Smell: if (noun == nothing) "An unwholesome odour wafts into this room from the doorway to the north."; rfalse; ], has ~light; Room Rubbish_Room "Rubbish Heap" with description [; if (real_location hasnt visited) give RubbishHints ~concealed; "This small room has been put into use as a rubbish tip for all of Ninario's cast-off spellcasting implements, bits of machinery and general odds and ends. About the only place to stand is here in the doorway heading back north, as the huge heap of rubbish takes up most of the floor space. At the south end of this room are the dim beginnings of a passage heading upwards, but whatever set of stairs or ladder led up there has long since rotted away."; ], Floor DAMP_STONE, Walls DAMP_STONE, compass_look [obj; if (obj == n_obj) "The narrow slimy passage heads back to the basement."; if (obj == s_obj or u_obj) "Whatever set of stairs or ladder led up to the passage has long since rotted away."; TouchWalls(obj, self.Floor, self.Walls); rtrue; ], before [; Exit: if (player in location) <>; rfalse; Climb,Enter: if (noun == Rubbish_Heap or u_obj) "You clamber up onto the rubbish heap, but bits of it slip and slide under your feet, pitching you back to the ground."; rfalse; Smell: if (noun == nothing) "The damp wet smell of stone fills your nostrils."; rfalse; ], cant_go [; if (location == thedark) "The only direction you're sure of in all this blackness is north back to the basement."; "The only way out of here is north to the basement."; ], n_to [; print "You head along the slimy passage to the basement.^"; return Basement; ], s_to "You can't reach high enough to pull yourself into the passage.", u_to [; <>; ], has ~light; Prop -> Passage "passage" with name 'passage' 'hole', description "The passage heads upward at a forty-five degree angle, but is far too high to reach.", before [; Examine: rfalse; default: <>; ]; Jug -> Helmet "rusty helmet" with name 'rusty' 'helmet' 'helm' 'hat' 'plumes', maximum 1, description [; print "A rusty old medieval helmet, with sturdy metal bracing over the facial area, and beautiful red plumes set in the top. The interior of the helmet is extremely well-padded and reinforced."; if (self.current == 1) print " It currently contains 1 pint of water."; new_line; rtrue; ], before [; if (self has concealed && action ~= ##Take) { "You can't see any such thing."; } Take: if (self has concealed) <>; rfalse; Wear: if (Chamberpot has worn) "But you've already got the chamberpot on your head!"; if (self.current > 0) "Just before you place the helmet on your head, you remember that it's got water in it, so you decide against it."; ], after [; Disrobe: if (Bearskin_Rug has worn) "You slip off the rug, remove the helmet and then put the rug back on."; Take: if (self hasnt moved) "You dig it out of the heap and take it."; Wear: if (Bearskin_Rug has worn) { print "You slip the helmet on "; if (goggles has worn) { print "over the goggles, and "; } "under the bearskin rug."; } if (goggles has worn) { "You slip the helmet on over the goggles."; } ], has concealed clothing; Prop Rubbish_Heap "heap of rubbish" with name 'heap' 'of' 'refuse' 'rubbish' 'room' 'bits' 'odds' 'ends' 'tip' 'machinery' 'spellcast' 'implement' 'cast-off' 'garbage' 'dump' 'cast-offs' 'items' 'pile' 'rubish', parse_name ParseNameOf, found_in Rubbish_Room Slimy_Ledge, description [; print "The heap of rubbish towers about five feet in the air, and is made up of all kinds of different items.^"; if (self hasnt general) { new_line; <>; } rtrue; ], before [; if (self in Slimy_Ledge && action ~= ##Examine) "You'll have to climb down into the room first."; Rub: <>; Search: if (self has general) "You search the heap of rubbish again, but don't find anything."; give self general; give Helmet ~concealed; print "You dig through the dirty and unpleasant heap for a short time, and uncover a rusty but serviceable helmet!^^"; <>; Take: "You can't take the entire heap of rubbish with you."; ]; Room Sewer "Sewer" with description [; if (real_location hasnt visited) give SewerHints ~concealed; print "Dank and dark, this is one of the less memorable attractions you've visited. You're not certain how often Ninario has this room cleaned, but the stench is horrendous. "; if (Sewer_Vat.clean == false) print "A miasma of gas seems to hang in the air, visible as a shimmering in the corner of your eye. "; "The basement lies back through the doorway to the south.^ ^A vat looms here, six feet high, and constructed of stone, with a metal ladder leading up to the rim. There is a large stone channel connected to the bottom of the vat, where waste is supposed to exit the vat. The channel leads along the floor to the wall, where you can see the lip of a small outflow pipe."; ], compass_look [obj; if (obj == s_obj) "The basement lies back through the doorway to the south."; if (obj == n_obj) <>; TouchWalls(obj, self.Floor, self.Walls); rtrue; ], before [; Climb: if ( noun == u_obj or Metal_Ladder) { if (player in Sewer_Vat) <>; else <>; } Exit: if (player in location) <>; rfalse; Go: if ( player in Sewer_Vat && noun == u_obj) <>; if ( player in Sewer_Channel && noun == u_obj) <>; Touch, Examine: if ( player in Sewer_Vat && noun == d_obj) "The floor of the vat is slippery with slime."; if (player in Sewer_Vat && noun ofclass CompassDirection) "The walls of the vat are slippery with slime."; if ( player in Sewer_Channel && noun == d_obj) "The stone channel is cold to the touch."; if ( player in Sewer_Vat && noun == Sewer_Channel or Sewer_Pipe) "You can't reach that from here."; rfalse; Smell: if (noun == nothing) "Foul odours better left unsmelled threaten to overwhelm you."; rfalse; ], each_turn [; if (TestScope(Stone_Bottle) && Stone_Bottle has open) { if (Sewer_Vat.clean == true) { if (Stone_Bottle.Meth_Warn == true) rtrue; Stone_Bottle.Meth_Warn = true; "^Fortunately, the last bottle of WizStrip must have detonated all the latent methane in this room, as the open bottle of WizStrip does not cause any violent explosion."; } deadflag = 1; "^As the pent-up sewer gases in this room react with the paint stripper in the stone bottle, a sudden violent explosion rocks the room. Close to the bottle as you are, you form the epicentre of the explosion, and end up violently and messily scattered around the room."; } ], Floor SLIMY_STONE, Walls SLIMY_STONE, cant_go [; if (location == thedark) print "About the only direction you're certain of in all this darkness"; else print "The way out"; " is south back to the basement stairs."; ], s_to [; print "You step back into the relatively cleaner air of the basement.^"; return Basement; ], u_to [; <>; ], in_to [; <>; ], has ~light; Prop -> Sewer_Vat "sewage vat" with name 'stinking' 'sewage' 'sewer' 'vat' 'filth' 'waste', clean false, reach_in false, description [; if (self.clean == false) "This stinking vat of filth is full to the brim with raw sewage so nasty that you don't even want to think about it, let alone go near it."; print "This stinking vat is empty of filth"; if ((player in self && children(self) > 1) || (player notin self && children(self) > 0)) { print ". Sitting in bottom of the sewage vat"; WriteListFrom(child(self), ENGLISH_BIT + ISARE_BIT + CONCEAL_BIT); } print_ret (string) period; ], inside_description "The sides of the vat look slippery and dangerous, but you could probably clamber back out.", react_before [; Take,Remove: if (player notin Sewer_Vat && noun in Sewer_Vat) { if (Sewer_Vat.clean == false) { if (noun == Stone_Bottle) { self.reach_in = true; move Stone_Bottle to player; "You clamber partway up the ladder and gaze into the vast pit of filth before you. You know the unopened bottle of paint stripper is in there somewhere. You take a deep breath. After your head stops spinning you plunge your hand into the vat. The sewage pulls and grabs and makes soft sucking sounds as you move your arm around. The sludge is so thick that the bottle can't have had time to sink very far. Can it? Wait! You feel a fleeting sensation under your fingertips but can't get a firm grip. You lean out farther over the vat, straining, reaching, and suddenly, your fingers close on it. Tugging, you break the suction of the vat and haul out the bottle."; } "You don't want to go digging around in the sewer vat unless you absolutely have to. Maybe you can find a way to empty the vat and retrieve ", (the) noun, (string) period; } "You'll have to enter the vat to get ", (itorthem) noun, (string) period; } ], after [; Enter: print "You scoot up the ladder and into the vat.^"; if (children(self) > 1 && location ~= thedark) { print "^Lining the bottom of the sewage vat"; WriteListFrom(child(self), ENGLISH_BIT + ISARE_BIT + CONCEAL_BIT); print (string) period_newline; } rtrue; Exit,Go: "You clamber back out of the vat."; Receive: if (Sewer_Vat.clean == false) { print "You drop ", (the) noun, " into the sewer vat, where the sewage sucks it slowly out of sight.^"; if (noun == Stone_Bottle) StartTimer(Stone_Bottle, 1); rtrue; } ], before [; Empty,Remove: if (Sewer_Vat.clean == false) "This stinking vat of filth is full to the brim with things so nasty, you don't even want to contemplate them, let alone come into contact with them."; Enter: if (Sewer_Vat.clean == false) "You don't want to go swimming around in all that filth."; if (Cannonball in player) "You can't manage to clamber up the ladder while holding that cannonball."; Exit: if (Cannonball in player) "You can't manage to clamber back out while holding that cannonball."; ReachIn: if (Stone_Bottle in Sewer_Vat) <>; "You don't want to go digging around in all that filth."; Receive: if (self.clean == false) { if (noun ~= Stone_Bottle) "You stop and consider. If you put ", (the) noun, " into the sewage vat, it will be very difficult to get it out again."; } Search: if (self.clean == false) "This stinking vat of filth is full to the brim with things so nasty, you don't even want to contemplate them."; Smell: "The stench from the vat is overpowering."; Taste,Lick: "You've heard that old adage about 'That which does not kill us makes us strong', haven't you? Well, not only could this quite conceivably kill you, if it didn't, it would at the least make you violently and disgustingly ill."; Touch: "The sewer vat feels cold and slimy."; Unblock: <>; ], has scenery container enterable open ~light; Prop -> Metal_Ladder "metal ladder" with name 'metal' 'ladder' 'bolt' 'bolts', description [; "The metal ladder is securely bolted to the side of the sewer vat; it's good solid, sturdy construction."; ]; Prop -> Sewer_Pipe "outflow pipe" with name 'outflow' 'lip' 'small' 'pipe', description [; "The sewer outflow pipe is operating normally."; ], before [; Lick,Taste: <>; Smell: "The pipe smells fairly disgusting."; Unblock: <>; ]; Prop -> Sewer_Channel "stone channel" with name 'stone' 'channel' 'block' 'blockage' 'blocked' 'opening', description [; print "The stone channel leads from the sewer vat to the outflow pipe. "; if (Sewer_Vat.clean == false) "The opening from the vat to the channel is blocked."; "It seems to be operating normally."; ], before [; Lick,Taste: <>; Smell: "The stone channel doesn't smell too pleasant."; Touch: "The stone channel is cold to the touch."; Unblock: "You're pretty sure you won't be able to remove the blockage in this way. Perhaps if you could find a way to blast the sewage out of the vat, the blockage would be cleared."; ], has container enterable open; Object spectacles "pair of spectacles" Sewer_Vat with name 'pair' 'of' 'spectacle' 'glasses' 'specs' 'eyeglasse' 'lenses', parse_name ParseNameOf, article "a", clean false, dirty true, description [; print "An ordinary pair of wire-rim spectacles. They're the same pair Ninario was wearing when you first arrived. "; if (self.clean == false) "They're extremely filthy, almost too dirty to even see through the lenses."; "They've been rendered spotless by your earlier attentions."; ], before [; if (Sewer_Vat.clean == false) "You can't see any spectacles here."; if (self in Ninario) { print "Ninario moves his head, and the "; if (self.clean == false || self.dirty == true) print "filthy "; "glasses out of your reach. ~Please stop waving your arms around in front of my face.~"; } Attack: "If these were your glasses, you probably wouldn't appreciate them being treated this way."; Examine: rfalse; Lick,Taste: "Ninario wouldn't appreciate you doing that to his spectacles."; Rub: if (self.clean == false || self.dirty == true) { if (self.clean == false) { Achieved(4); self.clean = true; } self.dirty = false; "You carefully wipe the lenses down with a corner of your robe, giving them the tender loving care treatment."; } "How clean do they need to be?"; Wear: if (self.clean == false || self.dirty == true) "The filthy lenses make it extremely difficult to see anything, so you take them back off."; "The lenses are so thick that they start giving you a headache, so you take them back off."; ], has pluralname clothing; Outroom Farm_Gate "Farm Gate" with description [; if (location hasnt visited) give FarmMenu ~concealed; print "The dusty road ends here at a"; if (Gate has open) print "n open"; " farm gate to the north. Beyond it, a large open farmyard encloses a ramshackle old barn and a large pile of rubble, but no farmhouse.^ ^Broad pastures lie to either side of the road, bordered by small wooden fences. A small little-used lane heads east, barely more than a line of dirt in the grass. Southwest, the road leads back to the caer."; ], Carpet_Go [; PlayerTo(Farm_Garden); rfalse; ], compass_look [obj; if (obj == n_obj) <>; if (obj == ne_obj) "It looks as though the farm to the north extends east for a fair distance as well."; if (obj == e_obj) "A small little-used lane heads east, barely more than a line of dirt in the grass."; if (obj == sw_obj) "Southwest, the dusty road leads back to the caer."; if (obj == nw_obj or w_obj or se_obj or s_obj) "Pastures and fields extend away to the ", (name)obj, " as far as the eye can see."; if (obj == u_obj) <>; "You don't see anything interesting in that direction, other than what's already been mentioned."; ], cant_go "The farm gate lies to the north, a small lane leads east, and the road heads back southwest.", w_to "You step over the fence and wander around the field for a short time, clearing your head before you return to the road.", nw_to [; <>; ], e_to [; print "You walk east down the narrow lane.^"; return End_Lane; ], n_to [; if (Gate has general) { if (Gate has open) { print "You step into the farmyard.^"; } else { give Gate open; print "You open the gate and step into the farmyard.^"; } return Farmyard; } "You try to push your way up and over the gate, but an invisible barrier seems to block your progress."; ], sw_to [; print "You head southwest back along the dusty road.^"; return Dusty_Road; ], se_to [; <>; ]; Prop -> Gate "farm gate" with name 'farm' 'wooden' 'gate' 'gates' 'latch', description [; print "The farm gate is an ordinary wooden one, constructed of large wooden beams, sturdy and well-built. It "; if (self has open) "gapes open widely."; "sits closed, blocking the way."; ], before [; Climb: if (self hasnt general) { if (self in Farmyard) <>; <>; } if (self has open) "You climb up onto the gate and swing on it aimlessly for a few moments and then hop back down."; print "You clamber up and over the gate into the "; if (self in Farm_Gate) { print "farmyard.^"; PlayerTo(Farmyard); } else { print "road.^"; PlayerTo(Farm_Gate); } rtrue; Open: if (self hasnt general) { if (self in Farmyard) <>; "You pull and strain at the gate, but you can't seem to open it. Odd."; } ], after [; Open: "You unlatch the gate and pull it open."; Close: "You swing the gate closed and latch it carefully."; ], DeadWood true, found_in Farm_Gate Farmyard, door_dir [; if (self in Farm_Gate) return n_to; return s_to; ], door_to [; if (self in Farm_Gate) return Farmyard; return Farm_Gate; ], has door ~open openable; Object -> Farm_Notice "sign" with name 'notice' 'message' 'sign', description [; print "The sign is mounted on a stout wooden post, hammered securely into the ground in front of the gate.^"; new_line; <>; ], initial "A large wooden sign sits in front of the gate.", DeadWood true, before [; Read,Search: font off; print "NOTICE:"; print "^These premises have been seized by the Wizards Guild in connection with certain dangerous, unsanitary and illicit practices carried out within, including, but not limited to, use of illicit plumbing features and scientific methods for wild animal repulsion. Said practices having been duly deemed a seditious and destabilising influence on the world of magic, the Wizards Guild have seized and sealed the property in accordance with articles 9, 24, 28, 31, 37, 65, 66, 74, 79, 86, 96 and 243 of the Guild Act.^ ^Petition for entry to these premises can be filed with the Wizards Guild every third month during the new moon. Allow 12 weeks for processing of all requests.^"; font on; rtrue; Take,Pull,Push,Pushdir,Transfer: "The sign is hammered securely into the ground."; ], has static readable; Outroom Farmyard "Farmyard" with description [; print "A large and dusty earthen courtyard, the farmyard seems eerily silent and abandoned. A curious pile of rubble to the north seems composed mainly of old timbers and plaster. West, a barn gapes open, its doors wrenched from their hinges. The farmyard ends at a garden plot of some kind to the east. The "; if (Gate has open) print "open "; "gate to the south leads back to the road."; ], Carpet_Go [; PlayerTo(Farm_Gate); rfalse; ], before [; Exit: if (player in location) <>; rfalse; ], compass_look [obj; if (obj == s_obj) <>; if (obj == n_obj) <>; if (obj == e_obj) "The farmyard ends at a garden plot of some kind to the east."; if (obj == w_obj) <>; if (obj == u_obj) <>; "You don't see anything interesting in that direction, other than what's already been mentioned."; ], cant_go [; "There is a pile of rubble to the north and the garden is to the east. West is the entrance to the barn and the farm gate is to the south."; ], s_to [; if (Gate has general) { if (Gate has open) { print "You step through the open gate and into the road.^"; } else { give Gate open; print "You open the gate and step through into the road.^"; } } else { give Gate general open; Achieved(16); print "You try to open the gate, struggling against an invisible barrier, pushing and straining. You feel the edges of the barrier begin to give and you push harder. There is a sudden audible pop. The gate flies open and you tumble through into the road, the spell of the Wizards Guild broken.^"; } return Farm_Gate; ], w_to [; print "You step into the ramshackle old barn, glancing apprehensively at the sagging timbers above.^"; return Barn; ], e_to [; print "You head into the carefully-tilled garden.^"; return Farm_Garden; ], n_to [; print "You walk into the midst of the pile of rubble.^"; return House; ]; Prop Barn_Prop "barn doors" with name 'barn' 'door' 'doors' 'hinges' 'doorway', description [; if (self in Farm_Gate) "The doors of the ramshackle old barn gape open, wrenched from their hinges."; "The barn doors sag from their hinges, the lone silent witnesses to whatever violence has been visited on this strangely sad little farm."; ], found_in Farmyard Barn Farm_Gate, before [; if (self in Farm_Gate && action_to_be ~= ##Examine or ##Search) "You can't do that from out here on the road."; Close: "The hinges are broken beyond repair, meaning the doors can no longer be closed."; Open: "The barn doors sag from their hinges, permanently open."; Search: <>; ], has pluralname; Prop Rub_Prop "rubble" with name 'rubble' 'timber' 'timbers' 'pile' 'plaster' 'rubbish' 'farmhouse' 'building', found_in Farmyard House Farm_Gate, description [; if (self in Farmyard or Farm_Gate) "It's hard to make out the details from here, but it certainly looks as though the pile of timber and plaster is the remains of a building of some kind."; "There's no doubt. This sad pile of rubble is all that remains of the farmhouse that once stood here. An awesome force of devastation has been levelled against it. Peering amidst the rubble, you spot what may very well have been the ultimate cause of the Wizards Guild attack on this homestead: the twisted pipes and smashed porcelain of an indoor plumbing system. Consorting with the Plumbers Union, and incorporating scientific advances into their home were the seditious and destabilising dangers lurking in this harmless home: a threat to the supremacy of the Wizards Guild, to their grip over the people of this world."; ], before [; Examine: rfalse; Search: <>; default: if (self in Farmyard or Farm_Gate) "You'll have to get closer to the rubble first."; ]; Room Barn "Barn" with description "The dry dusty smell of hay fills this small and lonely barn. Sunlight streams in through the doorway, lighting up small motes of straw in the air and lending the barn a peculiarly golden quality. The roof and wall timbers of the barn sag alarmingly, as though some terrible violence has been wreaked on them. The barnyard is back east through the doorway.", Walls ROUGH_WOOD, Floor DIRT, compass_look [obj; if (obj == e_obj) <>; if (obj == n_obj) <>; TouchWalls(obj, self.Floor, self.Walls); rtrue; ], before [; Exit: if (player in location) <>; rfalse; ], cant_go [; "The only way out is east back to the farmyard."; ], e_to [; print "With some mild relief, you step back out of the ramshackle old barn into the dusty sunshine of the farmyard.^"; return Farmyard; ]; Prop -> Cabinet "small wooden cabinet" with name 'small' 'wooden' 'cabinet' 'chest' 'shelves', capacity 5, description [; print "It's a rather shallow wooden cabinet, much like an ordinary medicine cabinet.^"; if (self has open) { new_line; <>; } rtrue; ], DeadWood true, initial [; print "A small wooden cabinet hangs "; if (self has open) print "open "; print "on the wall of the barn."; if (self has open) { print " "; <>; } else new_line; rtrue; ], before [; Receive: if (noun == Cannonball or Branch or Bearskin_Rug or Red_Carpet) "That's far too big to fit."; Search: if (self hasnt open) { print "(opening ", (the) self, " first)^"; give self open; } if (child(self) == 0) "It is empty."; print "Sitting on the shelves inside"; WriteListFrom(child(self), ENGLISH_BIT + ISARE_BIT); print_ret (string) period; ], after [; Open: print "The cabinet creaks open.^"; new_line; <>; Close: "You close the cabinet once more."; ], has ~scenery static container openable; Object -> -> Arktos with name 'glass' 'jar' 'of' 'brown' 'arktos' 'essence' 'oil' 'oily' 'malodorou' 'coating' 'concoctio', parse_name ParseNameOf, description [; if (self has worn) "The oily brown concoction is smeared all over your clothing."; else if (self in Bearskin_Rug) "The oily brown concoction is smeared all over the bearskin rug."; print "A small jar, made of frosted blue glass."; if (Ark_Sticker in self) print " A peeling hand-written sticker on the jar reads ", (i) "Essence of Arktos", (string)period; if (self has open) print " The jar is open, revealing an oily brown concoction."; new_line; rtrue; ], add_to_scope [; if (self hasnt worn) AddToScope(Ark_Sticker); ], short_name [; if (self has worn || self in Bearskin_Rug) print "malodorous coating of arktos essence"; else { print "glass jar"; if (self has general) print " of arktos essence"; } rtrue; ], invent [; ! When listing objects in player's inventory if (c_style & FULLINV_BIT) { if (self has worn || self in Bearskin_Rug) { print "a malodorous coating of arktos essence"; if (self has worn) print " (all over your clothes)"; } else { print "a glass jar"; if (self has general) print " of arktos essence"; } rtrue; } ], before [; Disrobe: if (self has worn || self in Bearskin_Rug) "It would be difficult to get the arktos essence off now."; rfalse; Drink: if (self has worn) "It's smeared all over your clothes!"; if (self in Bearskin_Rug) "It's smeared all over the rug!"; "The concoction is too thick to drink, but that's just as well, as the smell is none too appealing."; Eat,Lick,Taste: "The smell is enough to convince you not to try that."; Receive: if (self has worn || self in Bearskin_Rug) <>; "The jar is already full of arktos essence, and you're not certain that adding ", (the) noun, " to the mix would create any new kind of taste sensation."; Open, Close: if (self has worn || self in Bearskin_Rug) { print "The jar disappeared when you smeared the arktos essence on "; if (self has worn) "your clothing."; if (self in Bearskin_Rug) "the rug."; } rfalse; PutOn: if (self has worn || self in Bearskin_Rug) <>; if (self notin player) { print "(taking ", (the) self, " first)^"; ; } if (second == player or magic_clothes) <>; else { if (second == Ninario) <>; if (second has animate) "That's the sort of thing that should be done only by two consenting adults."; } rfalse; Receive: "That wouldn't really work too well."; Search: <>; Smell: if (self has open) "The oily brown concoction has a disgustingly foul smell."; else "The glass jar smells perfectly normal."; Remove,Take,Transfer: Achieved(15); if (self has worn || self in Bearskin_Rug) "You can't do that now that the arktos essence has been smeared all around like that."; Wear: if (self notin player) { move self to player; print "(first taking ", (the) self, ")^"; } if (self hasnt worn) { give self worn concealed; if (self hasnt open) { give self open; print "You open the jar, and"; } else print "You"; " smear the oily brown concoction all over your clothing, rendering yourself extremely malodorous.^ ^The jar itself vanishes, a handy consequence of the Thalionic Antimagic Litter Campaign."; } "You already have arktos essence smeared all over your clothing."; ], after [; Open: "You unscrew the lid from the jar, revealing an oily brown concoction with an extremely unpleasant odour."; Close: "You screw the lid back on, sealing the concoction and, more importantly, the smell, back in."; Examine: give self general; rtrue; ], has openable transparent; Object -> -> -> Ark_Sticker "sticker" with name 'peeling' 'hand-writ' 'sticker', description [; "The peeling hand-written sticker on the jar reads ", (i) "Essence of Arktos", (string)period; ], before [; Examine: rfalse; default: "Except for the one peeling corner, the sticker seems very well attached to the jar. It won't come off, so you probably shouldn't worry about it."; ], has scenery; Prop -> Timbers "sagging timbers" with name 'sagging' 'timbers' 'timber' 'roof', description "The timbers of the barn sag alarmingly.", before [; Examine: rfalse; Search: <>; default: "If you fiddle with the timbers too much, they might come crashing down on you."; ], has pluralname; Prop -> Motes "small motes of straw" with name 'sunlight' 'sunlit' 'small' 'motes' 'of' 'straw' 'hay', parse_name ParseNameOf, description "The sunlight streams in through the doorway, shining on motes of straw in the air.", before [; Examine: rfalse; Search: <>; Smell: "The small motes of straw tickle your nose tantalisingly."; default: "The sunlit motes of straw are too small to bother worrying about. There's no risk they'll trigger your hay fever."; ], has pluralname; Outroom House "Pile of Rubble" with description [; ; new_line; "The farmyard lies back to the south."; ], Carpet_Go [; PlayerTo(Farm_Gate); rfalse; ], Floor ROUGH_WOOD, Walls OUTSIDE, compass_look [obj; if (obj == n_obj) <>; if (obj == s_obj) "The farmyard lies back to the south."; if (obj == u_obj) <>; "You don't see anything interesting in that direction, other than what's already been mentioned."; ], before [; Exit: if (player in location) <>; rfalse; ], cant_go [; "The farmyard is back to the south."; ], s_to [; print "You wander away from the pile of rubble into the farmyard.^"; return Farmyard; ]; Object -> Scrap "scrap of paper" with name 'scrap' 'of' 'paper', parse_name ParseNameOf, description [; print "The scrap of paper seems to be part of a letter. Bits of it are torn or obscured, but you can make out some of the text.^"; new_line; <>; ], initial [; "A scrap of paper caught in the pile of rubble flutters briefly in the wind, catching your eye."; ], before [; Read,Search: font off; print "... you for the animal repellant kit. Everything worked perfectly ...keep ... uders away ... arktos essence: quite ... osite! So we deci... use it... kept attr... premises... dogs were just as ... vance warning ... ^"; font on; rtrue; ], has readable; Outroom End_Lane "End of the Lane" with description "The narrow lane peters to an end here, the small strip of dirt fading into grass. Barren fields lie south and east. North, a tall fence borders the lane.", Carpet_Go [; PlayerTo(Farm_Garden); rfalse; ], before [; Exit: if (player in location) <>; rfalse; ], compass_look [obj; if (obj == w_obj) "A narrow little-used lane leads west back to the farm gate."; if (obj == n_obj or nw_obj or ne_obj) <>; if (obj == sw_obj or se_obj or e_obj) "Barrens fields extend away to the ", (name)obj, (string)period; if (obj == u_obj or s_obj) <>; "You don't see anything interesting in that direction, other than what's already been mentioned."; ], n_to [; <>; ], cant_go [; "The only obvious direction is back west to the farm gate."; ], e_to [; "You wander out into the barren field, but the fence seems to continue all the way around the farmyard, so you come back to the lane."; ], s_to [; "You wander south into the field for a few minutes to relax and gather your thoughts before returning to the lane."; ], w_to [; print "You head west back to the farm gate.^"; return Farm_Gate; ], u_to [; if (Cannonball in player) "You'll never get up there with that cannonball in your hands."; print "You scramble up into the tree.^"; return Middle_Tree; ]; Prop Tall_Fence "tall fence" with name 'tall' 'pine' 'fence', description [; print "The fence is tall and forbidding, its wooden boards smooth to the touch."; if (self in Farm_Garden) " It surrounds the garden on the north, east and south sides. The southern side's exposed slats would make for an easy climb back to the lane."; new_line; rtrue; ], DeadWood true, found_in End_Lane Farm_Garden, before [; if (player in Middle_Tree or Top_Tree && action ~= ##Examine) "You can't do that from up here!"; Climb: if (self in Farm_Garden) <>; "You attempt to pull yourself up the tall fence, but the top is too high to reach and the smooth boards offer no purchase."; Examine: if (player in Middle_Tree or Top_Tree) "From here, you can see that there is a garden beyond the fence, but can't make out too many more details."; rfalse; Lick,Taste: "Mmmm... pine."; Smell: "You breathe in the rich scent of pine."; Touch: <>; ]; Object Tree with name 'bushy' 'slender' 'elm' 'tree' 'limbs', short_name [; if (self has general) print "bushy elm tree"; else print "slender elm tree"; rtrue; ], found_in End_Lane Middle_Tree Top_Tree, add_to_scope [; if (Branch in Middle_Tree) AddToScope(Branch); if (Hawk in Middle_Tree) AddToScope(Hawk); AddToScope(Tall_Fence); ], description [; if (self in Middle_Tree or Top_Tree) <>; if (self has general) { print "The elm tree has burst forth in a spray of leaves. The branches look much sturdier than they were."; if (Branch in Middle_Tree) { print " One firm strong branch extends from the tree out over the fence."; } } else print "The slender elm tree looks fairly young and somewhat delicate. It could probably be climbed at least to the halfway point. There is a long springy branch extending north from the tree and out over the fence."; if (Hawk in Middle_Tree) { print "^^A small savage-looking ", (name)Hawk, " rests in the upper branches of the tree."; } new_line; rtrue; ], describe [; if (self in End_Lane) { print "^A ", (name) self, " stands on the south side of the path. A couple of low branches beckon tantalisingly.^"; if (Hawk in Middle_Tree) "^A small savage-looking ", (name)Hawk, " rests in the upper branches of the tree."; } rtrue; ], before [; Attack: if (self has general) "The sturdy elm tree is impervious to your attack."; "The springy young tree bounces back after your attack."; Climb,Enter: <>; Lick,Taste,Smell: "It looks like elm, it tastes like elm, it smells like elm. Perhaps it's an elm."; Jump: self.Plummet(); rtrue; Pull,Push,PushDir,Take: if (self has general) "The sturdy elm tree is firmly rooted in the ground."; "You tug mightily, but the slender elm tree has the stronger grip."; ], DropStuff [; move noun to End_Lane; print (The) noun, " tumble"; if (noun hasnt pluralname) print "s"; print " down through the branches to the ground below"; if (noun ofclass Jug && noun.current > 0) print ", the water tumbling out of it along the way"; if (noun == Chamberpot or Flask or HCl or EW_Dish or Ceramic_Bowl) { remove noun; print ".^^Unfortunately, it smashes upon impact"; } print_ret (string)period; ], Plummet [; print "You leap from the tree, attempting to make it over the fence, but the distance is too great. You tumble down to the dirt path below.^"; PlayerTo(End_Lane); ], has static; Outroom Middle_Tree "In the Tree" with description [; if (Tree has general) "This large bushy elm tree is strong and supports your weight well. Above you, the large trunk offers a path into the higher reaches of the tree."; "This slender elm tree sways gently in the wind as you cling precariously to your perch. Above you, the tree becomes even more narrow and flimsy."; ], before [; Exit: if (player in location) <>; rfalse; Jump: Tree.Plummet(); rtrue; ], compass_look [obj; if (obj == n_obj) { if (Branch in Middle_Tree) "A ", (name) Branch, " extends north out over the fence."; "The fence surrounding the farmyard lies to the north, but there's no obvious way to reach it from the tree."; } if (obj == d_obj) "You see the dirt path below you."; if (obj == u_obj) <>; "You peer out through the leaves, but don't see much more than what's already been mentioned."; ], cant_go [; if (Tree has general) { print "You can climb back down"; if (Branch in self) ", climb farther up into some very flimsy looking branches, or head north along the branch."; " or farther up into some very flimsy looking branches."; } "You can climb back down or head north along the branch."; ], d_to [; print "You let yourself slide slowly back down to the ground.^"; return End_Lane; ], u_to [; if (Tree has general) { if (Cannonball in player) "You'll never get up there with that cannonball in your hands."; if (Hawk in self) { if (goggles hasnt worn) { print "The hawk squawks angrily and attacks in a fury of wings, claws and beak, pecking madly at your eyes"; if (Bearskin_Rug has worn) { print ", despite the protection of the rug"; if (Helmet has worn) print " and the helmet"; if (Chamberpot has worn) print " and the chamberpot"; } else if (Helmet has worn) print ", despite the protection of the helmet"; else if (Chamberpot has worn) print ", despite the protection of the chamberpot"; print ". Instinctively, you cover your eyes, losing your hold on the tree. The hawk attacks again, and in the fury of its assault, you tumble out of the tree to the ground below.^"; return End_Lane; } else { if (Bearskin_Rug hasnt worn) { print "With your eyes protected, you head up with confidence, but the hawk attacks again, this time pecking madly at the more sensitive areas of your body. You swing wildly, attempting to fend it off, and your grip loosens. You tumble out of the tree to the dirt path below.^"; return End_Lane; } } print "With your eyes protected, and your body covered in the bearskin rug, you shuffle up the tree. The hawk attacks, pecking madly at you, but cannot reach you through the rug. It squawks in frustration and flutters away.^"; Achieved(12); remove Hawk; return Top_Tree; } ! else Hawk notin self else { print "You head gingerly up into the very topmost reaches of the tree.^"; return Top_Tree; } } "The tree is too flimsy to climb any farther up. It wouldn't bear your weight."; ], n_to [; if (Branch in self) <>; else "The branch has broken, meaning you can no longer walk out along it."; ], after [; Drop: Tree.DropStuff(); rtrue; ]; Object -> Branch with parse_name [i; if (Tree has general) { while (NextWord() == 'long' or 'springy' or 'branch') i++; } else { while (NextWord() == 'firm' or 'strong' or 'branch') i++; } return i; ], short_name [; print "long springy branch"; rtrue; ], description [; if (Tree has general) { print "The firm strong"; if (self notin Middle_Tree) " branch has been snapped cleanly from the tree. This broken portion is about three feet long."; } else print "The long and springy"; " branch extends north out over the fence. If you were to climb onto it, you could probably drop down on the other side of the fence."; ], initial [; if (self in Middle_Tree) print_ret "A ", (name) self, " extends north out over the fence."; else print "A firm strong branch lies across the "; if (location ofclass Outroom) "ground here."; "floor."; ], before [ obj; if (self in Middle_Tree && player notin Middle_Tree && action ~= ##Examine or ##Search) "You can't do that from here."; Climb,Enter: if (self hasnt static) rfalse; if (Tree has general) { print "You step out onto the branch, inching your way forward. You are about halfway to the fence when there is a creaking, shuddering noise. The sudden burst of growth must have been too much for the branch, as it abruptly snaps under you. You tumble gracelessly out of the tree, and land heavily on the dirt path.^"; move self to End_Lane; give self ~static; } else print "You inch slowly along the springy branch. It bobs and sways alarmingly under your weight. You edge forward cautiously, but by the time you reach the halfway point, your weight becomes too much for the springy branch. The tree is just too young and springy. It bends, bowing down low to the ground. You scrabble to maintain your footing, but slip and tumble to the dirt path.^"; if (child(self) ~= 0) { print "^Unsurprisingly, "; WriteListFrom(child(self), ENGLISH_BIT + DEFART_BIT); print " tumble"; if (children(self) == 1) print "s"; print " out of the tree along with you.^"; for (obj=child(self): obj ~= 0: obj=child(self)) { move obj to End_Lane; } } PlayerTo(End_Lane); rtrue; Take: if (self has static) "It's attached to the tree!"; if (player in self) { move player to location; print "(getting off the branch first)^"; } if (child(self) ~= 0) { print "(dislodging "; WriteListFrom(child(self), ENGLISH_BIT + DEFART_BIT); print ")^"; for (obj=child(self): obj ~= 0: obj=child(self)) { move obj to location; } } ], has static supporter; Object -> Hawk with name 'proud' 'savage' 'hawk' 'bird' 'wings' 'beak' 'claws' 'merlin', description [; "An impressively proud and savage hawk rests in the upper branches of the tree. It seems placid right now, but the sharp beak and long claws look serious."; ], short_name [; print "bird"; rtrue; ], initial [; "A small savage-looking ", (name)self, " rests in the upper branches of the tree."; ], react_before [; ThrowAt: if (noun notin player) { print "(first taking ", (the) noun, ")^"; ; } if (noun notin player) rtrue; if (second == self) { move noun to End_Lane; print_ret (The) self, " screams in indignation and flutters quickly aside, ", (the) noun, " sailing past it and falling to the ground."; } ], before [; if (location ~= Middle_Tree && action ~= ##Examine or ##Listen or ##Talk or ##Meet or ##MeetNPC or ##Drill or ##ThrowAt) { "You can't reach ", (the) self, " from here."; } Attack,Search: print_ret (The) self, " screams in indignation and attacks you in a flurry of wings, claws and beak."; Bargain: print_ret (The) self, " ignores you. You must not be birds of a feather."; Drill: <>; Kiss,Smell: print_ret (The) self, " screams in protest and lunges at you with its beak. It doesn't feel like getting that friendly with you."; Listen: "The hawk is cracking its beak and twittering to itself every now and then."; MeetNPC: <>; Play: print_ret (The) self, " flutters its wings angrily at you."; Ride,Enter: print_ret (The) self, " wouldn't take kindly to that at all."; Take: "You make a swipe at it, but it flutters easily out of reach."; Talk,MeetNPC: print_ret (The) self, " ignores you, calmly superior."; Touch: <>; WakeOther: <>; ], after [; Examine: self.short_name = "hawk"; rfalse; ], life [; Answer: <>; ], orders [; Meet,MeetNPC: <>; default: <>; ], has animate neuter; Outroom Top_Tree "The Very Top of the Tree" with description "You cling precariously to the very top of the tree. The branches here are extremely flimsy and unstable. The tree waves back and forth gently, dipping briefly towards the fence and then swinging back.", add_to_scope [; if (Branch in Middle_Tree) AddToScope(Branch); AddToScope(Tall_Fence); ], compass_look [obj; if (obj == n_obj) "The fence surrounding the farmyard lies to the north, but there's no obvious way to reach it from the tree."; if (obj == d_obj) "You see the dirt path far below you."; if (obj == u_obj) "The branches above are even more flimsy and unstable than the ones you're clinging to."; "You peer out through the leaves, but don't see much more than what's already been mentioned."; ], before [; Attack: "The tree shakes alarmingly, but doesn't dip close enough to the fence for you to leap into the yard."; Exit: if (player in location) <>; rfalse; Jump: Tree.Plummet(); rtrue; ], after [; Drop: Tree.DropStuff(); rtrue; ], each_turn [; if (Cannonball in player) { print "^The weight of the cannonball in your hands sets the branches to dipping and swaying madly. The gyrations increase and the top of the tree bends down, down towards the fence, gathering speed as it does so. It reaches the bottom moving at an alarming clip. But the tree is just a bit too short, and your head connects soundly with the top of the fence."; if (Helmet has worn || Chamberpot has worn) { if (Chamberpot has worn) { remove Chamberpot; print " Fortunately, the chamberpot protects you from the worst of the blow. Unfortunately, it shatters on impact and you rebound off and over the fence, landing heavily in the yard.^"; } else print " Fortunately, the helmet protects you, and you rebound off and over the fence, landing heavily in the yard.^"; print "^The heavy cannonball thumps to the ground beside you.^"; move Cannonball to Farm_Garden; Achieved(13); PlayerTo(Farm_Garden); } else { print " Dazed, you let go of the tree and the cannonball and land heavily on the dirt path. The cannonball thumps down heavily beside you, just missing you. The tree, relieved of your weight, whips back up to its former position.^"; move Cannonball to End_Lane; PlayerTo(End_Lane); } rtrue; } else "^The tree dips and sways alarmingly. You're probably just about the maximum weight these flimsy branches can take and still remain standing."; ], cant_go "You seem to have run out of branches strong enough to bear your weight.", d_to [; print "You slide back down to the firmer branches below.^"; return Middle_Tree; ]; Object Branches "thin branches" with name 'thin' 'low' 'flimsy' 'branches', description "These branches are extremely thin and flimsy. You're lucky you aren't any heavier.", before [; Examine: if (real_location == End_Lane) "You could probably reach a few of the low branches."; if (real_location ~= Top_Tree) <>; rfalse; default: "They're far too flimsy to be of use."; ], found_in End_Lane Middle_Tree Top_Tree, has pluralname scenery; Outroom Farm_Garden "Garden" with description [; print "The well-tilled rich earth and neat orderly furrows show that this was the farmhouse garden. It's early to have harvested all the garden vegetables, but someone appears to have done so, as there is not a living thing left in the earth. It has been stripped clean.^ ^West, the garden opens out into a dry and dusty farmyard. A fence rings the garden on the other three sides. The slat construction of the inside of the fence to the south makes for an easy climb back out to the lane.^"; if (Dogs in location) { if (self.warn_dogs == 0) { print "^A pair of large and ferocious dogs wandering in the garden jump in surprise as you come plummeting down at breakneck speed.^"; self.warn_dogs++; if (Bearskin_Rug has worn) { remove Dogs; Achieved(14); "^The dogs take one look and sniff at the bearlike apparition that has descended into the quiet peace of the garden, and turn tail, yipping in terror."; } "^The dogs take one look at you and charge, growling and snarling evilly, their sharp teeth bared."; } } rtrue; ], Carpet_Go [; PlayerTo(Farm_Gate); rfalse; ], warn_dogs 0, before [; Go: self.warn_dogs = 0; ], each_turn [; if (Dogs in location) { if (Bearskin_Rug has worn) { remove Dogs; Achieved(14); "^The dogs come skidding to a halt at your feet, the whites of their eyes showing sudden alarm. They take one brief sniff at the bearlike apparition that has appeared in their yard, and turn tail, yipping in terror."; } if (self.warn_dogs == 1) { self.warn_dogs++; "^The dogs continue charging, covering an alarming amount of distance in a short space of time. You can see their gleaming white teeth and their sharp and dangerous claws. They are almost upon you!"; } if (self.warn_dogs == 2) { deadflag = 1; "^The dogs leap on you and you are powerless to fend off their ferocious attack. Snarling and slavering they tear at your flesh mercilessly. You struggle for a short time, but your strength fades as their attack continues unabated. You fall beneath their onslaught, leaving them free to continue their grisly meal uninterrupted."; } } ], compass_look [obj; if (obj == n_obj or e_obj or ne_obj or nw_obj) <>; if (obj == s_obj or se_obj or sw_obj) <>; if (obj == w_obj) "West, the garden opens out into a dry and dusty farmyard."; if (obj == u_obj) <>; if (obj == d_obj) <>; "You don't see anything interesting in that direction, other than what's already been mentioned."; ], s_to [; <>; ], w_to [; if (Dogs in location) "The dogs are charging toward you from that direction!"; print "You wander into the farmyard.^"; return Farmyard; ], e_to [; <>; ], n_to "The fence on this side of the garden has the slats on the other side, and thus is too difficult to climb.", u_to [; if (Dogs in location) print "You scramble up the slats and vault over to the fence back to the safety of the lane.^"; else print "You climb back up the slats and drop down into the lane.^"; return End_Lane; ]; Object -> Dogs "large and ferocious dogs" with name 'large' 'ferocious' 'dogs' 'claws' 'teeth', description [; "The dogs are large and powerful, with many shining white teeth and razor-sharp claws."; ], before [; Attack,Kiss,Touch,WakeOther: Farm_Garden.warn_dogs = 2; "Valiantly, you step forth to do battle with the dogs."; Listen: "The dogs make growling slavering noises as they rush relentlessly towards you."; Play: "These dogs might play a bit too rough for you."; Ride,Enter: "The dogs are big, but not big enough to ride."; Take: "Typically when one wants to pick up a dog, it's the small and cuddly variety. These are neither."; Search: "That might result in sudden and drastic limb-reduction."; Smell: "While that is the correct form of greeting between dogs, you don't have the stomach to really get in there like you should."; Talk,MeetNPC,Bargain: "The dogs rush towards you, ignoring your words."; ], life [; Answer: <>; ], orders [; Meet,MeetNPC: <>; default: "The dogs ignore your request and continue charging towards you."; ], has scenery animate neuter pluralname; Prop -> Garden_Dirt "well-tilled earth" with name 'well-till' 'well' 'tilled' 'dirt' 'neat' 'orderly' 'furrows' 'garden' 'earth' 'furrows' 'plot' 'bed' 'flowers' 'vegetable', description "Though stripped clean of all produce, the earth still looks rich and well-tilled.", FakeObj, before [; Examine: rfalse; Dig: <>; default: "Perhaps it's best to just leave the barren garden alone."; ]; Outroom Vechlee_Gate "Vechlee Gate" with description [; if (location hasnt visited) give VechleeMenu ~concealed; "Vechlee seems a bustling and thriving town. The foot traffic is impressive here just inside the town gate. The street is not terribly wide, but does boast the impressive upgrade of cobblestones. Southwest, the avenue continues and widens out into a large square. North, the road heads into the more professional quarter of North Vechlee. To the northeast is the town gate, leading back to the dusty road to Ninario's caer.^ ^A small shop lies to the south, a wooden sign wedged into the cobblestones in front of it."; ], Floor COBBLES, Carpet_Go [; PlayerTo(W_Courtyard); rfalse; ], compass_look [obj; if (obj == n_obj) "The road north heads into the more professional quarter of North Vechlee."; if (obj == s_obj) <>; if (obj == sw_obj) "The avenue widens out into a large market square to the southwest, filled with a bustle of people."; if (obj == ne_obj) "Northeast is the town gate, leading back to the dusty road to Ninario's caer."; if (obj == u_obj) <>; "You don't see anything interesting in that direction, other than what's already been mentioned."; ], before [; Exit: if (player in location) <>; rfalse; ], cant_go [; "You can head north up the street into North Vechlee, southwest to the market square or northeast back along the dusty road to Ninario's caer. There is also a small shop lying to the south."; ], n_to [; print "You push your way up the street into North Vechlee, the crowd lessening as you leave the gate area.^"; return North_Vechlee; ], sw_to [; print "You push southwest through the crowd to the market square.^"; return Market_Square; ], s_to Shop_Door, ne_to [; print "You extricate yourself from the bustle inside the gate and march back along the long and dusty road to the caer, dust rising up from the road to fill your eyes and nose.^"; return Dusty_Road; ], has proper; Object -> Shop_Notice "sign" with name 'small' 'wooden' 'notice' 'message' 'sign', description [; print "The sign is mounted on a stout wooden post, wedged securely between the cobblestones in front of the shop.^"; new_line; <>; ], DeadWood true, before [; Read,Search: font off; print "NOTICE:"; print "^", (i) "Eliza's Cheese Emporium", " has been seized by the Wizards Guild in connection with certain dangerous, unsanitary and illicit practices carried out within. Said practices having been duly deemed a seditious and destabilising influence on the world of magic, the Wizards Guild have seized and sealed the property in accordance with articles 9, 24, 28, 31, 37, 65, 66, 76, 83, and 112 of the Guild Act.^ ^Petition for entry to these premises can be filed with the Wizards Guild every third month during the new moon. Allow 12 weeks for processing of all requests.^ ^NOTE: charges relating to the Foreign Cheese Act are still being determined and will be posted at the appropriate juncture.^"; font on; rtrue; Take,Pull,Push,Pushdir,Transfer: "The sign is wedged securely between the cobblestones."; ], has scenery readable; Prop Cobblestones "cobblestones" with name 'cobble' 'stones' 'cobblesto' 'road' 'street' 'avenue', description "The cobblestones are neatly and securely laid.", found_in Vechlee_Gate North_Vechlee Market_Square Outskirts, before [; Examine: rfalse; Take,Pull,Push,Pushdir,Transfer: "Whoever constructed this road did a very good job. You can't manage to pry any of them up."; default: "The cobblestones aren't doing any harm where they are. Just leave them be."; ]; Object people "busy townsfolk of Vechlee" with name 'townsfolk' 'crowd' 'people' 'fellows' 'fellow' 'person' 'man' 'woman' 'girls' 'boys' 'chaps' 'girl' 'boy' 'women' 'men' 'guys' 'everyone' 'everybody' 'someone' 'wizard' 'wizards' 'somebody' 'kids' 'folks' 'townies' 'foot' 'traffic' 'passersby' 'passerbys' 'passerby', description "The townsfolk of Vechlee all look extremely busy, hurrying about their business. There's certainly a wide cross-section of society represented.", found_in Vechlee_Gate Market_Square, chat 0, Cheesechat 0, Topics 0, each_turn [; if (self.Chat == 1) { switch(random(100)) { 1 to 20: print "^The crowd ebbs and flows around you, an undulating wave of humanity.^"; 21 to 40: print "^The buzz of many voices and conversations swells in the crowd around you.^"; 41 to 50: print "^Various passersby push their way around you, obviously in a hurry.^"; 51 to 61: print "^The sights and sounds of the city assail your senses on every side.^"; 62 to 71: print "^The crowd swirls around you, a nameless tapestry of faces.^"; 72 to 83: print "^The crowd disperses briefly, like waves breaking on shore, but then begins its slow surf-like buildup once more.^"; 83 to 94: print "^The people of Vechlee rush about their daily business, paying no attention to you.^"; 94 to 98: print "^The crowd swells again, and someone bumps heavily into you. "; switch(random(20)) { 1 to 5: print "~Sorry,~ he mutters, vanishing"; 6 to 10: print "~Oops, sorry!~ she giggles, wandering off"; 11 to 15: print "~Watch yer step, young'un,~ he growls, disappearing"; 15 to 19: print "~Apprentices!~ she snaps haughtily, marching off"; 20: print "~Ninario is being held in the Wizards Guild on the outskirts of town,~ he whispers conspiratorially, and then vanishes"; } print " into the crowd.^"; 99: print "^~'Ave you 'eard about that there Ninny feller?~ you hear from somewhere in the milling crowd. ~I 'eard 'e got taken away by t'guild!~^ ^~That's right,~ says a second voice, ~and the execution's later today!~ The voices continue talking, but fade away, lost in the swell of people.^"; 100: print "^There is a sudden snap, as though of a whip cracking, and a green portal appears before you. A few seconds later, you see someone's big toe appear"; if (self.Topics & FLAG_x4 == FLAG_x4) { print ". Before anything else can happen, however, a voice comes from inside the portal. ~Not ", (i) "this", " reality again! I am ", (i) "so", " lost!~ The portal slams back shut again."; } else { self.Topics = self.Topics | FLAG_x4; print ", followed almost immediately by the rest of a body, and a tall and well-built man wearing a brass loincloth tumbles out, landing shakily on his feet. ~Thank goodness those time travellers who wandered by the hold had a matter reconstituter!~ he says, somewhat out of breath. Then he looks around curiously. ~Hey, this isn't the flagship of the Leather Goddesses!~ He glances at you. ~And you're not...~^ ^With no warning, a sudden gust of transdimensional air sucks the well-built man back into the portal, which snaps shut abruptly after him."; } print " You glance around, but typically, no one else seems to have noticed anything.^"; } } self.Chat = random(5); rtrue; ], before [; Attack: "Random crowd violence has a way of tumbling out of your control, so you reconsider."; Bargain: "No one seems interested in doing business with you."; Kiss: print "You grab a passerby at random and give "; switch(random(2)) { 1: "her a big kiss. She splutters in alarm, pulls away from you, and hurries off."; 2: "him a big kiss. He gulps in alarm and hurries off, stealing glances at you over his shoulder."; } Listen: "The crowd buzzes and hums with the rhythm and cadence of many voices."; MeetNPC: "You greet some of the passersby. A few of them glance in your direction and scowl."; Smell: "The smell of the crowd is made up of many varied odours."; Talk: <>; Take: <>; Touch,Search: "You run after a couple of the passersby with your hands outstretched, but they keep dodging away."; WakeOther: "The crowd is awake and bustling with activity."; ], life [; Answer: if (noun == 'hello' or 'hi') <>; else <>; Ask: if (second == 'guild' or 'wizard' or 'ninario' or 'ninny' or 'nin' or 'master' or 'wizards' or 'wizard^s' or 'renaldo' or 'virgil' or 'execution') "Everyone you ask seems reluctant to discuss the subject at all, but eventually you find someone who tells you that the guild hall is off at the western edge of town."; if (second == 'farm' or 'repellent' or 'closure' or 'chemical' or 'science') { if (self.Topics & FLAG_x2 == FLAG_x2) { "No one you find can tell you anything that you haven't already heard; the farm to the northeast was shut down by the Wizards Guild for the use of science."; } if (self.Topics & FLAG_x1 == FLAG_x1) { self.Topics = self.Topics | FLAG_x2; "~Haven't you heard?~ asks the first person you stop. ~They were shut down for using... ", (i) "science", " to drive away some animals that were pestering their farm.~ She hurries away, shaking her head."; } self.Topics = self.Topics | FLAG_x1; "You stop a few of the townsfolk to ask them about the farm, and eventually find a busy-looking gentleman who knows something about it. ~They were shut down for using some chemical to drive away animals, instead of hiring a wizard like any sensible person would do. At least, that's what I heard.~ He shrugs and walks away."; } if (second == 'building' or 'society' or 'bank') { if (self.Topics & FLAG_x3 == FLAG_x3) "No one you ask seems to know anything about the bank other than what you've already heard."; self.Topics = self.Topics | FLAG_x3; "You ask a few of the passersby, and finally a frazzled woman stops and tells you, ~The building society? Aye, it was a bad business, that. They were offering better loan rates than the Wizards Guild Bank for a bit, but it seems a lot of wizards signed up for loans and then defaulted on payment all at once.~ She shakes her head. ~Then the Wizards Guild Bank bought them up, and closed shop. Now if you want to bank, it has to be there.~ She suddenly seems to notice your apprentice robes. ~But there's nothing wrong with banking there, of course,~ she adds quickly. She looks around furtively and then scurries away."; } if (second == 'cheese' or 'shop' or 'sign') { if (self.Cheesechat < 4) self.Cheesechat++; switch(self.Cheesechat) { 1: "The first person you stop shakes her head sadly. ~That was poor Eliza Stilton's cheese shop. The Wizards Guild found out she was using non-magical methods of pasteurising, and shut her down just this morning. They're coming to seal the shop later today.~"; 2: "The second person you stop nods his head knowingly. ~I hear she was using some scientific methods in her cheese-making. Foolish. The guild are coming back to seize all the cheese later.~^ ^He lowers his voice. ~Interference is on pain of death, but I saw some filthy poor people popping out of there with ", (i) "cheese", " in their hands earlier! Imagine, not only stealing cheese, but stealing ", (i) "contraband", " cheese, created with...~ He stops to spit before continuing, ~...with ", (i) "science", ". Disgusting!~"; 3: "The third person you stop lowers her voice and confides to you, ~Less asked, the better.~^ ^~Still,~ she adds, ~with the Guild seizing the shop, there are lots of bargains to be had.~ She pulls back her cloak to show you a large piece of cheese. Then she hurriedly tucks it away and scurries off."; 4: "No one you ask seems to know anything else about the shop."; } } "No one seems interested in answering you."; Show: "No one seems terribly impressed."; Tell: "No one seems to pay any interest to you."; ], orders [; Meet,MeetNPC: <>; default: "The townspeople clearly have their own priorities."; ], has scenery animate pluralname; Prop Town_Gate "gate" with name 'vechlee' 'town' 'gate' 'gates', description "The gate is sturdy, but doesn't look like it would withstand any concerted bombardment. It's probably meant more to keep out strangers and animals at night than to defend the town against attack.", found_in Vechlee_Gate Outside_Vechlee Outskirts, before [; Close,Lock,Unlock: "The gate is locked in the open position, and you can't budge it."; Open: "The gate is already open."; ]; Autodoor Shop_Door "shop door" with name 'shop' 'door', description [; if (self has open) print "An open"; else print "A plain wooden"; if (self in Vechlee_Gate) " door leading into Eliza's Cheese Emporium."; else " door leading to the street."; ], found_in Vechlee_Gate Cheese_Shop, DeadWood true, before [; Enter: if (player in Vechlee_Gate) <>; else <>; ], door_dir [; if (self in Vechlee_Gate) return s_to; return n_to; ], door_to [; if (self in Vechlee_Gate) return Cheese_Shop; return Vechlee_Gate; ], has scenery door openable; Room Cheese_Shop "Eliza's Cheese Emporium" with description [; if (location hasnt visited) give CheeseMenu ~concealed; print "Emptiness and silence greet you in this small and ordinary cheese shop. The shop is devoid of both staff and customers. It looks like it would have been a nice cozy little shop though, friendly and family-run, the kind of place where the staff remember your favourite cheeses, but can also sense when you're looking for something a little more adventurous, a little venture beyond your usual territory. The air is still scented with the aroma of many different cheeses mingled together. The "; if (Shop_Door has open) print "open"; else print "closed"; " door to the north leads back to the street."; ], compass_look [obj; if (obj == n_obj) <>; TouchWalls(obj, self.Floor, self.Walls); rtrue; ], before [; Exit: if (player in location) <>; rfalse; Smell: if (noun == nothing) "The air is still scented with the aroma of many different cheeses mingled together."; rfalse; ], cant_go "The only way out of here is north back to the street.", n_to Shop_Door, has proper; Object -> Counter "counter" with name 'white' 'pine' 'counter', description [; print "Beautifully crafted of white pine, the counter is smooth, clean and level"; if (child(self) ~= 0) { print ". Sitting atop it "; WriteListFrom(child(self), ENGLISH_BIT); } print_ret (string) period; ], DeadWood true, before [; Enter,Climb: "You'll just get the surface all dirty if you do that."; Pull,Push,PushDir,Take,Transfer: "The counter seems to be affixed to the floor."; ], describe [; if (child(self) == 0) "^An empty counter sits against the southern wall of the shop."; print "^There is a large counter lining the southern wall of the shop. Although the shop appears abandoned, sitting atop the counter is "; WriteListFrom(child(self), ENGLISH_BIT); print_ret (string)period; ], has static supporter; Cheese -> -> Asiago "Asiago" with name 'asiago', description "A light yellow cheese, rather hard to the touch.", before [; Lick,Taste: "A rich sharp flavour with a mild nutty undertone."; Smell: "The scent of the Asiago is evocative of a visit to a diary farm."; Touch: "It flakes easily, but is still hard."; ], after [; Eat: "You tuck into the Asiago heartily. It is well-aged and thus has a rich sharp flavour. The nutty undertones are mild, but insistent."; ]; Cheese -> -> Bel_Paese "Bel Paese" with name 'bel' 'paese', description "A pale creamy yellow cheese with a semisoft smooth texture, like that of firm butter.", before [; Lick,Taste: "Mild and buttery."; Smell: "You breathe in the light and milky aroma of the Bel Paese."; Touch: "The Bel Paese has a semisoft smooth texture, like firm butter."; ], after [; Eat: "You chew the Bel Paese thoughtfully. It has a moderately robust buttery flavour and is delicious."; ]; Cheese -> -> Caerphilly "Caerphilly" with name 'caerphill' 'caer' 'philly', description "A pale white and somewhat crumbly cheese, firm to the touch.", before [; Lick,Taste: "Mildly tangy and salty."; Smell: "The Caerphilly's aroma is slightly sharp and sour, but not overpowering."; Touch: "Crumbly but firm to the touch."; ], after [; Eat: "You munch down the Caerphilly. It has a pleasingly mild tangy, salty taste."; ]; Cheese -> -> Wensleydale "Wensleydale" with name 'wensleyda' 'wens' 'dale' 'wallace', description "A creamy-white cheese, flaky and firm.", before [; Lick,Taste: "Mildly sweet, with a honeyed accent."; Smell: "The Wensleydale has a fresh slightly sweet aroma with just a hint of honey."; Touch: "Flaky but firm."; ], after [; Eat: "The Wensleydale has a mild sweet flavour with a honeyed aftertaste."; ]; Cheese -> -> Camembert "Camembert" with name 'camembert' 'cam' 'camem' 'bert', description "A smooth creamy cheese with a soft white rind.", before [; Lick,Taste: "A creamy buttery mushroom taste."; Smell: "The Camembert has an aroma of mushrooms with just a hint of milky undertones."; Touch: "Perfectly ripe: slightly runny but not too much."; ], after [; Eat: "The Camembert is delightfully mild and creamy with a distinct taste of mushrooms. It's runnier than the ideal, but fortunately, you like it runny. The small wheel goes down a treat."; ]; Cheese -> -> Gouda "Gouda" with name 'gouda', description "A light cream-coloured cheese with a firm and compact texture.", before [; Lick,Taste: "A taste of almonds and cream."; Smell: "The Gouda has an odour of light milk with a hint of nuts."; Touch: "It's firm and compact."; ], after [; Eat: "You eat the Gouda, savouring its creamy almond taste."; ]; Cheese -> -> Emmental "Emmental" with name 'emmental' 'emm' 'emmen', description "A smooth firm cheese, with a hard yellow crust.", before [; Lick,Taste: "Distinctly hazelnut."; Smell: "The Emmental has a pronounced and distinctive smell of hazelnuts."; Touch: "Firm and elastic to the touch."; ], after [; Eat: "The Emmental is a delight: a distinct hazelnut flavour that melts in the mouth."; ]; Cheese -> -> Stilton "Stilton" with name 'stilton' 'stil' 'stilt', description "A firm blue-mould cheese with narrow blue-green veins and a moist creamy texture.", before [; Lick,Taste: "Rich and tangy, with a piquant aftertaste."; Smell: "The Stilton has a rich earthy aroma."; Touch: "Firm, with a moist creamy texture."; ], after [; Eat: "The Stilton has a rich and tangy flavour. You feel a strange yearning for a glass of port to sip while you eat it."; ]; Cheese -> -> Miranda "Miranda" with name 'miranda', description "A firm cheese with a burnished coppery rind and a beige interior.", before [; Lick,Taste: "Salty with a hint of nut and apples."; Smell: "The Miranda has the odour of nut and wet straw."; Touch: "Extremely firm."; ], after [; Eat: "The Miranda has a sharp salty flavour with nut and apple accents. It's very pleasant."; ]; Cheese -> -> Cheshire "Cheshire" with name 'cheshire' 'chesh' 'ches' 'che' 'chesire', description "A pale yellow cheese with a moist and crumbly texture.", before [; Lick,Taste: "It has a tangy and salty cheddar-like flavour."; Smell: "The Cheshire has a delightful aroma reminiscent of cheddar."; Touch: "Somewhat firm with a moist and crumbly texture."; ], after [; Eat: "You pop the Cheshire cheese into your mouth, enjoying its tangy and salty flavour."; ]; Cheese -> -> Roquefort "Roquefort" with name 'roquefort' 'roque' 'fort', description "A creamy white blue-veined cheese with a crumbly texture.", before [; Lick,Taste: "Deliciously sharp and pungent, the Roquefort is somewhat reminiscent of Cheshire."; Smell: "The Roquefort has a pungent and earthy aroma."; Touch: "Somewhat firm with a moist crumbly texture."; ], after [; Eat: "The Roquefort is wonderfully creamy and rich, with a sharp and pungent taste, somewhat reminiscent of Cheshire."; ]; Outroom North_Vechlee "North Vechlee" with description [; "The sprawling professional district of North Vechlee is home to many artists, craftspeople, tradesfolk and their families. Their shops and houses fill the small cluttered streets.^ ^An oddly silent shop lies to the west. It seems to have fallen upon hard economic times and is utterly abandoned, lacking even the dignity of boards over the windows. A sign over the door reads ", (i) "William's Woodcraft", ".^ ^On the east side of the street is a prosperous and thriving business. Gold lettering over the entranceway reads ", (i) "Wizardry Wooding", ".^ ^The street leads back south to the town gate."; ], Floor COBBLES, Carpet_Go [; PlayerTo(W_Courtyard); rfalse; ], compass_look [obj; if (obj == w_obj) "The small shop is silent and abandoned, lacking even the dignity of boards over the windows. A sign over the door reads ", (i) "William's Woodcraft", (string)period; if (obj == s_obj) "The street leads back south to the town gate."; if (obj == e_obj) "On the east side of the street is a prosperous and thriving business. Gold lettering over the entranceway reads ", (i) "Wizardry Wooding", (string)period; if (obj == u_obj) <>; "You don't see anything interesting in that direction, other than what's already been mentioned."; ], before [; Exit: if (player in location) <>; rfalse; ], cant_go [; "You wander around the streets of North Vechlee for a time, but conclude that the only areas of interest are the stores to the west and east of you, and the road back south to Vechlee Gate."; ], w_to [; print "You step into the empty silence of the abandoned shop.^"; return Will_Woodcraft; ], e_to [; print "You step into the antiseptic cleanliness of Wizardry Wooding.^"; return Wiz_Wooding; ], s_to [; print "You head back south to the town gate.^"; return Vechlee_Gate; ]; Object -> Notice "notice" with name 'notice' 'message' 'small' 'piece' 'of' 'parchment' 'sign' 'text' 'lines', parse_name ParseNameOf, description [; print "The notice is scrawled on a small piece of parchment.^"; new_line; <>; ], initial [; "A notice is attached to the door of the abandoned shop."; ], before [; Read,Search: print "The wording seems a little odd."; if (self has general) { print " Each line ends at close to the same point.^ ^You look at the last word of each line in turn."; } new_line; give self general; font off; print "^NOTICE TO CUSTOMERS:"; print "^Because the cheaper and far superior products offered at Wizardry ^Wooding (conveniently located just across the street) threatened ^our slim margins of profitability William's Woodcraft was forced ^as of the end of this summer to cease business and close up shop. ^At Wizardry Wooding prices are so much better it was foolish to ^continue competing with them. It was a tricky decision to close. ^--William^"; font on; rtrue; ], has readable; Room Will_Woodcraft "William's Woodcraft" with description [; if (location hasnt visited) give WizstripHint ~concealed; "The competition from Wizardry Wooding has hit William's Woodcraft hard. The one-room storefront and workshop has been utterly abandoned, its remaining stock snapped up by Wizardry Wooding, leaving it without even the dignity of boards over the windows. A few lonely wood shavings are the only remaining testament to a once brisk and bustling trade.^ ^The sprawling streets of North Vechlee lie back through the doorway to the east."; ], compass_look [obj; if (obj == e_obj) "The sprawling streets of North Vechlee lie through the doorway to the east."; TouchWalls(obj, self.Floor, self.Walls); rtrue; ], before [; Exit: if (player in location) <>; rfalse; ], cant_go [; "The street lies back through the doorway to the east."; ], e_to [; print "You walk back out into the bright sunshine.^"; return North_Vechlee; ]; Object -> Woodshavings "wood shavings" with name 'woodshavi' 'wood' 'shavings', article "some", before [; Attack: "You kick the wood shavings around the floor a bit, but it just makes you feel a bit guilty for trampling on William's memories and shattered dreams."; Take: "You decide to leave them as the sole remaining memory of a once thriving and prosperous enterprise."; default: "The wood shavings sit, forlorn and alone, all that remain of William's Woodcraft's former glory."; ], has scenery; Room Wiz_Wooding "Wizardry Wooding" with description [; "Stark plain utilitarianism seems to be the order of the day in this shop. The room is large and bare, save for a counter on the east side, just in front of a curtained doorway. The street lies out the doorway to the west."; ], compass_look [obj; if (obj == e_obj) <>; if (obj == w_obj) "The sprawling streets of North Vechlee lie through the doorway to the west."; TouchWalls(obj, self.Floor, self.Walls); rtrue; ], before [; Exit: if (player in location) <>; rfalse; Go: if (noun == w_obj) { give Shopkeeper ~general; Shopkeeper.Topics = Shopkeeper.Topics & (~FLAG_x6); rfalse; } ], cant_go [; "The street lies back through the doorway to the west."; ], w_to [; switch(random(8)) { 1: print "~Have a nice day, luv!~ calls ", (the) Shopkeeper, " as you leave.^^"; 2: print "~Cheerio luv!~ calls ", (the) Shopkeeper, " as you leave.^^"; 3: if (Shopkeeper.ordered == true) print "~Don't forget to check back in about four weeks for your wood!~ calls ", (the) Shopkeeper, " as you step out.^^"; 4: print "~Next week is red mahogany week,~ says ", (the) Shopkeeper, " as you step out. ~Be sure to stop by and pick up your free sample!~^^"; 5 to 8: ; } print "You step back out into the sunshine, and draw a cleansing breath of air.^"; return North_Vechlee; ], e_to [; "~Employees only luv,~ apologises ", (the) Shopkeeper, " as you approach the curtain. ~Or wizards, of course,~ she adds, ~but...~ She spreads her hands to express her helplessness and smiles unengagingly."; ]; Object -> Shopkeeper with name 'shopkeepe' 'seller' 'vendor' 'woman' 'lady' 'luv' 'vendor' 'clerk' 'clark' 'keeper' 'betty' 'herself' 'job' 'hair' 'blue' 'highlight' 'blue-ting', short_name [; print "shopkeeper"; rtrue; ], description [; print_ret (The) self, " is an older woman with a shock of brilliant white hair with blue highlights. Her wide-mouthed smile shows her teeth to be a distant memory, honoured more in the breach than the observance."; ], Chat 0, Topics 0, ordered false, initial [; if (location hasnt visited) { self.Chat = 0; give self general; print "An older woman stands behind the counter, dealing with a customer, a large burly man.^ ^~Well, I'm sorry, luv,~ says ", (the) Shopkeeper, ", ~but the original order quite clearly says ", (i) "red", " mahogany, and there's your signature at the bottom. Did you want to wait for the black to come in?~^ ^The burly man looks around in some consternation. ~But it's taken five weeks just to get this order. How much longer would black mahogany take?~^ ^The shopkeeper purses her lips. ~Ooh, that would take another five to six at least, luv, I'm sorry. D'you know any wizards? If you did, I could p'raps bump you up the list a bit.~^ ^~Bah!~ snorts the man in disgust. ~When I used to deal with William, this never happened.~ He turns to stomp out of the store. ~Wizards,~ he mutters as he passes you, looking darkly at your robes"; if (Bearskin_Rug has worn) print " peeking out from under the rug"; ".^ ^The shopkeeper sighs as he leaves. ~Customers,~ she smiles, looking at you. ~Now, luv, you look like a nice wizard's apprentice, what can I do for you?~"; } if (self hasnt general) { self.Chat = 0; give self general; switch(random(2)) { 1: "~Hello there, luv!~ calls ", (the) self, " cheerfully as you step into the shop."; 2: if (Bearskin_Rug has worn) print_ret (The) self, " sighs as you come shuffling into the shop. ~Dearie me, it's going to be a long week.~"; if (Helmet has worn) print_ret (The) self, "'s eyes flick up to the helmet and her eyebrows rise slightly. ~Expecting some danger are you, luv?~"; if (Chamberpot has worn) { print_ret (The) self, " looks at the chamberpot on your head. ~Oh dear, luv,~ she says, trying to stifle a giggle. ~You've gone completely potty!~"; } switch(random(100)) { 1 to 20: "~Welcome to Wizardry Wooding, luv,~ calls ", (the) self, " as you enter."; 21 to 30: print "~Why, hello luv!~ says ", (the) self, ". She nods at your robes"; if (Bearskin_Rug has worn) print " peeking out from under the rug"; ". ~Always happy to welcome one with connections to the magic trade.~"; 31 to 50: print "~Come to buy some "; if (self.ordered == true) print "more "; "wood, have you, luv?~ smiles ", (the) self, ". ~Remember, ours is the best in town.~"; 51 to 70: "~Dead bored?~ asks ", (the) self, " as you enter. ~Why not pick up one of our dead boards of pine and spruce up your life?~"; 71 to 85: print_ret (The) self, " looks up from polishing the countertop as you step in. ~Hello, luv!~"; 86 to 90: "~Half a mo, luv!~ comes a call from the back room. A moment later, ", (the) self, " steps into the front. ~What can I do for you, dearie?~"; 91 to 93: "There is a growling snarling roar from the back room as you step into the shop. ~I know, mum,~ calls ", (the) self, " over her shoulder. ~But I told you, it's not anywhere near teatime yet.~"; 94 to 96: "A wailing scream comes from the back room as you step into the store.^ ^", (The) self, " winces. ~Don't mind the noise, luv, it's just mum. She's gone a bit doolally I'm afraid. Twilight years, you know.~"; 97 to 99: "~Ooh, a customer!~ squeals ", (the) self, " as you step into the store. Suddenly, from the back room, you hear the noise of a whetstone turning and the sound of something being sharpened.^ ^~It's all right, mum,~ calls ", (the) self, " over her shoulder. ~This one's a wizard's apprentice.~^ ^The noise stops."; 100: print_ret (The) self, " is arguing loudly with a customer as you step in. ~What do you mean by that, luv?~ she demands angrily.^ ^~I'm saying you're holding up my order on bloody purpose, that's what I'm saying!~ shouts the angry customer, his face red. ~I know it's back there!~^ ^~Oh is it then, luv?~ ", (the) self, " says sarcastically. ~Right then, come on.~ She waves the customer into the back room, and the two of them vanish behind the curtain.^ ^You hear some rummaging around and a few minutes later, the bone-chilling sound of a blunt weapon striking unprotected flesh. A scream fills the air, piercing you to the heart before it is cut off. You hear the sound of heavy thumping or chopping. Then, all is silent. ", (The) self, " steps back into the room, brushing off her hands.^ ^~Hello, luv!~ she greets you, a warm smile on her lips. ~Sorry about the customer difficulties, just dealing with them. What can I do for you?~"; } } } print_ret (The) self, " is fussing about behind the counter."; ], each_turn [; if (self.Chat == 1) { switch(random(50)) { 1 to 10: print "^", (The) self, " brushes some invisible specks of dirt from the countertop.^"; 11 to 20: print "^", (The) self, " fluffs her blue-tinged hair with one hand.^"; 21 to 25: print "^~Hmmm...~ mutters ", (the) self, " stopping suddenly to make a note on a piece of paper.^"; 26 to 30: print "^", (The) self, " straightens up her countertop meticulously.^"; 31 to 35: print "^", (The) self, " picks up a piece of paper from the countertop and sighs.^"; 36 to 40: print "^", (The) self, " jots something down on a piece of paper and nods approvingly.^"; 46 to 48: print "^", (The) self, " sighs and leans her elbows on the countertop.^"; 49: print "^A blood-curdling scream comes from the back room. ", (The) self, " smiles. ~Don't mind mum, luv, she's having one of her days.~^"; 50: print "^A blood-curdling scream comes from the back room. ", (The) self, " smiles. ~Excuse me for a tic, luv.~^ ^She disappears behind the curtain as the screams rise in intensity. You hear a sudden thump and the screams stop.^ ^", (The) self, " steps back into the shop and exhales noisily. ~My goodness! That ought to keep the old dear quiet for a few hours! Now, where were we?~^"; } } self.Chat = random(3); rtrue; ], before [; Attack: "You pull back to swing at ", (the) Shopkeeper, " but a dangerous glint in her eye warns you off. She nods approvingly as you reconsider. ~There, luv, that's a good customer.~"; Bargain: "~My prices are fixed by the Wizards Guild, luv,~ smiles ", (the) self, " apologetically."; Listen: print_ret (The) self, " makes little noises as she putters about her work."; MeetNPC: if (self has proper) "~Yes luv, we've already met.~ The shopkeeper clucks at you in sympathy. ~If you're this forgetful now, I'm sure you'll make a wonderful wizard when you finish your apprenticeship.~"; self.short_name = "Betty"; give self proper; "The shopkeeper smiles a broad toothless grin at you. ~I'm right pleased to meet you, luv. I'm Betty.~"; Smell: "You sniff at ", (the) self, " surreptitiously and catch the pleasant odour of pine."; Talk: if (self hasnt proper) <>; print_ret (The) self, " looks at you expectantly. ~Yes luv?~"; Take,Kiss,Touch,Search: print_ret (The) self, " backs away from you. ~Now, now luv, don't misunderstand my friendliness.~"; ], life [obj; Answer: if (noun == 'hello' or 'hi') <>; if (WordInProperty(noun, WoodObj, pname) || WordInProperty(noun, WoodObj2, pname)) <>; print_ret (The) self, " looks at you expectantly. ~Yes, luv?~"; Ask: if (WordInProperty(second, Curtain, name)) <>; else if (WordInProperty(second, Shopkeeper, name)) { if (self hasnt proper) <>; if (self.Topics & FLAG_x1 == FLAG_x1) "~There's really not anything else to tell, luv,~ says ", (the) self, ", smiling at you."; self.Topics = self.Topics | FLAG_x1; "~Me, luv?~ asks ", (the) self, ", seeming surprised. ~There's not much to tell. Lived in Vechlee all my life. I took this job for a little extra money in my retirement.~"; } else if (WordInProperty(second, WoodObj, pname) || WordInProperty(second, WoodObj2, pname)) { if (WoodObj has general) { if (self.ordered == false) { self.ordered = true; "~Of course, luv,~ says ", (the) self, ". She springs into action and notes down your order meticulously. ~Now let me just check...~ She vanishes into the back room for a few seconds, where you hear her rummaging about. She soon returns.^ ^~We don't have any in stock at the moment, but I've put you down on the list,~ she says, her blue-tinged hair bobbing as she nods her head.^ ^~Although,~ she adds, frowning, ~as you're not a wizard, I'm afraid you go near the bottom of the list, just above our regular non-wizard customers, luv. Still, it doesn't take long; your wood should be here in about four weeks.~"; } print_ret (The) self, " smiles apologetically. ~You've already got some wood on order, luv. You'd best wait until that comes in before you go ordering more.~"; } if (self.Topics & FLAG_x6 == FLAG_x6) { print_ret (The) self, " fixes you with a rather hot stare. ~Luv, if you think I'm repeating that list again, you're sorely mistaken. You'll just have to remember.~"; } if (self.Topics & FLAG_x5 == FLAG_x5) { print (The) self, " sighs and pulls herself off the counter. ~Now, now, luv, you really must listen this time. It fair tires me out repeating this list.~^"; self.Topics = self.Topics | FLAG_x6; } else { print (The) self, " brightens visibly and pulls herself off the counter. ~So you're interested in some wood are you? Well, let me run down what we've got, luv.~^"; self.Topics = self.Topics | FLAG_x5; } print "^She takes a deep breath.^ ^~We've got alder, ash, aspen, balsa, bamboo, basswood, birch, butternut, cedar, dark cedar, white cedar, red cedar, cherry, chestnut, cottonwood, cypress, ebony, elm, soft elm, rock elm, fir, hawthorn, hemlock, hickory, holly...~ She trails off.^"; print "^~Half a mo, and let me catch my breath, luv.~ She pauses and fills her lungs again.^ ^~We've also got larch, maple, hard maple, soft maple, mahogany, red mahogany, black mahogany, myrtle, pecan, persimmon, pine, red pine, white pine, dried pine, knotty pine, dried knotty pine, spruce, redwood, rosewood, rowan, sycamore, teak, willow and black willow.~^"; print_ret "^~Now then luv,~ smiles ", (the) self, ". ~Which would you like?~"; } else if (WordInProperty(second, Stone_Bottle, name)) "~WizStrip is certainly the most popular brand, luv. We usually have a few bottles around, but not this week I'm afraid.~"; else switch(second) { 'haggling', 'bartering', 'barter', 'bargain', 'bargainin', 'haggle', 'deal', 'trade', 'discount', 'sale': <>; 'customer', 'man', 'customers', 'wizard', 'wizards', 'wizard^s', 'wizardry': if (self.Topics & FLAG_x2 == FLAG_x2) "~Well, as I said, luv, we get all kinds of customers in here, mostly wizards.~"; self.Topics = self.Topics | FLAG_x2; "~We get all kinds of strange customers in here,~ confides ", (the) self, ". ~Most are wizards and they're an odd bunch.~"; 'board', 'boards': print "~Ooh, getting your wood cut into boards adds weeks to any order, luv,~ frowns ", (the) self; if (self.ordered == true) ". ~You'd best just wait until your wood comes in, and we'll worry about it then.~"; print_ret (string)period; 'renaldo': "~Ooh, such a nice man, luv,~ gushes ", (the) self, ". ~I met him once, you know, when I was just starting work here. Very friendly.~"; 'virgil': "~Ooh, he's a bit stern, that one, luv,~ cautions ", (the) self, ". ~He's been in a few times to buy wood for the Guild, and he's always surly. Mum didn't like the sound of him at all.~"; 'mum', 'mother', 'mummy', 'mom', 'mommy': print_ret (The) self, " leans across the counter. ~She doesn't like people talking about her, luv,~ she whispers, ~so we'd best not.~"; 'ninario', 'nin', 'ninny': "~I haven't seen him in quite a while, the poor dear,~ frowns ", (the) self, ". ~Of course, he's in a bit of a legal squabble with the guild, so I'm sure he's busy.~"; 'legal', 'squabble', 'wizarding', 'weekly', 'wonderful', 'paper', 'troubles': "~I read all about Ninario's troubles in Wizarding Weekly, luv,~ confides ", (the) self, ". ~It's a wonderful paper.~"; 'oak': if (self.Topics & FLAG_x3 == FLAG_x3) "~I told you, luv, I've never heard of ", (i) "oak", " before."; self.Topics = self.Topics | FLAG_x3; "~Oak?~ blinks ", (the) self, " in surprise. ~I've never heard of it. It must not be a very popular wood, luv, because if it was, we'd carry it, naturally.~"; 'plumber^s', 'union', 'plumber', 'plumbers': if (self.Topics & FLAG_x7 == FLAG_x7) { "~I told you, luv, don't get mixed up with that lot. Best not to go around mentioning them either.~"; } self.Topics = self.Topics | FLAG_x7; "~The Plumbers Union?~ says ", (the) Shopkeeper, " her voice lowering conspiratorially. ~A right nasty bit of work they are. Seditious... anti-magic and all. Don't go getting mixed up with them, luv, you'll regret it.~"; 'poplar', 'popular': if (self.Topics & FLAG_x4 == FLAG_x4) print "~I told you, luv, all our wood is extremely"; else print "~Popular?~ repeats ", (the) self, ". ~'Course it is, luv, all our wood's"; self.Topics = self.Topics | FLAG_x4; " popular. Just tell me what kind you want.~"; 'william', 'william^s', 'woodcrafts': if (self.Topics & FLAG_x10 == FLAG_x10) print "~Well, as I said, such a shame, luv,~ says "; else print "~Isn't it such a shame, luv?~ asks "; self.Topics = self.Topics | FLAG_x10; print_ret (the) self, ", shaking her head. ~He was such a nice man of course, but selling all that ordinary plain wood to all those customers... all without Guild sanction. Poor dearie. He should have seen it coming.~"; 'plotkin', 'plotkins': "~They're the unit of currency around here, luv,~ smiles ", (the) self, (string)period; 'free', 'sample': "~Free samples are for wizards only, I'm afraid, luv,~ smiles ", (the) self, ", ~but be sure to mention it to your master.~"; 'law-abidi', 'citizen': "~I certainly am, luv,~ she declares proudly."; 'eliza', 'stilton': "~Eliza's activities are nothing to do with me, luv,~ declares ", (the) self, ". ~I'm a law-abiding citizen.~"; 'cheese': print_ret (The) self, "'s eyes narrow. ~I sell wood,~ she says, a bit menacingly, ~not cheese. You want cheese, go visit Eliza Stilton's place.~"; 'emily', 'short': "~Hah!~ snorts ", (the) self, ". ~I'm not likely to ever see ", (i) "her", " in here. All she ever buys is cheese!~"; 'turthalio', 'michael': "~I don't really know much about Turthalion,~ confesses ", (the) self, ". ~He's the ruler of Thalion, and he lives in Blumph, about forty miles west of here.~"; 'blumph', 'port': "~Well, Blumph is about forty miles west of Vechlee,~ says ", (the) self, ", ~but it might as well be half a world away, it's so different. I certainly wouldn't ever live there. I mean, a port city, luv? No thank you!~"; 'hastener': "~Wood hastener!~ says ", (the) self, ". ~Very nice, luv. Just the thing for speeding up the growth of young trees or making green lumber expand ever so slightly. We usually have a few tubes available, but not this week.~"; 'vechlee', 'here', 'city': "~Much more cosmopolitan than Blumph,~ nods ", (the) self, ". ~And of course so many more wizards! I think it's a grand place to live.~"; 'thalion', 'country', 'land': "~Oh, I've lived in Thalion all my life,~ smiles ", (the) self, (string)period; default: "~Ooh, I wouldn't worry about that at all if I were you, luv,~ smiles ", (the) self, ". ~Best not to, really.~"; } Give: <>; Show: if (noun ofclass Purse && child(noun) ~= 0) { if (noun hasnt open) { give noun open; print "(opening ", (the) noun, " first)^"; } obj = child(noun); <>; } if (noun ofclass Substance) print_ret (The) Shopkeeper, " blenches as she sees ", (the) noun, ". ~That's hermeticks, isn't it? Put ", (itorthem)noun, " away, please, luv!~"; switch(noun) { Hastener: <>; Hand_Drill: if (self.Topics & FLAG_x8 == FLAG_x8) { print_ret (The) self, " sniffs. ~I'm not looking at it. You can keep your science to yourself, luv. Just don't let the Wizards Guild catch you at it.~"; } self.Topics = self.Topics | FLAG_x8; print_ret (The) self, " looks at the drill curiously and then glances away quickly. ~Ooh, take that away, luv, that looks like science. I wouldn't want the wizards to think I was interested in that sort of thing; I'd lose my job.~"; Stone_Bottle: print (The) self, " glances at ", (the) noun, ". ~Oh, WizStrip. That's the most popular brand, luv. We usually have a few bottles around as well, but not this week.~"; if (noun.sealed == true) "^^She taps the seal at the neck of the bottle. ~Of course, we don't usually seal ours quite like this.~"; new_line; rtrue; default: print_ret (The) self, " glances at ", (the) noun, " and shrugs. ~I'm sure it's very interesting for you, luv, but I'm not sure what it's got to do with me.~"; } Tell: if (second == 'me' or 'myself' or 'you' or 'yourself') "~That's wonderful, luv,~ says ", (the) self, " smiling encouragingly at you. ~Keep up the good work.~"; print_ret (The) self, " shrugs disinterestedly."; ], orders [; Give: if (noun == Oak) <>; if (noun == WoodObj) <>; "~I've got to concentrate on my work, luv.~"; Meet,MeetNPC: <>; default: "~I've got to concentrate on my work, luv.~"; ], has animate female; Prop -> Countertop "countertop" with name 'counterto' 'counter' 'top', description "The plain wooden countertop is unremarkable.", DeadWood true, before [; Climb,Enter: "~Oh no, luv, don't want footprints on the counter,~ says ", (the) Shopkeeper, ", wagging a finger at you."; Receive: "~Oh no, luv, can't have that,~ says ", (the) Shopkeeper, ", removing ", (the) noun, " from the countertop and handing ", (itorthem)noun, " back to you. ~Must keep the work area clean! What if a wizard came in?~"; Rub: "~Dearie me, luv, I thought ", (i) "I", " was fussy about dirt,~ says ", (the) Shopkeeper, " as you give the countertop a quick wipe."; ], has supporter; Prop -> Curtain "curtain" with name 'curtain' 'curtained' 'doorway' 'backroom' 'back' 'room' 'store' 'storeroom', description "The curtain hangs loosely over a doorway to the east.", before [; Examine: rfalse; default: <>; ]; Object -> WoodObj "wood", with pname 'alder' 'ash' 'aspen' 'balsa' 'bamboo' 'basswood' 'birch' 'butternut' 'cedar' 'chestnut' 'cherry' 'cottonwoo' 'cypress' 'ebony' 'elm' 'fir' 'hawthorn' 'hemlock' 'hickory' 'holly' '.x' 'dark' '.x' 'red' '.x' 'white' '.x' 'rock' '.x' 'soft' '.p' 'wood', FakeObj, react_before [; Buy: if (noun == self or Woodobj2) rfalse; "The only thing for sale here is wood."; ], before [; Buy: if (self hasnt general && (Shopkeeper.Topics & FLAG_x5 ~= FLAG_x5)) { ; give self general; rtrue; } give self general; <>; default: "Odd as it may be, Wizardry Wooding seems completely devoid of any wood at all."; ], has scenery; Object -> WoodObj2 "wood" with pname 'larch' 'maple' 'mahogany' 'myrtle' 'pecan' 'persimmon' 'pine' 'spruce' 'redwood' 'rosewood' 'rowan' 'sycamore' 'teak' 'willow' '.x' 'dark' '.x' 'red' '.x' 'white' '.x' 'rock' '.x' 'soft' '.x' 'hard' '.x' 'dried' '.x' 'knotty' '.x' 'black', FakeObj, before [; Buy: <>; default: "Odd as it may be, Wizardry Wooding seems completely devoid of any wood at all."; ], has scenery; Object -> Oak "oak" with parse_name [i; while (true) { switch(NextWord()) { 'oak': self.oak_or_poplar = 0; i++; 'poplar': self.oak_or_poplar = 1; i++; default: return i; } } ], oak_or_poplar 0, FakeObj, before [; Buy: if (self.oak_or_poplar == 0) <>; else <>; default: "Try as you might, you can't see that here."; ], has scenery; Outroom Market_Square "Market Square" with description [; if (location hasnt visited) { give Market1 ~concealed; give Market2 ~concealed; give Market3 ~concealed; give Market4 ~concealed; } print "A bustle of people and activity fills this cobblestoned market square. The people of Vechlee hurry about their business, intent on their daily tasks with barely a glance to spare for a lowly wizard's apprentice, otherworldly or not.^ ^Many different shops and establishments line the edges of the square. To the north is a sturdy workmanlike building, falling into disrepair. Large letters over the entrance read ", (i) "Vechlee Townspeople Building Society", ". To the south is a sprawling commercial edifice, with a seemingly endless stream of wizards pushing their way through the doors. Gilt-edged lettering over the door reads ", (i) "Wizards Guild Savings & Loan", ".^ ^To the northwest is a small shop, notable more for the lack of customers streaming into it than any other distinguishing characteristic. Small hand-lettered writing over the doorway reads ", (i) "Sorcery Supply", ". Southwest, the cobblestoned road heads out of the square and toward the western outskirts of Vechlee. Back to the northeast lies the town gate.^ ^An abandoned market stall sits here, weathered and worn"; if (Herm_Notice hasnt moved) print ", a yellowed piece of paper attached to its side"; print_ret (string)period; ], Floor COBBLES, Carpet_Go [; PlayerTo(W_Courtyard); rfalse; ], crone_warning 0, compass_look [obj; if (obj == s_obj) { Square_Props.item_num = 1; <>; } if (obj == n_obj) { Square_Props.item_num = 2; <>; } if (obj == nw_obj) { Square_Props.item_num = 4; <>; } if (obj == sw_obj) "Southwest, the cobblestoned road heads out of the square and towards the western outskirts of Vechlee."; if (obj == ne_obj) "The town gate area lies back to the northeast."; if (obj == u_obj) <>; "You don't see anything interesting in that direction, other than what's already been mentioned."; ], cant_go [; "You can head north into the Vechlee Townspeople Building Society, south into the Wizards Guild Savings & Loan or northwest into Sorcery Supply.^ ^The street also heads northeast to the town gate, or southwest to the outskirts."; ], ne_to [; print "You push northeast through the crowd back toward the town gate.^"; return Vechlee_Gate; ], sw_to [; print "You push your way out of the market square and head southwest through ever-thinning crowds to the outskirts of Vechlee.^"; return Outskirts; ], s_to [; print "You push your way through the throng of wizards and into the Wizards Guild Savings & Loan. Before you can take another step, a"; if (self has general) print "nother"; give self general; " short and rather ugly guard grabs you.^ ^~Oi! Non-wizard banking hours are from eleven until three every second Wednesday.~ He pushes you back out into the street, wagging a finger."; ], n_to [; print "You push through the throngs of people in the square and into the empty silence of the Vechlee Townspeople Building Society.^"; return Build_Society; ], nw_to [; if (self.crone_warning == 1) "Continuing to frequent the scene of the crime would be unwise. You'd better not risk visiting Sorcery Supply again."; if (Crone.out == true) { self.crone_warning++; print "You step cautiously back into the store and breathe a sigh of relief. It appears no one has come in yet and discovered the body.^"; } else print "You step out of the bustle of the market square and into the dimly lit quiet of Sorcery Supply.^"; return Sorcery_Supply; ]; Object -> Square_Props with parse_name [i; while (true) { switch(NextWord()) { 'bank', 'wizard^s', 'wizards', 'guild', 'savings', 'loan': self.item_num = 1; i++; 'vechlee', 'townspeop', 'building', 'society', 'sturdy', 'workmanli', 'disrepair': self.item_num = 2; i++; 'abandoned', 'market', 'weathered', 'worn', 'stall': self.item_num = 3; i++; 'small', 'shop', 'sorcery', 'supply': self.item_num = 4; i++; default: return i; } } ], short_name [; switch(self.item_num) { 1: print "Wizards Guild Savings & Loan"; 2: print "Vechlee Townspeople Building Society"; 3: print "abandoned stall"; 4: print "Sorcery Supply"; } rtrue; ], description [; switch(self.item_num) { 1: "The sprawling commercial edifice has a seemingly endless stream of wizards pushing their way through the doors. Gilt-edged lettering over the door reads ", (i) "Wizards Guild Savings & Loan", (string)period; 2: "The sturdy workmanlike building is falling into disrepair. Large letters over the entrance read ", (i) "Vechlee Townspeople Building Society", (string)period; 3: print "The abandoned stall looks like it hasn't been touched for a number of years; this may be a good thing, as it also looks like it might collapse in on itself if it ", (i) "were", " touched.^"; if (Herm_Notice hasnt moved) "^A yellowed piece of paper is attached to the side of the stall."; rtrue; 4: "The small shop is notable more for the lack of customers streaming into it than any other distinguishing characteristic. Small hand-lettered writing over the doorway reads ", (i) "Sorcery Supply", (string)period; } ], item_num 1, FakeObj, before [; Enter: switch(self.item_num) { 1: <>; 2: <>; 3: <>; 4: <>; } Examine: rfalse; default: if (self.item_num == 3) "The whole thing looks in imminent danger of collapsing, so it might be safer not to disturb it any further."; "You don't need to worry about doing that to ", (the) self, (string)period; ], has scenery; Object -> Herm_Notice "yellowed piece of paper" with name 'yellowed' 'piece' 'of' 'paper' 'notice', parse_name ParseNameOf, description [; print "The piece of paper is yellowed with age and exposure to the elements. It's surprising it's survived as long as it has, but the paper looks fairly heavy and durable, so that might be why. A note is scrawled on it in a rather shaky hand.^"; new_line; <>; ], before [; Read,Search: font off; print "Due to the constant annoying stream of customers that owning a business seems to have generated, I have retired to the mountains to pursue life as a hermit. Do ", (i) "not", " come to visit, do ", (i) "not", " come to buy nice shiny objects for your hearth and home at low, low prices and above all, do ", (i) "not", " come to offer me one more chance to purchase anything that slices, dices, purees or chops -- Robert^"; font on; print "^At the bottom of the note, a different hand has added:^"; font off; print "^Yes, we at the Bureau of Public Works are aware that this stall has been abandoned for some three weeks now. The problem will be dealt with as soon as the necessary Temporary Stall Removal Forms are processed by the Bureau of Stamping, Filing and Collating (now a wholly licensed subsidiary of the Wizards Guild). Kindly stop dropping by to inform us of the abandoned stall, as the crowds of helpful people are creating needlessly long lines in the Bureau and ruining the graceful architectural lines of the lobby. -- B.P.W.^"; font on; rtrue; Take: if (self has scenery) give self ~scenery; ], after [; Take: give self ~scenery; if (self hasnt moved) "The yellowed paper peels slowly off the side of the stall, crackling alarmingly."; ], has scenery readable; Room Sorcery_Supply "Sorcery Supply" with description [; if (location hasnt visited) { give SS1 ~concealed; give SS2 ~concealed; give SS3 ~concealed; give SS4 ~concealed; } "Eerie ghostly light flows dimly into this shop from unseen sources, bathing everything in an almost mystical glow. The smell of incense and various magical chemicals and powders lend the shop a heady aroma that makes your head spin. The room is steeped in a palpable air of magic. Southeast is the doorway back to the market square, whose bright sunshine and loud noises seem a distant memory."; ], compass_look [obj; if (obj == se_obj) "The bustle of the market square seems muffled and distant."; TouchWalls(obj, self.Floor, self.Walls); rtrue; ], before [; Exit: if (player in location) <>; rfalse; Go: if (noun == se_obj) { give Crone ~general; Crone.warn = false; rfalse; } Smell: if (noun == nothing) "The smell of incense and various magical chemicals and powders lend the shop a heady aroma that makes your head spin."; rfalse; ], cant_go [; "The only way out is southeast back to the market square."; ], se_to [; if (Crone.out == false) { switch(random(8)) { 1: print "~Come again, young apprentice!~ calls ", (the) Shopkeeper, " as you leave.^^"; 2: print "~Cast carefully,~ calls ", (the) Shopkeeper, " as you head out the door.^^"; 3: if (Scrying_Bowl.bought == true) print "~Good luck with the scrying bowl!~ calls ", (the) Crone, " as you step out.^^"; else print "~Be sure to come back and check out our competitive prices on scrying equipment!~ calls ", (the) Crone, " as you step out.^^"; 4: print "~Say hello to your master for me,~ says ", (the) Shopkeeper, " as you step out.^^"; 5 to 8: ; } } print "You step back out of the dim and dusty shop into the brilliant sunshine of the market square.^"; return Market_Square; ]; Object -> Crone "old crone" with name 'old' 'crone' 'bat' 'woman' 'lady' 'luv' 'vendor' 'clerk' 'clark' 'shopkeepe' 'keeper' 'body', article "an", description [; if (self.out == true) print_ret (The) self, " lies dead on the floor, her broken jaw and bruised cheek mute evidence of the violence of your attack."; "Deep creases line the face of this ancient woman, like crevasses in a crag of leathery flesh. Her eyes are two small pinpoints buried in a maze of wrinkles, but they gaze at you with surprising intensity.^ ^The woman returns your scrutiny with an open stare of her own. ~Yes, my dear,~ she murmurs mysteriously, her voice a raw throaty scratch. ~Let each study the other.~"; ], Chat 0, Topics 0, out false, warn false, initial [; if (location hasnt visited) { self.Chat = 0; give self general; "~Greetings, young apprentice!~ calls the shopkeeper, ", (a)self, " sitting in a rocking chair. ~Welcome to Sorcery Supply, ", (i) "the", " place for all manner of spellcasting paraphernalia.~"; } if (self.out == true) "The body of ", (the) self, " lies motionless on the floor."; if (self hasnt general) { self.Chat = 0; give self general; switch(random(2)) { 1: "~Greetings, young apprentice!~ calls ", (the) self, " cracklingly as you step into the shop."; 2: if (Bearskin_Rug has worn) if (self.Topics & FLAG_x5 ~= FLAG_x5) { self.Topics = self.Topics | FLAG_x5; print_ret (The) self, " squints at the bearskin rug and cackles loudly."; } if (Helmet has worn) if (self.Topics & FLAG_x6 ~= FLAG_x6) { self.Topics = self.Topics | FLAG_x6; print_ret (The) self, " looks at the helmet and rubs her hands together. ~Oh-ho! Dangerous times indeed,~ she cackles."; } if (Chamberpot has worn) { if (self.Topics & FLAG_x7 ~= FLAG_x7) { self.Topics = self.Topics | FLAG_x7; print_ret (The) self, " glances curiously at the chamberpot on your head. ~That's Ninario's chamberpot,~ she says sharply. ~I'd recognise those rabbits anywhere.~"; } } switch(random(100)) { 1 to 20: "~Come in, come in,~ calls ", (the) self, " as you enter."; 21 to 30: "~Ah, the apprentice enters,~ says ", (the) self, ", ~perhaps seeking items for a school project. Greetings, young one.~ She nods at you."; 31 to 50: print_ret (The) self, " nods at you from her rocking chair as you step into the shop."; 51 to 70: print_ret (The) self, "'s intense stare greets you as you enter. She seems almost to be appraising you."; 71 to 80: print_ret (The) self, " looks up from peering into the display case. ~What can I do for you, my young student?~ she asks, straightening."; 81 to 90: "~If you can cast a spell with it, then we've got it,~ says ", (the) self, " as you step into the shop. ~Welcome to ", (i) "the", " source for sorcery supplies, Sorcery Supply.~ She pauses with a look of disgust. ~I have ", (i) "got", " to get a new slogan,~ she mutters."; 91 to 99: "~If we don't have it, then you can't cast anything useful with it,~ says ", (the) self, ". ~Sorcery Supply has Vechlee's largest supply of aftermarket magic accessories.~"; 100: print "There is a flurry of activity as you step into the room. You hear the clang of metal being slapped down on a surface, and you see ", (the) self, " jump back into her rocking chair, trying for all the world to look like she's been settled there for quite some time.^ ^As you step closer, you see that she is hurriedly stuffing something into her mouth. You realise, with a shudder of distaste, that they are raw cheese curds. She wolfs them down quickly.^ ^~Yes, my dear, what can I do for you?~ she asks, wiping her mouth.^"; if (Scrying_Bowl.bought == false) "^You notice that the silver bowl is rocking back and forth on its stand."; rtrue; } } } print_ret (The) self, " sits and rocks slowly back and forth on her chair."; ], each_turn [; if (self.out == true) rtrue; if (self.Chat == 1) { switch(random(50)) { 1 to 10: print "^", (The) self, " brushes down the front of her plain black dress.^"; 11 to 20: print "^", (The) self, " cackles quietly to herself as she rocks back and forth.^"; 21 to 25: print "^", (The) self, " glances up at you briefly.^"; 26 to 30: print "^~Eye of newt,~ mutters ", (the) self, " glancing at a piece of paper in her hand. ~How provincial.~^"; 31 to 35: print "^", (The) self, " sighs and shifts slightly in her rocking chair.^"; 36 to 40: print "^", (The) self, " jots something down on a piece of paper and nods approvingly.^"; 41 to 45: print "^~Are you going to buy "; if (Scrying_Bowl.bought == false) print "something"; else print "anything else"; print ",~ asks ", (the) self, " suddenly, ~or just stand there like a lump in a bog? This isn't the student lounge, you know.~^"; 46 to 48: print "^The old woman flicks an eye in your direction. ~Still here, are you? Well, tell that bumbleheaded fool Ninario I said hello.~^"; 49: print "^~Bubble, bubble, toil and trouble?~ hoots ", (the) self, " suddenly, loudly and derisively, her head cocked to one side as if listening to someone far away. ~I told Sarah last week the only reason my cauldron was bubbling was because I dropped bicarbonate of soda into it by mistake. She doesn't listen.~^"; 50: print "^A sudden gleam comes into ", (the) self, "'s eyes. ~Cheese, my dear student, that's the true secret to divination. Cheese!~ She falls silent, an odd but pensive smile on her face.^"; } } self.Chat = random(5); rtrue; ], YesAttack [; <>; ], NoAttack [; Crone.warn = false; "You decide against attacking the sweet old crone."; ], before [; if (self.out == true && action ~= ##Bargain or ##Examine or ##Kiss or ##Touch or ##LookUnder or ##Search or ##Buy) print_ret (The) self, " is now beyond your reach. Leave her to rest in peace."; Attack: if (self.warn == false) { self.warn = true; print "Are you really sure you want to attack such a frail-looking and harmless old crone?^"; YesNo.Ask(self.YesAttack,self.NoAttack,0); rtrue; } self.out = true; Achieved(18); print_ret (The) self, " is fast for her age, but not as fast as you. There is a sickening crunch as you make contact with her jaw, brittle bones snapping beneath the impact. She drops to the floor with a disturbingly final thump, a large purple bruise flowering on her face, and guilt and remorse flowering in your brain."; Bargain: if (self.out == true) "For some reason, ", (the) self, " shows even less interest in negotiating a discount with you now."; <>; Buy: if (self.out == true) "Perhaps if you were a mortician, you might be interested, but you're not, so you're not."; "She'd really only be of interest to an antique collector now."; Kiss: if (self.out == true) "You kiss the cold dead cheek of ", (the) self, " but nothing unexpected happens."; if (self.Topics & FLAG_x11 == FLAG_x11) print_ret (The) self, "waves you away. ~One kiss is already more than anyone of your age should have to bestow on anyone of mine,~ she says.^ ^~Besides,~ she adds, an odd glint coming into her eyes, ~you haven't discovered the side effects of the last one yet.~"; self.Topics = self.Topics | FLAG_x11; "You bestow a chaste kiss on ", (the) self, "'s leathery cheek. ~Oh-ho!~ she cackles disturbingly. ~The charms of the wily ", (name)self, " melt the stubborn heart of the student.~"; Listen: print_ret (The) self, " makes no noise, save for the slow quiet creaking of her rocking chair."; MeetNPC: print_ret (The) self, " flashes a grim smile at you. ~The giving of names is also a giving of power. You'll not get mine so easily.~"; Search: if (self.out == true) { print "You rifle quickly through ", (the) self, "'s clothing, but you don't find anything"; if (Scrying_Bowl.bought == true) print ", not even your ten plotkin piece"; print_ret (string)period; } print_ret (The) self, " cackles and smacks your hand away. ~No you don't, my dear.~"; Smell: print_ret (The) self, " doesn't smell terribly clean."; Talk: print_ret (The) self, " looks at you expectantly."; Take: if (self.out == true) "If you start carting ", (the) self, "'s dead body around, you'll definitely be fingered for the deed."; print_ret (The) self, " cackles and smacks your hand away. ~No you don't, my dear.~"; Touch: if (self.out == true) print_ret (The) self, "'s dry leathery skin is already starting to feel cold to the touch."; if (self.Topics & FLAG_x12 == FLAG_x12) print_ret (The) self, " stops you with a light touch of her hand. ~Ah,~ she says with a tinge of regret, ~we have learned all we can that way.~"; self.Topics = self.Topics | FLAG_x12; "~Touch,~ murmurs the old woman as you raise a hand to her leathery cheek, ~the most informative, yet least-used form of human interaction.~ She raises a hand in return to caress your face."; ], life [obj; if (self.out == true) print_ret (The) self, " seems to be ignoring you. Perhaps the cold dead stare in her eyes means something."; Answer: if (noun == 'hello' or 'hi') <>; print_ret (The) self, " fixes you with a beady eye. ~What did you want, my young apprentice?"; Ask: if (WordInProperty(second, Asiago, name) || WordInProperty(second, Bel_Paese, name) || WordInProperty(second, Wensleydale, name) || WordInProperty(second, Camembert, name) || WordInProperty(second, Gouda, name) || WordInProperty(second, Emmental, name) || WordInProperty(second, Stilton, name) || WordInProperty(second, Miranda, name) || WordInProperty(second, Cheshire, name) || WordInProperty(second, Roquefort, name) || second == 'venezuela' or 'venezeula' or 'beaver' or 'caerphill' or 'philly' or 'divinatio' or 'secret') "A sudden gleam comes into ", (the) self, "'s eyes. ~Cheese, my dear student, that's the true secret to divination. Cheese!~ She falls silent, an odd but pensive smile on her face."; if (WordInProperty(second, magic_clothes, name)) print_ret (The) self, " shrugs. ~They look like pretty ordinary apprentice robes to me. No individuality, no expression. Of course, I only carry wizard's robes, and I can't sell you a set until you get your full degree.~"; switch(second) { 'arktos', 'jar', 'essence': "~Arktos essence?~ says ", (the) self, " sounding surprised. ~Did you need to catch a bear?~"; 'barter', 'bartering': "~No trades,~ says ", (the) self, " firmly."; 'catching', 'catch', 'bear', 'bears': "~If you want to attract a bear, arktos essence is the stuff,~ says ", (the) self, " confidently."; 'haggling', 'bartering', 'barter', 'bargain', 'bargainin', 'haggle', 'deal', 'trade', 'discount', 'sale': "~What? You want a discount?~ cries ", (the) self, ". ~I'm already giving you a chance to buy rare adventuring articles at low, low prices!~"; 'emily', 'short': "~She's a very popular wizard, though not everyone appreciates her style of spellcasting. Renaldo did, but he couldn't get over her cheese fixation, so I've heard.~"; 'lump', 'bog', 'bogs', 'dead', 'trees': "~Bogs are full of lumps,~ says ", (the) self, ", ~dead trees, moss, former apprentices, you name it.~"; 'former', 'apprentic': print_ret (The) self, "'s eyes gleam. ~The bogs around here are full of them,~ she smiles. ~Why do you think so many students never return from their work terms?~"; 'lounge', 'universit', 'student': "~I presume they have a lounge at the university,~ shrugs ", (the) self, ", ~but I'm no authority on the matter.~"; 'turthalio', 'michael': "~Rules all of Thalion,~ says ", (the) self, " expansively. ~From Blumph, if you can believe that,~ she adds. ~I've never liked ports, myself.~"; 'blumph', 'ports': "~Blumph is forty miles to the west,~ mutters ", (the) self, ", ~and before you ask, we're all out of seven-league boots and the like.~"; 'vechlee', 'city': "~It's not bad, as most cities go,~ shrugs ", (the) self, ". ~Full of wizards, but then, that's my target market.~"; 'thalion', 'country', 'land': "~Free, fertile, fast-growing, progressive,~ declares ", (the) self, ". ~That's everything that Thalion is not.~"; 'seven', 'league', 'seven-lea', 'boots', 'troop', 'adventure': "~A whole troop of adventurers came through the other day and bought every last pair,~ says ", (the) self, ", shaking her head. ~Last I saw them, they were heading west... and moving pretty quickly, too,~ she adds."; 'me', 'myself', 'you', 'yourself': if (self.Topics & FLAG_x10 == FLAG_x10) print_ret (The) self, " sighs. ~I'm afraid I was serious when I said I don't really know anything about you... nothing earth-shattering, anyway.~"; self.Topics = self.Topics | FLAG_x10; print_ret (The) self, " cackles loudly. ~Hah! You'd just ", (i) "love", " to know what secrets I could reveal, wouldn't you?~ She stops and sighs. ~I'm sorry, I just can't keep up that mysterious old crone act when I don't really know anything about you at all.~"; 'bowl', 'scrying', 'silver': if (Scrying_Bowl.bought == true) "~All sales final,~ ", (the) self, " cackles, a hint of malice in her laughter. ~Post-sales consultations are one hundred plotkins per hour.~"; if (self.Topics & FLAG_x1 == FLAG_x1) print_ret (The) self, " frowns. ~I told you, it is a bowl of scrying. If you want to find out more about it, you'll have to cough up; five plotkins, firm. No try before you buy here! No one would ever buy anything magical if they could try it first. Oh, let me just try those three magic wishes before I buy them. Hah!~ She snorts derisively."; self.Topics = self.Topics | FLAG_x1; "~It is a bowl of scrying,~ says ", (the) self, ", ~used for divination. The object whose divine mysteries you wish to explore is placed inside. The bowl works its magic, and then you look deeply into it and divine the future, the past, or other hidden secrets.~ ", (The) self, " coughs and slips out of her salespitch style. ~Artisan-direct pricing, only five plotkins.~"; 'glass', 'trophy', 'display', 'case': "~These are all magical items from Thalion's earlier days,~ ", (the) self, " tells you. ~Don't hold out much hope for selling them... though there was an Implementor in here the other day, said he was interested in all of them, trophy case included, for the living room of a house he's building in the woods.~"; 'rope', 'coil': "~Rope,~ says ", (the) self, ". ~As one infamous reluctant hero once said, ", (i) "you'll want it, if you haven't got it", ". Don't get hung up on a forgotten rope. Yours for the mere pittance of thirteen plotkins.~"; 'nasty', 'nasty-loo', 'knife': "~You won't find a nastier one,~ says ", (the) self, ". ~Never dulls. A steal at twenty-seven plotkins.~"; 'antique', 'lamp', 'brass', 'lantern': "~Ah, the brass lantern,~ says ", (the) self, ". ~Just the thing for exploring extinct underground empires. This magical variety never runs out of power. A paltry forty-seven plotkins and it's yours.~"; 'elvish', 'sword', 'great', 'antiquity', 'ancient', 'runes', 'writing', 'workmansh': "~Of ancient Elvish workmanship,~ says ", (the) self, ". ~A rare bargain at only seventy-three plotkins.~ She pauses. ~I've never been certain why we've got Elvish swords, but no Elves. Odd.~"; 'elves', 'elf': "~I've certainly never seen one,~ shrugs ", (the) self, ", ~which makes me wonder how we know the sword is even Elvish, but, well, that's how it's always been described. Either way, it's rare.~"; 'jewel', 'encrusted', 'jewel-enc', 'egg', 'inlay', 'clasp', 'fragile', 'lapis', 'lazuli': "~Ah, these were all the rage a number of years ago,~ says ", (the) self, ". ~Of course, this one was one of the earliest; they proved so popular ", (i) "everyone", " started making them. Then the makers of this original one got into making office fripperies for the business world, and the whole market for these eggs collapsed.~ She sighs and shakes her head. ~This one's going for one hundred and five plotkins.~"; 'implement', 'white', 'house', 'zork': "~Oh you never know what those Implementors are up to,~ says ", (the) self, " with a touch of frustration. ~They've been pretty quiet for a number of years, though.~"; 'plotkin', 'plotkins': "~Legal tender here in Thalion,~ says ", (the) self, ". ~If you haven't got plotkins, there'll be no talkin's, as they say.~"; 'zorkmid', 'zorkmids': "~A what-mid?~ asks ", (the) self, (string) period; 'customer', 'customers', 'wizard', 'wizards', 'wizard^s', 'target', 'market': "~Wizards are my best customers,~ ", (the) self, " tells you proudly. She frowns. ~In fact, they're my only customers. I wonder if I should diversify.~"; 'diversify', 'diversifi': "~It's a lovely idea, but I might incur the wrath of the guild if I started selling to anyone other than wizards and their apprentices.~"; 'Ninario', 'nin', 'ninny', 'magic', 'bunny', 'bunnies', 'rabbit', 'rabbits': if (self.Topics & FLAG_x2 == FLAG_x2) "~No, my dear, trust me. A young thing like you doesn't want to hear about what old biddies like your master and I used to get up to. Suffice to say, we weren't always this old.~"; self.Topics = self.Topics | FLAG_x2; "~Ninario the wizard? He and I are ", (i) "very", " old friends,~ says ", (the) self, ". ~The main word being ", (i) "old", ",~ she adds, cackling. ~Yes, little Magic Bunny and I have known each other for a very long time.~"; 'plumber^s', 'union', 'plumber', 'plumbers': if (self.Topics & FLAG_x3 == FLAG_x3) "~I was serious about not talking about them, young one.~ ", (The) self, " clamps her lips firmly shut."; self.Topics = self.Topics | FLAG_x3; "~The Plumbers Union?~ echoes ", (the) self, ". ~Decent folk don't talk about them. Especially those who depend on wizards for their livelihood,~ she adds, looking meaningfully at you."; 'renaldo', 'virgil': if (self.Topics & FLAG_x4 == FLAG_x4) print_ret (The) self, " flashes a slightly guilty look at you. ~Perhaps I spoke hastily,~ she flushes. ~Let's not mention Renaldo and Virgil again, please. I wouldn't want Renaldo to hear about it.~"; self.Topics = self.Topics | FLAG_x4; print_ret (The) self, " spits in disgust. ~Renaldo the wizard... Renaldo the charlatan, you mean. And Virgil the enforcer. More brawn than brains, that one. Goodness knows how he got his degree, but of course, Renaldo was ", (a) Prof, " at Oxbridge back in those days.^ ^~And don't get me started on Renaldo's ascension to head of the Guild. In the past fifty years, he's taken us at least one hundred years into the past with his misguided leadership. If I'd had my way fifty years ago, your master Ninario would be the head now.~"; 'fifty', 'head', 'way': "~Water under the bridge,~ mutters ", (the) self, ", waving her hand dismissively."; default: "~Rather than admit ignorance on any topic, the elderly prefer to feign deafness and ignore the question altogether,~ says ", (the) self, ". ~Watch as I demonstrate.~"; } Give: <>; Show: if (noun ofclass Purse && child(noun) ~= 0) { if (noun hasnt open) { give noun open; print "(opening ", (the) noun, " first)^"; } obj = child(noun); <>; } if (noun ofclass Substance) "~Ah ha!~ cackles ", (the) Crone, " almost triumphantly. ~The apprentice is not just an ordinary apprentice, but a student of hermeticks! Let's hope the Wizards Guild doesn't see you with that.~"; switch(noun) { Arktos: <>; Coin_10: <>; default: print_ret (The) self, " peers at ", (the) noun, " intently. ~Most interesting,~ she mutters to herself. ~Though which is the more curious: ", (the) noun, " or that you've chosen to show ", (itorthem)noun, " to me? An interesting question.~"; } Tell: if (second == 'me' or 'myself' or 'you' or 'yourself') "~A most fascinating story,~ says ", (the) self, ", looking at you with a little more interest."; if (second == 'Ninario' or 'nin' or 'ninny') "~Hah!~ snorts ", (the) self, ", glancing slyly up at you. ~So the Wizards Guild finally caught up with your foolish master? What took them so long?~"; print_ret (The) self, " cackles derisively. ~The student foolishly propounds as knowledge many things which the old crone, with years of wisdom, knows already. Such is the way of things.~"; ], orders [; if (self.out == true) print_ret (The) self, " seems to be ignoring you. Perhaps the cold dead stare in her eyes means something."; Give: if (noun == Scrying_Bowl or Merchandise) { if (Scrying_Bowl.bought == true) "~I may be getting senile,~ mutters ", (the) self, ", ~but I still remember you purchasing that a short time ago.~"; print "~I'm not in the habit of giving things away,~ says ", (the) self, ". ~"; if (noun == Scrying_Bowl) print "The price is 5 plotkins"; else print "Everything has a price"; ". If you're interested, let's see some gold.~"; } Meet,MeetNPC: <>; Open: if (noun == Case) "~Oh no,~ says ", (the) self, ". ~Close examination of the merchandise only ", (i) "after", " you prove you can afford to pay for them. Don't get me started on what happened the last time a student just 'wanted to look.'~"; SendHome: if (noun == player) print_ret (The) self, " puffs out her cheeks pensively. ~You know,~ she says doubtfully, ~the magic of the old crone is not all it used to be. That's why she moved into the magical merchandise business.~"; Show: if (noun == Merchandise) "~Oh no,~ says ", (the) self, " ~You'll get a closer look at ", (the) noun, " once you prove you can afford ", (itorthem) noun, ". Until then, you can peer at ", (itorthem) noun, " through the glass like everyone else.~"; default: "~It is the privilege of the elderly to feign deafness when someone asks them to do something they don't wish to do,~ confides ", (the) self, ". ~Allow me to demonstrate.~"; ], has animate female; Furniture -> Case "glass trophy case" with name 'glass' 'trophy' 'display' 'case' 'expensive' 'merchandi' 'shelves' 'items', description [; "The interior of the glass trophy case is lined with shelves. Resting on the shelves are a coil of rope, a nasty-looking knife, a brass lantern, an Elvish sword of great antiquity and a jewel-encrusted egg."; ], DeadWood true, initial [; "A glass trophy case filled with expensive merchandise catches your eye."; ], before [; Attack: print "Your attack bounces harmlessly off the case.^"; if (Crone.out == false) "^", (The) Crone, " cackles. ~Did you think expensive magic merchandise would be that easy to steal?~"; rtrue; Buy: "You can't afford to buy even one of the items in the display case, let alone all of them."; Close,Lock: print "The display case is already closed and locked.^"; if (Crone.out == false) "^", (The) Crone, " shakes a finger at you. ~Stop fiddling about with that case.~"; Open,Unlock: if (Crone.out == false) print_ret (The) Crone, " slaps your hand away. ~If you're interested in something, ask.~"; "The case is impervious to all your attempts to open or unlock it, and a soft ghostly cackle reaches your ears as you fiddle with the lock.^ ^You sigh in resignation; perhaps these items are meant for someone else."; Rub: print "You give the glass trophy case a quick polishing with a corner of your robe.^"; if (Crone.out == false) print "^", (The) Crone, " glances sharply at you. ~Are you ", (i) "sure", " you're a student?~ she asks pointedly."; ]; Furniture -> Stand "wooden stand" with name 'wooden' 'stand', description "The wooden stand is plain and unassuming.", DeadWood true, capacity 1, describe [; if (child(self)) { print_ret "^Sitting prominently displayed on a wooden stand ", (isorare)child(self), " ", (a)child(self), (string)period; } rtrue; ], before [; Enter: "Just because it's called a stand doesn't mean you should take it literally."; ]; Object -> -> Scrying_Bowl "silver bowl" with name 'silver' 'bowl' 'of' 'scrying', parse_name ParseNameOf, description [; print "A large silver bowl, beautifully made. The sides are delicately worked with bas-relief of farm scenes, rural folk about their everyday business: milking cows, shearing sheep, churning butter and making cheese."; if (child(self)) { print "^^In the bowl"; WriteListFrom(child(self), ENGLISH_BIT + ISARE_BIT); print (string)period; } new_line; rtrue; ], invent [; if (child(self)) { print (a)self, " containing "; WriteListFrom(child(self), ENGLISH_BIT); print (string)period; } else { print "a ", (name)self; } rtrue; ], capacity 1, bought false, react_before [; Buy: if (noun == self or Merchandise or Case or Crone) rfalse; print "The only things on sale here are the items in the display case"; if (self.bought == false) print " and the silver bowl"; print_ret (string)period; ], before [ks_save; Buy: if (self.bought == true) "It's already yours."; if (Crone.out == true) "That would have been easier before you inflicted your vicious attack on ", (the) Crone, (string)period; if (TestScope(Coin_10)) { self.bought = true; remove Coin_10; move Coin_5 to location; print "~Ah, the discerning eye of the student picks out the best bargain,~ says ", (the) Crone, " ~5 plotkins will suffice to purchase the bowl of scrying.~ She takes the 10 plotkin piece in her hand, snaps her fingers strangely, and hands it back to you. You notice that it is now silver instead of gold.^ ^She waves her hand toward the silver bowl. ~It's yours,~ she tells you. ~Use it well.~^ ^You lift the silver bowl from the stand.^"; ks_save = keep_silent; keep_silent = true; ; ; keep_silent = ks_save; rtrue; } else print_ret (The) Crone, " shakes her head. ~5 plotkins firm is the price, and I stand to that.~"; Fill: if (second ofclass Cheese) <>; "You're pretty certain that doing that won't reveal any divine mysteries or mystic connections. You'll have to find the right thing to put into the bowl."; Receive: if (self.bought == false && Crone.out == false) print_ret (The) Crone, "'s bony hand locks on your wrist. ~Once you buy it, you can put what you like into it. Until then, forget it.~"; if (noun == Cannonball or Branch) print_ret (The) noun, " is too big to fit into the bowl."; if (noun ofclass Cheese) { print "You drop ", (the) noun, " into the silver bowl. "; if (self has general) { print "As the cheese breaks down, the "; } else { Achieved(19); give self general; print "For a moment, nothing happens. Then, astoundingly, the cheese begins to break down, as it reverses the coagulating process and turns into a lumpy mess of raw curds. The bowl hums as it slowly consumes the raw curds to fuel its visionary powers. The "; } print "bowl begins to glow with an otherworldly light and you gaze into its glowing silvery depths.^^"; remove noun; if (noun == Caerphilly) { "Everything goes fuzzy and indistinct. Annoyingly, it seems to stay that way. You can see things happening in the bowl, a scene of the future being played out, but you can make out nothing of the details, no matter how hard you look. Eventually, the last of the Caerphilly vanishes from the bowl with a curious sucking sound and the bowl goes dim."; } ! give cheese message at random print "Slowly, a scene forms in the depths of the bowl. You bend closer and suddenly feel yourself being pulled into the bowl.^^"; CheeseVision(); "^Suddenly, abruptly, the vision fades, and you are back where you started.^ ^The last of ", (the) noun, " vanishes from the bowl with a curious sucking sound and the bowl goes dim."; } "You drop ", (the) noun, " into the silver bowl. Nothing happens; no vision of the future appears, no secret mysteries of the universe are revealed. Disappointed, you remove ", (itorthem)noun, " from the bowl."; Open,Close: "The silver bowl does not have a lid of any kind."; Take: if (self.bought == false && Crone.out == false) print_ret (The) Crone, "'s bony hand locks on your wrist. ~Not so fast,~ she warns. ~5 plotkins is the price; students don't buy on credit.~"; self.bought = true; rfalse; ], has container open ~openable; Object -> Merchandise with parse_name [i; while (true) { switch(NextWord()) { 'rope', 'coil': self.item_num = 1; i++; 'nasty', 'nasty-looking', 'knife': self.item_num = 2; i++; 'antique', 'lamp', 'brass', 'lantern', 'light': self.item_num = 3; i++; 'elvish', 'sword', 'great', 'antiquity', 'ancient', 'runes', 'writing': self.item_num = 4; i++; 'jewel', 'encrusted', 'jewel-enc', 'egg', 'inlay', 'clasp', 'fragile', 'lapis', 'lazuli': self.item_num = 5; i++; 'of': i++; default: return i; } } ], short_name [; switch(self.item_num) { 1: print "coil of rope"; 2: print "nasty-looking knife"; 3: print "brass lantern"; 4: print "Elvish sword"; 5: print "jewel-encrusted egg"; } rtrue; ], description [; switch(self.item_num) { 1: "A large coil of strong rope."; 2: "It looks like it's been put to some very nasty uses."; 3: "An antique brass lantern, powered by unknown means. It looks new and unused."; 4: "Long and lethal, the sword is an impressive and beautiful weapon. It looks exceptionally deadly. Ancient runes and precious gems adorn the hilt."; 5: "Encrusted with precious jewels, the egg is covered with fine gold inlay and ornamented in lapis lazuli and mother-of-pearl. It is hinged and closed with a delicate looking clasp. It appears extremely fragile."; } ], item_num 1, FakeObj, react_before [; if (noun == self && action_to_be ~= ##Examine or ##Take or ##Pull or ##Push or ##PushDir or ##Transfer or ##Buy) "Unfortunately, ", (the) self, " is locked in the case."; ], before [; Buy: if (Crone.out == true) "That would have been easier before you inflicted your vicious attack on ", (the) self, (string)period; "~", (The) self, " costs ", (3*self.item_num * self.item_num) + (5*self.item_num) + 5, " plotkins,~ says ", (the) Crone, ". ~Let's see sufficient gold before we open the case, my dear.~"; Examine: rfalse; Take,Pull,Push,PushDir,Transfer: print_ret (The) self, " is safely shut away in the glass display case."; default: "Unfortunately, ", (the) self, " is locked in the case."; ], has scenery; Prop -> Rocking_Chair "rocking chair" with name 'old' 'creaky' 'crone^s' 'rocking' 'chair', description "An old and creaky rocking chair.", DeadWood true, before [; Examine: rfalse; Listen: if (Crone.out == true) "The rocking chair has fallen silent with the death of its owner."; else <>; default: if (Crone.out == true) "You don't need to worry about the rocking chair."; "~If the chair's a-rocking, don't bother knocking,~ cackles ", (the) Crone, ". ~Of course, if it ", (i) "stops", " rocking, you'd best knock; I'll likely be dead.~"; ], react_before [; Listen: if (noun == nothing) if (Crone.out == false) <>; rfalse; ]; Prop -> Dress "plain black dress" with name 'plain' 'shapeless' 'ordinary' 'black' 'dress', description [; print "It's a rather ordinary plain black dress."; if (Crone.out == true) " It lines the crone's dead body like a shapeless black death shroud."; new_line; rtrue; ], DeadWood true, before [; Examine: rfalse; default: "You don't need to worry about the dress."; ]; Room Build_Society "Vechlee Townspeople Building Society" with description "It seems this building society's fortunes have fallen rather sharply of late. Every scrap of furniture, all the dividing walls, counters and so on one would expect to see in a bank have all been ripped up, leaving a hollow empty shell. A forlorn sign on the wall tells customers about the competitive loan rates and exciting investment opportunities.", compass_look [obj; if (obj == s_obj) "The bustle of the market square lies back through the doorway to the south."; TouchWalls(obj, self.Floor, self.Walls); rtrue; ], before [; Exit: if (player in location) <>; rfalse; ], cant_go [; "The only way out is south back to the market square."; ], s_to [; print "You step back into the bustle of the market square.^"; return Market_Square; ]; Prop -> Soc_Sign "sign" with name 'forlorn' 'sign' 'note' 'message' 'ad' 'advertise', description [; "The sign advertises the building society's low, low loan rates and excellent investment opportunities.^ ^", (i) "We will beat all Wizards Guild Savings Bank quotes!", " is one of several of its claims."; ], before [; Examine: rfalse; default: "The sign can safely be left alone."; ]; Prop -> Soc_Sun "sunlight" with name 'sunlight', description "The sunlight streams in through the doorway.", before [; Examine: rfalse; default: "It's just sunlight; don't worry about it so much."; ]; Object -> Coin_10 with name '10' 'plotkin' 'plotkins' 'piece' 'small' 'gold' 'coin' 'money' 'cash', short_name [; print "small gold coin"; rtrue; ], description [; print "This small coin, about the same size as a pound coin, is minted beautifully in gold"; if (self has moved) print ", and feels wonderfully solid in the hand"; ". The edges are smooth and unmilled. The obverse shows the profile of a regal looking chap along with the inscription ", (i) "Turthalion: D G Regis F D.", " The reverse shows plumes in a coronet, with the word ", (i) "Plotkins", " above and the number ", (i) "10", " below."; ], initial [; "Whoever cleaned the bank out was not completely thorough; sunlight glints on a small gold coin in the corner of the room."; ], before [; Take,Transfer: Achieved(17); ], after [; Examine: self.short_name = "10 plotkin piece"; rfalse; ]; Object Coin_5 with name '5' 'plotkin' 'plotkins' 'piece' 'small' 'silver' 'coin' 'money' 'cash', short_name [; print "small silver coin"; rtrue; ], description [; "This small coin, about the same size as a ten pence piece, is minted in silver with smooth unmilled edges. The obverse shows the profile of a regal looking chap along with the inscription ", (i) "Turthalion: D G Regis F D.", " The reverse shows plumes in a coronet, with the word ", (i) "Plotkins", " above and the number ", (i) "5", " below."; ], after [; Examine: self.short_name = "5 plotkin piece"; rfalse; ]; Outroom Outskirts "Outskirts" with description [; if (location hasnt visited) { give Out1 ~concealed; give Out2 ~concealed; } "The westernmost outskirts of Vechlee contrast sharply with the bustling and thriving town you glimpsed at the east gate. Here at the west gate, the foot traffic is nonexistent, and Vechlee seems quiet and peaceful, almost eerily so. The street is narrow and cobblestoned, and heads west out of the city. The market square is back to the northeast and south is the entrance to a large and impressive looking building."; ], Carpet_Go [; PlayerTo(W_Courtyard); rfalse; ], compass_look [obj; if (obj == w_obj) "West, the narrow cobblestoned street heads out of the city."; if (obj == s_obj) <>; if (obj == ne_obj) "The bustle of the market square lies back to the northeast."; if (obj == u_obj) <>; "You don't see anything interesting in that direction, other than what's already been mentioned."; ], Floor COBBLES, before [; Exit: if (player in location) <>; rfalse; Go: if (noun == w_obj or ne_obj) { give Guard ~general; rfalse; } ], cant_go [; "The market square lies back to the northeast, south is the entrance to a large building, and west the road heads out of town."; ], ne_to [; print "You return to the crowded bustle of the market square.^"; return Market_Square; ], w_to [; print "You head out the western gates of the town.^"; return Outside_Vechlee; ], s_to [; if (Guard in location) "The guard raises a hand as you approach. ~Studen' mun ev wizzurds wiv 'em for ti cum intiv 'all ,~ he tells you."; print "You step through the arched doorway into the vaulted splendour of the guild hall foyer.^"; if (Valve has open && First_Floor_Hall.exploded == false) { StartDaemon(Valve); StartTimer(Valve, 4); } return Guild_Hall_Foyer; ]; Object -> Guard with name 'guard' 'sergeant' 'man' 'soldier' 'chap' 'fellow' 'ned', description [; "A friendly looking chap with a large ruddy face, ", (the) self, " wears a blue surcoat, emblazoned with the image of a golden wand. He is large and strong, and looks more than capable of keeping order at the entrance to the guild hall. You notice that his uniform, while neat and well-kept, is patched and worn in many places."; ], short_name [; print "guard"; rtrue; ], Chat 0, Topics 0, initial [; if (location hasnt visited) { self.Chat = 0; give self general; "A bored-looking guard lounges beside the entrance to the Guild Hall. When he sees you, he straightens up with a sigh, trying vainly to look interested in his job."; } if (self hasnt general) { self.Chat = 0; give self general; if (Bearskin_Rug has worn) print_ret (The) self, " watches your bearskin-covered form suspiciously."; if (Helmet has worn) print_ret (The) self, " looks at the helmet and nods approvingly."; if (Chamberpot has worn) print_ret (The) self, " glances at the chamberpot on your head and nods approvingly. ~Thysen ta'en reet good thowt wiv 'at 'elmet,~~ you hear him mutter to himself. ~Thoo is weel reddy, hard eneeaf.~"; switch(random(100)) { 1 to 20: "~'Si lo' ya, young 'un,~ nods ", (the) self, ". ~Ah 'ope nobbut tha's weel eneaff.~"; 21 to 30: "~Thoo mun be runnin' errands for thah maistther,~ comments ", (the) self, ". ~Fliggin' ower 'ere, fliggin' ower there. Mebbe ah prefairs mah worrk effther awl.~"; 31 to 50: print_ret (The) self, " nods at you and touches his hand to his forehead when he sees you."; 51 to 70: print_ret (The) self, " knuckles his forehead. ~Weel, young 'un!~ he says by way of greeting."; 71 to 80: "Ah'll tell tha, it's a slaw day ti-day,~ mutters ", (the) self, " to himself."; 81 to 90: "~It hardened reet oot effther awl 'at reen,~ says ", (the) self, " approvingly, peering at the brilliant blue sky."; 91 to 99: "~Noo there, young 'un,~ waves ", (the) self, " as he sees you. ~Ah 'ope tha's reet suited.~"; 100: "~Aye,~ mutters ", (the) self, " to himself. ~If ah yanly could get a noo bit of sciunz, they mud let ma in the ploomber's union, s'wha' 'at chap telled ma.~^ ^He kicks idly at the ground, looking miserable."; } } print_ret (The) self, " stands by the entrance to the Guild Hall looking miserable."; ], each_turn [; if (self.Chat == 1) { switch(random(50)) { 1 to 10: print "^", (The) self, " sighs deeply, looking depressed with life.^"; 11 to 20: print "^", (The) self, " glances up at you briefly.^"; 21 to 25: print "^", (The) self, " mutters to himself as he lingers at his post. ~Mah troops deean't owter fail 'spection, but they mud; ah sweer, they can't march a leen reet'n end. Ah can't tell 'em wha' ti deea.~^"; 26 to 30: print "^~Ah mun feend a betther waay for ti train 'em troops.~ ", (the) self, " murmurs to himself.^"; 31 to 40: print "^", (The) self, " sighs and shifts his stance slightly.^"; 41 to 44: print "^~Cap'n reckons nowt on ma,~ mutters ", (the) self, " to himself. ~Mah troops isn't properly drilled? ", (i) "Sand'urst ez 'is troops drilled", ", spak he,", (i) " but nut tha. ", " Ma? Ah deean't reetlins knaw what tha' wurd ", (i) "drill", " means. Ah deean't knaw haw ti drill troops...~^ ^Following this complex and rather obscure speech, ", (the) self, " falls silent.^"; 46 to 48: print "^", (The) self, " gazes dejectedly at the ground. ~Ah thowt ah knaw a' aboot trainin' troops, but 'e reckons ah knaw nowt. If ah ed knawn haw ti drill 'em, ah mud ev deean betther.~^"; 49 to 50: print "^", (The) self, " shakes his head. ~He wur weeantly vexed wiv 'em troops. ", (i) "Thoo mun drill them troops,", " spak he. ", (i) "You mun smarts yersens up.", "~ ", (The) self, " falls silent, looking even more depressed.^"; } } self.Chat = random(3); rtrue; ], before [; Attack,Take,Search: print_ret (The) self, " slaps your hand away with his powerful arms. ~Come on, young 'un, deean't play them games wi' me. Thoo ez n't gat a chance again ma.~"; Bargain: print_ret (The) self, " shakes his head. ~Ah deean't ev owt ti bargain wi', young'un.~"; Kiss,Touch: print_ret (The) self, " blushes a bright crimson. ~Thoo maun't ti be deean 'at. Thoo sal ev cap'n all ower me for frat'nisin'. 'E ahready wurn't seea varry weel suited eftther 'e seed mah recruits marchin'. Keep thah lips an' 'ands to thysen, if tha suits.~"; Listen: print_ret (The) self, " rocks back and forth on his heels, muttering to himself about his boring job, his meagre pay packet and his inept squad of recruits. Or at least, that's your best guess at what he's saying."; MeetNPC: if (self has proper) print_ret (The) self, " frowns. ~Noo! Ah thowt we 'ye met afoor noo.~"; give self proper; self.short_name = "Ned"; "The guard nods at you. ~Ah's varry weel suited ti meet tha. Ah's Ned. Ah worrk at dooerwaay.~ He pauses. ~Thoo maay think them's a good 'un, but ah reckons nowt on 't. It deean't pay seea verry weel.~"; Smell: print_ret (The) self, " smells surprisingly clean. He must take his personal appearance seriously."; Talk: "~Wants-ta summat?~ ", (the) self, " asks you."; ], life [obj; Answer: if (noun == 'hello' or 'hi') <>; "~Wants-ta summat?~ ", (the) self, " asks you."; Ask: switch(second) { 'building', 'edifice', 'guild', 'hall': "~That be guild 'all,~ says ", (the) self, " nodding his head at the building behind him."; 'depressed', 'depression', 'sigh', 'sadness', 'troops', 'drill', 'drilling', 'recruits', 'miserable', 'misery', 'captain', 'meager', 'meagre', 'pay', 'salary', 'money', 'life': "~Aye, tha's gat good thowt there, ah's sairly slack aboot them troops. Ah aam for ti drill 'em, but ah deean't knaw haw.~ He sighs. ~Ah mud be oot o' worrk if ah can't. Ah's gotten a weyfe an' bairns, an' ah's a right ti keep 'em. Mah worrk deean't pay seea varry weel, ah've bin sellin' th' graith, leyke. 'F ah yanly ed summat vallabull ti sell, we'd be awl suited. We's addlin' nowt reet noo. An' ah'll tell tha strait, if ah seed 10 plotkins awl a' yance, t'au'd missus an' ah an' t'bairns'd flit.~"; 'ma', 'me', 'myself', 'yourself', 'you': "~Thoo?~ asks ", (the) self, " sounding a bit surprised. ~Ah deean't knaw owt aboot tha, young'un. Ah ev yanly just met tha!~"; 'wife', 'weyfe', 'missus', 'woman': "~Aye, she's a reet good 'un, she is,~ says ", (the) self, ", grinning hugely. ~Ah luv 'er ti deeath.~"; 'family', 'kids', 'children', 'bairns', 'hunger', 'addlin': "~Weel, we's addlin' nowt reet noo, but the weyfe an' bairns is stickin' by ma, leyke nowt else, they is that weel suited.~"; 'ned', 'him', 'himself', 'job', 'work': if (self has proper) "~Nowt ti tell,~ shrugs ", (the) self, ". ~Ah ev wrowt 'ere betther 'an fower year, and ah'll tell tha, it's 'at bad, ah'd be off awa' if t'wur owt betther.~"; <>; 'wizard', 'wizards', 'wizard^s', 'renaldo', 'ninario', 'nin', 'ninny', 'virgil': "~Ah dean't knaw ower much aboot any wizzurds,~ declares ", (the) self, ". ~Ah yanly worrks for 'em.~"; 'patch', 'patches', 'worn', 'uniform', 'golden', 'wand', 'surcoat': "~Aye,~ agrees ", (the) self, " glancing down at his uniform. ~It surtinly ez seed betther days, ah'll tell tha. Th' weyfe diz wha' she can, but we can't affurd a betther 'un reet noo. Guild nobbut pays fo' th' fuhst. Ah ev ti pay fo' t'others.~"; 'science', 'sciunz': if (self.Topics & FLAG_x1 == FLAG_x1) print_ret (The) self, " glances around guiltily. ~Ah knaw nowt aboot that,~ he mutters, looking at the ground. ~Thoo can forget owt ah sed aboot it, please.~"; self.Topics = self.Topics | FLAG_x1; print_ret (The) self, " nods, looking a bit depressed. ~Aye,~ he says, ~if ah yanly could get a noo bit of sciunz, th' ploomber's union mud let ma join, an' ah just know ah'd be able ti help them owerthroow th' wizzurds yance ah wur in.~ He stops and glances around guiltily. ~Ah ev sed too much,~ he mutters, and falls silent."; 'plumber^s', 'plumber', 'plumbers': "~Ah knaw nowt aboot 'at ploombers union,~ declares ", (the) self, " defiantly, with the air of one reciting a prepared speech."; default: "~Ah dean't knaw nowt aboot 'at,~ declares ", (the) self, " stoutly."; } Give: switch(noun) { Coin_5: Soldiers.Reason = 2; Achieved(22); remove Coin_5; print (The) self, "'s eyes widen as he sees the shining silver coin. ~Thoo wants ma ti ev 'at?~ he asks in surprise. ~Ah'll tell tha, ah doot we could find summat for ti ware 'at on.~ He glances around furtively, and then takes the offered coin.^ ^~Ah's off for ti tell th' weyfe an' bairns, an' visit th' market, but ah'll be back i' t' crackin' of a lop.~^ ^He charges off, a happy man.^"; remove self; rtrue; Coin_10: Soldiers.Reason = 3; Achieved(21); remove Coin_10; print (The) self, "'s eyes widen as he sees the gleaming gold coin. ~Diz-ta want ti gi' ma that?~ he asks in surprise. ~Weel, gi' ma thah 'and!~. He takes your hand and shakes it firmly and wholeheartedly.^ ^~Ah sweer, ah ed na ideear there wur anyone leyke tha i' th' toon. Thoo's a reet good'un. Ah'll be off ti tell th' weyfe an' bairns an' then we'll be for th' shops for ti ware it. An' ah'll tell tha, if there's owt ah can effther deea for tha, ah's thah chap.~^ ^He shakes your hand once more, and charges off, a happy man.^"; remove self; rtrue; Hand_Drill: Soldiers.Reason = 4; Achieved(20); remove Hand_Drill; print "~Aye,~ says ", (the) self, " excitedly as you offer him ", (the) noun, ". ~Ah could sell tha' for a reet bit o' brass and the weyfe an' bairns an' ah could git summat t' eat, leyke.~ He rubs his broad chin pensively. ~'Course, on t'other 'and, if ah gave 'at ti ploomber's union, they mud let ma in.~ He reaches towards the drill, and then stops.^ ^~Diz-ta reely want ti gi' ma that?~ he asks doubtfully. ~Ah's nivver deean nowt for tha.~^ ^When you offer the drill again, he accepts it eagerly. ~Weel, that's reet good o' tha. Ah'll tell tha, if there's owt ah can effther deea for tha, ah's thah chap. Ah'll nut forget tha.~^ ^He shakes your hand firmly and wholeheartedly and then charges off, a happy man.^"; remove Guard; rtrue; default: print_ret (The) self, " glances at ", (the) noun, " and then shakes his head. ~That's good ti nowt for ma. Ah leyke nowther t'egg nor shell on 't.~"; } Show: if (noun ofclass Purse && child(noun) ~= 0) { if (noun hasnt open) { give noun open; print "(opening ", (the) noun, " first)^"; } obj = child(noun); <>; } if (noun ofclass Substance) "~Stthrange queer things they ev noo, fair eneeaf,~ nods ", (the) Guard, " looking at ", (the) noun, (string)period; switch(noun) { Coin_10, Coin_5: "~Ah's reet suited ", (i) "sumyan", " ez gat sum brass, any road,~ ", (the) self, " tells you, sounding a bit despondent."; Hand_Drill: "~Aye,~ mutters ", (the) self, ". ~If nobbut ah could get a noo bit of sciunz mahself, they mud let ma in the ploomber's union, s'wha' 'at chap telled ma.~^ ^He kicks idly at the ground, looking miserable, but stealing glances at ", (the) noun, " every now and then."; default: "~It's fair clever things they a'e deean sen ah wur a bairn,~ says ", (the) self, " looking at ", (the) noun, " admiringly. You're not sure if he's being sarcastic or not; his wide innocent eyes betray nothing."; } Tell: if (second == 'ma' or 'me' or 'myself' or 'you' or 'yourself') "~Oh aye,~ nods ", (the) self, " not showing much interest."; print_ret (The) self, " nods seriously. ~Oh aye, ah ed an ideear 'at wur t' cayse.~"; ], orders [; LetIn: print_ret (The) self, " shrugs. ~Rules ez rules. Naw 'prentices 'lowed wivout wizards.~ He sees your disappointed look. ~Cheer up, young 'un, least tha's not stannin' here leyke wart on witch. Tha's got reet good worrk, not summat leyke mah's.~"; Meet,MeetNPC: <>; default: "~Ah ev ti mind mah cap'n, nut tha,~ says ", (the) self, " apologetically."; ], has animate male; Prop -> Building "guild hall" with name 'building' 'guild' 'edifice' 'hall' 'carved' 'sign' 'tower' 'spires' 'lintel', description [; "By far the most impressive edifice you have seen in your short travels, this many-storied building overshadows the town of Vechlee, several spires leaping up from the main building to tower above the street. Carved into the wood of the lintel over the wide open doorway are the words ", (i) "Vechlee Wizards Guild", " and underneath in smaller letters, ", (i) "Admittance by Invitation Only", (string)period; ], before [; Enter: <>; Examine: rfalse; default: "It's just a regular building, albeit a large and ostentatious one."; ], react_before [; Listen: if (noun == nothing && Guard in location) <>; rfalse; ]; Room Guild_Hall_Foyer "Guild Hall Foyer" with description [; if (location hasnt visited) give FoyerHint ~concealed; print "The opulent splendour of the guild hall foyer is almost overwhelming. Huge marble columns rise up to hold the vaulted ceiling in place, and the marble walls and floor seem to glow and shimmer with a queer internal light. At the western end of the room, an ornate marble staircase ascends to the first floor. A doorway leads south into a large kitchen, and a small closet lies east. The doorway to the north leads back to the street.^"; if (First_Floor_Hall.exploded == true) { new_line; <>; } rtrue; ], compass_look [obj; if (obj == e_obj) <>; if (obj == n_obj) "The streets of Vechlee lie back through the doorway to the north."; if (obj == u_obj) { if (First_Floor_Hall.exploded == true) "From above, you can hear shouts of panic and the pattering of feet, and a faint smoky haze drifts down the ornate marble staircase."; "The ornate marble staircase ascends to the upper level. Everything seems pretty quiet up there."; } if (obj == s_obj) "The expansive kitchen to the south seems barren and quiet."; TouchWalls(obj, self.Floor, self.Walls); rtrue; ], each_turn [; if (self.Poison == true) PoisonSub(); ], before [; Exit: if (player in location) <>; rfalse; ], Poison false, attempts 0, time_left, cant_go [; "You can head north back to the street, south into the kitchen, or up the ornate marble staircase to the west. A small closet lies to the east."; ], n_to [; Valve.Gas_Buildup = 0; StopDaemon(Valve); StopTimer(Valve); print "You step from the vast echoing foyer of the Guild Hall into the street.^"; return Outskirts; ], s_to [; print "You head south into the kitchen.^"; return Guild_Kitchen; ], e_to [; if (Pipe_Closet_Door has open) { print "You step into the closet.^"; return Pipe_Closet_Door; } give Pipe_Closet_Door open; give Pipe_Closet light; print "You open the door and step into the closet.^"; return Pipe_Closet_Door; ], w_to [; <>; ], u_to [; if (First_Floor_Hall.exploded == false) { if (self.attempts < 10) self.attempts++; if (self.attempts == 10) { deadflag = 1; "You ascend the ornate marble staircase cautiously. No one seems to be around. You take a few tentative steps into the first floor hall.^ ^Suddenly, your robes are grabbed from behind. ~", (i) "Right!", "~ screams the burly guard, directly into your ear. ~This is the last straw. I've just found out who you are, my little friend. You're Ninario the Meddler's little rat! I've been told how to deal with you!~^ ^The guard calls his partner over and the two of them latch on to you with an iron grip and escort you up to a tower high above the fortress.^ ^They fling you unceremoniously off and you plummet down, smacking into the middle of the market square with a convincingly wet thud. On the bright side, you are spared the unpleasant sight, and also spared the unpleasant fate of the local merchants, who pick bits of brain and blood out of their wares for days.^ ^On the downside, you are dead."; } if (self.attempts == 1) "You ascend the ornate marble staircase to the first floor, but just as you reach the top, a burly guard appears. ~First floor is off-limits to apprentices,~ he booms in stentorian tones.^ ^He sends you marching back down the stairs, watching to make sure you go."; if (self.attempts == 2) "You ascend the ornate marble staircase once again. Just as you reach the top and think you're in the clear, two pairs of arms reach out, and grab you. The two guards now posted at the top of the stairs frogmarch you back down. ~Don't you listen?~ bellows the stentorian one. ~Off-limits!~^ ^They march back up the stairs."; "You ascend the ornate marble staircase yet again. When you reach the top, your old friend is there, arms crossed over his chest. His arm snakes out and grabs your ear. ~What is the matter with you?~ he demands. He leans forward, twisting your ear cruelly, and screams into it. ~", (i) "Off-limits to the likes of you!", "~ He then pushes you down the stairs in a painful noisy tumble."; } print "You ascend the ornate marble staircase.^"; return First_Floor_Hall; ]; Prop -> Columns "huge marble columns" with name 'huge' 'marble' 'columns' 'pillars' 'column' 'pillar', description "The huge marble columns rise up to hold the vaulted ceiling in place.", before [; Examine: rfalse; Take,Pull,Push,PushDir,Transfer: "You grab one of the columns and tuck it under your arm, and head about your business. Much later that night, a sudden groaning and creaking awaken the inhabitants of the Guild Hall. The roof is collapsing! Structural spellcasters are called in, and the building is carefully surveyed. It's at this point that the missing column is noticed.^ ^While masons labour through the rest of the night to replace the column, you flee westward toward Blumph, the column safely hidden in your satchel.^ ^However, the black market for guild hall columns in Blumph is already abuzz with the news by the time you get there, and you are nabbed by the Blumph arm of the Wizards Guild when you attempt to sell it.^ ^All right, not really. You can't take the columns."; default: "You don't need to worry about the marble columns."; ], react_before [; Listen: if (noun == nothing && First_Floor_Hall.exploded == true) <>; rfalse; ]; Object Pipe_Closet_Door "closet door" with name 'closet' 'door', description [; print "The closet door is a simple wooden one, currently "; if (self has open) "open."; "closed."; ], DeadWood true, found_in Guild_Hall_Foyer Pipe_Closet, door_dir [; if (self in Guild_Hall_Foyer) return e_to; return w_to; ], door_to [; if (self in Guild_Hall_Foyer) return Pipe_Closet; return Guild_Hall_Foyer; ], before [; Search: if (self has open) { if (self in Pipe_Closet) "The guild hall foyer lies back through the open door to the west."; "The closet looks small and cramped, barely large enough to turn around in. It is devoid of supplies of any kind, but you can make out pipes of some kind against the far wall."; } <>; ], after [; Open: give Pipe_Closet light; rfalse; Close: give Pipe_Closet ~light; rfalse; ], has scenery door openable; Room Guild_Kitchen "Kitchen" with description [; if (location hasnt visited) give KitchenHint ~concealed; "Gleaming pots and pans line the walls of this expansive and rather barren kitchen. A well-scrubbed pine table occupies the middle of the room. The foyer lies back to the north."; ], each_turn [; if (self.Poison == true) PoisonSub(); ], before [; Exit: if (player in location) <>; rfalse; ], Floor STONE_TILES, compass_look [obj; if (obj == n_obj) "The doorway to the north leads back to the foyer."; if (obj == s_obj) <>; TouchWalls(obj, self.Floor, self.Walls); rtrue; ], Poison false, cant_go [; "The only way out is north back to the foyer."; ], n_to [; print "You step back into the foyer.^"; return Guild_Hall_Foyer; ]; Prop -> Dumb_Waiter "dumb waiter" with name 'dumb' 'waiter' 'trolley' 'trolly' 'cart' 'shaft' 'pulley' 'pulleys' 'rope' 'ropes' 'square' 'stone' 'shaft' 'door' 'system', description [; if (self has general) { if (self has open) "The square stone shaft sits gaping emptily."; "The door is closed."; } print "The dumb waiter sits in a square stone shaft embedded in the southern wall of the kitchen. It is currently "; if (self hasnt open) "closed."; if (child(self)) { print "open, and looking inside, you spot ", (a)child(self), " sitting on it."; if (child(self) == Tray) { if (child(Tray)) { print " On the tray, you can see "; WriteListFrom(child(Tray), ENGLISH_BIT); print (string)period; } } new_line; rtrue; } "open, but empty."; ], capacity 1, describe [; print "^Embedded in the southern wall of the kitchen is "; if (self has open) { if (self has general) "a square stone shaft, gaping emptily."; print "a dumb waiter attached to a system of ropes and pulleys."; } else "the small closed door to the dumb waiter."; if (child(self)) print " Resting on the dumb waiter ", (isorare)child(self), " ", (a)child(self), (string)period; if (child(self) == Tray) { if (child(Tray)) { print " On the tray, you can see "; WriteListFrom(child(Tray), ENGLISH_BIT); print (string)period; } } new_line; rtrue; ], before [; Enter: "Unfortunately, it wasn't designed to accomodate students. Dumb waiter."; Lift: if (self has general) "The dumb waiter has already ascended to the first floor."; "You're not certain how to raise this dumb waiter. Perhaps it's only meant to be pulled up from above."; ReachIn,Remove,Empty,LetGo,Transfer: if (self has general) "The dumb waiter has ascended to the first floor."; rfalse; Search: <>; ], after [; Close: print "As you close the door to the "; if (self has general) print "empty shaft"; else { print "dumb waiter"; StartTimer(self, 1); } ", a bell rings somewhere above."; Open: StopTimer(self); print "The bell rings again, this time with a much lower tone, as you open the door, revealing the "; if (self has general) "empty shaft."; print "dumb waiter."; if (child(self)) { print " Sitting on the dumb waiter is ", (a)child(self), (string)period; if (child(self) == Tray) { print " On the tray, you can see "; WriteListFrom(child(Tray), ENGLISH_BIT); print (string)period; } } new_line; rtrue; ], dinner_count 0, time_left, time_out [; if (location ~= Guild_Kitchen or Guild_Hall_Foyer or Pipe_Closet) rtrue; if (self.dinner_count < 4) self.dinner_count++; print "^You hear muffled footsteps above, and then the creaking sound of ropes and pulleys as the dumb waiter is hauled up by someone on the first floor.^ ^~This "; switch(self.dinner_count) { 1: print "will be your dinner now"; 2: print "should be your corrected dinner now"; 3: print (i) "must", " be your dinner this time"; 4: print (i) "has", " to be your dinner by now"; } print ", sir,~ says a voice.^^"; if (child(self) == Tray) { if (Chicken in Tray && (Stone_Bottle in Tray || Ginger_Beer in Tray)) { if (self.dinner_count > 1) print "~Well, it's about time!"; else print "~Excellent!"; print " you hear a familiar voice say. ~Bring it here and let me tuck in.~^ ^There is a short pause.^"; if (Stone_Bottle in Tray) { if (Stone_Bottle.sealed == true) print "^~What the devil is wrong with this bottle of ginger beer?~ bellows the voice. ~It won't open!"; else { if (Valve has open) { if (Valve.Hose_On == true && Vent.Hose_On == true) { give self general; Achieved(27); First_Floor_Hall.exploded = true; StopDaemon(Valve); give Valve ~open; Pipe_Closet.Poison = false; Guild_Hall_Foyer.Poison = false; Guild_Kitchen.Poison = false; if (Stone_Bottle hasnt open) print "^~Just let me open that bottle for you, sir,~ says a voice.^"; else print "^~Ah, ginger beer,~ says the familiar voice. ~Fetch that bottle, Virgil, there's a good fellow.~^"; "^Moments later, there is a deafening explosion from above. ~Virgil!~ cries the voice in stricken tones.^ ^The building shakes and rumbles with the force of the blast, and you hear tramping of feet and shouts of panic coming from above."; } } print "^~What the devil is wrong with this bottle of ginger beer?~ bellows the voice. ~It tastes like paint thinner!"; } } else if (Ginger_Beer in Tray) { remove Tray; give self general; Soldiers.Reason = 1; StartTimer(Soldiers, 3); "^~Ah, most excellent. The ginger beer is particularly tangy. Please fetch the cook for me at once, that I can pay my compliments personally.~"; } } else if (Chicken in Tray && ~(Stone_Bottle in Tray)) { print "~Well, where's my ginger beer?~ bellows a familiar voice from upstairs. ~What kind of dinner is it without ginger beer? "; } else if (~(Stone_Bottle in Tray)) { print "~Well, where's the meat?~ bellows a familiar voice from upstairs. ~What kind of dinner is it without meat? "; } } else { print "~Where the devil is the tray?~ demands a familiar voice from upstairs. ~What on earth am I supposed to do with "; if (child(self)) { print (a) child(self), "?"; if (child(self) ofclass Cheese) print " They ", (i) "know", " I'm lactose intolerant. Are they trying to kill me?"; } else print "an empty dumb waiter?"; } " Send the whole thing back to the kitchen at once!~^ ^You hear a door being slammed, and then the sound of ropes and pulleys operating once more."; ], has ~scenery open openable static container; Object -> -> Tray "silver tea tray" with name 'silver' 'tea' 'tray', capacity 2, description [; print "A silver tea tray, delicately filigreed with pastoral scenes."; if (child(self)) { print " The tray contains "; WriteListFrom(child(Tray), ENGLISH_BIT); print (string)period; } new_line; rtrue; ], describe [; print "^A silver tea tray "; if (child(self)) { print "with "; WriteListFrom(child(self), ENGLISH_BIT); print " sitting on it "; } "lies here."; ], before [; Receive: if (children(self) == self.capacity) "You'll have to remove something from the tray first."; if (noun == Branch or Bearskin_Rug or Red_Carpet) print_ret (The) noun, " won't fit on the tray!"; ], has supporter; Object -> -> -> Chicken "cold chicken" with name 'cold' 'chicken' 'breakfast' 'lunch' 'dinner' 'meal' 'supper', description "The cold chicken has delicately spiced crispy skin, just the way you like it.", article "some", before [; Eat: "The chicken looks really tempting, but you've got qualms about wolfing it down. It's probably meant for someone else."; Lick,Taste: "It tastes delicious, a meal fit for the head of a guild."; Smell: "The chicken smells delicious."; ], has edible; Object -> -> -> Ginger_Beer "bottle of ginger beer" with name 'bottle' 'of' 'ginger' 'beer', parse_name ParseNameOf, description [; "A bottle of ginger beer. It looks identical to the bottle of WizStrip, save for the lack of a warning label on the side."; ], before [; Lick,Taste: if (self hasnt open) { give self open; print "(opening ", (the) self, " first)^"; } "Very gingery."; Drink,Empty: if (Thirsty == true) "You're not particularly thirsty at the moment."; if (self hasnt open) { give self open; print "(opening ", (the) self, " first)^"; } remove self; "You drain the bottle of ginger beer, quenching your thirst.^ ^The bottle itself vanishes, a handy consequence of the Thalionic Antimagic Litter Campaign."; EmptyT: if (self notin player) { print "(taking ", (the) self, " first)^"; ; } "Covering ", (the) second, " in ginger beer won't help your situation."; Receive: "The small stone bottle already contains ginger beer."; Search: if (self hasnt open) { <>; } "The bottle contains ginger beer."; Smell: if (self has open) { "The ginger beer smells very strong."; } "The closed stone bottle smells like every other stone bottle you've ever sniffed."; ], after [; Close: "You carefully seal the bottle of ginger beer."; Open: "You prise the lid from the stone bottle, revealing brown ginger beer."; ], has is_liquid openable; Object -> Pine_Table "table" with pname '.x' 'well-scru' '.x' 'solid' '.x' 'pine' '.x' 'sturdy' '.x' 'finest' 'table', description [; print "The pine table is smooth and level, crafted of soft white pine"; if (child(self) ~= 0) { print ". Someone has left "; WriteListFrom(child(self), ENGLISH_BIT); print " sitting on it"; } print_ret (string) period; ], DeadWood true, before [; Enter,Climb: "You'll just get the surface all dirty if you do that."; Pull,Push,PushDir: "Let's leave the kitchen furnishings as they are."; Take,Transfer: "It would be difficult to handle by yourself."; ], describe [; if (child(self) == 0) rtrue; print "^Although the kitchen is deserted, someone has left "; WriteListFrom(child(self), ENGLISH_BIT); " sitting on the table here."; ], has static supporter; Object -> -> Margarine "stick of margarine" with parse_name [wd prev num; wd = NextWord(); while (wd == 'stick' or 'of' or 'marg' or 'margarine' or 'margerine') { ++num; prev = wd; wd = NextWord(); } if (prev == 'of') { --num; } return num; ], description [; "A bright yellow stick of margarine."; ], before [; Eat: "You're more of a butter person."; Lick,Taste: "It's smooth and creamy; delicious, as margarine goes."; PutOn: if (self notin player) { print "(taking ", (the) self, " first)^"; ; } if (second == player or magic_clothes) "You're more of a butter person."; else { if (second == Ninario) { remove Margarine; Ninario.buttered = true; "Ninario sighs as you apply the margarine to him. ~I hope you know what you're doing, my young apprentice,~ he murmurs."; } if (second has animate) "That's the sort of thing that should be done only by two consenting adults."; } rfalse; Smell: "Mmmm, the pleasant odour of margarine."; Wear: "You're more of a butter person."; ], has edible clothing; Room Pipe_Closet "Closet" with description [; if (location hasnt visited) give ClosetHint ~concealed; "Small and cramped, this tiny closet is barely large enough to turn around in. It is devoid of supplies of any kind, but is obviously used for maintenance purposes, rather than storage. The hall is back to the west."; ], Poison false, each_turn [; if (self.Poison == true) PoisonSub(); ], compass_look [obj; if (obj == w_obj) <>; TouchWalls(obj, self.Floor, self.Walls); rtrue; ], before [; Exit: if (player in location) <>; rfalse; ], cant_go [; if (location == thedark) print "You're pretty sure, even in all this darkness, that t"; else print "T"; "he only way out of here is west back to the foyer."; ], w_to [; if (Valve.Hose_On == true || Vent.Hose_On == true) if (Hose notin location) { Valve.Hose_On = false; Vent.Hose_On = false; print "(detaching the hose first)^"; } if (Pipe_Closet_Door hasnt open) print "(opening the closet door first)^"; give Pipe_Closet_Door open; give Pipe_Closet light; print "You step out of the narrow confinement of the closet and into the echoing vastness of the foyer.^"; return Pipe_Closet_Door; ], has ~light; Prop -> Pipe "pipe", with name 'copper' 'pipe', description [; "The copper pipe is about one inch in diameter, and runs down the southern wall of the closet, from ceiling to floor. About midway up the pipe is a small valve with a nozzle on the end of it."; ], initial [; "A small copper pipe runs down the southern wall, entering the closet from the floor above and descending down to depths unknown."; ], before [; Open: <>; SwitchOn: if (Valve has open) "The valve is already open."; <>; SwitchOff: if (Valve has open) <>; "The valve is already closed."; Receive: if (noun == Hose) <>; Tie: if (second == Hose) <>; Turn: if (Valve has open) <>; <>; Take,Pull,Push,PushDir,Transfer: "It's firmly affixed to the wall."; ], has ~scenery static; Prop -> Valve "valve", with name 'valve' 'nozzle' 'pressure', description [; print "It's some sort of pressure release valve with a nozzle attached. "; if (self has open) "The valve has been opened, allowing the contents of the pipe to flow out through the nozzle."; "It looks like opening ", (the) self, " would allow the contents of the pipe to flow out through the nozzle and into the room."; ], Hose_On false, Gas_Buildup 0, time_left, time_out [; ! check if player has fixed hose in the meantime if (self.Hose_On == true && Vent.Hose_On == true) rtrue; if (real_location == Pipe_Closet) PoisonSub(); Pipe_Closet.Poison = true; Guild_Hall_Foyer.Poison = true; Guild_Kitchen.Poison = true; rtrue; ], daemon [; self.Gas_Buildup++; if (real_location == Pipe_Closet) { print "^A steady hissing noise comes from the nozzle as "; if (self.Hose_On == true && Vent.Hose_On == true) print "gas flows through the hose and into the air intake vent.^"; else if (self.Hose_On == true) print "gas hisses out of the end of the hose.^"; else print "gas hisses out of it.^"; } if (real_location == Guild_Hall_Foyer) print "^You can hear a hissing noise coming from the closet.^"; if (real_location == Guild_Kitchen) print "^Faintly, you hear a hissing noise coming from somewhere nearby.^"; if (self.Hose_On == false || Vent.Hose_On == false) { if (self.Gas_Buildup == 3) print "^The level of gas buildup in here is beginning to affect you. You feel tired and dizzy.^"; if (self.Gas_Buildup == 4) print "^The gas level is really starting to make you feel unwell. You had best do something about it quickly.^"; } rtrue; ], before [; Receive: if (noun == Hose) <>; Turn: if (self has open) <>; <>; SwitchOn: if (self has open) "The valve is already open."; <>; SwitchOff: if (self has open) <>; "The valve is already closed."; Tie: if (second == Hose) <>; ], after [; Close: if (First_Floor_Hall.exploded == true) "You close the valve."; StopDaemon(self); StopTimer(self); remove Gas; Pipe_Closet.Poison = false; Guild_Hall_Foyer.Poison = false; Guild_Kitchen.Poison = false; print "You close the valve. The hissing stops.^"; if (self.Hose_On == true && Vent.Hose_On == true) rtrue; self.Gas_Buildup = 0; "^The gas in the room dissipates quickly, and you can breathe more easily."; Open: if (First_Floor_Hall.exploded == true) "You open the valve, but nothing happens. The supply of gas must have been exhausted by the explosion."; if (self.Hose_On == false || Vent.Hose_On == false) { move Gas to location; StartTimer(self, 4); } print "You twist the valve open.^"; StartDaemon(self); rtrue; ], has openable; Prop -> Vent "air intake vent", with name 'air' 'intake' 'vent' 'duct' 'rectangul' 'grille' 'opening' 'grille-co' 'grate', description [; "The rectangular shaped opening is covered with a metal grille. Beyond the grille, you can see a duct extending upwards. It's probably an air intake vent."; ], Hose_On false, initial [; "Near the bottom of the eastern wall, at floor level, is a rectangular grille-covered opening."; ], before [; Close: "The vent is already covered with a grille."; Open,Enter,Take: "You can't pry the cover from the intake vent."; Receive: if (noun == Hose) <>; Tie: if (second == hose) <>; ], has ~scenery static; Object Gas "gas" with name 'gas' 'odourless' 'colourles' 'odorless' 'colorless' 'poisonous' 'methane' 'miasma' 'of' 'shimmerin', parse_name ParseNameOf, FakeObj, before [; default: "The gas is odourless and colourless."; ], has scenery; Room First_Floor_Hall "Hall" with description [; if (location hasnt visited) give FirstHallHint ~concealed; print "Clouds of dust billow into this hall through the large archway to the south. Shouts of panic and noises of tramping feet come from that direction also. On the north side of the room, spiralling stone steps head upward. To the west "; if (Cell_Door has open) print "is an open doorway, the remains of its door strewn about the room"; else print "a plain unfinished wooden door lies closed"; ". East, the ornate marble staircase descends back to the ground floor."; ], compass_look [obj; if (obj == w_obj) { if (Cell_Door hasnt open) <>; "A small stone room gapes open to the west, its door having been liberally strewn around the room."; } if (obj == n_obj or u_obj) { "Stone steps spiral upward to the north, ascending farther into the tower."; } if (obj == s_obj) "You try to peer through the billowing dust, but all you get is a vague sense of people rushing about in panic."; if (obj == d_obj or e_obj) { if (Cell_Door hasnt open) "You peer back down the stairs to the east and see the foyer below. It looks deserted."; "With all the noise of soldiers coming from down there, it might not be safe to peer down the stairs right now. You might get spotted."; } TouchWalls(obj, self.Floor, self.Walls); rtrue; ], exploded false, cant_go [; print "A noisy and dusty room lies to the south, a"; if (Cell_Door has open) print "n open"; else print " closed"; " wooden door leads west, and stone steps spiral upward to the north.^ ^East, the ornate marble staircase descends back to the ground floor."; ], u_to [; print "The noise and dust diminish as you head up the spiralling stone steps, eventually emerging out into the bright sunshine atop the tower.^"; return Tower; ], in_to [; <>; ], n_to [; <>; ], s_to [; "The way south has the whole collapsed structure, voices shouting and billowing dust thing going on. It might be safer to stay here."; ], w_to [; if (Cell_Door has open) { print "You step through the shattered remains of the door frame into the small room.^"; return Cell_Door; } "You strain and tug, but the plain unfinished door seems firmly locked."; ], d_to [; if (Cell_Door has open) "With all the noise coming from down there, it's probably unwise to try to escape that way."; print "You head back down out of the dust and confusion into the foyer.^"; return Guild_Hall_Foyer; ], e_to [; <>; ]; Object Cell_Door "plain unfinished door" with name 'plain' 'cell' 'unfinishe' 'wooden' 'green' 'young' 'door', description "A closed wooden door. It's constructed from untreated lumber, and looks to be very green wood, as though it was only cut from the tree and installed a short time ago.", add_to_scope [; if (Ninario in Cell && self in First_Floor_Hall) AddToScope(Ninario); ], found_in First_Floor_Hall Cell, door_dir [; if (self in Cell) return e_to; return w_to; ], door_to [; if (self in Cell) return First_Floor_Hall; return Cell; ], react_before [; Listen: if (Soldiers.time_left > 0 && self in Cell) "The sounds of the ringing bell and marching feet drown out everything else."; ], before [; if (self has open && action_to_be ~= ##Enter) "The bits of the door have been strewn all about the room."; Attack: "The green wood of the door is springy and resilient, and withstands your attack handily."; Enter: if (self in Cell) <>; <>; HandDrill: "You begin drilling at the door, but you don't seem to make any progress. The door glows strangely, and the drill doesn't seem to penetrate it at all.^ ^~What's that noise?~ comes Ninario's muffled voice through the door. ~If you're trying to drill through to rescue me, I'm fairly certain the Guild have protected the door against that. Mm-yes. You'll have to think of something they ", (i) "didn't!", "~"; Knock: if (self hasnt general) { give self general; "~Hello? Is that really you?~ asks Ninario's muffled voice through the door. ~I'm afraid I can't hear you terribly well in here. I hope you can hear me. Now listen, I seem to be having trouble finding the right spell to open this door; it's protected against all... erm, that is to say, ", (i) "both", ", of the spells I can think of, mm-yes. You'll have to get me out of here.~"; } else "~I really can't hear you very well at all in here,~ says Ninario's muffled voice through the door. ~You'll have to get me out of here.~"; Listen: if (Ninario in Cell && self in First_Floor_Hall) <>; Open: "You strain and tug, but the door won't open."; Push,Pull: "You tug at the door, but it seems well and truly secured."; Search: <>; Unlock: "Odd; the door seems locked, yet you can't see any obvious sign of hinges, locks or keyhole."; ], has scenery door locked; Prop Marble_Stair "ornate marble staircase" with name 'ornate' 'marble' 'stair' 'stairs' 'staircase' 'case' 'banister' 'railing', description [; print "Ornately constructed of white marble, the staircase curves sinuously "; if (self in Guild_Hall_Foyer) "up to the first floor hall."; else "down to the foyer."; ], before [; Climb,Enter,Go: if (self in Guild_Hall_Foyer) <>; else <>; ], found_in Guild_Hall_Foyer First_Floor_Hall; Prop Steps "spiralling stone steps" with name 'winding' 'spiral' 'steps' 'stone' 'stairs' 'stair', description [; print "The spiralling stone steps "; if (self in Tower) print "descend to the first floor hall."; else "climb up to the top of the building."; ], react_before [; Listen: if (Soldiers.time_left > 0) "The sounds of the ringing bell and marching feet drown out everything else."; ], before [; Climb,Enter,Go: if (self in Tower) <>; else <>; ], found_in Tower First_Floor_Hall, has pluralname; Room Cell "Cell" with description "This small stone room seems to have only recently been converted into a cell. There is a short stone bench jutting out from the wall, with a familiar round hole roughly in the middle of it. The Guild seem to have temporarily given over their main toilet for incarcerating Ninario. However magical the Guild are, it doesn't extend to their bodily functions; the smell in here is definitely not what you would call magical.", before [; Exit: if (player in location) <>; rfalse; Smell: "The unwholesome odour wafting into this room from the hole overpowers all else."; ], compass_look [obj; if (obj == e_obj) "The small stone doorway to the east opens out into the hall, the door itself having been liberally strewn around the hall through judicious application of wood hastener."; TouchWalls(obj, self.Floor, self.Walls); rtrue; ], cant_go [; "The only way out of here appears to be the doorway back to the hall to the east... unless of course you're game for trying the toilet."; ], e_to Cell_Door, d_to [; if (Ninario notin location) "You can't abandon Ninario like that!"; print "You slide yourself quickly into the hole.^", (b) "^In the Toilet Hole", "^The hole is a bit of a tight fit, but not too bad.^"; if (Ninario.buttered == false) { print "^From above, you can hear Ninario struggling and grunting. ~Err, excuse me, my dear student,~ he calls, ~but I can't seem to fit after you. The hole is too small. You'd best come back out and we'll find a solution.~^ ^You haul yourself back up out of the hole.^"; if (lookmode > 1) <>; else { new_line; style bold; print (name)real_location; new_line; style roman; rtrue; } } print "^Above you, Ninario squeezes himself into the hole after you. The lubrication makes all the difference, allowing him to slip easily into the toilet.^ ^~Mm-hmm,~ he mutters as he squeezes in, ~I've been checking my memory, and this is ", (i) "definitely", " the most distasteful experience of my life. Mm-yes.~^ ^The pipe seems unreasonably long and unpleasant, but eventually you and Ninario manage to wriggle your way down to the end, and you pop out and tumble down to the ground.^"; EndGame(); rtrue; ]; Outroom Tower "Tower" with description "Soaring high over the city below, the tower has a low parapet running all the way around it. Far below, you can see the bustle of people moving through the market square, a small undulating wave of humanity. The sunshine seems even stronger here, and the sky is a brilliant blue. A square opening in the middle of the rough stone floor leads back down into the tower.", Carpet_Go [; if (Ninario notin location) { PlayerTo(Outside_Vechlee); rfalse; } EndGame(); ], compass_look [obj; if (obj == u_obj) <>; Tower_Props.item_num = 1; <>; ], before [; Exit: if (player in location) <>; rfalse; Jump: "Things have not yet reached that hopeless a stage."; ], Floor ROUGH_STONE, Walls ROUGH_STONE, cant_go "If you do that, you'll tumble over the edge and splatter rather messily in the market square.", u_to "If you leap into the air like that, you'll tumble over the edge and splatter rather messily in the market square.", s_to [; <>; ], d_to [; print "You head back down the spiralling stone steps into the noise and dust of the hall.^"; return First_Floor_Hall; ]; Object -> Tower_Props with parse_name [i; while (true) { switch(NextWord()) { 'people', 'undulatin', 'wave', 'crowd', 'bustle', 'humanity': self.item_num = 1; i++; 'parapet', 'wall', 'low': self.item_num = 2; i++; 'square', 'opening': self.item_num = 3; i++; 'of': i++; default: return i; } } ], short_name [; switch(self.item_num) { 1: print "undulating wave of humanity"; 2: print "low parapet"; 3: print "square opening"; } rtrue; ], description [; switch(self.item_num) { 1: "The people look small and insignificant from here."; 2: "The low parapet runs all around the tower. It looks the perfect height for pushing interfering busybody apprentices over in the dead of night."; 3: "The square opening leads back down into the tower."; } ], item_num 1, FakeObj, before [; Attack: if (self.item_num == 1) "Violence is even more pointless from all the way up here."; rfalse; Enter: if (self.item_num == 2) <>; Examine: rfalse; Take,Pull,Push,PushDir,Transfer: if (self.item_num == 1) "They're small because they're far away, not because they're tiny, pocket-size people."; "That would be somewhat difficult to do to ", (a)self, (string)period; default: "That would be somewhat difficult to do to ", (a)self, (string)period; ], has scenery; Prop Soldiers "soldiers" with name 'soldiers', description "Mean and brutish-looking, the soldiers are an unfriendly looking lot. You suspect tangling with them would be unwise.", Reason 0, Alarm 0, CountVal 0, daemon [; self.CountVal++; if (self.Reason == 2) { print "^From somewhere within the building, you hear a bell ringing loudly, and the tramping of feet marching in step.^"; if (self.CountVal == (self.Reason * 3) - 2) "^The feet sound like they're coming in your direction."; if (self.CountVal == (self.Reason * 3) - 1) "^The feet are getting very close. You won't have much time now!"; if (self.CountVal == (self.Reason * 3)) "^The tramping feet are almost upon you!"; rtrue; } if (self.Reason == 3) { print "^From somewhere within the building, you hear a bell ringing loudly, and the tramping of feet marching in step.^"; if (self.CountVal == (self.Reason * 3) - 2) "^~Ah think that studen' mun ev gone that way,~ you hear ", (the) Guard, " say, from down below.^ ^~Thanks!~ you hear the harsh voice of a soldier bark. The feet tramp away in unison."; if (self.CountVal == (self.Reason * 3) - 1) "^~Th' studen' wurn't ower there?~ you hear ", (the) Guard, " say, sounding puzzled. ~Weel, try tha' way.~^ ^~Thanks!~ you hear the harsh voice of a soldier bark. The feet tramp away in unison."; if (self.CountVal >= self.Reason * 3) "^~That studen' mun ev left th' buildin',~ you hear ", (the) Guard, " say, from down below.^ ^~Look, forget trying to help,~ says another voice in disgust. ~Just ignore him, he's no bloody help at all. Let's look upstairs.~^ ^~Neea, that studen' mun be in th'...~ you hear ", (the) Guard, " protest, but his voice is suddenly cut off.^ ^~Throw him out,~ says the voice, ~and we'll go after the wizard and his little apprentice.~^ ^You hear the tramp of feet from below. It sounds like they're coming up the stairs!"; rtrue; } if (self.Reason == 4) { print "^You can hear a bell ringing loudly somewhere in the building, and from below, the clash of weaponry, a violent battle in progress.^"; if (self.CountVal == (self.Reason * 3) - 3) "^~Feel th' wrath o' th' Ploombers Union!~ you hear ", (the) Guard, " cry from below. ~They ev let ma in, an' noo we are awl here for ti deal with tha! At last, ah sal ev mah rahvenge on tha!~"; if (self.CountVal == (self.Reason * 3) - 1) "^You can hear more and more soldiers pouring into the battle downstairs. It doesn't sound like it's going well for ", (the) Guard, " and his cohorts."; if (self.CountVal == self.Reason * 3) "^~Ah can't ho'd 'em any longer!~ you hear ", (the) Guard, " shout from downstairs. ~We mun fall back! Run, mah friend, if tha's there! Run!~^ ^You hear a last final clash of weapons, and then silence. ~Well, that's seen off the Plumbers Union attack,~ you hear a voice say from downstairs. ~Now, let's find Ninario and that meddlesome apprentice.~"; rtrue; } ], time_left, time_out [; StopDaemon(self); print "^With no warning, a troop of soldiers suddenly bursts "; if (location == Tower) print "out onto the ", (ToLower)location; else if (location hasnt proper) print "into the ", (ToLower)location; else print "into ", (name)location; print ", all wearing the golden wand insignia of the Wizards Guild.^"; switch(self.Reason) { 1: print "^~That must be the one,~ says one of them, pointing at you.^ ^You are nabbed and dragged up to the first floor of the guild hall, and into an ornately decorated council chamber where the grim and stern-looking Renaldo sits.^ ^~This is the cook you wanted to see,~ says one of the guards, throwing you forward.^ ^Renaldo looks up and starts in shock as he sees you. ~This is no cook, you fools!~ he says harshly. ~This is "; 2: print "^They spot you "; if (Ninario in location) print "and Ninario and drag you both"; else print "and drag you"; print " off to an ornately decorated council chamber, where the grim and stern-looking Renaldo sits.^ ^He looks at you in surprise. ~Why, if it isn't "; 3: print "^They cry in triumph as they spot you"; if (Ninario in location) print " and Ninario. You are both"; else print ". You are"; print " dragged off to an ornately decorated council chamber, where the grim and stern-looking Renaldo sits.^ ^He looks at you in surprise. ~Why, if it isn't "; 4: print "^They cry in triumph as they spot you"; if (Ninario in location) print " and Ninario. You are both"; else print ". You are"; print " dragged off to an ornately decorated council chamber, where the grim and stern-looking Renaldo sits.^ ^He looks at you in surprise. ~Why, if it isn't "; } deadflag = 4; "Ninario's little apprentice!~ He smiles cruelly. ~So you have arrived just in time to save your master, have you? Guards! Prepare an extra space on the gibbet for our young friend here.~^ ^Renaldo sighs theatrically. ~Yes, just in time to save Ninario... from the misery of dying alone. But don't worry, we'll be certain you get a fair and just trial the moment the post-execution party is over. Guards! Put Ninario and our young friend into a little cell together while the gibbet is made ready.~^ ^The guards grab you once more and drag you, resisting, to meet your cruel fate."; ], has animate male pluralname; Outroom Outside_Vechlee "Outside Vechlee" with description [; if (location hasnt visited) give MountMenu ~concealed; "The peace and quiet of a summer countryside surround you once again, here outside the walls of Vechlee. The cobblestones have vanished and the road has reverted to a plain dirt ribbon snaking its way west. Hilly mountainous country borders the road to the north and a small path wends that way, climbing up into the crags. East are the walls of Vechlee, their broad expanse interrupted by both the gate back into town as well as the end of a rusty metal pipe that sticks out of the wall."; ], compass_look [obj; if (obj == e_obj) <>; if (obj == n_obj) "The narrow path twists and turns up the side of the mountain, but doesn't look like too hard of a climb."; if (obj == w_obj) "The road is a plain dirt ribbon snaking its way west to the horizon. It certainly looks like a long march."; if (obj == u_obj) <>; "You don't see anything interesting in that direction, other than what's already been mentioned."; ], cant_go [; "You can head east back into Vechlee or north up the mountain trail. The road west to Blumph looks a little too long and dusty to attempt on foot."; ], w_to [; "You glance at the sign, which reads ", (i) "Blumph: 40 miles", ", and reconsider. You'll need a faster means of transportation than your feet."; ], e_to [; print "You walk back into the outskirts of Vechlee.^"; return Outskirts; ], n_to [; print "The narrow path twists and turns up the side of the mountain. It's not too hard of a climb, but it certainly gets the limbs moving and the heart pumping. Eventually, the path you are following narrows.^"; return Path_Middle; ], u_to [; <>; ]; Object -> Blumph_Sign "sign" with name 'small' 'wooden' 'notice' 'message' 'sign' 'steel' 'post', description [; print "The sign is mounted on a steel post driven into the grass at the side of the road.^"; new_line; <>; ], initial "A small wooden sign sits at the side of the road leading west.", DeadWood true, before [; Read,Search: font off; print "Blumph: 40 miles^"; font on; rtrue; Take,Pull,Push,Pushdir,Transfer: "The steel post is too securely attached to the ground."; ], has static readable; Object -> Outflow_Pipe "outflow pipe" with name 'sewer' 'outflow' 'pipe' 'wall' 'rusted' 'metal', description [; "The sewer outflow pipe rises up into the wall surrounding Vechlee, and looks like it connects to the vast sewer system inside the city. It's about a foot in diameter."; ], react_before [; Listen: if (noun == nothing) <>; ], before [; Enter,Go: "While the pipe is large enough to enter, it's at enough of a pitch that travelling ", (i) "up", " it would be pretty difficult. Perhaps if you were at the inflow end where the pipe sloped downward you could manage it; as it stands, it's too difficult."; Lick,Taste: "The smell is bad enough. The taste would be even worse."; Listen: "The pipe gurgles a bit every now and then."; Smell: "The pipe smells fairly disgusting."; ], has scenery static; Outroom Path_Middle "Ledge" with description "The path narrows to a ledge here that curves around the side of the mountain. East is a towering wall of rock, west a nasty tumble off the cliffside. The narrow path heads south back down the mountain, and to the north, the ledge opens up into a wide plateau.", before [; Jump: if (noun == Cliff or nothing) { self.Plummet(); rtrue; } if (noun == Bear) "That would entail getting ", (i) "on", " the bear first. As far as you can remember, your insurance doesn't cover leaping atop wild bears."; ], compass_look [obj; if (obj == e_obj) <>; if (obj == w_obj) <>; if (obj == n_obj) <>; if (obj == s_obj) "The narrow path twists and turns back down the mountain to the south."; if (obj == u_obj) <>; "You don't see anything interesting in that direction, other than what's already been mentioned."; ], Walls OUTSIDE, Floor SHORT_GRASS, west_warning false, Warn false, YesJump [; <>; ], NoJump [; Path_Middle.Warn = false; "That sounds like a wise decision."; ], Plummet [; if (Path_Middle hasnt general) { give Path_Middle general; Achieved(23); print "You tumble over the edge. In a serious break with your expectations, you do not plummet to your death. Through an astonishing series of coincidences that have served to place everyone involved in exactly the right place at the right time, you land with a thump on the trailing rug in a flying carpet convoy.^ ^After the initial shock subsides, the carpet vendors' surprise turns to amazement as you relate the story of your encounter with the bear and your plummet off the cliffside.^ ^In exchange for this tale, which will keep their firesides entertained for many nights to come, they are only too glad to set you down on the cliff beyond the bear.^ ^Before they leave, one of them tosses a carpet towards you. ~That's the best carpet in our entire stock!~ he calls. ~Use it well, my friend!~^"; PlayerTo(Plateau); rtrue; } if (self.Warn == false) { self.Warn = true; print "The astonishing series of coincidences are unlikely to occur again. Are you really sure you want to leap over the edge once more?^"; YesNo.Ask(self.YesJump,self.NoJump,0); rtrue; } deadflag = 1; "You tumble over the edge. Looking to tempt fate again, you discover, as you might have expected, that indeed, the astonishing series of coincidences fail to recur. In a disappointingly clich@'ed manner, you plummet to your death."; ], cant_go [; "North takes you farther up the mountain, and south heads back down the trail."; ], n_to [; if (Bear has general) { print "You head north past the placated bear who sniffs at you in fond remembrance.^"; return Plateau; } if (Bear.BearStop() == false) <>; rtrue; ], s_to [; print "The narrow path twists and turns down the mountainside. It's much easier going back down than coming up.^"; return Outside_Vechlee; ], e_to [; <>; ], w_to [; if (self.west_warning == true) <>; self.west_warning = true; "If you want to jump off the cliff, say so."; ], d_to [; <>; ], u_to [; <>; ]; Prop -> Rock_Wall "wall of rock" with name 'wall' 'of' 'rock', parse_name ParseNameOf, description "The wall of rock towers above the ledge, steep and forbidding.", before [; Climb: "It's doubtful that you could scale the wall of rock, certainly not without mountaineering equipment."; ]; Prop Cliff "cliff" with name 'cliff' 'ledge' 'mountains' 'drop', description "The drop is steep and forbidding.", found_in Plateau Path_Middle; Prop Plat_Obj "wide plateau" with name 'wide' 'plateau', description [; if (self in Path_Middle) "The ledge expands out into a wide plateau to the north of you. You can see tall evergreens and tall dry mountain grass."; if (lookmode > 1) <>; else { new_line; style bold; print (name)real_location; new_line; style roman; rtrue; } ], before [; Examine: rfalse; Search: if (self in Path_Middle) "You aren't at the plateau quite yet."; "You search around half-heartedly, but the plateau is so big and wide-open, you're pretty sure nothing is concealed here."; default: "That doesn't seem very practical."; ], found_in Plateau Path_Middle; Outroom Plateau "Plateau" with description [; if (location hasnt visited) give StuckHint ~concealed; "Tall mountain grass and towering trees line this peaceful plateau far up the mountainside. West, the plateau ends in an abrupt drop down the mountainside. The trail turns to the east here, running across the plateau and then climbing farther up the mountain. South, it descends back down to the ledge."; ], Floor LONG_GRASS, Walls OUTSIDE, before [; Jump: Path_Middle.Plummet(); rtrue; ], Carpet_Go [; PlayerTo(Outside_Vechlee); rfalse; ], compass_look [obj; if (obj == e_obj) "The trail runs across the plateau and climbs farther up the mountain to the east."; if (obj == w_obj) <>; if (obj == s_obj) "To the south, the plateau descends back down to the ledge, narrowing all the way."; if (obj == u_obj) <>; "You don't see anything interesting in that direction, other than what's already been mentioned."; ], cant_go [; "The trail heads farther up the mountain to the east, and descends to the south."; ], u_to [; <>; ], d_to [; <>; ], e_to [; print "You walk through the quiet peace of the long, level plateau and up the winding path to the very top.^"; return Top_Mountain; ], s_to [; if (Bear has general) { print "You head south past the placated bear who sniffs at you in fond remembrance.^"; return Path_Middle; } if (Bear.BearStop() == false) return Path_Middle; rtrue; ]; Object -> Red_Carpet "threadbare red carpet" with name 'threadbar' 'garish' 'red' 'carpet' 'ugly' 'cheaply' 'made', description [; print "An ugly and cheaply made carpet. It is a garish red and looks ready to fall apart.^"; if (self has general) "^That trip seems to have taken the final gasp of life out of it."; "^If it truly is a flying carpet, you're not sure how many trips it's good for before disintegrating underneath you."; ], describe [; print "^A threadbare red carpet lies across the "; if (location == Tower or Tower_Roof) print "tower floor"; else if (parent(self) has supporter) print (name) parent(self); else if (location ofclass Outroom) print "ground"; else print "floor"; if (child(self) ~= 0) { print ". Sitting on the carpet"; WriteListFrom(child(self), ENGLISH_BIT + ISARE_BIT); } print_ret (string) period; ], before [obj; Enter: if (self notin location) "The carpet needs to be on the ground in order for you to do that."; LookUnder,Push: if (self notin location) { print "The carpet needs to be on the "; if (location ofclass Outroom) print "ground"; else print "floor"; " in order for you to do that."; } if (real_location == Shed) <>; print "You pull back the carpet, but don't find anything interesting.^"; if (Ninario in location) print "^~Looking for trap doors?~ asks Ninario.^"; if (Crone in location) "^~Are you expecting trap doors to appear just because you drop a carpet on the floor?~ ~ cackles ", (the) Crone, " in delight.^ ^~Hmmm,~ she muses, ~a trap door. That's an interesting idea all the same. I'd better mention it to that Implementor when I see him again.~"; if (Shopkeeper in location) "^~No,~ ", (the) Shopkeeper, " says, shaking her head. ~It just isn't the right look.~"; if (Hermit in location) "^~It's still hideous,~ mutters ", (the) Hermit, (string)period; rtrue; PutOn: if (second == Trapdoor) "You indulge yourself by placing ", (the) self, " over the trap door, simply for the thrill of pulling it back and seeing the trap door. How exciting!"; Receive: if (self notin location) "The carpet needs to be on the ground in order for you to do that."; Ride: <>; Take: if (player in self) { move player to location; print "(getting off the carpet first)^"; } if (child(self) ~= 0) { print "(dislodging "; WriteListFrom(child(self), ENGLISH_BIT + DEFART_BIT); print ")^"; for (obj=child(self): obj ~= 0: obj=child(self)) { move obj to location; } } Tie: if (self has general) { "You're not entirely certain how to fix the carpet."; } "As far as you can tell, the carpet is working properly."; ], after [; Drop: if (Shopkeeper in location) "Dropped.^ ^~It's a lovely carpet,~ says ", (the) Shopkeeper, " as you spread it on the floor. ~But it's just not the right look for the shop. The red clashes with my hair.~"; if (Hermit in location) "Dropped.^ ^~That's a hideous carpet,~ mutters ", (the) Hermit, ". ~If I'd had a carpet like that, I'd have fled society ", (i) "years", " earlier.~"; Enter: if (self has general) { print "You get on the threadbare red carpet. The edges flutter weakly and then the carpet seems to give up.^"; if (Ninario in location) print "^~It doesn't seem to work,~ says Ninario. ~That's not good. Mm-yes. No.~^"; rtrue; } if (location provides Carpet_Go) { print "You"; if (Ninario in location) print " and Ninario"; print " step onto the threadbare red carpet.^ ^The edges flutter and then begin to wave and suddenly the carpet rises into the air!^"; if (Ninario in location) print "^~Hang on to your carrots!~ cries Ninario. ~Mm-yes indeed!~^"; give Red_Carpet general; print "^The carpet bucks and twists madly, nearly dumping you "; if (Ninario in location) print "and Ninario "; print "off, but somehow you manage to hang on as it rockets up into the clouds. It screams through billowing white clouds and then plummets straight downwards at alarming speeds.^ ^It approaches the ground in breakneck fashion, veering up at the last instant, and settling down with a bone-jarring thump that rattles your teeth in your head.^"; location.Carpet_Go(); move Red_Carpet to location; move player to Red_Carpet; rtrue; } else { print "You get on the threadbare red carpet. The edges flutter briefly but nothing else happens.^"; if (Ninario in location) { print "^~It doesn't seem to work,~ observes Ninario. ~At least, not here. Mm-yes. No."; if (location ofclass Room) print " Perhaps it would work better outdoors.~^"; else print "~^"; } rtrue; } ], has enterable supporter; Prop -> Trees "towering evergreens" with name 'towering' 'evergreen' 'tree' 'trees', description [; "The evergreen trees tower above the plateau, shading some of the brilliant sunshine. Their boles are large and solid, but high above, they taper to thin wispy branches that wave gently in the mountain breezes."; ], before [; Climb,Enter: "As is typical of mountain evergreens, the tree trunks are bare for the first fifteen or twenty feet, offering no purchase for climbing."; Examine: rfalse; Attack,Take,Pull,Push,PushDir,Transfer: "The evergreens are very strongly rooted."; default: "That doesn't seem very practical."; ]; Prop -> Grass "grass" with name 'tall' 'mountain' 'coarse' 'long' 'grass', description [; "Long mountain grass, dry and coarse to the touch. It's rooted firmly in the dry packed earth."; ], before [; Examine: rfalse; Attack,Take,Pull: "You rip up a few stalks of grass and watch them blow away in the wind."; default: "That doesn't seem very practical."; ]; Object Bear "bear" with name 'black' 'bear' 'claws' 'muzzle' 'sharp' 'teeth' 'short', found_in Path_Middle Plateau, warn 0, initial [; print "A black bear blocks the trail "; if (self in Path_Middle) print "north"; else print "south"; " here, pawing at the carcase of some unfortunate animal."; ], description [; "The black bear has a long, straight muzzle, large teeth and short sharp claws. It looks very menacing."; ], before [; Attack,Search: if (self has general) "The bear is placated right now. Just leave it that way."; "The bear roars and swipes at you with a massive claw. You back away hurriedly."; Bargain,Drill: <>; Kiss: if (self has general) "You kiss the bear gently on top of its furry head. Grunting in pleasure, it rears up on its hind legs and slobbers its tongue all over you."; "The bear roars and swipes at you with a massive claw. You back away hurriedly, keeping your affections to yourself."; Lick: <>; Listen: "The bear is making grunting and snuffling noises as it digs its nose into the animal carcase."; MeetNPC: if (self has general) "The bear grunts happily as it hears your voice."; <>; Play: if (self has general) "The bear grunts happily and plays along with you for a few moments. Those claws still look extremely sharp."; "Playing around will only make the bear more angry."; Ride,Enter: if (self has general) "The bear is friendlier, but it's not tame!"; self.warn++; if (self.warn > 1) { if (self.warn > 2) { deadflag = 1; "Throwing all caution to the wind, you leap astride the bear again. Already agitated by your earlier foolishness, the bear decides it has had enough. It rears up, throwing you to the ground. Then, claws extended, it launches itself at you and tears you into numerous smaller easily-digested pieces. There is soon a second carcase lying on the trail."; } "Ignoring any possible repercussions from your actions, you leap astride the broad hairy back. The bear goes mad with fury, leaping, spinning, roaring, trying desperately to dislodge you. Finally, it rears up on its hind legs, and you tumble off.^ ^The bear stares balefully at you and roars in anger before returning to the carcase."; } "It might be unwise to try to climb aboard the bear right now."; Smell: "The brown bear has a rather foul smell."; Take: "Bears, ferocious or otherwise, are not something you can easily pick up."; Talk,MeetNPC: if (self has general) "The bear glances up as you speak, but the power of speech continues to elude it."; "The bear ignores you, intent on the carcase."; Touch: if (self has general) "The bear grunts happily as you touch its coarse black fur."; <>; WakeOther: if (self has general) "It's placated, but it's not asleep!"; <>; ], BearStop [; if (Bearskin_Rug hasnt worn) { if (Arktos has worn) "The black bear sniffs at you curiously for a long moment, looking a bit puzzled. Then it rears up on its hind legs and roars angrily. It swats at you and you dodge back out of reach."; "The black bear rears up on its hind legs and roars angrily. It doesn't want you interfering with its meal."; } if (Arktos hasnt worn && Arktos notin Bearskin_Rug) "The black bear peers quizzically at the bearskin rug for a long moment. It nudges a bit closer. It snuffles at you briefly and then rears up on its hind legs and roars angrily. It swats at you, and you dodge back out of reach."; if (Helmet hasnt worn && Chamberpot hasnt worn) "The black bear peers quizzically at the bearskin rug for a long moment. It nudges a bit closer. It snuffles at you and then gives a curious grunt of pleasure. It rears up and leaps on you, smothering you with love and affection.^ ^The weight of the bear pushes against you, and you trip, striking your head a glancing blow on the cliff. You stumble back in a daze, shaking your head to clear it."; print "The black bear peers quizzically at the bearskin rug for a long moment. It nudges a bit closer. It snuffles at you and then gives a curious grunt of pleasure. It rears up and leaps on you, smothering you with love and affection.^ ^The weight of the bear pushes against you, and you fall, striking your head a glancing blow on the cliff. Fortunately, the "; if (Helmet has worn) print "helmet"; else print "chamberpot"; print " protects you, and you surge back to your feet.^ ^The bear's amorous advances are in no way chilled by your reaction, and it lunges forward at you again. "; if (Path_Middle has general) { give Bear general; "It delivers one final earsmacking slobbering kiss and, seemingly satiated, backs away."; } print " You are already badly off balance, and you trip backwards, your arms windmilling wildly, the edge of the cliff getting closer and closer until suddenly...^^"; give Bear general; rfalse; ], life [; Answer,Ask,Tell: <>; Give: <>; Show: switch(noun) { Bearskin_Rug: if (Arktos in Bearskin_Rug) { "The bear sniffs curiously at the rug for a time and then looks up at you suspiciously."; } "The bear takes a quick sniff of the bearskin rug and then backs away from it quickly, an expression of distaste on its face."; Butter: "The bear sniffs curiously at the butter, then grunts and returns its attention to the carcase."; Arktos: if (Arktos has open) "The bear seems extremely interested in the arktos essence, trying to push its snout into the jar."; else "The bear sniffs briefly at the closed jar, but doesn't seem terribly interested."; default: "The bear sniffs briefly at ", (the) noun, " but doesn't show any other interest."; } ], orders [; Meet,MeetNPC: <>; default: if (self has general) "The bear looks at you as though it would love to, if only it could understand you."; "The bear ignores your request. It's almost like it can't understand you at all."; ], has animate neuter; Object Animal "carcase" with name 'animal' 'carcase' 'carcass', found_in Path_Middle Plateau, description "The carcase is no longer identifiable as any specific animal.", before [; Examine: rfalse; default: if (Bear has general) "The bear is placated now, but it still wouldn't like you interfering with its meal."; "The bear would definitely not appreciate you tampering with its dinner."; ], has scenery static; Outroom Top_Mountain "On the Mountaintop" with description [; if (location hasnt visited) { give Hermit1 ~concealed; give Hermit2 ~concealed; } "Sunlight beats down warmly from high overhead this bald and barren mountaintop. It's extremely hot, and the trees and grass have faded away, leaving a bare smooth expanse of rock. The wind is stronger here, and whips your robe against your legs. West, the mountain trail winds back down toward the plateau.^^A small shoddily built lean-to sits here."; ], Floor MOUNTAIN_STONE, before [; Exit: if (player in location) <>; rfalse; Go: if (noun == w_obj) { give Hermit ~general; rfalse; } ], Carpet_Go [; PlayerTo(Outside_Vechlee); rfalse; ], compass_look [obj; if (obj == d_obj or w_obj) "The mountain trail winds back down toward the plateau to the west."; if (obj == u_obj) <>; "You don't see anything interesting in that direction, other than what's already been mentioned."; ], cant_go [; "The only way out of here seems to be back down the winding mountain trail to the west."; ], d_to [; <>; ], in_to [; Herm_Props.item_num = 1; <>; ], w_to [; print "You head gingerly back down the winding mountain trail to the plateau.^"; return Plateau; ]; Object -> Hermit "hermit" with name 'old' 'hermit' 'bat' 'man' 'guy' 'fellow' 'fella' 'body' 'eyes' 'tears' 'wrinkles' 'cracked' 'lined' 'face' 'squinting' 'rob' 'robert' 'robby' 'bob' 'bobby', description [; print "The cracked and lined face of the hermit almost makes you start back in shock as you gaze at it. This man is old, with darkly tanned and weathered skin, and short spindly limbs. You wonder just how long he's been sitting up here. "; if (Goggles in self) print "With the goggles on, he seems a little more comfortable, gazing easily around his mountaintop home."; else print "His eyes are sunk deep into his flesh, squinting so tightly they're almost closed. Tears stream openly from them."; new_line; rtrue; ], Chat 0, Topics 0, warn false, initial [; if (location hasnt visited) { self.Chat = 0; give self general; print "As you approach the lean-to, you spot an old hermit sitting on a rock in front of it. ~Bah!~ he mutters as he sees you. He squints in your direction, trying to make you out. ~"; if (Bearskin_Rug has worn) print "That's one ugly bear!~ he mutters. ~More likely, it's"; else print "~Robes!~ he mutters to himself. ~Must be"; print_ret " a meddling wizard or, worse yet, an apprentice.~"; } if (self hasnt general) { self.Chat = 0; give self general; if (Goggles has worn) print_ret (The) Hermit, " squints up at the goggles. ~Those must be great for blocking out the sunlight,~ he says wistfully."; if (Goggles in self) "~Hello there, youngster,~ calls ", (the) self, " politely, gazing benignly around him, the goggles shielding his eyes."; switch(random(2)) { 1: "~Is there to be no peace for me?~ cries ", (the) self, " as you approach."; 2: if (Bearskin_Rug has worn) print_ret (The) self, " squints at you as you shuffle forward in the bearskin rug. ~That's one strange-looking bear,~ he mutters to himself."; if (Helmet has worn) print_ret (The) self, " squints carefully at the helmet as you approach. ~Must be a knight,~ he mutters. Then he squints at your robes. ~A knight in robes? Can't be.~ He rubs his chin and then suddenly snaps his fingers. ~Must be a religious order. Hail, pilgrim!~ he calls, sitting up a little straighter. ~Just to warn you, if you're collecting, I eschewed money ", (i) "long", " ago.~"; if (Chamberpot has worn) { print_ret (The) self, " glances curiously at the chamberpot on your head. ~You townsfolk,~ he snorts. ~You can't even go for a walk up the mountain without hauling along all the mod cons.~"; } switch(random(100)) { 1 to 20: print_ret (The) self, " shuffles out from his lean-to, mumbling to himself."; 21 to 30: "~Back again?~ scowls ", (the) self, (string)period; 31 to 50: print_ret (The) self, " squints at you from his rocky perch outside his lean-to."; 51 to 70: print_ret (The) self, "'s intense glare greets you as you approach. He doesn't seem thrilled to see you."; 71 to 80: print_ret (The) self, " looks up from studying the ground intently and scowls."; 81 to 90: "~What is this, visit a mountain-top day?~ mutters ", (the) self, " as you approach."; 91 to 99: "~Who will rid me of this turbulent student?~ cries ", (the) self, " as you near him."; 100: "~My poor blinded eyes!~ moans ", (the) self, " to himself as you come near. ~This sunlight is killing them.~"; } } } if (Goggles in self) { print (The) self, " sits placidly on his"; if (Pillow in self) print " pillowed"; " stone."; } print (The) self, " sits morosely on his"; if (Pillow in self) print " pillowed"; " stone."; ], each_turn [; if (self.Chat == 1) { switch(random(50)) { 1 to 10: print "^", (The) self, " sighs and kicks at some pebbles.^"; 11 to 20: print "^~Progress,~ mutters ", (the) self, " to himself. ~It's all a load of cobblers if you ask me.~^"; 21 to 25: print "^", (The) self, " squints up at you briefly.^"; 26 to 30: print "^~Only by following the way of the pipe can you be flushed clean,~ mutters ", (the) self, " scornfully. ~Hah! What a joke those door to door plumber-priests are. Do my pipes need mending, they ask, and before you know it, in they swoop, trying to replace your fixtures and recaulk your brain.~^"; 31 to 35: if (Goggles in self) print "^", (The) self, " looks up into the blinding sun and chuckles to himself.^"; else print "^", (The) self, " glares up at the blinding sunlight and shakes his fist.^"; 36 to 40: if (Goggles in self) print "^~You know,~ remarks ", (the) self, ", gazing around, ~these goggles really are excellent.~^"; else print "^", (The) self, " glances up at the sun and shakes his fist in anger.^"; 46 to 48: print "^", (The) self, " glances at you. ~So, hanging out on top of a mountain in the blinding sunlight is your idea of a good time, right?~^"; 49: print "^~They thought I was mad to come up here, you know,~ ", (the) self, " confides. ~The fools stayed in town with their fancy four-walled houses and their heat and their plumbing, their regular meals...~ He pauses to gaze round the barren mountaintop. ~Hmmm...~ he mutters to himself.^"; 50: if (Goggles in self) print "^~I think I'm very close to going mad, you know,~ ", (the) self, " tells you quietly.^"; else print "^~Why was I made to suffer so?~ wails ", (the) self, " suddenly. ~I came up here with every good intention of getting away from society and having time to contemplate, but all I can think about is the burning pain in my eyes. If only I could find a way to shield my eyes from all this sunlight!~^"; } } self.Chat = random(5); rtrue; ], before [; Attack: "~Of course,~ mutters ", (the) self, " as you pull back to strike him. ~The modern youth, always resorting to violence.~^ ^Ashamed, you lower your hand."; Bargain: "~Argh!~ cries ", (the) self, " in frustration. ~Haggling! I hate it! That's another reason I gave up my stall!~"; Kiss: "You bestow a kiss on ", (the) self, "'s craggy face. ~Eh?~ he says, squinting up at you. ~Whatever it is, I still won't do it.~"; Listen: if (Goggles in self) print_ret (The) self, " sighs to himself contentedly every now and then."; print_ret (The) self, " mutters to himself about the ills of society, his dislike of the summer heat, and the annoying brightness of the sun."; MeetNPC: print_ret (The) self, " scowls. ~I moved out of Vechlee to get away from all this nonsense,~ he says exasperatedly."; Search: print_ret (The) self, " frowns at you. ~I've foresworn possessions and money, youngster, so don't waste your time.~"; Smell: print_ret (The) self, " doesn't smell terribly clean. ~Well, what do you expect?~ he snaps as you back away. ~Do you see any bathing facilities?~"; Talk: print_ret (The) self, " squints up at you. ~Well?~"; Take: print_ret (The) self, " smacks your hand away. ~I'm being contemplative, not deceased.~"; Touch: "~Watch where you're putting those paws of yours,~ mutters ", (the) self, (string)period; ], life [obj; Answer: if (noun == 'hello' or 'hi') <>; print_ret (The) self, " looks at you and sighs. ~Talk, talk, talk,~ he mutters. ~Is that ", (i) "still", " all they do away there in town?~"; Ask: if (WordInProperty(second, Asiago, name) || WordInProperty(second, Bel_Paese, name) || WordInProperty(second, Wensleydale, name) || WordInProperty(second, Camembert, name) || WordInProperty(second, Gouda, name) || WordInProperty(second, Emmental, name) || WordInProperty(second, Stilton, name) || WordInProperty(second, Miranda, name) || WordInProperty(second, Cheshire, name) || WordInProperty(second, Roquefort, name) || second == 'venezuela' or 'venezeula' or 'beaver' or 'caerphill' or 'philly') { "~I'm not really much of an authority on the subject of cheese,~ apologises ", (the) self, (string)period; } switch(second) { 'bathing', 'bath', 'facilities', 'toilet': "~Would cost too much to run plumbing up from town,~ mutters ", (the) self, (string)period; 'haggling', 'bartering', 'barter', 'bargain', 'bargainin', 'haggle', 'deal', 'trade', 'discount': <>; 'progress': "~Seeing you ask... it's all a load of cobblers.~"; 'cobblers', 'awls', 'balls': "~Cobblers,~ says ", (the) self, ", sounding a bit embarrassed. ~It's rhyming slang. Cobblers' awls... well, never mind,~ he adds, glancing up at you. ~I'm sure you could look it up on your own.~"; 'eyes', 'tears', 'sunk', 'sadness', 'squint', 'squinting', 'crying', 'weeping', 'cry', 'weep', 'sun', 'sunlight': if (Goggles in self) "~My eyes are feeling much better now,~ says ", (the) self, " gazing around the mountaintop contentedly."; if (self.Topics & FLAG_x1 == FLAG_x1) print "~Well, as I said, "; else print "~"; self.Topics = self.Topics | FLAG_x1; "I'm not crying,~ says ", (the) self, " shielding his eyes with his hand. ~It's that blasted sunlight beating down on me all day every day. It's too much! I'd like to go into town and pick something up to cover them, but...~ He pauses and sighs. ~Well, it's a matter of principle now. I told them I'd never set foot in town again, said I had all I needed up here. Foolish pride!~"; 'favour', 'favor', 'help', 'wants', 'needs': if (Goggles in self || Pillow in self) "~You've already done more than enough, thank you,~ says ", (the) self, ". ~I'm feeling much better now.~"; "~Well,~ murmurs ", (the) self, " scratching his chin, ~there is the problem with the sunlight. And of course, I've wanted to do something about this rock for ages.~"; 'bear', 'bears': print_ret (The) self, " shrugs. ~It lives in a cave somewhere on the mountain. Keeps out interlopers. Well, most of them, anyway,~ he adds, glancing at you meaningfully."; 'interlop': "~Kept to a minimum, thanks to the bear,~ he says, nodding. ~Leaves me in peace and quiet.~"; 'me', 'myself', 'you', 'yourself': print_ret (The) self, " glances you over, then shrugs. ~You seem pleasant enough to me.~"; 'wisdom': "~Wisdom? I'll tell you one thing I've learned, sitting on top of a mountain isn't the way to get any. Wisdom, that is,~ he adds hastily."; 'parsley', 'sage', 'rosemary', 'thyme', 'cooking': "~I haven't done any cooking in ages,~ murmurs ", (the) self, ", ~but when I did, I always used parsley, sage, rosemary or thyme.~"; 'peace', 'quiet': "~It's very peaceful and quiet up here,~ agrees ", (the) self, ". ~Well, most of the time anyway,~ he adds, glancing at you meaningfully."; 'pair', 'welding', 'goggle', 'goggles', 'glasses': if (Goggles in self) "~They're perfect,~ says ", (the) self, " gazing around the mountaintop contentedly."; "~A pair of welding goggles or some dark glasses would be great for blocking out the sunlight,~ agrees ", (the) self, " morosely. ~Unfortunately, I haven't got any.~"; 'hermes', 'trismegis', 'trimegist': if (Goggles in self) "~Trimegistus? Well, he was really just an aspect of the god Hermes. Most hermits believe that there was an early alchemist who took the same name, who came up with the hermetic seal and the whole living on a mountaintop idea.~"; print_ret (The) self, " scowls at you. ~You want to know, you take the course and become a hermit yourself. I had to.~"; 'hermetick', 'alchemy', 'wishful', 'thinking', 'lead', 'gold': "~Hermeticks is what we call the study of chemicals and the like,~ says ", (the) self, ". ~I think they call it that because Hermes Trimegistus was supposedly the first one who did it. It's really just an outgrowth of alchemy, but with more scientific observation behind it, instead of wishful thinking about turning lead into gold.~"; 'leporoman', 'rabbit', 'rabbits', 'coney', 'conies', 'bunny', 'bunnies', 'entrails': "~You bring me a rabbit, I'll not only show you some serious leporomancy,~ promises ", (the) self, ", ~but I'll show you how to make a fine rabbit stew into the bargain.~ He smacks his lips together enthusiastically."; 'emily', 'short': "~Ah,~ nods ", (the) self, ", ~there's a lady who really knows her cheeses. She's the type that would condemn tyromancy on the grounds that it's a waste of good cheese.~"; 'zarf', 'andrew': "~Everyone thinks he's great,~ scowls ", (the) self, ". ~To make it worse, I think he probably ", (i) "is", "~ he adds, looking annoyed."; 'turthalio', 'michael': "~Don't know much about his work,~ shrugs ", (the) self, ". ~I think I'll reserve judgement until I see a bit more of what he can do.~"; 'blumph', 'port': print_ret (The) self, " shrugs. ~I spent some time in Blumph during my youth. It's a little better than Vechlee, if only because you can hop on a ship and get the heck out of there.~"; 'ship', 'hop', 'hopping': print_ret (The) self, " looks a bit sheepish. ~Well, I haven't ever actually taken one myself, but I hear they go all over.~"; 'vechlee', 'city', 'better': "~Vechlee's a dump,~ mutters ", (the) self, ". ~It's much better up here.~"; 'thalion', 'country', 'land': "~I've spent all my life in either Blumph or Vechlee,~ says ", (the) self, ", ~so I can't tell you much about the rest of the country. Probably much the same.~"; 'mountaint', 'here', 'sweet': "~Yup,~ murmurs ", (the) self, ", looking around contentedly, ~it's pretty sweet up here.~"; 'tyromancy', 'cheese': "~Mmm, cheese...~ murmurs ", (the) self, ". ~Imagine wasting perfectly good cheese on divination! Tyromancy. Hah!~"; 'oneiroman': "~That's my favourite,~ says ", (the) self, ", ~divination through dreams. It doesn't work, of course, but it gives me an excuse to nod off.~"; 'necromanc': "~That's dead people, isn't it?~ asks ", (the) self, ". ~Hah! I get annoyed enough dealing with the living!~"; 'divining', 'divinatio': "~Don't do a lot of it myself,~ says ", (the) self, ", ~except for oneiromancy, of course. And a bit of leporomancy now and then. Heh!~"; 'ghost', 'writers': print_ret (The) self, " shrugs. ~Just something I heard,~ he mutters."; 'will', 'william', 'shakespea': "~Oh, he was a playwright who lived a couple of hundred years ago. Had a bunch of plays that he claimed to have written, though I think he farmed out a couple of the poorer ones to ghost writers.~"; 'philosoph': print_ret (The) self, " raises a hand in the air dramatically.^ ^~Adversity's sweet milk, philosophy, to comfort thee, though thou art banish@`ed,~ he declares.^ ^~A chap called Will Shakespeare wrote that, you know,~ he adds prosaically."; 'hermit', 'himself', 'hermits', 'abandoned', 'stall', 'yellowed', 'piece', 'paper', 'him', 'robert', 'rob', 'bob', 'bobby', 'robby': "He scowls. ~I abandoned my stall and came up here to get away from interfering questions like that.~"; 'bowl', 'scrying': "~What do I look like, a cheese shop?~ asks ", (the) self, ". ~Find your own fuel for your precious scrying bowl.~"; 'wizard', 'wizards', 'wizard^s', 'plumber', 'plumbers', 'plumber^s', 'guild', 'guilds', 'apprentic', 'meddling': "~Hah!~ barks ", (the) self, ". ~Wizards, plumbers, guilds: don't talk to me about them, they're one of the things I'm avoiding up here. Not to mention apprentices,~ he adds."; 'Ninario', 'nin', 'ninny', 'magic', 'bunny', 'bunnies', 'rabbit', 'rabbits': if (self.Topics & FLAG_x2 == FLAG_x2) "~Can't really say much else about him, I'm afraid,~ says ", (the) self, (string)period; self.Topics = self.Topics | FLAG_x2; "~Ah, that one...~ says ", (the) self, ". ~He's a little different than the rest, I grant you. He won't have anything to do with the Wizards Guild, which is commendable.~"; 'renaldo': if (self.Topics & FLAG_x3 == FLAG_x3) print (The) self, " flashes a look at you. ~Wasn't I specific enough? Well, allow me to repeat that "; else print (The) self, " spits on the ground. ~"; self.Topics = self.Topics | FLAG_x3; "Renaldo is a cheap parlour magician who wouldn't know real magic if it arrived at his door neatly wrapped in a brown-paper parcel marked ", (i) "Warning: Real Magic Enclosed", ", then blew up in his face when he opened it, and was subsequently followed up with a letter from the Thalion National Board of Magic inquiring as to how much he enjoyed his magic parcel.~ ", (The) self, " spits again. ~I hate his festering stinking guts,~ he clarifies."; 'lean', 'lean-to', 'leanto': if (self.Topics & FLAG_x4 == FLAG_x4) "~There isn't much else to say about it,~ says ", (the) self, ". ~It's not very good.~"; self.Topics = self.Topics | FLAG_x4; print_ret (The) self, " glances at the lean-to and shrugs. ~It's not terribly good. I made it myself to block out the sun, but it ends up being even hotter in there than out here. So I sacrifice my eyes for the sake of being nice and cool. I use the lean-to of a night, though. It gets pretty chilly up here.~"; 'hermetic', 'magical', 'seal', 'seals': "~Oh no,~ declares ", (the) self, ". ~The secrets of hermetic seals are for hermits only. The union would be all over me if I let anything slip.~"; 'course', 'training', 'train', 'becoming', 'become', 'years', 'careful', 'practice', 'practise': "~Of course there's training required to become a hermit,~ snaps ", (the) self, ". ~You think all this societal angst just breeds itself? There's years of careful practice to it, you know.~"; 'union', 'unions': "~Of course we've got a union,~ snaps ", (the) self, ". ~You think these cozy mountain retreats just hand themselves out? Someone's got to coordinate all these mountaintops or we'd have all kinds of hermetic overlap.~"; 'overlap', 'three', 'league', 'radius': "~No two hermits can reside within a three league radius of each other,~ declares ", (the) self, ". ~Really cuts down on gang wars too,~ he adds."; 'gang', 'wars': "~Oh, it used to be terrible, years ago. The hermetic wars, they called them. Tough gangs of sinewy old men used to roam through these lonely mountaintops, seeking to annihilate other gangs of touch sinewy old men.~ He falls silent, shaking his head."; 'tough', 'sinewy', 'old', 'men': "~It comes with the lifestyle,~ says ", (the) self, " modestly, displaying an arm that is indeed tough and sinewy."; 'rock', 'stone', 'seat', 'perch', 'frilly', 'lace', 'pillow': if (Pillow in self) "~It's much more comfortable now, thanks,~ he says."; if (self.Topics & FLAG_x5 == FLAG_x5) "~It hasn't gotten any more comfortable if that's what you mean,~ he says a little sharply."; self.Topics = self.Topics | FLAG_x5; print_ret (The) self, " glances at the rock underneath him. ~It's not the most comfortable of seats, but it's all I've got,~ he says."; 'science', 'renting', 'rent', 'erroneous', 'extremities': "~I needed the money,~ scowls ", (the) self, ". ~You see how enslaved I was by the system? Hah!~"; default: "~Could you repeat that?~ asks ", (the) self, ". ~My ears aren't what they used to be. In fact,~ he continues, looking at his hands, ~these are pretty different than I remember them.~ He glances at his body, frowning. ~To be honest,~ he admits, ~I don't recognise ", (i) "most", " of these bits.~ He looks himself over carefully. ~Must have been those years when I was renting myself out to science. I seem to have come away with a lot of erroneous extremities.~"; } Give: <>; Show: if (noun ofclass Purse && child(noun) ~= 0) { if (noun hasnt open) { give noun open; print "(opening ", (the) noun, " first)^"; } obj = child(noun); <>; } if (noun ofclass Cheese) { print (The) self; if (noun == Camembert) " shakes his head. ~That's a little runnier than I like it.~"; " sniffs at ", (the) noun, " ~Mmmm! That smells like a nice cheese. Best hang on to that one, youngster.~"; } if (noun ofclass Substance) "~Hah!~ laughs ", (the) Hermit, ". ~So you know a little something about hermeticks! Well, that's good to see. I'm a bit of an enthusiast myself. I've got a magical seal you wouldn't believe.~"; switch(noun) { Herm_Notice: "~Yup,~ nods the hermit. ~That was my stall.~"; Scrying_Bowl: <>; Goggles: move Goggles to self; if (Pillow notin self) { Achieved(24); } print_ret (The) self, " snatches the goggles from your hands and claps them to his eyes, hands shaking. He slips the strap over his head and gazes around the mountaintop. ~These are perfect!~ he murmurs appreciatively. ~Just what I needed.~ He gazes up at you, his eyes now able to open fully. ~Thanks, youngster. You've done me a favour that I won't soon forget.~"; Pillow: if (Stuffing notin Pillow) "The hermit glances at the pillow. ~No thanks. I don't think that would help me be more comfortable unless it had some stuffing in it.~"; if (Goggles notin self) { Achieved(25); } move Pillow to self; print_ret (The) self, " takes ", (the) Pillow, " from you gingerly and turns it over in his hands. ~That's really soft,~ he murmurs. He stands up for a moment and places the pillow on the rock, and then starts to lower himself gently, reverently, onto it. He pauses and looks up at you. ~Of course, I've eschewed society and all its comforts, but you'd expect nature to have equipped this mountain with ", (i) "one", " comfortable rock.~ So saying, he sinks slowly onto the pillow, and a grin spreads across his face. ~Oh, that's nice.~"; Stone_Bottle: if (Stone_Bottle.sealed == false) "~If you want it sealed again, too bad. I demonstrated how to ", (i) "unseal", " it. Resealing is left as an exercise. You're a student aren't you? Do some studying, or get that no-good wizard master of yours--you must have one, I'm sure--to show you something useful for a change.~"; if (Goggles in self || Pillow in self) { Achieved(26); Stone_Bottle.sealed = false; "~Well, I suppose it's only fair. You did me a good turn, so I should do you one.~ He takes the proferred bottle, and gives the neck a quick deft twist. ~There you are, youngster. One good turn, I believe. Perhaps now I can get back to some serious solitude.~^ ^He hands the bottle back to you, and you glance at it. The bottle is still safely closed, but the hermit has broken the seal for you."; } "~Ah!~ cries ", (the) self, " gazing at ", (the) noun, ". ~What you've got yourself here is a level nine certified Implementor-grade hermetic seal. A real nice one, too; I'm a bit of an expert in the area of hermeticks. I'll tell you, a non-hermit like you is going to have a fun time trying to open ", (i) "that", ". Good luck.~"; Coin_5, Coin_10: "~Hah!~ cries ", (the) self, " triumphantly. ~I'm free of society and its economic chains!~"; Red_Carpet: "~That's a hideous carpet,~ mutters ", (the) self, ". ~If I'd had a carpet like that, I'd have fled society ", (i) "years", " earlier.~"; default: print_ret (The) self, " squints at ", (the) noun, ". ~No,~ he says, shaking his head. ~Can't say as I have any interest in anything like that at all.~"; } Tell: if (second == 'me' or 'myself' or 'you' or 'yourself') print_ret (The) self, " looks up at you and shrugs. ~Human interest stories usually don't interest me.~"; if (second == 'Ninario' or 'nin' or 'ninny') print_ret (The) self, " shakes his head. ~Right there, that's why you don't get yourself involved with the Wizards Guild.~"; print_ret (The) self, " looks defensive. ~You can't tell me anything about that I don't already know.~"; ], orders [; if (Stone_Bottle.sealed == false) "The hermit shakes his head up at you, eyes obscured behind the dark goggles. ~You're a pleasant enough person, but you've got what you want and I've got what I want. Let's call it even, and you can leave me to my solitude.~"; Give: if (noun == Goggles) { "~Oh no you don't,~ squeals ", (the) self, ". ~You gave them over fair and square. They're mine now!~"; } Meet,MeetNPC: <>; Open: if (noun == Stone_Bottle) { if (Goggles in self || Pillow in self) "~Well, it's against my principles to consort with society, but one good turn deserves another. Give it here.~"; "~Hah!~ cries ", (the) self, ". ~And just what have ", (i) "you", " done for ", (i) "me", " lately? Open it yourself.~"; } default: "~I came up here to get away from precisely this sort of pestering,~ mutters ", (the) self, (string)period; ], has animate male transparent; Object -> Herm_Props with parse_name [i; while (true) { switch(NextWord()) { 'lean', 'lean-to', 'leanto', 'sticks', 'branches', 'animal', 'hides': self.item_num = 1; i++; 'rock', 'seat', 'rocky', 'perch', 'stone', 'stony': self.item_num = 2; i++; 'strong', 'whistling', 'whistles', 'whipping', 'whips', 'wind', 'scream', 'sound': self.item_num = 3; i++; default: return i; } } ], short_name [; switch(self.item_num) { 1: print "lean-to"; 2: print "rock"; 3: print "wind"; } rtrue; ], description [; if (self.item_num == 1) "The lean-to is constructed of old sticks and branches and covered with thinly-stretched animal hides. It certainly doesn't look as though it provides a lot of shelter."; else if (self.item_num == 2) { print "The hermit perches on a small uncomfortable looking rock."; if (Pillow in Hermit) print " Fortunately, ", (a) Pillow, " sits between the hermit and the rock, presumably rendering the rock more comfortable."; new_line; rtrue; } else "The wind is extremely strong up here on the mountaintop."; ], item_num 1, FakeObj, before [; if (self.item_num == 3 && action ~= ##Examine or ##Listen or ##Smell or ##Touch) "It's just the wind. Don't worry about it."; Attack: if (self.item_num == 2) <>; "You kick idly at ", (the) self, ". ~Hey!~ says ", (the) Hermit, " angrily. ~That's my home!~"; Enter: if (self.item_num == 2) print_ret (The) Hermit, " pushes you away. ~There isn't enough room for you on here!~"; "You step into the lean-to, but it's even hotter in there than on the mountaintop, so you step back out again.^ ^~Hey!~ calls the hermit. ~Stay out of there, that's my home, you know.~"; Examine: rfalse; Listen: if (self.item_num == 3) "The wind whistles past your ears, a thin scream of sound."; Smell: if (self.item_num == 3) "The wind smells of fresh mountain air."; Take,Pull,Push,PushDir,Transfer: if (self.item_num == 2) print_ret (The) Hermit, " grips the rock with both hands. ~Hey, you meddlesome so-and-so! I'm sitting on here. Stop that!~"; "It looks so flimsy you decide against it. ", (The) Hermit, " might not appreciate it."; Touch: if (self.item_num == 3) <>; default: "You don't have to worry about doing that to ", (the) self, (string)period; ], has scenery; !============================================================================== ! The player's possessions Object notebook "exercise book" with parse_name [wd num; wd = NextWord(); while (wd == 'note' or 'exercise' or 'book' or 'notebook' or 'notes' or 'chem' or 'chemistry' or 'hermetick' or 'hermetic' or 'phil' or 'philosoph' or 'celt' or 'celtic' or 'teutonic' or 'today^s') { if (wd == 'notes') self.Noteword = true; else self.Noteword = false; if (wd == 'phil' or 'philosoph') self.notes = 0; if (wd == 'chem' or 'chemistry' or 'hermetick' or 'hermetic') self.notes = 1; if (wd == 'celt' or 'celtic' or 'teutonic' or 'today^s' or 'today') self.notes = 2; num++; wd = NextWord(); } return num; ], description "An ordinary exercise book. You use it occasionally to take notes during lectures. More often, you use it for sketching during lectures. It's filled with the notes you've made during your first few days of the new term.", notes 0, Noteword false, Celt_Notes 0, before [; Attack: "You decide against it. Knowing your luck, the moment you ripped up the notebook, you'd have need of the notes."; Drop: if (location == Lecture_Hall) "But... your notes, your sketches!"; Examine: if (self.Noteword == true) { self.Noteword = false; <>; } PutOn: if (second == self) rfalse; if (location == Lecture_Hall) "You decide to hold on to the exercise book, so that you can at least pretend you're taking notes."; Open: "The exercise book folds over easily, so you've already got it flipped open to a new blank page."; Close: "It doesn't take up any less space with the cover shut, so you leave it flipped open to a new blank page."; Read,Search: if (self notin player) { print "(taking ", (the) self, " first)^"; ; } self.notes++; if (self.notes > 3) { print "(flipping back to the front of the exercise book)^"; self.notes = 1; } else print "You flip to some of your class notes.^"; font off; switch(self.notes) { 1: print "^ PHIL NOTES^ ^Historically flds of alchemy, phil., astron., etc. very closely tied. Ancient phils studied all areas.^ Many accts of early phils shrouded in myth / folklore, e.g. Hermes Trismegistus, Egypt. fndr of alchemy (perhaps), more figure myth than reality. Said to have invented 'magic seal'. Word hermetic -> root of mdn word / concept of hermits, hermits blvd to have magic powers^ Greeks: heavy believers in divining, oracular concepts^ Greek root -mancy meaning diviner, prophet^ e.g. oneiromancy: divination (oneiro - ??)^ necromancy: conjuring spirits of dead spec. for divination (necro - dead)^ tyromancy: using coagulating cheese for divination (!) (tyro - cheese)"; 2: print "^ CHEM NOTES^ Chem. intro: used to be called 'hermetick', poss after Hermes Trismegistus (talked about this chap in Phil didn't we?).^ Chem most pwrful of sciences (accdng to prof, nat.)^ All substances in world can be reduced to chem. combin. of raw cmpds^ Many cmplx. cmpds must be mixed with mortar and pestle to really drive grains together. Sometimes mechanical device is even used to mix properly^ Some examples of cmpds:^ 2KNO3 + 3C + S -> K2S + 3CO2 + N2^ (right-hand side: gunpowder?! And nov 5 coming up!)^ (saltpetre old name for potassium nitrate)^ C3H5(OH)3 + 3HNO3 -> C3H5(NO3)3 + 3H2O^ nitroglycerin: one lb produces 156 cu ft of gas, shock wave moves 25,000 ft/sec^ (this lecturer is seriously off her head... one dangerous lady!)^ NaOH + HCl -> NaCl + H2O^ (sod. hydroxide + hydrochloric acid gives salt and water?)^ H2CO3(aq) -> H2O + CO2(gas)^ Carbonic acid (e.g. fizzy drinks)^ 2Mg + O2 -> 2MgO^ (magnesium oxide: any metal + oxygen in syn. reaction yields metal oxide)^ this course might prove interesting..."; 3: print "^CELT NOTES^"; if (self has general) { print "^Settling instincts, early German nomad tribes^ Teutons shifted: nomads -> village-dwellers"; if (self.Celt_Notes > 5) print "^Built huts resembling Celtic crosses (at least when right bits fell down)"; if (self.Celt_Notes > 8) print "^Some shameless self-aggrandisation by prof... ^Very boring course!"; } else { font on; if (location == Lecture_Hall) { print "^You haven't taken any notes yet during today's lecture."; } else { print "^There are no notes in this section as today was the first lecture, and you didn't take any notes in the brief time you were in the lecture hall."; } } } font on; new_line; rtrue; Take: if (self in player) { if (location == Lecture_Hall) { if (self has general) "You're already taking notes!"; give self general; "You start taking notes."; } "You managed to escape the lecture. You don't have to worry about taking any notes now."; } rfalse; Touch: "It feels like an ordinary exercise book."; ], has readable; Object Rasp_Satchel with name 'shiny' 'red' 'raspberry' 'yogurt' 'satchel' 'foil' 'lid' 'sack' 'rucksack' 'bag' 'haversack' 'backpack' 'pack' 'strap', description [; print "A very fetching ", (name)self, ". It has a rather odd foil lid that can be pulled over the opening to close it, and a strong sturdy strap for slinging over one's shoulder."; if (self hasnt general) print " You have the strange idea that you've seen this satchel, or something very like it, before."; new_line; rtrue; ], initial [; "Somewhat incongruously, a shiny red satchel sits on the floor here."; ], short_name [; if (self has general) print "raspberry satchel"; else print "shiny red satchel"; rtrue; ], before [obj i; Smell: give self general; "The interior smells very strongly of raspberries."; Receive: if (noun has supporter) { for (i = 0: i < children(noun): i++) { obj = child(noun); if (obj ~= Butter or Arktos) { move obj to self; print "(", (the) obj, " falling off into ", (the) self, " as you do so)^"; } } } if (noun ofclass Substance) { "If you drop ", (the) noun, " into the satchel, ", (itorthey) noun, " will get everywhere and you'll have an extremely difficult time getting ", (itorthem)noun, " all out again."; } Taste,Lick: give self general; "Ah, the tantalising flavour of raspberry yogurt."; Touch: "The surface has a strange stippled texture."; ], after [; Close: "You pull the silvery foil lid over the satchel."; Disrobe: "You remove ", (the) self, " from your shoulder."; Open: print "You peel back the silvery foil lid"; if (child(self) == 0) ". The satchel is empty."; print ", revealing "; WriteListFrom(child(self), ENGLISH_BIT); print_ret (string)period; Receive: if (noun ofclass Jug) { if (noun.current ~= 0) "The magical properties of the satchel prove themselves again, keeping the water from spilling out of ", (the) noun, " as you place it inside", (string)period; rfalse; } if (noun == Cannonball) { StopTimer(Cannonball); "You manage to hold the satchel open wide enough that you can squeeze the cannonball in. Amazingly, the satchel does not seem to get any bulkier or heavier."; } if (noun == Branch) { "Astoundingly, the three foot long branch slides all the way into the satchel."; } rfalse; Wear: "You sling ", (the) self, " over your shoulder."; ], invent [; ! When listing objects in player's inventory if (c_style & FULLINV_BIT) rfalse; ! When listing objects in room description if (inventory_stage == 1) switch(children(self)) { 0: print "an empty ", (name)self; 1: print (a)self, " containing ", (a) child(self); default: print (a) self, " containing an assortment of objects"; } rtrue; ], has container open openable clothing; Object school_clothes "your clothes" with name 'trousers' 'pants' 'pressed' 'shirt' 'dressy' 'clothes' 'clothing', description "Ordinary semi-casual student clothes, pressed shirt, dressy trousers.", before [; Disrobe,Transfer: "Let's leave everybody's clothes where they belong."; Touch: "The trousers are soft cotton, the shirt a smooth, comfortable cotton blend."; ], has clothing proper pluralname; Object Symbols "strange mystic symbols" with name 'strange' 'mystic' 'symbols' 'nin^s' 'ninny^s' 'ninario^s' 'his' 'robes' 'rabbits' 'bunnies' 'pyjamas' 'pajamas', description "As you peer at them more closely, you see that Ninario's robes are, in fact, covered with strange mystic depictions of extremely adorable cute little rabbits in pyjamas.", before [; Examine: rfalse; default: "Ninario draws his robes protectively around himself. ~Please!~ he says in a shocked voice. ~A wizard's robes are his own private kingdom.~"; ], has scenery pluralname; Object magic_clothes "your clothes" with name 'long' 'flowing' 'robe' 'robes' 'clothes' 'clothing' 'arm' 'arms' 'legs', description [; print "Perfectly ordinary student clothes cover your body, assuming that long flowing robes are ordinary in this strange and mystical land. It seems appropriate."; if (Butter has worn && Arktos has worn) print " They have a rather unpleasant mix of butter and arktos essence smeared all over them."; else if (Butter has worn) print " There is butter smeared all over them."; else if (Arktos has worn) print " There is arktos essence smeared all over them."; if (Sewer_Vat.reach_in == true) print " One arm is covered in sewage following your explorations in the vat."; new_line; rtrue; ], before [; Disrobe,Transfer: "Let's leave everybody's clothes where they belong."; Rub: if (Sewer_Vat.reach_in == false) { print "Your clothes are perfectly clean."; if (Butter has worn) " A trifle buttery, perhaps, but you might not want to wash that off yet."; new_line; rtrue; } else if (Fountain_Water in location) { Sewer_Vat.reach_in = false; print "You dip the filthy arm of your robe into the fountain and give it a good rinsing"; if (Butter has worn) ", being careful not to wash away the butter."; print_ret (string) period; } "You're not sure of the best way to clean the robe."; Touch: "They're silky and cool to the touch."; ], has clothing proper pluralname; Object Rift "rift" with name 'rift', FakeObj, before [; Close: "You think back carefully through all your years of education and conclude you've been taught nothing on the subject of closing interdimensional rifts in the fabric of reality. You sigh."; Open: "The rift in the fabric of reality is already open. Thence spring all the difficulties."; default: "The rift that Ninario mentioned exists in the fabric of reality; it isn't just lying around!"; ], has open openable; Object HelpObj "help" with name 'help', FakeObj, before [; Give: "You'll have to find some way to do that."; default: <>; ]; Object Sky with name 'sky' 'clouds' 'sun' 'ceiling' 'roof' 'air', short_name [; if (location ofclass Outroom) print "sky"; else print "ceiling"; rtrue; ], description [; if (location == Bailey) <>; if (location ofclass Outroom) "The sun beats warmly down from the deep brilliant blue canopy overhead. There is not a cloud in sight."; else "The ceiling lies high overhead."; ], FakeObj, before [; Enter: if (location == Bailey) <>; if (location ofclass Outroom) "You leap briefly into the air and then fall back to earth."; else <>; Examine: rfalse; default: if (location ofclass Outroom) "The sky lies high overhead, the brilliant blue canopy of high summer."; else if (location == Bailey) "The murder holes are high overhead."; "The ceiling lies high overhead."; ]; !============================================================================== ! Entry point routines [ Initialise; #ifdef DEBUG; pname_verify(); #endif; location = lecture_seat; notify_mode = false; lookmode = 2; notify_mode = 1; move Gas to Sewer; thedark.description = "It is pitch black. This is madness! You have no concept of the dangers that lurk in the darkness of this strange and magical world."; move notebook to player; move school_clothes to player; give school_clothes worn; print "^^You've heard about them from others. You've even had them yourself: classes that seem to last forever. But this one takes the biscuit. You wonder what possessed you to sign up for ", (i) "Celtic Elements in Early Teutonic Settlements", ": a field of study so narrow and boring, you'd wonder they would award doctorates in it. But they must, for the chap running the lecture has one.^^ You glance down at the notebook in your hands, but the thought of recording all this boredom for posterity doesn't thrill you. Instead, you look around the hall, wondering if you could sneak out and find something better to do with your time.^^"; Banner(); print (string)LICENSE; return 2; ]; [ AimAtSub; if (second == nothing) { if (TestScope(Cannon)) <>; else "You'll need something to aim before you can aim at ", (the) noun, (string)period; } if (noun == Cannon) { if (second == Cannon) "You can't aim ", (the)second, " at itself!"; <>; } "You can't aim that at something."; ]; [ AimNothingSub; if (noun == Cannon) "You'll have to specify something to aim it at."; "You can't aim that at something."; ]; [ Amusing; if (deadflag ~= 2 or 5) "You must win the game before selecting this option."; give Amusement_in_Main general; Amusement_in_Main.description(); ]; [ BargainSub; if (noun == nothing) { if (Prof in location) <>; if (Crone in location) <>; if (Hermit in location) <>; if (Guard in location) <>; if (Ninario in location) <>; if (Shopkeeper in location) <>; if (people in location) <>; } "You make a few swift resolutions with yourself, and feel better about things."; ]; ! Code to exclude scenery objects from 'all' ! and include objects on supporters (but not in containers) ! from DM4 p. 239 and Neil Cerutti [ ChooseObjects obj code; if (obj == 0) return 0; ! if parser wants to exclude this obj from all if (code == 0) { if (obj notin player && action_to_be == ##Drop or ##Insert) return 2; ! exclude it if (parent(obj) && (parent(obj) has supporter) && obj hasnt concealed && obj hasnt scenery) return 1; if (parent(obj) && (parent(obj) has container && player in parent(obj)) && obj hasnt concealed && obj hasnt scenery) return 1; } ! else if parser wants to include this obj in all else if (code == 1) { if (obj has scenery or static or animate) return 2; ! force exclusion of obj from all } else ! code must be 2 ; return 0; ]; [ CheeseVision vision attempts state; vision = random(15); while (attempts < 20) { switch(vision) { 1: if (vis_flag & FLAG_x1 ~= FLAG_x1) { vis_flag = vis_flag | FLAG_x1; print (b) "Sorcery Supply^"; Sorcery_Supply.description(); "^A sudden gleam comes into the old crone's eyes. ~Cheese, my dear student, that's the true secret to divination. Cheese!~ She falls silent, an odd but pensive smile on her face."; } 2: if (vis_flag & FLAG_x2 ~= FLAG_x2) { vis_flag = vis_flag | FLAG_x2; print_ret (b) "Council Chamber^", "Ornately decorated in the manner of someone asserting their power and authority, the council chamber seems designed to intimidate and overwhelm. On a chair at the south end of the room sits the grim and stern-looking Renaldo. He is cocking his head to one side as though listening to something.^ ^~Virgil!~ he barks, ~I can still hear that hissing! Those sewer pipes are ", (i) "still", " venting methane into this room! Get down there and fix it at once please!~"; } 3: if (vis_flag & FLAG_x3 ~= FLAG_x3) { vis_flag = vis_flag | FLAG_x3; print (b) "Outskirts^"; Outskirts.description(); "^~Aye,~ says Ned excitedly as you offer him the hand drill. ~Ah could sell tha' for a reet bit o' brass and the weyfe an' bairns an' ma could git summat t' eat, leyke.~ He rubs his broad chin pensively. ~'Course, on t'other hond, if ah gave 'at ti ploomber's union, they mud let ma in.~ He reaches towards the drill, and then stops.^ ^~Diz-ta reely want ti gi' ma that?~ he asks doubtfully. ~Ah's nivver deean nowt for tha.~^ ^When you offer the drill again, he accepts it eagerly. ~Weel, that's reet good o' tha. Ah'll tell tha, if there's owt ah can effther deea for tha, ah's thah chap. Ah'll nut forget tha.~^ ^He shakes your hand firmly and wholeheartedly and then charges off, a happy man."; } 4: if (vis_flag & FLAG_x4 ~= FLAG_x4) { vis_flag = vis_flag | FLAG_x4; print (b) "Garden^"; Farm_Garden.description(); "^A pair of large and ferocious dogs wandering in the garden jump in surprise as you come plummeting down at breakneck speed.^ ^The dogs take one look at you and charge, growling and snarling evilly, their sharp teeth bared.^ ^You seem powerless to move in this strange dreamlike vision.^ ^The dogs continue charging, covering an alarming amount of distance in a short space of time. You can see their gleaming white teeth and their sharp and dangerous claws. They are almost upon you!^ ^You struggle vainly to move, but the power of the vision has you locked, unmoving.^ ^The dogs leap on you and you are powerless to fend off their ferocious attack. Snarling and slavering they tear at your flesh mercilessly. You struggle for a short time, but your strength fades as their attack continues undaunted. You fall beneath their onslaught, leaving them free to continue their grisly meal uninterrupted."; } 5: if (vis_flag & FLAG_x5 ~= FLAG_x5) { vis_flag = vis_flag | FLAG_x5; print (b) "Tower^"; Tower.description(); "^From somewhere within the building, you hear a bell ringing loudly, and the tramping of feet marching in step.^ ^Ninario is here, glancing around nervously.^ ^~This might be the perfect place to launch that carpet from,~ muses Ninario.^ ^You get on the threadbare red carpet. The edges flutter weakly and then the carpet seems to give up.^ ^~It doesn't seem to work,~ says Ninario. ~That's not good. Mm-yes. No. Perhaps you shouldn't have taken that ride down the mountainside that you mentioned.~"; } 6: if (vis_flag & FLAG_x6 ~= FLAG_x6) { vis_flag = vis_flag | FLAG_x6; print (b) "The Very Top of the Tree^"; Top_Tree.description(); "^The tree dips and sways alarmingly. You're probably just about the maximum weight these flimsy branches can take and still remain standing.^ ^The weight of the cannonball in your hands sets the branches to dipping and swaying madly. The gyrations increase and the top of the tree bends down, down towards the fence, gathering speed as it does so. It reaches the bottom moving at an alarming clip. But the tree is just a bit too short, and your head connects soundly with the top of the fence. Fortunately, the helmet protects you, and you rebound off and over the fence, landing heavily in the yard.^ ^The heavy cannonball thumps to the ground beside you."; } 7: if (vis_flag & FLAG_x7 ~= FLAG_x7) { vis_flag = vis_flag | FLAG_x7; print (b) "End of the Lane^"; End_Lane.description(); "^A slender elm tree stands on the south side of the path. A couple of low branches beckon tantalisingly.^ ^A small savage-looking hawk rests in the upper branches of the tree.^ ^You spread some of the wood hastener on the slender elm tree. There is a grinding crackling noise from the tree and it suddenly bursts forth in a tremendous growth spurt as its growth is hastened.^ ^There is a tremendous flapping of surprise from the hawk, following by a squawk of pleasure as it settles back down in its drastically altered home."; } 8: if (vis_flag & FLAG_x8 ~= FLAG_x8) { vis_flag = vis_flag | FLAG_x8; print (b) "Hall^"; state = First_Floor_Hall.exploded; First_Floor_Hall.exploded = true; First_Floor_Hall.description(); First_Floor_Hall.exploded = state; print_ret "^~What a shambles!~ says Ninario, gazing around the hall. ~Did you do that?~ he asks indicating the clouds of dust billowing into the room from the south. He rubs his hands together with glee. ~Well done! You've certainly got a future in wizardry ", (i) "or", " science, my dear student! Mm-yes.~"; } 9: if (vis_flag & FLAG_x9 ~= FLAG_x9) { vis_flag = vis_flag | FLAG_x9; print (b) "On the Mountaintop^"; Top_Mountain.description(); "^~Why was I made to suffer so?~ wails ", (the) Hermit, " suddenly. ~I came up here with every good intention of getting away from society and having time to contemplate, but all I can think about is the burning pain in my eyes. If only I could find a way to shield my eyes from all this sunlight!~"; } 10: if (vis_flag & FLAG_x10 ~= FLAG_x10) { vis_flag = vis_flag | FLAG_x10; print_ret (b) "West of House^ You are standing in an open field west of a white house, with a boarded front door.^ ^There is a small mailbox here."; } 11: if (vis_flag & FLAG_x11 ~= FLAG_x11) { vis_flag = vis_flag | FLAG_x11; print (b) "Eliza's Cheese Emporium^"; Cheese_Shop.description(); "^Eliza hums to herself as she puts the finishing touches on a wheel of Camembert.^ ^Suddenly, the door bursts open and soldiers wearing the golden wand insignia of the Wizards Guild charge into the shop. The lead one steps forward.^ ^~Eliza Stilton, I hereby apprehend you on the charge of using scientific methods of preservation in the production of your cheeses. As decreed by the Wizards Guild, such practices are duly deemed a seditious and destabilising influence on the world of magic. Now, come along with us to the Guild Hall for processing, if you please.~^ ^~No, you can't!~ protests Eliza futilely. ~All I did was keep the cheese in a cool room so it lasted longer, you can't arrest me for that, you can't!~^ ^Ignoring the cheesewright's pleas, the soldiers grab her and frogmarch her out the door, leaving the shop empty and abandoned.^ ^From outside the shop, comes the sound of hammering as a sign is wedged into the cobblestones."; } 12: if (vis_flag & FLAG_x12 ~= FLAG_x12) { vis_flag = vis_flag | FLAG_x12; print_ret (b) "Endless Stair^", "You are at the bottom of a seemingly endless stair, winding its way upward beyond your vision. An eerie light, coming from all around you, casts strange shadows on the walls. To the south is a dark and winding trail.^ ^Your old friend, the brass lantern, is at your feet."; } 13: if (vis_flag & FLAG_x13 ~= FLAG_x13) { vis_flag = vis_flag | FLAG_x13; print_ret (b) "Darkness^", "It is pitch black. This is madness! You have no concept of the dangers that lurk in the darkness of this strange and magical world."; } 14: if (vis_flag & FLAG_x14 ~= FLAG_x14) { vis_flag = vis_flag | FLAG_x14; print (b) "Cell^"; Cell.description(); "^Ninario glances at the small opening to the toilet distastefully. ~After you, I'm sure, my dear student. Mm-yes.~"; } 15: if (vis_flag & FLAG_x15 ~= FLAG_x15) { vis_flag = vis_flag | FLAG_x15; print_ret (b) "Inside the Barrow^", "You are inside an ancient barrow hidden deep within a dark forest. The barrow opens into a narrow tunnel at its southern end. You can see a faint glow at the far end.^ ^A strangely familiar brass lantern is lying on the ground. ^^A sword of Elvish workmanship is on the ground."; } } vision = random(15); attempts++; } print_ret (b) "Darkness^ It is pitch black. This is madness! You have no concept of the dangers that lurk in the darkness of this strange and magical world."; ]; [ DarkToDark; if (random(2) == 1) { deadflag = 6; "^As you step forward tentatively in the darkness, you stumble into a Portal of Gating that some luckless adventurer dropped in the dark. Screaming, wailing in terror, you are wrenched through and deposited in a far-off corner of this magical land. For reasons beyond your ken, the spell deposits you at Egbert's Farm, in the bedroom of their stunningly attractive (and stunningly chaste) only child. The child, surprisingly well-developed for a spry young thing of eighteen, loves students and begins eagerly to prove it to you with great vigour.^ ^Without going into the specifics of the Egberts' reaction when they find you toying with the affections of their beloved only child, you are soon happily married, and living a full and contented life on the farm. You are blessed with children, long life, and bumper crops year after year.^ ^You now have an intimate and familiar understanding of the dangers that lurk in the darkness of this strange and magical world. Unfortunately this no longer does you any good."; } ]; [ DeathMessage; if (deadflag == 1) rfalse; if (deadflag == 2) rfalse; if (deadflag == 3) print "The system has defeated you"; else if (deadflag == 4) print "You have failed"; else if (deadflag == 5) print "You have become a professor; interpret that how you will"; else print "You have failed to return home"; ]; [ DiagnoseSub; print "You're in peak physical condition; as peak as can be expected for a Classics student."; if (Butter has worn && Arktos has worn) print " Your robes have a rather unpleasant mix of butter and arktos essence smeared all over them."; else if (Butter has worn) print " There is butter smeared all over your clothing."; else if (Arktos has worn) print " There is arktos essence smeared all over your clothing."; if (Sewer_Vat.reach_in == true) print " One arm is covered in sewage following your exploits in the vat."; new_line; rtrue; ]; [ DrillSub; if (noun == player) { "You'll never get anywhere if you stand around asking yourself questions."; } if (noun has animate) { "You must drill ", (the) noun, " about a specific topic, or ", (ItorThey)noun, " will never answer."; } if (TestScope(Hand_Drill)) { if (Hand_Drill notin player) { print "(taking ", (the)Hand_Drill," first)^"; ; } <>; } else "But you don't have a drill!"; ]; [ DrinkFromNounSub; <>; ]; [ DrinkFromSecondSub; <>; ]; [ EmptyFromNounSub; <>; ]; [ EmptyFromSecondSub; <>; ]; [ EndGame ; print (b) "^Outside Vechlee^"; Outside_Vechlee.description(); Achieved(29); print "^You and Ninario stagger to your feet. Suddenly, a throng of people bursts out of the Vechlee town gate, cheering and whooping as they spot you and Ninario.^ ^~There they are!~ cries someone, and the throng surrounds both of you, congratulating you and patting you on the back.^ ^~It's the Plumbers Union!~ says Ninario in surprise. ~They must be coming out of the underground.~^ ^One of the Plumbers Union members steps forward. ~We certainly are! Your apprentice here really shook up the Wizards Guild with that little display of pyrotechnics or whatever it was. They're running around trying to get their house in order, and it's the perfect time for us to seize the day. Are you with us, Ninario?~^ ^~I most certainly am!~ Ninario cries willfully. He scans the crowd. ~Ah!~ he says, sounding pleased. ~I see I'm not the only renegade wizard!~ Chuckling to himself, he heads off to stand with four other robed wizards, also apparently rebelling against the Wizards Guild.^"; if (Soldiers.Reason == 4) print "^You hear a sudden shout from in the crowd, and ", (the) Guard, " comes running out to shake your hand.^ ^~Ah ceean't tell tha how pleased ah is ti see tha. It wur thah drill tha' convinced 'em ti think owt o' ma,~ he tells you, shaking your hand once again.^ ^~Yance ah telled 'em whoo it wur from an' that th' soldiers wur looking for tha, they wur suited ti help reet eneaff. We deeann't ev eneaff troops ti mak ower much o' a difference, but there it wur. Ah's weeantly cruse on knawing that tha sal be helping us agin' th' Guild. Ah hope ti see tha in Blumph afoor lang.~ He shakes your hand a third time, and vanishes back into the roiling crowd.^"; if (Crone.out == true) { deadflag = 5; "^A member of the Plumbers Union comes forward and whispers something in Ninario's ear. Ninario face falls, a mixture of dismay and sadness. He steps forward to speak to you.^ ^~My dear student,~ he begins uncertainly, ~I have just heard some rather distressing news about your conduct during my incarceration. One of the Plumbers Union's top operatives, the elderly saint who ran the Sorcery Supply store, was attacked and killed.~^ ^Your face must betray some emotion for Ninario nods sadly. ~Yes,~ he affirms, ~I have been told you were the one responsible. Normally, we would deal with this in the proper way, but fortunately for you, the Plumbers Union are great believers in the healing power of mercy. In addition, I argued strongly that your recent conduct in rescuing me and putting a dent in the Wizards Guild's stranglehold on the populace should be considered in your favour.^ ^~However, the Plumbers Union still do not wish to consort with you any longer, so we have determined to banish you to your own time and place, never to return here on pain of standing trial for your crimes. I am sorry that we were not reunited in happier circumstances, my student.~^ ^Ninario turns away, ignoring your proferred handshake, cutting you to the quick. He nods to a few other of the renegade wizards, and they join hands to cast the spell to return you home and close the rift.^ ^The circle of wizards begin chanting in low tones, the power throbbing palpably in the air. The chant builds slowly, growing in intensity. The power whips around you, pulling and tugging at you.^ ^There is a final wrenching pull, and you are sent. You can almost feel the ", (i) "snap", " as the rift slams shut behind you.^ ^CRASH! You land heavily on your back to the accompaniment of breaking glass. You gaze upwards, blinking slowly, trying to come to grips with your surroundings.^ ^~Ahem!~ interjects a dry voice, loudly. You blink once again, and the plain ceiling above you finally resolves itself, and you realise that you are lying on your back amidst the wreckage of your ", (name)Prof, "'s overhead projector.^ ^He leans forward over you, his face upside down. Your fellow students gaze at the scene eagerly, awoken from their stupor. Surely this incident will cause a reaction from ", (the) Prof, "? Surely this will shake him from his dry and boring lecture? Your classmates wait, a collective hush descending over the room.^ ^There is a long pause. Events have clearly galloped too quickly for ", (the) Prof, " and his brain is coming along at a trot, trying to catch up. He clears his throat and you feel the class tense. What will he say?^ ^~Students will refrain from wilful destruction of university property,~ he says clearly, ~and will remain in their seats during lectures.~^ ^Slowly, you pick yourself up and start to return to your seat. A cough from ", (the) Prof, " stops you. ~Perhaps,~ he murmurs, ~the student is unaware of the impediment caused by the destruction of the equipment. I am now forced to copy my notes onto the chalkboard, and will require your assistance in holding the notes for me.~^ ^You acquiesce; it's got to be better than listening to the lecture, and it's certainly a fair alternative to having to pay for the overhead. You stand beside ", (the) Prof, " holding the notes for him.^ ^But a strange thing happens so close to the action of the lecture, as it were. You find that the material is much more interesting as you pay such close attention to it. Soon, you find yourself appreciating the lecture and taking an active interest in the subject.^ ^A few years later, you graduate with a First in ", (i) "Celtic Elements in Early Teutonic Settlements", ". You go on to study the subject at the doctorate level, and devote your life to the pursuits of this field, happy in a boring sort of way. In some small way, you feel that subjecting yourself to this life begins to atone for the sins you committed in the strange and wonderful world you visited."; } else { deadflag = 2; "^Suddenly, the ground begins to shake underfoot, a great rumbling growing inside the earth. The crowd shouts in panic, people tumbling from their feet.^ ^Ninario and the other renegade wizards step forward. ~The Wizards Guild are striking back!~ cries Ninario. ~They're disrupting the flow of magic. They must be trying to...~^ ^There is a shockingly loud thunderclap, and you and many others are hurled from your feet. Sudden rain and wind descend upon the group and thunder and lightning burst around you.^ ^Ninario hauls you to your feet, his face grey. ~Renaldo and the wizards have forced the rift closed!~ he shouts over the noise of the storm. ~But I doubt they bothered to stabilise the paradoxes before they did! They're in danger of destroying ", (i) "both", " our worlds. And if we try to send you home now, we'll only speed the process along!~^ ^He drags you hurriedly over to the group of wizards. ~Come along, my young apprentice, we must get to the relative safety of Blumph. Perhaps there we can figure out a way to repair the paradoxes, stabilise the system of magic, and maybe, just maybe, get you sent home!~^ ^As the whole company, under the direction of the renegade wizards and a few domineering plumbers, mounts onto various chariots, flying carpets and other conveyances, you reflect that you might never see your home again. You're not sure how you feel about that as you rise up into the air on what appears to be a flying settee. ~Sorry,~ calls the wizard piloting, ~but my carpet was out being cleaned.~^ ^As she sets a course for Blumph, you face forward on the settee, ready to face whatever new adventures come your way. You reflect on the fact that it's been a rather odd day, but not that bad a one. After all, a bad day being chased by insane Wizards Guilds, and meeting up with dogs, bears, cheeses of all sorts and mad woodshop proprietors is still better than sitting through a lecture on ", (i) "Celtic Elements in Early Teutonic Settlements", ". Or at least, you hope so."; } ]; [ FindSub ; if (noun == player) "This is hardly one of those philosophical journeys where your goal is to find yourself. So let us say that you're right here, and leave it at that."; if (TestScope(noun)) "But ", (the) noun, " ", (isorare)noun, " right here!"; "You'll have to look around and find that yourself."; ]; [ FireAtSub; if (second == nothing) { if (noun == Cannon) "You can't fire the cannon at itself!"; if (TestScope(Cannon)) { if (Cannon.aimed_at ~= noun) { ; new_line; } <>; } else "You'll need something to fire before you can fire at ", (the) noun, (string)period; } if (noun == Cannon) { if (second == Cannon) "You can't fire the cannon at itself!"; if (Cannon.aimed_at ~= second) { ; new_line; } <>; } "That's not going to work."; ]; [ FireSub; if (noun == nothing && location == Tower_Roof) <>; if (noun ~= Cannon) { if (TestScope(Cannon)) { print "(assuming you mean ", (address)verb_word, " at ", (the) noun, " with the cannon)^"; if (Cannon.aimed_at ~= noun) { ; new_line; } <>; } "That's not something you can fire."; } if (noun == Cannon) <>; "You need something to fire first."; ]; [ FollowSub; "But ", (the) noun, " ", (isorare)noun, " right here!"; ]; ![ FullScoreSub i; ! ScoreSub(); ! if (score==0 || TASKS_PROVIDED==1) rfalse; ! new_line; ! L__M(##FullScore,1); ! ! for (i=0:ii==1) ! { PANum(task_scores-->i); ! PrintTaskName(i); ! } ! ! if (things_score~=0) ! { PANum(things_score); L__M(##FullScore,2); } ! if (places_score~=0) ! { PANum(places_score); L__M(##FullScore,3); } ! new_line; PANum(score); L__M(##FullScore,4); !]; [ GetUnderSub; if (noun == player) "That would be tricky."; if (noun has animate) print_ret (The) noun, " might not appreciate that the same way you obviously would."; if (noun has clothing) <>; "No matter how long you spend hiding under ", (the) noun, ", your problems will still be here when you come out. You learned ", (i) "that", " one many years ago."; ]; [ HandDrillSub; if (noun == nothing) "You look around and wonder just what you should drill."; "Drilling ", (the) noun, " would not be helpful."; ]; [ HastenSub; if (Testscope(Hastener)) <>; "A brilliant idea. All you need now is some hastener."; ]; [ HelpNPCSub; if (noun == player) <>; "If only you knew how."; ]; [ HitKey; print "^[Press any key to continue]"; KeyCharPrimitive(); ]; [ HurryUpSub; "You're already working as fast as you can!"; ]; [ i text; style underline; print (string) text; style roman; ]; [ InScope obj; PlaceInScope(Sky); PlaceInScope(HelpObj); if (location ~= Lecture_Hall) PlaceInScope(Rift); if ((location == Library && Lib_Window has general) || (location == Bedroom)) { PlaceInScope(Courtyard); PlaceInScope(Caerwall_Obj); PlaceInScope(Dirt_Obj); PlaceInScope(Caer_Door); PlaceInScope(Fountain); PlaceInScope(Fountain_Water); PlaceInScope(Figurines); PlaceInScope(Portcullis); } if (location == U_South_Hall or U_North_Hall) { PlaceInScope(Caerwall_Obj); PlaceInScope(Courtyard); PlaceInScope(Dirt_Obj); } if (location == Study) { PlaceInScope(Caerwall_Obj); PlaceInScope(Courtyard); PlaceInScope(Dirt_Obj); PlaceInScope(Shed_Door); PlaceInScope(Pebbled_Walk); PlaceInScope(Stone_Path); } if (location == W_Courtyard or Garden_Plot) { PlaceInScope(Shed_Door); } if (location == Laboratory && S_Windows has general) { PlaceInScope(Caerwall_Obj); PlaceInScope(Courtyard); PlaceInScope(Dirt_Obj); PlaceInScope(Shed_Door); PlaceInScope(Stone_Path); } if (obj == player && location == thedark && real_location == Pipe_Closet) { PlaceInScope(Pipe_Closet_Door); } if (obj == player && location == thedark && real_location == Shed) { PlaceInScope(Shed_Door); } if (obj == player && location == thedark && real_location == UnderShed) { PlaceInScope(Trapdoor); } rfalse; ]; [ ItorThey obj; if (obj == player) { print "you"; return; } if (obj has pluralname) { print "they"; return; } if (obj has animate) { if (obj has female) { print "she"; return; } else if (obj hasnt neuter) { print "he"; return; } } print "it"; ]; [ ItorTheyAre obj; if (obj == player) { print "you're"; return; } if (obj has pluralname) { print "they're"; return; } if (obj has animate) { if (obj has female) { print "she's"; return; } else if (obj hasnt neuter) { print "he's"; return; } } print "it's"; ]; [ JumpThroughSub ; "Jumping through ", (the) noun, " might not be the best idea."; ]; [ KnockSub ; "Silence answers your knock."; ]; [ LetInSub; if (noun == player) "If you want to be let in somewhere, you could try knocking or asking."; "If you insist."; ]; [ LickSub; if (noun == player ) <>; if (noun ofclass Room ) "We don't have that kind of time."; if (noun ofclass CompassDirection) "That's a rather odd thing to try doing."; print "You wouldn't lick ", (the) noun, " if "; if (noun has pluralname) "they were dipped in chocolate!"; else if (noun has male) "he was glazed in honey! Well, who knows, you might, but he isn't."; else if (noun has female) "she was glazed in honey! Well, who knows, you might, but she isn't."; else "it was glazed in honey!"; ]; [ LiftSub; if (noun == player) "Your spirits are pretty high already."; "Lifting that would serve no real purpose."; ]; [ LookUnderSub; if (noun == player) "Amazingly, you see a pair of legs. Wait, you've seen them before... they're yours."; if (noun has animate) { if (noun == Crone && Crone.out == true) "You shift the body briefly, but find nothing of interest."; print_ret (The) noun, " might not appreciate that."; } "You find no vast store of hidden wealth in convenient thousand pound notes, no dismembered corpse and no ages-old undiscovered secret. Sigh."; ]; [ MeetSub; if (students in location) <>; if (Ninario in location || (location == First_Floor_Hall && Ninario in Cell)) <>; if (Hawk in location) <>; if (Dogs in location) <>; if (people in location) <>; if (Shopkeeper in location) <>; if (Crone in location) <>; if (Guard in location) <>; if (Bear in location) <>; if (Hermit in location) <>; "Don't start getting friendly with yourself."; ]; [ MeetNPCSub; if (noun == player) "They say that before you can truly know others, you have to know yourself. Well, thank goodness you've taken care of that."; "Complete silence answers your cheery greeting."; ]; [ MixSub; "You get a sudden inkling that doing that is not the way to proceed."; ]; [ NoWinJump; "Just for your edification, those windows they jump through in films aren't made of real glass. You decide against it."; ]; [ OneWindow; " He stares in surprise at the wreckage, glancing from the window to you and back again.^ ^~Vociferous voodoo!!~ he exclaims. ~What happened in here?~ He shakes his head in dismay. ~Most distressing, mm-yes. How odd that the window, which has stood up well for hundreds of years of my life, should break spontaneously just when you're in the room. I'm just glad you weren't hurt! Mm-yes.~^ ^Clicking his tongue, Ninario heads back to his study."; ]; ! parsing for 'of' thanks to Neil Cerutti [ ParseNameOf wd prev num; wd = NextWord(); while (WordInProperty(wd, self, name)) { ++num; prev = wd; wd = NextWord(); } if (prev == 'of') { --num; } return num; ]; [ PlaySub; if (noun == nothing or player) "You play around for a few moments."; if (noun has animate) print_ret (The) noun, " probably wouldn't enjoy that the way you would."; "You're not sure how to do that."; ]; [ PoisonSub; deadflag = 1; if (TestScope(Stone_Bottle) && Stone_Bottle has open) { "^The pent-up methane gas in the room finally reaches a level high enough, and reacts with the paint stripper in the stone bottle. A sudden violent explosion rocks the room. Close to the bottle as you are, you form the epicentre of the explosion, and end up violently and messily scattered around the room."; } "^The methane gas content in the room finally reaches a level high enough to have an effect. As the gas is odourless and colourless, you don't notice anything odd, other than a vague sleepy sensation. You slump down to the floor, promising yourself a quick nap; regrettably, you never awaken."; ]; [ PrintRank; print ", meaning you "; if (score == 50) "were awarded a Doctor of Letters."; if (score >= 45) "were awarded a Master's Degree (Honours)."; if (score >= 40) "were awarded a Master's Degree."; if (score >= 35) "were awarded a Bachelor's Degree (Honours)."; if (score >= 30) "were awarded a Bachelor's Degree."; if (score >= 25) "are a Fourth year student."; if (score >= 20) "are a Third year student."; if (score >= 15) "are a Second year student."; if (score >= 10) "are a First year student."; if (score >= 5) "would do so much better if you just applied yourself."; if (score >= 4) "attended lectures, but didn't pay attention."; if (score >= 3) "spent a lot of time playing interactive fiction in the computer lab."; if (score >= 2) "wasted a lot of time on Usenet."; if (score >= 1) "spent a lot of time in the pub instead of the library."; "failed the admission criteria."; ]; [ PrintTaskName task_number; switch(task_number) { 0: "entering the glowing portal"; 1: "cleaning the library"; 2: "turning on the magnesium flare"; 3: "unblocking the sewer vat"; 4: "getting the spectacles clean"; 5: "giving the spectacles to Ninario"; 6: "having Ninario attempt to close the rift"; 7: "raising the portcullis"; 8: "creating the black powder"; 9: "blasting yourself through the caer doors"; 10: "blasting the cannonball through the caer doors"; 11: "spreading wood hastener on the elm tree"; 12: "getting past the hawk in the elm tree"; 13: "landing in the farm garden"; 14: "getting rid of the dogs in the garden"; 15: "finding the arktos essence in the barn"; 16: "exiting the farmyard through the gate"; 17: "finding the gold coin in the Building Society"; 18: "brutally murdering the old crone"; 19: "using the scrying bowl the first time"; 20: "giving the drill to the guard"; 21: "giving 10 plotkins to the guard"; 22: "giving 5 plotkins to the guard"; 23: "getting past the bear on the ledge"; 24: "giving the goggles to the hermit"; 25: "giving the pillow to the hermit"; 26: "getting the hermit to open the hermetically sealed bottle"; 27: "blowing up the first floor of the Wizards Guild Hall"; 28: "spreading wood hastener on the cell door"; 29: "escaping the Wizards Guild Hall with Ninario"; } ]; [ ReachInSub; if ( noun hasnt container ) "You can't reach into ", (the) noun, "!"; if ( noun hasnt open ) "You smack your hand on the surface of ", (the) noun, ". That might be because ", (the) noun, " isn't open right now."; if ( child(noun)) "You can feel something inside ", (the) noun, " but you're not certain what it is."; "You dig around inside ", (the) noun, " but don't feel anything."; ]; [ ReachUnderSub; "That's not something you can reach under easily."; ]; [ ReadSub; <>; ]; [ RideSub; "As fun as it might be to ride ", (the) noun, " you decide that you have more important concerns right now."; ]; [ SellSub; if (second == player) "Possession is nine-tenths of the law."; if (second == nothing) "Nobody seems to be interested in purchasing ", (the) noun, (string)period; if (second == Crone) { if (Crone.out == true) "Being dead, ", (the) Crone, " has little need for ", (a) noun, (string)period; if (noun == Scrying_Bowl) <>; print_ret (The) Crone, " looks at ", (the) noun, " rather critically. ~No thanks,~ she tells you. ~I'm not that eager to deal in used merchandise.~"; } if (second == Shopkeeper) { print_ret (The) Shopkeeper, " glances at ", (the) noun, " and frowns. ~I'm sure it's as nice as you say, luv, but I don't really need ", (a) noun, " at the moment.~"; } if (second == Ninario) { "Ninario waves his dismissively. ~No, no, I'm sure I've got one of my own somewhere.~"; } if (second == Guard) { if (noun == Hand_Drill or Coin_5 or Coin_10) <>; print_ret (The) Guard, " glances at ", (the) noun, " and shakes his head. ~Mah worrk deean't pay seea varry weel, young'un. An' if ah ed owt in th' way o' brass, ah wouldna be eager ti spend it on ", (a) noun, ", ah's afeeard.~"; } if (second == Prof) "~Students will refrain from conducting business transactions during the lecture,~ intones ", (the) Prof, (string)period; if (second == people) "You can't convince anyone to buy ", (the) noun, (string)period; if (second has animate) { print (The) second; if (second has pluralname) print " do"; else print " does"; "n't seem very interested in paying money for ", (the) noun, (string)period; } ]; [ SendHomeSub; if (noun == player) "Well that's what you're trying to do. These things take time."; "First, find a way to get home. Then you can worry about taking ", (the) noun, " with you."; ]; [ SendSub; "You don't need to send anything or anyone anywhere."; ]; [ ShoutSub ; print "You ", (address)verb_word, " loudly, attempting to attract some attention.^"; if (Prof in location) "^", (The) Prof, " flicks an annoyed eye in your direction. ~Please keep oral interrupts to a minimum during the lecture.~"; if (Ninario in location) "^~Dear me,~ says Ninario mildly. ~Such excessive volume!~"; if (Shopkeeper in location) "^~Oh dear,~ says ", (the) Shopkeeper, " peering nervously over her shoulder. ~We don't want to disturb mum, luv,~"; if (Crone in location) "^", (The) Crone, " glances curiously at you. ~Is that supposed to help in any way?~ she asks."; if (People in location) "^Everyone ignores you."; if (Guard in location) "^~Thoo soonds weeantly vexed!~ says ", (the) Guard, ", shaking his head in sympathy."; if (Dogs in location) "^", (The) Dogs, " don't seem too bothered by your ", (address)verb_word, (string)period; if (Bear in location) "^", (The) Bear, " doesn't seem too bothered by your ", (address)verb_word, (string)period; rtrue; ]; [ SitDownSub obj; objectloop(obj in location) { if(obj has supporter && obj has enterable) <>; } if (TestScope(Toilet_Hole)) <>; "There is no place to sit here."; ]; [ StayHereSub; if (noun == player && location == Lecture_Hall ) "Let you stay? In this lecture? You must be mad."; if (noun == player) "Let you stay? Well, that's really up to Ninario."; "If you insist."; ]; [ SubstanceShowSub obj; obj = parent(noun); move noun to player; ; move noun to obj; rtrue; ]; [ TalkSub ; print (The) noun; if (noun has pluralname) print " don't "; else print " doesn't "; "reply."; ]; [TaskScore i; return task_scores-->i; ]; [ToFirstUpper word i j; #Ifdef TARGET_ZCODE; @output_stream 3 Case_Array; #Ifnot; i=glk_stream_get_current(); glk_stream_set_current(glk_stream_open_memory(Case_Array, 32, filemode_Write, 310)); j = PrintAnyToArray(NULL, 0, word); #Endif; ! address is used here as ToFirstUpper expects to work with ! dictionary words, not strings, e.g. verb_word print (address) word; #Ifdef TARGET_ZCODE; @output_stream -3; j = Case_Array-->0; for (i=2:i < (j + 2): i++ ) { if (Case_Array->(i) >= 'a' && Case_Array->(i) <= 'z') if (i == 2) ! if this was the first character, make it uppercase Case_Array->(i) = Case_Array->(i) + ('A' - 'a'); #Ifnot; glk_stream_close(glk_stream_get_current(), GLK_NULL); glk_stream_set_current(i); for (i=0:i < j: i++ ) { if (i == 0) Case_Array->(i) = glk_char_to_upper(Case_Array->(i)); #Endif; print (char) Case_Array->(i); } ]; [ToLower word i j; !#Ifdef TARGET_ZCODE; ! @output_stream 3 Case_Array; !#Ifnot; ! i=glk_stream_get_current(); ! glk_stream_set_current(glk_stream_open_memory(Case_Array, 32, filemode_Write, 310)); ! j = PrintAnyToArray(NULL, 0, word); !#Endif; ! print (name) word; !#Ifdef TARGET_ZCODE; ! @output_stream -3; ! j = Case_Array-->0; ! for (i=2:i < (j + 2): i++ ) { ! if (Case_Array->(i) >= 'A' && Case_Array->(i) <= 'Z') ! Case_Array->(i) = Case_Array->(i) + ('a' - 'A'); !#Ifnot; ! glk_stream_close(glk_stream_get_current(), GLK_NULL); ! glk_stream_set_current(i); ! for (i=0:i < j: i++ ) { ! Case_Array->(i) = glk_char_to_lower(Case_Array->(i)); !#Endif; ! print (char) Case_Array->(i); ! } j = PrintToBuffer(Case_Array, MAX_LOCATION_LENGTH, word); for (i=WORDSIZE:(i < (j + WORDSIZE)) && (i < MAX_LOCATION_LENGTH + WORDSIZE): i++ ) { Case_Array->(i) = LowerCase(Case_Array->(i)); print (char) Case_Array->(i); } ]; [ TossSub; if (noun notin player) { print "(taking ", (the) noun, " first)^"; ; } if (noun == Coin_5 or Coin_10) { if (random(2) == 1) "Heads up."; else "Plots up."; } else <>; ]; [ TouchWalls obj Floor Walls; if (obj == u_obj or Sky) <>; if (obj == d_obj) switch (Floor) { WOOD: "A plain wooden floor, modest and unremarkable."; WET_WOOD: "The wooden floor feels damp to the touch."; PAPER: "The floor is dry and papery, and crackles underneath you."; HARDWOOD: "Beautifully polished hardwood flooring, smooth to the touch."; ROUGH_STONE: "The stone floor is rough and uneven."; COLD_STONE: "The floor is of cold stone, austere and impersonal."; DAMP_STONE: "The damp and chilly stone floor leeches the warmth from your body."; SMOOTH_STONE: "You gaze at the smooth stone floor, running your fingers over its surface."; ! PEBBLED_STONE: ! "The floor is of pebbled stone, rough and uneven."; SLIMY_STONE: "This stone floor is slippery with slimy residue."; WET_STONE: "The stone floor is wet."; STONE_TILES: "You run your fingers lightly over the polished stone tiles of the floor, savouring the slippery coolness of their texture."; CONCRETE: "This floor has the dry, cold and pebbly texture of painted concrete."; WET_CONCRETE: "The concrete floor is slippery and wet."; THICK_CARPET: "The carpeted floor is thick and warm under your feet."; ! WORN_CARPET: ! "The thin carpet is threadbare and worn with the passage of ! many feet."; WET_CARPET: "The carpet is wet and soggy, and is taking a very long time to dry."; WET_DIRT: "The dirt here is wet, as though someone has been dumping water around."; DIRT: "The ground under your feet is dry packed dirt."; SHORT_GRASS: "The ground under your feet is dry packed dirt covered with short stunted grass."; LONG_GRASS: "The long mountain grass is rooted firmly in dry packed earth."; ! LAWN_GRASS: ! "The sweet-smelling grass is soft and springy, beautifully ! tended."; ! MEADOW_GRASS: ! "The long meadow grass is wild and unruly."; WET_GRASS: "The grass under your feet is slightly damp."; MARBLE: "The marble floor feels cool and smooth, and shimmers with a queer inner light."; WET_MARBLE: "The marble floor feels cool and smooth, and shimmers with a queer inner light. The floor feels just a bit damp."; COBBLES: "The cobblestones are neatly and securely laid."; WET_COBBLES: "The cobblestones are neatly and securely laid. They feel just a bit damp."; MOUNTAIN_STONE: "The ground is rough and stony under your fingertips."; OUTSIDE: "The ground under your feet is dry packed dirt."; } switch (Walls) { WOOD: "These walls are plain and wooden, ordinary and unremarkable."; ROUGH_WOOD: "The wooden walls are rough and splintered."; COLD_STONE: "These stone walls are cold to the touch."; ROUGH_STONE: if (location == Tower or Tower_Roof) print "The low stone parapet"; else print "These stone"; " walls are rough and jagged beneath your fingers."; DAMP_STONE: "The damp and chilly stone leeches the warmth from your fingers."; SLIMY_STONE: "These slimy stone walls gleam slickly with some kind of foreign residue."; ! PEBBLED_STONE: ! "The pebbled stone walls are rough and uneven."; SMOOTH_STONE: "These walls are constructed of beautifully dressed stone, smooth to the touch."; CONCRETE: "These concrete walls are smooth and cold under your fingertips."; MARBLE: "The marble walls are cool and smooth under your hand, shimmering with a queer inner light."; DIRT: "The walls are dry, packed dirt."; OUTSIDE: "You're outside, so the walls don't enter into it."; } ]; [ TwoWindows ; "^^~What in the name of magic is going on today?~ he exclaims. ~I can believe one window spontaneously breaking, but two? And both when you're in the room?~ He looks at you and frowns.^ ^~I ", (i) "hope", " that we aren't going to see any more ", (i) "accidents", " today, my young pupil. Mm-yes. No.~^ ^He folds his arms and gazes at you meaningfully for a long while.^ ^~Not to, mmm, threaten or accuse anyone, of course... but if we did see any more accidents, we might, shall we say, see one final accident to end all the accidents. Have I made myself clear? Mm-yes. Dear me.~^ ^Ninario shakes a finger in your direction, and leaves the room."; ]; [ UnblockSub ; if (noun == player) "Consider yourself well and truly unblocked."; print (The) noun; if (noun has pluralname) print " don't"; else print " doesn't"; " appear to need unblocking."; ]; [ UseSub ; if (noun == player) "One can only hope you don't prove useless."; if (noun == Hastener && second ~= nothing) <>; print "It's unclear how you want to use ", (the) noun; ". You might want to try a more specific action."; ]; [ XyzzySub; print "Remembering your old days of playing Adventure in the computer lab, you cry out ~", (ToFirstUpper)verb_word, "!~ in a loud voice but nothing happens.^"; if (Prof in location) { "^", (The) Prof, " scowls up in your direction. ~Please dispense with the historical Crowther and Woods references. Their contributions to Celtic lore will be discussed in a subsequent lecture.~"; } else if (Ninario in location) { "^Ninario chuckles and shakes his head. ~", (ToFirstUpper)verb_word, " stopped being effective a ", (i) "very", " long time ago.~"; } else if (Shopkeeper in location) { "^~Bless you, luv,~ says ", (the) Shopkeeper, (string)period; } else if (Crone in location) { if (Crone.out == true) "^", (The) Crone, " continues to lie there, as dead as before."; "^", (The) Crone, " cackles loudly. ~Hah! A student of the elder times! But the power of that time is long exhausted.~"; } else if (Guard in location) { "^~Good ti nowt, 'at is,~ says ", (the) Guard, ". ~'F 'at wrowt, ah'd ev bin an' gan a lang while sen.~"; } else if (Hermit in location) { "^~We hermeticists never made much use of those words,~ muses ", (the) Hermit, ". ~I'm interested to see what they do.~ He gazes around expectantly for a few moments. ~Hmmm,~ he says eventually. ~Just as we always suspected: nothing.~"; } rtrue; ]; [ YawnSub ; print "You yawn noisily.^"; if (Prof in location) "^", (The) Prof, " flicks an annoyed eye in your direction."; if (Ninario in location) "^~Dear me,~ says Ninario. ~I'm sorry this seems to be boring you.~"; if (Shopkeeper in location) "^~My goodness me, luv,~ says ", (the) Shopkeeper, ". ~P'raps you should pop off home and catch forty winks.~"; if (Crone in location) "^~Have you been eating cheese?~ asks ", (the) Crone, ". ~That always makes ", (i) "me", " sleepy. Gives me strange dreams too,~ she mutters."; if (Guard in location) "^~Weel-owivver!~ says ", (the) Guard, ". ~Thoo sal git ma reet tired if tha diz 'at again. Ah wur up all yesterneet.~"; rtrue; ]; !============================================================================== !============================================================================== ! Standard and extended grammar Include "Grammar"; Verb 'abuse' = 'attack'; Verb 'bend' = 'attack'; Verb 'aim' 'point' * noun -> AimNothing * 'at' noun -> AimAt * noun 'at' noun -> AimAt * noun 'at' noun -> AimAt * noun 'toward'/'towards' noun -> AimAt * noun noun -> AimAt; Verb 'appraise' = 'buy'; Verb 'ascend' = 'climb'; Extend 'ask' * creature 'for' topic -> AskFor * creature 'for' topic noun -> AskFor; Verb 'barter' 'bargain' 'haggle' 'deal' 'trade' * -> Bargain * 'with' creature -> Bargain; Extend 'climb' * 'on' noun -> Climb * 'into' noun -> Enter * 'under' noun -> GetUnder * 'out' 'of' noun -> Exit * 'out' -> Exit; Verb 'confront' * creature -> Talk; Extend only 'cover' replace * noun -> Close * 'up' noun -> Close * 'off' noun -> SwitchOff * noun 'with' noun -> PutOn reverse; Extend 'dig' * 'in' noun -> Dig * 'in' noun 'with' held -> Dig; Extend 'drink' * 'from' noun -> DrinkFromNoun * noun is_liquid -> DrinkFromNoun * is_liquid 'from' noun -> DrinkFromSecond; Verb 'diagnose' 'health' * -> Diagnose; Verb 'drill' * creature -> Drill * creature 'about' topic -> Ask * creature 'for' noun -> AskFor * noun -> Drill; Extend 'empty' * 'from' noun -> EmptyFromNoun * noun is_liquid -> EmptyFromNoun * is_liquid 'from' noun -> EmptyFromSecond * noun 'in' noun -> EmptyT * noun 'over' noun -> EmptyT; Extend 'feel' first * 'under' noun -> ReachUnder; Extend 'fill' * noun'with' noun -> Fill * noun 'from' noun -> Fill; Verb 'find' * noun -> Find * topic -> Find; Verb 'fire' 'shoot' * -> Fire * noun -> Fire * noun 'at' noun -> FireAt * 'at' noun -> FireAt * 'at' noun 'with' noun -> FireAt reverse * noun 'with' noun -> FireAt reverse; Verb 'follow' * noun -> Find; Verb 'greet' 'hi' 'hello' 'salute' 'greetings' 'acknowledge' 'bow' 'nod' 'meet' * -> Meet * noun -> MeetNPC * 'at'/'to'/'toward'/'towards' noun -> MeetNPC; Extend 'get' * 'out' 'of' noun -> Exit * 'off' 'of' noun -> GetOff * 'under' noun -> GetUnder * multiinside 'out' 'of' noun -> Remove; Verb 'hasten' * noun -> Hasten; Extend 'help' * noun -> HelpNPC; Verb 'hide' * 'under' noun -> GetUnder; Verb 'hurry' * -> HurryUp * 'up' -> HurryUp; Verb 'jaunt' = 'jump'; Verb 'leap' = 'jump'; Extend 'jump' * 'into'/'in' noun -> Enter * noun -> JumpOver * 'on' noun -> Climb * 'out' -> Exit * 'out' 'of' noun -> Exit * 'off' noun -> Jump * 'out' noun -> JumpThrough * 'through' noun -> JumpThrough; Verb 'kick' * noun -> Attack; Verb 'knock' 'tap' 'rap' * 'on'/'at' noun -> Knock * creature -> Attack; Verb 'let' * noun 'stay' -> StayHere * noun 'in' -> LetIn * noun 'go' 'home' -> SendHome * noun 'stay' 'here' -> StayHere; Verb 'lift' 'raise' * noun -> Lift; Verb 'lick' * noun -> Lick; Verb 'load' = 'put'; Extend 'lock' first * noun -> Lock; Extend 'look' * 'for' noun -> Find * 'for' topic -> Find * noun=ADirection -> Examine * 'to' noun=ADirection -> Examine * 'through' noun -> Search * 'out' noun -> Search; Verb 'mix' * noun 'with' noun -> Mix; Extend only 'normal' replace * -> LMode2; Verb 'off' * 'of' noun -> GetOff * noun -> GetOff * -> Exit; Verb 'pet' 'stroke' 'pat' 'caress' = 'touch'; Verb 'play' * 'with' noun -> Play * noun -> Play * -> Play; Verb 'pour' * noun -> Empty * 'out' noun -> Empty * noun 'out' -> Empty * noun 'on'/'onto'/'over' noun -> EmptyT * noun 'to'/'in'/'into' noun -> EmptyT * noun 'down' noun -> EmptyT; Extend 'pull' * 'up' noun -> Lift * noun 'up' -> Lift; Extend 'put' * multiexcept 'over' noun -> PutOn; Verb 'reach' * 'in'/'into' noun -> ReachIn * 'under' noun -> ReachUnder; Extend 'read' first * readable -> Read; Verb 'ride' 'mount' 'straddle' * creature -> Ride * noun -> Enter; Verb 'rip' 'tear' 'shred' = 'attack'; Verb 'roll' = 'push'; Extend 'search' first * 'for' noun -> Find * 'for' topic -> Find; Verb 'sell' * held 'to' creature -> Sell; Verb 'send' * noun 'home' -> SendHome * noun topic -> Send * noun 'to' noun -> Send; Verb 'shake' = 'attack'; Verb 'shove' = 'push'; Extend 'shout' replace * -> Shout * topic 'to' creature -> Answer; Verb 'bellow' 'screech' 'shriek' 'yell' 'scream' 'call' 'cry' 'squeal' 'howl' 'roar' 'growl' 'bark' = 'shout'; Extend 'show' first * is_substance 'to' creature -> SubstanceShow * creature is_substance -> SubstanceShow reverse; Extend 'shed' replace * held -> Disrobe; Extend 'sit' replace * -> SitDown * 'at'/'on' noun -> Enter * 'in' noun -> Enter * 'down' -> SitDown * 'down' 'at' noun -> Enter; Verb 'smear' 'spread' 'smother' * multiexcept 'on'/'onto' noun -> PutOn * multiexcept 'in'/'into' noun -> PutOn; Extend 'swim' * 'in' noun -> Swim; Extend 'take' replace * multi -> Take * noun 'home' -> SendHome ! * noun -> Take * 'off' noun -> Disrobe * noun 'off' -> Disrobe * multiinside 'from' noun -> Remove * multiinside 'off' noun -> Remove * 'inventory' -> Inv * multiinside 'out' 'of' noun -> Remove; Verb 'talk' 't' * 'to' creature -> Talk * creature -> Talk; Verb 'tidy' 'wash' = 'rub'; Extend only 'rub' * multiexcept 'on'/'onto' noun -> PutOn * multiexcept 'in'/'into' noun -> PutOn; Verb 'toss' 'flip' * multiheld -> Toss; Verb 'tug' = 'pull'; Extend 'turn' * noun noun ->AimAt * noun 'at'/'to' noun ->AimAt; Verb 'unblock' 'unclog' * noun -> Unblock; Verb 'undress' = 'disrobe'; Verb 'unload' = 'remove'; Extend 'unlock' first * noun -> Unlock; Verb 'use' * noun -> Use * noun 'on' noun -> Use; Extend 'wave' replace * -> Meet * held -> Wave * held 'madly' -> Wave * held 'at' noun -> Wave * held 'madly' 'at' noun -> Wave * 'madly' -> Meet * 'madly' 'at'/'to'/'toward'/'towards' noun -> MeetNPC * 'at'/'to'/'toward'/'towards' noun -> MeetNPC; Verb 'xyzzy' 'plugh' 'plover' * -> Xyzzy; Verb 'yawn' * -> Yawn * topic -> Yawn; !==============================================================================