!==================================================================================================================================================== Constant Story "Illuminismo Iniziato"; Constant Headline "^An Interactive Illumination^ Copyright (c) 2018 by Michael J. Coyne^"; Release 2; Serial "181001"; ! set this to enable sound Constant SOUND_ENABLED; ! Set this to enable graphics (compass rose, automap, pic window--only applicable for Glulx) #Ifdef TARGET_GLULX; Constant GRAPHICS_ENABLED; #Ifdef GRAPHICS_ENABLED; Constant BORDER_THICKNESS = 1; Constant MAP_START = 7; Constant BORDER_START = 6; ! MAP_START - BORDER_THICKNESS; Constant BORDER_AREA = 320; ! MAP_WINDOW - BORDER_START; Constant BORDER_WIDTH = 319; ! BORDER_AREA - BORDER_THICKNESS; Constant HEADLINE_AREA = 116; ! Size of the headline area in the image Constant MAP_ELEMENTS = 169; Constant MAP_OFFSET_STRIDE = 0; ! Source and dest maps are same size, no trickery needed. Constant MAP_OFFSET_ADJ = 0; Constant MAP_ROW = 13; Constant MAP_ROW_SRC = 13; Constant MAP_ROW_DST = 13; Constant MAP_CENTER = 84; Constant MAP_ICON = 24; Constant MAP_WIDTH = 314; ! BORDER_AREA - BORDER_START; Constant MAP_WINDOW = 326; #Endif; ! Set this to include CCPL menu item Constant INCLUDE_CCPL; Constant DEATH_MENTION_UNDO; Constant AMUSING_PROVIDED; Constant TASKS_PROVIDED; Constant NUMBER_TASKS = 60; Constant MAX_SCORE = 100; Array task_scores --> 1 1 1 2 2 1 2 3 1 1 1 1 2 2 1 1 2 2 1 1 2 1 1 1 1 1 1 2 4 2 3 4 1 1 1 1 1 1 1 3 2 1 2 1 1 1 3 1 1 1 2 3 2 1 1 3 1 3 3 5; #Ifdef GRAPHICS_ENABLED; Constant NODRAW_FLAG = $8000; Constant MAP_DIFF = 32; Array blumphmap --> 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 0 - 31 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 32 - 63 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 64 - 95 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 96 - 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 128 - 159 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 160 - 191 0 0 0 0 0 0 0 0 0 0 0 $800d $8005 $8002 $8005 $8002 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 192 - 223 0 0 0 0 0 0 0 0 0 0 0 $8006 $8004 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 224 - 255 0 0 0 0 0 0 0 0 0 0 0 $8006 0 $8004 0 $8002 0 $8002 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 256 - 287 ! | \ ha ww 0 0 0 0 0 0 0 0 0 0 0 $8006 0 0 $8004 $8006 $8003 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 288 - 319 0 0 0 0 0 0 0 0 0 $8002 $8005 $8002 $8005 $8005 $8005 $8002 $8005 $8002 0 0 0 0 0 $8011 0 0 0 0 0 0 0 0 ! 320 - 351 ! backroom - laundry - shops - - - hs - cc 0 0 0 0 0 0 0 0 0 0 0 $8006 $8004 0 0 $8006 $8015 $8005 $8013 0 0 0 $8003 0 $8004 0 0 0 0 0 0 0 ! 352 - 383 0 0 0 0 0 0 0 0 0 0 0 $8002 0 $8004 0 $8006 0 $800d 0 $8002 $8005 $8002 $8005 $8002 0 $8019 0 0 0 0 0 0 ! 384 - 415 0 0 0 0 0 0 0 0 0 0 0 0 0 0 $8004 $8006 $8003 0 0 $8006 0 0 $8004 0 $8003 0 0 0 0 0 0 0 ! 416 - 447 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 $8002 $8005 $800d 0 $8002 0 0 0 $8012 0 0 0 0 0 0 0 0 ! 448 - 479 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 $8004 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 480 - 511 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 $800d 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 512 - 543 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 544 - 575 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 576 - 607 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 608 - 639 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 640 - 671 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 672 - 703 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; ! 704 - 735 Array vechleemap --> 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 0 - 31 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 32 - 63 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 64 - 95 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 96 - 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 $8014 $8005 $8005 $8005 $8013 0 0 0 0 0 0 0 0 ! 128 - 159 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 $8017 0 0 0 0 0 $800f 0 0 0 0 0 0 0 ! 160 - 191 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 $8002 $8005 $8002 $8006 $8002 0 0 0 $8002 $8006 0 0 0 0 0 0 0 ! 192 - 223 0 0 0 0 0 0 0 0 0 0 0 0 0 0 $8003 0 0 0 $8018 0 $8004 0 $8003 0 $8010 0 0 0 0 0 0 0 ! 224 - 255 0 0 0 0 0 0 0 0 0 0 0 0 0 $8002 $8005 $8002 $8005 $800c $8005 $8005 $8005 $800c 0 0 0 $8002 0 0 0 0 0 0 ! 256 - 287 ! Dusty Rd Bailey Court Main Hall Gdn 0 0 0 0 0 0 0 0 $8002 $8005 $8002 0 $8003 0 $8015 $8005 $8013 0 $8004 0 0 $8006 0 0 $8003 0 0 0 0 0 0 0 ! 288 - 319 ! Factory N. Vechlee 0 0 0 0 0 0 0 0 0 0 $8006 $8003 0 0 0 0 0 $8002 0 $8004 0 $8002 0 $8003 0 0 0 0 0 0 0 0 ! 320 - 351 ! Lab 0 0 0 0 0 0 $8002 0 0 0 $8002 0 0 0 0 0 0 0 0 0 $8004 0 $8003 0 0 0 0 0 0 0 0 0 ! 352 - 383 0 0 0 0 0 0 0 $8004 0 $8003 $8006 0 0 0 0 0 0 0 0 0 0 $8002 0 0 0 0 0 0 0 0 0 0 ! 384 - 415 0 0 0 0 0 0 0 0 $800d 0 $8002 0 0 0 0 0 0 0 0 0 0 $8006 0 0 0 0 0 0 0 0 0 0 ! 416 - 447 0 0 0 0 0 0 0 $8003 $8006 0 0 0 0 0 0 0 0 0 0 0 0 $800e 0 0 0 0 0 0 0 0 0 0 ! 448 - 479 0 0 0 0 0 0 $8002 0 $8002 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 480 - 511 0 0 0 0 0 0 0 0 $8006 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 512 - 543 0 0 0 0 0 0 0 0 $8002 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 544 - 575 0 0 0 0 0 0 0 0 $8006 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 576 - 607 0 0 0 0 0 0 0 0 $8002 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 608 - 639 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 640 - 671 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 672 - 703 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 704 - 735 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 736 - 767 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 768 - 799 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0;! 800 - 831 #Ifdef GRAPHICS_ENABLED; Array darkmap --> 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 13 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 26 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 39 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 52 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 65 0 0 0 0 0 0 7 0 0 0 0 0 0 ! 78 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 91 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 104 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 117 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 130 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 143 0 0 0 0 0 0 0 0 0 0 0 0 0; ! 156 #Endif; Constant MAX_CARRIED = 14; Constant SACK_OBJECT = Rasp_Satchel; Constant period = "."; Constant period_newline = ".^"; Constant BUYING 1; Constant SELLING 0; Global savedloc = Wizards_Way; Global visionloc = 0; Global currvision = 0; Global initialvision = true; Global globalvision = false; #Ifdef SOUND_ENABLED; #Ifdef TARGET_GLULX; #Ifdef GRAPHICS_ENABLED; Constant GG_MAPWIN_ROCK 210; Global gg_mapwin = 0; Global g_fancy = true; #Endif; Constant GG_SOUNDCHAN_ROCK 410; Global gg_schan = 0; #Endif; Global play_sounds = true; Global soundsupport = true; Global volsupport = true; Global current_sound = 0; #Endif; Global sound_vol = 5; ! Tattler story constants Array tattler_stories -> 16; Constant AIRSHIP_DOCKING = 1; Constant WIZARD_SPLIT = 2; Constant DINOSAUR_CITY = 3; Constant FLYING_REPTILE = 4; Constant DRUNKEN_APPRENTICE = 5; Constant BRAZEN_THEFT = 6; Constant HADDOCK_RAIN = 7; Constant DOME_BREAKAGE = 8; Constant LORD_MAYOR = 9; Constant PLAYER_FLIGHT = 10; Constant YEKCAL_FLIGHT = 11; Constant TOWER_EXPLOSION = 12; Constant FREAK_EARTHQUAKE = 13; Constant HOUSE_ROBBERY = 14; Array tattler_images -> 47; Global tattler_image_current = 0; #Ifdef TARGET_GLULX; Replace DrawStatusLine; #Endif; Replace LockSub; Replace LookUnderSub; Replace TaskScore; Replace UnlockSub; Replace random; Constant WITHOUT_DIRECTIONS; Include "Parser"; ! We've defined our own CompassDirection so we can use "floors" to refer to the floor. Also, we want to remove 'sky' and 'ceiling' as we have our own ! sky and ceiling objects. CompassDirection n_obj Compass with short_name "north", door_dir n_to, name 'n//' 'north'; CompassDirection s_obj Compass with short_name "south", door_dir s_to, name 's//' 'south'; CompassDirection e_obj Compass with short_name "east", door_dir e_to, name 'e//' 'east'; CompassDirection w_obj Compass with short_name "west", door_dir w_to, name 'w//' 'west'; CompassDirection ne_obj Compass with short_name "northeast", door_dir ne_to, name 'ne' 'northeast'; CompassDirection nw_obj Compass with short_name "northwest", door_dir nw_to, name 'nw' 'northwest'; CompassDirection se_obj Compass with short_name "southeast", door_dir se_to, name 'se' 'southeast'; CompassDirection sw_obj Compass with short_name "southwest", door_dir sw_to, name 'sw' 'southwest'; CompassDirection u_obj Compass with short_name "up above", door_dir u_to, name 'u//' 'up' 'above'; CompassDirection d_obj Compass with short_name "ground", door_dir d_to, name 'd//' 'down' 'floor' 'floors' 'below' 'ground'; Include "calyx_adjectives"; Include "yesno"; #Ifdef SOUND_ENABLED; Include "illum.bli"; #Endif; ! Prices ! 25 jar ! 130 tyro ! 110 broomstick ! 5 carpet (unfixed) Constant HOOP_BUY 5; Constant BROOMSTICK_BUY 110; Constant REPAIR_CARPET 110; Constant SELLFIX_CARPET 160; Constant SADDLE_PRICE 300; Constant BUYFIX_CARPET 360; Constant AUTOCLIMBER_BUY 25; Constant KNOCKOUT_BUY 5; #Ifdef GRAPHICS_ENABLED; Constant N_MASK $1; Constant NE_MASK $2; Constant E_MASK $4; Constant SE_MASK $8; Constant S_MASK $10; Constant SW_MASK $20; Constant W_MASK $40; Constant NW_MASK $80; Constant U_MASK $100; Constant D_MASK $200; Constant IN_MASK $400; Constant OUT_MASK $800; #Endif; !------------------------------------------------------------------------------! Object LibraryMessages ! must be defined between Parser and Verblib with before [; Attack: if (noun == player) { if (verb_word == 'abuse') "This isn't really an appropriate time for self-abuse."; print "You briefly consider the idea of ending it all, but "; if (crystal has general && crystal.out == 0) "you're fairly certain that ", (the)crystal, " would find a way to follow and pester you."; "dismiss it out-of-hand. You're having far too much fun."; } if (noun has animate) "You're not certain of the question or all the possible solutions, but somehow, you just know that violence is ", (i) "not", " the answer"; print (The)noun, " seem"; if (noun hasnt pluralname) print "s"; " impervious to your particular brand of mindless violence."; Burn: "Ninario showed extreme foresight in providing you neither matches nor torches, thus keeping your apparent pyromaniacal tendencies in check."; Climb: "Wouldn't it be grand if all life's little puzzles could be solved by climbing things?"; Eat: if (noun has animate) "You're not nearly hungry enough to try that yet."; if (noun hasnt edible) "Your stomach has been rendered so delicate by two years of Worrell College food, followed by a year of alternate-Renaissance-era food, that you're fairly certain ", (the) noun, " would disagree with you."; rfalse; Jump: if (real_location == drain1) <>; if (location == peak_roof) "Looking over the edge, you realise it's just a bit too far to risk the jump to the brick house. You step away from the edge. ~Sensible decision,~ murmurs ", (the)crystal, ". ~We don't want you splattered all over the alley. Think of the mess.~"; print "You leap sprightly into the air.^"; if (Testscope(akbar)) "^~A wonderful effort!~ cries ", (the)akbar, ", ~but are you aware how much higher you could soar with a brand-new flying carpet under you?~"; if (Testscope(hermit)) { print "^~Hah!~ scoffs ", (the)hermit, " as he watches. ~That leap will never get you over any obstacles in your path. "; if (autoclimber in hermit_cabinet) print " That's why you need"; else print " Good thing you bought"; " the world's greatest and most versatile autoclimber. That contraption will have you up and over any obstacle in no time.~"; } if (Testscope(crone)) { "^~That's nothing,~ says ", (the)crone, ". ~Back in his apprentice days, Ninario could do three feet vertically and ten feet horizontally. Of course, when he was living on the residence food, those numbers were always wind-assisted.~"; } if (crystal has general && crystal.out == 0) { print "^~Is that meant to accomplish anything?~ asks ", (the)crystal, " curiously.^"; YesNo.Ask(JumpYes, JumpNo,0); } rtrue; 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: print "You express your frustrations gently and eloquently.^"; if (crystal has general && crystal.out == 0) "^~Too right", (murmurs)crystal, " in agreement."; rtrue; Pray: if (crystal.out == 1 or 2) "You bow your head in silent supplication."; "Things aren't nearly that desperate yet. You hold off on the supplications."; Rub: if (noun == player) "You give yourself a quick dusting off. There, much better."; if (noun has animate) print_ret (The) noun, " would likely find such behaviour strange and confusing."; print_ret (The) noun, " ", (isorare)noun, " clean enough, at least by your Ninario-tainted standards."; Sing: print "You belt out the lyrics to a few Oxbridge ditties.^"; if (Testscope(akbar)) "^~Wonderful attitude!~ cries Akbar. ~Who cares what people think of your singing ability? Just belt it out. But imagine how much better you'd sound from high atop a flying carpet!~"; if (Testscope(crone)) "^~Ouch!~ mutters ", (the)crone, ". ~Better hope there are no verbal component spells on your finals.~"; if (Testscope(hermit)) "^~No respect for the ears of the elderly, these kids today,~ mutters ", (the)hermit, (string)period; if (Testscope(guard)) "^", (The) Guard, " taps along in time with your singing. ~Ah dean't knaw th' worrds, but th' toon's reet keppy, fair eneeaf.~"; if (crystal has general && crystal.out == 0) "^~Oh dear", (murmurs)crystal, ", ~I don't know how on ", (i) "earth", " you're going to pass third-year chanting.~"; rtrue; Sleep: "It would be nice, but you've a job to do first."; Smell: if (noun == player) { "Your natural odours are under complete control; in fact, you smell rather nice."; } "You detect no out-of-place odours."; Sorry: print "You apologise profusely.^"; if (Testscope(crone)) "~Yes,~ sighs the crone. ~If you're Ninario's apprentice, learning to apologise is going to be important.~"; if (Testscope(hermit)) "~Well, I suppose it's all right,~ mutters ", (the)hermit, ". ~But don't forget, I'm used to solitude.~"; if (Testscope(guard)) print_ret (The)guard, " scowls down at you."; if (Testscope(betty)) "~No worries, luv,~ smiles ", (the)betty, "."; if(Testscope(akbar)) "~No, no,~ says ", (the)akbar, " earnestly. ~I'm certain the fault, whatever it may be, is all mine.~"; if (crystal has general && crystal.out == 0) "^~Why, that's all right,~ smiles ", (the)crystal, ". ~I know you mean well. It's your execution that's the problem.~"; rtrue; Strong: return L__M(##Miscellany, 38); Swim: print "There isn't really any suitable water around for swimming in. Besides, "; if (magic_clothes in player) print "those long flowing silk robes take"; else print "woven broadcloth takes"; " forever to dry."; Take: if (noun == player) "You're just not sure you can take yourself at all any more."; if (lm_n == 12) "Sadly, you're carrying too many things to take ", (the) noun, " as well."; rfalse; Taste: if (noun == player ) { print "Well, perhaps just a nibble...^"; if (Testscope(crone)) "^~Batty!~ mutters ", (the)crone, " to herself as you take a quick nibble of your arm. ~Completely batty.~"; if (Testscope(guard)) "^~Addle-pated,~ nods ", (the)guard, " to himself as you take a quick nibble of your arm."; if (Testscope(betty)) "^~I hope you're feeling all right, luv,~ says ", (the)betty, " anxiously, as you take a quick nibble of your arm."; if (Testscope(teller)) "^~Are you sure you're well, captain?~ asks ", (the)teller, " anxiously, as you take a quick nibble of your arm."; if (Testscope(hermit)) print_ret "^", (The)hermit, " watches you expressionlessly as you take a quick nibble of your arm."; if (crystal has general && crystal.out == 0) "^~You're far odder than I thought you were", (murmurs)crystal, ", eyeing you curiously. ~Even for one of Ninny's apprentices,~ she adds."; rtrue; } if (noun has animate) { if (noun == crystal) rfalse; "You're positive that would be one of the more disgusting and distasteful experiences of your life."; } rfalse; Think: "You pause to 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 help you get any further."; Touch: if (noun == player) { if (action_to_be == ##Kiss) { if (verb_word == 'hug' or 'embrace') { print "You wrap your arms around yourself, trying to glean some small measure of comfort from their embrace. You feel a bit better.^"; if (Testscope(crone)) print_ret (The)crone, " raises an eyebrow at your odd behaviour."; if (crystal has general && crystal.out == 0) print_ret (the)crystal, " gives a low cry of dismay and extends her tiny arms towards you. ~Oh, you poor dear,~ she murmurs, her voice tinged with sadness."; rtrue; } "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) { print "Turning "; if (noun == player) print "yourself on"; else print "on ", (the) noun; " is only going to complicate matters even further."; } rfalse; WakeOther: if (noun == player) <>; "That would presuppose ", (the) noun, " ", (isorare) noun, " asleep, which ", (ItorTheyAre)noun, " not."; Wave: if (noun == ball) <>; if (betty in location) "^~All right, luv?~ asks ", (the)betty, " watching you wave ", (the) noun, " about madly."; print "You wave ", (the) noun, " about madly, with no results.^"; if (Testscope(hermit)) "^~And you're certain you had to visit ", (i) "my", " shop?~ asks ", (the)hermit, " looking a trifle vexed."; if (Testscope(akbar)) "~My dear friend!~ cries ", (the)akbar, ". ~I'm very pleased to see you too!~"; if (Testscope(crone)) "^~This should be good,~ mutters ", (the)crone, ". ~I've never seen ", (i) "this", " spell before.~"; if (Testscope(captain) && captain.out == false) "^~Don't move about so much,~ grumbles ", (the)captain, ". ~It hurts my brain.~"; if (Testscope(guard)) "^~Keep thah 'ands wheear ah can see 'em!~ orders ", (the)guard, " sharply."; if (Testscope(teller)) "^~Er, yes,~ murmurs ", (the)teller, " watching you with a rather fixed smile."; if (crystal has general && crystal.out == 0) { new_line; print_ret (the)crystal, " frowns. ~That spell must be from a course I'm not familiar with,~ she mutters."; } rtrue; Miscellany: if (lm_n == 9) { print "^A pool of black inky darkness washes over you. It is now as black as pitch in here.^"; if (crystal has general && crystal.out == 0) { print "^~Goodness me!~ exclaims ", (the)crystal, ". ~That's black!~"; StartDaemon(ball); rtrue; } } if (lm_n == 19) { print "After your adventures in Vechlee last year, you and Ninario settled in Blumph and helped orchestrate the defeat of the Wizards Guild. The associated notoriety guaranteed you a spot in the apprenticeship program at Oxbridge University. As a novice, you're stuck with the first-years, but it's certainly making for a broadening of your Classics focus from back home.^"; if (magic_clothes in player) "^The fancy black silk robes with the moon and stars pattern certainly seem to suit you well, and you can't help but be pleased with the life you've made for yourself in your adopted home."; else { new_line; print (The)captain, "'s uniform is not as comfortable and familiar as your robes, and it's just a bit big on you. You do, however, look very smart and official wearing it.^"; } if (boots in player && boots has worn) "^The boots are simply the final touch."; rtrue; } if (lm_n == 26) { if (lm_o provides FakeObj) rtrue; if (lm_o has animate && action_to_be == ##Eat) rtrue; } if (lm_n == 32) "You can't do that to something you're not holding."; if (lm_n == 37) "That doesn't have much effect on inanimate objects."; if (lm_n == 44) "It's unclear what you're referring to."; ]; !==================================================================================================================================================== Include "VerbLib"; #Ifdef TARGET_GLULX; Include "infglk"; #Endif; Include "illum"; Class Askable class Ad_Item with information [person; ! Get rid of compiler warning. person = 0; rfalse; ], hint 0, Topics 0; Include "autodoor"; !==================================================================================================================================================== ! Globals and constants Attribute readable; Attribute is_coin; Attribute objseen; ! These are bitfield constants used in topic fields. These can be applied to any "Askable" object to help us track state. 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; ! Currently not in use, comment in if needed. !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 ROUGH_WOOD 100; Default SMOOTH_STONE 101; Default DAMP_STONE 102; Default ROUGH_STONE 103; Default SLIMY_STONE 104; Default STONE_TILES 105; Default DIRT 106; Default THICK_CARPET 107; Default COBBLES 108; Default LAWN_GRASS 109; Default METAL_GRATING 110; Default FLOWERS 111; Default AIRBORNE 112; Property Walls; Property Floor; !==================================================================================================================================================== ! Object classes Class airship_timer_class with time_left 0, time_out [i; tattler.total++; switch (self) { wizard_split_timer: i = tattler_images->0; i++; tattler_images->0 = tattler_images->0 + 3; tattler_images->i = wizard_split1; tattler_images->(i + 1) = wizard_split2; tattler_images->(i + 2) = wizard_split3; tattler_image_current = i; dinosaur_city_timer: i = tattler_images->0; i++; tattler_images->0 = tattler_images->0 + 2; tattler_images->i = dinosaur_city1; tattler_images->(i + 1) = dinosaur_city2; tattler_image_current = i; drunken_apprentice_timer: i = tattler_images->0; i++; tattler_images->0 = tattler_images->0 + 5; tattler_images->i = drunken_apprentice1; tattler_images->(i + 1) = drunken_apprentice2; tattler_images->(i + 2) = drunken_apprentice3; tattler_images->(i + 3) = drunken_apprentice4; tattler_images->(i + 4) = drunken_apprentice5; tattler_image_current = i; flying_reptile_timer: i = tattler_images->0; i++; tattler_images->0 = tattler_images->0 + 2; tattler_images->i = flying_reptile1; tattler_images->(i + 1) = flying_reptile2; tattler_image_current = i; brazen_theft_timer: i = tattler_images->0; i++; tattler_images->0 = tattler_images->0 + 5; tattler_images->i = brazen_theft1; tattler_images->(i + 1) = brazen_theft2; tattler_images->(i + 2) = brazen_theft3; tattler_images->(i + 3) = brazen_theft4; tattler_images->(i + 4) = brazen_theft5; tattler_image_current = i; haddock_rain_timer: i = tattler_images->0; i++; tattler_images->0 = tattler_images->0 + 3; tattler_images->i = haddock_rain1; tattler_images->(i + 1) = haddock_rain2; tattler_images->(i + 2) = haddock_rain3; tattler_image_current = i; dome_breakage_timer: i = tattler_images->0; i++; tattler_images->0 = tattler_images->0 + 3; tattler_images->i = dome_breakage1; tattler_images->(i + 1) = dome_breakage2; tattler_images->(i + 2) = dome_breakage3; tattler_image_current = i; lord_mayor_timer: i = tattler_images->0; i++; tattler_images->0 = tattler_images->0 + 4; tattler_images->i = lord_mayor1; tattler_images->(i + 1) = lord_mayor2; tattler_images->(i + 2) = lord_mayor3; tattler_images->(i + 3) = lord_mayor4; tattler_image_current = i; player_flight_timer: i = tattler_images->0; i++; tattler_images->0 = tattler_images->0 + 2; tattler_images->i = player_flight1; tattler_images->(i + 1) = player_flight2; tattler_image_current = i; yekcal_flight_timer: i = tattler_images->0; i++; tattler_images->0 = tattler_images->0 + 4; if (Top_Tree.storyadd == false) tattler_images->i = yekcal_flight1; else tattler_images->i = yekcal_flight_toptree1; tattler_images->(i + 1) = yekcal_flight2; tattler_images->(i + 2) = yekcal_flight3; tattler_images->(i + 3) = yekcal_flight4; tattler_image_current = i; tower_explosion_timer: i = tattler_images->0; i++; tattler_images->0 = tattler_images->0 + 3; tattler_images->i = tower_explosion1; tattler_images->(i + 1) = tower_explosion2; tattler_images->(i + 2) = tower_explosion3; tattler_image_current = i; freak_earthquake_timer: i = tattler_images->0; i++; tattler_images->0 = tattler_images->0 + 4; tattler_images->i = freak_earthquake1; tattler_images->(i + 1) = freak_earthquake2; tattler_images->(i + 2) = freak_earthquake3; tattler_images->(i + 3) = freak_earthquake4; tattler_image_current = i; } if (TestScope(tattler)) { DrawMap(); new_line; print (The) tattler, " glows briefly as a new story is added to it.^"; if (tattler hasnt general) { give tattler general; glk_set_style(style_Note); print "^[You can always read the newest story in the Tattler by typing ~read new story~]^"; glk_set_style(style_Normal); } if (tattler_images->tattler_image_current == dinosaur_city1 && crystal has general && tattler.dinoread == false && crystal.out == 0 && Testscope(tattler) && g_fancy == true && tattler has moved) { crystal_dino(); } } rtrue; ]; Class Substance class Askable with name 'chemicals' 'powders' 'substance', before [obj; 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 these 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 past experiments with Ninario that these kinds of compounds really need to be mixed in a ball mill."; ]; Class Purse class Askable with name 'bags' 'pouches', capacity 1, before [obj; 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 sellable class Askable with sale_value 0; class Cheese class Askable with name 'cheese' 'cheeses' 'piece' 'slice', adname 'of', article "a piece of", visionnum 0, information [person; switch (person) { betty: "~Well, we found a piece of Gorgonzola when we cleaned Ninario's robe. Apart from that, I can't tell you much about cheese.~"; crystal: "~Oh, I like all kinds of cheese,~ smiles ", (the)crystal, ". ~Even the ones that aren't good for tyromancy.~"; akbar: "~Thank you, but like Renaldo of the Wizards Guild, I'm lactose-intolerant.~"; crone: "~I don't dabble too much in tyromancy anymore,~ sighs ", (the)crone, (string)period; hermit: "~Cheese,~ mutters ", (the)hermit, ". ~Back on my mountaintop, no one ever pestered me with questions about cheese. Apart from you, on your one visit there,~ he adds, looking at you darkly."; captain: "~You can have my cheese when I slide senseless under the table,~ scowls ", (the)captain, ", ~and not before.~"; guard: "~No cheese enterin' on t'premises on mah watch!~ barks the guard sternly."; teller: "~I'm not much of a cheese person", (admits)teller, "."; } rfalse; ], has edible; class NPC class Askable with life [; Show: rtrue; Tell: rtrue; ], mesmer 0, orders [; HelpNPC: "~I'd love to help", (murmurs)self, ", ~but you'll have to be a bit more specific as to how.~"; ], nomatch [; if (self == hermit) print_ret "~Maybe I know something about that and maybe I don't,~ says ", (the)self, " defensively. ~But either way, I don't want to talk about it.~"; print_ret (The) self, " seems to know nothing about that."; ], has animate; Class Room with description "UNDER CONSTRUCTION", crystalvisit false, hoopsack_arrive false, before [; Touch: if (noun ofclass CompassDirection) { TouchWalls(noun, self.Floor, self.Walls); rtrue; } rfalse; ], #Ifdef GRAPHICS_ENABLED; map_offset 0, comp_mask 0, #Endif; compass_look [obj; TouchWalls(obj, self.Floor, self.Walls); rtrue; ], ! all rooms default to stone walls Walls SMOOTH_STONE, Floor SMOOTH_STONE, has light; Class RoomV with description "UNDER CONSTRUCTION", crystalvisit false, hoopsack_arrive false, before [; Touch: if (noun ofclass CompassDirection) { TouchWalls(noun, self.Floor, self.Walls); rtrue; } rfalse; ], #Ifdef GRAPHICS_ENABLED; map_offset 0, comp_mask 0, #Endif; compass_look [obj; TouchWalls(obj, self.Floor, self.Walls); rtrue; ], ! all rooms default to stone walls Walls SMOOTH_STONE, Floor SMOOTH_STONE, 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."; ], hoopsack_arrive false, Carpet_Go [; PlayerTo(Wizards_Way); MoveFloatingObjects(); rfalse; ], Walls OUTSIDE, Floor DIRT; Class OutroomV class RoomV ! 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."; ], hoopsack_arrive false, Walls OUTSIDE, Floor DIRT; Class Prop class Askable with before [; Consult: rfalse; Attack: rfalse; Close: rfalse; Eat: "You doubt ", (the)self, " would agree with your stomach."; Examine: rfalse; LookUnder: rfalse; Open: rfalse; Rub: rfalse; Search: <>; Smell: rfalse; Touch: rfalse; default: "You don't need to fidget about with ", (the) self, " like that."; ], FakeObj, has scenery; Class Furniture class Askable with before [; Take, Pull, Push, PushDir: print_ret (The) self, " ", (isorare) self, " too heavy for that."; ], FakeObj, has static supporter; !==================================================================================================================================================== ! The game objects Askable plotkin with name 'plotkin' 'cash' 'money', adname 'small' 'copper', description [; print "The plotkin is a small thin coin minted in copper with smooth unmilled edges. The obverse shows the profile of a regal looking fellow along with the inscription ", (i) "Turthalion: D G Rex F D.", " The reverse shows plumes in a coronet, with the word ", (i) "Plotkin", " above and the number ", (i) "1", " below.^"; if (plotkin in player) print "^You currently have ", self.current_qty, " of them.^"; if (self hasnt general) { give self general; print_ret (i) "^[You can check the amount of cash you're holding at any time by typing CASH or $ followed by ]"; } rtrue; ], transaction false, sing_name 'coin' 'plotkin', plur_name 'coins' 'plotkins', parse_name [wd qty b p s; qty = TryNumber(wn); if (qty >= 0) { b++; wn++; } wd = NextWord(); while (wd) { if (WordInProperty(wd, self, name) || WordInProperty(wd, self, adname)) b++; else if (WordInProperty(wd, self, plur_name)) p++; else if (WordInProperty(wd, self, sing_name)) s++; else break; wd = NextWord(); } if (qty < 0) ! TryNumber() didn't find a number if (s > p) qty = 1; else qty = self.current_qty; if (p+s) self.request_qty = qty; return b+p+s; ], current_qty 0, ! Number of coins in this object request_qty 0, ! Number requested by player article [; if (self.current_qty == 1) print "a single"; else print (number) self.current_qty; rtrue; ], short_name [; if (self.current_qty == 1) print "plotkin"; else print "plotkins"; rtrue; ], information [person; switch (person) { crystal: "~The plotkin is the unit of currency here in Thalion,~ says ", (the)crystal, ". ~The ten plotkin piece is minted in gold, the five in silver and the one plotkin coin is copper. They're all stamped with the head of Turthalion, and the inscription D G Rex F D. That stands for Dei Gratia Rex, Fidei Defensor, which means by the grace of God, King, Defender of the Faith.^ ^~Sadly, I'm not sure where we can get any more, short of selling something. Ninny is always having issues with the cash-flow situation. As he usually says, specifically, no cash is flowing. And he certainly won't qualify for credit anywhere,~ she adds."; crone: "~Legal tender here in Thalion,~ says ", (the)crone, ". ~If you haven't got plotkins, there'll be no talkin's, as they say.~ She frowns in distaste. ~Maybe they should stop saying that.~"; people: print "~What about them? They're the legal tender around here,~ says"; randcrowd(); rtrue; akbar: "~Oh, I love plotkins almost as much as I love rugs and carpets!~ beams ", (the)akbar, (string)period; betty: "~They're the unit of currency around here, luv,~ smiles ", (the)betty, (string)period; hermit: "~Legal tender around here,~ mutters ", (the)hermit, ". ~Tricky part is getting some.~"; captain: "~As long as I have enough plotkins to keep the pints coming", (murmurs)captain, " into his drink."; guard: "~Mah worrk deean't pay seea varry weel reet noo, but ah've got summat in t'works.~"; teller: "~The plotkin is the unit of currency here in Thalion,~ says ", (the)person, ", ~and we're always glad to take them off people's hands.~"; } rfalse; ], before [; ! Before any cmd for these coins if (self.current_qty == 0) "Sadly, you don't have any plotkins right now."; if (self.request_qty == 0) self.request_qty = self.current_qty; if (self.request_qty > self.current_qty) return L__M(##Miscellany, 42, self.current_qty); Taste: "Ouch! They're real. Tangy and coppery."; Give,Transfer: if (second ofclass NPC) { if (second == teller) { "~I'm afraid we're not accepting any regular deposits today,~ sighs ", (the)teller, ". ~We want to sort out what happened with the theft first.~"; } if (second == crystal) { if (crystal hasnt general) "You're not sure ", (the) crystal, " would be terribly interested right now."; if (crystal.out == 0) "~That's very kind of you,~ she says, ~but I can't really spend it very well in here. You hang on to it for now.~"; } if (second == crone) "~No, no,~ says the crone. ~No charity. Ask me about the item you want to buy, and I'll name my price.~"; if (second == betty) "~That's right kind of you, luv,~ says ", (the)betty, ", ~but we're all right for plotkins, mum and I.~"; if (second == akbar) { if (self.request_qty == REPAIR_CARPET) { if (Testscope(Red_Carpet) && Red_Carpet hasnt general) akbar.FixYes(); } "~I'm afraid that's not nearly enough for any of the rugs or carpets we have in stock,~ sighs ", (the)akbar, ", ~but feel free to browse.~"; } if (second == hermit) { if (autoclimber in hermit_cabinet) { <>; } print "~You bought everything I had in stock already!~ cries Robert. ~You've cleaned me out.~^"; if (crystal has general) print "^~One item?~ asks Crystal disbelievingly. ~He had one single item in stock?~^"; rtrue; } } rfalse; ], adjust [qty playerbuying; ! if we're buying, playerbuying is 1. If selling, it's 0 if (playerbuying) { if (qty <= self.current_qty) self.current_qty = self.current_qty - qty; else rfalse; } else { self.current_qty = self.current_qty + qty; } self.transaction = true; #Ifdef SOUND_ENABLED; PlaySound(coins, 1); #Endif; rtrue; ], has pluralname is_coin; !==================================================================================================================================================== ! Wizard's Way area Outroom wizards_way "Wizard's Way" with description [; #Ifdef GRAPHICS_ENABLED; if (location hasnt visited) { RevealBlumph(self.map_offset); } #Endif; "The population of this northeastern corner of the city increased with the influx of renegade wizards seeking refuge from the Wizards Guild. With the dissolution of the guild, many have returned to their original dwellings, leaving their hastily built, slipshod houses in Blumph to fall into disrepair. Apart from Ninario's crumbling brick house to the north, only one other in the area looks inhabited, a squat brownstone house to the west.^^Southwest, the cobbled road rises up towards Blumph's high street. To the east, it peters out to a dirt track. A small wooden sign sits at the side of the road leading east."; ], #Ifdef GRAPHICS_ENABLED; map_offset 75, comp_mask SW_MASK, #Endif; Carpet_Go [; PlayerTo(High_Street); MoveFloatingObjects(); rfalse; ], compass_look [obj; if (obj == d_obj) <>; if (obj == n_obj) <>; if (obj == sw_obj) <>; if (obj == e_obj) <>; if (obj == w_obj) <>; return self.Outroom::compass_look(obj); ], Floor COBBLES, nw_to [; "You investigate the buildings briefly, but none of them are sturdy enough that you'd risk entering."; ], ne_to [; <>; ], se_to [; <>; ], cant_go "You can head southwest to the high street, but the route east to Vechlee looks a little too long and dusty to attempt on foot.", e_to [; "You glance at the sign, which reads ", (i) "Vechlee: 40 miles", ", and reconsider. You'll need a faster means of transportation than your feet."; ], n_to [; <>; ], w_to [; <>; ], u_to [; <>; ], sw_to [; print "You head southwest, the road climbing steadily up to the noise and bustle of the high street.^"; return High_Street; ], has proper; Askable -> Vechlee_Sign "sign" with name 'notice' 'message' 'sign' 'post', adname 'small' 'wooden', description [; print "The sign is mounted on a stout wooden post wedged securely between the cobblestones at the side of the road.^"; new_line; <>; ], information [person; return dirt_track.information(person); ], before [; Read, Search: font off; print "Vechlee: 40 miles^"; font on; rtrue; Take, Pull, Push, Pushdir, Transfer: "The sign is wedged securely between the cobblestones."; ], has scenery readable; Prop -> dirt_track "dirt track" with name 'track' 'road', adname 'dirt', description "Unfortunately, the route east to Vechlee looks a little too long and dusty to attempt on foot.", information [person; switch (person) { crystal: "~Forty miles is a rather long trek,~ sighs ", (the)crystal, ". ~We'd better find some alternate transport. We don't have two days to spare.~"; akbar: "~Forty long grueling miles!~ cries ", (the)akbar, ". ~Think how much quicker that trip would be with a genuine flying carpet underneath you?~"; people: print "~You may think it's insignificant, but that little dirt road goes all the way to "; if (location == Market_Square) print "Blumph"; else print "Vechlee"; print ", young'un,~ sniffs"; randcrowd(); rtrue; crone: "~The dirt road here from Vechlee? Trust me youngster, it's no easy trek, especially carrying a load of conjuring commodities.~"; betty: "~It's a long way here from Vechlee,~ sighs ", (the)betty, ". ~I walked all the way, carting all the leftover stock from Wizardry Wooding, too.~"; hermit: "~Oh it was certainly a long, dry and dusty walk here from Vechlee,~ says ", (the)hermit, ". ~I had to sit in the pub for a good long spell restoring my tissues.~"; teller: "~Oh, it's a long dusty walk to Blumph from here,~", (admits)teller, "."; } rfalse; ], before [; Enter, Go, Use: <>; ]; Prop -> buildings "abandoned buildings" with name 'buildings' 'houses' 'dwellings', adname 'abandoned' 'slipshod', description "The buildings have fallen into serious disrepair with the departure of the inhabitants. It looks like the thrill of living in former wizard dwellings doesn't appeal to the general Blumph populace, as no one's moved in, despite the burgeoning real estate market.", after [; Examine: if (crystal has general) "^~Slap four walls together, drop a roof on top, and hold it all together with magic", (murmurs)crystal, ". ~Don't you love wizardly architectural features, such as the way it all falls apart after they move out?~"; ]; Prop -> ninhouse "Ninario's crumbling brick house" with name 'building' 'house', adname 'crumbling' 'brick' 'ninario^s' 'nin^s' 'ninny^s', description "Ninario's crumbling brick house seems more decrepit than some of the abandoned buildings around here. The large double doors are firmly closed.", information [person; switch (person) { crystal: print "~"; if (location ~= Wizards_Way) print "Ninny's house? It's back in Wizard's Way, but "; "I doubt he'll let us back in until we've accomplished his errand,~ sighs ", (the)crystal, ". ~Besides, I've known him go for days without answering the door.~"; people: switch (random(5)) { 1: print "~Oh, I believe it's up in Wizard's Way,~ smiles"; 2: print "~Wizard's Way, northeast corner,~ mutters"; 3: print "~I've never actually been there,~ confesses"; 4: print "~That eyesore is one of the big reasons for the drop in property values,~ complains"; 5: print "~Oh, Ninny's house? He's done a great job fixing up the old place,~ smiles"; } randcrowd(); rtrue; crone: "~Bit of a shambles, isn't it?~ sighs ", (the)crone, ". ~That's why I refuse to visit him there. Well, that and the lack of privacy,~ she adds, looking rather pointedly at you."; akbar, betty, hermit, captain: "~His house is up in Wizard's Way, isn't it?~ asks ", (the)person, (string)period; } rfalse; ], has proper; Prop -> nindoors "elaborately carved wooden doors" with name 'doors' 'door', adname 'elaborate' 'carved' 'wooden' 'large' 'double' 'ninario^s' 'nin^s' 'ninny^s', description "The elaborately carved wooden doors are decorated with the image of a hand thrusting a wand into the air. The doors are firmly closed.", before [; Enter, Open: "Ninario's doors are firmly closed and locked."; Knock: #Ifdef SOUND_ENABLED; PlaySound(knock, 1); #Endif; print "Silence answers your knock.^"; if (crystal has general) { new_line; ninhouse.information(crystal); } rtrue; Unlock: "The fact Ninario didn't provide you with a key may be his gentle hint that he doesn't want you coming back until you've retrieved that interplanar rift analyser."; ], react_before [; Knock: if (noun == nothing) { print "(on the ", (name)self, ")^"; <>; } rfalse; ], has pluralname door openable locked lockable; Prop -> carving "elaborate carving" with name 'carving' 'hand' 'wand' 'image', adname 'elaborate', description "It's not at all the sort of ostentatious display you'd associate with Ninario. In fact, you'd expect something more along the rabbit line.", information [person; switch (person) { crystal: if (location == Wizards_Way) print "~I"; else print "~That carving on Ninny's door? Yes, i"; "t's not at all what you'd expect, is it? But don't forget, Ninny didn't build the house, he just fixed it up. Well, when I say fixed it up, stopped it from being in ", (i) "immediate", " danger of falling down.~"; } rfalse; ]; Prop -> brownstone "squat brownstone house" with name 'building' 'house', adname 'squat' 'brownston' 'brown' 'stone', description "The squat brownstone building looks neat and carefully looked after. A large archway leads into an interior terraced area, but the closed wrought-iron gate tells you visitors are probably not welcome.", before [; Enter, Open, Unlock: <>; default: rfalse; ], information [person; switch (person) { crystal: if (location == Wizards_Way) "~It's probably best not to mess with that brownstone house at all. Anyone with that spiky of a gate is probably a little prickly by nature.~"; "~The one by Ninny's place? That gate looked a little imposing, didn't it?~"; } rfalse; ]; Prop -> terraced_area "terraced area" with name 'terrace' 'area', adname 'terraced', description "The terraced area beyond the gate is a large open area leading to the various parts of the house.", before [; Enter, Open, Unlock: <>; default: rfalse; ]; Prop -> gate "wrought-iron gate" with name 'gate' 'spike' 'spikes' 'archway', adname 'wrought-i' 'wrought' 'iron' 'dangerous', description "The archway is blocked by a large wrought-iron gate that bars entry into the terrace. A series of dangerous-looking spikes line the top.", attempts 0, information [person; return (brownstone.information(person)); ], before [; Enter, Open, Unlock: #Ifdef SOUND_ENABLED; PlaySound(gatetry, 1); #Endif; "You tug at the wrought-iron gate, but it's firmly locked, and you don't have the key."; Climb: if (crystal hasnt general) "As you place your hands on the gate, a small cough sounds in the vaults of your mind. You pause and look around suspiciously."; if (self.attempts == 5) "A single glance from ", (the)crystal, " as you step towards the gate makes you reconsider."; self.attempts++; if (self.attempts == 5) print_ret (the)crystal, "'s stream of invective is of such a high and abusive order that any attempt to reproduce it would fail to do it justice. Suffice to say, you are left white, trembling, and certain of your desire not to climb over the gate."; if (self.attempts == 4) print "~Look, Ninny junior,~ says ", (the)crystal, " bluntly. ~I figure hanging around with you while you wreak whatever havoc is coming Blumph's way in the course of this escapade is my best chance to get myself out of this blasted glass bubble, so if you think I'm going to idly stand by and watch you impale yourself on this gate just so you can get inside a house that hasn't even proven to have anything to do with our assignment, you're sadly mistaken. Step away from the gate, now!~"; if (self.attempts == 3) print "~You know what I hate?~ asks ", (the)crystal, " loudly. ~Those particular types of people who don't listen to what you're saying and just go ahead blindly with their own misguided agenda.~"; if (self.attempts == 2) print "~I find it fascinating,~ says ", (the)crystal, ", just a bit acerbically, ~how eager some people seem to be to permanently endanger a chapter in their life that likely hasn't even been opened yet. Are you aware of just how much injury those spikes could inflict?~"; if (self.attempts == 1) print "~It's interesting,~ says ", (the)crystal, " conversationally, as you place a hand on the gate, ~just how much those spikes along the top look like they're poised in groin-piercing readiness.~"; "^^You let go of the gate and reconsider."; ]; !==================================================================================================================================================== ! High Street area Outroom High_Street "Blumph High Street" with description [; if (location hasnt visited) { give crone objseen; give akbar objseen; #Ifdef GRAPHICS_ENABLED; RevealBlumph(self.map_offset); #Endif; } "Filled with upmarket shops and bustling crowds, the high street offers a commanding view of the rest of town. East, steps lead down into a small elegant shop labelled ", (i) "Conjuring Commodities,", " and north lies the garish, opulent, and carpet-festooned entrance to ", (i) "Honest Akbar's Carpet Emporium.", " To the northwest, a long road descends towards the pier. ^^You can spot numerous ships at anchor in the bay, bobbing gently on the blue water. The dirigible docks seem emptier, a lone airship swaying gently on its anchor cable.^^The marketplace, with more shops and services, lies a short distance to the west. To the south lies the residential district, a labyrinthine warren of closely packed houses and narrow laneways. Southeast, a long meandering road, neatly bordered by manicured hedges and white stones, heads into the ritzy housing estates of Blumph Heights. Northeast lies Wizard's Way, and the now largely-abandoned homes of Blumph's wizards."; ], #Ifdef GRAPHICS_ENABLED; map_offset 137, comp_mask NE_MASK | S_MASK | SE_MASK | E_MASK | N_MASK | W_MASK | NW_MASK, #Endif; Floor COBBLES, compass_look [obj; if (obj == w_obj) <>; if (obj == n_obj) <>; if (obj == e_obj) <>; if (obj == se_obj) <>; if (obj == nw_obj) <>; if (obj == ne_obj) "The cobbled road steadily descends down towards Wizards Way."; if (obj == s_obj) <>; return self.Outroom::compass_look(obj); ], Carpet_Go [; PlayerTo(Pier); MoveFloatingObjects(); rfalse; ], before [; Go: #Ifdef SOUND_ENABLED; SoundStop(); #Endif; rfalse; ], cant_go [; print_ret (name)conj_commod, " is to the east, while ", (name)honest_akbars, " lies to the north. South, the road descends into the residential district, while southeast leads to the ritzy Blumph Heights area. The marketplace lies west, and the pier is to the northwest. Wizard's Way is to the northeast."; ], ne_to [;print "You follow the steadily descending road down towards Wizard's Way, the noise and bustle of the high street fading behind you.^"; return wizards_way; ], s_to [; #Ifdef GRAPHICS_ENABLED; blumphmap-->399 = blumphmap-->399 & (~NODRAW_FLAG); #Endif; print "The road descends rapidly from the high street down into the residential streets, the sharp concentration of hawkers and shoppers diluting into a quieter, gentler crowd.^"; return Oak_Street; ], se_to [; #Ifdef GRAPHICS_ENABLED; blumphmap-->369 = blumphmap-->369 & (~NODRAW_FLAG); #Endif; print "The noise and bustle of the high street fade as you head southeast along the gently meandering road to Blumph Heights.^"; return Blumph_Heights; ], e_to [; print "You descend the smoothly-worn steps into the quiet calm of ", (name)conj_commod, ".^"; return conj_commod; ], d_to [; <>; ], n_to [; print "You push your way through the rugs and carpets at the entrance, and into the muffled quiet of ", (name)honest_akbars, ".^"; return honest_akbars; ], w_to [; #Ifdef GRAPHICS_ENABLED; blumphmap-->333 = blumphmap-->333 & (~NODRAW_FLAG); #Endif; print "You push your way west through the crowds into the town marketplace.^"; return Shops; ], nw_to [; #Ifdef GRAPHICS_ENABLED; blumphmap-->269 = blumphmap-->269 & (~NODRAW_FLAG); #Endif; print "You head down the long, gently-sloping road to the pier.^"; return Pier; ]; Prop -> market_scen "marketplace" with name 'market' 'marketpla' 'shops' 'services' 'businesse', description "The marketplace lies just to the west. From past experience, you know it to have a small but eclectic mix of shops and services.", information [person; switch (person) { crystal: "~The marketplace is not too bad,~ says ", (the)crystal, ". ~Much more to offer than Vechlee, especially with all the businesses that relocated to Blumph when all the wizards moved here, of course.~"; crone: "~The marketplace is all right,~ sniffs ", (the)crone, ". ~Of course, everyone knows the upmarket shops are in the high street.~"; people: switch (random(6)) { 1: print "~I hate the marketplace,~ growls"; 2: print "~If you can't get it in the marketplace, you can't get it anywhere,~ declares"; 3: print "~It's great,~ smiles"; 4: print "~It's better than anything that dump Vechlee has to offer,~ sniffs"; 5: print "~Not enough shops ", (i) "or", " services,~ mutters"; 6: print "~I love shopping in Blumph,~ smiles"; } randcrowd(); rtrue; akbar: "~Oh, the marketplace is a wonderful mix of shops! cries Honest Akbar. ~I love going there to shop... when I'm not selling superb quality rugs and carpets at superb prices, that is.~"; betty: "~We have a wonderful marketplace here in Blumph, luv. And the rent is much cheaper than Vechlee.~"; hermit: print_ret (The)hermit, " shudders when you mention the marketplace. ~All those customers, milling around, coming into the shop. It's horrible!~"; captain: "~I love the marketplace,~ says ", (the)captain, ". ~It keeps the crowds away from the pub.~"; } rfalse; ], before [; Enter, Go, Use: <>; ]; Prop -> honest_akbars_scen "Honest Akbar's Carpet Emporium" with name 'akbar^s' 'abkar^s' 'mosque' 'carpets' 'shop' 'store' 'doorway' 'entrance' 'emporium', adname 'garish' 'carpet' 'honest' 'persian', description "A multitude of intricately woven carpets hang outside the entrance to this shop. The entryway is a large opening reminiscent of the dome of a mosque, though done up in a disappointingly garish and commercial fashion, doubtless to appeal to the store-going public.", information [person; switch (person) { crystal: "~Honest Akbar's is ", (i) "the", " place for rugs and carpets,~ says ", (the)crystal, ". ~Honest Akbar inherited the store from his uncle, and actually ", (i) "is", " a reputable and honest salesman. He's purged the stock of the cheap imitation carpets and sells the real deal these days. More expensive, naturally.~"; people: switch (random(6)) { 1: print "~Dratted Persian frippery,~ growls"; 2: print "~I love it in there. It's so peaceful and the carpets are so beautiful,~ smiles"; 3: print "~Lovely carpets, but so very expensive,~ sighs"; 4: print "~Honest Akbar's is better than anything that dump Vechlee has to offer,~ sniffs"; 5: print "~I never knew you could spend 500 plotkins for a tiny square of rug until I went in there,~ complains"; 6: print "~Isn't Blumph ", (i) "so", " cosmopolitan? I love that we have shops like that here. Not that I'd buy anything there--too, well, foreign for my liking,~ smiles"; } randcrowd(); rtrue; crone: if (Red_Carpet has general) "~Didn't I say he knows his stuff? Who else could have repaired such a miserable excuse for a flying carpet?~"; "~Oh, Honest Akbar will be able to repair your carpet, I have no doubt. He really knows his stuff. The prices are a bit steep, though.~"; akbar: "Honest Akbar smiles broadly. ~We are proud to be the most honest rug and carpet merchant in all of Blumph. Actually, I took over the store when my uncle Akbar retired, and between you and me, there was some very shabby management going on. Not to mention the garish storefront, which I've toned down quite a bit. But that's all behind us now. We sell the best Persian rugs and carpets money can buy. And we'll service anything. If we can't make it fly, well then, it's probably not a flying carpet.~"; betty: "~Honest Akbar's a nice fellow, but I'm afraid the prices are so high, I just never go in his store. He gets some laundry done here from time to time, though.~"; hermit: print_ret (The)hermit, " shrugs. ~Honest Akbar doesn't come in here pestering me, wanting to buy things, so that makes him all right in my book,~ he declares."; captain: "~Flying carpets!~ sneers ", (the)captain, " derisively. ~Who would go by flying carpet when airship travel has so much to offer?~"; } ], before [; Enter, Go, Use: <>; ], has proper; Prop -> conj_commod_scen "Conjuring Commodities" with name 'shop' 'conjuring' 'commoditi' 'store', adname 'small' 'elegant', description [; "Steps lead down into this small elegant shop. It looks very similar to the ", (i) "Sorcery Supply", " shop in Vechlee, though its more elegant exterior matches with the more upscale surroundings of the high street."; ], information [person; switch (person) { crystal: if (real_location == conj_commod) "~This place is apparently very similar to her store in Vechlee. It looks like a neat little shop,~ smiles ", (the)crystal, ", gazing around."; if (conj_commod has visited) print "~Well, you've been in there,~ shrugs ", (the)crystal, ". ~You probably know as much as I do; it's"; else { print "~Well, ", (name)conj_commod; if (High_Street hasnt visited) print " in the high street"; print " is actually"; } " run by the woman who owned Sorcery Supply in Vechlee. She moved here when all the wizards did. Still, I think business is slowing down as science slowly supplants magic.~ She pauses and giggles. ~Oh, and apparently, she and Ninny step out together on occasion.~"; people, crone, betty, akbar, hermit, captain: <>; } rfalse; ], before [; Enter, Go, Use: <>; ], has proper; Prop steps "smoothly-worn steps" with name 'steps', adname 'smoothly' 'worn' 'smoothly-', description [; if (real_location == conj_commod) "The steps lead back outside."; "The steps lead down into ", (name)conj_commod, (string)period; ], before [; Enter, Go, Use: if (real_location == conj_commod) <>; <>; ], found_in conj_commod High_Street, information [person; switch (person) { crystal: if (location == conj_commod or High_Street) "~The steps? You're asking me about the steps now? Well, they appear to go up and down. Any more than that, you'll just have to find out for yourself.~"; crone: "~They go back outside,~ says", (saysharp)crone, ", ~and if you're going to pester me with these sorts of questions, perhaps you should consider using them.~"; people: if (location == High_Street) "Everyone in the crowd seems to agree that the steps lead into ", (name)conj_commod, (string)period; rfalse; } rfalse; ]; !==================================================================================================================================================== ! Conjuring Commodities Room conj_commod "Conjuring Commodities" with description [; #Ifdef GRAPHICS_ENABLED; if (location hasnt visited) { RevealBlumph(self.map_offset); } #Endif; "This dank and dim shop is a far cry from the proprietor's old Sorcery Supply shop in Vechlee. The cold, dark stone floors and dim lighting make it difficult to see into the corners, but the smell of incense and various magical chemicals and powders lend the shop a heady aroma that mixes with the cold damp smell of the walls, making your head spin. West is the doorway back to the high street, whose bright sunshine and loud crowd seem a distant memory."; ], #Ifdef GRAPHICS_ENABLED; map_offset 139, comp_mask W_MASK | OUT_MASK, #Endif; Walls DAMP_STONE, Floor DAMP_STONE, compass_look [obj; if (obj == w_obj) "The bustle of the crowd outside seems muffled and distant."; return self.Room::compass_look(obj); ], before [; Exit: if (player in location) <>; rfalse; Go: if (noun == w_obj) { give Crone ~general; 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 west back to the high street.", out_to [; <>; ], u_to [; <>; ], w_to [; ! stop her being mesmered if we leave crone.mesmer = 0; switch (random(9)) { 1: print "~Come again, young apprentice!~ calls ", (the)crone, " as you leave.^^"; 2: print "~Cast carefully,~ calls ", (the)crone, " as you head out the door.^^"; 3: print "~Be sure to come back and check out our competitive prices on flying equipment!~ calls ", (the)crone, " as you step out.^^"; 4: print "~Say hello to your master for me,~ says ", (the)crone, " as you step out.^^"; 5: print "~Tell that master of yours not to be such a stranger,~ advises ", (the)crone, " as you leave.^^"; 6 to 9: ; } print "You step back out of the dank, dark shop into the brilliant sunshine and harsh sounds of the high street.^"; return High_Street; ]; Furniture -> Rocking_Chair "rocking chair" with name 'chair', adname 'worn' 'creaky' 'crone^s' 'rocking', description "A worn and creaky rocking chair.", capacity 1, information [person; if (person == crone) <>; rfalse; ], before [; Enter: "You're not certain ", (the)crone, " would appreciate you sitting on her lap."; Examine: rfalse; Knock: "~Don't bother knocking! This chair's still a-rocking!~ cackles ", (the)crone, (string)period; Listen: <>; default: "~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'm likely dead.~"; ], describe [; new_line; return crone.initial(); ], react_before [; Knock: if (noun == nothing) <>; rfalse; Listen: if (noun == nothing) <>; rfalse; ]; ! FLAG_x 1-10 (1-8 here, 9 in black dress information, 10 in selfobj) NPC -> -> Crone "old crone" with name 'crone' 'bat' 'woman' 'lady' 'luv' 'vendor' 'clerk' 'clark' 'shopkeep' 'shopkeepe' 'keeper', adname 'old', article "an", description [; "Her plain black dress speaks to thrift and simplicity, and the deep creases lining her face to a lifetime of experiences. Moving her shop to Blumph seems to have been good for her though, as her eyes sparkle with life and intensity, matching your piercing gaze.^ ^She suddenly starts, as though she's seen something in your face that surprises her. ~Ah,~ she says after a moment, a sad smile coming over her face as she flicks a glance at ", (the) crystal, (string)period; ], Chat 0, Topics 0, Ballask [; self.Topics = self.Topics | FLAG_x1; print "The old crone's gaze falls on the cheap glass ball, and she leans forward in morbid fascination, leaving you unsure for a moment if she's heard you.^^~Disturbing,~ she murmurs. ~I thought these sorts of things weren't done anymore. Some particularly sick wizards, Renaldo among them, used to use the souls of young girls or boys to extend their own span of years. Well, a few bright but depraved ones had the idea of stockpiling young people for future use by encasing them in things like this, then breaking the spell and using the body, nice and fresh, a few hundred years on. What you do is create a tiny pocket universe to house this tiny scene. This one is more ornate than most, but I expect Ninario, being a humanitarian, has added the creature comforts.~^ ^She straightens up in her chair again. ~Don't get it near any interdimensional portals or rifts. And you certainly shouldn't put it in your satchel. If you mix it with ", (i) "any", " type of transdimensional feature, you could end up destroying both the ball and the feature.~^"; ], PostBall [; if (self.Topics & FLAG_x2 == FLAG_x2) print "^~I'm still burned up about that Renaldo!~ mutters "; else print "^~That scum Renaldo!~ mutters "; if (crystal has general) print (the)crystal; else print "an irritated feminine voice in the silence of your mind"; if (self.Topics & FLAG_x2 == FLAG_x2) ". ~That sick excuse for a wizard is going to have to be taken care of.~"; self.Topics = self.Topics | FLAG_x2; ". ~Keeping me around so he could extend his own miserable life. Good thing Ninny won me in that card game.~"; ], information [person; switch (person) { crystal: print "~"; if (real_location == conj_commod) print "Looking at her now, "; print "I can't believe she and Ninny are a bit of an item,~", (giggles)crystal, ". ~Seems funny to think of Ninny being in love, somehow.~^"; if (real_location == conj_commod) "^You glance at ", (the)crone, ", not wanting to be seen gossiping, but it appears ", (the)crystal, " was right; no one else can hear her."; rtrue; people: switch (random(6)) { 1: print "~She has some useful things for sale,~ admits"; 2: print "~Her new place is a bit smaller than her shop in Vechlee, but she has a better selection,~ smiles"; 3: print "~Lovely magical equipment, but so very expensive,~ sighs"; 4: print "~Her shop is better than anything that dump Vechlee has to offer,~ sniffs"; 5: print "~I never knew you could spend 100 plotkins for some squeezed weeds until I went in her shop,~ complains"; 6: print "~She should just close that shop down. Doesn't she know magic is dying?~ grumbles"; } randcrowd(); rtrue; crone: "~Oh, still going strong,~ smiles ", (the)crone, ". ~Slowing down a bit as old age sets in, but made it through the move to Blumph all right, and visitors are slowly picking up again.~ She pauses and frowns. ~Hold on, I've forgotten if we were talking about me or the shop.~ She gives a wry smile. ~Though I guess everything I said is applicable to either one.~"; akbar: "~A lovely little shop, run by a lovely little lady!~ beams Honest Akbar. ~I wouldn't even dream of mentioning how her shoddily-built cut-price brooms eat into the flying carpet sales.~"; betty: "~Oh, her little magic shop in the high street is lovely, isn't it? Actually, my shop in Vechlee used to be right around the corner from hers, and then we both moved to Blumph. Small world, isn't it?~"; hermit: "~She runs a nice, quiet little shop,~ shrugs ", (the)hermit, ". ~She sends a bit of business my way now and again, and I try to do likewise. And she never pops in for a surprise visit, which suits me fine.~"; captain: "~Magic shops! Old crones!~ mutters ", (the)captain, ". ~Machines and science, that's where the future is, my friend, not in old bats and their brooms.~"; teller: "~We miss her now that she's moved to Blumph,~ smiles ", (the)teller, "."; } rfalse; ], initial [; if (real_location hasnt visited) { self.Chat = 0; give self general; "~Greetings, young apprentice!~ calls the shopkeeper, ", (a)self, " sitting in a rocking chair. ~Welcome to ", (name)conj_commod, ", the ", (i) "only", " place to buy spellcasting paraphernalia... especially since I closed my shop in Vechlee.~"; } if (conj_commod.hoopsack_arrive == true) { conj_commod.hoopsack_arrive = false; "~Huh,~ mutters ", (the)crone, " almost to herself. ~I guess you've figured out how to use that tin hoop.~"; } if (self hasnt general) { self.Chat = 0; give self general; switch (random(7)) { 1: "~Greetings, young apprentice!~ calls ", (the)crone, " cracklingly as you step into the shop. ~And young friend,~ she adds, nodding at ", (the) crystal, (string)period; 2: "~Not wearing your bearskin rug today?~ asks ", (the)crone, " as you step into the shop. ~After you wore that around town, I couldn't go a week without some student stumbling in wearing one.~ She cackles loudly in amusement."; 3: "~What happened to that rusty helmet you had back in Vechlee?~ asks ", (the)crone, " curiously. ~Sell it to the museum?~"; 4 to 7: switch (random(100)) { 1 to 20: "~Come in, come in,~ calls ", (the)crone, " as you enter."; 21 to 30: "~Ah, Ninario's apprentice,~ says ", (the)crone, ", ~perhaps seeking items for a school project. Or running more errands for the world's most slovenly wizard.~"; 31 to 50: "The old crone nods at you from her rocking chair as you step into the shop."; 51 to 70: "The old crone gives you a sad smile as you enter. She seems to feel sorry for you."; 71 to 80: "The old crone 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 have it,~ says ", (the)crone, " as you step into the shop. ~Welcome to ", (name)conj_commod, ", your cryptic community for conjuring commodities.~ She pauses with a look of distaste. ~That's not any better than the last slogan,~ she mutters."; 91 to 99: "~If we don't have it, then you can't cast anything useful with it,~ says ", (the)crone, ". ~", (name)conj_commod, " has Blumph's largest supply of aftermarket magic accessories. Er, also the ", (i) "only", " supply, so if you want it, you'll have to buy it here.~"; 100: "The old crone is staring intently at a piece of paper, muttering to herself as you step into the shop. ~Let's see, Elvish sword of great antiquity in the living room, along with the lamp. Knife upstairs. A coil of rope? I'd better check with Robert at Lonely Mountaintop Supply. And an Oriental rug? Honestly, who dreams these things up? Well, I'll forward this to Akbar, maybe he can get hold of one. Hmm.~^^She starts suddenly as she sees you, and hides the piece of paper away quickly, but not before you spot the words ", (i) "For shipment to white house", " at the top."; } } } print "The old crone "; switch (random(3)) { 1: "sits and rocks slowly back and forth on her chair."; 2: "sits and rocks in her chair, keeping an eye on you."; 3: "is here, intent on her chair-rocking duties."; } ], each_turn [; if (self.mesmer ~= 0 && location == conj_commod) { switch (self.mesmer) { 1: "^~Whoa...~ murmurs ", (the)crone, " suddenly, gazing at her hands in surprise. ~Magic!~"; 2: "^The old crone gazes around the room, her eyes unfocused. ~Look at all the magical colours!~ she giggles."; 3: "^The old crone peers curiously at her rocking chair, a glassy look in her eyes. ~Wow. I never knew this chair was magical.~"; 4: "^~Where are all the pretty colours going?~ sighs ", (the)crone, " sadly."; 5: self.mesmer = 0; "^The old crone shakes her head suddenly. ~Sorry,~ she mutters, looking a bit embarrassed. ~Don't know what came over me there.~"; } } if (self.Chat == 1 && location == conj_commod) { switch (random(50)) { 1 to 10: print "^The old crone brushes down the front of her plain black dress."; 11 to 20: print "^The old crone cackles quietly to herself as she rocks back and forth."; 21 to 25: print "^The old crone glances up at you briefly."; 26 to 30: print "^~Toe of frog,~ mutters ", (the) self, ", glancing at a piece of paper in her hand. ~How provincial.~"; 31 to 35: print "^The old crone sighs and shifts slightly in her rocking chair."; 36 to 40: print "^The old crone jots something down on a piece of paper and nods approvingly."; 41 to 45: print "^~Are we going to do any"; if (plotkin.transaction == true) print " more"; print " business here today?~ asks ", (the)crone, " suddenly, ~or are you just going to 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 "^~Too hot?~ asks ", (the)crone, " suddenly, her head cocked to one side as if listening to someone far away. ~Does Sarah ", (i) "ever", " listen? I told her last week: cool it with a baboon's blood, then the charm is firm and good.~ She clicks her tongue in annoyance. ~Why don't people listen?~"; 50: print "^~Hah!~ cackles ", (the)crone, ", looking at a piece of paper in her hand. ~That silly woman! I've told her so many times not to make bargains when someone's shaking a snow globe, but does she listen? Of course not, she just goes ahead and overpays drastically for something.~"; } new_line; } self.Chat = random(3); rtrue; ], before [wd bk; Consult: wn = consult_from; wd = NextWord(); switch (wd) { 'sarah', 'recipes': "~Oh, Sarah's just a friend of mine who gets her recipes wrong all the time.~"; 'cheese-fu', 'psychedel', 'journeys': "~Tyromancy used to be my favourite method for psychedelic journeys back in my Oxbridge days,~ shrugs ", (the)crone, ". ~Certainly the cheapest.~"; 'cheapest': "~A piece of cheese and a bowl of scrying won't set you back much, even on a student's budget,~ confides ", (the)crone, (string)period; 'credit': "~No credit!~ snaps ", (the)crone, ". ~Especially not for apprentices.~"; 'extra-dim': "~You know, objects that bend time and space. Or both. Seven-league boots, bags of holding, that sort of thing.~"; 'aimfiz': "~Aimfiz is an old spell that transports you to the location of someone else,~ muses ", (the)self, ", ~but I don't follow how it could be related to the hoop. Especially not in combination with blorple.~"; 'blorple': "~Blorple was used to explore an object's mystic connections, if I recall,~ muses ", (the)self, ", ~but I don't follow how it could be related to the hoop. Especially not in combination with aimfiz.~"; 'espnis', 'espnis-in', 'scrolls': "~Espnis is a generic sleep spell,~ shrugs ", (the)crone, ". ~The scrolls used to be a dime a dozen, but with the way the magic supplies are drying up, they're impossible to find these days.~"; 'drying': "~Not a lot of new research, you see,~ confides ", (the)crone, (string)period; 'busker', 'hurdy', 'hurdy-gur': "~Don't see too many of them around these days", (admits)crone, ". ~One of my sisters sells magical hurdy-gurdies and hasn't shifted one in ages.~"; 'sister', 'sisters', 'forever': "~My sisters? Oh, they've been around forever, just like me.~"; 'determini': "~I don't understand the principle myself", (admits)crone, ", ~but from what I've heard, the magical vision is generated through tyromancy the first time you put a given cheese in. If you put the same cheese in later, it replays the same vision. It's like when you ask a busker to play a tune a second time.~"; 'buying', 'selling': "The old crone sighs. ~It's pretty simple. You ask me about the item you're interested in buying or selling, we agree on a price, and then you buy it from me, or sell it to me. Oh, and then you pester me with a few silly questions for good measure.~"; 'steep': "~Yes, a bit steep, as I said.~"; 'prices': "~My prices are perfectly in line and reasonable,~ snaps ", (the)crone, ". ~Honest Akbar's, on the other hand...~"; 'marketing', 'agreement', 'muscle', 'lawyers': "~What can I say?~ shrugs ", (the)crone, ". ~Mr Wizard's marketing department has a lot of muscle around here. And they hire the best lawyers.~"; 'millinery': "~You know,~ prompts ", (the)crone, ", ~millinery shops: where you buy clothing, shirts, undergarments, caps, and many other things we don't sell here.~"; 'sorcery', 'supply': "~You have to move where the market is", (admits)self, ", ~and when it moved to Blumph, I closed down Sorcery Supply, and followed.~"; 'sad', 'smile', 'sorry': "The sad smile crosses ", (the)crone, "'s face again. ~I can't tell you, my dear. But be strong.~ Her eyes glance at ", (the)crystal, " again."; 'prophecy', 'future': "~Sell me the snow globe,~ says ", (the)crone, " looking earnestly into your eyes. ~Leave it here with me and collect it later. There is much sorrow written here. Sorrow, and misery beyond endurance.~"; 'sorrow', 'misery', 'just', 'upright', 'needs': "~I've said too much already", (murmurs)self, ", ~but let me add this. I think the two of you will always do what is upright and just, without regard for your own needs.~"; 'barter', 'bartering': "~No trades,~ says ", (the)crone, " firmly."; 'haggling', 'bartering', 'barter', 'bargain', 'bargainin', 'haggle', 'deal', 'trade', 'discount', 'sale': <>; '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 "~Apprentices?~ The old crone'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 right here in Blumph too, if you can believe that,~ she adds."; 'shop', 'vechlee', 'blumph': "~Blumph's not a bad spot for a shop, as most cities go,~ shrugs ", (the) self, ". ~Not much different than Vechlee. Of course, most of the wizards moved to Blumph to avoid the guild, so I had to follow. That's my target market.~"; 'thalion', 'country', 'land', 'world': "~Free, fertile, fast-growing, progressive", (murmurs)self, ". ~That's everything that Thalion is, at least with the Wizards Guild in hiding.~"; 'bowl', 'scrying', 'silver': "~Ah yes, I hope that bowl turned out all right for you,~ smiles ", (the)self, ". ~Don't have any others, sadly.~"; 'rope', 'coil', 'elvish', 'sword', 'lamp', 'brass', 'lantern', 'nasty', 'nasty-loo', 'knife', 'paper': "~Oh, I sold all the trophy case items I had in Vechlee,~ says ", (the)crone, ". ~Sold the trophy case too, all to an Implementor who wandered through. He wanted it for a white house he's building nearby. Just sent the shipment off today, in fact.~"; 'implement', 'white', 'house', 'zork': "~Oh, you never know what those Implementors are up to,~ says ", (the)crone, " with a touch of frustration. ~They've been pretty quiet for a number of years, though.~"; 'zorkmid', 'zorkmids': "~A what-mid?~ asks ", (the)crone, (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 tempting idea, but perhaps it's best if I stick to what I know.~"; 'magic': "~It's dying out, being replaced by science. Still, if wizards become alchemists, they'll still need supplies, and I'll be here, selling to them.~"; 'Ninario', 'nin', 'ninny', 'romance', 'slovenly': if (self.Topics & FLAG_x3 == FLAG_x3) "~No, my dear, trust me. You and the young lady don't want to hear about what old biddies like your master and I used to get up to. You have your own tales to create, the two of you.~"; self.Topics = self.Topics | FLAG_x3; "~Ninario the wizard? He and I are ", (i) "very", " old friends,~ says ", (the)crone, ". ~The main word being ", (i) "old", ",~ she adds, cackling. ~But really, I doubt you want to hear too much about the old days of romance.~"; 'plumber^s', 'union', 'plumber', 'plumbers': if (self.Topics & FLAG_x4 == FLAG_x4) print "~Well, as I said,~ explains ", (the) self, ", ~t"; else print "~The Plumbers Union?~ echoes ", (the) self, ". T"; self.Topics = self.Topics | FLAG_x4; "hey're on the ascendancy. Traditional magic is dying out and being replaced by scientific solutions. I wouldn't be surprised if I have to rebrand the shop as Chemistry Commodities in the near future.~"; 'science': if (self.Topics & FLAG_x5 == FLAG_x5) print "~Well, as I said,~ explains ", (the) self, ", ~i"; else print "~I"; self.Topics = self.Topics | FLAG_x5; "~t's definitely on the ascendancy. Traditional magic is dying out and being replaced by scientific solutions. I wouldn't be surprised if I have to rebrand the shop as Chemistry Commodities in the near future.~"; 'practices', 'sinister', 'informati': <>; 'chemistry': "~It's very popular these days. People are finding out new things all the time. But you know all about that. You helped demonstrate the extreme dangers of mixing WizStrip and methane.~"; } do { wn = consult_from; bk = ParseToken(SCOPE_TT, AskableScope); } until (bk ~= GPR_REPARSE); if (bk == GPR_FAIL) "~I'm not certain what you're asking me about", (admits)self, (string)period; if (bk.information(self) == true) rtrue; "~I try not to worry about ", (itorthem)bk, ",~ declares ", (the)self, (string)period; Bargain: "~What? You want a discount?~ cries ", (the) self, ". ~I'm already giving you a chance to buy rare adventuring articles at low, low prices!~"; Buy: "She'd really only be of interest to an antique collector now."; BuyFrom: if (noun == self) <>; Kiss: if (self.Topics & FLAG_x6 == FLAG_x6) { print "The old crone waves you away. ~One kiss is already more than anyone of your age should have to bestow on anyone of mine,~ she says.^^~Too right!~ agrees "; if (crystal has general) print (the)crystal; else print "an irritated feminine voice in the silence of your mind"; ". ~Once only, sweet and kind of cute. Twice, getting a bit creepy.~"; } self.Topics = self.Topics | FLAG_x6; print "You bestow a chaste kiss on ", (the)crone, "'s leathery cheek. ~Oh-ho!~ she cackles disturbingly. ~The charms of the wily old crone melt the stubborn heart of the student.~^^~Aw,~ says "; if (crystal has general) print (the)crystal; else print "a sweet feminine voice in the silence of your mind"; ", ~aren't you sweet?~"; Listen: print_ret "The old crone makes no noise, save for the slow quiet creaking of her rocking chair."; MeetNPC: print_ret "The old crone flashes a grim smile at you. ~The giving of names is also a giving of power. You'll not get mine so easily.~"; SellTo: if (second == ball or crystal) { if (crystal hasnt general) rfalse; if (self.Topics & FLAG_x7 == FLAG_x7) "~Please", (murmurs)crystal, ", looking earnestly at you. ~Don't leave me here. Whatever's going to happen, I want to face it with you.~^ ^~You can't ignore a look like that,~ sighs ", (the)crone, ". ~Never mind, young student. You hang on to her, and treasure her while you can.~"; self.Topics = self.Topics | FLAG_x7; "~No!~ cries ", (the)crystal, ". ~You're going to need me, I know you will.~^^~Ten plotkins,~ says ", (the)crone, " firmly. ~Leave her here with me.~"; } if (second == Rasp_Satchel) return Rasp_Satchel.information(crone); if (second ofclass Sellable) { ! Red_Carpet can be sold without mesmer if (second == tyro or extract or broomstick) { <>; } if (second == Red_Carpet) { print "~Huh,~ mutters ", (the)crone, ", looking with distaste at the carpet. ~Pretty ratty-looking magic carpet, but "; if (Red_Carpet has general) print "it looks functional.~"; else print "maybe Honest Akbar can get it working for me.~"; } if (crone.mesmer ~= 0 && second == saddle) { second.sale_value = SADDLE_PRICE; Achieved(4); print "~Wow!~ cries ", (the)crone, " eagerly, snatching the saddle from you. ~A gem-encrusted magic saddle, ", (i) "including", " the optional pterosaur-capable appurtenances! I've never seen anything like it! I'll give you ", second.sale_value, " plotkins for it.~"; } else if (second == saddle) { <>; } print " She takes ", (the) second, " from you, "; randplacetext(); print " ", (ItorThem)second, " in the display case, and hands you ", second.sale_value, " plotkins in return.^"; plotkin.adjust(second.sale_value, SELLING); if (second == Red_Carpet && Red_Carpet has general) Red_Carpet.sale_value = BUYFIX_CARPET; else second.sale_value = second.sale_value * 2; move second to case; MoveFloatingObjects(); rtrue; } <>; Smell: "The old crone doesn't smell terribly clean."; Smile: "The old crone flashes a toothy grin back at you."; Talk: "The old crone looks at you expectantly."; Take, Remove, Search, Transfer: "The old crone cackles and smacks your hand away. ~No you don't, my dear.~"; Thank: "~You're welcome, my dear.~"; Touch: if (self.Topics & FLAG_x8 == FLAG_x8) "The old crone 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_x8; "~Touch", (murmurs)self, " as you raise a hand to her leathery cheek, ~one of the most informative, yet least-used form of human interaction.~ She raises a hand in return to caress your face, and starts in surprise as she does so. ~Ah,~ she says sadly, as though learning something. Her glances flickers to ", (the)crystal, " momentarily, and she smiles sadly."; ], nomatch [; "~I'm not sure I can tell you anything too useful,~ shrugs ", (the)self, (string)period; ], life [; Answer: if (noun == 'hello' or 'hi') <>; print_ret (The)self, " fixes you with a beady eye. ~What did you want, my young apprentice?~"; Give: <>; Show: if (noun ofclass sellable) <>; if (noun ofclass Cheese) { print "~Well,~ muses ", (the)crone, ", looking critically at ", (the)noun, ", ~it's certainly a fine piece of cheese, but I "; if (tyro in case) "find I just don't have the same enthusiasm for cheese-fueled psychedelic journeys I used to.~"; "just sold my ", (name)tyro, ", and I ditched my stock of scrying bowls quite a while back. I'm afraid I just don't see myself engaging in any tyromancy.~"; } switch (noun) { plotkin: if (children(Case) == 0) "~Goodness, a student of Ninario's with money,~ says ", (the)crone, ". ~Don't let him know. He'll swipe it to cover ", (i) "apprenticeship tax levies", " or some other similarly made-up expense.~"; "The old crone's eyes light up. ~Well, let's do some business, shall we? Ask me about the item you're interested in.~"; default: print "~No,~ replies ", (the)crone, ", shaking her head firmly. ~I don't think I want to carry "; if (noun has pluralname) "those.~"; "that.~"; } Tell: if (WordInProperty(second, Red_Carpet, name) || WordInProperty(second, Red_Carpet, adname)) { if (Red_Carpet has general) "~Oh, you had it repaired, did you? Well good for you. I wouldn't go too high with it though.~"; "~Doesn't work, you say? Perhaps Honest Akbar can sort that out for you.~"; } if (WordInProperty(second, ptero, name)) "~Really?~ asks ", (the)crone, " disinterestedly. It sounds like she doesn't believe you."; if (second == 'me' or 'myself' or 'you' or 'yourself') "~A most fascinating story,~ says ", (the)crone, ", looking at you with a little more interest."; if (second == 'Ninario' or 'nin' or 'ninny') "~Hah!~ snorts ", (the)crone, ", glancing slyly up at you. ~So the old coot has you running his errands for him again, does he?~"; if (second == 'buying' or 'selling') "~Hah!~ snorts ", (the)crone, ". ~Trust me, there's nothing you can tell me about ", second, " merchandise that I don't already know.~"; print_ret "~Very interesting,~ says ", (the)crone, ". ~But why don't we talk about doing some buying or selling instead?~"; ], orders [; Give: <>; MeetNPC: <>; Open: if (noun == Case) { if (children(case) == 0) "~There's not much point. It's empty,~ sighs ", (the)crone, (string)period; "~Oh no,~ says ", (the)crone, ". ~Close examination of the merchandise only ", (i) "after", " you prove you can pay for it. Don't get me started on what happened the last time a student just 'wanted to look.'~"; } Sell: <>; SellTo: <>; Show: if (noun in case) "~Oh no,~ says ", (the)crone, " ~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.~"; else "~Just examine it yourself,~ sighs ", (the)crone, ". ~I have some important chair-rocking to do here.~"; 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)crone, ". ~Allow me to demonstrate.~"; ], react_before [; Buy: if (second ~= nothing or crone) rfalse; if (noun == dress or Rocking_Chair) { "~Business isn't quite that bad yet, youngster. I think I'll be hanging onto ", (the) noun, " for now.~"; } if (noun == Case) { if (children(Case) == 0) "~The display case is not for sale,~ says ", (the)crone, " firmly."; "~Just let me know which item you're interested in,~ says ", (the)crone, (string)period; } if (noun == self) rfalse; if (noun in case) { if (plotkin.adjust(noun.sale_value, BUYING) == false) "The old crone shakes her head. ~I'm afraid my price is firm at ", noun.sale_value, " plotkins. Come back when you have enough, I don't deal on credit.~"; move noun to player; if (noun == extract) Achieved(5); if (noun == broomstick) { ! Reset anchor hints for later clues anchor.hint = 0; Achieved(25); } if (noun == tyro) Achieved(8); if (noun == Hoop) Achieved(12); if (noun == nobbler) Achieved(14); MoveFloatingObjects(); print "~Done,~ says ", (the)crone, ", taking ", noun.sale_value, " of your plotkins and handing you the ", (name)noun, " from the display case."; noun.sale_value = noun.sale_value / 2; new_line; rtrue; } "The old crone frowns. ~I'm afraid ", (ItorTheyAre)noun, " not mine to sell, young student.~"; Sell: <>; ], has animate female transparent; Prop -> -> -> Dress "plain black dress" with name 'dress', adname 'plain' 'shapeless' 'ordinary' 'black', description "It's a rather ordinary plain black dress.", information [person; switch (person) { crystal: if (conj_commod has visited) { print "~It "; if (location == conj_commod) print "i"; else print "wa"; print "sn't exactly the height of fashion, "; if (location == conj_commod) print "i"; else print "wa"; print "s it?~ murmurs Crystal.^"; if (location == conj_commod) { if (crone.Topics & FLAG_x9 == FLAG_x9) "^~Hey!~ says", (saysharp)crone, ". ~I see that look. Lay off the criticisms of the wardrobe!~"; crone.Topics = crone.Topics | FLAG_x9; print "^~Hah!~ cackles ", (the)crone, ", spotting the smile on ", (the)crystal, "'s face. ~I can guess what you're saying. Your time will come for the shapeless black dress stage of life, my dear.~^"; } rtrue; } crone: "~Doesn't show the dirt,~ mutters ", (the)crone, ", looking down at the dress."; } rfalse; ], before [; Disrobe, Take: "~Not for sale,~ snaps the crone as you reach for the dress. ~It's all I have to wear.~"; Examine: rfalse; default: "You don't need to worry about the dress."; ], has clothing worn; Furniture -> Case "glass display case" with name 'case' 'cabinet' 'shelves' 'items' 'merchandi', adname 'display' 'glass', description [; print "The glass display case fills one wall of the shop. The interior is lined with "; if (children(self) == 0) "several empty shelves."; print "shelves, upon which you see "; WriteListFrom(child(self), ENGLISH_BIT); print_ret (string)period; ], initial [; print "A glass display case"; if (children(self) == 0) print ", devoid of merchandise,"; else print " with some merchandise in it"; " covers the far wall of the shop."; ], information [person; switch (person) { crystal: if (location == conj_commod) { if (children(self) == 0) "~She doesn't have much stock, does she?~ murmurs ", (the)crystal, ", looking into the empty display case."; "~Looks well-made, doesn't it?~ says ", (the)crystal, ", glancing at it."; } if (conj_commod has visited) "~The old crone's display case? What about it?~ asks ", (the)crystal, ". ~If you're so interested, we can pop back there and have a look.~"; crone: print "The old crone pats the display case affectionately. ~Well, once that Implementor bought the trophy case and all the items I had in Vechlee, I needed a new merchandise display. I found this one in the wreckage of the Wizards Guild Hall.~"; if (children(self) == 0) " She frowns suddenly at its empty state. ~I guess I need some new merchandise.~"; " She gazes at the contents of the display case. ~If you're interested in purchasing anything, just ask.~"; people: switch (random(8)) { 1: print "~I know way too much about it, I helped her drag it here from Vechlee,~ mutters"; 2 to 3: print "~Not much I can tell you, I'm afraid,~ shrugs"; 4 to 6: print "~I don't know anything about it,~ declares"; 6 to 7: print "~I never shop there,~ confesses"; 8: print "~Has she updated those boring old magic items to something new and interesting?~ asks"; } randcrowd(); rtrue; akbar: "~A lovely array of items can usually be found in her display case,~ admits Honest Akbar. ~But have you noticed she doesn't carry any rugs ", (i) "or", " carpets?~"; betty: "~Actually, she had Wizardry Wooding make that display case,~ says ", (the)betty, " proudly. ~That was before we went out of business, of course~. She sighs. ~Poor Wizardry Wooding. It turns out being endorsed by the Wizards Guild isn't great for business once the Guild gets stamped out. We shut down soon after.~"; } rfalse; ], before [; Attack: "Your attack bounces harmlessly off the case.^^The old crone cackles. ~Did you think expensive magic merchandise would be easy to steal?~"; Close, Lock: "The display case is already closed and locked.^ ^The old crone shakes a finger at you. ~Stop fiddling about with that case.~"; Open, Unlock: "The old crone slaps your hand away. ~If you're interested in something, ask.~"; Rub: "You give the glass trophy case a quick polishing with a corner of your attire.^ ^The old crone glances sharply at you. ~Are you ", (i) "sure", " you're a wizardry student?~ she asks pointedly."; Search: <>; ], has ~supporter container transparent; Sellable -> -> extract with name 'jar' 'spensewee' 'extract' 'ointment' 'unguent' 'healing' 'salve' 'spense' 'weed', adname 'small' 'green' 'sickly' 'healing' 'of', sale_value 25, description [; if (self has general) print "This small jar contains an ointment made from the extracts of the spenseweed plant. It's good for general aches and pains. Sadly, it only contains enough ointment for one application. Also, it's one of those cheap commercial preparations, doubtless containing artificial colouring and preservatives."; else print "A small jar of some unidentified substance."; if (self has open) print " The jar is open, revealing a sickly green ointment."; new_line; rtrue; ], short_name [; print "small jar"; if (self has general) print " of spenseweed extract"; rtrue; ], invent [; ! When listing objects in player's inventory if (c_style & FULLINV_BIT) { print (name)self; rtrue; } ], information [person; switch (person) { crystal: if (ptero has general) "~It really did the trick on that ", (name)ptero, ", didn't it?~"; if (conj_commod hasnt visited) "A tiny frown crosses ", (the)crystal, "'s face. ~I think ", (name)conj_commod, " sells small jars of spenseweed extract. Good for aches and pains.~"; if (self in location || self in player || (self in Rasp_Satchel && Rasp_Satchel in location or player)) { if (self hasnt general) print "~Hmmm, it looks to me like a jar of"; else print "~It's"; } else { if (self in case) print "~The jar ", (the)crone, "'s selling?"; else print "~That jar of ointment?"; print " It's"; } give self general; print " spenseweed extract. Good for healing aches and pains"; if (Park has visited) { print ". I wonder if it would help "; if (real_location == park) print "this poor ", (name)ptero; else print "that poor ", (name)ptero, " in the park"; "?~"; } ".~"; crone: give self general; if (self in case || self in location || self in player || (self in Rasp_Satchel && Rasp_Satchel in location or player)) print "~That's a healing salve, d"; else print "~The jar? That was ointment d"; print "istilled from the spenseweed plant.~ She sighs. ~Of course, back in the heyday of magic, I used to sell ", (i) "greater", " spenseweed. That could cure anything, even death, but nobody can even find it these days. Used to grow on rocky clifftops, but all the accessible ones have long since been picked clean.~^^She shrugs. ~This salve isn't nearly that good, but it works on general aches and pains. "; ! Do this so we can ask about greater spenseweed after hearing about it give greater_spenseweed objseen; if (self in case) "This rare single use jar, painstakingly hand-extracted, sells for ", self.sale_value, " plotkins. Definitely not one of those cheap commercial preparations.~"; else "Probably one of those commercial preparations full of artificial colouring and preservatives,~ sniffs ", (the)crone, ", ~so I'm afraid I'm not very interested in purchasing it.~"; akbar: "~If you owned a fine Persian rug or carpet, you'd have no need of spenseweed for those little aches and pains,~ confides Honest Akbar. ~A rug or carpet from Honest Akbar will ease your discomforts, large or small.~"; betty: "~Spenseweed extract?~ echoes ", (the)betty, ". ~Nasty stuff if you spill it on your robes! The stains don't come out easily.~"; hermit: "~Spenseweed extract is good for getting rid of aches and pains,~ says ", (the)hermit, ". ~I should keep a jar around here for when customers come in.~"; people: print "~Spenseweed? "; switch (random(4)) { 1: print "Good for all your aches and pains,~ smiles"; 2: print "Cures those nagging discomforts, but still not a patch on greater spenseweed from days gone by,~ sighs"; give greater_spenseweed objseen; 3: print "Another one of these overrated folk remedies if you ask me,~ sniffs"; 4: print "Oh, it's worked wonders on my creaking bones,~ confides"; } randcrowd(); rtrue; captain: give greater_spenseweed objseen; "~Don't talk to me about spenseweed,~ mutters ", (the)captain, ". ~I'm forever getting charter requests from groups looking to land on mountaintops and go searching for spenseweed, greater or otherwise. Talk about aches and pains.~"; } rfalse; ], before [; Drink: "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: "The jar is already full of spenseweed extract, and you're not certain adding ", (the) noun, " to the mix would create any new kind of taste sensation."; PutOn: if (self notin player) { print "(taking ", (the) self, " first)^"; ; } if (second == player or magic_clothes || (second == uniform && uniform in player)) { print "You don't"; } else { if (second has animate) { if (second == crone) "~No, no,~ says ", (the)crone, ", waving you away. ~Don't bother with ", (i) "my", " aches and pains. That one small jar isn't nearly enough.~"; if (second == ptero) { if (ptero.mesmer == 0) { print (The)ptero, " snaps at you with its beak. It doesn't seem to realise you're trying to help it.^"; if (crystal has general) "^~Animal husbandry of pterosaurs isn't exactly something one gets a lot of chance to practice, is it?~ sighs ", (the)crystal, ". ~If only we had a way to distract it.~"; rtrue; } else { Achieved(6); give ptero general; remove self; print "While ", (the)ptero, " is distracted by the snow globe, you liberally apply the sickly green ointment to its injured wing. As you spread the last of the ointment over the wound, the jar vanishes, a handy consequence of the Thalionic Antimagic Litter Campaign.^ ^The spenseweed extract must work fast, for as you finish, the pterosaur breaks off gazing at the snow globe and looks down at its wing in surprise, and gives a soft caw of approval.^"; StartDaemon(ptero); ptero.mesmer = 0; if (crystal has general) "^~I've always liked people who are gentle with animals,~ sighs ", (the)crystal, ", sounding a bit dreamy. You can only assume the falling snow is affecting her as well."; rtrue; } } "That sort of thing should be done only by two consenting adults."; } print "As far as you can tell, ", (the) second; if (second has pluralname) print " don't"; else print " doesn't"; } print " have any aches and pains that need to be taken care of.^"; if (crystal has general) "^~Speaking of aches and pains, let's smear it on Renaldo if we find him,~ mutters ", (the)crystal, (string)period; Receive: "That wouldn't really work too well."; Search: <>; Smell: if (self has open) "The sickly green ointment has the unpleasant smell of rotting vegetation."; else "The closed jar seems to keep the smell of the ointment locked in, which is probably a good thing."; Use: if (second == nothing) { if (ptero in real_location) <>; "You're not certain what aches and pains to use it on around here."; } <>; Wear: <>; ], after [; Open: "You unscrew the lid from the jar, revealing a sickly green ointment with an unpleasant odour."; Close: "You screw the lid back on, sealing the ointment and, more importantly, the smell, back in."; Examine: give self general; rtrue; ], has openable transparent; Sellable -> -> tyro with !name 'squat' 'cuboid' 'machine' 'mr' 'mister' 'wizard' 'portable' 'tyromancy' 'deluxe' 'crank' 'hole' 'cube' 'box' 'tyro', sale_value 130, parse_name [wd num; ! this parse_name routine prevents 'wizard' by itself from matching the machine wd = NextWord(); if (wd == 'wizard') { num = 200; !fake value we can spot later wd = NextWord(); } while (wd == 'squat' or 'cuboid' or 'machine' or 'mr' or 'mister' or 'wizard' or 'portable' or 'tyromancy' or 'tyro' or 'deluxe' or 'crank' or 'hole' or 'cube' or 'container') { num = num + 1; wd = NextWord(); } if (num == 200) return -1; return num; ], used false, description [; if (self has general) print "The much-ballyhooed ", (name)self; else print "This squat machine"; print " is nothing more than a cuboid metal container, with a crank jutting from the side. There's a large hole in the top, presumably for dropping things in. "; if (children(self) ~= 0) { print "Peering in, you can see "; WriteListFrom(child(self), ENGLISH_BIT); } else print "It is currently empty"; print_ret (string)period; ], short_name [; if (self has general) print "Mr Wizard Portable Tyromancy Deluxe"; else print "squat cuboid machine"; rtrue; ], information [person; switch (person) { crystal: if (conj_commod hasnt visited) "~Actually, there's supposed to be some new type of tyromancy machine available. I expect ", (name)conj_commod, " would carry something like that.~"; if (self in case && location == conj_commod) { if (self hasnt general) print "~Oooh!~ says ", (the)crystal, " excitedly. ~A"; else print "~It's a"; } else { print "~That machine"; if (self in case) print " ", (the)crone, "'s selling"; print "? It's a"; } give self general; print_ret " ", (name)self, ", for all your cheesy vision needs. Drop the cheese in, and turn the crank.~"; crone: give self general; if (self in case) "~Tired of your mundane existence as an apprentice? Have some cheese to spare? Then ditch your dingy old scrying bowl, and transcend the bounds of time and space with ", (the)self, ", the world's ", (i) "only", " portable tyromantic machine. Lovingly hand-crafted using the latest scientific techniques, this item produces tyromantic effects while leaving the cheese intact. This rare and one-of-a-kind item is fun for the whole family. Yours for only ", self.sale_value, " plotkins.^ ^~Sorry,~ she mutters, slowing down from her sales pitch. ~My marketing agreement with Mr Wizard says I have to pitch it like that. Nice item, though. Just stick the cheese in and turn the handle. And unlike the scrying bowl, it's deterministic, so the same piece of cheese always gives the same vision on subsequent viewings.~"; else { if (self in location || self in player || (self in Rasp_Satchel && Rasp_Satchel in location or player)) "The old crone fixes you with a critical eye. ~You want to sell me a used ", (name)self, "? One owner already, and a student at that, so it's likely been used hard. And me, I prefer the traditional scrying bowl approach, like most folks. No, I don't think I'm interested in repurchasing it. Besides, why should you get rid of it? Drop some cheese in and give it a go.~"; "~Mr Wizard makes all sorts of magical devices, but it's only recently they've started branching out into science. I'm sure you'll be very happy with ", (the)self, ".~"; } people: if (conj_commod hasnt visited) rfalse; "No one in the crowd seems to know or care much about ", (the) self, (string)period; akbar: "~I too have visited the future through cheese!~ cries Honest Akbar excitedly. ~And you know what I saw? ", (i) "You,", " yes, ", (i) "you,", " as the proud owner of a lovely Persian rug or carpet.~"; betty: "~You wizarding types and your cheese!~ smiles ", (the)betty, " tolerantly."; hermit: "~Mmm, cheese...~ murmurs ", (the)hermit, ". ~Imagine wasting perfectly good cheese on divination! Tyromancy. Hah!~"; captain: "~Divine the future all you want,~ shrugs ", (the)captain, ", ~just not with my piece of cheese.~"; } rfalse; ], capacity 1, before [obj ks; ReachIn: if (children(self) ~= 0) { obj = child(self); ks = keep_silent; keep_silent = true; ; keep_silent = ks; "You reach into ", (the) self, " and take ", (the)obj, (string)period; } Receive: if (child(self)) { ks = keep_silent; keep_silent = true; print "(taking ", (the)child(self), " out first)^"; obj = child(self); ; keep_silent = ks; } if (noun == Red_Carpet or magic_clothes or Broomstick or autoclimber or uniform or boots or plank or lead) print_ret (The) noun, " ", (isorare)noun, " too big to fit into ", (the) self, (string)period; Search: <>; Push,Pull,Turn: if (children(self) == 0) "Nothing happens when you turn the crank, but that isn't too surprising, as ", (the) self, " is empty."; obj = child(self); if (obj ofclass Cheese) { print "As you turn the crank, "; if (self hasnt general) give self general; if (self.used == false) { self.used = true; Achieved(9); #Ifdef SOUND_ENABLED; PlaySound(crank, 1); #Endif; print "you hear the turning of tiny gears and elaborate machinery inside ", (the) self, ". For a moment, nothing happens. Then, the machine begins to glow, bathing you in an otherworldly light that expands to surround the whole area. T"; } else print "t"; print "he world around you fades, and another place, another time, takes its place.^"; CheeseVision(obj); rtrue; } #Ifdef SOUND_ENABLED; PlaySound(crankbad, 1); #Endif; print "As you turn the crank, you hear the ineffectual turning of tiny gears from inside the machine, as it tries desperately to explore the tyromantic properties of ", (the) obj, ", but it's no use. "; if (obj has pluralname) print "They"; else print "It"; " must not be cheesy enough."; Use: <>; ], has container open transparent; Sellable -> -> broomstick "broomstick" with name 'broom' 'stick' 'broomstic' 'brooms', sale_value BROOMSTICK_BUY, description "The broom looks like it's been used somewhat aggressively in the past, with large bare spots in the brush where bristles have fallen out. You suspect its flying days are nearly at an end.", information [person; switch (person) { crystal: if (conj_commod hasnt visited) "~Well,~ muses ", (the)crystal, ", ~you could probably find one at ", (name)conj_commod, ".~"; if (self has general) "~It wasn't all that reliable, was it?~"; else { print "~That used broom "; if (self in Case) print (the)crone, "'s selling"; else print "you bought"; "? It ", (i) "might", " be good for a trip or two before snapping underneath us,~ says ", (the)crystal, " doubtfully."; } crone: if (self in case) { "~A one-of-a-kind bargain! This custom-built unit uses only the stiffest cornstalk bristles, and a polished teak handle, made to order by Wizardry Wooding. Still works perfectly for all gravity-assisted descent flights. Only had one owner too, a witch who only rode it on Sundays. The rest of the week, it just sat in her stable, next to the goat pen.~^^~I can see that,~ mutters ", (the)crystal, " to you, gazing at the shorn state of the broom.^^~This rare and valuable specimen,~ continues ", (the)crone, ", ~can be yours today for a mere ", self.sale_value, " plotkins.~"; } if (self in location || self in player || (self in Rasp_Satchel && Rasp_Satchel in location or player)) print_ret (The)crone, " gazes in disbelief at the tattered broomstick. ~You want to sell me this? Come on, I can't move this. How is it ever expected to fly reliably without any bristles? No, I'm sorry, I can't possibly carry such a poor specimen.~"; else "~All sales are final,~ says ", (the)crone, " quickly."; akbar: if (self in location || self in player || (self in Rasp_Satchel && Rasp_Satchel in location or player)) "~Well,~ smiles Akbar broadly, ~not to find fault with anyone's personal possessions, but this shoddy excuse for flying equipment is par for the course in ", (the)broomstick, " trade. Why risk it, when you can be the proud owner of a brand-new flying carpet today?~"; "~No, no,~ smiles Akbar, shaking his head. ~You don't want a broomstick. A brand-new flying carpet is what you need.~"; betty: "~You wouldn't catch ", (i) "me", " flying around on a broomstick, luv", (murmurs)betty, ". ~Though I do admit that wizards look grand with their robes billowing out behind them.~"; hermit: if (autoclimber in hermit_cabinet) "~Why fiddle around with a dangerous and unstable broomstick when you could just use ", (the)autoclimber, "?~ asks ", (the)hermit, (string)period; "~Nasty, dangerous things, broomsticks. Used to get all sorts of interlopers on my mountaintop, all brought up by broomstick.~"; captain: "~Broomsticks!~ snorts ", (the)captain, ". ~An archaic relic of the past, just like wizards and their apprentices.~"; } rfalse; ], react_before [ks; Fly,Go,Jump: if (player in self) { if (real_location == peak_roof && second == nothing or n_obj or u_obj) { print "You take a deep breath and leap off the roof, aiming for the brick house.^ ^The air rushes by you as ", (the)broomstick, " plunges towards the roof of the brick house, barely managing to clear the alley.^ ^You land with a mighty crash, ", (the)broomstick, " splintering around you as you smash through the roof, landing on the second floor of the brick house.^"; #Ifdef SOUND_ENABLED; PlaySound(brickroof); #Endif; remove(self); second_brick.viabroom = true; PlayerTo(second_brick); MoveFloatingObjects(); rtrue; } print (The)broomstick, " shudders violently under you as it makes the effort to travel while astride it, but gives up and sinks slowly back down. You dismount, disappointed and pick up the broomstick.^"; ks = keep_silent; keep_silent = true; ; ; keep_silent = ks; if (location == conj_commod) "^The old crone gives a small embarrassed cough. ~As I may have said when you purchased it, it's not in tip-top working condition. You might want to make sure you use it for descents only.~"; if (crystal has general) "^~Well, that was pathetic,~ says ", (the)crystal, ". ~We'd better find a take-off point, and hope we only need to travel down.~"; } rfalse; ], before [; Enter: move self to location; rfalse; Receive: if (second ~= player) "You can really only put yourself on the broomstick."; rfalse; Use: <>; ], after [; Enter: if (real_location == peak_roof) { print "You climb gingerly astride ", (the)broomstick, ". It shudders violently as you shuffle to the edge of the roof.^ ^~Don't look down,~ advises ", (the)crystal, " as you reach the edge. You start to explain that heights don't bother you. ~I'm more worried about you scaring ", (the)broomstick, "!~ interrupts ", (the)crystal, ".^ ^Indeed, ", (the)broomstick, " seems to be shying away, almost as though fearing the descent.^"; rtrue; } print "You sit on ", (the)broomstick, ". It shudders violently under you.^"; rtrue; ], has enterable supporter; Sellable -> -> nobbler with name 'pill' 'nobbler', adname 'small' 'white' 'nobbling' 'knockout', sale_value KNOCKOUT_BUY, description [; if (self has general) print "The infamous white nobbler, a small innocent-looking white pill, is supposed to pack a big punch as knockout pills go"; else print "A small white pill, bearing no marking of any kind"; if (self.sticky == true) { print ". It's sticky with pterosaur saliva"; } print_ret (string)period; ], sticky false, short_name [; if (self has general) print "white nobbler"; else print "small white pill"; rtrue; ], information [person; switch (person) { crystal: if (captain.out == true) "~It really did the trick on that ", (name)captain, ", didn't it?~"; if (conj_commod hasnt visited) "A tiny frown crosses ", (the)crystal, "'s face. ~I expect ", (name)conj_commod, " would sell something good for getting someone out of the way temporarily.~"; if (self in case) print "~The pill ", (the)crone, "'s selling?"; else print "~That small white pill?"; print " It's"; give self general; print " a nobbling pill. Drop it in a drink and watch your nemesis fall snoring to the ground."; if (pub has visited) { print " I wonder if it would get that ", (name)captain, " out of our way?"; } "~"; crone: give self general; print "~The small white pill? It's a knockout pill. Perfect for getting that unwanted obstacle out of your way. Just drop it in someone's drink and watch them slide senseless to the floor. Lasts hours. Laugh yourself silly at the unpredictable results when it's mixed with alcohol. "; if (self in case) "This particular one is the infamous name-brand white nobbler. None of your off-brands here! Guaranteed to work instantly. This rare find, infused with an espnis spell blend for that extra kick, is a steal at ", self.sale_value, " plotkins.~"; else "It's a very potent espnis-infused blend, but as all drug sales are final, I'm afraid I'm not interested in purchasing it back.~"; people: print "~You students and your drugs,~ sniffs"; randcrowd(); rtrue; akbar: "~Knockout pills?~ cries Honest Akbar. ~How about a knockout of a deal on a new rug or carpet instead?~"; betty: "~Oh, nasty things, knockout pills", (murmurs)betty, ". ~Not sporting at all.~"; hermit: "~I'll tell you,~ says ", (the)hermit, ", ~there are days, especially the ones where customers have come in, where I'd welcome a few hours of senselessness.~"; captain: "~No one will slip a knockout pill past ", (i) "me", (murmurs)captain, ". ~I never take my eyes off my drink.~"; } rfalse; ], before [; Drink,Eat,Lick,Taste: "If it's as powerful as you hope it is, that wouldn't be wise."; PutOn: if (second == licence) { if (self.sticky == false) print_ret (The)second, " slides right back off ", (the)self, (string)period; if (licence hasnt general) { licence.sticky = true; "You stick ", (the)self, " briefly to ", (the)licence, ", making it nice and sticky."; } "You don't want to make the picture of your face all gummy."; } rfalse; Use: if (second == nothing) { if (real_location == pub) <>; "You don't see anyone around here worth nobbling."; } if (second ofclass NPC) <>; ]; Sellable -> -> hoop "tin hoop" with name 'hoop', adname 'tin', sale_value HOOP_BUY, dest nothing, first 0, thrown false, description "A tin hoop about six inches in diameter.", information [person; switch (person) { crystal: if (self has general) "~Well, once we connected it to the satchel, it seems we can pass from one to the other.~"; if (conj_commod has visited && self in case) "~It's not clear what it's for, is it? I think it might be some kind of extra-dimensional object.~"; else if (conj_commod has visited) { if (Hoop.dest == Rasp_Satchel) "~It seems to have created some sort of connection to the satchel, hasn't it? They glowed when we brought them together.~"; "~It's not clear what it's for, is it? I think it might be some kind of extra-dimensional object. Maybe we should try bringing it near to other extra-dimensional objects.~"; } rfalse; crone: if (self in case) { "~Well, now, that's an odd one,~ says ", (the)crone, " scratching her cheek bemusedly. ~I bought that from someone who swore that it was a magical aimfiz-blorple blend, but I've never been able to work out what it's for. All I know is you have to put it near, on or in the object you want it to connect with. And they must both be some kind of extra-dimensional object. You can have it for ", self.sale_value, " plotkins.~"; } print_ret (The)crone, " shakes her head. ~No, I don't want the hoop back. If you can figure out anything to do with it, good for you. I was told that it was a magical aimfiz-blorple blend, but I've never been able to work out what it's for. All I know is you have to put it near, on or in the object you want it to connect with. And they must both be some kind of extra-dimensional object.~"; akbar: "~No, no,~ smiles Akbar, shaking his head. ~I don't deal in hoops here. Perhaps a brand-new flying carpet is what you need.~"; } rfalse; ], before [loc hooploc; PutOn,Tie: if (second == chute) { "No, that wouldn't be terribly helpful."; } Enter: if (self.dest == nothing) "You can't seem to force your way in. There seems to be some kind of invisible resistance."; if (self.dest == Rasp_Satchel) { give hoop general; hooploc = parent(Hoop); while (parent(hooploc) ~= nothing) hooploc = parent(hooploc); loc = parent(Rasp_Satchel); while (parent(loc) ~= nothing) loc = parent(loc); print "In an odd twist of reality that your eye can't quite resolve, the hoop grows large around you as you enter. Time and space bend weirdly in upon themselves and you feel a pulsating pressure on all sides. There is a sudden snap of reality and you pop back out into real space, real time.^"; if (Hoop notin Purple_Box) move Hoop to hooploc; loc.hoopsack_arrive = true; PlayerTo(loc); MoveFloatingObjects(); if (hoop.first == 0) { Achieved(13); if (loc ~= vault) { hoop.first = 1; print "^~Wow!~ says ", (the)crystal, ". ~I don't know quite what happened there, but we seem to have ended up passing through to the satchel's location. I'm surprised the snow globe went through to be honest, though I guess you weren't putting it in the hoop, so much as passing it through.~^"; } } rtrue; } Receive: if (noun == Rasp_Satchel) { hoop.dest = noun; "You bring the hoop near to ", (the)self, ", but can't quite seem to get it to go in. Both objects glow briefly, however."; } if (noun == lead) "The lead is too big to fit through the hoop."; "You slide ", (the)noun, " all the way through the hoop, pulling it through to the other side."; Take: if (Hoop in W_Courtyard && location == Bailey && portcullis hasnt open) { move Hoop to player; MoveFloatingObjects(); "You reach through the portcullis and take the hoop."; } ThrowAt: if (second == Caerwall_Obj && location == Vechlee_Road or Hayfield or Atop_Haystack or Top_Tree) { if (guard hasnt general) { print "You spin the hoop and it goes skimming through the air, up towards the caer wall. The guard appears out of nowhere and makes a leap worthy of a summertime beach player to intercept the hoop.^"; if (self.thrown == true) "^~Reet keppy game, this, but tha's nobbut waisting thine own tahm,~ he shouts, spinning it back to you. ~Ah ken deea this awl day, tha knoos.~"; self.thrown = true; "^~A reet gud gayme,~ he nods, spinning the hoop back to you. ~Ah've nivver played afore.~"; } move Hoop to W_Courtyard; MoveFloatingObjects(); "You spin the hoop and it goes skimming through the air, up and over the caer wall, landing in the courtyard.^ ^~Impressive!~ says ", (the)crystal, ". ~You should invent a game like that.~"; } if (second == Portcullis && location == Bailey) { move Hoop to W_Courtyard; MoveFloatingObjects(); print "You spin the hoop and it goes skimming through the "; if (Portcullis has open) print "open "; "portcullis, landing in the courtyard.^ ^~Impressive!~ says ", (the)crystal, ". ~You should invent a game like that.~"; } if (location == peak_roof) { move Hoop to alleyway; MoveFloatingObjects(); "You spin the hoop and it goes skimming through the air. Unfortunately, the target area is just too small. The hoop hits the side of the brick house and tumbles down into the alleyway below.^ ^~Remind me not to back you in the darts championship at Oxbridge,~ murmurs ", (the)crystal, "."; } "It's a good thought, but it's just a bit too far to manage that from here."; Use: <>; ], has enterable; !==================================================================================================================================================== ! Honest Akbars Room Honest_Akbars "Honest Akbar's Carpet Emporium" with description [; #Ifdef GRAPHICS_ENABLED; if (location hasnt visited) { RevealBlumph(self.map_offset); } #Endif; "This small, dark shop is made even smaller and darker by the profusion of carpets hanging everywhere. The carpets trap air movement, making the shop seem quiet and stifling. A carpet-lined tunnel leads south back to the high street."; ], #Ifdef GRAPHICS_ENABLED; map_offset 73, comp_mask S_MASK | OUT_MASK, #Endif; Walls THICK_CARPET, Floor THICK_CARPET, compass_look [obj; if (obj == s_obj) "The carpets hanging everywhere block all sights and sounds of the high street back to the south."; return self.Room::compass_look(obj); ], before [; Exit: if (player in location) <>; rfalse; Go: if (noun == s_obj) { give Akbar ~general; rfalse; } Smell: if (noun == nothing) "The atmosphere of the shop is close and heavy, making it hard to draw breath, but there's no real aroma, just an oppressive heaviness."; rfalse; ], cant_go "The only way out is south back to the high street.", out_to [; <>; ], s_to [; akbar.mesmer = 0; switch (random(9)) { 1: print "~Come again, young shopper!~ calls ", (the)akbar, " as you leave.^^"; 2: print "~Be sure to come back "; if (Red_Carpet has general) print "so we can do some more business"; else print "and browse some more"; print ",~ calls ", (the)akbar, " as you head out the door.^^"; 3: print "~Don't forget, we have all manner of competitively-priced rugs and carpets,~ calls ", (the)akbar, " as you step out.^^"; 4: print "~Always remember to clean your rugs and carpets regularly!~ calls ", (the)akbar, " as you step out.^^"; 5: print "~Don't be a stranger,~ advises ", (the)akbar, " as you leave.^^"; 6 to 9: ; } print "You step back out of the dark, stifling shop into the clear air and bright sunshine of the high street.^"; return High_Street; ]; NPC -> akbar "Honest Akbar" with name 'akbar' 'man' 'vendor' 'clerk' 'himself' 'shopkeep' 'shopkeepe' 'keeper' 'merchant' 'doctor', adname 'honest' 'rug', description [; "Honest Akbar is a young, earnest-looking rug and carpet merchant. His broad, beaming smile is surmounted by an impressive, bushy moustache, and his purple trousers contrast sharply with his orange-striped shirt. He seems genuinely friendly and pleased to see you."; ], Chat 0, Topics 0, information [person; <>; ], initial [; if (real_location hasnt visited) { self.Chat = 0; give self general; "~Welcome, my young friend!~ cries the shopkeeper as you enter. ~I am Honest Akbar, and this is my humble abode. Perhaps we can help you find that something special today. A rug for your master's study? Perhaps a flying carpet? Please, browse as you like and let me know if I can be of assistance.~"; } if (honest_akbars.hoopsack_arrive == true) { honest_akbars.hoopsack_arrive = false; "~By my sainted moustache!~ cries ", (the)self, " in surprise. ~You gave me quite a shock.~ His face falls. ~How can I sell a rug or carpet to someone who can travel in that fashion?~"; } if (self hasnt general) { self.Chat = 0; give self general; switch (random(7)) { 1: "~Welcome back!~ cries ", (the) self, ", bounding toward the front of the shop as you enter. ~Perhaps I can interest you in a rug or carpet?~"; 2: "~Greetings!~ cries ", (the) self, ". ~In wanders the weary customer and up jumps the merchant, wondering why the customer chooses to tire out his feet when he could be traveling in style on a new Persian rug or carpet?~"; 3: if (uniform in player) "~A distinguished visitor from the skies!~ cries ", (the)self, ". ~Welcome, my dear captain. As an airship captain, doubtless you're seeking a secondary air transport vehicle for relaxing on your day off. Please, browse all you like.~"; "~Ah, the wizard's apprentice returns, doubtless to finally make that purchase of a new rug or carpet!~ beams ", (the)self, " as you enter."; 4 to 7: switch (random(100)) { 1 to 20: "~Come in, come in,~ beams ", (the)self, " as you enter."; 21 to 30: "~Ah, my apprentice friend!~ cries ", (the) self, ". ~Come to finally take the plunge and purchase that rug or carpet you've been hankering after?~"; 31 to 50: "The young and earnest-looking merchant leaps to the front of the shop as he sees you enter. ~Welcome back!~ he cries, smiling broadly."; 51 to 70: "~Hello!~ cries ", (the) self, " as you enter. ~Honest Akbar greets you warmly. His disappointment at not being able to meet a new visitor is more than assuaged by being able to see an old one instead.~"; 71 to 80: print (The)akbar, " looks up from straightening some of his carpets, beaming. ~Ah, a"; if (uniform in player) print " visit from a distinguished airship captain"; else print "nother visit from the young apprentice"; "! A pleasure, dear friend, a pleasure!~"; 81 to 90: "~Whether you want to ride it, stand on it, sit on it or cover a trapdoor with it, our quality rugs and carpets are ideal!~ cries ", (the)self, " as you enter."; 91 to 94: "~Welcome to ", (name)honest_akbars, "!~ cries ", (the)self, " as you enter, ~where all your rug and carpet needs can be met in one convenient place.~"; 95 to 99: "~Welcome to ", (name)honest_akbars, "!~ cries ", (the)self, ", ~where the elite meet to find something to put under their feet!~"; 100: print_ret (The) self, " is staring intently at a piece of paper, tapping a finger on his chin as you step into the shop. ~Let's see, a large rug for covering a trapdoor in a living room. Probably a five by eight. And Oriental? Hmm, I'd prefer if he wanted Persian, but it sounds like there may be repeat business.~^ ^He starts suddenly as he sees you, and hides the piece of paper away quickly, but not before you spot the words ", (i) "For shipment to white house", " at the top."; } } } print (The)akbar; switch (random(4)) { 1: " is fussing around briefly with his stock of carpets."; 2: " beams broadly at you as he fusses around, straightening his stock."; 3: ", young, earnest and honest, is here, carefully arranging his stock."; 4: ", always eager to please, is looking at you intently."; } ], each_turn [; if (self.mesmer ~= 0 && location == Honest_Akbars) { switch (self.mesmer) { 1: "^~Strange...~ murmurs ", (name)akbar, " suddenly, a frown darkening his normally beaming face. ~I feel a bit odd.~"; 2: "^~Hmmm", (murmurs)akbar, " looking around the room. ~I didn't think ", (i) "all", " these rugs and carpets were magical.~"; 3: new_line; print_ret (name)akbar, " gazes around the shop, a glassy look in his eyes. ~And of course, over here, we have all the flying carpets. And here. And here. Hmmm. Apparently, all our carpets are flying carpets today.~"; 4: "^~Oh no, most of the magic is fading!~ sighs ", (name)akbar, " sadly."; 5: self.mesmer = 0; new_line; print_ret (The)akbar, " shakes his head to clear it. ~I do apologise!~ he cries. ~I don't know what came over me. I hope I have not acted in any way that would decrease your good opinion of ", (name)honest_akbars, ". Or indeed, ", (the)self, " himself.~"; } } if (self.Chat == 1 && location == Honest_Akbars) { switch (random(50)) { 1 to 10: print "^~Notice the fine weaving on these lovely rugs and carpets over here? All these ones were painstakingly woven on a Tabriz-style vertical loom.~^"; 11 to 20: print "^~See this pile over here? All woven with traditional roller beam looms. A strong powerful weave for a strong powerful carpet!~^"; 21 to 25: print "^~Like all fine rugs and carpets, all of ours are made using the finest Persian knots, though we'll use the Ghiordes knot on special request for special orders.~ He pauses. ~Though, I'm not sure why you'd consider an inferior knot for a custom rug or carpet. And please don't sully the shop by even mentioning the Jufti knot.~^"; 26 to 30: print "^~Notice the central medallion on these carpets over here?~ asks ", (the)akbar, ". ~That tells us these were all woven in the Tabriz region. If this were any other store, I'd warn you to watch for imitations, but we usually never carry anything but the real thing.~^"; 31 to 35: print "^~This rug over here is from the Kashan region. They're just getting into weaving, and all the ones I've seen have been very nice. I expect they'll appreciate in value with the years.~^"; 36 to 40: new_line; print (The)akbar, " jots something down on a piece of paper and nods approvingly.^"; 41 to 45: print "^~Are you sure you've considered all the many needs a new Persian rug or carpet could fulfil for you?~ asks ", (the)akbar, " suddenly. ~They can be stood upon, sat upon, used for covering that secret trapdoor... in fact, a busy young apprentice like you probably needs more than one!~^"; 46 to 48: new_line; print (The)akbar, " glances at you. ~Still here? That must mean you're having trouble saying no. And why should you? Everyone deserves a fine new Persian rug or carpet. Treat yourself today!~^"; 49: print "^~Still can't choose between buying a rug or buying a carpet?~ asks ", (the)self, " beaming broadly at you. ~Why agonise over the decision when you could buy one of each?~^"; 50: print "^~Very amusing!~ cries ", (the)akbar, " looking at a piece of paper in his hand. ~I don't know who sends these circulars in the mail, but listen to this: ", (i) "There's money in leather! Send today for your free pamphlet on entering the used saddle market. Free saddle sampler pack to first 500 respondents.", " How ridiculous is that?~^"; } } self.Chat = random(3); rtrue; ], before [wd bk; Consult: wn = consult_from; wd = NextWord(); switch (wd) { 'sampler', 'pack', 'circular', 'circulars', 'pamphlet': return saddle.information(akbar); 'special', 'orders', 'custom', 'custom-wo': "~I would love to fill a special order for you, but sadly, given that most of the rugs I already have here are out of your price range, anything special-ordered would be too expensive as well,~ sighs ", (the)self, (string)period; 'oriental': "~As wonderful as they doubtless are, I don't normally carry Oriental rugs or carpets, though I have been known to bring them in for special orders.~"; ! 'kashan', 'silk': ! "~Excellent rugs and carpets!~ cries ", (the)self, " enthusiastically. ~They've started weaving silk carpets as well, if ! you can believe that.~"; 'warp', 'warps', 'weft', 'wefts': if (self.Topics & FLAG_x1 == FLAG_x1) { print "~Well, as I said earlier, t"; } else { print (The)akbar, " grabs a nearby rug and flips it over. ~See here? T"; } print "he warp is the lengthwise thread. You pass the weft through the warp, drawing the weft over and under the warp thread.~"; if (self.Topics & FLAG_x1 == FLAG_x1) { "^^You nod and thank ", (name)akbar, " for repeating the information."; } self.Topics = self.Topics | FLAG_x1; print " He continues on, explaining a significant portion of the history and craft of weaving, and leaving you a wiser apprentice into the bargain.^"; if (crystal has general) "^~I had no idea Persian carpets were so complicated", (murmurs)crystal, ". ~No wonder they're so expensive.~"; rtrue; 'rock-soli', 'central', 'lifetime', 'warranty', 'medallion', 'guarantee', 'quality': "~Yes indeed! If you purchase one of our top-of-the-line flying carpets, you'll not only get the fabulous Persian knots and the tightly-woven Tabriz medallion in the center, you'll also get a lifetime warranty against fraying, knot-loosening, thinning, and sudden unscheduled landings.~"; 'fraying', 'knot-loos', 'thinning', 'sudden', 'unschedul', 'landings': "~Oh, dear customer, it's definitely more of a problem than you'd think,~ cries ", (the)self, ", ~at least for some of our competitors. Hence the guarantee, to show how confident we are in our product.~"; 'confident', 'confidenc': "~Oh, we are must certainly confident in the quality of our product!~ smiles ", (the)self, ". ~That's why we have such a rock-solid guarantee.~"; 'competito': "~Well, we have competitors who make simply wonderful carpets and rugs of their own,~ says ", (the)self, ", ~and I would never find fault with them. But we're talking Ghiordes knots across the board and no lifetime warranty in sight. You'll even get the occasional...~ He stops and shudders. ~Jufti knot!~"; 'persian', 'knot', 'knots', 'ghiordes', 'bulkier', 'imagery': "~Knots are extremely important!~ cries ", (the)self, ". ~They dictate the strength and symmetry of the rug or carpet. The Persian knot is usual for finer rugs, which is why all the rugs we make are constructed that way, though we do sell some Ghiordes rugs. With the Persian, the weft wraps around one warp, then passes behind the next. With the Ghiordes, the weft passes between two warps, then back under one, and wrapped around both.~ He shrugs briefly. ~Both are fine knots, but I find the Ghiordes makes for bulkier imagery on the rug or carpet.~^ ^He pauses for a moment. ~And please,~ he adds with a pained expression, ~don't sully the shop by asking about Jufti knots.~"; 'vertical', 'loom', 'tabriz': "~Vertical looms are far superior to horizontal looms. Horizontal looms are small and portable, so the nomads use them. Some wonderful weaving is done by some groups, of course, but the real quality comes when vertical looms are used, which produce a much tighter weave, as we see on this carpet here. The Tabriz loom is an additional refinement where the warps are continuous, and the carpet is passed around the back of the loom as weaving progresses. Yes, see this example here? Wonderful. The upright loom allows for the tight weaving you see in this central medallion.~"; 'tradition', 'roller', 'beam', 'looms', 'series': "~It's a very nice, very traditional upright loom that allows you to weave very long rugs or carpets. They use it in some areas where they weave rugs or carpets in series.~"; 'jufti', 'spanish': print_ret (The)self, " winces. ~Didn't I ask you not to mention that knot? If I didn't, I should have. Let me summarise. Yes, the Jufti ties around four warps instead of two, but to me, that doesn't mean better, that just means lazy. Anyone can make a carpet hold together well with a Jufti, but does it make an elegant, strong and symmetric rug or carpet? No, it does not!~"; 'bearskin': "~Ah,~ sighs ", (the)self, ". ~When that craze started, I lost all kinds of business to the trappers. Madness! Who wants to wear a bearskin rug around town when they could step out in a lovely Persian rug or carpet instead? Fortunately, the craze seems to be subsiding.~"; 'craze', 'trappers', 'bear': "~You haven't heard about it?~ cries ", (the)self, ". ~Well, consider me overjoyed to be the elucidator of one so wise in so many other ways! About a year ago now, just after your famous adventures, a craze started among the university types, wearing bearskin rugs everywhere. It all started about the same time as those reports about the bear climbing the tree. But you must know about it, you were one of the first instigators. When you landed among my uncle's flying carpet convoy, I distinctly remember him saying you were wearing a bearskin rug.~ He sighs theatrically. ~No wonder you're not interested in purchasing one of my lovely rugs or carpets. The creator of the bearskin rug craze, here in my own shop! If my uncle were no longer with us, he'd be spinning in his grave.~"; 'uncle', 'convoy', 'impact': "~Yes, my uncle often spoke of you, and the... well, impact, you had on things that day.~"; 'differenc': "~The difference between rugs and carpets? Well, traditionally, anything up to eight feet by five feet is a rug. Anything larger is a carpet. Except when they're airborne, of course. Then, it's always a carpet, regardless of size. Odd.~"; 'haggling', 'bartering', 'barter', 'bargain', 'bargainin', 'haggle', 'deal', 'trade', 'discount', 'sale': <>; 'thalion', 'country', 'land', 'world': "~Thalion is the golden land of opportunity all around us,~ cries ", (the)self, " effusively, ~and I love it!~"; 'Ninario', 'nin', 'ninny': <>; 'plumber^s', 'union', 'plumber', 'plumbers': <>; } do { wn = consult_from; bk = ParseToken(SCOPE_TT, AskableScope); } until (bk ~= GPR_REPARSE); if (bk == GPR_FAIL) "~Oh, woe and sadness! I'm not certain what you're asking me about!~ cries ", (the)self, (string)period; if (bk.information(self) == true) rtrue; "~Why think about ", (itorthem)bk, " at all?~ cries ", (the)self, ", ~when you could be flying around on a new rug or carpet instead?~"; Attack: print "You're not sure if it's the weaving in his youth, or all the rug and carpet moving in his adult life, but he has impressively bulky arms and shoulders. You're not sure you want to take him on."; if (crystal has general) print " Besides, what would ", (the)crystal, " think about you picking fights with the local merchants?"; new_line; rtrue; Bargain: "~What? You want a discount?~ cries ", (the)self, ". ~These high-quality Persian rugs and carpets are already deeply discounted!~"; Buy: "You definitely don't need a rug and carpet salesman."; BuyFrom: if (noun == self) <>; Kiss,Touch: "~Wonderful!~ cries ", (the)self, ", ~but I regret to tell you there's only so far I'll go for a sale.~"; Listen: "Apart from his frequent outbursts of enthusiasm, ", (the)self, " makes no noise."; MeetNPC: "~Yes!~ cries ", (the)self, ". ~I am indeed Honest Akbar and I'm enchanted to make your acquaintance.~"; Search: "~That's extremely kind of you, my dear customer, but I can examine my own pockets, thank you.~"; SellTo: if (second == Red_Carpet) { print "~Well,~ muses ", (the)akbar, ", looking at ", (the)second, ". ~I would love to help you out by purchasing this flying carpet"; if (second has general) { print ". I suppose I could sell it to someone's grandmother as a slow and steady Sunday carpet. Here's ", Red_Carpet.sale_value, " plotkins for it.~ He hands you the money, and adds ", (the)second, " to his stock.^"; } else { print ", but I'm afraid it's simply too tattered to resell. However, "; return Red_Carpet.Carpetrepair(); } plotkin.adjust(Red_Carpet.sale_value, SELLING); Red_Carpet.sale_value = BUYFIX_CARPET; move Red_Carpet to real_location; MoveFloatingObjects(); rtrue; } "~Thank you for the opportunity to purchase ", (the)second, "!~ cries ", (the)akbar, ", ~but I'm afraid I only deal in rugs and carpets.~"; Smell: print_ret (The)akbar, " smells of scented soap and rich perfume."; Smile: print_ret (The)akbar, " beams broadly at you."; Talk: "~Enchanting!~ cries ", (the)akbar, ". ~I like nothing better than talking, especially about rugs and carpets.~"; Take: "~Very flattering!~ cries ", (the)akbar, ", ~but you can't take me with you. I have to mind the shop.~"; Thank: "~It is a pleasure to serve!~ cries ", (the)akbar, ", ~and a pleasure to know I have been of service. You are welcome, my dear customer.~"; ], nomatch [; "~As interesting as that is, wouldn't you rather talk about purchasing a rug or carpet?~ asks ", (the)akbar, (string)period; ], FixMaybe [; "~Well, please come back if you make up your mind!~"; ], FixYes [; if (verb_word == 'maybe') { akbar.FixMaybe(); rtrue; } if (plotkin.current_qty < REPAIR_CARPET) "~Ah, woe!~ cries ", (the)akbar, ". ~Woe that at the very moment we're ready to do business, it seems you have insufficient funds. But please return when this condition, which I'm sure is a fleeting and temporary one, has passed.~"; print "~Excellent!~ cries ", (the)akbar, ". He takes ", (the)Red_Carpet, " and as you watch, subjects it to a battery of arcane processes. Threads are tightened and the wefts and warps are cinched up. In a final move too deft for your eyes to catch, the Jufti knots are restored to their original splendour.^ ^~There!~ he beams, gazing at his handiwork. ~That's as good as I can make it. It should fly now, though it may not work absolutely everywhere. And certainly not indoors, of course.~^ ^He hands it back to you, accepting ", REPAIR_CARPET, " plotkins in return.^"; ! Reset anchor hints for later clues anchor.hint = 0; Achieved(25); move Red_Carpet to player; give Red_Carpet general; plotkin.adjust(REPAIR_CARPET, BUYING); Red_Carpet.sale_value = SELLFIX_CARPET; MoveFloatingObjects(); rtrue; ], FixNo [; "~A wise decision!~ beams ", (the)akbar, ". ~Since you don't want to repair this carpet, I'm sure you've decided to pursue my idea of a brand-new rug or carpet instead. Please, browse around the stock, and let me know.~"; ], life [; Answer: if (noun == 'hello' or 'hi') <>; return self.nomatch(); Give: if (noun == nobbler) "~No, no drugs necessary!~ beams ", (the)akbar, ". ~I don't wish to spend an afternoon unconscious and miss out on providing great deals on rugs and carpets.~"; if (noun == Red_Carpet && Red_Carpet hasnt general) { print "~Ah, the threadbare red carpet. Well, repair costs would be ", REPAIR_CARPET, " plotkins. Would you like me to repair it for you?~^"; YesNo.Ask(self.FixYes, self.FixNo, 0); rtrue; } <>; Show: if (noun ofclass Cheese) { return noun.information(akbar); } switch (noun) { Saddle: "~Ah!~ cries ", (the)akbar, ". ~Wonderful! You've no doubt decided to make money by entering the used saddle market! Sadly, flying carpets don't require them, so I am not interested in purchasing one, but best of luck in your sales.~"; Red_Carpet: return Red_Carpet.information(akbar); plotkin: "~Ah, money!~ cries ", (the)akbar, ". ~Perhaps there's a rug or carpet need we can address with these plotkins.~"; default: <>; } Tell: if (second == Red_Carpet) { if (Red_Carpet has general) "~Yes, wonderful repair job, isn't it?~"; "~What? It was like this when my uncle gave it to you? I'm sorry, unscrupulous as he was, I simply can't be held accountable for his actions. And it ", (i) "was", " free, after all. I'm afraid getting it back to working condition will be expensive. This is not a charity rug and carpet emporium.~"; } if (second == 'me' or 'myself' or 'you' or 'yourself') "~Fascinating!~ cries ", (the) self, " with enthusiasm. ~You lead a very interesting life, my friend!~"; if (second == 'Ninario' or 'nin' or 'ninny') "~Really?~ asks ", (the)akbar, " shaking his head. ~I don't understand why he'd stay shut inside when he could be out purchasing a new rug or carpet.~"; print_ret "~Very interesting!~ cries ", (the)self, ". It sounds like you need a new rug or carpet from ", (name)honest_akbars, ".~"; ], orders [; Tie: if (noun == Red_Carpet) { if (noun has general) "~I've done all I can for this carpet,~ sighs ", (the)akbar, ". ~But,~ he beams suddenly, ~if it's still not good enough, perhaps you should peruse our fine selection of ", (i) "new", " rugs and carpets.~"; self.FixYes(); rtrue; } if (noun == carpets) "~For shame!~ cries ", (the)akbar, ", wagging a finger at you good-naturedly. ~None of the rugs or carpets I sell are in need of any repairs.~"; "~I'm afraid I'm really only good at repairing rugs or carpets,~ sighs ", (the)akbar, (string)period; Give: <>; HelpNPC: "~But of course!~ cries ", (the)akbar, ". ~And what better way to help than fitting you out with a new rug or carpet?~"; MeetNPC: <>; Sell: <>; SellTo: <>; Show: if (noun == carpets) return carpets.information(akbar); default: "~Of course, of course!~ beams ", (the)akbar, ". ~I'll get to it as soon as the business of the day is finished.~"; ], react_before [; Buy: if (second ~= nothing or akbar) rfalse; if (noun == Red_Carpet) { if (noun.sale_value == BUYFIX_CARPET) "~No, no!~ smiles ", (the)akbar, ". ~Payment first, flying carpet second.~"; "But it's already yours!"; } if (noun == carpets) { print "~Ah, you wish to buy a rug or carpet? Well, we have many fine examples for the struggling apprentice. Perhaps you seek something to sit on while you study? Or perhaps something to curl up on in front of the fire with the little lady?~ He pauses and winks at ", (the)crystal, ". ~Or perhaps our economy line to get you started. Our prices start at 600 plotkins for the most basic model.~^"; if (crystal has general) "^~600 plotkins? Well, that puts paid to the idea of buying a rug, flying or not,~ says ", (the)crystal, " firmly. ~Even if curling up on a new rug did sound interesting,~ she adds, flicking a shy glance at you."; } "~I'd love to!~ cries ", (the)akbar, ", ~but I only deal in rugs and carpets.~"; Sell: <>; ], has animate male proper; Prop -> carpets "rugs and carpets" with name 'rugs' 'carpets' 'stock' 'merchandi', adname 'flying', article "some", description "Numerous rugs and carpets of varied shapes and styles hang everywhere in the shop. All possible types are represented, included the flying variety. They all look exquisitely made and extremely expensive.", information [person; switch (person) { crystal: if (honest_akbars hasnt visited) "~I'm sure Honest Akbar's in the high street has lots of rugs and carpets for sale", (murmurs)crystal, ", ~though perhaps not in our price range.~"; print "~They look"; if (location == honest_akbars) print "ed"; print " very expensive, d"; if (location == honest_akbars) print "o"; else print "id"; "n't they?~ asks ", (the)crystal, ". ~More than we could afford, anyway.~"; akbar: "~Oh, we have all kinds represented here!~ beams ", (the)akbar, " broadly. ~They start at about 600 plotkins for the most basic, Ghiordes knots only, and go up from there. For a custom-woven top-of-the-line flying carpet, complete with Persian knots and Tabriz medallion, woven on an upright Tabriz loom, you'll be paying about 5000 plotkins. But the quality! And the lifetime warranty! You can't go wrong!~"; crone, betty: "~", (the)akbar, "'s has lots of them,~ shrugs ", (the)person, ". ~Go talk to him about them.~"; people: "To a man, ", (the)person, " indicate ", (name)honest_akbars, " as the place to find quality rugs and carpets."; hermit: return akbar.information(hermit); captain: "~Carpets!~ snarls ", (the)captain, ". ~Flying or not, they can't match an airship for comfort.~"; teller: <>; } rfalse; ], before [; Take: "~I hope you'll cover the basics of property ownership at university,~ beams ", (the)akbar, ", ~because unless I'm very much mistaken, those are ", (i) "my", " carpets to sell, not yours to take.~"; ], has pluralname; !==================================================================================================================================================== ! Topics and other general objects Askable Shards "shards of glass", with name 'glass', adname 'broken' 'shards' 'of', article "many", before [; default: "The shards of glass are strewn all over the floor, the remains of the captain's glass. They're sharp and dangerous, and you should leave them alone."; ], information [person; switch (person) { crystal: "~They're sharp and dangerous, and you should leave them alone!~ exclaims ", (the)crystal, "."; } ], has scenery pluralname; Askable ksilk with name 'kashan' 'carpets', adname 'silk', information [person; switch (person) { akbar: "~They make excellent rugs and carpets in Kashan!~ cries ", (the)akbar, " enthusiastically. ~They've started weaving silk carpets as well, if you can believe that.~"; } ], has objseen; ! Object to handle asking female NPCs about "themselves", because Crystal is always in scope Askable hself with name 'herself', information [person; switch (person) { teller, betty, crone, crystal: return person.information(person); } ], has objseen; ! Object to handle asking NPCs about their name Askable selfname with name 'name', information [person; <>; ], has objseen; Askable Virgil "Virgil" with name 'virgil', information [person; switch (person) { crystal: "~Virgil was Renaldo's second-in-command, but he largely retired to a sedentary life after your guild hall explosion last year.~"; teller: "~Never had much occasion to deal with him", (admits)teller, ". ~His master Renaldo's not one to do business at anything associated with the Plumbers Union.~"; hermit: "~Renaldo's former second-in-command. Used to follow him everywhere.~"; captain: "~Wizards,~ mutters ", (the)self, ". ~Can't abide most of 'em. Especially not their lackeys.~"; crone: "The old crone scowls. ~Renaldo's original fawning lackey. Yekcal is a poor crawling imitation of him.~"; people: switch (random(4)) { 1: print "~After Virgil was injured in that guild hall explosion last year, Yekcal, another Wizards Guild lackey, took over second-in-command, and never really relinquished it,~ explains"; 2: print "~Virgil had to give up his post as second-in-command after that guild hall explosion, and Yekcal's the new favourite,~ confides"; 3: print "~Both Virgil and the new favourite, Yekcal, are fawning toadies of the worst stripe,~ complains"; 4: print "~No one's seen Virgil or Yekcal for months, but rumour is the guild is still active. They're both second-in-command to Renaldo, of course,~ explains"; } randcrowd(); rtrue; betty: print "~Ooh, a right nasty piece of work, luv,~ cautions ", (the)betty, ". ~He came in to the shop in Vechlee a few times to buy wood for the Guild, and he was always surly. Mum didn't like the sound of him at all. If he hadn't been Renaldo's right-hand man at the time, he might not have made it back to the Guild Hall safely.~^"; if (crystal has general) print "^~See what I mean about her and her mum?~ whispers ", (the)crystal, ".^"; rtrue; } ], has objseen; Askable Bmum "Betty's mum" with name 'mum' 'mother' 'mummy' 'mom' 'mommy', adname 'betty^s', information [person; switch (person) { crystal: "~There's something very odd going on with Betty and her mother", (admits)crystal, ", ~but I'm not sure it's something we need to worry about.~"; hermit: "~Never met her,~ shrugs ", (the)hermit, ". ~Can't tell you anything.~"; crone: "The old crone pales. ~I met her once,~ she whispers. ~Terrifying. Absolutely terrifying. I don't wish to discuss it.~"; betty: print_ret (The)self, " leans across the counter. ~She doesn't like people talking about her, luv,~ she whispers, ~so we'd best not.~"; } ]; !==================================================================================================================================================== ! Pier area Outroom Pier "Pier" with description [; #Ifdef GRAPHICS_ENABLED; if (location hasnt visited) { RevealBlumph(self.map_offset); } #Endif; "The pier juts out into a calm, pleasant bay, sheltered from the sea. There are numerous ships at anchor in the bay, bobbing gently on the blue water. A rigid metal stairway ascends to the dirigible docks, where you can see a lone airship swaying gently on its anchor cable. A small dockside pub lies to the east, and southeast, the road climbs back up to the high street. There's also a long road south that leads to the marketplace."; ], cant_go "You can head up to the dirigible docking area, east into the pub, southeast to the high street, or south to the marketplace.", #Ifdef GRAPHICS_ENABLED; map_offset 5, comp_mask E_MASK | U_MASK | SE_MASK | S_MASK, #Endif; Carpet_Go [; PlayerTo(Shops); MoveFloatingObjects(); rfalse; ], compass_look [obj; if (obj == e_obj) "The dockside pub lies to the east."; if (obj == se_obj) "Southeast, the cobbled road heads back up to the high street, climbing slightly as it does so."; if (obj == s_obj) "South, the cobbled road heads back up to the marketplace."; if (obj == w_obj) <>; if (obj == u_obj) <>; return self.Outroom::compass_look(obj); ], e_to [; print "You step into the small dockside pub.^"; return Pub; ], u_to [; print "You ascend the towering metal stairway to the dirigible docks.^"; return Dir_Docks; ], se_to [; #Ifdef GRAPHICS_ENABLED; blumphmap-->269 = blumphmap-->269 & (~NODRAW_FLAG); #Endif; print "You head southeast up the road to the high street.^"; return High_Street; ], s_to [; #Ifdef GRAPHICS_ENABLED; blumphmap-->267 = blumphmap-->267 & (~NODRAW_FLAG); #Endif; print "You head south up the road to the marketplace.^"; return Shops; ], Floors SLIMY_STONE; Prop -> photo_stand with name 'booth' 'graphicae' 'graphicum' 'front' 'script' 'writing', adname 'photo' 'glass' 'lumen' 'large', add_to_scope tray, description [; self.short_name = "lumen graphicae booth"; give tray ~scenery; print "This small unmanned booth has a glass front, showing lots of complicated machinery: various gears, wheels, hydraulic hoses and copper fittings line the inside. Protruding from the glass front is an antiquated lens pointing in your direction. There's a pull-cord hanging next to the lens, and a tray at the side of the booth holds some small index cards.^^Large script writing at the top of the booth proclaims:^"; font off; print "^Let this latest scientific marvel amaze you! Today only, free ", (i) "lumen graphicae"; font off; print " prints. Just pull the cord to have your image inscribed forever on one of our postcards.^"; font on; rtrue; ], short_name [; print "small glass booth"; rtrue; ], describe [; print_ret "^There is ", (a)self, " here, its transparent front showing an interior full of complicated machinery."; ], information [person; switch (person) { crystal: if (Pier has visited) { "~The lumen graphicum is a relatively recent invention", (admits)crystal, ", ~so I don't know too much about it. It's some kind of non-magical way of preserving an image or scene.~"; } crone: "~Lumen graphicae?~ asks ", (the)crone, ". ~A relatively new invention. I'm not sure yet if it's better than preserving images magically or not. Time will tell.~"; } rfalse; ], has ~scenery transparent; Prop -> -> pullcord "pull-cord" with name 'cord' 'pull-cord' 'pulley' 'pullcord' 'ripcord', adname 'pull' 'rip', description "A simple pull-cord, hanging from the front of the machine.", before [; Pull: if (licence has general) { "You don't need to mess about with this machine now that you have a licence with your picture on it."; } if (self.pulled == false) { if (licence in tray && licence has general) "The licence in the tray already has a photograph of you on it. There's not much point in getting another one stuck on top of it."; #Ifdef SOUND_ENABLED; PlaySound(camera); #Endif; StartTimer(self, 1); self.pulled = true; print "There is a blinding flash from the machine, followed immediately by a brief click.^"; if (index_card.taken == true) { remove index_card; "^A tiny warning nymph appears, floating in the air beside your ear. ~Whoops! Looks like you already created a lumen graphicum print earlier. I guess you don't like the way the other one looks, so in the interests of conservation of magical energy, we'll just get rid of the other one for you, no matter where it is. Good spell, isn't it?~ she adds, giving you a wink.^^There is a poof and the nymph disappears."; } rtrue; } else { "There is a pop, and a tiny warning nymph appears, floating in the air beside your ear. ~Hello! It looks like the lumen graphicae booth is still busy with an operation. Please try the pull-cord again later!~^ ^There is a poof and the nymph disappears."; } ], pulled false, time_left, time_out [; self.pulled = false; #Ifdef SOUND_ENABLED; PlaySound(photoprint); #Endif; print "^The lumen graphicae machine starts to operate, shaking and clattering as gears cycle through their routine. You follow the sequence as gears, wheels and other equipment activate in succession. There is a final bang, followed by a gentle rumbling as the machine starts to shake, emitting a great shuddering noise. The gears strain and groan, and you follow the sequence as the gears, wheels and other equipment activates in violent succession. There is a final clattering smash, followed by a gentle ", (i) "ping", " as the machine comes to a stop, spitting out a completed lumen graphicum, "; if (licence in tray) { if (licence.sticky == true) { give licence general; "affixing it to the licence in the tray."; } else { index_card.taken = false; "placing it on the licence in the tray, where it slips right off.^ ^There is a pop, and a tiny warning nymph appears, floating in the air beside your ear. ~Whoops! We apologise for the technical fault while affixing your lumen graphicum to the index card. We'll clean that up for you and you can try again.~^ ^There is a poof and the nymph disappears, along with the unattached lumen graphicum print."; } } move index_card to tray; "affixing it to one of the index cards in the tray."; ], has ~scenery; Prop -> -> gears "machinery" with name 'gears' 'wheels' 'hoses' 'gear' 'copper' 'fittings' 'wheel' 'machinery' 'hose', adname 'complicat' 'hydraulic', description "Various gears, wheels, hydraulic hoses and copper fittings line the inside of the machine.", before [; Examine: rfalse; default: "They're an integral part of the machine, and best left alone."; ]; Prop -> -> lens "lens" with name 'lens', adname 'antiquate' 'camera', description "The lens, although brand-new, most resembles an antiquated camera lens. It must be a relatively new invention in this land.", information [person; switch (person) { crystal: if (Pier has visited) { "~I believe the lens is a key part of the whole lumen graphicae process,~ says ", (the)crystal, ", ~but I don't really know a great deal about how it works.~"; } } ], before [; Examine: rfalse; default: "They're an integral part of the machine, and best left alone."; ]; Ad_Item -> tray "tray" with name 'tray', adname 'small', description [; print "It's a small tray, about 2 by 3 inches, attached to the side of the booth.^"; self.describe(); ], describe [; if (child(self) == 0) rtrue; else print "^Sitting in a small tray attached to the booth"; WriteListFrom(child(self), ENGLISH_BIT + ISARE_BIT); print_ret (string)period; ], before [; Receive: if (noun == licence) { if (licence has general) { "The licence already has a lumen graphicum print of you on it. There's not much point in getting another one stuck on top of it."; } rfalse; } if (noun == index_card) { "This card already has a lumen graphicum print on it. There's not much point in getting another one stuck on top of it."; } "It's not really meant for anything other than small cards of 2 inches by 3 inches."; ], after [; Receive: "You slip ", (the)noun, " into the tray."; ], has container open ~openable transparent static scenery; Prop -> -> index_cards "blank index cards" with name 'cards' 'card', adname 'blank' 'small' 'index', description [; print "Each index card is about 2 inches by 3 inches, with an empty space for a small photograph, and the words ", (i) "Lumen graphicum free sample!", " printed on it."; if (index_card in tray) " The top card has a photograph of you on it."; new_line; rtrue; ], article "some", before [; Take,Transfer: !If a picture hasn't been taken, don't let the player take a card. if (licence in tray) { <>; } if (index_card notin tray) { "A tiny warning nymph appears, floating in the air beside your ear. ~Please don't remove the index cards from the tray unless they have a ", (i) "lumen graphicum", " on them! Thanks, sweetie!~ With a pop, she disappears."; } ], has pluralname; Prop pub_scen "pub" with name 'pub' 'public' 'house', adname 'dockside', description [; if (self in Pub) <>; "The small dockside pub to the east looks quiet at this time of day, without the usual noontime bustle."; ], information [person; switch (person) { crystal: if (self in Pub) "~Seems a bit early for people to be hitting the pub, doesn't it?~ murmurs ", (the)crystal, "."; "~I haven't spent a lot of time in there,~ shrugs ", (the)crystal, ". ~It's just an ordinary pub. Gets lots of airship captain traffic because it's so close to the dirigible docks.~"; akbar: "~A wonderful establishment!~ cries ", (the)akbar, " expansively. ~While I don't partake of alcohol, I am told the pub is a wondrous place for the easy camaraderie and false bonhomie brought on by its consumption.~"; betty: print "~Oh dear,~ sighs ", (the)betty, " patting her hair self-consciously. ~Don't you think I'm far too old to be seen in there?~^"; YesNo.Ask(betty.oldYes, betty.oldNo, 0); rtrue; hermit: "~Crowds. Hah! Company. Hah! Drinks. Hmm, well, they're all right I suppose.~"; crone: "~Don't go in there too much myself,~ sniffs ", (the) self, ". ~Don't like beer.~"; people: switch (random(4)) { 1: print "~Yes, I think there's a half-decent little pub down on the pier,~ says"; 2: print "~Ah, the dockside pub. Bit of a dive, from what I've seen,~ says"; 3: print "~Not bad if you like that sort of thing,~ shrugs"; 4: print "~I much prefer a quiet tea room. Wish we had one here,~ sighs"; } randcrowd(); rtrue; captain: print_ret (The)captain, " looks conspiratorially all around the pub, and then leans forward, beckoning you closer with a finger. ~It's my second home,~ he confides in a loud stage whisper. ~I come here to build up courage for take-off.~"; teller: "~A pub?~ asks ", (the)teller, ". ~I'm afraid there's no pub in Vechlee, captain. There is one in Blumph, but I'm sure you wouldn't want to visit there. From what I've read in the Tattler, airship captains are having enough trouble with their piloting already at the moment.~"; } ], found_in Pub Pier, before [; Enter, Go, Use: <>; ]; Askable index_card "index card with your picture on it" with name 'card' 'photograp' 'picture', adname 'index' 'top', taken false, description [; "A 2-inch by 3-inch index card. It has a ", (i) "lumen graphicum", " or photograph of you on it, along with the words ", (i) "Lumen graphicum free sample!"; ], before [; Take: self.taken = true; ]; Prop metal_staircase "rigid metal stairway" with name 'staircase' 'stairway' 'stair' 'steps' 'stairs', adname 'rigid' 'metal', description [; print "The rigid metal stairway leads "; if (self in Pier) "up to the dirigible docks."; if (self in Dir_Docks) "back down to the pier."; "down to Vechlee's market square."; ], before [; Climb,Go,Enter,Use: if (self in Pier or Market_Square) <>; else <>; ], found_in Pier Dir_Docks Arrivals_Dock Market_Square, has pluralname; Prop platform "docking platform" with name 'dock' 'platform' 'gangplank' 'gantry' 'gangway', adname 'docking' 'rigid' 'metal', found_in Dir_Docks Arrivals_Dock, description [; if (self in Dir_Docks) "The rigid metal gantry extends out on either sides, with gangplanks for entering or exiting airships at regular intervals."; "The Vechlee docking area consists of a single rigid metal gantry platform."; ]; Room Pub "Pub" with description [; #Ifdef GRAPHICS_ENABLED; if (location hasnt visited) { RevealBlumph(self.map_offset); } #Endif; "This small dockside pub is quiet at this time of day. The place is largely deserted, and there's no sign of the landlord. The pier lies back to the west, and to the east another doorway heads out to a small terraced area behind the pub."; ], cant_go "You can head east to the small terrace behind the pub, or west back to the pier.", #Ifdef GRAPHICS_ENABLED; map_offset 7, comp_mask E_MASK | W_MASK, #Endif; e_to [; print "You step out of the pub and into the small terrace.^"; return Terrace; ], w_to [; print "You head back outside to the pier.^"; return Pier; ], compass_look [obj; if (obj == e_obj) "To the east is a small terrace area behind the pub."; if (obj == w_obj) "West leads back out to the pier."; return self.Room::compass_look(obj); ], Walls DAMP_STONE, Floor STONE_TILES; Furniture -> pub_table "round wooden table" with name 'table', adname 'plain' 'round' 'wooden', description [; print "A plain, round wooden table, placed here for the use of the customers. Its surface is stained with the spilled beer of many a dockside regular.^"; self.describe(); ], react_before [; Buy: if (noun == booze) "Starting in on the booze is not likely to help you focus on the task at hand."; ], describe [; if (child(self) == 0) rtrue; else print "^Sitting atop the table"; WriteListFrom(child(self), ENGLISH_BIT + ISARE_BIT); print_ret (string)period; ]; Askable -> -> booze "glass of Fiery Dockside Tipple" with name 'glass' 'dockside' 'tipple' 'booze' 'alcohol' 'rotgut' 'moonshine' 'rhubarb' 'crop' 'drink' 'beer' 'wine' 'spirits', adname 'fiery' 'of' 'virgin', description [; "A local favourite, Fiery Dockside Tipple is the product of years of experiment with the local fiery rhubarb crop, trying to distill it into a form that won't blow your head off. It's still shockingly strong, definitely an acquired taste, and is unpredictable when mixed with pharmaceuticals... and, well, just about anything else as well."; ], information [person; switch (person) { crystal: "~It's known to pack a punch", (admits)crystal, ", ~but I've never tried one myself.~"; captain: "~Those who can't handle the Fiery Dockside Tipple sometimes plump for a virgin one,~ says ", (the)captain, ", ~but perhaps you'd best avoid it all together.~"; crone, betty: print "~Not my beverage of choice"; if (person == betty) print ", luv"; print (admits)person, ". ~It packs too big of a punch for me.~"; hermit: "~Wooo-eeee,~ whistles ", (the)hermit, ". ~That stuff packs a wild kick. Reminds me of that bear on my mountain.~"; } ], before [; Drink: "~Hands off the Dockside Tipple,~ growls ", (the)captain, ". ~It's expensive enough without you nicking some of it.~"; Receive: if (captain.mesmer == 0) "~Hands off the Dockside Tipple,~ growls ", (the)captain, ". ~It's part of a specially balanced diet.~"; if (noun == nobbler) { StartTimer(captain, 3); captain.waiting = true; Achieved(15); print "With ", (the)captain, " distracted, you slip ", (the)nobbler, " into ", (the)booze, ", where it fizzles and dissolves.^"; remove nobbler; rtrue; } "You doubt putting ", (the)noun, " into the captain's drink would prove all that helpful."; Take,Transfer: "~Oh, I don't think you're ready for this, youngster,~ says ", (the)captain, ". ~Maybe a Virgin Dockside Tipple is more your line.~"; ]; Cheese -> -> Gruyere "Gruyere" with name 'gruyere', invent [; print "a piece of Gruyere"; if (self.visionnum ~= 0) { PrintShortVision(self.visionnum); } rtrue; ], description [; print "A hard cow's milk cheese with a dense and compact texture, the Gruyere is a pale yellow colour."; if (self.visionnum ~= 0) { PrintVision(self.visionnum); } new_line; rtrue; ], describe [; "^A pale yellow piece of Gruyere sits here, looking delectable."; ], before [; Eat: print_ret (The) self, " has an extremely complex flavour, fruity but with an earthy aftertaste that lingers on the tongue. You take just a small nibble, which disappears all too quickly."; Lick,Taste: "Sweet and slightly salty, with a hint of fruit."; Smell: "The Gruyere has a strong smell of butter, with a hint of fermented milk."; Take,Transfer: if (captain.out == false) { print "~Hands off my cheese!~ mutters ", (the)captain; if (captain.mesmer ~= 0) print ", a bit dazedly"; ". ~It's part of a specially balanced diet.~"; } Touch: print_ret (The) self, " has a dense and compact texture."; ]; Furniture -> pub_chair "chair" with name 'chair', description "An ordinary chair.", capacity 1, information [person; if (person == captain) <>; rfalse; ], before [; Enter: if (captain.out == false) print_ret (The)captain, " probably wouldn't welcome that."; Examine: rfalse; Listen: if (captain.out == false) <>; Take,Transfer: "That belongs to the pub."; ], describe [; if (captain.out == false) { new_line; return captain.initial(); } if (child(self) == 0) "^An empty chair sits at the table."; else print "^Sitting on the chair"; WriteListFrom(child(self), ENGLISH_BIT + ISARE_BIT); print_ret (string)period; ], has enterable; NPC -> -> captain "airship captain" with name 'captain' 'himself' 'kells' 'man' 'guy' 'fella' 'drinker', adname 'airship', article "an", description [; print "An older gentleman, "; if (uniform in captain) print "impeccably dressed in an ", (name)captain, "'s uniform"; else print "dressed in wizard's robes that are just a bit too small for him"; if (boots in captain) print ", and wearing an impressive pair of flight boots"; print ". He looks a bit run-down and tired, and his nose is reddened as from years of drink."; if (self.out == true) " He is snoring gently."; new_line; rtrue; ], waiting false, time_left, time_out [; remove booze; move captain to Terrace; move captain_key to pub_chair; move Shards to pub; self.out = true; self.waiting = false; self.mesmer = 0; MoveFloatingObjects(); Achieved(16); if (real_location == pub) { new_line; PlaySound(glassbreak); print_ret (The)self, " takes a long, last gulp of his ", (name)booze, ". A very queer look comes over his face. Suddenly, he sits bolt upright, clutching the glass tightly. With a sudden spray of glass, it shatters! He leaps to his feet, gazing fixedly at the wall. After a moment of staring in stricken terror, he emits a short, sharp, gasping scream, and charges eastward out of the pub, leaving a couple of items behind.^^There is a resounding crash from the terrace."; } if (real_location == Terrace) print_ret "^From the pub to the west, you suddenly hear a great commotion, a shattering of glass, and a moment later the captain barrels madly out of the pub, his face contorted in terror. Looking wildly over his shoulder, he crashes into the discarded beer barrels and rolls over onto his back, dead to the world."; rtrue; ], Chat 0, Topics 0, mesmer false, out false, information [person; switch (person) { crystal: if (self.out == true) "~That nobbler certainly did the trick. I wouldn't expect him to wake up for quite some time.~"; "~Oh, well, they say all the girls love someone in uniform,~ ", (giggles)crystal, ". ~Airship captain ", (i) "is", " top of the heap as uniforms go, but the captains are a bit too brash and boastful for my liking. Give me the calm and dignified person in wizard's robes every time.~ She flicks a sidelong glance at you, a hint of a blush starting on her cheeks."; crone: "~Airship captains!~ snorts ", (the)crone, ". ~Pah! Give them one fancy little mechanical device, and they're all set to abandon years of magical history, saying magic has no place in a modern society. Hmph!~"; akbar: "~Lovely people!~ cries Honest Akbar. ~Never would I impugn the career choice of an ", (name)captain, ", no matter how much the chosen career destroys my family's livelihood, which we have been building up for so many years!~"; betty: "~Oh, they're a right bunch of rakes, aren't they?~", (giggles)betty, ". ~I only wish airships had been around when I were a bit younger. I always did have a soft spot for uniforms.~"; hermit: "~Don't talk to me about those blasted ", (name)captain, "s,~ cries", (saysharp)hermit, ". ~Carting passengers up to my lonely mountaintop all the time... a man of my age deserves some peace and quiet!~"; captain: "~We're a breed apart", (murmurs)captain, " blearily. ~Pioneers of the skies, that's us. The future is machines and science, my friend.~"; guard: "~Theym captains ez a reet pairt of raffle-packs!~ declares ", (the)guard, ", scowling with disdain."; teller: "~We love the business you airship captains bring,~ smiles ", (the)teller, ". ~A hefty pay packet and a respectable demeanour.~"; } rfalse; ], initial [; if (self.out == true) "An ", (name)captain, " lies here, dead to the world."; if (real_location hasnt visited) { self.Chat = 0; give self general; "A man sitting at the table raises his bleary eyes as you enter. ~Ah, a wizard's apprentice!~ he cries, spying your robes. ~Don't talk to me about wizards and magic!~ he slurs."; } if (pub.hoopsack_arrive == true) { pub.hoopsack_arrive = false; print_ret (The) captain, " rubs his blearly eyes in surprise as you materialise. ~Perhaps I've overdone it a bit,~ he murmurs, looking down into his glass."; } print (The)captain, " "; if (self hasnt general) { self.Chat = 0; give self general; switch (random(7)) { 1: "looks up, bleary-eyed, as you step in to the pub."; 2: "glances up excitedly as you enter, but his face falls when he sees you. ~Oh, it's you,~ he mutters."; 3: "is still here, nursing his drink at the table."; 4 to 7: switch (random(100)) { 1 to 99: "sits at his table, sullenly nursing his drink."; 100: "is muttering to himself as you enter. ~Won't let me enter my own airship without my licence, just because of a minor docking problem. And today of all days, I leave it at home. That haddock won't deliver itself.~"; } } } switch (random(3)) { 1: "sits and fiddles with his drink, taking no notice of you."; 2: "turns a baleful eye in your direction. ~Don't try anything funny,~ he warns. ~I'm watching you.~"; 3: "is here, intent on the drink in front of him."; } ], each_turn [; if (self.out == true) rfalse; if (self.mesmer ~= 0 && location == Pub) { switch (self.mesmer) { 1 : print_ret "^", (The)captain, " suddenly sits up rock steady at the table, gazing intently at the snow globe. ~That's... incredible!~ he murmurs."; 2: print_ret "^", (The)captain, " continues to gaze at the snow globe, ignoring his surroundings. ~How does it do that?~ he mutters."; 3 to 4: print_ret "^", (The)captain, " continues to gaze at the snow globe, ignoring his surroundings."; 5: self.mesmer = 0; print_ret "^", (The)captain, " shakes himself suddenly and seems to snap out of his trancelike state. He looks around, bleary-eyed and confused."; } } if (self.Chat == 1 && location == Pub) { new_line; switch (random(50)) { 1 to 10: print (The)captain, " brushes an invisible speck of dust from his uniform."; 11 to 20: print (The)captain, " takes a large gulp of his drink and gazes sourly around the pub."; 21 to 25: print (The)captain, " gazes sourly around the pub."; 26 to 30: print (The)captain, " takes a small sip of his drink."; 31 to 35: print (The)captain, " sighs and shifts slightly in his chair."; 36 to 40: print (The)captain, " gazes deeply into his drink and sighs."; 41 to 45: print (The)captain, " glances in your direction and mutters something about wizards and magic under his breath."; 46 to 49: print (The)captain, " flicks an eye in your direction. ~Still here, are you? Well, why don't you go haunt someone else's favourite hangout?~"; 50: print "~Hah!~ snorts ", (the)captain, " noisily into his drink. ~Wearing my uniform, got my boots on, and they still won't let me board my airship, just because I left my airship licence at home.~"; } new_line; } self.Chat = random(3); rtrue; ], before [wd bk; if (self.out == true && action_to_be ~= ##Examine or ##DisrobeNPC) "He's out cold. Best just to leave him alone."; Consult: wn = consult_from; wd = NextWord(); switch (wd) { 'courage', 'take-off': "~Well, take-off is always a bit harrowing", (admits)captain, ", ~but it's far easier than docking.~"; 'docking': "~Docking!~ mutters ", (the)captain, " grimly, staring straight ahead. He exhales slowly and then takes a long pull at his drink."; 'haddock': "~I have an overdue load of haddock to deliver to Vechlee,~ says ", (the)captain, ", ~but those nymphs at the dirigible dock won't let me onto my airship, just because I left my licence at home.~"; 'specially', 'special', 'balanced', 'diet': "~Booze and cheese mainly,~ shrugs ", (the)self, (string)period; 'turthalio', 'michael': "~Rules all of Thalion,~ says ", (the) self, ", ~but never set eyes on him myself.~"; 'vechlee', 'blumph': "~I make the run from Blumph to Vechlee regularly,~ declares ", (the)self, ", ~and I can tell you that Vechlee's a dump, and Blumph is a dive.~"; 'dump', 'dive': "~Yes, a ", (address)wd, ",~ nods ", (the)self, " sagely."; 'thalion', 'country', 'land', 'world': "~It's all right. Glad to see it's finally shaking off the preoccupation with magic in favour of science.~"; 'preoccupa', 'magic', 'science', 'dying': "~Science is the future,~ declares ", (the)captain, ". ~Magic is dying.~"; 'wizard', 'wizards', 'wizard^s': "~Bunch of interfering busybodies, always insisting that there's no rational explanation for airships flying, apart from magic.~"; 'apprentic': "~Wizards in training,~ grunts ", (the)captain, ". ~Just as bad as the real thing.~"; 'rational', 'explanati': "~If wizards don't understand it, it must be magic. That's their attitude,~ scoffs ", (the)captain, (string)period; 'Ninario', 'nin', 'ninny': "~Ninario the wizard is one of the better ones", (admits)captain, ". ~I can actually talk to him about scientific principles.~"; 'scientifi', 'principle', 'dynamics', 'laws', 'motion': "~Oh, you know, laws of motion, airship dynamics, that sort of thing,~"; } do { wn = consult_from; bk = ParseToken(SCOPE_TT, AskableScope); } until (bk ~= GPR_REPARSE); if (bk == GPR_FAIL) "~I'm not sure I can tell you anything too useful,~ shrugs the airship captain. ~I don't really know what you're asking about.~"; if (bk.information(self) == true) rtrue; "~I'm not sure I can tell you anything too useful,~ shrugs the airship captain."; Attack: print "It wouldn't be nice to hit a man down on his luck."; if (crystal has general) print " Besides, what would ", (the)crystal, " think?"; new_line; rtrue; BuyFrom: if (noun == self) <>; DisrobeNPC: if (uniform in captain) <>; "It was more than enough work getting the uniform off him, let alone the robes. Just leave him be."; Kiss: "~Hey!~ cries ", (the)captain, " as you lean in for a quick smooch. ~I'm drunk, but not ", (i) "that", " drunk that I'll start snogging apprentices.~"; Listen: "Apart from the odd quiet slurp of his drink, he's not making any particular noise."; MeetNPC: "The airship captain grunts in your direction."; Smell: "He smells of alcohol and Gruyere cheese, not a particularly compelling combination."; Smile: "~Stop all that smiling,~ frowns ", (the)self, ", sinking lower into his chair. ~It's too loud.~"; Talk: "The airship captain glances up at you."; Take,Remove,Search,Transfer,Touch: "~Hands off!~ scowls ", (the)captain, ". ~You can look, but don't touch.~"; Thank: print_ret (The)captain, " scowls at you. ~What for? I don't intend doing anything for you, youngster.~"; ], nomatch [; "~I'm not sure I can tell you anything too useful,~ shrugs the airship captain."; ], life [; if (captain.out == true) "He's out cold, so nothing much happens."; Answer: if (noun == 'hello' or 'hi') <>; print_ret "The airship captain glances up at you. ~Why don't you find someone else to pester?~"; Give: <>; Show: if (noun ofclass Cheese) print_ret (The)captain, " gives it a quick glance. ~Gruyere's better than ", (the)noun, ",~ he says dismissively."; <>; Tell: if (WordInProperty(second, anchor, name)) { <>; } print_ret "~No,~ says ", (the)captain, ", shaking his head. ~Not sure how I gave you the impression that I was interested in that.~"; ], orders [; if (captain.out == true) "He's in no condition to listen to your orders."; Give: if (noun == Gruyere) "~I don't think so!~ cries ", (the)captain, ". ~I'm saving that for later. Hands off the Gruyere.~"; if (noun == uniform) "~Not on your nelly!~ says", (saysharp)captain, ". ~Only those privileged to fly the skies in the airships get the fancy uniforms.~"; MeetNPC: <>; default: "~Look,~ says ", (the)captain, ". ~I'm sure you're a nice apprentice, but you're cutting into drinking time.~"; ], has animate male transparent; Askable -> -> -> uniform "captain's uniform" with name 'uniform', adname 'broadclot' 'captain^s', description "It's a woven broadcloth captain's uniform, a bit worn with time, but well-tailored, clean, and sharp-looking.", information [person; switch (person) { crystal: if (Pub has visited) { print "~A bit worn, but still well-looked after, that's my judgement", (murmurs)crystal, (string)period_newline; if ((captain in pub_chair && location == Pub) && (captain.out == false)) { "^~Hey!~ cries", (saysharp)captain, " seeing you checking the uniform over. ~This uniform has been on more flights than most of the other airship captains put together!~"; } rtrue; } akbar: "~Who doesn't love the uniform of the airship captain?~ cries ", (the)akbar, ". ~But how much better ", (i) "any", " attire would look streaming out behind you on a brand-new flying carpet.~"; crone: if (magic_clothes in player) "~Airship captains love their uniforms, that's certain,~ says ", (the)crone, ". ~I sometimes wonder if that's all that matters, looking the part.~"; "~Doesn't really suit you,~ sniffs ", (the)crone, ", looking askance at the uniform, ~but you might fool somebody with it.~"; captain: "~It's a mark of my exalted position as an airship captain,~ sniffs ", (the)captain, ". ~Tasteful, but understated.~"; hermit: "~Don't talk to me about those blasted ", (name)captain, "s,~ cries", (saysharp)hermit, ". ~Carting passengers up to my lonely mountaintop all the time... a man of my age deserves some peace and quiet!~"; guard: "~Smart,~ shrugs ", (the)guard, ", glancing at the uniform. ~But naht s'smart ez sum.~ He glances down at his own uniform."; teller: "~Very neat and tidy,~ smiles ", (the)teller, " approvingly."; } rfalse; ], before [; Disrobe,Take,Transfer: if (captain.out == true && self in captain) { print "~Oh my goodness!~ exclaims ", (the)crystal, ", hiding her eyes as you rapidly and efficiently strip the uniform from the airship captain. ~Please tell me when you've finished!~^ ^You put to use long-forgotten skills learned in school changing rooms and quickly swap your garments with ", (the)captain, "'s.^ ^~Well, I'm glad that's over,~ says ", (the)crystal, ", peeking out between her fingers. ~Hmmm,~ she says, looking you up and down critically. ~Not bad!~^"; move magic_clothes to captain; move self to player; MoveFloatingObjects(); captain.hint = 0; Achieved(17); tattler.add_story(DRUNKEN_APPRENTICE, 10); StartTimer(drunken_apprentice_timer, 10); rtrue; } else if (captain.out == true) "~Let's just leave it on, now you're wearing it,~ suggests ", (the)crystal, " primly."; "~Hey!~ says", (saysharp)captain, ". ~Only those privileged to fly the skies in the airships get the fancy uniforms.~"; Examine, Show: rfalse; default: if (captain.out == true) rfalse; "You don't need to worry about the uniform."; ], has clothing worn; Askable -> -> -> boots "flight boots" with name 'boots', adname 'flight', description "A pair of sharp-looking brown leather flight boots.", article "a pair of", before [; Disrobe,Take,Transfer: if (captain.out == true && boots in captain) { print "~Goodness me!~ murmurs Crystal as you begin tugging off the captain's boots. ~Danger, excitement and the unexpected is what Ninny told me to expect with you. He wasn't far wrong,~ she adds as you stand up in triumph, the boots in your hand.^"; move boots to player; give boots ~worn; MoveFloatingObjects(); if (action_to_be == ##Take or ##Disrobe || (action_to_be == ##Transfer && second == player)) rtrue; new_line; rfalse; } else if (captain.out == true) rfalse; "~Hey!~ says", (saysharp)captain, ". ~Only those privileged to fly the skies in the airships get the fancy boots.~"; Examine: rfalse; Wear: if (slippers has worn && slippers in player) { print "(removing the slippers first and exposing your filthy socks)^"; give slippers ~worn; } rfalse; default: if (captain.out == true) rfalse; "You don't need to worry about the flight boots."; ], information [person; switch (person) { crystal: if (Pub has visited) { print "~Sharp-looking boots those flight captains wear", (murmurs)crystal, (string)period_newline; if (captain in pub_chair && location == Pub) { "^~Yes indeed!~ cries ", (the)captain, " proudly, seeing you checking out his boots. ~Best boots in the business, these!~"; } rtrue; } crone: if (boots in player && boots has worn) "~Hmm!~ sniffs ", (the)crone, ", looking down at the boots. ~I think the magician's slippers are more your style.~"; "~Airship captains love their precious boots, that's certain,~ says ", (the)crone, ". ~I sometimes wonder if that's all that matters, looking the part.~"; captain: "~They're a mark of my exalted position as an airship captain,~ sniffs ", (the)captain, ". ~They make a bold statement about my commitment to flight.~"; guard: "~Tha ceean't see 'em but ah hez ma proper bootz an' all,~ declares ", (the)guard, ". ~And they ez passin' fair smart.~"; teller: if (boots in player && boots has worn) "~They're lovely, captain, I'm sure,~ says ", (the)teller, ", sounding a bit confused about this line of questioning."; } rfalse; ], after [; Disrobe: print "You slide your feet out of the boots.^"; move socks to player; give socks worn; MoveFloatingObjects(); if (crystal has general) { print "^~Is that the cleanest pair of socks you had?~ asks ", (the)crystal, " critically.^"; YesNo.Ask(slippers.SockYes,slippers.SockNo,0); } rtrue; Wear: remove socks; MoveFloatingObjects(); print "You slip your feet into the boots, removing the filthy socks from the scrutiny of the world.^"; if (crystal has general) { print "^~That's much better", (murmurs)crystal, ". ~You look much more presentable with those socks out of sight.~^"; } rtrue; ], has clothing worn pluralname; Outroom Terrace "Terrace" with description [; #Ifdef GRAPHICS_ENABLED; if (location hasnt visited) { RevealBlumph(self.map_offset); } #Endif; "This small terraced area, open to the sky, is used for the storage of empty beer barrels."; ], cant_go "The only way out of here is west back into the pub.", compass_look [obj; if (obj == w_obj) "The pub lies back to the west."; return self.Outroom::compass_look(obj); ], Floor STONE_TILES, #Ifdef GRAPHICS_ENABLED; map_offset 9, comp_mask W_MASK, #Endif; w_to [; print "You step back into the pub.^"; return Pub; ]; Prop -> barrels "barrels" with name 'barrel' 'barrels', adname 'empty' 'beer', description "It's a pile of discarded beer barrels."; Askable captain_key "front door key" with name 'key', adname 'front' 'door', description "This is an ordinary front door key.", information [person; switch (person) { crystal: "~I think it's the key to the airship captain's front door,~ says ", (the)crystal, (string)period; crone: if (self in location || self in player || self in Rasp_Satchel) "~Perfectly ordinary front door key,~ says ", (the)crone, " glancing at it. ~It's not mine.~"; rfalse; captain: "~I've been sitting here all day, and only just noticed it's not in my pocket,~ says ", (the)captain, " glumly."; guard: "~Tha'll not get t'key for t'spot ah'm guarthing here,~ shrugs ", (the)guard, ". ~Theyt'un ez in mah pocket.~"; hermit: if (self in location || self in player || self in Rasp_Satchel) "~It's not the key to my display cabinet,~ says ", (the)hermit, " glancing at it. ~That's all I can tell you.~"; "~Key? What key?~"; } rfalse; ]; Outroom Dir_Docks "Dirigible Docks" with description [; "This airship docking area consists of a rigid metal gantry that extends out on either side. Spaced at regular airship-sized intervals are small gangplanks for entering or exiting docked airships. Below you, the metal stairway leads back to the pier."; ], cant_go "You can head north into the docked airship or back down to the pier.", #Ifdef GRAPHICS_ENABLED; map 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 13 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 26 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 39 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 52 0 0 0 0 0 0 6 0 0 0 0 0 0 ! 65 0 0 0 0 0 0 10 0 0 0 0 0 0 ! 78 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 91 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 104 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 117 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 130 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 143 0 0 0 0 0 0 0 0 0 0 0 0 0, ! 156 map_offset 0, comp_mask D_MASK | N_MASK, #Endif; attempts 0, d_to [; print "You descend the towering metal stairway back to the pier.^"; return Pier; ], n_to [; if (self.attempts ~= 99) { if (self.attempts ~= 1) { print "A tiny warning nymph appears, floating in the air beside your ear."; self.attempts = 1; } else { if (self.attempts == 1) self.attempts = 2; print "The warning nymph promptly reappears."; } new_line; new_line; if (magic_clothes in player) { print "~Sorry sweetie,~ she purrs in honeyed tones, ~but this vessel is scheduled for a cargo run, so only registered Blumph Airship employees are permitted on board. And you certainly don't look the part in those apprentice's robes! If you ", (i) "are", " an employee, go get into the appropriate attire and then we'll talk"; } else if (boots notin player) { print "~Well, I'm glad you found yourself a uniform,~ she says approvingly, ~but that's not quite good enough."; if (slippers in player && slippers has worn) { print " Those magician's slippers are a bit of a dead giveaway, sweetie!"; } else { print " I can't possibly let you on board without the proper footwear. Especially not with those filthy socks!"; } print " Come back when you've found some flight boots"; } else if (boots hasnt worn) { self.attempts = 1; print "~Oooh, a uniform ", (i) "and", " flight boots! "; if (self.attempts == 1) print "Very impressive!"; else print "That's more like it."; print " But what's this? You can't even be bothered to put the boots ", (i) "on?", " Come on sweetie, let's make an effort with this deception here"; } else if (licence notin player) { print "~Oooh, a uniform ", (i) "and", " flight boots! "; if (self.attempts == 1) print "Very impressive!"; else print "That's more like it."; print " But what's this? "; if (index_card in player) print "A picture of you on a souvenir card that says ", (i) "right on the front of it", " that it's a free sample? What do you take me for? I'm s"; else print "No licence? S"; print "orry sweetie, but all the airship captain paraphernalia in the world won't help without a valid licence! For all I know, you purchased all this at the Blumph Airship souvenir shop and costume emporium (currently closed for repairs following this airship's latest docking manoeuvre). Come back when you can prove you're qualified to fly this thing"; } else if (index_card in player) { print "~Oooh, a uniform ", (i) "and", " flight boots! "; if (self.attempts == 1) print "Very impressive!"; else print "That's more like it."; print " But what's this? A picture of you on a souvenir card that says ", (i) "right on the front of it", " that it's a free sample? What do you take me for? I'm sorry sweetie, but all the airship captain paraphernalia in the world won't help without a valid licence! For all I know, you purchased all this at the Blumph Airship souvenir shop and costume emporium (currently closed for repairs following this airship's latest docking manoeuvre). Come back when you can prove you're qualified to fly this thing"; } else if (licence hasnt general) { print "~Let's see,~ she says briskly. ~Uniform? Check. Flight boots? Check. Licence? Check. Verification of licence?~ She swoops down and peers at the picture and then glances at your face, her eyebrows arching in disbelief. ~Oh, come on, sweetie, credit me with some perspicacity here. All this tells me is that you've mugged some poor airship captain of his uniform, boots and licence. I hope he's not lying drunk behind some pub! Come back when you have the proper credentials"; } else { print "~All right, let's see here. You've got a uniform, you've got some flight boots, you've got yourself a licence with your picture on it, and you waltz in here expecting to captain an airship? "; if (self.attempts == 1) { print "Sure, why not? It all seems perfectly legitimate to me. Welcome aboard captain. Just try not to park the anchor in the residential district next time, all right?~"; } else { print "Now, you and I both know you've already tried to get in here today without all this, so while I truly doubt you're a legitimate captain, I'm honestly not sure this airship can survive any more of the questionable manoeuvres of its overly-optimistic previous captain. So you know what? Go ahead, and best of luck. You can't do much worse than the other one.~"; } print " With a pop, the nymph vanishes, and you walk along the gangplank into the airship.^"; Achieved(29); self.attempts = 99; #Ifdef GRAPHICS_ENABLED; Dir_Docks.&map-->58 = 2; #Endif; return airship_bridge; } print ", all right? Bye!~^^She disappears with a wink.^"; rtrue; } if (Arrivals_Dock has visited) { print "With the experience of the seasoned professional, you board the airship and easily pilot it back to Vechlee.^"; return Arrivals_Dock; } print "Unimpeded by any pesky warning nymphs, you walk along the gangplank into the airship.^"; return airship_bridge; ], compass_look [obj; if (obj == d_obj) "It's a long way down to the pier."; if (obj == n_obj) <>; return self.Outroom::compass_look(obj); ], Floor METAL_GRATING; Prop gangplank "gangplank" with name 'gangplank', description "It's just a regular-looking gangplank.", found_in Arrivals_Dock Dir_Docks, before [; Examine: rfalse; default: "The gangplanks are perfectly ordinary. Don't worry about them."; ]; !==================================================================================================================================================== ! Airship Room airship_bridge "Airship gondola" with description "The gondola is a long and narrow vessel suspended from the bottom of the airship. Most of the volume is taken up by the cargo hold, accessible only via a different external door. The gondola's windows afford an excellent view out the sides and front of the airship. Just below the main window, there is a large joystick set into the floor. In the front wall of the gondola, just below the window, are two large levers, one made of brass and the other of shiny steel.", #Ifdef GRAPHICS_ENABLED; map 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 13 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 26 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 39 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 52 0 0 0 0 0 0 1 0 0 0 0 0 0 ! 65 0 0 0 0 0 0 6 0 0 0 0 0 0 ! 78 0 0 0 0 0 0 14 0 0 0 0 0 0 ! 91 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 104 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 117 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 130 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 143 0 0 0 0 0 0 0 0 0 0 0 0 0, ! 156 map_offset 0, comp_mask S_MASK | OUT_MASK, #Endif; cant_go "The only way out of here is south back to the docking area.", s_to [; if (joystick.air == 0) { if (ignition_lever has open) { give ignition_lever ~open; print "(turning off the ignition by pushing in ", (the)ignition_lever, " first)^"; } print "You exit the airship and head back to the docking area.^"; return Dir_Docks; } "But you're airborne!"; ], out_to [; <>; ]; Prop -> airship_window "windows" with name 'window' 'windows', adname 'airship', description "The large windows reach from the middle of the gondola to the ceiling, filling the front and sides of the gondola.", before [; Attack: "Your attack bounces harmlessly off. These windows have evidently been reinforced with the aim of defeating destructive vandals such as yourself."; Close: "They're already closed permanently."; JumpThrough: "No, that probably wouldn't be wise."; Open,Unlock: "You can't find a latch or lock anywhere. These windows are not the opening kind."; Search: give self general; "The great expanse of Blumph spreads out below you. You're over the centre of town so there are lots of tall buildings."; ], has pluralname; Prop -> airship_buildings "buildings" with name 'town' 'building' 'buildings' 'home' 'residence' 'foundatio' 'view', adname 'large' 'domed' 'stately' 'lord' 'mayor^s' 'science', description "The great expanse of Blumph spreads out below you. You're over the centre of town so there are lots of tall buildings. You're not sure what they all are, but you can see a large domed building and a large stately home.", information [person; switch (person) { crystal: if (Testscope(self)) { "~I'm not certain what they all are", (admits)crystal, ", ~but the domed building is the science foundation and the stately home is the Lord Mayor's residence.~"; } } ], has pluralname; Prop -> ignition_lever with name 'lever', adname 'ignition' 'brass', description [; if (self hasnt general) { print (The)self, " reads ", (i) "Ignition", ". It looks like it"; give self general; self.short_name = "brass ignition lever"; } else print "It looks like ", (the)self; " could be pulled to start the ignition sequence."; ], short_name [; print "brass lever"; rtrue; ], before [; Close: if (self hasnt open) "Nothing happens. The engines are not currently ignited."; if (joystick.air == 0) { give self ~open; "You push the ignition lever back in, closing the throttle. The airship engines sputter and stop."; } "If you turn off ignition while the airship is airborne, it might coast for a bit, but you need to be going faster first. You don't want to plunge to the ground."; Examine: rfalse; Push,Pull: if (self has open) <>; <>; Use,Turn,SwitchOn: <>; Open: if (self has open) "The ignition is already on."; give ignition_lever open; #Ifdef SOUND_ENABLED; PlaySound(airstart); #Endif; "A deep rumbling begins in the bowels of the airship, shaking the whole gondola as the mechanical systems are triggered by the ignition system. Suddenly with a roar, you hear the engines start up!^ ^~I hope you know what you're doing", (murmurs)crystal, "."; default: "It's an integral part of the airship, and best left alone."; ], has openable; Askable -> joystick "joystick" with name 'stick' 'joystick', adname 'joy', description "A long joystick for directing the movement of the airship.", air 0, asked false, before [; Examine: rfalse; Lift,Pull,Push,PushDir,Use,Turn,SwitchOn: if (joystick.air ~= 0) { "You pilot the airship with careful manipulations of the joystick, not really sure what you're doing."; } if (ignition_lever has open) { print "You push the joystick and there is a roar as the engines strain mightily to propel the craft forward. The whining increases to a fever pitch"; if (anchor.anchored == true) { if (joystick.attempts < 5) joystick.attempts++; print ", but the airship doesn't move. You can hear the engines struggling to overcome some force holding the airship back.^ ^~You'd better stop!~ calls out ", (the)crystal, ". ~Something is stopping us moving!"; if (joystick.attempts == 5) print " I think it must be the anchor! It's still caught over in the residential district!"; "~^ ^Reluctantly, you release the joystick."; } joystick.air = 1; #Ifdef GRAPHICS_ENABLED; airship_bridge.&map-->84 = 0; airship_bridge.&map-->97 = 0; airship_bridge.comp_mask = 0; DrawMain(); #Endif; if (cargo_lever has open && cargo_lever.dtime == 0) { StartDaemon(cargo_lever); } Achieved(30); " and the airship begins to move! The gondola door shuts behind you as you take to the skies.^ ^~You're flying an airship!~ cries ", (the)crystal, " in delight. ~This is the best day ever!~"; } "You hear a mechanical hum as the rudders and elevators move in response to the movements of the joystick, but nothing else happens."; default: "You don't need to fidget about with ", (the) self, " like that."; ], each_turn [; if (cargo_lever hasnt open && self.air ~= 0 && cargo_lever.dtime == 0) { if (self.air < 5) self.air++; switch(self.air) { 1: "^You struggle mightily with the controls but can't seem to get the airship to move any higher."; 2: "^The engines are straining mightily, but there just doesn't seem to be any lift at all."; 3: "^The airship continues to struggle. It seems to be carrying too much weight."; 4: "^The airship doesn't seem like it's going to go any higher!"; 5: "^You're not sure how long the engines can keep up this mighty struggle.^ ^~Open the cargo doors! Let's lose some weight!~ cries ", (the)crystal, ". ~This is dangerous!~"; } } ], attempts 0, information [person; switch (person) { crystal: if (location == airship_bridge) "~I think it's used to fly the airship,~ says ", (the)crystal, (string)period; } ], FakeObj, has scenery; Askable -> cargo_lever with name 'lever' 'door' 'doors', adname 'shiny' 'steel' 'cargo' 'door', description [; if (self hasnt general) { print (The)self, " reads ", (i) "Open cargo doors", ". It looks like it"; give self general; self.short_name = "steel cargo door lever"; } else print "It looks like ", (the)self; print " could be "; if (self has open) print "pushed to close"; else print "pulled to open"; " the cargo doors."; ], short_name [; print "steel lever"; rtrue; ], before [; Close: if (joystick.air ~= 0) { "It won't budge!^ ^~Uh oh,~ says ", (the)crystal, " worriedly. ~I think once we've started a cargo dump, it's going to stay open.~"; } Open,Examine: rfalse; Push,Pull: if (self has open) <>; <>; Use,Turn,SwitchOn: <>; default: "It's an integral part of the airship, and best left alone."; ], after [; Open: if (joystick.air ~= 0) { StartDaemon(cargo_lever); } #Ifdef SOUND_ENABLED; PlaySound(cargodoor); #Endif; print "There is a grinding noise as the airship's cargo doors open"; if (joystick.air == 0) { ", but nothing comes out of the hold.^ ^~I guess there's not enough angle on the decks for the cargo to jettison,~ sighs ", (the)crystal, ". ~Perhaps once we're airborne.~"; } "."; Close: #Ifdef SOUND_ENABLED; PlaySound(cargodoor); #Endif; "There is a grinding noise as the airship's cargo doors close."; ], dtime 0, daemon [; if (self.dtime < 6) self.dtime++; if (self.dtime == 1) { tattler.add_story(HADDOCK_RAIN, 4); StartTimer(haddock_rain_timer, 4); } if (self.dtime == 2) { move haddock to location; "^You hear a slithering noise from below. Glancing out the window, you see raw fish dropping out of the open cargo hold.^ ^~Oh my,~ says ", (the)crystal, " in surprise. ~Haddock!~"; } if (self.dtime == 3) "^~Haddock discharge still in process!~ ", (the)crystal, " calls out as the volume of haddock falling out of the airship increases. The weight of the cargo, while lessening, is still holding the airship back.^ ^You struggle desperately with the joystick as a domed building looms large in the window."; if (self.dtime == 4) "^The rain of haddock accelerates, but not quickly enough! With an alarming crunch, the gondola crashes into the domed building, smashing out a number of windows and leaving several sizeable holes.^ ^~Oh, not the science foundation!~ laments ", (the)crystal, " as she sees the damage."; if (self.dtime == 5) { tattler.add_story(DOME_BREAKAGE, 4); StartTimer(dome_breakage_timer, 4); "^With a slithery flipping noise, a deluge of haddock tumbles directly into the hole in the dome. The airship, lightened of most of its load, finally achieves the height you need and climbs to a cruising altitude.^ ^~Nice flying!~ cheers ", (the)crystal, " as you point the noise in an easterly direction."; } if (self.dtime == 6) { StopDaemon(self); print "^There is a last crunching noise behind you and you look to see the dangling anchor catch on the upper edge of a large stately home, peeling the roof off like the skin from an onion. A top-floor ballroom, complete with in-progress party, is exposed to the elements.^ ^~Whoops!~ says ", (the)crystal, ". ~I think that's the Lord Mayor's residence. Well, never mind! It was only our first time. Onward to Vechlee!~^ ^You angle the joystick and head for Vechlee, just visible on the horizon. Behind you, the last of the haddock tumbles out of the cargo hold and onto the lord mayor's residence.^"; #Ifdef SOUND_ENABLED; PlaySound(airfly); #Endif; PlayerTo(Arrivals_Dock); MoveFloatingObjects(); Achieved(31); rtrue; } ], information [person; switch (person) { crystal: if (location == airship_bridge) "~Well, reading the fine print, it would appear to control the cargo doors,~ says ", (the)crystal, (string)period; } ], has scenery openable; Prop -> levers "levers" with name 'levers', adname 'both', before [; Close,Push: print "(closing the ignition lever first)^"; ; new_line; print "(closing the cargo lever next)^"; ; rtrue; Examine: ; new_line; ; rtrue; Open,Pull,Use,Turn,SwitchOn: print "(opening the ignition lever first)^"; ; new_line; print "(opening the cargo lever next)^"; ; rtrue; default: "They're an integral part of the airship, and best left alone."; ], has openable; Prop Haddock "haddock" with name 'haddock', description "The haddock are descending over much of Blumph in a gentle slapping rain.", information [person; switch (person) { crystal: "~I hope dumping a load of haddock over Blumph from the air doesn't constitute an act of war,~ murmurs ", (the)crystal, ". ~Mind you, at least it's not rotting.~"; } ]; !==================================================================================================================================================== ! Oak Street area Outroom Oak_Street "Oak Street" with description [; #Ifdef GRAPHICS_ENABLED; if (location hasnt visited) { RevealBlumph(self.map_offset); } #Endif; brickdoor.auto_unlock = false; brickdoor.auto_lock = false; "The main street of the residential district is packed with people bustling about their business. Tall houses line both sides of the street. North leads back towards the high street, and northwest a back-lane heads towards the marketplace.^ ^Two houses on the eastern side of the road catch your eye; both the brick house to the northeast and the wooden doorless house to the southeast appear uninhabited, which seems odd for such a busy area. A small alley leads east between the two houses."; ], cant_go "North takes you back to the high street, northwest to the marketplace, while east heads into the narrow alleyway. The two abandoned houses are to the northeast and southeast.", #Ifdef GRAPHICS_ENABLED; map_offset 265, comp_mask N_MASK | NW_MASK | E_MASK | NE_MASK | SE_MASK | IN_MASK, #Endif; compass_look [obj; if (obj == e_obj) <>; if (obj == n_obj) "North, the residential area thins out as the street climbs back up to the high street."; if (obj == nw_obj) "Northwest, the residential area thins out as the back-lane climbs up toward the marketplace."; if (obj == ne_obj) <>; if (obj == se_obj) <>; return self.Outroom::compass_look(obj); ], n_to [; #Ifdef GRAPHICS_ENABLED; blumphmap-->399 = blumphmap-->399 & (~NODRAW_FLAG); #Endif; print "The street climbs quickly up to the high street and the noise and hubbub of shoppers and hawkers.^"; return High_Street; ], nw_to [; #Ifdef GRAPHICS_ENABLED; blumphmap-->397 = blumphmap-->397 & (~NODRAW_FLAG); #Endif; print "The back-lane climbs up toward the marketplace with its bustling crowd.^"; return Shops; ], w_to "The maze of densely-packed houses looks too intimidating to tackle.", e_to [; print "You walk into the narrow alleyway between the two abandoned houses.^"; return alleyway; ], s_to [; <>; ], ne_to brickdoor, in_to [; <>; ], se_to [; print "You step through the doorway, ducking under the low lintel.^"; return ground_floor; ], has proper; Prop -> narrow_windows "brick house's dark narrow windows" with name 'windows', adname 'boarded' 'up' 'narrow' 'dark' 'boarded-u', description "The narrow boarded-up windows of the brick house give it a forlorn, barren look.", before [; Attack: "You wind up and deliver the windows a crashing blow, but whoever did the boarding up knew what they were doing."; Enter,Open: "Sadly, the windows are boarded up too securely for you to pry them open."; Search: "The windows are boarded up too securely for you to see through."; ], has pluralname; Prop -> doorframe "missing front door" with name 'door' 'frame' 'doorway', adname 'empty' 'missing' 'front', description "The door frame of the wooden house is open and empty.", before [; Enter, Go, Use: <>; Examine: rfalse; default: "You don't need to worry so much about ", (the) self, (string)period; ]; Autodoor brickdoor "strong sturdy door" with adname 'front' 'strong' 'sturdy' 'brick', description [; print "The door of the brick house is a strong and sturdy one, doubtless to keep people from wandering in to the house."; if (self in ground_brick && self has locked) " The door, currently locked, can be trivially unlocked from this side via a deadbolt, which is good as you don't have the key."; print "^It is currently "; if (self hasnt locked) print "un"; "locked."; ], with_key 0, auto_unlock false, auto_lock false, auto_open true, ne_to ground_brick, sw_to Oak_Street, before [; Attack: "It's too strong and sturdy for that."; ], has ~open locked lockable; Prop alleyobj "alleyway" with name 'alley' 'alleyway', found_in Oak_Street first_floor alleyway second_floor_attic drain1 peak_roof, description "About ten feet wide, the narrow and confining alley runs east to west between the brick house and the wooden house.", before [; Enter: if (self in Oak_Street) <>; if (self in first_floor) <>; if (self in drain1) <>; if (self in second_floor_attic or peak_roof) "It's a bit of a long drop!"; "You're already in it!"; ]; Prop window_frames "wooden house's window frames" with name 'frames' 'window' 'frame' 'window-fr', adname 'empty' 'wooden' 'house^s', description [; print_ret (The) self, " stare emptily."; ], found_in Oak_Street ground_floor, before [; Attack: "As ", (the) self, " are empty, not much is served by trying to smash the windows into oblivion."; Enter,Go,Use: print "You clamber through the window and drop to the "; if (real_location == Oak_Street) print "floor. You did it! You're inside!^"; else print "ground. You did it! You're outside!^"; if (crystal has general) { new_line; print (the)crystal, " coughs gently. ~You ", (i) "did", " notice there's no door on this house, right?~^"; } if (real_location == Oak_Street) PlayerTo(ground_floor); else PlayerTo(Oak_Street); MoveFloatingObjects(); rtrue; Open: "But there's no glass in ", (the) self, "!^"; Search: print "Looking through the empty window frames, you "; if (location == Oak_Street) "see that the ground floor of this abandoned house is one large empty room with accumulated dirt and dust lining the floor."; "can see Oak Street."; Tie: if (verb_word == 'fix') print_ret (The)self, " ", (isorare)self, " beyond repair."; ], has pluralname; !==================================================================================================================================================== ! Alleyway Outroom alleyway "Narrow alleyway" with description [; #Ifdef GRAPHICS_ENABLED; if (location hasnt visited) { RevealBlumph(self.map_offset); } #Endif; "About ten feet wide, the narrow and confining alley runs east between the brick house and the wooden house. It ends to the east at a high wooden fence. West, it leads back out to Oak Street."; ], e_to "The high wooden fence looks too daunting to tackle. Besides, you don't want to lose yourself in the tangled alleyways of the residential district.", w_to [; print "You step out of the quiet alleyway and into the bustle of Oak Street.^"; return Oak_Street; ], #Ifdef GRAPHICS_ENABLED; map_offset 267, comp_mask U_MASK | W_MASK, #Endif; cant_go [; print "You can head west back to the bustle of Oak Street, or "; if (drainpipe has general) { "up the drainpipe and into the wooden house."; } "risk the rickety drainpipe."; ], u_to [; if (drainpipe has general) { print "You scurry up the drainpipe and through the window into the wooden house.^"; return first_floor; } print "You grab hold and begin inching your way gingerly up, the drainpipe rattling all the time.^"; return drain1; ], compass_look [obj; if (obj == e_obj) <>; if (obj == w_obj) "To the west, the quiet alleyway opens back up into the bustle of Oak Street."; return self.Room::compass_look(obj); ], out_to [; <>; ]; Prop -> alley_fence "high wooden fence" with name 'fence', adname 'high' 'wooden', description "The high wooden fence impedes further travel into the labyrinthine alleyways of the residential district.", before [; Attack: print "The fence is far too strongly constructed to yield to your assault.^"; if (crystal has general) "^~You'll hurt yourself", (murmurs)crystal, " warningly."; Climb: "The high wooden fence looks too daunting to tackle. Besides, you don't want to lose yourself in the tangled alleyways of the residential district."; ]; Prop first_floor_window "wooden house's first-floor window" with name 'window', adname 'wooden' 'first' 'house^s' 'floor' 'first-flo', description [; "The wooden house's first-floor window opens into the alleyway."; ], found_in alleyway first_floor drain1, before [; Enter: if (self in alleyway) { if (drainpipe has general) <>; <>; } <>; Search: if (self in alleyway) "It's on the first floor and you're at ground level, so it's a bit too high up."; "Looking through the window, you see the alleyway below."; ]; Prop second_floor_attic_window "wooden house's second-floor window" with name 'window' 'sill' 'windowsil', adname 'wooden' 'second' 'narrow' 'house^s' 'floor' 'second-fl', found_in alleyway second_floor_attic drain1, description [; print "The wooden house's second-floor window is an open, glassless frame facing into the alleyway, directly across from the "; if (anchor.anchored == true) { print "anchor embedded in the"; } " corresponding window in the brick house."; ], before [; Close: "This window has no glass to speak of and cannot be closed."; Enter, JumpThrough: "It's a bit of a long fall to the alleyway below, so you're safer staying where you are."; Open: "This window has no glass to speak of and is thus already open."; Search: if (self in alleyway or drain1) "You can't look through the second-floor window from here."; <>; ], has open; Prop wooden_house "wooden house" with name 'house' 'building' 'roof', adname 'doorless' 'wooden' 'peaked', description [; if (self in peak_roof) { "The wooden house is three storeys tall like the brick house, but with its peaked roof, it's much taller."; } if (self in alleyway or drain1) { "The wooden house, with its peaked roof, is the taller of the two. Up on the first floor, a window frame gapes emptily across the alleyway at the blank wall of the brick house. There's another window on the second floor, directly across from a window on the brick house.^^Here in the alleyway, there are no windows at ground floor level."; } if (self in first_floor or second_floor_attic) <>; "The wooden house's peaked roof makes it taller than the brick house, even though they're both three storeys. It's in much worse shape, however. Its front door is missing, and the window frames stare emptily."; ], found_in Oak_Street alleyway peak_roof first_floor second_floor_attic drain1, before [; Enter,Go,Use: if (self in peak_roof) <>; if (self in alleyway) { if (drainpipe has general) <>; "There are no doors or windows into the wooden house on the ground floor."; } <>; ]; Prop brickhouse "brick house" with name 'house' 'building' 'roof', adname 'flat' 'brick' 'tall' 'narrow', found_in Oak_Street alleyway peak_roof drain1 second_floor_attic, description [; print "The brick house is a tall, narrow, three-storied building with a flat roof. "; if (self in peak_roof) { print "Its flat roof is quite a ways below your position here on the peaked roof. You almost feel that you could jump over to it from here.^"; if (anchor.anchored == true) { new_line; <>; } rtrue; } if (self in alleyway) { print "It's shorter than the wooden house and has just one window, up on the second floor, directly across from a window on the wooden house.^"; if (anchor.anchored == true) { new_line; ; } new_line; <>; } print "Its narrow boarded-up windows give it a forlorn, barren look. The sturdy front door is closed.^"; if (anchor.anchored == true) { new_line; <>; } rtrue; ], information [person; switch (person) { crystal: if (anchor.anchored == true) { switch(location) { peak_roof: "~Well,~ muses ", (the)crystal, ", ~because the roof is flat, it's quite a ways below us. If we could get some lift, we might be able to jump over there.~"; alleyway, Oak_Street: "~If we could get up above it, we might be able to jump down to it,~ says ", (the)crystal, "."; Oak_Street: "~It's not in the greatest shape, is it?~ asks ", (the)crystal, ". ~But I imagine we could push that anchor free if we could get up there.~"; } } captain: "~They shouldn't have parked that house right where I wanted to anchor,~ mutters ", (the)captain, "."; } ], before [; Attack: "If this were your abandoned house, you wouldn't want roaming apprentices damaging it. Besides, you'll give Oxbridge students a bad name."; Enter: if (self in alleyway) "There doesn't seem to be an easy way into the brick house from here."; if (self in peak_roof or second_floor_attic) "It's a bit of a long leap, even from here."; "The door to the brick house seems to be securely locked."; ]; Prop second_brick_window "brick house's second-floor window" with name 'window', adname 'brick' 'second' 'house^s' 'floor' 'second-fl', description [; print "The brick house's second-floor window opens into the alleyway"; if (self in Oak_Street or alleyway or second_floor_attic or drain1 or peak_roof or second_brick) { print ".^"; if (anchor.anchored == true) { new_line; ; } rtrue; } ", directly across from a corresponding window in the wooden house. It looks very heavily built, which explains why the anchor hasn't just ripped right through it."; ], before [; Enter,JumpThrough: if (location == second_brick) "It's a long way down to the alley below. You decide against it."; "You can't reach that window from here."; Search: <>; ], found_in Oak_Street alleyway second_floor_attic peak_roof drain1 second_brick; !==================================================================================================================================================== ! Drainpipe rooms Outroom drain1 "Partway up the drainpipe" with description "Up here, level with the first floor, the drainpipe seems even more rickety than it did at ground level. It shudders alarmingly from time to time.", d_to [; print "With palpable relief, you slide back down the drainpipe to the safety of the alleyway.^"; return alleyway; ], #Ifdef GRAPHICS_ENABLED; map 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 13 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 26 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 39 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 52 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 65 0 0 0 0 0 0 8 0 0 0 0 0 0 ! 78 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 91 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 104 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 117 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 130 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 143 0 0 0 0 0 0 0 0 0 0 0 0 0, ! 156 map_offset 0, comp_mask U_MASK | D_MASK | OUT_MASK, #Endif; u_to [; print "With a deep breath, you inch even further up the drainpipe. The shaking increases and you instinctively tighten your grip.^ ^There is a sudden alarming squeak and the drainpipe pulls some distance out from the wall!^ ^~Oh no!~ moans ", (the)crystal, ". ~Here we go!~^ ^There is one last squeaking sigh and the drainpipe pulls completely away from the wall. You hang on tightly, eyes closed, as the drainpipe totters backwards towards the wooden house. You brace yourself for impact as the drainpipe slams into the side of the wooden house, and you are pitched unceremoniously through the first-floor window and land painfully inside the wooden house.^"; #Ifdef SOUND_ENABLED; PlaySound(drainsqueak); #Endif; give drainpipe general; #Ifdef GRAPHICS_ENABLED; first_floor.comp_mask = first_floor.comp_mask | N_MASK; #Endif; return first_floor; ], out_to [; <>; ], cant_go "Back down to the alley or further up the drainpipe are the only options from here.", compass_look [obj; if (obj == u_obj) "You still have a ways to climb up before you're level with the anchor."; if (obj == d_obj) "You decide, on balance, that looking down whilst clinging precariously to a rickety drainpipe would not be the best idea."; "You're busy enough hanging on to the drainpipe right now."; ], before [; Exit: if (player in location) <>; rfalse; ]; !==================================================================================================================================================== ! Wooden house Room ground_floor "Ground floor" with description [; #Ifdef GRAPHICS_ENABLED; if (location hasnt visited) { RevealBlumph(self.map_offset); } #Endif; print "The ground floor of this abandoned house is one large empty room. Accumulated dirt and dust line the floor, and "; if (stairs has general) print "the remains of "; print "some rickety-looking stairs "; if (stairs has general) print "lie in a heap on the floor. There is a large opening in the ceiling"; else print "lead up"; ". Empty window frames gaze forlornly out to Oak Street, and a low doorway to the northwest leads back that way."; ], #Ifdef GRAPHICS_ENABLED; map_offset 331, comp_mask NW_MASK | U_MASK | OUT_MASK, #Endif; Walls ROUGH_WOOD, Floor DIRT, compass_look [obj; if (obj == u_obj) <>; if (obj == nw_obj) "The low doorway leads back out to Oak Street."; return self.Room::compass_look(obj); ], cant_go [; print "You can head northwest out the door to Oak Street, or "; if (stairs has general) "try getting up through the hole in the ceiling somehow."; "risk the stairs."; ], out_to [; <>; ], nw_to [; print "You duck out of the doorway and back into the street.^"; return Oak_Street; ], u_to [; if (stairs has general) "Now that the stairs have collapsed, getting up to the first floor this way is impossible. The opening is too high to reach."; give stairs general; stairs.short_name = "opening"; move plank to ground_floor; ! Remove U_MASK from list of directions #Ifdef GRAPHICS_ENABLED; self.comp_mask = NW_MASK | OUT_MASK; blumphmap-->529 = 2; Drawmain(); #Endif; #Ifdef SOUND_ENABLED; PlaySound(stairsbreak); #Endif; MoveFloatingObjects(); print "You step out gingerly onto the stairs, but it's no good. When you are midway "; if (real_location == ground_floor) print "up"; else print "down"; print ", the rickety stairs collapse underneath you in a heap of wooden planks and dust, dumping you unceremoniously on your backside, leaving a large opening in the ceiling.^"; if (crystal has general) "^~So much for getting up that way,~ sighs ", (the)crystal, (string)period; rtrue; ]; Prop -> dirt_and_dust "dirt and dust" with name 'dirt' 'dust', description "The dirt and dust line the floor of this house.", before [; Examine: rfalse; default: "It's just dirt and dust. You don't need to worry about it."; ]; Prop stairs "rickety-looking wooden stairs" with name 'staircase' 'stairs' 'stair' 'heap' 'opening' 'hole', adname 'rickety' 'rickety-l' 'wooden', description [; if (self has general) { print "The remains of the rickety-looking wooden stairs lie in a heap on the "; if (real_location == first_floor) "ground floor below."; else print "floor, below the opening to the first floor."; if (plank in location) { print " A sturdy plank, broken loose from the staircase when it collapsed, lies across the floor."; } new_line; rtrue; } print "The rickety-looking wooden stairs lead precariously "; if (real_location == first_floor) print "down to the ground"; else print "up to the first"; print " floor.^"; if (crystal has general) "^~Bit rickety, aren't they?~ murmurs Crystal, looking warily at the stairs."; ], short_name [; print "rickety-looking stairs"; rtrue; ], before [; Attack: if (self has general) "Haven't they suffered enough?"; Climb,Enter,Go,Use: if (self in first_floor) <>; else <>; Tie: if (second == nothing) { if (self has general) "Let someone else worry about fixing the staircase."; "Fiddling with the stairs yourself is just going to make them collapse all the sooner."; } ], found_in ground_floor first_floor, has pluralname; Askable plank "sturdy plank" with name 'plank', adname 'sturdy' 'wooden', description "An ordinary and nondescript plank of wood, about eight feet long.", describe [; print "^A ", (name)self; if (self hasnt moved) print ", broken loose from the staircase when it collapsed,"; print " lies across the "; if (parent(self) has supporter) print (name) parent(self); else if (real_location ofclass Outroom or OutroomV) print "ground"; else print "floor"; print_ret (string)period; ], information [person; switch (person) { betty: "~A plank? Oh, not the sort of thing I'd be interested in any more, luv. Not since my wood shop closed.~"; crone: "~No,~ says ", (the)crone, " bluntly. ~I won't sell wood. Not even red herring pine.~"; crystal: if (stairs has general) "~The plank? It looked like red herring pine to me", (admits)crystal, (string)period; } ], before [; Eat: "Red herring pine has never particularly agreed with you."; Insert: if (second == stairs) { if (real_location == first_floor) { move plank to ground_floor; MoveFloatingObjects(); "The plank drops down through the hole to land on the ground floor below."; } "The plank is just too short to reach the opening. Besides, you're not sure you could climb a plank."; } if (second == second_floor_attic_window or second_brick_window) "It's a good thought, but the plank is too short to reach across the alleyway. It can't be used as a bridge to the brick house."; PutOn: if (second == second_floor_attic_window or second_brick_window) <>; ]; Room first_floor "First floor" with description [; if (location hasnt visited) { anchor.hint = 0; Achieved(26); } print "The first floor of this house is one big room, though whether that's by design or due to attrition of the walls, you're not sure. A sturdy ladder leads up to the second floor, and a "; if (stairs has general) print "large hole in the floor, where the stairs used to be, leads"; else print "rickety-looking set of stairs head"; " down to the ground floor below. A window on the northern wall looks out into the alley."; ], #Ifdef GRAPHICS_ENABLED; map 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 13 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 26 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 39 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 52 0 0 0 0 0 0 6 0 0 0 0 0 0 ! 65 0 0 0 0 0 0 8 0 0 0 0 0 0 ! 78 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 91 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 104 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 117 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 130 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 143 0 0 0 0 0 0 0 0 0 0 0 0 0, ! 156 map_offset 0, comp_mask U_MASK | D_MASK, #Endif; Walls ROUGH_WOOD, Floor ROUGH_WOOD, compass_look [obj; if (obj == d_obj) if (stairs has general) "The opening in the floor leads back down to the ground floor, but it's a bit of a long drop."; else <>; return self.Room::compass_look(obj); ], cant_go [; print "You can "; if (drainpipe has general) print "head north out the window and down the drainpipe to the alleyway, "; if (stairs has general) print "try slipping through the hole"; else print "risk the stairs"; " down to the ground floor, or head up the sturdy ladder to the second floor."; ], n_to [; if (drainpipe has general) { print "You clamber out the window and onto the drainpipe, and then shinny your way down to the alley.^"; return alleyway; } "It's too long of a drop into the alleyway below."; ], u_to [; print "You clamber up the sturdy ladder.^"; return second_floor_attic; ], d_to [; if (stairs has general) { print "You slide your legs out over the opening, and slowly lower yourself until you're hanging by your fingertips. Then, you let go, landing roughly on the floor below.^"; return ground_floor; } ground_floor.u_to(); PlayerTo(ground_floor); MoveFloatingObjects(); rtrue; ]; Room second_floor_attic "Second-floor attic" with description [; print "The second-floor attic of the wooden house is tucked right up under the roof, giving the room a high, peaked ceiling. A narrow window looks out over the alleyway to the north. At the edge of the room, where the ceiling descends to meet the wall, a"; if (roof_trap has open) print "n open"; else print " closed"; " trapdoor leads up and out to the roof. "; ], #Ifdef GRAPHICS_ENABLED; map 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 13 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 26 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 39 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 52 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 65 0 0 0 0 0 0 8 0 0 0 0 0 0 ! 78 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 91 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 104 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 117 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 130 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 143 0 0 0 0 0 0 0 0 0 0 0 0 0, ! 156 map_offset 0, comp_mask U_MASK | D_MASK, #Endif; Walls ROUGH_WOOD, Floor ROUGH_WOOD, compass_look [obj; if (obj == d_obj) "Below you, the sturdy ladder heads down to the first floor."; if (obj == u_obj) "Above you is the trapdoor leading out to the roof."; if (obj == n_obj) <>; return self.Outroom::compass_look(obj); ], cant_go "You can climb back down the ladder to the first floor or head up through the trapdoor to the roof.", u_to roof_trap, d_to [; print "You climb back down the sturdy ladder.^"; return first_floor; ], n_to [; <>; ]; Outroom peak_roof "Peaked roof of the wooden house" with description [; print "It's a bit precarious here atop the peaked roof of the wooden house. To the north across the ten-foot gap of the alleyway, you can see the much lower roof of the brick house. A"; if (roof_trap has open) print "n open"; else print " closed"; print " trapdoor leads back down to the second-floor attic.^"; if (anchor.anchored == true) { new_line; ; } rtrue; ], cant_go "The only safe way out of here is back through the trapdoor.", #Ifdef GRAPHICS_ENABLED; map 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 13 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 26 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 39 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 52 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 65 0 0 0 0 0 0 10 0 0 0 0 0 0 ! 78 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 91 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 104 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 117 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 130 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 143 0 0 0 0 0 0 0 0 0 0 0 0 0, ! 156 map_offset 0, comp_mask D_MASK, #Endif; compass_look [obj; if (obj == d_obj) "Below you, the trapdoor leads back down to the second-floor attic."; if (obj == n_obj) <>; return self.Outroom::compass_look(obj); ], d_to roof_trap, Floor ROUGH_WOOD; !==================================================================================================================================================== ! Brick house Room second_brick "Second floor of the brick house" with description [; print "This basic second-floor room looks like it was never properly finished. The room is open to the sky, courtesy of your precipitous aerial arrival. A long ladder leads all the way down to the ground floor, bypassing a first floor that has long since rotted away. On the south wall, a window looks out over the alleyway.^"; if (anchor.anchored == true) { new_line; ; } if (location hasnt visited) { new_line; Achieved(27); print "The last shreds of the "; if (self.viabroom == true) print "broomstick"; else print "carpet"; ", blown apart by the contact with the roof, disintegrate and disappear around you."; } rtrue; ], #Ifdef GRAPHICS_ENABLED; map 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 13 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 26 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 39 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 52 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 65 0 0 0 0 0 0 10 0 0 0 0 0 0 ! 78 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 91 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 104 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 117 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 130 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 143 0 0 0 0 0 0 0 0 0 0 0 0 0, ! 156 map_offset 0, comp_mask D_MASK, #Endif; viabroom false, Walls ROUGH_WOOD, Floor ROUGH_WOOD, compass_look [obj; if (obj == s_obj) <>; if (obj == d_obj) "Below you, a long ladder descends all the way to the ground floor."; if (obj == u_obj) <>; return self.Room::compass_look(obj); ], cant_go "The only way out of here is down the long ladder to the ground floor.", d_to [; brickdoor.auto_unlock = true; brickdoor.auto_lock = true; print "You climb down the sturdy ladder.^"; return ground_brick; ], s_to [; <>; ]; Room ground_brick "Ground floor of the brick house" with description [; #Ifdef GRAPHICS_ENABLED; if (location hasnt visited) { RevealBlumph(self.map_offset); } #Endif; "The ground floor of the brick house is plain and unadorned, with rough wooden walls and a dirt floor. Southwest, a door leads back out to Oak Street."; ], #Ifdef GRAPHICS_ENABLED; map_offset 203, comp_mask U_MASK | SW_MASK, #Endif; Walls ROUGH_WOOD, Floor DIRT, compass_look [obj; if (obj == sw_obj) "Southwest is the door back to Oak Street."; if (obj == u_obj) "Above you, the long ladder leads all the way up to the second floor."; return self.Room::compass_look(obj); ], cant_go "You can climb up the long ladder to the second floor or head southwest through the door to Oak Street.", sw_to brickdoor, u_to [; print "You climb up the long ladder to the second floor, passing the nonexistent first floor.^"; return second_brick; ]; Prop -> deadbolt "deadbolt" with name 'deadbolt', description "It's the deadbolt used to lock and unlock the door from this side.", before [; Examine: rfalse; Close,Lock: <>; Open,Unlock: <>; Turn: if (brickdoor has locked) <>; <>; default: "It's an integral part of ", (the)brickdoor, "."; ]; !==================================================================================================================================================== ! Oak Street area multi-location objects Prop roof_prop "roof" with name 'roof', adname 'peaked', description [; "It's a perfectly ordinary peaked roof."; ], found_in second_brick second_floor_attic peak_roof; Autodoor roof_trap "trapdoor" with name 'trapdoor' 'door', adname 'trap', description [; print "This "; if (self has open) print "open"; else print "closed"; print " trapdoor leads "; if (self in second_floor_attic) "out onto the roof."; "back into the house."; ], d_to second_floor_attic, u_to peak_roof, has ~open; !don't need scenery, door or openable, already in class Prop sturdy_ladder "sturdy ladder" with name 'ladder', adname 'sturdy' 'long', description [; if (self in second_brick or ground_brick) "The long sturdy ladder connects the ground floor directly to the second floor, bypassing the long-since rotted away first floor."; print "The sturdy ladder leads "; if (self in second_floor_attic) "down to the first floor."; "up to the second floor."; ], before [; Enter,Climb: if (self in second_floor_attic) <>; <>; ], found_in ground_brick second_brick first_floor second_floor_attic; Prop drainpipe "drainpipe" with name 'pipe' 'drain-pip' 'drainpipe', adname 'large' 'rusty' 'drain', description [; if (self has general) "The fallen drainpipe makes for a somewhat dangerous path between the alleyway and the first-floor window of the wooden house."; if (self in drain1) "Rusty and rickety, the drainpipe is clinging as precariously to the wall as you are to the drainpipe."; "The rusty old drainpipe runs up the side of the brick house, just beside the windows. It looks like it might be possible to climb, though it looks pretty rickety."; ], describe [; if (self in drain1) rtrue; new_line; if (self has general) "A fallen drainpipe makes for a somewhat dangerous path between the alleyway and the first-floor window of the wooden house."; "A rusty old drainpipe runs up the side of the brick house, just beside the windows."; ], found_in alleyway first_floor drain1, information [person; switch (person) { crystal: if (alleyway has visited) { if (location == alleyway or first_floor or drain1) { if (self in drain1) "~Let's discuss it when we aren't clinging desperately to it, shall we?~ asks ", (the)crystal, " anxiously. ~Concentrate on hanging on instead!~"; if (self has general) "~I didn't think it looked very safe,~ sighs ", (the)crystal, ". ~Still, it gives us a nice easy path to and from the first floor, doesn't it?~"; print "~It certainly doesn't look very sturdy,~ says ", (the)crystal, ", glancing doubtfully at the drainpipe. ~I"; } else print "~The drainpipe in the alleyway?~ asks ", (the)crystal, ". ~Well, i"; if (self has general) "f nothing else, we have a nice easy path from the alleyway up into the house, now that the drain's come away from the wall.~"; "t might bear your weight if you take it slowly. You might even be able to make it all the way up to the anchor. How to unhook the anchor once you get there is another question entirely.~"; } } rfalse; ], before [; Attack: if (self in drain1) "~If it goes, you go!~ warns ", (the)crystal, ", and you decide against your course of mindless violence."; "~Doesn't it have enough problems?~ asks ", (the)crystal, " pointedly."; Climb, Enter: if (self in first_floor) { if (self has general) <>; "The drainpipe is attached to the wall of the house opposite."; } <>; Jump: if (self in drain1) "~We're high enough that broken legs are a real possibility,~ warns ", (the)crystal, ". ~I think you'd best hang tight.~"; Tie: if (self has general) "It's come away from the wall completely, and you lack the time, talent and tools to fix it properly."; "There doesn't seem to be any way of improving the stability of the drainpipe."; ], has ~scenery; !==================================================================================================================================================== ! Marketplace Outroom Shops "Marketplace" with description [; #Ifdef GRAPHICS_ENABLED; if (location hasnt visited) { RevealBlumph(self.map_offset); } #Endif; "This area is the bustling center of Blumph's large market. Large crowds stream in and out of the various shops, though two less-visited ones catch your eye. A small shack of a shop lies to the south, crudely hand-lettered words over the door reading ", (i) "Lonely Mountaintop Supply", ". To the west is the cheekily-named ", (i) "Betty's Dirty Laundry", ". North, a long road descends towards the pier, while the high street lies back up the road to the east. A back-lane heads southeast towards the residential district."; ], #Ifdef GRAPHICS_ENABLED; map_offset 133, comp_mask N_MASK | S_MASK | SE_MASK | W_MASK | E_MASK, #Endif; Floor COBBLES, compass_look [obj; if (obj == e_obj) "East, the cobbled road heads back up to the high street, climbing slightly as it does so."; if (obj == s_obj) <>; if (obj == n_obj) <>; if (obj == w_obj) <>; if (obj == se_obj) "A narrow alley to the southeast heads towards the residential district, a labyrinthine warren of closely packed houses and laneways."; return self.Outroom::compass_look(obj); ], Carpet_Go [; PlayerTo(Pier); MoveFloatingObjects(); rfalse; ], before [; Go: #Ifdef SOUND_ENABLED; SoundStop(); #Endif; rfalse; ], cant_go "To the south lies Lonely Mountaintop Supply, while Betty's Dirty Laundry is to the west. North, a long road descends toward the pier, while the high street is back to the east. A back-lane heads southeast towards the residential district.", n_to [; #Ifdef GRAPHICS_ENABLED; blumphmap-->267 = blumphmap-->267 & (~NODRAW_FLAG); #Endif; print "You head north down the long road to the pier.^"; return Pier; ], d_to [; <>; ], s_to [; print "You step over the threshold into Lonely Mountaintop Supply.^"; return lonely_supply; ], se_to [; #Ifdef GRAPHICS_ENABLED; blumphmap-->397 = blumphmap-->397 & (~NODRAW_FLAG); #Endif; print "You head down the back-lane towards the residential district.^"; return Oak_Street; ], w_to [; print "A concealed bell tinkles merrily as you cross the threshold into Betty's Dirty Laundry.^"; return dirty_laundry; ], e_to [; #Ifdef GRAPHICS_ENABLED; blumphmap-->333 = blumphmap-->333 & (~NODRAW_FLAG); #Endif; print "You push through the crowd back to the high street.^"; return High_Street; ]; Prop -> laundry_scen "Betty's Dirty Laundry" with name 'laundry' 'notice' 'shop' 'store', adname 'betty^s' 'dirty', description [; "The small laundry store to the west bears a notice claiming next-day service on all robes, magical or otherwise. Another slogan promising ", (i) "Deep discounts for all members of the Wizards Guild", " has had the words ", (i) "Wizards Guild", " replaced by ", (i) "Plumbers Union", (string)period; ], information [person; return betty.information(person); ], before [; Enter, Go, Use: <>; ], has proper; Prop -> lonely_scen "Lonely Mountaintop Supply" with name 'supply' 'shop' 'store' 'shack', adname 'lonely' 'mountaint', description [; "The small shack of a shop to the south looks like it was thrown together from lumber left over from other jobs. Crudely-printed lettering on the side reads ", (i) "Lonely Mountaintop Supply: ask about our guided tours", ". Another message declares ", (i) "Don't come in and bother us unless you want to buy something", (string)period; ], information [person; return hermit.information(person); ], before [; Enter, Go, Use: <>; ], has proper; Prop -> shops_dual "shops" with name 'shops', adname 'both', before [; Examine: ; new_line; ; rtrue; default: "You should specify which shop you're interested in, Betty's Dirty Laundry or Lonely Mountaintop Supply."; ]; Askable -> newsstand "newsstand" with name 'newsstand' 'newstand' 'plinth', capacity 1, description [; print "A small"; if (children(self) == 0) print " empty"; print " plinth"; if (children(self) ~= 0) { if (tattler hasnt moved) ", bearing today's run of the Blumph daily, the ", (i) "Town Tattler."; print ", upon which you see "; WriteListFrom(child(self), ENGLISH_BIT); } print_ret (string)period; ], describe [; print "^A small "; if (children(self) == 0) print "empty "; print "plinth sits here"; if (children(self) ~= 0) { if (tattler hasnt moved) " bearing today's run of the Blumph daily, the ", (i) "Town Tattler."; print ", upon which you see "; WriteListFrom(child(self), ENGLISH_BIT); } print_ret (string)period; ], has supporter static; Askable -> -> tattler "Town Tattler" with parse_name [n w; w = NextWord(); if (w == 'new' && NextWord() == 'article' or 'story') { self.current = self.total - 1; n = 200; } else while (w == 'today^s' or 'run' or 'printing' or 'newspaper' or 'town' or 'tattler' or 'daily' or 'paper' or 'rag' or 'article' or 'story') { w = NextWord(); n++; } return n; ], dinoread false, article "the", description [; print "Today's edition of the ", (i) "Town Tattler,", " Blumph's free daily paper. A single copy will update itself throughout the day with new stories as they happen. It currently contains ", self.total; if (self.total > 1) print " stories.^"; else print " story.^"; if (self hasnt general) { give self general; glk_set_style(style_Note); print "^[You can always read the newest story in the Tattler by saying ~read new story~]^"; glk_set_style(style_Normal); } rtrue; ], current 0, total 1, taken false, describe [; new_line; print "Today's edition of ", (the)self, " sits on the "; if (parent(self) has supporter) print (name) parent(self); else if (real_location ofclass Outroom or OutroomV) print "ground"; else print "floor"; " here."; ], information [person; switch (person) { crone: "~It's not a bad rag,~ shrugs ", (the)person, ". ~Bit heavy on the sensational though.~"; hermit: "~Journalists!~ mutters ", (the)person, ". ~Always nosing around my mountaintop looking for a story.~"; akbar: "~I would hate to malign the reputation of anyone involved in the industry!~ cries ", (the)akbar, ", ~but I have serious doubts about that paper's diligence in ferreting out the truth behind its stories.~"; crystal: "~It's kind of neat", (admits)crystal, ". ~You pick up a single copy in the morning and all day long, new stories are delivered to it.~"; teller: "~I love the Tattler", (admits)teller, ". ~It's the only place to get the real story.~"; captain: print_ret (The)self, " complains at length about the story on disastrous airship docking and then shrugs. ~It's all bunk!~ he snorts derisively. ~You'll discover that if they ever feature any articles about ", (i) "you", " in their pages.~"; } ], before [; Take: if (self hasnt moved) tattler_image_current = 1; rfalse; Open,Read,Search: if (location == thedark) "But it's dark!"; if (self notin player) { print "(taking ", (the) self, " first)^"; ; } if (self hasnt general) { tattler_image_current = 1; give self general; glk_set_style(style_Note); print "^[You can always read the newest story in the Tattler by saying ~read new story~]^"; glk_set_style(style_Normal); } self.current++; if (self.current == 1) print "(reading the first article)^"; else if (self.current == self.total) print "(reading the last article)^"; else { if (self.current > self.total) { print "(flipping back to the first article)^"; self.current = 1; } else print "(reading the next article)^"; } return PrintTattler(tattler_stories->(self.current)); ], add_story [story_num; tattler_stories->0 = tattler_stories->0 + 1; tattler_stories->(tattler_stories->0) = story_num; ], has readable supporter transparent; Object airship_docking_timer class airship_timer_class; Object wizard_split_timer class airship_timer_class; Object dinosaur_city_timer class airship_timer_class; Object flying_reptile_timer class airship_timer_class; Object drunken_apprentice_timer class airship_timer_class; Object brazen_theft_timer class airship_timer_class; Object haddock_rain_timer class airship_timer_class; Object dome_breakage_timer class airship_timer_class; Object lord_mayor_timer class airship_timer_class; Object player_flight_timer class airship_timer_class; Object yekcal_flight_timer class airship_timer_class; Object tower_explosion_timer class airship_timer_class; Object freak_earthquake_timer class airship_timer_class; Object house_robbery_timer with time_left 0, time_out [i; tattler.total++; i = tattler_images->0; i++; tattler_images->0 = tattler_images->0 + 3; if (Manor_Door has locked) { Manor_Door.locked_door = true; tattler_images->i = house_robbery_locked1; tattler_images->(i + 1) = house_robbery_locked2; tattler_images->(i + 2) = house_robbery_locked3; } else if (Manor_Door has open) { Manor_Door.open_door = true; tattler_images->i = house_robbery_open1; tattler_images->(i + 1) = house_robbery2; tattler_images->(i + 2) = house_robbery3; } else { tattler_images->i = house_robbery1; tattler_images->(i + 1) = house_robbery2; tattler_images->(i + 2) = house_robbery3; } tattler_image_current = i; if (TestScope(tattler)) { new_line; print (The) tattler, " glows briefly as a new story is added to it.^"; if (tattler hasnt general) { tattler_image_current = 1; give tattler general; glk_set_style(style_Note); print "^[You can always read the newest story in the Tattler by typing ~read new story~]^"; glk_set_style(style_Normal); } } rtrue; ]; Prop dock_scen "Blumph Pier road" with name 'pier' 'docks' 'dock' 'road', adname 'long' 'blumph', description [; if (self in Shops or High_Street) "A long road descends towards the pier. You can spot numerous ships at anchor in the bay, bobbing gently on the blue water. The dirigible docks seem emptier, a lone airship swaying gently on its anchor cable."; <>; ], found_in Shops High_Street Pier, information [person; switch (person) { crone: "~Don't go there too much myself,~ sniffs ", (the) self, ". ~Don't like boats.~"; crystal: "~A lovely place to bring the family on a nice afternoon,~ smiles ", (the)crystal, "."; captain: "~I love the pier", (admits)captain, ". ~It leads to the pub.~"; betty: "~Ooh, mum loves a nice walk down the pier on a Sunday,~ smiles ", (the)betty, "."; hermit: "~I hate it,~ scowls ", (the)hermit, ". ~Crowded with people... noisy... dirty. No thanks.~"; } ], before [; Enter, Go, Use: <>; ]; Prop back_lane "lane" with name 'lane' 'backlane' 'back-lane', adname 'little' 'little-us' 'back', found_in Shops Oak_Street End_Lane Farmgate_Area, description [; if (self in Shops) "The back-lane heads southeast to the residential district."; else if (self in Farmgate_Area) "The little-used lane heads east through the grass."; else if (self in End_Lane) "The lane heads west back to the farm gate."; else "The back-lane leads northwest to the marketplace."; ], before [; Enter, Go, Use: if (self in Shops) <>; if (self in End_Lane) <>; if (self in Farmgate_Area) <>; <>; ]; !==================================================================================================================================================== ! Betty's Dirty Laundry Room dirty_laundry "Betty's Dirty Laundry" with description [; if (location hasnt visited) { #Ifdef GRAPHICS_ENABLED; RevealBlumph(self.map_offset); #Endif; give Bmum objseen; } "This small shop smells strongly of detergent and cleaning solvents. This main room is small and spare, save for a counter on the west side, just in front of a curtained doorway. The marketplace lies out the doorway to the east."; ], #Ifdef GRAPHICS_ENABLED; map_offset 131, comp_mask E_MASK | OUT_MASK, #Endif; compass_look [obj; if (obj == w_obj) <>; if (obj == e_obj) "The bustling center of Blumph's market lies through the doorway to the east."; return self.Room::compass_look(obj); ], before [; Exit: if (player in location) <>; rfalse; Go: if (noun == e_obj) { give betty ~general; betty.Topics = betty.Topics & (~FLAG_x6); rfalse; } ], cant_go "The marketplace lies back through the doorway to the east.", out_to [; <>; ], e_to [; betty.mesmer = 0; switch (random(8)) { 1: print "~Have a nice day, luv!~ calls ", (the)betty, " as you leave.^^"; 2: print "~Cheerio luv!~ calls ", (the)betty, " as you leave.^^"; 3: print "~Next week is stain-free week,~ says ", (the)betty, " as you step out. ~Bring in your stained garments. If we can't get the stain out, you don't pay!~^^"; 4: print "~Be sure to come back if "; if (magic_clothes in player) print "those robes get"; else print "that uniform gets"; print " dirty!~ calls ", (the)betty, " as you leave.^^"; 5 to 8: ; } print "You step back out into the sunshine, and draw a cleansing breath of air.^"; return Shops; ], w_to [; print "~Employees only luv,~ apologises ", (the)betty, " as you approach the curtain. ~"; if (betty.pickup == true) print "As you know, w"; else print "W"; "e've had some theft issues,~ she adds, shaking her head."; ]; NPC -> betty with name 'shopkeep' 'shopkeepe' 'seller' 'vendor' 'woman' 'lady' 'luv' 'vendor' 'clerk' 'keeper' 'betty' 'job' 'hair' 'highlight', adname 'pink' 'pink-ting', short_name [; print "laundress"; rtrue; ], description [; print_ret (The) self, " is an older woman with a shock of brilliant white hair with pink highlights. Her wide-mouthed smile shows off a lovely new set of wooden teeth."; ], Chat 0, Topics 0, pickup false, oldMaybe [; "~Hmph!~ snorts ", (the)betty, ", giving you a bit of an arch look. ~That just shows what you know, young one.~"; ], oldYes [; if (verb_word == 'maybe') betty.oldMaybe(); else print "~Oh,~ sniffs ", (the)betty, ", giving you a bit of a nasty look. ~It may be true, but that doesn't mean you have to say it.~ She sniffs again and glances away, dabbing at her eyes.^"; if (crystal has general) { print "^~That wasn't really very nice,~ scolds ", (the)crystal, ".^"; } rtrue; ], oldNo [; print "~Oh, you cheeky young thing,~ giggles ", (the)betty, ", wagging a finger at you. ~Don't be so silly!~ She turns away, a small smile on her lips.^"; if (crystal has general) { print "^~That was sweet of you,~ smiles ", (the)crystal, " shyly.^"; } rtrue; ], information [person; switch (person) { crone: "~No better place to get your robes cleaned than at Betty's,~ declares ", (the)crone, ". ~No other place at all, come to think of it,~ she adds, frowning."; betty: give self general; self.short_name = "Betty"; give self proper; "~Well, with the wood store not working out, mum and I thought the best thing would be to come here and open a new store. Mum has so much experience removing incriminating... well, er, I should say, unwanted stains from garments, we thought a laundry store was a good idea. And Betty's Dirty Laundry was born!~"; crystal: if (dirty_laundry hasnt visited) { if (real_location == Shops) print "~Betty's been running that little shop since her Wizardry Wooding shop in Vechlee went out of business. She h"; print "~Betty runs a little laundry shop just west of the marketplace. H"; } else if (real_location == Shops) print "~Well, you've been in the shop,~ says ", (the)crystal, ". ~You probably know as much as I do; she h"; else if (real_location == dirty_laundry) print "~There's not much to say,~ shrugs ", (the)crystal, ", gazing around the shop. ~It looks like a small and neat little place. She h"; else print "~Betty's laundry shop was back in the marketplace. Small and neat little place, wasn't it? Betty h~"; "andles laundry of all sorts, but specialises in wizardly robes.~"; akbar: "~My esteemed colleague at Betty's Dirty Laundry runs a fine business!~ beams ", (the)akbar, ". ~But while you're waiting for your laundry, why not check out our fine selection of rugs and carpets?~"; people: if (real_location == Shops) print "~Her shop's right there!~ snaps"; else { switch (random(4)) { 1: print "~Betty runs the laundry shop off in the marketplace somewhere,~ says"; 2: print "~Ah, the lovely Betty. Her shop's in the marketplace, I believe,~ says"; 3: print "~Try the marketplace,~ advises"; 4: print "~She seems to be running a successful business over there in the marketplace,~ shrugs"; } } randcrowd(); rtrue; hermit: if (hermit.Topics & FLAG_x2 == FLAG_x2) "~Look, whatever I said earlier, Betty runs a lovely little shop. I love laundry.~"; hermit.Topics = hermit.Topics | FLAG_x2; "~A laundry shop!~ sniffs ", (the)hermit, " in disdain. ~As if a yearly dunking in a mountaintop stream isn't good enough for clothes.~ He starts and looks around guiltily. ~Please don't tell Betty I said that,~ he pleads."; captain: "~She always treats me really nicely,~ mumbles ", (the)captain, " into his drink. ~I take all my laundry there. She always gets the beer stains out.~"; teller: "~I don't know anything about her, I'm afraid, captain,~ confesses ", (the)teller, ". ~Runs a shop in Blumph, doesn't she?~"; } rfalse; ], initial [; if (real_location hasnt visited) { self.Chat = 0; give self general; print "An older woman standing behind the counter beams at you as you enter. ~Well, if it isn't "; if (Testscope(magic_clothes)) print "a wizard's apprentice"; else print "an airship captain"; print ", and one I know at that. How are you, luv? Haven't seen you since you came into my Wizardry Wooding store in Vechlee, but I suppose you're a bit busy "; if (Testscope(magic_clothes)) print "with your studies."; else print "now that you've moved up in the world. An airship captain at your age!"; " What can I do for you on this fine morning?~"; } if (dirty_laundry.hoopsack_arrive == true) { dirty_laundry.hoopsack_arrive = false; print_ret (The)self, " screams in shock as you materialise in front of her. ~Ooh, luv, you didn't half give me a turn!~ she cries."; } 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: switch (random(100)) { 1 to 20: "~Welcome to Betty's Dirty Laundry, luv,~ calls ", (the) self, " as you enter."; 21 to 30: print "~Why, hello luv!~ says ", (the) self, ". She nods at your "; if (Testscope(magic_clothes)) print "robes"; else print "captain's uniform"; print ". ~Always happy to welcome "; if (Testscope(magic_clothes)) print "one with connections to the magic profession"; else print "an airship captain"; ".~"; 31 to 50: print "~Come to pick up some"; if (self.pickup == true) print " more"; " robes, have you, luv?~ smiles ", (the) self, ". ~Remember, ours is the best service in town.~"; 51 to 70: "~Ready for a clean start?~ asks ", (the) self, " as you enter. ~Why not sign up for our students-only summer special? All your robes cleaned for one low price before you head back to school.~"; 71 to 85: print_ret (The) self, " looks up from polishing the countertop as you step in. ~Hello, luv!~"; 86 to 90: "~'alf 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 go ahead and eat it anyway. It wasn't at all well last night.~"; 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: print "~Ooh, a customer!~ squeals ", (the) self, " as you step into the store. Suddenly, from the back room, you hear the noise of someone chuckling in anticipation.^ ^~It's all right, mum,~ calls ", (the) self, " over her shoulder. ~This one's a"; if (Testscope(magic_clothes)) print " wizard's apprentice"; else print "n airship captain"; ".~^^The chuckling ends in an abrupt sigh of disappointment."; 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 shrunk my robes on bloody purpose, that's what I'm saying!~ shouts the angry customer, his face red. ^~Oh is that right, luv?~ ", (the) self, " says, suddenly sounding contrite. ~Right then, come on, come talk to mum about it. She deals with all the reductions in here.~ She waves the customer toward the back room.^ ^The customer's face goes white at the mention of mum. ~Er, no, on second thought, perhaps I was in the wrong,~ he says hastily, backing away. He turns and runs out of the shop.^", (The) self, " sighs and shakes her head, 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.mesmer ~= 0 && location == dirty_laundry) { switch (self.mesmer) { 1: "^~Oh my...~ murmurs ", (the)self, " suddenly, gazing at her hands in surprise. ~Some sort of magical skin condition?~"; 2: print_ret "^", (The)self, " gazes around the room, her eyes unfocused. ~Oh, it's affecting the whole place,~ she murmurs. ~But such pretty colours!~"; 3: "^~Mum, are you seeing this?~ calls ", (the)self, " over her shoulder. ~I think we'd best avoid that new detergent. It seems to have gone to my head.~"; 4: "^~Oh wait, never mind, it seems to be fading,~ calls ", (the)self, ". ~Very pretty while it lasted though.~"; 5: self.mesmer = 0; print_ret "^", (The)self, " shakes her head, her pink-tinged curls bobbing. ~Well, that was a bit strange there, luv, forgive me for my distraction.~"; } } if (self.Chat == 1 && location == dirty_laundry) { new_line; 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 pink-tinged hair with one hand.^"; 21 to 25: print "~Right...~ murmurs ", (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.^"; 41 to 45: print (The)self, " sighs and glances at the curtain behind her.^"; 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 mo, 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. ~There, that's sorted! Ought to keep the old misery quiet for a few hours! Now, where were we?~^"; } } self.Chat = random(3); rtrue; ], before [wd bk; Consult: wn = consult_from; wd = NextWord(); switch (wd) { 'burnley', 'phrase': "~Sorry, I misspoke. Not sure why I said burnley instead of burglary. ", (i) "There's been a burnley.", " Maybe I'll have to look that phrase up somewhere.~"; 'theft', 'burglary': "~Yes, some people just have no regard for personal property, do they?~ sighs ", (the)self, (string)period; 'wizstrip': "~WizStrip? Ooh, I don't deal in that anymore, I'm afraid. But I heard they've set up a giant factory for it in Vechlee now.~"; 'factory': "~Yes, there's a WizStrip factory in Vechlee. They make it by the vat there, I'm told.~"; '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.~"; 'ninario', 'nin', 'ninny': "~Oh, he comes in every now and then with those bunny robes on. He always gets his money's worth, as he only brings things in for cleaning when they're ", (i) "completely", " filthy.~"; 'plumber^s', 'union', 'plumber', 'plumbers': "~The Plumbers Union?~ says ", (the)self, ". ~They're all right, but there was a lot of business advantage of being the Wizards Guild's approved wood supplier.~ She sighs. ~The Plumber's Union doesn't give out exclusive contracts like that to anybody.~"; 'turthalio', 'michael': "~I don't really know much about Turthalion,~ confesses ", (the)self, ". ~He's the ruler of Thalion, and he lives here in Blumph.~"; 'thalion', 'country', 'land', 'world': "~Oh, I've lived in Thalion all my life,~ smiles ", (the)self, (string)period; } do { wn = consult_from; bk = ParseToken(SCOPE_TT, AskableScope); } until (bk ~= GPR_REPARSE); if (bk == GPR_FAIL) "~Ooh, I wouldn't know anything useful to tell you, luv,~ apologises ", (the)self, "."; if (bk.information(self) == true) rtrue; "~Ooh, I wouldn't know anything useful to tell you about ", (itorthem)item, ",~ apologises ", (the)self, (string)period; Attack: "You pull back to swing at ", (the)self, " but a dangerous glint in her eye warns you off. She nods approvingly as you reconsider. ~There, luv, that's a good customer.~"; Bargain: "~You don't need to bargain, luv,~ smiles ", (the)self, ". ~Ninario's cleaning was prepaid. All taken care of.~"; 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)self, " 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 laundress smiles a broad wooden-toothed grin at you. ~I'm right pleased to meet you, luv. I'm Betty.~"; Smell: "You sniff at ", (the)self, " surreptitiously and catch the mild scent of antiseptic cleaning agents."; Smile: print_ret (The)self, " smiles woodenly back at you."; 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 friendly manner.~"; Thank: "~Hmmm? What's that? Oh, you're welcome, luv,~ says ", (the)self, ", a bit absent-mindedly."; ], life [; Answer: if (noun == 'hello' or 'hi') <>; else <>; Give: <>; Show: switch (noun) { Red_Carpet: "~No,~ ", (the)betty, " says, shaking her head. ~We don't clean carpets.~"; nobbler: "~Oh, keep that away from me. Nasty things, those knockout pills.~"; claim_ticket: give claim_ticket general; remove claim_ticket; move Gorgonzola to player; betty.pickup = true; MoveFloatingObjects(); Achieved(2); "~Ah, a claim ticket,~ says ", (the)betty, ", taking it from you. ~One wizard's robe, nook 317. Let me just find this for you.~^ ^She disappears behind the curtain and you hear a protracted series of clangs, bumps and clatters. After a few minutes, ", (the)betty, " re-emerges, frowning. ~That's very odd. We seem to have had a bit of a burnley. Sorry, burglary, I mean. The robe is gone! I'll have to talk to Ninario about reimbursement. I really am most sorry.^ ^~If it's any consolation,~ she adds, ~the burglar didn't take this.~ Somewhat unexpectedly, she hands you a piece of cheese. ~We found it in the pockets before we cleaned it, and left it in the nook. I guess our burglar didn't see it.~^ ^~Or else he was only interested in the robes, and not the contents,~ mutters ", (the)crystal, " darkly. ~I mean, who steals cheese? Oh, whoops, sorry,~ she adds, glancing at you.^ ^You glance at the unexpected cheese. Mmm, Gorgonzola! It's one of Ninario's favourites and if he's in the habit of leaving odd bits of it in his robes, it explains at least one of the funny smells that linger around him a lot of the time."; Gorgonzola: "~Yes, that's definitely the cheese we found in Ninario's robes,~ nods ", (the)self, (string)period; plotkin: if (plotkin.current_qty > 50) "~Oh my,~ says ", (the)self, ". ~Well-off, aren't we, luv?~"; if (plotkin.current_qty == 2) "~Oh dear,~ says ", (the)self, ". ~Skint, are you, luv?~"; "~Very nice, luv,~ says ", (the)self, "."; default: if (noun ofclass cheese) "~More cheese!~ says ", (the)self, " in surprise. ~You're swimming in the stuff, aren't you, luv?~"; 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 has 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.~"; if (second == 'yekcal' && (bedroom.seen == true || back_room.seen == true)) print_ret (The) self, " gasps and raises a hand to her mouth in shock. ~But Yekcal... he works for Renaldo! No luv, you must be mistaken, why would they steal robes? They've got robes of their own!~"; print_ret (The) self, " shrugs disinterestedly."; ], orders [; Give: "~I must concentrate on my work, luv.~"; MeetNPC: <>; default: "~I must concentrate on my work, luv.~"; ], react_before [; Listen: if (noun == nothing) { <>; } Smell: if (noun == nothing) <>; ], has female transparent; Prop -> -> teeth "wooden teeth" with name 'teeth' 'choppers', adname 'wooden' 'false', description "The hand-carved teeth are a testament to the woodworking skills of the early Renaissance.", information [person; switch (person) { betty: "~Oh, these?~ asks ", (the)betty, ". ~I had them made from the excess pine inventory when I closed Wizardry Wooding. Nice, aren't they?~ she adds, smiling woodenly."; crystal: if (dirty_laundry has visited) { print "~Impressive, "; if (location == dirty_laundry) print "a"; else print "we"; "ren't they?~ murmurs ", (the)crystal, ". ~I'll have to see about getting a set myself.~"; } } rfalse; ]; Prop Countertop "countertop" with name 'counterto' 'counter' 'top', adname 'plain' 'wooden', description "The plain wooden countertop is unremarkable.", found_in dirty_laundry lonely_supply, before [; Climb,Enter: if (real_location == dirty_laundry) "~Oh no, luv, don't want footprints on the counter,~ says ", (the)betty, ", wagging a finger at you."; print_ret (The)hermit, " places a protective arm over the countertop. ~Oh no you don't. It may be a plain wooden countertop, but it's ", (i) "my", " plain wooden countertop.~"; Receive: if (real_location == lonely_supply) "~Do I come into your house and put things on your countertop?~ asks ", (the)hermit, " peevishly, removing ", (the)noun, " from the countertop and handing ", (itorthem)noun, " back to you."; if (noun == claim_ticket) <>; "~Oh no, luv, can't have that,~ says ", (the)betty, ", removing ", (the)noun, " from the countertop and handing ", (itorthem)noun, " back to you. ~Must keep the countertop clean! I put freshly-cleaned robes on there, you know!~"; Rub: if (real_location == lonely_supply) "~It's clean enough already,~ snaps ", (the)hermit, " as you give the countertop a quick wipe. ~Keep your grubby mitts off it.~"; "~Dearie me, luv, I thought ", (i) "I", " was fussy about dirt,~ says ", (the)betty, " as you give the countertop a quick wipe."; ], information [person; switch (person) { crystal: if (location == dirty_laundry or lonely_supply) "~Looks a perfectly ordinary countertop to me,~ shrugs ", (the)crystal, (string)period; betty: "~Nice, isn't it?~ beams ", (the)betty, ". ~Made from the leftover stock from Wizardry Wooding.~"; hermit: "~It's just a countertop,~ says ", (the)hermit, ". ~Not sure what else I can say about it.~"; } rfalse; ], has supporter; Prop Curtain "curtain" with name 'curtain' 'doorway' 'backroom' 'back' 'room' 'store' 'storeroom', adname 'curtained', description [; print "The curtain hangs loosely over a doorway to the "; if (real_location == back_room) "main shop."; "back room."; ], found_in dirty_laundry back_room, information [person; switch (person) { crystal: if (location == dirty_laundry) "~I suppose that's where they keep all the laundry,~ says ", (the)crystal, (string)period; if (location == back_room) "~The main shop is back through there,~ says ", (the)crystal, (string)period; betty: "~Oh, that's where we do the cleaning, as well as storing the laundry, clean and dirty.~"; } ], before [; Examine: rfalse; default: <>; ]; Room back_room "Betty's Dirty Laundry's back room" with description [; if (self.vision == true) Startdaemon(self); "This back room of Betty's Dirty Laundry is lined with washing tubs and low benches. Along one wall is a series of cubbyholes, designed to hold customer articles. It's rather dark and dim in here, leading you to believe it must be night. East, a curtain hangs loosely over the doorway to the main shop."; ], cant_go [; "Unfortunately, as this is a vision, there's not much you can do other than watch and wait. Or talk to ", (the)crystal, ", who seems to be sharing the vision with you."; ], dtime 0, seen false, vision false, daemon [; self.dtime++; if (self.dtime == 2) "^~Now,~ murmurs Yekcal to himself, looking over the cubbyholes. ~Where are Ninario's robes?~"; if (self.dtime == 3) "^~I still don't understand what Renaldo wants these for,~ mutters Yekcal, digging into several cubbyholes. ~So he wants to look like Ninario? So what?~"; if (self.dtime == 4) { move nin_robes to back_room; "^~Oooh, look at me, I'm Renaldo, I like to dress as Ninario, because secretly I wish ", (i) "I", " was good at science. Ah-ha,~ he mutters, pulling a robe from a cubbyhole. ~What's this? Rabbits?~"; } if (self.dtime == 5) { move nin_key to back_room; "^~Yes,~ mutters Yekcal, ~these must be Ninario's. Rabbit pattern. I almost didn't recognise them because they're so clean. What the... there's a piece of cheese in this cubbyhole! Better not bring that to Renaldo, he'll go spare. He's terrified of cheese. It's not just the lactose-intolerance. I think he's turophobic too. Oh, and what's this? A key? I'd best take that.~"; } if (self.dtime == 6) { print "^~I hope these robes help Renaldo get that interplanar rift analyser. He's getting older by the hour. If he doesn't get some young blood from this other world, I don't know what's going to happen.~ A sudden brief smile crosses Yekcal's face. ~And he's getting ornery in his old age too, the old coot. Hah!~^ ^Yekcal snorts happily to himself and stuffs the robe deep into his own clothing."; remove nin_key; remove nin_robes; new_line; EndVision(self); StopDaemon(self); self.seen = true; if (initialvision == true) { Achieved(33); if (claim_ticket has general) print "^~Just as I thought!~ says ", (the)crystal, ". ~Renaldo"; else print "^~Oh dear!~ sighs ", (the)crystal, ". ~I doubt we'll find anything if we go to claim the laundry. I suppose we can always collect the cheese. But Renaldo's"; " pinched those robes. Well, his lackey did. This isn't good. Interesting about the cheese though, I keep forgetting Renaldo is lactose-intolerant. And possibly turophobic. Hmmm, terrified of cheese.~"; } initialvision = false; rtrue; } ]; Prop -> laundry_obj with !name 'cubby' 'holes' 'cubbyhole' 'washing' 'tubs' 'tub' 'low' 'benches', parse_name [i; while (true) { switch (NextWord()) { 'cubby', 'holes', 'cubbyhole': self.item_num = 1; i++; 'washing', 'tubs', 'tub': self.item_num = 2; i++; 'low', 'benches': self.item_num = 3; i++; 'laundry', 'clothing', 'bundles', 'neat', 'dirty', 'piles': self.item_num = 4; i++; default: return i; } } ], item_num 1, short_name [; switch (self.item_num) { 1: print "cubbyholes"; 2: print "washing tubs"; 3: print "low benches"; 4: print "laundry"; } rtrue; ], description [; switch (self.item_num) { 1: "The square cubbyholes line one wall of the room. They must be used for holding dirty and clean customer laundry, as you can see haphazard bundles of clothing in some and neatly folded piles in others."; 2: "The washing tubs are arranged in rows beside the benches, evidently used by Betty's army of young clothes washers."; 3: "The low benches sit in rows beside the tubs, providing a welcome place of ease for the clothes washers."; 4: "There are various bundles of dirty and clean customer laundry filling the cubby holes."; } ], before [; Smell: "The whole room has an invigorating smell of fresh linen."; ], react_before [; Smell: if (noun == nothing) <>; ], has pluralname; Askable nin_key "key" with name 'key', adname 'ninario^s', description "It looks like the key to Ninario's safety deposit box.", information [person; switch (person) { crystal: "~I think it's the key to Ninario's safety deposit box,~ says ", (the)crystal, (string)period; } rfalse; ]; Askable nin_robes "robes" with name 'robe' 'bunny' 'rabbit' 'rabbits' 'robes', adname 'ninario^s' 'wizard^s', description "The robes are covered with strange mystic depictions of adorable little rabbits in pyjamas.", information [person; switch (person) { crystal: "~Ninny's robes are adorable, aren't they?~ giggles ", (the)crystal, (string)period; } rfalse; ], has pluralname clothing ~worn scenery; !==================================================================================================================================================== ! Lonely Mountaintop Supply Room lonely_supply "Lonely Mountaintop Supply" with description [; #Ifdef GRAPHICS_ENABLED; if (location hasnt visited) { RevealBlumph(self.map_offset); } #Endif; "Everything about this small shop, from the walls and floors of rough wood, to the muted, depressing colours used, seems calculated to drive customers away. A counter sits on the south side of the room, and the marketplace lies back to the north."; ], #Ifdef GRAPHICS_ENABLED; map_offset 197, comp_mask N_MASK | OUT_MASK, #Endif; Walls ROUGH_WOOD, Floor ROUGH_WOOD, compass_look [obj; if (obj == n_obj) "The bustling center of Blumph's market lies through the doorway to the north."; return self.Room::compass_look(obj); ], before [; Exit: if (player in location) <>; rfalse; Go: if (noun == n_obj) { give hermit ~general; hermit.Topics = hermit.Topics & (~FLAG_x6); rfalse; } ], cant_go "The marketplace lies back through the doorway to the north.", out_to [; <>; ], n_to [; hermit.mesmer = 0; switch (random(8)) { 1: print "~Have a nice enough day that you're not eager to come back!~ calls ", (the)hermit, " as you leave.^^"; 2: print "~Don't tell your friends about the store!~ calls ", (the)hermit, " as you leave. ~Last thing I need is more customers tramping through.~^^"; 3: print "~Next week is Adopt a Lonely Mountaintop week,~ says ", (the)hermit, " as you step out. ~For only 800 plotkins, you can become solely responsible for the care and cleaning of a local lonely mountaintop.~^^"; 4: print "~Nothing personal, but please don't come again, unless absolutely necessary!~ calls ", (the)hermit, " as you leave. ~Let's cut down on those unnecessary visits.~^^"; 5 to 8: ; } print "You step back out into the sunshine and the bustle of the marketplace.^"; return Shops; ]; NPC -> hermit "shopkeeper" with name 'hermit' 'shopkeep' 'shopkeepe' 'wrinkles' 'face' 'rob' 'robert' 'himself' 'man' 'robby' 'bob' 'bobby' 'skin' 'limbs', adname 'cracked' 'lined' 'wrinkled', short_name [; print "shopkeeper"; rtrue; ], description [; print_ret (The)self, "'s cracked and lined face seems to have lost some of the lines of care and worry he had when he lived on his Vechlee mountaintop. He's hardly the picture of health and vivacity, with his darkly tanned and weathered skin and short spindly limbs, but he looks far more content with his lot in life now."; ], Chat 0, Topics 0, information [person; switch (person) { crystal: "~Oh, Robert runs a decent enough shop. Not much call for mountaineering equipment around Blumph, but he seems to squeak by. And the word is, he's much happier than he was as a hermit, so perhaps squeaking by is enough.~"; crone: "~Lonely Mountaintop Supply is Robert's little shop in the marketplace. He never seems to have much in the way of stock, but he runs the odd tour now and again. I'm sure he'd be happy to see you. He says the goggles you gave him in Vechlee gave him the courage to leave his mountaintop.~"; people: print "~Robert runs the Lonely Mountaintop Supply shop "; if (real_location == Shops) print "right over there"; else print "in the marketplace"; switch (random(4)) { 1: print ". He's a nice enough fellow, but I can't imagine he does a lot of business. The only people in Blumph who buy mountaineering equipment are the ones on a hopeless quest for greater spenseweed,~ sighs"; give greater_spenseweed objseen; 2: print ". Friendly fellow, though I've heard he used to be a bit of a bear when he was stuck on his lonely mountaintop,~ confides"; 3: print ". His is a lovely story, actually. Apparently, he used to run a stall in Vechlee, until the stress of operating under the Wizards Guild got to him. He became a hermit for several years, but finally worked up the courage to come back down when a kindly wizard's apprentice gave him some goggles. Real Vechlee Players Theatre material,~ smiles"; 4: ",~ shrugs a passerby. ~Go pay him a visit if you want to know more.~"; 5: print "~I visited the owner on his mountaintop in Vechlee once, and I'm not going anywhere near his shop, let me tell you,~ declares"; } randcrowd(); rtrue; akbar: "~Ah, my esteemed colleague at Lonely Mountaintop Supply is a fine fellow. Of course, what need have you of climbing gear when a flying carpet is available so cheaply?~"; betty: "~Oh, isn't Robert at Lonely Mountaintop Supply such a dear?~ squeals ", (the)betty, " eagerly. ~He pays me visits every now and then,~ she adds confidentially."; hermit: "~Well, after you gave me those goggles, I finally had enough protection for my eyes to find my way back down the cliff. I wandered the country for a while, but once I went back to Vechlee... well! The Wizards Guild Hall was destroyed, the guild was being disbanded... everything was coming up roses. So, I decided to move to Blumph like everybody else and set up shop. A mountaineering equipment shop seemed a perfect fit, given my lonely mountaintop credentials. I just wish there weren't so many customers traipsing in all the time. Some days, I get two!~"; captain: "~Never been in his shop,~ declares ", (the)captain, ". ~What do I need mountaineering equipment for? I just fly right over 'em!~"; teller: "~We don't do much business with penniless hermits who've eschewed society and its trappings, captain,~ says ", (the)teller, " rather primly."; } rfalse; ], initial [; if (real_location hasnt visited) { self.Chat = 0; give self general; "A shabby-looking shopkeeper beams at you as you enter. ~Well, if it isn't Ninario's apprentice!~ he cries. As he grabs and shakes your hand eagerly, you realise it's the hermit you met on the mountaintop outside Vechlee during your adventure last year.^ ^~It's a pleasure to see you, youngster. I want you to know, you saved my life with those goggles you gave me. Once I had them and could seriously look around my mountaintop, I realised what a miserable existence it was.~"; } if (lonely_supply.hoopsack_arrive == true) { lonely_supply.hoopsack_arrive = false; print_ret "~Hmph,~ mutters ", (the)self, ". ~I'd be more impressed if you could magic a few customers out of here now and again.~"; } if (self hasnt general) { self.Chat = 0; give self general; switch (random(82)) { 1 to 10: "~A return visit!~ cries ", (the)self, " as you enter. ~Business is booming today. What a shame!~"; 11 to 20: print (The) self, " squints at you as you enter. ~"; if (Testscope(magic_clothes)) "Another apprentice! What in the world is going... no, wait a minute, it's the same one.~"; else { print "An"; if (self.Topics & FLAG_x1 == FLAG_x1) print "other"; else self.Topics = self.Topics | FLAG_x1; " airship captain! Will today's wonders never cease?~ He pauses as you approach. ~Wait a minute, it's just that apprentice again, wearing that fancy captain's get-up.~"; } 21 to 30: "~Back again?~ smiles ", (the) self, (string)period; 31 to 40: print_ret (The) self, " nods politely as you enter."; 41 to 50: print_ret (The) self, " squints at you as you enter."; 51 to 70: print_ret (The) self, "'s intense smile greets you as you enter. He seems pleased to see you."; 71 to 80: print_ret (The) self, " looks up from studying the display case and smiles."; 81 to 82: print_ret (The) self, " is talking to a customer as you enter. ~Look lady, no matter what you think the name may imply, we do not supply lonely mountaintops.~^ ^~Well, that's just false advertising!~ complains the customer, leaving in a huff.^ ^~This is getting ridiculous!~ mutters ", (the)hermit, ". ~I definitely have to change the name of the store.~"; } } print (The)self, " "; switch (random(3)) { 1: "fusses around with the display case."; 2: "stands here, keeping an eye on you."; 3: "is here, intent on his shopkeeping duties."; } ], each_turn [; if (self.mesmer ~= 0 && location == lonely_supply) { switch (self.mesmer) { 1: "^~Oh no...~ murmurs ", (the)self, " suddenly, gazing at his hands in surprise. ~Not the hallucinations again!~"; 2: print_ret "^", (The)hermit, " gazes around the room, his eyes unfocused. ~I didn't even go near the pub this time,~ he mutters."; 3: "^~Well, when I say I didn't go near it, I might have popped in, but I didn't have anything,~ protests ", (The)hermit, ", ~so why all the crazy colours and visions?~"; 4: "^~Thank goodness that's going away,~ mutters ", (the)hermit, ". ~One half-pint! One lousy half-pint! It's just not fair.~"; 5: self.mesmer = 0; print_ret "^", (The)hermit, " shakes his head. ~That's truly the last time I'm going to visit that pub,~ he declares."; } } if (self.Chat == 1 && location == lonely_supply) { new_line; switch (random(40)) { 1 to 20: print (The) self, " whistles tunelessly to himself.^"; 21 to 30: print (The) self, " glances at you briefly.^"; 31 to 35: print (The) self, " brushes some specks of dust from the top of the display case.^"; 36 to 38: print (The) self, " glances at you. ~So, hanging out in your local mountaineering shop is your idea of a good time, right?~^"; 39: print "~They thought I was mad to open a mountaineering shop so far from the mountains", (admits)self, ". ~Can you imagine? Mind you, they thought I was mad for staying up on that mountaintop for so many years, and they weren't far wrong on that score.~^"; 40: print "~I know it would make more sense for a mountaineering shop to be closer to the mountains", (admits)self, " suddenly. ~But the truth of the matter is, I wanted to be as far away from my old stomping grounds as possible.~^"; } } self.Chat = random(3); rtrue; ], excuse 0, before [wd bk; Consult: wn = consult_from; wd = NextWord(); switch (wd) { 'stall': "~That old thing? I've long since moved on, youngster.~"; 'himself': self.information(hermit); rtrue; 'guided', 'tours': "~All tours have been cancelled until further notice. Why? Lack of interest, young 'un. Lack of interest. Oh, not from customers, they want them all the time. Lack of interest from me!~"; 'customer', 'customers': "~Customers,~ mutters ", (the)self, ". ~Don't talk to me about customers.~"; 'lack', 'interest', 'distinct': "~That's right,~ nods ", (the)self, ". ~A distinct lack of interest. Kind of like I'm feeling now.~"; 'haggling', 'bartering', 'barter', 'bargain', 'bargainin', 'haggle', 'deal', 'trade', 'discount': <>; 'goggles', 'sunny': "~Whenever it's sunny, I dig out those goggles and use them. They're still great! Though that Ninario was looking at me a bit suspiciously last time I wore them. I wonder why?~"; 'ninny', 'ninario', 'wizard': "~Oh, Ninny's all right, as wizards go. Doesn't usually come in here, which is fine with me.~"; 'rope', 'ropes', 'climbing', 'gear', 'supplies', 'picks', 'pitons', 'cables': switch (random(5)) { 1: print "~Normally, I'd have loads of it"; 2: print "~Yesterday I had more than I could shift"; 3: print "~I should have had a delivery of new stock by now"; 4: print "~I've run out. Don't let me bore you with the amusing and highly unlikely story behind it"; 5: print "~We usually have some left at the end of the week"; } print ",~ says ", (the)self, ", ~but "; self.excuse++; if (self.excuse > 20) self.excuse = 1; switch(self.excuse) { 1: "I haven't placed a new order.~"; 2: "there was a run on existing stock this morning.~"; 3: "delivery has been delayed on new orders.~"; 4: "temporary setbacks in the transportation sector have prevented new shipments.~"; 5: "circumstances beyond my control have delayed new shipments.~"; 6: "I honestly couldn't be bothered placing any new orders. More stock means more customers.~"; 7: "the short answer is, I hate ordering things.~"; 8: "I'm way behind on my overdue invoices.~"; 9: "our inventory management system is a bit lacking in a few areas, notably the inventory, the management, and the system.~"; 10: "it's been on order for two weeks.~"; 11: "the truth is, we usually get it delivered on Monday.~"; 12: "the boy who delivers it is off sick today.~"; 13: "I don't understand the order entry ledger.~"; 14: "I can't read all these notes I made on what we're low on,~"; 15: "the manager was off sick yesterday. I'm feeling better today, but still not up to ordering.~"; 16: "the order entry system was down. Which is to say, I dropped the pad of paper on the floor.~"; 17: "I'm not allowed to order any more until I pay my bills.~"; 18: "I'm not really very fond of my supplier, so I don't want to talk to him.~"; 19: "the supplier is a crusty old so-and-so and I don't want to talk to him.~"; 20: "as your master is so fond of saying, there are some issues with the cash-flow situation.~"; } 'turthalio', 'michael': "~Ruler of all Thalion,~ shrugs ", (the) self, ". ~Seems content to keep himself to himself, and just let things run as they should.~"; 'vechlee', 'city', 'better': "~Vechlee's a dump,~ mutters ", (the) self, ". ~It's much better here.~"; 'thalion', 'country', 'land', 'world': "~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.~"; } do { wn = consult_from; bk = ParseToken(SCOPE_TT, AskableScope); } until (bk ~= GPR_REPARSE); if (bk == GPR_FAIL) "~I'm not sure what you're asking about,~ shrugs ", (the)self, "."; if (bk.information(self) == true) rtrue; "~I can't tell you anything much about that,~ shrugs ", (the)self, "."; Attack: if (children(hermit_cabinet) == 0) "These wily old folks can be surprisingly strong. You restrain your violent tendencies."; "You don't want ", (the)autoclimber, " ", (i) "that", " badly."; Bargain: if (children(hermit_cabinet) == 0) "~There's no point in bargaining,~ sighs ", (the)self, ". ~I don't have any merchandise to sell.~"; "~What!~ cries ", (the)self, " in amazement. ~Haggling! Aren't my prices astounding enough? I can't go any lower! My kids will starve. All right, I don't have any, but ", (i) "I'll", " starve, and that's even worse!~"; Buy: "You definitely don't need a mountaintop supply shopkeeper."; BuyFrom: if (noun == self) <>; Kiss: "He doesn't really inspire that sort of reaction."; Listen: print_ret (The)self, " whistles tunelessly to himself every now and then."; MeetNPC,Smile: if (self has proper) "~Yes, hello again,~ nods ", (the)self, (string)period; self.short_name = "Robert"; give self proper; "The shopkeeper smiles a broad smile at you. ~It's nice to see you here in Blumph, that's for sure. I'm glad you made it through your struggle with the Wizards Guild. My name's Robert, by the way.~"; Search: print_ret (The)self, " frowns at you. ~Hands off, youngster, I don't have anything of value.~"; SellTo: print_ret "He hands ", (the) second, " back to you. ~Can't say I'm too interested in carrying this in the store.~"; Smell: print_ret (The)self, " smells of scented soap. ~Nice, isn't it?~ he smiles. ~That's one of the pleasures of civilised life, when contrasted with mountaintop life.~"; Talk: if (self hasnt proper) <>; print_ret (The)self, " glances at you. ~Well?~"; Take: print_ret (The)self, " smacks your hand away. ~I'm not to be removed from the premises.~"; Thank: "~Oh, you're welcome, I suppose,~ says ", (the)hermit, ", a tad grudgingly. He bangs the countertop in frustration. ~I've got to remember to stop being kind to the customers,~ he mutters to himself. ~It just makes them come back.~"; Touch: "~I'm grateful for the kickstart your goggles gave me, but not that grateful,~ mutters ", (the)self, (string)period; ], life [; 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 in this town?~"; Give: <>; Show: if (noun ofclass Cheese) { print (The) self; " sniffs at ", (the) noun, " ~Mmmm! That smells like a nice cheese. Best hang on to that one, youngster.~"; } switch (noun) { plotkin: if (children(hermit_cabinet) == 0) "~I have money too,~ says ", (the)self, " defensively. ~That's why the display case is empty. I've been selling like a mad hermit determined to get back to his mountaintop.~"; print_ret (The)self, "'s eyes light up. ~Money! You've just gone from potential customer to probable customer, my young friend.~"; Red_Carpet: "~That's a hideous carpet,~ mutters ", (the) self, ". ~If I'd had a carpet like that, I'd flee society again in shame.~"; default: <>; } Tell: if (second == 'me' or 'myself' or 'you' or 'yourself') print_ret (The) self, " looks you over and shrugs. ~Human interest stories usually don't interest me.~"; if (WordInProperty(second, bronze_port, name) || WordInProperty(second, stone_wall, name)) { bronze_port.information(self); rtrue; } print_ret (The) self, " looks defensive. ~You can't tell me anything about that I don't already know.~"; ], nomatch [; "~I can't tell you anything much about that,~ shrugs ", (the)self, "."; ], orders [; MeetNPC: <>; default: print "~Oh, I'm far too busy with the merchandise,~ says ", (the)self, ", gesturing to the "; if (children(hermit_cabinet) == 0) print "empty "; "display case."; ], react_before [; Buy: if (second ~= nothing or hermit) rfalse; if (noun == hermit_cabinet) { if (children(hermit_cabinet) == 0) "~Nah, I'll hang on to the display case for now,~ says ", (the)self, ". ~I might get more merchandise in one of these days.~"; "~If you're interested in ", (the)autoclimber, ", just come right out and say so,~ says ", (the)self, (string)period; } if (noun == self) rfalse; if (noun in hermit_cabinet) { if (plotkin.adjust(noun.sale_value, BUYING) == false) print_ret (The)self, " scratches his chin. ~Well, as tempting as it would be to sell it below cost, I'm afraid that's a losing proposition for me. My price is firm at ", noun.sale_value, " plotkins. Come back when you have enough.~"; move noun to player; if (noun == autoclimber) Achieved(19); MoveFloatingObjects(); print "~Done,~ says ", (the)self, ", taking ", noun.sale_value, " of your plotkins and handing you the ", (name)noun, " from the display case."; noun.sale_value = noun.sale_value / 2; new_line; rtrue; } print_ret (The)self, " frowns. ~I'm afraid ", (ItorTheyAre)noun, " not mine to sell, youngster.~"; Sell: <>; ]; Furniture -> hermit_cabinet "glass display cabinet" with name 'case' 'cabinet' 'shelves' 'items' 'merchandi', adname 'glass' 'display', description [; print "The glass display cabinet fills one wall of the shop. The interior is lined with "; if (children(self) == 0) "several empty shelves."; print "shelves, upon which you see "; WriteListFrom(child(self), ENGLISH_BIT); print_ret (string)period; ], initial [; print "A glass display cabinet"; if (children(self) == 0) print ", devoid of merchandise,"; else print " with some merchandise in it"; " covers the far wall of the shop."; ], information [person; switch (person) { crystal: if (location == lonely_supply) { print "~He doesn't have much stock, does he?~ murmurs ", (the)crystal, ", looking into the "; if (children(self) == 0) print "empty "; "display cabinet."; } "~He didn't have much stock, did he?~ murmurs ", (the)crystal, "."; hermit: print "~What about it? I need ", (i) "something", " to put the merchandise in."; if (children(self) == 0) " Okay, it's empty ", (i) "now", " but when it's full it sure looks great.~ He glances at it. ~In fact, it's still pretty awesome.~"; " And look at that stunning array of items,~ he adds, pointing to the lone piece of merchandise."; } rfalse; ], before [; Attack: print_ret (The)hermit, " grabs your hand with a surprisingly strong arm. ~Don't you dare, youngster!~"; Climb,Enter: "~Hey, don't do that!~ protests ", (the)self, ", stopping you. ~It hasn't been stress-tested.~"; Close,Lock: "The display cabinet is already closed and locked."; Open,Unlock: print_ret (The)hermit, " waves you away. ~If you're interested in something, ask.~"; Rub: print_ret (The)hermit, " peers closely at the display cabinet as you give it a quick wipe. ~Huh,~ he mutters. ~Looked clean enough to ", (i) "me", (string)period; Search: <>; ], has ~supporter container transparent; Askable -> -> autoclimber "strange-looking device" with name 'device' 'autoclimb' 'remains' 'megamount' 'mega' 'mountain' 'extreme' 'arms' 'auto' 'climber' 'crossbow' 'grappler', adname 'strange-l' 'strange' 'looking' 'of', sale_value AUTOCLIMBER_BUY, aimed_at 0, attached false, broken false, article "a", add_to_scope hook trigger cable lever, description [; if (self has general) print "The ambitiously-named"; else print "The"; print " ", (name)self, " looks like a small crossbow, though with a grappling hook for a tip, rather than a bolt. The grappling hook is attached to a strong steel cable that winds up under the arms.^ ^It looks easy enough to operate: point it at whatever you want to climb, and then pull the trigger. Once it latches on, a second pull on the trigger will pull you and the autoclimber up. There's also a release lever to unhook a latched grapple.^"; if (self.attached == true) { new_line; <>; } ], short_name [; if (self has general) print "MegaMountain Autoclimber Extreme"; else print "strange-looking device"; rtrue; ], information [person; if (lonely_supply hasnt visited) rfalse; switch (person) { crystal: if (self in hermit_cabinet && location == lonely_supply) { if (self hasnt general) print "~Oooh!~ says ", (the)crystal, " excitedly. ~A"; else print "~It's a"; } else if (self in hermit_cabinet) print "~That strange-looking device at Lonely Mountaintop Tours? It's a"; else print "~It's a"; give self general; print_ret " ", (name)self, ", for all your climbing needs. Point it at something and pull the trigger to launch the grappling hook. Once it latches on, pull it again and you'll be whisked up there.~"; crone: "The old crone shrugs. ~Autoclimbers? Never had much use for them myself. A trusty broomstick is all I've ever needed.~"; people: if (lonely_supply hasnt visited) rfalse; "No one in the crowd seems to know or care much about ", (the) self, (string)period; akbar: "~Wonderful!~ cries ", (the)akbar, " excitedly. ~But why climb when you can fly?~"; betty: "~An autoclimber? Sounds dangerous!~ frets ", (the)betty, ". ~I wouldn't want to get hit in the face with a grappling hook.~"; hermit: give self general; if (self notin hermit_cabinet) "~All sales are final!~ cries ", (the)hermit, " hurriedly. ~If you're not satisfied with ", (the)self, " you purchased, that's your own problem. And no guarantees against breakage either,~ he adds, fixing you with a steely gaze. ~So don't even ", (i) "think", " about trying that one on me. If you're having trouble operating it, just point it at something and pull the trigger to launch the hook. Once it latches on, pull the trigger again and get whisked up.~"; if (self in hermit_cabinet) "~Want to explore the highest of mountains or transcend towering walls? No good at climbing? Well, fear not. Forget climbing boots. Forget pitons. Forget ropes. ", (The)self, " allows even the clumsiest of apprentices to surmount the highest alpine obstacles with ease and grace. Elegant and simple to use. Point it at the object of your lofty aspirations and pull the trigger. The hook flies up and latches on, and when you pull the trigger again, you'll be whisked quickly up. Fun for the whole family, and yours for only ", self.sale_value, " plotkins.~"; captain: "~An autoclimber?~ says ", (the)captain, " suspiciously. ~Better not let me catch you using that to break into my house, kid.~"; } rfalse; ], react_before [; Go: if (self.attached == true && self in player) { print "(pulling the lever to release the grappling hook first)^"; self.attached = false; } self.aimed_at = 0; ], before [ks; if (autoclimber.broken == true) "The whole ", (name)autoclimber, " is broken beyond repair."; AimAt: if (autoclimber notin player) { ks = keep_silent; keep_silent = true; print "(first taking ", (the)autoclimber, ")^"; ; keep_silent = ks; } if (autoclimber notin player) rfalse; if (self.attached == true) { print "(pulling the lever to release the grappling hook first)^"; self.attached = false; } self.aimed_at = 0; if (second == nothing) { if (noun == self) "You can't aim ", (the) self, " at itself."; <>; } if (second == case or hermit_cabinet) { print "~Don't even think about it!~ cries "; if (second == case) print (the)crone; else print (the)hermit; " in indignation. You lower ", (the)self, " reluctantly.^^~We never get to have any fun,~ pouts ", (the)crystal, (string)period; } if (second == self or hook or trigger or cable or lever) "You can't aim ", (the)second, " at itself."; if (second == player) "You can't aim ", (the)second, " at yourself. That's just asking for trouble."; if (second ofclass CompassDirection) "You must aim ", (the)self, " at a specific object."; if (second == crystal or ball or deficiencies or cottage or snow) { "~Point that thing someplace else!~ cries ", (the)crystal, " indignantly. You lower the device."; } if (second ofclass NPC) { if (second == ptero) { "~How could you even think that?~ cries ", (the)crystal, " in indignation as you point ", (the)self, " at the defenseless pterosaur. Ashamed, you lower the device."; } else if (second == guard) { self.aimed_at = second; "The guard whistles obliviously to himself as you point ", (the)self, " right at him.^ ^~Locked and loaded,~ murmurs ", (the)crystal, (string)period; } else if (second == people) print_ret (The)people, " scream and duck for cover as you point ", (the)self, " randomly at members of the crowd."; else { print "~Hey!~ cries "; if (second == vat_and_horses) print "the teamster"; else if (second == workers or people) print "someone in the group"; else print (the)second; ", ducking out of the way. ~Don't point that at people. You could easily knock out an unsuspecting person that way!~"; } } if (second notin location && second notin player) "You can't aim ", (the)self, " at ", (the)second, " while it's in ", (the)parent(second), (string)period; print "You point ", (the) self, " steadily at ", (the)second, ".^"; self.aimed_at = second; rtrue; Pull: <>; ]; Prop -> -> -> hook "hook" with name 'hook', adname 'grappling', description [; print "The grappling hook on ", (the)parent(self), " looks strong and sturdy."; if (autoclimber.attached == true) " It is currently attached to ", (the)autoclimber.aimed_at, (string)period; new_line; rtrue; ], information [person; if (person == crystal) "~Ah yes, the grappling hook. A much more successful invention than its predecessor, the non-grappling hook.~ She sighs. ~It just never caught on.~"; return autoclimber.information(person); ], before [; if (autoclimber.broken == true) "The whole ", (name)self, " is broken beyond repair."; AimAt: <>; Examine: rfalse; Pull,PutOn,Tie: "You can't extend the grappling hook and cable by hand. You'll have to aim it at something and then pull the trigger."; ]; Askable -> -> -> trigger "trigger" with name 'trigger', description "The trigger can be pulled to launch and retract the grappling hook and cable.", information [person; return autoclimber.information(person); ], before [ks; if (autoclimber.broken == true) "The whole ", (name)self, " is broken beyond repair."; AimAt: <>; Pull: if (autoclimber.aimed_at == 0) "You'll need to aim ", (the)autoclimber, " at something before pulling the trigger."; if (autoclimber notin player) { ks = keep_silent; keep_silent = true; print "(first taking ", (the)autoclimber, ")^"; ; keep_silent = ks; } if (autoclimber notin player) rfalse; if (autoclimber.attached == true) { !We are now trying to pull this thing down print "You pull the trigger and with a mighty whirring sound, the cable retracts, "; #Ifdef SOUND_ENABLED; PlaySound(autohit); #Endif; if (autoclimber.aimed_at == gate or alley_fence) { print "yanking you bodily into ", (the)autoclimber.aimed_at, ".^^~Ouch!~ says ", (the)crystal, ".^"; } if (autoclimber.aimed_at == guard) { move big_key to Vechlee_Road; move autoclimber to Vechlee_Road; remove guard; give guard general; autoclimber.attached = false; autoclimber.aimed_at = 0; autoclimber.broken = true; autoclimber.article = "the remains of a"; Achieved(44); MoveFloatingObjects(); print "yanking ", (the)guard, " bodily off the top of the caer wall and pulling him crashing to the dusty road.^ ^Just as you're wondering if he's badly hurt, he rolls to his feet, his ruddy face turning a deeper shade of crimson.^ ^~Tha greeat demmed dossel-heead!~ he swears blazingly. ~Ist tha tryin' ti keel ma?~^ ^Angrily, he grabs ", (the)autoclimber, " from you and before you can stop him, smashes it over his knee. ~Theyt'll fix tha,~ he snarls, dropping the remains in the road. ~Noo ah's aweeay t'report tha t'magistthraites.~ He turns sharply on his heel and departs towards Vechlee.^ ^As he marches away, you see that he has left something behind in the dust on the road."; new_line; rtrue; } if (autoclimber.aimed_at == stone_wall or bronze_port) { give stone_wall general; autoclimber.attached = false; stone_wall.short_name = "heap of rubble"; #Ifdef SOUND_ENABLED; PlaySound(collapse); #Endif; Achieved(20); tattler.add_story(FREAK_EARTHQUAKE); StartTimer(freak_earthquake_timer, 4); Blumph_Heights.comp_mask = Blumph_Heights.comp_mask | E_MASK; "and you feel ", (the)autoclimber, " tugging mightily in your arms. There is a groaning, shuddering sound from the wall and suddenly, rather than lifting you elegantly off the ground and neatly over the wall, ", (the)autoclimber, " wrenches the wall and portcullis down around you.^ ^~Goodness gracious!~ cries ", (the)crystal, " as large chunks of the wall shower down beside you. ~I'm not sure that's how that climber was meant to be used!~"; } if (autoclimber.aimed_at == doorframe or window_frames) { ! pull player from ground_floor to Oak_Street ! or vice versa print "yanking you bodily through ", (the)autoclimber.aimed_at, " and "; if (real_location == ground_floor) { print "out to the bustle of Oak Street.^"; PlayerTo(Oak_Street); } else { print "inside the house.^"; PlayerTo(ground_floor); } MoveFloatingObjects(); print "^~You know,~ says ", (the)crystal, " pointedly, ~houses can also be entered and exited by the convential method of simply walking through the doorway.~^"; } if (autoclimber.aimed_at == stairs) { if (stairs has general) { print "yanking you bodily through the opening and "; if (real_location == ground_floor) { print "up to the first floor, where you land lightly on your feet.^^~You know,~ says ", (the)crystal, " thoughtfully, ~that really is quite an elegant solution to the problem of the stairs.~^"; PlayerTo(first_floor); } else { print "down to the ground floor, where you land with a thud. You rise gingerly to your feet, checking for broken bones.^^~You really like complicating simple little tasks, don't you?~ asks ", (the)crystal, " curiously.^"; PlayerTo(ground_floor); } MoveFloatingObjects(); } else { give stairs general; stairs.short_name = "opening"; move plank to ground_floor; MoveFloatingObjects(); print "but rather than yanking you through the opening, ", (the)autoclimber, " wrenches the stairs down in a heap of wooden planks and dust.^^~Oh my!~ says ", (the)crystal, " in alarm. ~That wasn't exactly how I pictured that thing working. So much for getting up that way.~^"; } } #Ifdef SOUND_ENABLED; PlaySound(autoclimb); #Endif; print "^With the cable fully retracted, the arms of the grappling hook collapse briefly, unhooking it.^"; autoclimber.aimed_at = 0; autoclimber.attached = false; rtrue; } if (autoclimber.aimed_at == stone_wall or bronze_port && stone_wall has general) "The wall has already come down; there's not much more damage you can do to it."; print "With a loud whirring sound, the grappling hook shoots out of ", (the)autoclimber; switch (autoclimber.aimed_at) { anchor: #Ifdef SOUND_ENABLED; PlaySound(autoclimb); #Endif; ", but the anchor cable is just too narrow of a target to aim at. The cable misses the anchor and then retracts."; gate, stone_wall, bronze_port, doorframe, stairs, window_frames, alley_fence, Caerwall_Obj, guard: #Ifdef SOUND_ENABLED; PlaySound(autohit); #Endif; print " and latches itself to ", (the)autoclimber.aimed_at, ".^"; if (autoclimber.aimed_at == guard) print "^~Tha greeat fond-heead!~ bellows the guard as the cable wraps itself around him.^"; else if (autoclimber.aimed_at == Caerwall_Obj) { if (self has general) "^~Tha's nobbut waisting thine own tahm, tha daft fout,~ shouts the guard. He runs over and releases the grappling hook from the wall. ~Ah ken deea this awl day, tha knoos.~"; give self general; "^~What dust tha theenk tha's deeaing?~ cries the guard, running over to the grappling hook. Swiftly he releases the hook from the wall and throws it back in your direction. Then he returns to his post at the front of the caer."; } autoclimber.attached = true; rtrue; default: ", but can't seem to find any purchase on ", (the)autoclimber.aimed_at, (string)period, " It retracts itself quickly."; } ], has scenery; Prop -> -> -> cable "sturdy steel cable" with name 'cable', adname 'sturdy' 'steel', description [; print "The sturdy steel cable is "; if (autoclimber.attached == false) "wound tightly beneath the arms of ", (the)autoclimber, (string)period; "fully extended, with the grappling hook latched on to ", (the)autoclimber.aimed_at, (string)period; ], information [person; return autoclimber.information(person); ], before [; Examine: rfalse; Pull,PutOn,Tie: "You can't extend the grappling hook and cable by hand. You'll have to aim it at something and then pull the trigger."; ]; Prop -> -> -> lever "release lever" with name 'lever', adname 'release', description [; "When pulled, this small lever briefly collapses the arms of the grappling hook and then retracts the hook."; ], information [person; return autoclimber.information(person); ], before [; Examine: rfalse; Pull: if (autoclimber.attached == false) "Nothing happens. Perhaps the grapple needs to be deployed for this lever to do something."; autoclimber.attached = false; "There is a click from the grappling hook as the arms collapse briefly. It detaches from ", (the)autoclimber.aimed_at, " and the cable winds quickly back up."; ]; Prop -> muted_colours "muted and depressing colours" with name 'color' 'colour' 'colors' 'colours', adname 'muted' 'drab' 'depressin', description "The drab colours seem designed to sap your energy and will to buy.", information [person; switch (person) { crystal: print "~Depressing, "; if (location == lonely_supply) print "a"; else print "we"; "ren't they?~ murmurs ", (the)crystal, (string)period; hermit: "~Well, I like being a shop owner, but I hate dealing with the customers. The idea with the colours is to get them to leave as quickly as possible.~"; } rfalse; ]; !==================================================================================================================================================== ! Blumph Heights Outroom Blumph_Heights "Blumph Heights", with description [; #Ifdef GRAPHICS_ENABLED; if (location hasnt visited) { RevealBlumph(self.map_offset); } #Endif; "A quiet and charming haven of large homes, elegant parks and well-tended grass, Blumph Heights doesn't exude wealth and privilege so much as state it simply and quietly. South lies the arboured entrance to an expansive park, while northwest, a gently meandering road heads back toward the high street."; ], #Ifdef GRAPHICS_ENABLED; map_offset 205, comp_mask NW_MASK | S_MASK, #Endif; Floor LAWN_GRASS, compass_look [obj; if (obj == s_obj) { park_obj.item_num = 5; <>; } if (obj == e_obj) <>; if (obj == nw_obj) <>; return self.Outroom::compass_look(obj); ], cant_go "You can head northwest to the high street or south into the park. East are the grounds of the manor house.", nw_to [; #Ifdef GRAPHICS_ENABLED; blumphmap-->369 = blumphmap-->369 & (~NODRAW_FLAG); #Endif; print "You head northwest along the gently meandering road back to the bustle of the high street.^"; return High_Street; ], s_to [; print "You step into the idyllic peace of the sprawling park.^"; return Park; ], e_to [; if (stone_wall hasnt general) "The high stone wall blocks entry to the manor house grounds."; print "You climb over the heap of rubble into the manor house grounds.^"; return Manor_Grounds; ]; Prop -> large_homes "large homes" with name 'homes', adname 'large', description "The large homes are quietly impressive without looking ostentatious. They are extremely elegant.", before [; Enter: "You don't just wander into Blumph Heights homes without an express invitation. Or at least, a purloined front door key."; ], information [person; switch (person) { crystal: if (Blumph_Heights has visited) { print "~Large, "; if (location == Blumph_Heights) print "a"; else print "we"; "ren't they?~ murmurs ", (the)crystal, (string)period; } rfalse; } ]; Prop stone_wall with name 'wall' 'heap' 'rubble', adname 'high' 'of' 'stone', found_in Blumph_Heights Manor_Grounds, description [; if (self has general) "This heap of rubble is all that's left of this section of the high stone wall."; "The high stone wall towers over you, blocking further movement east. There's a portcullis set into the wall, beyond which you can see a large garden and a stately manor house."; ], FakeObj, initial [; print "To the "; if (self in Blumph_Heights) print "ea"; else print "we"; print "st lies a high stone wall, "; if (self has general) { "whose middle section has been pulled down into a heap of rubble."; } "broken only by a closed bronze portcullis."; ], short_name [; print "high stone wall"; rtrue; ], information [person; <>; ], before [; Open: <>; Enter,Go,Climb: if (self has general && location == Blumph_Heights) <>; else if (self has general) "You clamber about on the heap of rubble briefly and then descend."; "You attempt to climb the high stone wall, but the smooth stone offers no purchase."; Search: if (self has general) "You don't find anything useful in the heap of rubble."; Touch: "The stones of the wall are smooth and cool to the touch."; ], has static ~scenery; Prop bronze_port "bronze portcullis" with name 'portculli' 'port', adname 'bronze', found_in Blumph_Heights Manor_Grounds, description [; if (stone_wall has general) "The twisted remains of the portcullis are buried under the rubble of the wall."; print "The strong bronze portcullis is inset into an opening in the wall, blocking access to the grounds of a large manor home. The portcullis is about ten feet high, and the wall continues another ten feet above that. At the very top of the portcullis, a small crest is worked into the metal.^^"; <>; ], information [person; if (Blumph_Heights hasnt visited) print_ret (The)person, " isn't sure what you're asking about."; switch (person) { hermit: if (stone_wall has general) "~Pulled the whole wall down?~ gulps ", (the)person, " looking a bit alarmed. Then he gives a toothy smile and claps you on the shoulder. ~I knew that ", (name)autoclimber, " would sort that wall out. Awesome, isn't it?~"; print "~An impassable stone wall and bronze portcullis?~ cries ", (the)person, ". ~Well, "; if (autoclimber in hermit_cabinet) print "that's why you need"; else print "good thing you bought"; give autoclimber general; " the world's greatest and most versatile piece of equipment, ", (the)autoclimber, ". That contraption will sort that wall in a jiffy.~"; crystal: if (stone_wall has general) "~I must say, I'm quite impressed at the level of mayhem we've inflicted already,~ smiles ", (the)crystal, ". ~I knew doing anything with you would involve collateral damage, I just didn't realise how much.~"; print "~It look"; if (location == Blumph_Heights) print "s"; else print "ed"; " fairly sturdy. We can either try to find the key or just climb over the wall.~"; captain: "~It's my place behind that wall,~ growls the captain. ~Left to me by my parents. I had the portcullis custom-built when I became an airship captain.~"; } rfalse; ], before [; if (stone_wall has general && action ~= ##Examine) <>; Enter, Open, Unlock: #Ifdef SOUND_ENABLED; PlaySound(gatetry, 1); #Endif; "You tug at the bronze portcullis, but it's firmly locked, and you don't have the key."; Climb: print "The portcullis fills the opening in the wall, leaving no room to squeeze through.^"; if (gate.attempts == 5) "^~Thank goodness,~ mutters ", (the)crystal, ". ~I don't think I could stand to watch a bout of portcullis climbing after all those failed attempts with the gate.~"; rtrue; Search: "Beyond the portcullis, you can see neatly tilled grass and carefully tended flowers. The manor home, large and stately-looking, lies beyond."; Smell,Touch,Taste: "Cold and metallic."; ], has transparent; Prop -> small_crest "crest" with name 'crest', adname 'small' 'elegant', description [; print "The small elegant crest is "; if (stone_wall has general) "buried under the heap of rubble."; "in the shape of an airship."; ], information [person; switch (person) { crystal: "~I guess an airship captain lives there.~"; captain: return bronze_port.information(person); } rfalse; ], before [; if (stone_wall has general && action ~= ##Examine) <>; Smell,Touch,Taste: "Cold metallic bronze, lightly embossed to show the detail."; Take,Transfer: "The crest is an integral part of the design of the gate."; ]; Prop park_obj with parse_name [i; while (true) { switch (NextWord()) { 'grass', 'lawn': self.item_num = 1; i++; give self ~pluralname; 'flowers', 'flower': self.item_num = 2; i++; give self pluralname; 'tree', 'trees', 'towering', 'leaves', 'wind', 'breeze': self.item_num = 3; i++; give self pluralname; 'birds': self.item_num = 4; i++; give self pluralname; 'elegant', 'park', 'parks', 'arbor', 'arbour', 'arboured', 'arbored', 'entrance', 'pathway', 'tree-line', 'hedge', 'hedges': self.item_num = 5; i++; give self ~pluralname; 'garden', 'grounds': self.item_num = 6; i++; give self ~pluralname; 'branch', 'branches', 'trunk', 'trunks': self.item_num = 7; i++; give self ~pluralname; default: return i; } } ], Chat 0, each_turn [obj; if (self.Chat == 1 && location == Park or Manor_Grounds) { ! play a park sound at random. There are 8 sounds and ! they start at "park1" if (real_location == Park or Manor_Grounds) { new_line; obj = random(4); switch(obj) { 1: print "Birds twitter noisily amongst the hedges.^"; 2: print "Birds twitter and call gently to each other from the trees.^"; 3: print "Sounds of birds and various woodland animals echo around the trees and grasses.^"; 4: print "As the wind picks up and blows gently through the trees, birds caw back and forth loudly.^"; } #Ifdef SOUND_ENABLED; PlaySound(obj + hedgebirds - 1); #Endif; } } self.Chat = random(3); rtrue; ], item_num 1, short_name [; switch (self.item_num) { 1: print "grass"; 2: print "flowers"; 3: print "trees"; 4: print "birds"; 5: if (real_location == Manor_Grounds) print "grounds"; else print "park"; 6: if (real_location == Manor_Grounds or Blumph_Heights) print "grounds"; else print "park"; 7: print "tree trunks"; } rtrue; ], information [person; if (~~(location == Blumph_Heights or Park or Manor_Grounds)) rfalse; switch (person) { crystal: switch (self.item_num) { 1: "~Doesn't it look soft and springy?~ smiles ", (the)crystal, (string)period; 2: "~They're beautiful!~ sighs ", (the)crystal, ". ~And I bet they smell divine.~"; 3: "~They've been here a long time,~ says ", (the)crystal, ", gazing up at them. ~They were planted when I was a little girl, some two hundred years ago.~"; 4: "~They sound very happy in those trees, don't they?~"; 5: if (real_location == Manor_Grounds) "~The manor grounds are lovely, aren't they?~"; "~Oh, this park's been here since Blumph Heights was a tiny little village outside of Blumph. We've always been fond of nature here in the Heights,~ she adds proudly."; 6: if (real_location == Manor_Grounds or Blumph_Heights) "~The manor grounds are lovely, aren't they?~"; "~Oh, this park's been here since Blumph Heights was a tiny little village outside of Blumph. We've always been fond of nature here in the Heights,~ she adds proudly."; 7: "~Those trunk are massive", (murmurs)crystal, " gazing at the trees. ~But the branches get fairly thin way up.~"; } } rfalse; ], description [; switch (self.item_num) { 1: "The carefully tilled grass is a healthy shade of green."; 2: "The flowers are an explosion of colour, revelling in the summer heat."; 3: "The trees tower above ", (the)location, ", shading some of the brilliant sunshine. Their trunks are large and solid, but high above, thinner branches wave gently in the breeze."; 4: "The birds twitter contentedly in the trees."; 5: if (real_location == Manor_Grounds) print "The grounds of the manor house sprawl out majestically in front"; else { print "An arboured pathway leads "; if (real_location == Blumph_Heights) print "into"; else print "out of"; print " the park to the "; if (real_location == Blumph_Heights) print "south"; else print "north"; } print " of you. Rolling fields of grass spread in all directions, populated abundantly with trees and hedges."; if (real_location == Manor_Grounds) print " The manor house lies to the east, and a flagstone path heads northeast and southeast around the house, and back towards the ruined wall to the west."; new_line; rtrue; 6: if (real_location == Manor_Grounds or Blumph_Heights) "The grounds of the manor house sprawl out majestically in front of the house. Rolling fields of grass spread in all directions."; else { print "An arboured pathway leads out of the park to the north"; } print " of you. Rolling fields of grass spread in all directions, populated abundantly with trees and hedges."; new_line; rtrue; 7: "The large solid trunks lead to gentler thinner branches wavering high above in the breeze."; } ], found_in Blumph_Heights Park Manor_Grounds, before [; if (real_location == Blumph_Heights && action ~= ##Examine) { print (The)self, " ", (isorare)self, " in the "; if (self.item_num == 3 or 4) print "park"; else print "garden"; ", and you're out here."; } Attack,Take,Pull: if (self.item_num == 1 or 5) "You pull out a few stalks of grass and watch them blow away in the wind."; if (self.item_num == 2) "The flowers look so beautiful you can't bring yourself to pull one out."; if (self.item_num == 3 or 7) "The trees have been here for a long while, and have massive root systems spreading over a large area."; if (self.item_num == 4) "The birds are all hidden in the trees."; Climb: "You don't have time to go monkeying around like that."; Listen: if (self.item_num == 3 or 5) { #Ifdef SOUND_ENABLED; PlaySound(forest); #Endif; "The wind sighs gently through the leaves of the trees."; } if (self.item_num == 4) { #Ifdef SOUND_ENABLED; PlaySound(treebirds); #Endif; "Birds twitter and call to each other in the trees."; } Search: if (self.item_num == 1 or 2) "No, no rare and exotic weeds to be found amongst the ", (name)self, (string)period; if (self.item_num == 3 or 7) "You don't find the birds, if that's what you're looking for."; Smell: if (self.item_num == 1) "The grass smells newly-mown."; if (self.item_num == 2) "The flowers give off a dizzying array of aromas."; if (self.item_num == 3 or 7) "Mmmm... a very woody sort of smell."; if (self.item_num == 5) "The park has the heady smell of fresh-mown grass and flowers in full bloom."; Talk: if (self.item_num == 4) { print "You tell it to the birds.^"; if (crystal has general) print "^~They don't seem impressed,~ sighs Crystal. ~Birds never are.~^"; rtrue; } if (self.item_num == 3 or 7) "Sadly, these trees are ", (i) "not", " the king of Prussia."; print_ret (The)self, " ", (isorare)self, "n't in a talkative mood."; default: if (self.item_num == 4) "As you can't see the birds at the moment, that would be difficult."; ], react_before [; if (real_location == Blumph_Heights) rfalse; Listen: if (real_location == Park or Manor_Grounds) { if (noun == nothing) { self.item_num = 4; <>; } } Smell: if (noun == nothing) <>; ], has animate; !==================================================================================================================================================== ! Manor Grounds Outroom Manor_Grounds "Manor Grounds" with description [; #Ifdef GRAPHICS_ENABLED; if (location hasnt visited) { RevealBlumph(self.map_offset); } #Endif; "The grounds of this manor house are extensive, with large expanses of grass interspersed with trees and hedges. The carefully manicured lawn of the front garden lies before you. To the east sits a large and sprawling manor house. A flagstone path runs around the manor house to the northeast and southeast and back to the west."; ], #Ifdef GRAPHICS_ENABLED; map_offset 207, comp_mask W_MASK | NE_MASK | SE_MASK | E_MASK, #Endif; Floor LAWN_GRASS, cant_go "You can head west back out of the manor grounds, or go northeast or southeast around the house. The front door of the house lies to the east.", w_to [; print "You climb over the heap of rubble, exiting the manor grounds.^"; return Blumph_Heights; ], go_path [dir1 dir2; "You head around the house to ", (the)dir1, ", circling the extensive and impressive grounds, returning back to the front door from ", (the)dir2, (string)period; ], ne_to [; #Ifdef GRAPHICS_ENABLED; blumphmap-->343 = blumphmap-->343 & (~NODRAW_FLAG); blumphmap-->376 = blumphmap-->376 & (~NODRAW_FLAG); blumphmap-->409 = blumphmap-->409 & (~NODRAW_FLAG); blumphmap-->440 = blumphmap-->440 & (~NODRAW_FLAG); blumphmap-->471 = blumphmap-->471 & (~NODRAW_FLAG); #Endif; self.go_path(ne_obj, se_obj); rtrue; ], se_to [; #Ifdef GRAPHICS_ENABLED; blumphmap-->343 = blumphmap-->343 & (~NODRAW_FLAG); blumphmap-->376 = blumphmap-->376 & (~NODRAW_FLAG); blumphmap-->409 = blumphmap-->409 & (~NODRAW_FLAG); blumphmap-->440 = blumphmap-->440 & (~NODRAW_FLAG); blumphmap-->471 = blumphmap-->471 & (~NODRAW_FLAG); #Endif; self.go_path(se_obj, ne_obj); rtrue; ], e_to Manor_Door; Prop -> house_obj "manor house" with name 'house' 'home', adname 'manor' 'stately', found_in Manor_Grounds Blumph_Heights, description [; print "This large and sprawling manor house is delicately styled and extremely elegant. The imposing front door "; if (Manor_Door has open) print "hangs open"; else { print "is closed"; if (Manor_Door has locked) print " and locked"; } print_ret (string)period; ], before [; Enter: if (self in Manor_Grounds) <>; "You're a bit too far away to do that."; ], information [person; switch (person) { crystal: if (Blumph_Heights has visited) { print "~Large, "; if (location == Blumph_Heights or Manor_Grounds) print "i"; else print "wa"; "sn't it?~ murmurs ", (the)crystal, (string)period; } rfalse; captain: "~Yes, I keep a house out in Blumph Heights. That's where my airship licence is. Can't get in at the moment, because I've lost the keys to the gate ", (i) "and", " the front door.~"; } ]; Autodoor Manor_Door "manor door" with adname 'front' 'manor', with_key captain_key, description [; print "The front door of the manor house is a large and imposing one. It is currently "; if (Manor_Door has open) print "hanging open"; else { print "closed"; if (Manor_Door has locked) print " and locked"; } print_ret (string)period; ], ! We capture these states when the tattler stories are added. This occurs about 10 turns after the player leaves the house. locked_door false, open_door false, e_to Inside_Manor, w_to Manor_Grounds, has locked lockable ~open; Room Inside_Manor "Front hall" with description [; #Ifdef GRAPHICS_ENABLED; if (location hasnt visited) { RevealBlumph(self.map_offset); } #Endif; "The front hall of the manor house is large, open, and a bit overwhelming in its grandeur. Passages lead off in all directions to other parts of the house, and the door back out to the grounds lies to the west."; ], storyadd false, #Ifdef GRAPHICS_ENABLED; map_offset 209, comp_mask W_MASK, #Endif; before [; Go: if (self.storyadd == false && noun == w_obj) { self.storyadd = true; tattler.add_story(HOUSE_ROBBERY); StartTimer(house_robbery_timer, 10); } rfalse; ], w_to Manor_Door, cant_go "You take a brief look in a few of the other rooms, but don't really feel comfortable poking around the whole house. Back outside to the west is the only viable option."; Furniture -> hall_table "hall table" with name 'table', adname 'cherry' 'hall', description [; print "A narrow rectangular hall table, made of cherry wood. Its surface is polished and gleaming.^"; self.describe(); ], describe [; if (child(self) == 0) rtrue; else print "^Sitting atop the table"; WriteListFrom(child(self), ENGLISH_BIT + ISARE_BIT); print_ret (string)period; ]; Askable -> -> licence "airship licence" with name 'image' 'license' 'licence', adname 'airship', article "an", description [; print "An official looking airship licence, about 2 inches by 3 inches, issued by the Blumph Airship Authority to one ~Captain Kells.~ "; if (self has general) "A somewhat indifferently-adhesived picture of your face looks back at you from the front of the card."; print "An image printed on the front displays the face of an older gentleman. He looks a bit run-down and tired, and his nose is reddened as from years of drink."; if (self.sticky == true) print " The front of the card is sticky."; new_line; rtrue; ], before [; Take,Insert,Transfer,Remove: Achieved(21); rfalse; PutOn: if (second == tray) <>; ], information [person; switch (person) { crystal: if (self in player or tray or location || (self in Rasp_Satchel && Rasp_Satchel in location or player)) { if (self hasnt general) "~Wow, a real, honest-to-goodness airship licence,~ marvels ", (the)crystal, ". ~It takes months of filling out forms to get one of those.~"; "~It's a decent forgery", (admits)crystal, ". ~I just hope no one thinks you're too young to be an airship pilot.~"; } rfalse; hermit: "~Don't talk to me about airship licences!~ mutters ", (the)hermit, ". ~Airship captains, disturbing all the lonely mountaintop retreats all the time. Hmph!~"; captain: "~It's at my house somewhere, I'm sure,~ mutters the airship captain sullenly. ~And me with no key.~"; betty: "~Oooh, those take ages to get, luv,~ tuts ", (the)betty, ". ~All those forms to fill out, tests to pass. Still,~ she adds, patting her hair and winking at you, ~I do so love someone in uniform.~"; crone: "~No,~ says ", (the)crone, " firmly. ~I don't deal in airship licences. Too much liability.~"; teller: "~Well, a license would be the best form of identification if you want to inspect your safety deposit box, captain,~ admits ", (the)teller, "."; } rfalse; ], sticky false; Cheese -> -> Montagnolo "Montagnolo" with name 'montagnol' 'montanolo' 'montag' 'montan' 'montagolo', invent [; print "a piece of Montagnolo"; if (self.visionnum ~= 0) { PrintShortVision(self.visionnum); } rtrue; ], description [; print "An extremely soft blue-veined cheese, with a lovely buttery texture."; if (self.visionnum ~= 0) { PrintVision(self.visionnum); } new_line; rtrue; ], describe "^A beautifully-veined piece of Montagnolo sits here, looking delicious.", before [; Take,Insert,Transfer,Remove: Achieved(23); rfalse; Eat: print_ret (The) self, " has a piquant flavour with a deliciously smooth and buttery flow to it. You are cruel and limit yourself to just a small bite."; Lick,Taste: "It has the rich, piquant flavour of a well-ripened blue cheese."; Smell: "It's the usual sharp aroma of blue cheeses, but milder than the Gorgonzola."; Touch: print_ret (The) self, " has a soft buttery texture."; ]; Askable -> -> golden_key "ornate golden key" with name 'key', adname 'ornate' 'gold' 'golden', description "An ornate golden key.", information [person; switch (person) { crystal: "~Those ornate golden keys are usually safety deposit box keys,~ says ", (the)crystal, (string)period; teller: "~All our safety deposit box keys are ornate golden keys,~ says ", (the)teller, ". ~If you have one, it's likely the key to your deposit box, captain.~"; } rfalse; ], before [; Take,Insert,Transfer,Remove: Achieved(22); rfalse; ]; !==================================================================================================================================================== ! Blumph Heights Park Outroom Park "Blumph Heights Park" with description [; #Ifdef GRAPHICS_ENABLED; if (location hasnt visited) { RevealBlumph(self.map_offset); } #Endif; "This sprawling but graceful park is a haven for the residents of Blumph Heights from the bustle of the rest of town. Rolling fields of grass spread in all directions, populated abundantly with trees. Birds can be heard chattering away amongst the trees and hedges. North, an arboured pathway leads back out to Blumph Heights."; ], Floor LAWN_GRASS, #Ifdef GRAPHICS_ENABLED; map_offset 269, comp_mask N_MASK | OUT_MASK, #Endif; n_to [; if (ptero in real_location) { ptero.mesmer = 0; switch (random(6)) { 1: print "The pterosaur gives a forlorn cry as you turn away.^^"; 2: print "The pterosaur looks at you with a mute appeal in its eyes as you turn away.^^"; 3 to 6: ; } } print "You trot along the arboured pathway back out to Blumph Heights.^"; #Ifdef SOUND_ENABLED; SoundStop(); #Endif; return Blumph_Heights; ], out_to [; <>; ], compass_look [obj; if (obj == n_obj) "North, an arboured pathway leads back to Blumph Heights."; return self.Outroom::compass_look(obj); ], cant_go "The only way out of here is north, through the arboured pathway back to Blumph Heights."; NPC -> ptero "pterosaur" with parse_name [i; while (true) { switch (NextWord()) { 'bird': self.item_num = 0; i++; 'avian', 'flying', 'reptile', 'ptero', 'pterodact', 'pterosaur', 'pterasaur', 'terry': self.item_num = 1; i++; 'arrow', 'wound', 'leathery', 'sore', 'wing': self.item_num = 2; i++; 'dino', 'dinosaur': self.item_num = 3; i++; 'small', 'black', 'speck', 'winged', 'shape': self.item_num = 4; i++; default: return i; } } ], Chat 0, item_num 1, description [; if (crystal.crytime == 10 or 11) { "The small black speck is too far away for you to make out any details."; } if (crystal.crytime == 12) { "It's a winged shape and it's definitely heading this way."; } if (crystal.crytime == 13 or 14) { "The fully healed and unencumbered pterosaur is a majestic sight as it wings its way towards you. It seems to be carrying a small plant in its beak."; } if (crystal.crytime == 15) { "The fully healed and unencumbered pterosaur is a majestic sight as it circles overhead."; } if (crystal.crytime == 16) { "It's starting to resemble the small black speck again as it flies away."; } if (self.item_num == 2) { if (self has general) "The pterosaur's wound is gone, and the wing seems fine now."; print "It's a festering open sore that looks quite painful.^"; if (crystal has general) "^~Ouch,~ murmurs ", (the)crystal, ". ~That looks like an arrow wound.~"; } if (saddle notin self && self has general) "The fully healed and unencumbered pterosaur is testing its wings cautiously."; print "The pterosaur, though large, is not huge, with a wingspan about ten feet across. At the moment, it seems "; if (saddle in self) print "frustrated, "; print "unable to take to the skies because of"; if (saddle in self) { print " the heavy, ornate saddle on its back"; if (self hasnt general) print ", and"; } if (self hasnt general) " the painful wound in its leathery wing."; print_ret (string)period; ], describe [; if (self has general && saddle notin self) "The pterosaur, free of injury and encumbrances, is testing its wings cautiously."; if (Park hasnt general) { give Park general; print "^To your surprise, there's a large ", (name)ptero, " hobbling around in slow "; } else { new_line; print (A)ptero, " is hobbling around in slow "; } if (self hasnt general) print "painful"; else print "frustrated"; print " circles on the grass."; if (self hasnt general) { print " One of its wings has a painful open sore on it"; if (saddle in self) print ", and a"; } else if (saddle in self) print " A"; if (saddle in self) print "n ornate saddle rests upon its back"; print_ret (string)period; ], times 0, daemon [; ! set self.Chat when this daemon is running, so we don't get ! any other pterosaur msgs from each_turn self.Chat = 2; ! keep setting this so we don't get snowfall daemon msgs ! while this is running self.mesmer = 0; self.times++; if (self.times == 3) { if (saddle in self) { self.times = 0; StopDaemon(self); if (real_location == park) "^Feeling ready, the pterosaur pushes off, but the ornate saddle seems to interfere with the ponderous beat of its mighty wings, and it crashes heavily back into the earth, giving the small forlorn caw of the disappointed flying reptile."; rtrue; } StopDaemon(self); remove self; Achieved(7); tattler.add_story(DINOSAUR_CITY, 10); StartTimer(dinosaur_city_timer, 10); if (real_location == park) print "^With a single, ponderous beat of its mighty wings and a push from its clawed feet, ", (the)self, " launches itself into the air."; else print "^You hear a mighty caw from overhead and glance up to see ", (the)self, " gliding through the air above you."; self.item_num = 1; print " It circles your head twice, almost seeming to bid you farewell, and then with a mighty cry, turns and flies away, winging its way towards its rocky clifftop home.^"; print_ret "^~There it goes!~ says ", (the)crystal, " gazing up at the flying reptile. ~What a magnificent creature. It felt really good to help it on its way.~ She smiles at you. ~I'm glad you're the kind of person who'd do something like that.~"; } if (real_location == park) { new_line; print_ret (The)self, " flexes its mighty wings, preparing to take to the sky."; } rtrue; ], information [person; switch (person) { crystal: if (park hasnt visited) "~I'm not sure what you're asking about,~ frowns ", (the)crystal, (string)period; if (self.item_num == 0) return self.pteroword(); if (self.item_num == 3) return self.dinoword(); if (self.item_num == 2) { if (self has general) "~That wound healed beautifully, didn't it?~ beams ", (the)crystal, ". ~That spenseweed extract really did the trick.~"; "~Painful,~ murmurs ", (the)crystal, ". ~It certainly looks like an arrow wound.~"; } print "~Amazing, "; if (location == Park) print "i"; else print "wa"; print "sn't it? With that wingspan, I'd say it was likely of the genus Phobetor. Named after the Greek god of nightmares you know, and now I've seen one, I can see why."; if (saddle in self) " I wonder if the poor thing would be able to fly if we removed the saddle.~"; else if (self hasnt general) " I'm surprised it didn't take off when we removed the saddle. I guess its wing is hurt too badly.~"; else if (self in real_location) print " It was really nice of you to help its wing. "; else print " It felt really nice to help it on its way. "; "It's true what they say, a good deed is its own reward.~ She smiles shyly at you. ~I'm glad you're the kind of person who'd do something like that.~"; crone: "~Don't talk nonsense, youngster . Pterosaurs are extinct. And you shouldn't try to mess with the fragile minds of the elderly, it's not nice.~"; akbar: "~A pterosaur?~ cries ", (the)akbar, " enthusiastically. ~You don't say? Perhaps you would like the chance to fly along with it by purchasing a new flying carpet today?~"; betty: "~A pterosaur?~ repeats ", (the)betty, ". ~I'm not certain what that is, but it sounds nasty. I'd leave it alone if I were you.~"; people: "No one seems to believe you when you mention the pterosaur."; hermit: "~I used to see a pterosaur every now and then,~ muses ", (the)hermit, ". ~You know, back in my hermit days. Of course, I used to hallucinate a fair bit as well, so take that with a grain of salt.~"; teller: print "~I think I read something in the Tattler about some dinosaurs in Blumph", (admits)teller, ".^"; if (crystal has general) { print "^~Pterosaurs aren't"; if (self.dinowarn == 1) "...~ begins ", (the)crystal, ", but stops when you glance in her direction. ~Sorry,~ she mumbles."; self.dinowarn = 1; print " dinosaurs,~ murmurs ", (the)crystal, ". ~They're flying reptiles.~"; } captain: print "~I used to see dinosaurs all the time,~ confides ", (the)captain, ", ~until I cut back on the booze.~^"; if (crystal has general) { print "^~Pterosaurs aren't"; if (self.dinowarn == 1) "...~ begins ", (the)crystal, ", but stops when you glance in her direction. ~Sorry,~ she mumbles."; self.dinowarn = 1; print " dinosaurs,~ murmurs ", (the)crystal, ". ~They're flying reptiles.~"; } } rfalse; ], life [; Give: if (noun == nobbler) { print (The)ptero; if (self.mesmer ~= 0) print " plucks ", (the)noun, " dazedly"; else print " snatches ", (the)noun; nobbler.sticky = true; " from your hand. A bemused look crosses its face and with a quick ripple of its jaw, it spits the somewhat sticky pill back out into your hand."; } if (noun == extract) <>; Show: if (noun == ball && self.mesmer ~= 0) print_ret (The)ptero, " is already gazing intently at the snow globe."; print_ret (The)ptero, " does not seem terribly impressed."; ], orders [; "Evidently, large flying reptiles aren't used to following orders."; ], each_turn [; if (location == Garden) rfalse; if (self.mesmer ~= 0 && location == Park) { switch (self.mesmer) { 1 to 4 : print_ret "^", (The)ptero, " stands rock steady, gazing intently at the snow globe."; 5: self.mesmer = 0; if (saddle notin self && self has general) StartDaemon(self); print_ret "^", (The)ptero, " shakes itself suddenly and seems to snap out of its trancelike state."; } } if (self.Chat == 1 && location == Park) { print "^", (The) self, " "; switch (random(3)) { 1: print "gives a depressed sounding caw.^"; 2: print "trudges doggedly in a circle of depression.^"; 3: print "marches in a forlorn circle, exuding abject reptilian misery as only an abjectly miserable reptile can.^"; } } self.Chat = random(5); rtrue; ], pterowarn 0, dinowarn 0, pteroword [; if (self.pterowarn == 4) "~Pterosaurs...~ begins ", (the)crystal, ", but she claps her hand over her mouth as you glance in her direction. ~Sorry,~ she mumbles."; self.pterowarn++; print "~Pterosaurs aren't birds,~ "; if (self.pterowarn == 4) "frets ", (the)crystal, ", wringing her hands. ~I'm sorry, I'm trying not to mention it. It's just they're not birds, and it really bothers me to hear them called that. I'm sorry, I won't do it again.~ She claps her hands over her mouth to emphasise her point."; if (self.pterowarn == 3) "protests ", (the)crystal, ", ~and I'm certain if they could talk, which they can't, they'd be very put out about it.~"; if (self.pterowarn == 2) print_ret (the)crystal, " says again, ~and I know I've already mentioned it once, but I don't think you heard me. They're not birds, they're flying reptiles. Or were; it's quite amazing to have seen one at all, and all you can do is call the poor thing a bird.~"; if (self.pterowarn == 1) "says ", (the)crystal, ". ~They're flying reptiles.~"; ], dinoword [; if (self.dinowarn == 0) { self.dinowarn = 1; "~Pterosaurs aren't dinosaurs,~ murmurs ", (the)crystal, ". ~They're flying reptiles.~"; } if (self.pterowarn > 0) { print "~I hate to bring this up"; if (self.dinowarn == 1) print "again"; ",~ murmurs ", (the)crystal, ", ~but pterosaurs aren't dinosaurs either. They're flying reptiles.~"; } "~As I think I already said,~ murmurs ", (the)crystal, " gently, ~pterosaurs aren't dinosaurs. They're flying reptiles.~"; ], after [; if (self.item_num == 0 && crystal has general) { new_line; self.pteroword(); } if (self.item_num == 3 && crystal has general) { new_line; self.dinoword(); } ], nomatch [; print_ret (The)self, " doesn't answer. Perhaps its inability to speak is affecting its conversation."; ], before [; Consult: self.nomatch(); rtrue; Attack,Kiss,Receive,Touch: print_ret (The)ptero, " snaps at you with its beak."; Climb,Enter,Ride: print_ret (The)ptero, " snaps at you with its beak. It obviously doesn't want you on its back."; MeetNPC,Talk: if (self has general) print_ret (The)ptero, " caws gently at you."; print_ret (The)ptero, " caws forlornly in reply."; Smell: print "There's definitely a rotting fish smell to the pterosaur.^"; if (crystal has general) print "^~Marine feeders,~ nods ", (the)crystal, ". ~Fish, plankton and so on.~^"; rtrue; ], has supporter; Sellable -> -> saddle "ornate saddle" with name 'saddle' 'gems', adname 'ornate' 'heavy', description "The heavy ornate saddle is studded with gems. It looks extremely valuable.", before [; Climb,Enter: if (self in ptero) <>; Remove,Take: if (self in ptero && ptero.mesmer == 0) print_ret (The)ptero, " snaps at you with its beak. You're going to need to focus its attention elsewhere if you want to nab that saddle."; else if (self in ptero) { move saddle to player; Achieved(3); ! Reset pterosaur hints for achieved(6). ptero.hint = 0; MoveFloatingObjects(); "With ", (the)ptero, " distracted, you slip ", (the)self, " from its back."; } ], information [person; switch (person) { akbar: if (Testscope(self)) <>; else "~I would certainly love to discuss saddles with such an educated and valued customer, but sadly, as flying carpets don't require saddles, my knowledge of them is almost non-existent, and my interest in them even less.~"; crystal: if (self in ptero) { print "~I'm sure that saddle "; if (location == Park) print "is"; else print "on the pterosaur would be"; " worth something, if we could just get it off the pterosaur.~"; } if (self in case) "~I'm glad we were able to sell it to her,~ murmurs ", (the)crystal, ", ~though I suspect she won't be able to sell it on, seeing it's not really magical.~"; "~It's too bad it's not magical,~ sighs ", (the)crystal, ". ~Then we could sell it to ", (the)crone, ".~"; crone: if (self in case) { print "~That's a rare pterosaur-capable "; if (crone.mesmer ~= 0) print "magic "; print "saddle,~ declares ", (the)crone, ". ~"; if (crone.mesmer == 0) print "Not really my line, you understand, and sadly not magical"; else print "It's magical in... um, some way I don't really remember at the moment"; ".~ She frowns. ~In fact, I don't really remember buying it. More something Robert should carry, or would if he wasn't perpetually skint.~ She shakes her head. ~But in any case, just look at all those gems! Lovely inset work. A gem-studded example like this goes for about ", self.sale_value, " plotkins.~"; } if ((self in player or location) || (self in Rasp_Satchel && Rasp_Satchel in player or location)) { if (crone.mesmer ~= 0) "~Wow!~ cries ", (the)crone, " eagerly, looking at the saddle. ~A gem-encrusted, magic saddle ", (i) "including", " the optional pterosaur-capable appurtenances! A pretty little thing like that will move quickly. I'd give you ", SADDLE_PRICE, " plotkins for it.~"; "~Hmmm,~ muses ", (the)crone, ", looking critically at ", (the)self, ". ~The gem-encrusting is nice, and it looks valuable, but I just don't think I could move it. Maybe if it was magical, but it certainly doesn't have any of the telltale signs. No glowing magical light, no starry-eyed mental swirling. Nothing.~"; } hermit: "~Nope, I don't buy or sell saddles. Not enough margin on them. Besides, the more products I sell, the more customers I get in here.~"; } rfalse; ]; !==================================================================================================================================================== ! Vechlee, mark 2 OutroomV Arrivals_Dock "Arrivals Dock" with description [; print "Vechlee's airship arrivals area is much smaller than Blumph's airship docks. There is a single rigid metal gantry platform suitable for accommodating a single airship. Below you, a metal stairway leads down to Vechlee's market square.^"; if (location hasnt visited) { tattler.add_story(LORD_MAYOR, 4); StartTimer(lord_mayor_timer, 4); "^~Phew!~ exclaims Crystal. ~That was quite the ride. You did remarkably well, but that landing was something else.~"; } rtrue; ], #Ifdef GRAPHICS_ENABLED; map 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 13 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 26 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 39 0 0 0 0 0 0 2 0 0 0 0 0 0 ! 52 0 0 0 0 0 0 6 0 0 0 0 0 0 ! 65 0 0 0 0 0 0 10 0 0 0 0 0 0 ! 78 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 91 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 104 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 117 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 130 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 143 0 0 0 0 0 0 0 0 0 0 0 0 0, ! 156 comp_mask D_MASK | N_MASK, #Endif; cant_go "You can head down the metal stairway to Vechlee's market square.", d_to [; print "You descend the towering metal stairway down to the market square.^"; return Market_Square; ], n_to [; print "With the experience of the seasoned professional, you board the airship and easily pilot it back to Blumph.^"; return Dir_Docks; ], compass_look [obj; if (obj == d_obj) "It's a long way down to the marketplace."; if (obj == n_obj) <>; return self.OutroomV::compass_look(obj); ], Floor METAL_GRATING; Prop entrails "entrails" with name 'fish' 'entrails' 'bits' 'roof', adname 'of', description "Bits of roof and fish entrails lines the underside of the gondola.", found_in Arrivals_Dock Market_Square, information [person; switch (person) { crystal: "~I hope dumping a load of fish over the lord mayor doesn't constitute an act of war,~ murmurs ", (the)crystal, ". ~Mind you, at least it's not rotting. Well, not yet.~"; } ]; RoomV Building_Society "Plumbers Union Building Society" with description [; print "Formerly the Wizards Guild Savings & Loan, this building has now been taken over by a credit union of plumbers. Along with a small extension branch in Blumph, it provides banking services to most of the land. A doorway on the southern side of the room leads to the vault antechamber. North heads back out to the market square.^"; if (location hasnt visited) { #Ifdef GRAPHICS_ENABLED; RevealVechlee(self.map_offset); #Endif; Achieved(36); } rtrue; ], chat 0, #Ifdef GRAPHICS_ENABLED; map_offset 290, comp_mask N_MASK, #Endif; compass_look [obj; if (obj == n_obj) "The bustle of the market square lies back through the doorway to the north."; TouchWalls(obj, self.Floor, self.Walls); rtrue; ], before [; Exit: if (player in location) <>; rfalse; ], cant_go [; "You can go north back to the market square, or south into the vault antechamber."; ], n_to [; teller.chat = 1; print "You step back into the bustle of the market square.^"; return Market_Square; ], s_to [; if (licence in player) { print "The teller steps forward, sees the licence in your hand and motions you into the antechamber.^"; return Antechamber; } "The teller steps in front of you. ~I'm afraid we'll need to see some identification first, captain."; ]; RoomV Antechamber_Vision "Vault antechamber" with description [; if (self.vision == true) { move nin_robes to Antechamber_Vision; Startdaemon(self); } print "Designed as a space for patrons to view the contents of their safety deposit boxes in private, this small room is bare and featureless, apart from a small wooden table. A doorway heads back north into the building society proper and a massive vault door fills the southern half of the room.^"; rtrue; ], chat 0, dtime 0, vision false, #Ifdef GRAPHICS_ENABLED; map_offset 354, comp_mask N_MASK | S_MASK, #Endif; boxopen false, daemon [; self.dtime++; if (self.dtime == 1) { move nin_key to Antechamber_Vision; "^~Right,~ booms the forbidding figure to the teller. ~As the robes have firmly established, I am Ninario and I've come for my safety deposit box. I've got the key here.~^ ^~And I'm Ninario's wily apprentice,~ puts in Yekcal.^ ^~Shut up,~ growls Renaldo (for it is clearly he) to Yekcal."; } if (self.dtime == 2) "^~Oooh,~ says the bank teller to Yekcal, sounding impressed. ~I've heard about you. You helped your master here destroy the Wizards Guild Hall, didn't you?~^ ^~No, I didn't,~ says Yekcal. ~I was somewhere else at the time. Virgil was second-in-command then. He was very badly injured too.~^ ^~Shut up, you fool,~ growls Renaldo to Yekcal."; if (self.dtime == 3) "^~Of course you did,~ insists the teller. ~You blew it up and rescued your master from the top floor.~^ ^~Oh, right,~ agrees Yekcal. ~Sorry, I forgot.~^ ^~Stop talking ", (i) "now", ",~ mutters Renaldo to Yekcal."; if (self.dtime == 4) "^~You ", (i) "forgot?", "~ echoes the teller in surprise. ~You forgot about defeating the Wizards Guild?~^ ^~The Wizards Guild has not been defeated!~ booms Renaldo in a strident voice.^ ^The teller glances at him, surprised at his sudden vehemence.^ ^~Shut up, you fool!~ Yekcal whispers gleefully to Renaldo."; if (self.dtime == 5) "^~I mean, they have only temporarily been defeated,~ splutters Renaldo, remembering his role as Ninario. ~We must be ever vigilant. That's why I need the contents of my safety deposit box.~^ ^~Of course, sir,~ murmurs the teller, mollified. ~Please wait here while I fetch it for you.~^ ^The teller unlocks and heads through the large vault door, closing it carefully behind her.^ ^~Shut up, you fool,~ Yekcal repeats, more to himself, but still savouring his own boldness."; if (self.dtime == 6) "^~Yekcal,~ says Renaldo calmly.^ ^~Yes, sir?~^ ^~Tell me to shut up one more time and I'll kill you right now.~^ ^~Yes sir. Sorry sir,~ mutters Yekcal."; if (self.dtime == 7) { move Orange_Box to Antechamber_Vision; move analyser to Antechamber_Vision; give analyser ~scenery; move YFenniVis to Antechamber_Vision; if (Orange_Box has open) self.boxopen = true; else self.boxopen = false; give Orange_Box open; MoveFloatingObjects(); "^~Here you are sir,~ calls the teller, opening the vault door and re-entering the room. ~Here's your safety deposit box.~ She places an orange safety deposit box on the table in front of Renaldo.^ ^~Excellent!~ cries Renaldo. ~Let's see what he... I mean I... left for us.~ He unlocks and opens the box. ~Augh!~ he cries, leaping back. ~Cheese! Get it away from me!~ He upends the box, its contents tumbling onto the floor."; } if (self.dtime == 8) { "^The teller quickly scoops up the cheese. ~Very sorry sir, but you must have left it there yourself.~^ ^Renaldo gazes at the cheese in terror. ~It's Y-Fenni!~ he whispers. ~The most terrifying cheese of them all. Keep it away!~^ ^~All right, sir,~ says the teller in a conciliatory tone. ~When you're finished, I'll just put the cheese back in the box and it will go back into the vault and you won't have to see it until next time you visit your safety deposit box.~"; } if (self.dtime == 9) { move Orange_Box to Vault; ! The box was closed to begin with, so we have to close it. if (self.boxopen == false) { give Orange_Box ~open; } give Orange_Box objseen; remove analyser; remove YFenniVis; MoveFloatingObjects(); print "^~Hmmm,~ grunts Renaldo. ~Let's see what else I left in here.~ He glances to the floor. ~Ha! The interplanar rift analyser, just as I suspec... remembered.~^ ^~Yes!~ exclaims Yekcal. ~Now off to Ninario's place. At least we don't have to break in this time.~^ ^~Shut up, you fool,~ snaps Renaldo as he and Yekcal hurry towards the door. The orange safety deposit box stays behind them on the table, forgotten and unlocked.^ ^The teller's eyes narrow in suspicion as she watches them leave. Thoughtfully, she returns the cheese to the safety deposit box, ignoring or failing to notice that it's unlocked. Then, after returning the box to the vault, she reaches for a crystal ball."; new_line; EndVision(self); StopDaemon(self); if (initialvision == true) { Achieved(35); print "^~Oh no,~ moans ", (the)crystal, ". ~They have the rift analyser! We'd better get moving! "; if (YFenni in Orange_Box) print "If only we could get that cheese! Renaldo certainly seemed frightened of it.~^"; else print "Interesting how frightened Renaldo was of that Y-Fenni cheese.~^"; tattler.add_story(BRAZEN_THEFT, 10); StartTimer(brazen_theft_timer, 10); } initialvision = false; rtrue; } ], compass_look [obj; if (obj == n_obj) "The main part of the building society lies back through the doorway to the north."; TouchWalls(obj, self.Floor, self.Walls); rtrue; ], before [; Exit: if (player in location) <>; rfalse; ], cant_go [; "Unfortunately, as this is a vision, there's not much you can do other than watch and wait. Or talk to ", (the)crystal, ", who seems to be sharing the vision with you."; ], s_to Vault_Door_Vision; Furniture -> ante_table_vision "small wooden table" with name 'table', adname 'small' 'wooden', description [; print "A small wooden table, placed here for the use of the customers.^"; self.describe(); ], describe [; if (child(self) == 0) rtrue; else print "^Sitting atop the table"; WriteListFrom(child(self), ENGLISH_BIT + ISARE_BIT); print (string)period; if (Purple_Box in self) { if (Purple_Box has open) { print " ", (The)Purple_Box, " is currently open"; if (children(Purple_Box) == 0) " and empty."; print ", revealing "; WriteListFrom(child(Purple_Box), ENGLISH_BIT); } else print " ", (The)Purple_Box, " is currently closed"; print_ret (string)period; } new_line; rtrue; ], has static supporter; Object YFenniVis "Y-Fenni" with name 'y-fenni' 'yfenni' 'fenni' 'cheese' 'cheeses' 'piece' 'slice', adname 'of', article "a piece of", description [; give YFenni objseen; print "A firm cheddar made with brown ale and speckled throughout with mustard grains, the Y-Fenni is moist and tangy. It's pale yellow, with the mustard grains clearly visible as dark specks throughout."; new_line; rtrue; ], before [; Smell: "A strong smell of mustard combined with a mild aroma of cheddar."; ], has edible; RoomV Antechamber "Vault antechamber" with description [; if (location hasnt visited) { #Ifdef GRAPHICS_ENABLED; RevealVechlee(self.map_offset); #Endif; Achieved(37); } print "Designed as a space for patrons to view the contents of their safety deposit boxes in private, this small room is bare and featureless, apart from a small wooden table. A doorway heads back north into the building society proper and a massive vault door fills the southern half of the room.^"; if (self.chat == 0) { move Purple_Box to ante_table; self.chat = 1; MoveFloatingObjects(); print "^The teller unlocks the massive vault door and goes through, locking it carefully behind her. After a few moments, she returns with a purple safety deposit box which she places on the table front of you. ~Just come back out to the main room when you're finished with the box and I'll come put it away for you.~ She leaves through the doorway to the north.^"; } rtrue; ], chat 0, #Ifdef GRAPHICS_ENABLED; map_offset 354, comp_mask N_MASK | S_MASK, #Endif; compass_look [obj; if (obj == n_obj) "The main part of the building society lies back through the doorway to the north."; TouchWalls(obj, self.Floor, self.Walls); rtrue; ], before [; Exit: if (player in location) <>; rfalse; ], cant_go [; "The vault door being as secure as it is, the only way out is north back to the building society."; ], s_to Vault_Door, n_to [; self.chat = 0; Building_Society.chat = 1; print "You step back into the front room of the building society.^"; return Building_Society; ]; Furniture -> ante_table "small wooden table" with name 'table', adname 'small' 'wooden', description [; print "A small wooden table, placed here for the use of the customers.^"; self.describe(); ], describe [; if (child(self) == 0) rtrue; else print "^Sitting atop the table"; WriteListFrom(child(self), ENGLISH_BIT + ISARE_BIT); print (string)period; if (Purple_Box in self) { if (Purple_Box has open) { print " ", (The)Purple_Box, " is currently open"; if (children(Purple_Box) == 0) " and empty."; print ", revealing "; WriteListFrom(child(Purple_Box), ENGLISH_BIT); } else print " ", (The)Purple_Box, " is currently closed"; print_ret (string)period; } new_line; rtrue; ]; NPC teller "teller" with name 'teller' 'woman' 'lady' 'luv' 'vendor' 'clerk' 'clark' 'shopkeep' 'shopkeepe' 'keeper' 'vest', description "She's dressed smartly and professionally in a long skirt and a vest emblazoned with the building society's name. She looks serious and sober.", Chat 0, Topics 0, found_in [; if (location == Building_Society or Antechamber_Vision) rtrue; ], information [person; switch (person) { teller: "~I'm afraid I'm not supposed to discuss personal details with the customers, captain,~ smiles ", (the)person, " apologetically."; crystal: print "~Seem"; if (location == Building_Society) print "s"; else print "ed"; " like a perfectly ordinary teller to me. Not sure how great she is about security though.~"; } rfalse; ], initial [; if (globalvision == true) { "A teller stands here, looking anxiously and deferentially at the tall figure."; } if (location hasnt visited) "A teller comes over to speak with you.^ ^~I'm dreadfully sorry, captain,~ she says, ~but there's been a theft from the vault today. We're just trying to determine what's been stolen. If you like, we can take you into the antechamber and fetch your safety deposit box so you can check its contents over. Just show me some identification when you're ready.~"; if (Building_Society.hoopsack_arrive == true) { Building_Society.hoopsack_arrive = false; print_ret (The)self, " jumps in surprise as you appear suddenly. She quickly regains her composure and flashes a brief confused smile at you. ~Er, welcome back to the building society, captain.~"; } if (location == Building_Society && Building_Society.chat == 1) { Building_Society.chat = 0; move Purple_Box to Vault; "~All done?~ smiles ", (the) teller, ". She pops into the antechamber for a few minutes and then comes back out. ~I've returned your box to the vault, captain.~"; } if (self.Chat ~= 0) { switch(random(3)) { 1: print_ret (The)self, " flashes a quick smile in your direction."; 2: print_ret (The)self, " nods at you in greeting."; 3: print_ret "~Good day, captain,~ says ", (the) self, "."; } } ], each_turn [; if (self.mesmer ~= 0 && location == Building_society) { switch (self.mesmer) { 1: "^~Oh dear...~ murmurs ", (the)self, " suddenly, gazing at her hands in surprise. ~I don't feel too well!~"; 2: "^The teller gazes around the room, her eyes unfocused. ~I think this theft is bothering me more than I knew.~"; 3: "^The teller shakes her head, a glassy look in her eyes. ~Goodness, this is unnerving.~"; 4: "^~Oh, thank goodness, it's passing,~ mutters ", (the)self, " in relief."; 5: self.mesmer = 0; "^The teller shakes her head suddenly. ~Sorry,~ she murmurs. ~It's been a bit of a stressful day.~"; } } if (self.Chat == 1 && globalvision == false && location == Building_society) { switch (random(40)) { 1 to 10: print "^The teller busies herself with the business of the building society."; 11 to 20: print "^The teller tries to look busy in spite of the limited customers."; 21 to 25: print "^The teller glances up at you briefly and smiles."; 26 to 30: print "^~Accounts receivable,~ mutters ", (the) self, " glancing at a deposit slip in her hand."; 31 to 35: print "^The teller sighs and shifts slightly on her feet."; 36 to 40: print "^The teller jots something down on a bank slip and nods approvingly."; } new_line; } self.Chat = random(3); rtrue; ], before [wd bk; Consult: wn = consult_from; wd = NextWord(); switch (wd) { 'wizards', 'wizard^s', 'guild', 'hall': "~Oh, the wizards from the guild have not really been much to worry about since Ninario and his apprentice destroyed their guild hall.~ She smiles. ~They went pretty quiet after that.~"; 'lord', 'mayor': "~The Lord Mayor of Blumph? Never met her.~"; 'turthalio', 'michael': "~He rules over Thalion,~ says ", (the) self, ". ~I think he lives in Blumph.~"; 'thalion', 'country', 'land', 'world': "~Thalion's the name of the country all around us", (murmurs)self, ". ~It's the country Blumph and Vechlee are in.~"; 'vechlee', 'blumph': "~Oh, I quite like living here in Vechlee,~ says ", (the)self, ", ~but Blumph has its charm too.~"; 'eliza', 'elisa': "~Eliza runs the little shop next door, south from the Vechlee gate area.~"; 'union', 'plumber', 'plumbers', 'plumber^s', 'non-magic', 'toilets': "~The Plumbers Union is a force to be reckoned with. They weren't really the face of the revolt against the Wizards Guild until the guild starting investigating people for using non-magical toilets.~"; 'theft', 'burglary', 'burnley': "~A most terrible business,~ she says quietly. ~We only realised something was afoot because Ninario and his apprentice came in, and the Tattler had said earlier today that they had split up.~"; 'ninny', 'ninario': "~Well, I ", (i) "thought", " Ninario and his apprentice had come in earlier today, but after remembering what the Tattler had reported about the two of them, I wasn't too sure.~"; 'apprentic': "~Well, I ", (i) "thought", " Ninario's apprentice had come in with him earlier today, but now that I know it wasn't Ninario, was it the apprentice or someone else who came in? Is the apprentice working with the thief? To be honest, the apprentice seemed a bit confused about things. Couldn't remember rescuing Ninario and destroying the guild hall last year. Oh, but of course, that wasn't the real apprentice. Or was it? I'm a bit confused myself, to be honest.~"; } do { wn = consult_from; bk = ParseToken(SCOPE_TT, AskableScope); } until (bk ~= GPR_REPARSE); if (bk == GPR_FAIL) "~I'm not sure what you're asking about", (admits)self, "."; if (bk.information(self) == true) rtrue; "~I can't tell you anything much about that", (admits)self, "."; Kiss: print "~Captain!~ gasps ", (the)self, ". ~Will you please control yourself?~^"; if (crystal has general) "^~Yes,~ agrees ", (the)crystal, " a bit waspishly. ~Please do, ", (i) "captain", ".~"; rtrue; MeetNPC,Smile: print_ret "The teller flashes a smile at you. ~Very pleased to met you, captain. I don't believe I've served you before today.~"; Talk: "The teller looks at you expectantly."; Thank: "~Oh, a pleasure to do business with a respectable customer, I'm sure,~ smiles ", (the)self, "."; ], nomatch [; "~I'm not sure I can tell you anything too useful,~ apologises ", (the)self, (string)period; ], life [; Answer: if (noun == 'hello' or 'hi') <>; print_ret (The)self, " smiles indulgently. ~What can I do for you, captain?~"; Give: <>; Show: switch (noun) { licence: print "~Oh, you wanted to inspect your safety deposit box? Please step this way, captain.~^ ^She escorts you through the doorway to the south into the antechamber.^"; PlayerTo(Antechamber); MoveFloatingObjects(); rtrue; default: "~Very nice, captain,~ says ", (the)self, "."; } Tell: print_ret "~Very interesting, I'm sure, captain,~ says ", (the)self, "."; ], orders [; default: "~I'm not sure what you want me to do, captain,~ confesses ", (the)self, "."; ], has animate female; Autodoor Vault_Door "vault door" with name 'door' 'strapping', adname 'massive' 'vault' 'cast-iron', description "The massive vault door is large and imposing, made of some dull metal, reinforced with large cast-iron strapping. It is securely closed and locked.", n_to Antechamber, s_to Vault, has scenery ~open locked lockable; Autodoor Vault_Door_Vision "vault door" with name 'door' 'strapping', adname 'massive' 'vault' 'cast-iron', description "The massive vault door is large and imposing, made of some dull metal, reinforced with large cast-iron strapping. It is securely closed and locked.", n_to Antechamber_Vision, s_to Vault, has scenery ~open locked lockable; RoomV Vault "Vault" with description [; if (location hasnt visited) { #Ifdef GRAPHICS_ENABLED; RevealVechlee(self.map_offset); #Endif; Achieved(39); } print "The small and largely featureless vault is dominated by the massive door on the north wall.^"; rtrue; ], compass_look [obj; if (obj == n_obj) <>; TouchWalls(obj, self.Floor, self.Walls); rtrue; ], #Ifdef GRAPHICS_ENABLED; map_offset 418, comp_mask N_MASK, #Endif; n_to Vault_Door; Askable -> Orange_Box "orange safety deposit box" with name 'box', adname 'bright' 'orange' 'safety' 'deposit', description [; print "Ninario's safety deposit box is bright orange. "; if (self has open) { print "It is currently open"; if (children(self) == 0 || location == Antechamber_Vision) " and empty."; print ", revealing "; WriteListFrom(child(self), ENGLISH_BIT); } else print " It is currently closed"; print_ret (string)period; ], describe [; print "^An ", (name)self, " sits "; if (location == Antechamber_Vision) print "on the table."; else print "here."; if (self has open) { print " It is currently open"; if (children(self) == 0 || location == Antechamber_Vision) " and empty."; print ", revealing "; WriteListFrom(child(self), ENGLISH_BIT); } else print " It is currently closed"; print_ret (string)period; ], information [person; switch(person) { crystal: if (location == Vault or Antechamber_Vision) print "~It's Ninario's safety deposit box!~"; else print "~The orange safety deposit box is Ninario's,"; print_ret "~ says ", (the)crystal, ". ~Of course he keeps cheese in it. How very like him.~"; } ], before [; Search: if (location == Antechamber_Vision) print_ret (The)self, " is empty."; Take,Pull,Push,PushDir,Transfer: print (The)self, " is really supposed to stay here in the "; if (location == Antechamber_Vision) "antechamber."; "vault."; ], has container ~open openable lockable; Cheese -> -> YFenni "Y-Fenni" with name 'y-fenni' 'yfenni' 'fenni', invent [; print "a piece of Y-Fenni"; if (self.visionnum ~= 0) { PrintShortVision(self.visionnum); } rtrue; ], description [; print "A firm cheddar made with brown ale and speckled throughout with mustard grains, the Y-Fenni is moist and tangy. It's pale yellow, with the mustard grains clearly visible as dark specks throughout."; if (self.visionnum ~= 0) { PrintVision(self.visionnum); } new_line; rtrue; ], before [; Take,Insert,Transfer: Achieved(40); rfalse; Eat: print_ret (The) self, " has a buttery cheddar flavour with a hint of bite from the mustard grains, and a lovely moist, tangy flavour of brown ale, pleasant but not overwhelming. You eat just a tiny bit of it."; Lick,Taste: "The mustard grains add a delightful warmth to this cheddar cheese. The brown ale flavour is not overpowering, but instead lends the cheddar a moist and tangy quality."; Smell: "A strong smell of mustard combined with a mild aroma of cheddar."; Touch: print_ret (The) self, " has a firm texture, with the mustard grains providing a lovely stippling effect."; ]; Askable -> Purple_Box "purple safety deposit box" with name 'box', adname 'elegant' 'purple' 'safety' 'deposit', description [; print "Captain Kell's safety deposit box is an elegant purple. "; if (self has open) { print "It is currently open"; if (children(self) == 0) " and empty."; print ", revealing "; WriteListFrom(child(self), ENGLISH_BIT); } else print " It is currently closed"; print_ret (string)period; ], describe [; print "^A ", (name)self, " sits "; if (location == Antechamber) print "on the table"; else print "here."; if (self has open) { print " It is currently open"; if (children(self) == 0) " and empty."; print ", revealing "; WriteListFrom(child(self), ENGLISH_BIT); } else print " It is currently closed"; print_ret (string)period; ], openedonce false, with_key golden_key, before [; Take,Pull,Push,PushDir,Transfer: print (The)self, " is really supposed to stay here in the "; if (location == Antechamber) "antechamber."; "vault."; ], information [person; switch(person) { crystal: if (location == Vault or Antechamber) print "~This purple safety deposit box must belong to Captain Kells.~"; else "~The purple safety deposit box belongs to Captain Kells.~"; } ], after [; Open: if (self.openedonce == false) { self.openedonce = true; "You open ", (the)self, ", revealing nothing.^ ^~Nothing?~ cries ", (the)crystal, " in disappointment. ~We commit a handful of definite felonies and probably several more I'm not aware of and there's nothing in this stupid box?~"; } Receive: if (noun == Hoop or Rasp_Satchel) Achieved(38); Unlock: if (self.openedonce == false) { "You unlock the purple safety deposit box with the golden key.^ ^~Here we go!~ cries Crystal. ~Exciting contents about to be revealed!~"; } ], has container ~open openable lockable locked; OutroomV Market_Square "Market Square" with description [; #Ifdef GRAPHICS_ENABLED; if (location hasnt visited) { RevealVechlee(self.map_offset); } #Endif; print "Though it's less busy than in the heyday of the Wizards Guild, there's still a sizeable bustle of people and activity in this cobblestoned market square. The people of Vechlee hurry about their business, intent on their daily tasks with barely a glance to spare for you.^ ^Several different shops and establishments line the edges of the square. To the south is a sprawling commercial edifice, with copper-coloured lettering over the door reading ", (i) "Plumbers Union Building Society", ". There's usually a steady stream of customers going in there, but nothing today.^ ^To the northwest lie the remains of a small abandoned shop. Faded 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. The town gate lies to the northeast. A rigid metal stairway also ascends to the arrivals dock, where there is a docked airship.^ ^Robert the hermit's long-abandoned market stall sits here. It's become even more weathered and worn in the past year"; if (Herm_Notice hasnt moved) print ". A heavily-yellowed piece of paper is attached to its side"; print_ret (string)period; ], #Ifdef GRAPHICS_ENABLED; map_offset 226, comp_mask NE_MASK | SW_MASK | S_MASK | U_MASK | NW_MASK, #Endif; Floor COBBLES, 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 south into the Plumbers Union Building Society, northwest into Sorcery Supply or ascend to the arrivals dock.^ ^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 head south into the Plumbers Union Building Society.^"; return Building_society; ], u_to [; print "You climb up the towering metal stairway to the arrivals dock.^"; return Arrivals_Dock; ], nw_to [; print "You step out of the bustle of the market square and into the abandoned remains of Sorcery Supply.^"; return Sorcery_Supply; ]; Object -> Square_Props with parse_name [i; while (true) { switch(NextWord()) { 'bank', 'plumbers', 'union', 'building', 'society', 'edifice': self.item_num = 1; i++; 'abandoned', 'market', 'weathered', 'worn', 'stall': self.item_num = 2; i++; 'small', 'shop', 'sorcery', 'supply': self.item_num = 3; i++; 'copper', 'copper-co', 'colored', 'coloured', 'lettering': self.item_num = 4; i++; default: return i; } } ], short_name [; switch(self.item_num) { 1: print "Plumbers Union Building Society"; 2: print "abandoned stall"; 3: print "Sorcery Supply"; 4: print "copper-coloured lettering"; } rtrue; ], description [; switch(self.item_num) { 1: "The sprawling commercial edifice usually has an endless stream of wizards pushing their way through the doors, but is rather less busy today. Lettering shaped from plumbing pipes over the door reads ", (i) "Plumbers Union Building Society", (string)period; 2: 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; 3: "The abandoned shop is a sad remnant of its former self. Faded hand-lettered writing over the doorway reads ", (i) "Sorcery Supply", (string)period; 4: "The copper-coloured lettering over the door, shaped from plumbing pipes, reads ", (i) "Plumbers Union Building Society", (string)period; } ], item_num 1, FakeObj, before [; Enter: switch(self.item_num) { 1: <>; 2: <>; 3: <>; 4: <>; } Examine: rfalse; default: if (self.item_num == 2) "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; Askable -> Herm_Notice "yellowed piece of paper" with name 'of' 'paper' 'notice', adname 'heavily' 'heavily-y' 'yellow' 'yellowed' 'piece', description [; print "The piece of paper is yellowed with age and exposure to the elements. It's evidently been here a long time. 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 [; Eat: remove self; "You scrunch the note up. It disintegrates into tiny pieces as you do so, but you stuff them in your mouth and manage to choke them down.^ ^~Well, that was somewhat random of you", (admits)crystal, ". ~Feeling a bit peckish, were you?~"; Read,Search: if (location == thedark) "But it's dark!"; 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"; font off; print " come to visit, do ", (i) "not"; font off; print " come to buy nice shiny objects for your hearth and home at low, low prices and above all, do ", (i) "not"; font off; print " come to offer me one more chance to purchase anything that slices, dices, purees or chops -- Robert^"; font on; print "^Below this, 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; print "^At the bottom of the note, the first hand has added:^"; font off; print "^A change of heart, please, all of you come trek all the way up my lonely mountaintop to visit. I will be glad to see you up there.^"; font on; print "^~How much do you want to bet he added that last part ", (i) "after", " he decided he was moving away to Blumph?~ asks ", (the)crystal, ".^"; 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; RoomV Sorcery_Supply "Sorcery Supply" with description [; #Ifdef GRAPHICS_ENABLED; if (location hasnt visited) { RevealVechlee(self.map_offset); } #Endif; "A sad remnant of its former self, Sorcery Supply is empty and abandoned. Sunlight filters dimly into this shop from the market square. The room is steeped in a palpable air of loneliness. Southeast is the doorway back to the market square, whose bright sunshine and loud noises seem a distant memory."; ], #Ifdef GRAPHICS_ENABLED; map_offset 160, comp_mask SE_MASK | OUT_MASK, #Endif; 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; 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."; ], out_to [; <>; ], se_to [; print "You step back out of the dim and dusty shop into the brilliant sunshine of the market square.^"; return Market_Square; ]; Furniture -> Stand "wooden stand" with name 'stand', adname 'wooden', 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."; ]; Cheese -> -> Madagascar "Madagascar Green Peppercorn" with name 'madagasca' 'green' 'pepper' 'corn' 'peppercor', invent [; print "a piece of Madagascar Green Peppercorn"; if (self.visionnum ~= 0) { PrintShortVision(self.visionnum); } rtrue; ], description [; print "This semi-firm cow's milk cheese sprinkled with green peppercorns is pale yellow in colour."; if (self.visionnum ~= 0) { PrintVision(self.visionnum); } new_line; rtrue; ], before [; Insert,Take,Transfer: Achieved(34); rfalse; Eat,Lick,Taste: print_ret (The) self, " has a taste similar to a mild Monterey Jack, but intensely flavourful whenever you hit one of the peppercorns. It's delicious. You stop before you consume it all."; Smell: "It has a mild smell to it, similar to Monterey Jack."; Touch: print_ret (The) self, " has a nice firm texture."; ]; OutroomV Outskirts "Outskirts" with description [; #Ifdef GRAPHICS_ENABLED; if (location hasnt visited) { RevealVechlee(self.map_offset); } #Endif; "The westernmost outskirts of Vechlee were always less busy than the bustle and activity in the market square, but now they seem abandoned completely. The crumbled remains of the Wizards Guild Hall on the south side of the street explain a large portion of the reduction in foot traffic. The street is narrow and cobblestoned, and ends to the west at the locked gate out of the city. The market square is back to the northeast."; ], #Ifdef GRAPHICS_ENABLED; map_offset 288, comp_mask NE_MASK, #Endif; 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, cant_go [; "The market square lies back to the northeast."; ], ne_to [; print "You return to the crowded bustle of the market square.^"; return Market_Square; ], w_to "The western gates out of town are closed.", s_to "The Guild Hall is just a pile of rubble now."; Prop -> Building "guild hall" with name 'building' 'guild' 'hall' 'rubble' 'spires', adname 'towering', description [; print "At one time, the most impressive edifice in Vechlee, the Guild Hall seems to have fallen further into disrepair since you detonated a bottle of WizStrip in its upper storeys last year. The towering spires have fallen and the ground-floor walls, still standing when you left Vechlee, have since collapsed.^"; if (location hasnt visited) "^~So this is the infamous Wizards Guild Hall,~ says ", (the)crystal, " gazing at the rubble. ~You really did a number on this place, didn't you?~"; rtrue; ], before [; Enter: <>; Examine: rfalse; default: "It's just a pile of rubble now."; ]; Askable -> Scrying_Bowl "silver bowl" with name 'bowl' 'of' 'scrying', adname 'silver', description [; print "A large silver bowl, tarnished and stained. The heavily damaged sides, once delicately worked with bas-relief of farm scenes, are scratched and pitted, the scenes difficult to make out."; if (child(self)) { print " The bowl contains "; WriteListFrom(child(self), ENGLISH_BIT); print (string)period; } new_line; if (crystal has general && crystal.out == 0 && self hasnt general) { give self general; "^~So that's where your scrying bowl ended up!~ says ", (the)crystal, ". ~I guess you lost it in all the confusion of the guild hall explosion.~"; } rtrue; ], initial [; print "Sitting amidst the rubble of the Guild Hall is a tarnished silver bowl"; if (child(self)) { print ", containing "; WriteListFrom(child(self), ENGLISH_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, before [ks obj; Fill: if (second ofclass Cheese) <>; "You're fairly certain 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 (child(self)) { ks = keep_silent; keep_silent = true; print "(taking ", (the)child(self), " out first)^"; obj = child(self); ; keep_silent = ks; } if (noun == Red_Carpet or magic_clothes or Broomstick or autoclimber or uniform or boots or plank or lead) print_ret (The) noun, " ", (isorare)noun, " too big to fit into ", (the) self, (string)period; if (noun ofclass Cheese) { print "You drop ", (the) noun, " into the silver bowl. "; print "For a moment, nothing happens. Then, the bowl begins to glow with a faint otherworldly light... but it soon fades to nothingness and the bowl goes dim. Disappointed, you remove ", (itorthem)noun, " from the bowl.^"; if (crystal has general && crystal.out == 0) { print "^~I guess it doesn't work anymore,~ sighs ", (the)crystal, " sadly. ~I know "; if (tyro has moved) print "we have something better,"; else print "there are better machines for tyromancy now,"; print " but it saddens me to see it worn out and broken.~^"; } rtrue; } "You drop ", (the) noun, " into the tarnished 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."; ], after [; LetGo: Achieved(32); ], has container open ~openable; Cheese -> -> Ardrahan "Ardrahan" with name 'ardrahan' 'ardahan' 'adrahan', invent [; print "a piece of Ardrahan"; if (self.visionnum ~= 0) { PrintShortVision(self.visionnum); } rtrue; ], description [; print "A semi-soft mould-ripened cheese with a smooth texture. It's deep yellow on the inside, with a brine-washed golden-coloured rind on the outside."; if (self.visionnum ~= 0) { PrintVision(self.visionnum); } new_line; rtrue; ], before [; Eat,Lick,Taste: "There's a real zesty tang to the strong buttery and nutty flavour. It's unique and lingers on the tongue, leaving a pleasant aftertaste. You resist the urge to eat more."; Smell: "The pungent aroma is very earthy, with a smell that conjures up visions of farmhouses."; Touch: "The interior of the Ardrahan is firm with a somewhat chalky texture to it."; ]; OutroomV Vechlee_Gate "Town Gate" with description [; #Ifdef GRAPHICS_ENABLED; if (location hasnt visited) { RevealVechlee(self.map_offset); } #Endif; "There's still a fair bit of foot traffic here at the gate leading out of Vechlee. The street is not terribly wide, but continues the laid cobblestones from the market square. Southwest, the avenue leads back to the market square. North, the road heads into the more commercial quarter of North Vechlee. To the northeast is the town gate, leading to the road to Ninario's caer.^ ^A small shop lies to the south."; ], #Ifdef GRAPHICS_ENABLED; map_offset 164, comp_mask N_MASK | SW_MASK | S_MASK | NE_MASK, #Endif; Floor COBBLES, compass_look [obj; if (obj == n_obj) "The road north heads into the commercial 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 to the 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 Vechlee road to Ninario's caer. There is also a small shop lying to the south."; ], n_to [; print "You make 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 along the long and dusty road, dust rising up from the road to fill your eyes and nose.^"; return Vechlee_Road; ], has proper; !==================================================================================================================================================== ! North Vechlee OutroomV North_Vechlee "North Vechlee" with description [; #Ifdef GRAPHICS_ENABLED; if (location hasnt visited) { RevealVechlee(self.map_offset); } #Endif; "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.^ ^A massive factory building looms to the west. A large sign over the front entrance reads ", (i) "Intercity WizStrip", ".^ ^On the east side of the street is a closed business. Faded gold lettering over the entranceway reads ", (i) "Wizardry Wooding", ".^ ^The street leads back south to the town gate."; ], #Ifdef GRAPHICS_ENABLED; map_offset 100, comp_mask W_MASK | S_MASK | IN_MASK, #Endif; Floor COBBLES, compass_look [obj; if (obj == w_obj) <>; if (obj == n_obj) <>; 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 closed and boarded-up business. Faded 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 there aren't a lot of other areas of interest, save the factory to the west of you, and the road back south to Vechlee Gate."; ], in_to [; <>; ], w_to [; print "You step into the wide-open space of the factory floor.^"; return Factory_Floor; ], e_to "As Wizardry Wooding is all boarded up, you can't get in.", s_to [; print "You head back south to the town gate.^"; return Vechlee_Gate; ]; Askable -> Factory_Sign "factory sign" with name 'sign' 'pole', adname 'factory' 'massive' 'large' 'iron' 'huge', description [; print "A large sign is mounted on a massive iron pole driven in front of the factory. ^"; new_line; ; "^The factory itself is huge, a clear testimony to the popularity of WizStrip. Perhaps everyone unclogs their toilets the way Ninario does."; ], information [person; switch(person) { crystal: if (location == North_Vechlee or Factory_Floor) "~Big place isn't it?~ murmurs ", (the)crystal, "."; } ], before [; Enter: <>; Read, Search: font off; print "Intercity WizStrip^"; print (i) "Serving the WizStrip needs of the plumbing community"; font on; new_line; print "^You notice that where it says plumbing, it used to say wizarding."; new_line; if (crystal.out == 0) { "^~That's a big factory", (murmurs)crystal, " gazing at it."; } rtrue; Take, Pull, Push, Pushdir, Transfer: "It's a bit big to lug around town."; ], has scenery readable; Prop -> n_vechlee_scen "shops and houses" with name 'shops' 'houses' 'shop' 'house', description "The shops and houses of north Vechlee's residents fill the small cluttered streets.", information [person; switch (person) { crystal: "~Perhaps we can explore this area another day when we're not so pressed for time,~ says ", (the)crystal, ". ~Some of these shops look interesting.~"; } rfalse; ], before [; Go,Enter: "The shops and houses look interesting, but perhaps you can investigate them another time, when you're not fighting to stop Renaldo and close an interplanar rift."; ]; Prop -> wiz_wood "Wizardry Wooding shop" with name 'wooding' 'door' 'business' 'lettering', adname 'faded' 'gold' 'wizardry' 'closed', description [; "The Wizardry Wooding shop is all boarded up and abandoned. Faded gold lettering over the entranceway reads ", (i) "Wizardry Wooding", "."; ], information [person; switch (person) { crystal: "~I guess Betty shut this shop down when she moved to Blumph,~ says ", (the)crystal, "."; } rfalse; ], before [; Go,Enter: <>; Open: "Wizardry Wooding is firmly boarded up."; ], has proper; RoomV Factory_Floor "Intercity WizStrip" with description [; #Ifdef GRAPHICS_ENABLED; if (location hasnt visited) { RevealVechlee(self.map_offset); } #Endif; "Large and open-plan, this front part of the factory is obviously the shipping area. Labelled vats of WizStrip are everywhere, seemingly waiting to be shipped out. Workers flit by to and fro, too busy to notice you.^ ^The factory is massive and looms around you in all directions. East leads back out to North Vechlee."; ], #Ifdef GRAPHICS_ENABLED; map_offset 98, comp_mask E_MASK | OUT_MASK, #Endif; compass_look [obj; if (obj == e_obj) "East heads back out to North Vechlee."; "The factory is massive and looms over you in all directions. A person could easily get lost in here."; ], before [; Exit: if (player in location) <>; rfalse; ], cant_go [; "The factory is massive and looms over you in all directions. A person could easily get lost in here. The only clear way out of here is east back to North Vechlee."; ], in_to [; <>; ], e_to [; if (Testscope(vat) && vat has general) { StartTimer(vat, 3); } print "You head back out to North Vechlee.^"; return North_Vechlee; ]; !Vat of wizstrip prop Prop -> vat "vat of WizStrip" with name 'vat' 'wizstrip', adname 'of', time_left, dtime 0, asked false, description [; print "It's an extremely large vat of what is presumably WizStrip. It's about twice the size of a standard oil drum. The vat is stamped ", (i) "WizStrip Paint Stripper, Industrial Strength, 400 litres", " in red lettering. Then in smaller letters: ", (i) "WARNING: Highly reactive. Do not mix with methane.", "^"; if (self has general) print "^It has an address label on it, directing it to Ninario's caer.^"; if (self.asked == false) { print "^~You're getting a look in your eyes,~ accuses ", (the)crystal, ". ~It's the look of someone who's planning to explode something with a giant vat of WizStrip, isn't it?~^"; YesNo.Ask(BlastYes, BlastNo, 0); } rtrue; ], initial [; "A large vat sits prominently on the factory floor."; ], before [; Eat: "~I know the chemical composition of WizStrip is a guarded secret,~ warns ", (the)crystal, ", ~but it's unlikely to taste of strawberries and cream. I've seen it chew through multiple layers of lead-based paint. I can only imagine what it would do to your insides.~^ ^But apparently Crystal cannot only imagine it, but can also relate exactly what the WizStrip ", (i) "would", " do to you. You reconsider and decide against eating it. You feel ill enough just hearing about it."; Open: "But that would spill WizStrip everywhere!"; Receive: if (noun == address_label) { Achieved(48); move address_label to self; give self general; StartTimer(vat, 6); "You apply the address label to ", (the)self, ". The vat is now addressed to Ninario's caer."; } "Putting that on the vat of WizStrip won't help."; PushDir,Take: "It's far too heavy to move around, never mind doing anything else with it. You suspect even the satchel would have problems accommodating it."; ], time_out [; StartDaemon(vat_and_horses); if (location == Factory_Floor) { print "^A team of workers comes by and quickly manoeuvres the vat into place on a horse-drawn flat wagon. The wagon is then driven out and away by a teamster.^ ^~Good work, everyone,~ calls the foreperson. ~Let's meet those shipping targets!~"; } remove self; rtrue; ], has ~scenery supporter transparent; NPC -> workers "workers" with name 'crowd' 'people' 'fellows' 'fellow' 'person' 'man' 'guys' 'everyone' 'everybody' 'someone' 'somebody' 'worker' 'workers', adname 'of', description "The workers rush sporadically about the factory floor, conducting the business of the day. Nobody seems to take the slightest notice of you.", chat 0, Topics 0, each_turn [; if (self.mesmer ~= 0 && location == Factory_Floor) { print_ret "^Everybody in the factory seems too busy to notice the spectacle in the snow globe."; } if (factory_floor.hoopsack_arrive == true) { Factory_Floor.hoopsack_arrive = false; print_ret "^Nobody in the factory seems to notice your unorthodox arrival."; } if (self.Chat == 1 && location == factory_floor) { new_line; switch (random(6)) { 1: print "The workers buzz to and fro around you, intent on their jobs.^"; 2: print "The workers scurry around the factory floor, busy with their tasks.^"; 3: print "The workers rush all around you, ignoring you.^"; 4: print "The workers swirl around you, a nameless horde of employees.^"; 5 to 6: if (Testscope(vat)) { print "~Hey,~ shouts a foreperson, coming to a stop beside the vat. ~Why hasn't this vat been shipped out yet?~^"; if (vat hasnt general) print "^~No shipping label on it!~ shouts someone else in reply.^ ^~Well, sort it out and ship it!~ shouts the foreperson, hurrying off.^"; else { print "^~Just finishing the paperwork!~ shouts someone else in reply.^ ^~Thank you!~ calls the foreperson, hurrying off.^"; } } else print "The workers buzz to and fro around you, intent on their jobs.^"; } } self.Chat = random(2); rtrue; ], before [; Attack: "Workplace violence is a serious problem and you don't want to instigate any here."; Bargain: "No one seems interested in doing business with you."; Kiss: print "You grab a worker at random and give "; switch (random(4)) { 1: print "her a big kiss. She splutters in alarm, pulls away from you, and hurries off."; 2: print "him a big kiss. He gulps in alarm and hurries off, stealing glances at you over his shoulder."; 3: print "her a big kiss. She blushes a deep red and hurries off."; 4: print "him a big kiss. He blushes a rosy pink and hurries off, stealing glances at you over his shoulder."; } new_line; if (crystal has general) "^~Well, that was odd of you,~ says ", (the)crystal, ", ~I'm not really certain what ", (i) "that's", " all about.~"; rtrue; MeetNPC,Talk: "You greet some of the workers. A few of them glance in your direction and scowl."; Thank: "No one in the factory seems to notice or care."; Touch,Search: "They keep dodging around you and carrying on with their work."; WakeOther: "Everyone seems awake and busy."; ], life [; Answer: if (noun == 'hello' or 'hi') <>; else <>; Show: "No one seems terribly impressed."; Tell: "No one seems to pay any interest to you."; ], orders [; MeetNPC: <>; default: "Everyone seems to have their job to do and is not interested in following your orders."; ], has scenery pluralname; !==================================================================================================================================================== ! Vechlee multilocation objects NPC vat_and_horses "WizStrip delivery wagon" with name 'vat' 'team' 'horses' 'teamster' 'driver' 'wagon', adname 'of' 'wizstrip' 'delivery' 'rough-loo', time_left, dtime 0, description "The flat wagon contains a large vat of WizStrip, about 400 litres. It's driven by a rough-looking teamster and pulled by a strong draught horse.", initial [; print "A flat horse-drawn wagon is trundling "; if (location == Atop_West_Wall) "along the road below you."; if (location == W_Courtyard) "through the courtyard."; if (location == Gatehouse) "along the road in the bailey passage below you."; if (location == Bailey) "through the bailey passage here."; else "along the road here."; ], found_in [; if (vat_return.dtime == 0) { switch(self.dtime) { 1: if (location == North_Vechlee) rtrue; 2: if (location == North_Vechlee) rtrue; 3: if (location == Vechlee_Road or Atop_West_Wall) rtrue; 4: if (Caer_Door hasnt open) { if (location == Vechlee_Road or Atop_West_Wall) rtrue; } else { if (location == Bailey or Gatehouse) rtrue; } 5: if (Portcullis hasnt open) { if (location == Bailey or Gatehouse) rtrue; } else { if (location == W_Courtyard or Atop_West_Wall) rtrue; } 6: if (location == W_Courtyard or Atop_West_Wall) rtrue; default: rfalse; } } else { switch(vat_return.dtime) { 1: if (location == Bailey or Gatehouse) rtrue; 2: if (location == Vechlee_Road or Atop_West_Wall) rtrue; 3: if (location == Vechlee_Gate) rtrue; 4: if (location == North_Vechlee) rtrue; default: rfalse; } } ], daemon [; self.dtime++; switch (self.dtime) { 1: move self to North_Vechlee; if (location == North_Vechlee) print "^The WizStrip delivery wagon ", (trundles)0, " into view from the west.^"; 2: move self to Vechlee_Gate; if (location == North_Vechlee) print "^The WizStrip delivery wagon ", (trundles)0, " away to the south, heading for the Vechlee gate.^"; if (location == Vechlee_Gate) print "^The WizStrip delivery wagon ", (trundles)0, " into view from the north.^"; 3: move self to Vechlee_Road; if (location == Vechlee_Gate) print "^The WizStrip delivery wagon ", (trundles)0, " away along the Vechlee road to the northeast.^"; if (location == Atop_West_Wall) { print "^Away in the distance, the WizStrip delivery wagon ", (trundles)0, " out of Vechlee's gate and along the road, heading northeast.^"; } if (location == Vechlee_Road) { print "^The WizStrip delivery wagon ", (trundles)0, " into view from the southwest.^"; } 4: if (Caer_Door hasnt open) { StopDaemon(self); self.dtime = 0; vat_return.dtime = 2; if (location == Vechlee_Road or Atop_West_Wall) { print "^The WizStrip delivery wagon comes to a halt outside the caer doors, and the teamster gazes at them in frustration. ~Well, how am I supposed to deliver some WizStrip if the doors aren't open?~ he mutters to himself. He begins painstakingly turning his wagon around.^"; } StartDaemon(vat_return); } else { move self to Bailey; if (location == Vechlee_Road or Atop_West_Wall or Gatehouse) { print "^The WizStrip delivery wagon ", (trundles)0, " east into the bailey passage"; if (location == Gatehouse) print " below you"; print ".^"; } if (location == Bailey) print "^The WizStrip delivery wagon ", (trundles)0, " into view from the west.^"; } 5: if (Portcullis hasnt open) { StopDaemon(self); self.dtime = 0; vat_return.dtime = 1; if (location == Bailey or Gatehouse) { print "^The WizStrip delivery wagon comes to a halt before the portcullis"; if (location == Gatehouse) print " in the bailey below you"; print ", and the teamster gazes at it in frustration. ~Well, how am I supposed to deliver some WizStrip if the gate isn't open?~ he mutters to himself. He begins painstakingly turning the wagon around.^"; } StartDaemon(vat_return); rtrue; } else { move self to W_Courtyard; if (location == Bailey or Gatehouse) print "^The WizStrip delivery wagon ", (trundles)0, " east into the courtyard.^"; if (location == W_Courtyard or Atop_West_Wall) { print "^The WizStrip delivery wagon ", (trundles)0, " into the courtyard from the bailey passage.^"; } } 6: vat_return.dtime = 0; StopDaemon(self); ! self.dtime = 0; if (child(chute) ~= 0) { ! Deliver the WizStrip! if (location == W_Courtyard or Sewer or Basement or Atop_West_Wall) Playsound(wizstrip); if (location == W_Courtyard or Atop_West_Wall) { print "^The WizStrip delivery wagon comes to a halt outside the tower, and the teamster glances at the chute. He sees the delivery sign and nods to himself in satisfaction.^ ^In a matter of moments, he has the vat connected and emptying its contents down the chute. Once emptied, he closes everything back up and turns the wagon around, whistling to himself.^ ^~Wait for it,~ whispers ", (the)crystal, " gleefully. ~This is going to be good!~^"; } if (location == Sewer) print "^You hear some noises coming down the chute from above and within moments, a torrent of yellowish oily paint stripper comes pouring down the chute.^ ^~WizStrip!~ gasps ", (the)crystal, ". ~Oh, this can't be good! Run!~^"; if (location == Basement) print "^You hear some noises coming from the sewer to the north and within moments, the sounds of a torrent of liquid pouring down the chute.^ ^~WizStrip!~ gasps ", (the)crystal, ". ~Oh, this can't be good! Run!~^"; Achieved(50); StartTimer(Sewer_Vat, 1); } else if (location == W_Courtyard or Atop_West_Wall) { print "^The WizStrip delivery wagon comes to a halt outside the tower, and the teamster gazes around in frustration. ~Well, where am I supposed to deliver this?~ he mutters to himself. He glances briefly at the chute but shakes his head. ~I can't dump this in there unless I'm sure it leads to the WizStrip vat.~ He sighs and turns the wagon around.^"; } StartDaemon(vat_return); } MoveFloatingObjects(); rtrue; ], before [; Enter: "~Leave off,~ growls the teamster, swatting you back off the wagon."; Examine: rfalse; Thank: "The teamster shrugs. ~Jest doin' me job,~"; default: "The wagon and its occupants ignore you, intent on their job. You decide to leave them alone."; ], has ~scenery supporter transparent; Object vat_return with dtime 0, daemon [; self.dtime++; switch (self.dtime) { 1: ! assume the starting location is W_Courtyard. vat_and_horses.dtime = 0; if (location == W_Courtyard or Atop_West_Wall) print "^The WizStrip delivery wagon ", (trundles)0, " west into the bailey passage.^"; else if (location == Bailey or Gatehouse) { print "^The WizStrip delivery wagon, ", (trundles)0, " into view "; if (location == Gatehouse) print "in the bailey passage below.^"; else print "from the courtyard.^"; } 2: if (location == Bailey or Gatehouse) print "^The WizStrip delivery wagon ", (trundles)0, " out of the bailey heading west.^"; if (location == Vechlee_Road or Atop_West_Wall) { print "^The WizStrip delivery wagon ", (trundles)0, " out from the bailey and heads southwest.^"; } 3: if (location == Vechlee_Road or Atop_West_Wall) print "^The WizStrip delivery wagon ", (trundles)0, " out of sight along the Vechlee road to the southwest.^"; if (location == Vechlee_Gate) print "^The WizStrip delivery wagon ", (trundles)0, " into view from the northeast.^"; 4: if (location == Vechlee_Gate) print "^The WizStrip delivery wagon ", (trundles)0, " north towards North Vechlee.^"; if (location == North_Vechlee) print "^The WizStrip delivery wagon ", (trundles)0, " into view from the south.^"; 5: if (location == North_Vechlee) print "^The WizStrip delivery wagon ", (trundles)0, " around to the rear of the WizStrip factory and disappears from view.^"; 6 to 11: ; 12: StopDaemon(self); self.dtime = 0; if (Sewer_Vat.clean == false) StartDaemon(vat_and_horses); } MoveFloatingObjects(); rtrue; ]; Prop Town_Gate "town gate" with name 'gate' 'gates', adname 'town', 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 Outskirts, before [; Close,Lock: if (self in Outskirts) "The gate is already closed and locked."; "The gate is locked in the open position, and you can't budge it."; Open,Unlock: if (self in Outskirts) "The gate is locked shut, and you can't budge it."; "The gate is already open."; ]; Autodoor Shop_Door "shop door" with name 'door' 'emporium', adname 'shop' 'cheese', description [; print "To the south, a"; if (self has open) print "n open "; print " plain wooden"; " door leads into Eliza's Cheese Emporium."; ], before [; Enter: if (player in Vechlee_Gate) <>; <>; ], n_to Vechlee_Gate, s_to Cheese_Shop, has open lockable; Room Cheese_Shop "Eliza's Cheese Emporium" with description [; #Ifdef GRAPHICS_ENABLED; if (location hasnt visited) { RevealVechlee(self.map_offset); } #Endif; print "This small cheese shop has been re-open for about a year now, and the contrast to your last visit couldn't be greater. The emptiness and silence has been replaced by a scene bustling with life... and cheese. It looks a nice cozy little shop, friendly and family-run. The air is scented with the aroma of many different cheeses mingled together. The "; if (Shop_Door has open) print "open"; else print "closed"; print " door to the north leads back to the street.^ ^A counter laden with cheeses sits against the southern wall of the shop. The proprietor, Eliza Stilton, whose name you've heard but whom you've never met, stands behind it."; if (location hasnt visited) { give location visited; print " ~Greetings customer,~ she smiles brightly, stepping around the counter to greet you. ~Always happy to serve an airship captain. What can we get for you today? We have a number of exotic cheeses in stock...~^ ^She trails off, looking at you closely. ~You're not one of the usual airship captains,~ she says, puzzled. She looks you up and down, taking in your varied assortment of items and accoutrements. ~I know you,~ she says, an ominous note of menace coming into her voice. She reaches behind the counter and pulls out a crystal ball. ~You're the cheese-thieving apprentice!~ Eliza makes some passes over the crystal ball and you see an image of yourself form in the crystal ball. The scene is of this very cheese shop and you watch in barefaced shame as your image purloins a number of cheeses from the countertop. You start to stammer an apology.^ ^~Never mind all that,~ snaps Eliza. ~Here, I've been waiting a year for this day.~ She pulls a piece of paper from her apron pocket. You notice the words ", (i) "Cheese invoice", " at the top.^ ^~Now, let's see here,~ she says, checking this list. ~That's a sample of Asiago, a slice of Bel Paese, a morsel of Caerphilly, a hunk of Wensleydale, a mouthful of Camembert, a chunk of Gouda, a sample of Emmental, a portion of Stilton, a quantity of Miranda, a few crumbs of Cheshire, a section of Roquefort, and a piece of Brie.~ She suddenly frowns and glances at the crystal ball again. ~That's not right, you didn't take any Brie. Well, I can't be bothered to make changes to the list. Here.~^ ^She grabs a piece of Brie from the counter and thrusts it at you and then hands you the list. ~Please feel free to have you or your master settle up any time you like! Now get out! I think I'll close up for the day, seeing I've sold twelve cheeses.~^ ^So saying, she pushes you out the door, slamming it firmly behind you.^"; move Brie to player; move invoice to player; give Shop_Door ~open locked; Achieved(42); PlayerTo(Vechlee_Gate); MoveFloatingObjects(); rtrue; } new_line; rtrue; ], #Ifdef GRAPHICS_ENABLED; map_offset 228, comp_mask N_MASK | OUT_MASK, #Endif; 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.", out_to [; <>; ], n_to Shop_Door, has proper; !==================================================================================================================================================== ! Multilocation objects Askable big_key "large iron key" with name 'key' 'something', adname 'large' 'unwieldy' 'iron', description [; if (self hasnt moved) "A large unwieldy iron key with a bow on one end and large wards on the other."; "An iron key, large and unwieldy."; ], initial [; "A large iron key lies here, doubtless jarred loose from ", (the)guard, "'s uniform in the fall."; ], before [; Eat: "You decide not to eat the large unwieldy iron key.^ ^~Low on iron?~ asks ", (the)crystal, " curiously."; ], information [person; switch (person) { crystal: "~I think it's the key to Ninario's caer,~ says ", (the)crystal, (string)period; } rfalse; ]; Prop Sky "sky" with name 'sky' 'clouds' 'sun' 'ceiling' 'air', adname 'blue', short_name [; if (real_location ofclass Outroom or OutroomV || location == second_brick) print "sky"; else print "ceiling"; rtrue; ], found_in [; return (location ofclass Room or RoomV); ], description [; if (location == Bailey) <>; if (real_location ofclass Outroom or OutroomV || location == second_brick) { if (globalvision == true) switch(location) { Vechlee_Road_Vision: print "The brilliant blue morning sky is typical weather for this time of year. There are no clouds in sight, and the sun beats down warmly.^"; Tower_Roof_Vision: print "The late afternoon sky is a calm blue and the sun is still high, quite usual for this time of year.^"; Garden_Vision: print "The evening sky is a deepening blue, but still bright, as expected for this time of year.^"; } else if (turns < 100) print "The brilliant blue morning sky is typical weather for this time of year. There are no clouds in sight, and the sun beats down warmly.^"; else if (turns < 200) print "The mid-morning sky is bright blue with a few clouds showing here and there. The sun beats down warmly.^"; else if (turns < 300) print "The noontime sun blazes directly overhead in a bright blue sky with a few scattered clouds.^"; else if (turns < 400) print "The early afternoon sky is a deep calm blue with some scattered clouds.^"; else if (turns < 500) print "The mid-afternoon sky is a pale blue streaked with wisps of cloud.^"; else if (turns < 600) print "The late afternoon sky is a calm blue and the sun is still high, quite usual for this time of year.^"; else if (turns < 700) print "The early evening sky is a brilliant blue with some cloud buildup.^"; else if (turns < 800) print "The evening sky is a deepening blue, but still bright, as expected for this time of year.^"; else print "The evening sky is a brilliant splash of red and gold, as the sun heads for the horizon.^"; if (Testscope(anchor)) { new_line; <>; } rtrue; } else "The ceiling lies high overhead."; ], information [person; switch (person) { crystal: if (real_location ofclass Outroom or OutroomV || location == second_brick) { if (globalvision == true) switch(location) { Vechlee_Road_Vision: "~The morning sky,~ says ", (the)crystal, " glancing up. ~Well, that gives us the time of this vision.~"; Tower_Roof_Vision: "~Isn't it a lovely, calm blue?~", (murmurs)crystal, ", glancing up."; } if (turns < 400) "~Isn't it a lovely, brilliant blue?~", (murmurs)crystal, ", glancing up."; else if (turns < 500) "~Isn't it a lovely, pale blue?~", (murmurs)crystal, ", glancing up."; else if (turns < 600) "~Isn't it a lovely, calm blue?~", (murmurs)crystal, ", glancing up."; else if (turns < 800) "~I love how long these summer days are,~", (murmurs)crystal, ", glancing up. ~Isn't the sky a lovely deep blue?~"; else if (turns < 900) "~What a dazzling sunset,~", (murmurs)crystal, "."; } "~It's a ceiling", (murmurs)crystal, ". ~I'm not sure there's much more to it than that.~"; betty: "~The ceiling was here when I bought the place, luv,~ smiles ", (the)betty, (string)period; crone: "~It keeps the rain off,~ mutters ", (the)crone, ", glancing up briefly at the ceiling."; people: switch (random(4)) { 1: print "~Lovely this time of year, isn't it?~ smiles"; 2: print "~It's up there somewhere,~ mutters"; 3: "A passerby glances up quickly. ~Looks fine to me,~ he shrugs. ~It's not falling, anyway.~"; 4: print "~Not much I can tell you, I'm afraid,~ shrugs"; } randcrowd(); rtrue; hermit: "~I'll tell you, after all those years with the sun beating down on me, it's nice to have a roof overhead again,~ says ", (the)hermit, ", glancing up."; } rfalse; ], FakeObj, before [; Enter: if (location == Bailey) <>; if (real_location ofclass Outroom or OutroomV) "You leap briefly into the air and then fall back to earth."; else <>; Examine: rfalse; default: if (real_location ofclass Outroom or OutroomV) "The sky lies high overhead."; else { if (location == Bailey) "The murder holes are high overhead."; "The ceiling lies overhead, out of your reach."; } ], has scenery; Prop wall "wall" with name 'wall' 'walls', found_in [; !if (location == Blumph_Heights or Manor_Grounds ) ! rfalse; if (location ofclass Outroom or OutroomV) rfalse; else rtrue; ], FakeObj, before [; Examine,Touch: TouchWalls(noun, location.Floor, location.Walls); rtrue; ], has scenery; Prop Cobblestones "cobbled road" with name 'stones' 'cobblesto' 'street' 'avenue' 'road' 'cobbles', adname 'cobble' 'cobbled' 'high', description [; if (real_location == wizards_way) "The cobbled road rises sharply up towards Blumph's high street, the central area of the town."; "The cobblestones are neatly and securely laid."; ], found_in wizards_way High_Street Oak_Street Shops Market_Square Vechlee_Gate Outskirts, before [; Examine: rfalse; Touch: TouchWalls(d_obj, real_location.Floor, real_location.Walls); rtrue; 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."; ]; Prop ships "ships" with name 'water' 'ship' 'ships' 'harbour' 'harbor' 'bay' 'sea', adname 'blue', description [; print "The ships bob gently in the harbour, "; if (real_location == Pier) "moving up and down with the gentle waves."; "but the distance is too great to make out any significant details."; ], found_in High_Street Shops Pier, information [person; switch (person) { crystal: "~I doubt a sea-going vessel is the best option for reaching Vechlee,~ frowns ", (the)crystal, ", ~seeing as how it's landlocked and all.~"; people: switch (random(5)) { 1: print "~It's mostly recreational vessels that dock here,~ smiles"; 2: print "~If you can find a captain who's sober, they're fine,~ mutters"; 3: print "~I've never actually been on one~ confesses"; 4: print "~Not much I can tell you, I'm afraid,~ shrugs"; 5: print "~There's only a few isolated islands to visit out there anyway,~ murmurs"; } randcrowd(); rtrue; captain: "~Sea-going vessels can't hope to compare to the glory of sailing through the air,~ sniffs ", (the)captain, ", looking smug."; } rfalse; ], has pluralname; Askable anchor "anchor cable" with name 'cable' 'job', adname 'anchor' 'parking' 'docking', found_in High_Street Shops Oak_Street alleyway drain1 peak_roof first_floor second_floor_attic second_brick Pier Dir_Docks Arrivals_Dock Market_Square, anchored true, description [; if (self.anchored == true) { if (real_location == second_brick) "One arm of the anchor has lodged itself firmly in the window. The anchor cable isn't completely taut, so it's possible you could push the anchor free."; if (real_location == Oak_Street or alleyway or drain1 or peak_roof or first_floor or second_floor_attic) "One arm of the anchor has lodged itself in the second-floor window of the brick house. It looks like the cable isn't completely taut, so if you could find a way over there, you could likely push the anchor free."; "Oddly, instead of being anchored properly at the dirigible docks, the massive anchor cable looms over a large portion of the city, running from the airship, over the high street, and coming to rest somewhere in the residential district."; } if (Arrivals_Dock has visited) "The anchor, covered in various fish entrails and bits of roof, hovers just below the airship. The wind is light enough and the anchor heavy enough that the airship floats in place, swaying slightly."; "The anchor, freed from its entanglement, hangs over the pier, just below the airship. The wind is light enough and the anchor heavy enough that the airship floats in place, swaying slightly."; ], information [person; switch (person) { crystal: if (self.anchored == false) "~I'm sure freeing it from that window will help the airship lift off when the time comes.~"; if (High_Street hasnt visited) "~What anchor?~ asks ", (the)crystal, (string)period; if (real_location == Oak_Street or alleyway or drain1 or peak_roof or first_floor or second_floor_attic) "~Ouch!~ exclaims ", (the)crystal, ". ~It looks like someone had a bit too much to drink before docking their airship.~"; if (Arrivals_Dock has visited) "~Well, you can't expect us to anchor perfectly,~ says ", (the)crystal, ". ~We're amateurs, after all.~"; "~Yes, that anchor is certainly odd. I expect that's not the normal docking procedure. Probably a drunken captain at the helm,~ she adds cheerfully."; people: if (self.anchored == false) { switch (random(5)) { 1: print "~Don't know anything about it,~ mutters"; 2: print "~About time someone fixed that eyesore,~ mutters"; 3: if (real_location == Oak_Street) print "~They've lost a chance of selling that house to a retired sea captain now,~ mutters"; else print "~Nice to be able to look up without seeing that monstrous cable,~ says"; 4: print "~I'm glad they've cleared up that shameful docking attempt,~ says"; 5: print "~It looks much nicer without it,~ declares"; } } else { switch (random(7)) { 1: print "~Don't know anything about it,~ mutters"; 2: print "~Drunken airship captains,~ mutters"; 3: print "~How tragic!~ mutters"; 4: print "~It's a shame how they drive these airships,~ says"; 5: print "~I'm sure it doesn't belong there,~ frowns"; 6: print "~It's not ", (i) "my", " house, so I'm not too worried about it,~ says"; 7: print "~Terrible docking, isn't it?~ sighs"; } } randcrowd(); rtrue; captain: "~There's nothing wrong with my docking job,~ mutters ", (the)captain, ". ~And I certainly wasn't drinking during those manoeuvres. I'd finished all three bottles long before I started to dock.~"; hermit: "~Lousy docking job, isn't it?~ mutters ", (the)hermit, ". ~Still,~ he adds with a pensive look in his eyes, ~nice strong cable.~"; } rfalse; ], describe [; if (real_location == Oak_Street or alleyway or first_floor or second_floor_attic or drain1) { if (self.anchored == true) "^A huge anchor, its cable streaming back to a lone airship hovering over the pier, is embedded in the second-floor window of the tall brick house."; } if (real_location == High_Street or Pier) { if (self.anchored == true) "^The airship's large anchor cable streams overhead, coming to rest somewhere in the residential district."; } rtrue; ], before [; Attack,Push,Pull,Take: if (self in second_brick) { Achieved(28); self.anchored = false; give self scenery; MoveFloatingObjects(); "You set your shoulder against the heavy anchor and push for all you're worth. The anchor grinds against the edge of the window, inching its way free. With a sudden rushing slide, it pushes free of the window and, pulled by the cable, disappears from view.^ ^~Freed, one airship!~ says ", (the)crystal, " in a satisfied tone. ~Nicely done.~"; } if (self in Dir_Docks) { "It's hanging down from the far side of the airship, so you can't reach it from here."; } "It's a great many feet over your head."; Examine: rfalse; default: if (self in second_brick) { rfalse; } "It's a great many feet over your head."; ]; Prop airship "airship" with name 'airship' 'airships' 'dirigible' 'balloon' 'blimp' 'transport', found_in High_Street Oak_Street Shops Pier Dir_Docks Arrivals_Dock Market_Square, description [; if (location == Oak_Street) print "From here, the airship looks like a small balloon, swaying gently on its anchor cable. "; if (location == High_Street or Shops or Pier) print "The airship hovers over the pier area, swaying gently on its anchor cable. It looks like it's the only one in port at the moment. "; if (location == High_Street or Shops or Pier) print "The airship hovers over the pier area, swaying gently on its anchor cable. It looks like it's the only one in port at the moment. "; if (location == Dir_Docks or Arrivals_Dock or Market_Square) { if (location == Market_Square) print "The airship hovers over the square, swaying gently on its anchor cable. It looks "; else print "The airship hovers just to the north of you, the open door of its gondola lining up with the gangway. It looks "; if (location == Dir_Docks) print "like it's the only one in port at the moment. "; else "a bit worse for wear after its haphazard journey. The anchor cable has bits of roof hanging from it, and a stream of fish entrails lines the underside of the gondola."; } <>; ], describe [; if (real_location == High_Street) rtrue; ! if this is Oak Street or Pier, and anchor is still anchored, the anchor description mentions the airship, so just ditch if (real_location == Oak_Street or Pier && anchor.anchored == true) rtrue; if (real_location == Dir_Docks or Arrivals_Dock) { if (real_location == Arrivals_Dock) print "^The"; else print "^A lone docked"; " airship hovers just to the north of you, its open door just lining up with the gangway."; } if (real_location == Pier) { switch (random(3)) { 1: "^The airship bobs gently overhead, swaying in the breeze."; 2: "^There is a light gust of wind, and the airship bobs gently, its anchor cable swaying slightly."; 3: "^The airship moves gently with the slight breeze."; } } if (location == Market_Square) print "^A large airship hovers over the square, swaying gently on its anchor cable. It looks a bit worse for wear after its haphazard journey. The anchor cable has bits of roof hanging from it, and a stream of fish entrails lines the underside of the gondola."; else print "^A large airship is visible over the pier area, swaying gently on its anchor cable."; if (anchor.anchored == true) " The cable itself streams overhead, coming to rest somewhere in the residential district."; new_line; rtrue; ], information [person; switch (person) { crystal: print "~The airships run daily to all the cities, even Vechlee now that the Wizards Guild are in hiding. They were violently against all non-magical air travel, as you can imagine. An airship might be a good way to get to Vechlee to visit Ninny's safety deposit box. "; if (High_Street has visited && Arrivals_Dock hasnt visited) { print "Though I'm surprised that airship's still "; if (real_location ~= Dir_Docks) { print "up t"; } "here; they usually all leave first thing. Maybe they've had technical troubles.~"; } "Of course, they usually all leave first thing in the morning.~"; people: switch (random(5)) { 1: print "~I love the daily service to Vechlee,~ smiles"; 2: print "~If you can find a captain who's sober, airships are fine,~ mutters"; 3: print "~I've never actually been on one~ confesses"; 4: print "~Not much I can tell you, I'm afraid,~ shrugs"; 5: print "~That's funny, they've usually all left the docks by this time,~ murmurs"; } randcrowd(); rtrue; crone: "~Noisy contraptions,~ mutters ", (the)crone, ". ~Why can't people stick to broomsticks? So they have a longer range than magical methods. Big deal.~"; betty: "~I've never been on one,~ confesses ", (the)betty, ". ~They've had them here in Blumph for years, but Vechlee only got them after I moved away. With the Wizards Guild headquartered there, they wouldn't let the airship service run there. Science, you know.~"; akbar: "~An airship!~ cries ", (the)akbar, ". ~Why on earth would you fly in an airship when you could buy a flying carpet from ", (name)honest_akbars, " instead?~"; hermit: give greater_spenseweed objseen; "~Nasty, noisy things,~ mutters ", (the)hermit, ", ~shattering the peace and quiet of lonely mountaintops, and landing with hordes of tourists, snatching up all the greater spenseweed they can lay their hands on.~"; captain: "~The only way to travel!~ cries the airship captain, waving his arms expansively and nearly knocking over his drink."; } rfalse; ], before [; Examine: rfalse; default: "With it up there and you down here, your options for interaction are a bit limited."; ], has static ~scenery; ! FLAG_x1 x2 x3 x4 x5 NPC people "busy townsfolk" with name 'townspeop' 'townsfolk' 'crowd' 'people' 'fellows' 'fellow' 'person' 'man' 'woman' 'girls' 'boys' 'chaps' 'boy' 'women' 'men' 'guys' 'everyone' 'everybody' 'someone' 'warlock' 'witch' 'somebody' 'kids' 'folks' 'townies' 'traffic' 'passersby' 'passerbys' 'passerby', adname 'foot' 'of', description [; print "The townsfolk of "; if (location == Market_Square or Vechlee_Gate) print "Vechlee"; else print "Blumph"; " all look extremely busy, hurrying about their business. There's certainly a wide cross-section of society represented."; ], found_in High_Street Oak_Street Shops Market_Square Vechlee_Gate, chat 0, Topics 0, each_turn [; if (location.hoopsack_arrive == true) { location.hoopsack_arrive = false; print_ret "^Nobody in the crowd seems to notice your unorthodox arrival."; } if (self.Chat == 1 && location == Market_Square or Vechlee_Gate) { new_line; switch (random(100)) { 1 to 12: print "The crowd ebbs and flows around you, an undulating wave of humanity.^"; 13 to 25: print "The buzz of many voices and conversations swells in the crowd around you.^"; 26 to 38: print "Various passersby push their way around you, obviously in a hurry.^"; 39 to 51: print "The sights and sounds of the city assail your senses on every side.^"; 52 to 63: print "The crowd swirls around you, a nameless tapestry of faces.^"; 64 to 76: print "The crowd disperses briefly, like waves breaking on shore, but then begins its slow surf-like buildup once more.^"; 77 to 88: print "The townspeople rush about their daily business, paying no attention to you.^"; 89 to 93: 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"; 16 to 19: if (magic_clothes in player) print "~Apprentices"; else print "~Airship captains"; print "!~ she snaps haughtily, marching off"; 20: print "~I hear there's something afoot at Ninario's caer outside "; if (location ~= Market_Square or Vechlee_Gate) print "Vechlee"; else print "town"; print ".~, he whispers conspiratorially, and then vanishes"; } print " into the crowd.^"; 94 to 98: print "~Have you heard about the new WizStrip factory in "; if (location ~= Market_Square or Vechlee_Gate) print "Vechlee"; else print "town"; print "?~ you hear from somewhere in the milling crowd. ~They sell it by the vat!~^^~I heard that too,~ says a second voice, ~but I also heard there's a petition to move it to a lonely mountaintop, because it's such a volatile and unstable compound!~ The voices continue talking, but fade away, lost in the swell of people.^"; 99,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.^"; } ! play a crowd sound at random. There are 8 sounds and ! they start at "crowd1" #Ifdef SOUND_ENABLED; if (real_location == High_Street or Shops or Market_Square) PlaySound(random(8) + crowd1 - 1, 1, sound_vol / 2); else PlaySound(random(8) + res_crowd1 - 1, 1, sound_vol / 2); #Endif; } self.Chat = random(3); rtrue; ], information [person; switch (person) { crystal: "~If you think this is a crowd, I'd like to see you in the marketplace on market day,~ says ", (the)crystal, ", gazing around."; crone: "The old crone shrugs. ~There's always a crowd in Blumph.~"; people: "Everyone you talk to seems to agree that crowds like this are usual in Blumph."; akbar: "~I love the crowds!~ beams ", (the)akbar, ". ~The bigger the crowd in the high street, the more customers wander in.~"; betty: "~Oh, crowds are always good!~ smiles ", (the)betty, ". ~Bumping, shoving, spilling things on their clothes. It's all terribly good for business, you know.~"; hermit: "~It was a bit of an adjustment after my lonely mountaintop", (admits)hermit, ", ~but I find I'm getting used to it. Thankfully, I don't get too many customers wandering in.~"; captain: "~Just keep them away from me,~ mumbles the airship captain, frowning into his drink."; } rfalse; ], nomatch [; "You can't find anyone in the crowd interested in talking about that."; ], react_before [; Listen: if (noun == nothing) <>; ], before [wd bk; Consult: wn = consult_from; wd = NextWord(); switch (wd) { 'wizstrip', 'factory', 'vat', 'paint', 'thinner', 'methane': if (self.Topics & FLAG_x5 == FLAG_x5) "You find someone who confirms what you've already heard: there's a huge WizStrip factory in Vechlee now where they make it by the vat, in spite of its violent reactions with methane."; self.Topics = self.Topics | FLAG_x5; "~Oh, aye,~ nods a passerby knowingly. ~There's a huge factory for that WizStrip paint thinner in Vechlee. Dangerous stuff though, if you mix it with methane. And Vechlee's filling up with wizards again, so everyone's worried.~ He nods sagely and hurries off."; 'nin', 'ninario', 'ninny': "~Keeps 'imself to 'imself,~ mutters a passerby.^^~You could take a lesson from his book, young 'un,~ mutters another, going in the opposite direction."; 'wizard', 'wizards', 'property', 'values', 'influx': if (location == Market_Square or Vechlee_Gate) "Everyone you ask seems a bit put out at how the influx of wizards eroded property values."; "Everyone you ask seems pleased that the wizards are slowly coming back to Vechlee."; 'guild', 'wizard^s': <>; 'fawning', 'toady', 'toadies', 'lackey', 'lackies': print "~Must be talking about Virgil or Yekcal,~ sniffs"; randcrowd(); rtrue; 'building', 'society', '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, that the Plumbers Union Building Society in Vechlee has really taken off."; self.Topics = self.Topics | FLAG_x3; if (location == Market_Square or Vechlee_Gate) "You ask a few of the passersby, and finally a woman stops and tells you, ~The Plumbers Union Building Society? We're the only town that has a full one. The Blumph branch is just a small extension branch. It's really taken off, or so I hear,~ she adds, scurrying away."; "You ask a few of the passersby, and finally a frazzled woman stops and tells you, ~The Plumbers Union Building Society? I don't think we have a full one here yet, but I hear plans are in the works. The one in Vechlee has really taken off, or so I hear,~ she adds, scurrying away."; } do { wn = consult_from; bk = ParseToken(SCOPE_TT, AskableScope); } until (bk ~= GPR_REPARSE); if (bk ~= GPR_FAIL) { if (bk.information(self) == true) rtrue; } switch (random(4)) { 1: print "~I wouldn't worry about that, young 'un,~ mutters"; 2: print "~I don't know anything about that,~ confesses"; 3: print "~You probably don't need to worry too much about that,~ advises"; 4: print "~Probably not worth worrying about,~ mutters"; } randcrowd(); rtrue; Attack: "Random crowd violence has a way of tumbling out of 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(4)) { 1: print "her a big kiss. She splutters in alarm, pulls away from you, and hurries off."; 2: print "him a big kiss. He gulps in alarm and hurries off, stealing glances at you over his shoulder."; 3: print "her a big kiss. She blushes a deep red and hurries off."; 4: print "him a big kiss. He blushes a rosy pink and hurries off, stealing glances at you over his shoulder."; } new_line; if (crystal has general) "^~Welllll...~ says ", (the)crystal, ", ~that was oddly random of you.~"; rtrue; Listen: "The crowd buzzes and hums with the rhythm and cadence of many voices."; MeetNPC,Talk: "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."; Take: "Isn't it always the way? There are so many, you can't decide which one you want."; Thank: "No one in the crowd seems to notice or care."; 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 <>; Show: "No one seems terribly impressed."; Tell: "No one seems to pay any interest to you."; ], orders [; MeetNPC: <>; default: "The townspeople clearly have their own priorities."; ], has scenery pluralname; Prop res_district "residential district" with name 'maze' 'houses' 'laneway' 'laneways' 'warren' 'district' 'street', adname 'residenti' 'densely' 'packed' 'densely-p' 'oak', found_in High_Street Oak_Street peak_roof, description [; if (real_location == high_street) "The houses in the residential district form a densely packed warren."; "The densely-packed houses form a complicated maze of twisty little passages."; ], information [person; switch (person) { crystal: "~I don't know a lot about the residential district", (admits)crystal, ". ~I grew up in the Heights a couple of hundred years ago, and I didn't really know anyone from the central area.~"; crone: "The old crone shrugs. ~The residential district's a maze of twisty little passages, all alike. Of course, that's just my opinion.~"; akbar: "~The residential district is a wonderful warren of humanity!~ beams ", (the)akbar, ". ~I live there myself!~"; people: switch (random(6)) { 1: print "~The residential district is a warren of in-bred uncultured louts. If I didn't have errands to run, I wouldn't be caught dead in it,~ sniffs"; 2: print "~It's wonderful! It can be cramped, but we're all so friendly it doesn't matter a bit if we're all jostled together,~ smiles"; 3: print "~The residential district is all right,~ shrugs"; 4: print "~The residential district is better than anything that dump Vechlee has to offer,~ sniffs"; 5: print "~At least not ", (i) "all", " the wizards have had to move into the residential district yet,~ mutters"; 6: print "~I love it! The life, the vibrancy, the constant jostling for position. It reminds me I'm alive!~ smiles"; } randcrowd(); rtrue; betty: print "~I live there myself, you know,~ confides ", (the)betty, ". ~It's a lovely place to live. Everyone's so down to earth, not like those stuck-up Blumph Heights snobs.~^"; if (crystal has general) "^~Hmph, well that's just jealousy talking,~ mutters ", (the)crystal, (string)period; rtrue; hermit: "A bit of a wild look comes into ", (the)hermit, "'s eyes. ~Oh, I love it,~ he protests, fidgeting. ~All those people, crammed into such a small place, living practically on top of each other.~ He grits his teeth. ~It's... wonderful.~"; captain: print_ret (The)captain, " shrugs. ~I don't go there if I can help it,~ he sniffs. ~Too crowded.~"; } rfalse; ], before [; Enter: if (real_location == Oak_Street) <>; if (real_location == High_Street) <>; "Bit of a tall order from up here."; ]; Prop blumph_heights_scen "Blumph Heights road" with name 'housing' 'dwellings' 'hedge' 'hedges' 'mansions' 'heights' 'road' 'ritzy' 'stones' 'cities' 'vechlee', adname 'long' 'blumph' 'white' 'towering' 'meanderin' 'manicured', found_in High_Street Blumph_Heights Park peak_roof, description [; if (real_location == High_Street or Park or peak_roof) { print "Blumph Heights' towering mansions and ritzy dwellings are "; if (real_location == High_Street or peak_roof) "just visible to the southeast, along a long meandering road neatly bordered by manicured hedges and white stones."; "visible to the north, along the tree-lined pathway."; } <>; ], information [person; switch (person) { crystal: "~Blumph is such a beautiful city,~ sighs ", (the)crystal, ". ~Much nicer than Vechlee. I grew up in Blumph Heights, of course, which is the nicest area. That's where most of the professionals live. Except the wizards, of course. They're not really welcome there, in fact,~ she adds."; crone: "~It's all right,~ sniffs ", (the)crone, ", ~but with all that money, you think they'd buy more magic items.~"; akbar: "~Wonderful area!~ cries Akbar warmly. ~And they buy so many carpets!~"; people: switch (random(5)) { 1: print "~Blumph is a dump compared to Vechlee. The Heights are full of snobs, the residential area's full of lowlifes, and the rest of the city's teeming with wizards,~ mutters"; 2: print "~Blumph is great! We've got the dirigible docks to help us stay connected, the Heights--which are beautiful--and all the shops and services you could want in the town market. Who cares about Vechlee?~ smiles"; 3: print "~It's all right,~ shrugs"; 4: print "~Blumph's better than anything that dump Vechlee has to offer,~ sniffs"; 5: print "~It's getting rather shabby since all the wizards moved in,~ mutters"; } randcrowd(); rtrue; betty: "~Oh, I don't involve myself much with that crowd. They bring their laundry in on occasion. Well, I should say, their ", (i) "servants", " bring the laundry in on occasion, and I treat it the same as anybody else's, apart from keeping whatever I find in the pockets instead of returning it.~"; hermit: "~I'll tell you, for all they're a bunch of jumped-up snobs over there in Vechlee, Blumph's townsfolk are no better, with their fancy four-walled houses, their servants, their regular meals...~ He pauses to gaze round the dingy shop. ~Well, maybe they have a good thing going over there,~ he mutters to himself."; captain: "~Oh, I love it there,~ says ", (the)captain, " sarcastically. ~Why do you think I spend so much time at the pub?~"; } rfalse; ], before [; Enter, Go, Use: if (real_location == High_Street) <>; else if (real_location == Park) <>; else if (real_location == peak_roof) "That's a bit difficult from all the way up here."; else <>; ], has objseen; !==================================================================================================================================================== ! Player possessions Askable claim_ticket "laundry claim ticket" with name 'ticket', adname 'laundry' 'claim', description [; "It's an ordinary laundry claim ticket from ", (i) "Betty's Dirty Laundry", " in the marketplace."; ], information [person; switch (person) { crystal: if (self has general) "~I think the claim ticket becomes moot once the laundry's been nicked,~ sighs ", (the)crystal, (string)period; print "~We'll need to show that claim ticket to Betty in order to get Ninny's robes back,~ says ", (the)crystal, (string)period; if (~~((self in player or location) || (self in Rasp_Satchel && Rasp_Satchel in location or player))) " ~We'd better go and find it.~"; new_line; rtrue; betty: if (self has general) "~Well, you've already turned in your ticket, luv, and we don't have anything else of yours here.~"; if ((self in player or location) || (self in Rasp_Satchel && Rasp_Satchel in location or player)) <>; "~You need to show me a claim ticket if you want any of your laundry back, luv,~ says ", (the)betty, (string)period; } rfalse; ], before [; Eat: "If you eat it, you'll have difficulty claiming the robes at the laundry shop."; ]; Askable Rasp_Satchel "raspberry satchel" wizards_way with name 'yogurt' 'satchel' 'lid' 'sack' 'rucksack' 'bag' 'haversack' 'backpack' 'pack' 'strap', adname 'foil' 'shiny' 'raspberry', description [; print "A somewhat battered and faded ", (name)self, ". It's rather fetching, with an odd foil lid that can be pulled over the opening to close it, and a strong sturdy strap for slinging over one's shoulder. The satchel was created from your empty yogurt cup when you got transported into this world last year. It can hold an unlimited number of items."; if (self has open) { print "^^It is currently open"; if (children(self) == 0) " and empty."; print ", revealing "; WriteListFrom(child(self), ENGLISH_BIT); } else print " It is currently closed"; print_ret (string)period; ], initial [; print "Your old friend, ", (the) self; if (children(self) ~= 0) print ", a couple of things stuffed into it"; ", is at your feet.";], information [person; switch (person) { crystal: "~You tell me,~ shrugs ", (the)crystal, " elegantly. ~It's ", (i) "your", " satchel.~"; crone: if (self in player or location) "~Intriguing", (murmurs)crone, ", gazing at the satchel. ~Used, it's worth about 30 plotkins, but I think you'll need the satchel more than you need the money.~"; "~You'd think an apprentice would want to hang on to a valuable item like that instead of leaving it lying around somewhere,~ she mutters."; } rfalse; ], before [loc satloc; Eat: "It only ", (i) "smells", " of raspberries, it isn't actually made of them."; Enter: if (Hoop.dest == Rasp_Satchel) { give hoop general; satloc = parent(Rasp_Satchel); while (parent(satloc) ~= nothing) satloc = parent(satloc); loc = parent(Hoop); while (parent(loc) ~= nothing) loc = parent(loc); print "In an odd twist of reality that your eye can't quite resolve, the satchel grows large around you as you enter. Time and space bend weirdly in upon themselves and you feel a pulsating pressure on all sides. There is a sudden snap of reality and you pop back out into real space, real time.^"; if (Rasp_Satchel notin Purple_Box) move Rasp_Satchel to satloc; loc.hoopsack_arrive = true; PlayerTo(loc); MoveFloatingObjects(); if (hoop.first == 0) { Achieved(13); if (loc ~= vault) { hoop.first = 1; print "^~Wow!~ says ", (the)crystal, ". ~I don't know quite what happened there, but we seem to have ended up passing through to the hoop's location. I'm surprised the snow globe went through to be honest, though I guess you weren't putting it in the satchel, so much as passing it through.~^"; } } rtrue; } "You can't seem to force your way in. There seems to be some kind of invisible resistance."; Receive: if (noun == Hoop) { hoop.dest = self; "You bring the hoop near to ", (the)self, ", but can't quite seem to get it to go in. Both objects glow briefly, however."; } Search: if (self hasnt open) { give self open; print "(opening ", (the) self, " first)^"; } rfalse; Smell: "The interior smells faintly of raspberries."; Taste,Lick: "It has a taste reminiscent of raspberries."; Touch: "The surface has a strange stippled texture."; ThrowAt: if (second == brickhouse) { if (location == peak_roof) { move Rasp_Satchel to alleyway; MoveFloatingObjects(); "You wind up and hurl ", (the)self, " at the brick house. Unfortunately, it's too far. The satchel misses and falls into the alleyway below.^ ^~You know,~ says ", (the)crystal, " conversationally. ~I just don't see this happening.~"; } "It's a good thought, but it's just a bit too far to manage that from here."; } ], 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 (children(self) == 0) ". The satchel is empty."; print ", revealing "; WriteListFrom(child(self), ENGLISH_BIT); print_ret (string)period; Receive: if (noun == autoclimber) { if (autoclimber.attached == true) { print "(pulling the lever to release the grappling hook first)^"; autoclimber.attached = false; } autoclimber.aimed_at = 0; } if (noun == Red_Carpet) "You roll the carpet up and stuff it into the satchel."; if (noun == Broomstick or plank) "Somewhat surprisingly, ", (the)noun, " 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 objseen; Askable -> -> Wizarding_Weekly with name 'edition' 'scroll' 'newspaper' 'wizarding' 'weekly' 'scroll' 'paper' 'rag' 'crumpled', description [; print "A crumpled ", (i) "Wizarding Weekly", ", Vechlee's collection of the latest news, gossip and innuendo in the field of magic. Of course, in these enlightened days, everyone reads Blumph's daily, the ", (i) "Town Tattler.^"; if (address_label in self) "^A peeling address label on the cover dates this edition to about a week after your defeat of the Wizards Guild."; rtrue; ], article "a", short_name [; print "crumpled scroll"; rtrue; ], after [; Examine: give self general; self.short_name = "edition of Wizarding Weekly"; self.article = "an"; ], describe [; new_line; print (A)self, " lies on the "; if (parent(self) has supporter) print (name) parent(self); else if (real_location ofclass Outroom or OutroomV) print "ground"; else print "floor"; " here."; ], information [person; switch (person) { crone: "~It's gone out of business,~ shrugs ", (the)person, ". ~No one was reading it anymore.~"; hermit: "~Journalists!~ mutters ", (the)person, ". ~Always nosing around my mountaintop looking for a story.~"; akbar: "~A curious relic of the bygone era of the wizardly ascendancy!~ cries ", (the)akbar, ". ~I haven't seen a new issue in quite some time.~"; crystal: "~Rather outdated these days", (admits)crystal, ". ~I don't think they publish anymore. The copy you have is about a year old.~"; teller: "~I only read the Tattler nowadays", (admits)teller, ". ~It's the only place to get the real story.~"; captain: print_ret (The)self, " shrugs. ~A wizarding newspaper was never of much interest to me.~"; } ], art_number 0, before [; Eat: "It's called ", (i) "Wizarding Weekly", ", not the ", (i) "Daily Digest", "."; Receive: "You're not certain how that would be helpful."; Open,Read,Search: if (location == thedark) "But it's dark!"; 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 == 8) print "(reading the last article)"; else { if (self.art_number > 8) { print "(flipping back to the first article)"; self.art_number = 1; } else print "(reading the next article)"; } new_line; new_line; font off; glk_set_style(style_User1); switch (self.art_number) { 1: print " ^", " *** CHEESE SHOP REOPENS *** ^", " ^", " Attendees at the Vechlee Victuallers Meeting yesterday were pleased when local ^", " cheesewright Eliza Stilton stood up to announce the reopening of her cheese ^", " shop. Closed by the Wizards Guild for its dangerous scientific approach to ^", " cheese-making, the recent change in atmosphere has allowed Stilton to reopen ^", " without fear of reprisals. ~It was all bunk in any case,~ she said, following ^", " the meeting. ~I don't use any particularly scientific procedures. Renaldo just ^", " didn't like cheese; he's lactose-intolerant. He's lucky he's in hiding, ^", " though. The next time I see him, I'm going to throw a block of Parmesan at ^", " him. Or I would, if I had any stock. Isn't that typical? I spend a week ^", " imprisoned by the Wizards Guild, and when I get out, I find someone has taken ^", " all the cheese I had on hand.~ ^", " ^", " Ninario the wizard has denied involvement in the missing cheese, though ^", " investigators say a localised burst of tyromantic activity last week may ^", " provide an important lead. ^", " ^"; 2: print " ^", " *** VISITORS FLOCK TO MIRACLE ELM *** ^", " ^", " ~I dinnae understand it at all,~ claims Douglas McIntosh, ~but there it is ^", " there.~ McIntosh had just returned to his farm to begin the task of rebuilding ^", " it, and was stunned to discover a huge elm tree overlooking his fence. ~It was ^", " just a small tidy tree a fortnight ago,~ says McIntosh, gazing up at the tree. ^", " ~Things have been a wee bit strange around here with the sudden defeat of the ^", " Wizards Guild, but this takes the cake. The dogs still willnae come out from ^", " under the barn either.~ ^", " ^", " Area resident Ninario the wizard has denied all involvement. ^", " ^"; 3: print " ^", " *** WIZARDS GUILD HALL SERIOUSLY DAMAGED *** ^", " ^", " A massive explosion has destroyed a significant portion of the Wizards Guild ^", " Hall in Vechlee. The cause is currently under investigation, though it is ^", " believed there was a critical gas buildup just prior to the incident. ~Well, ^", " what do you expect when you get a bunch of wizards in close quarters?~ asked ^", " one witness. ^", " ^", " Former Guild prisoner Ninario the wizard has denied all involvement, despite ^", " being spotted on the premises just prior to the incident. ^", " ^"; 4: print " ^", " *** BEAR CLIMBS TREE *** ^", " ^", " Vechlee area farmer Douglas McIntosh, already bemused by the sudden and ^", " inexplicable growth of an elm tree overlooking his property expressed further ^", " surprise last week after unconfirmed reports that a bear had been spotted ^", " climbing the tree. ~You don't see too many bears around here,~ admitted one ^", " unnamed source. ~There's supposed to be a few up on the mountain outside of ^", " Vechlee, but I've never seen one around here before. The really odd thing is, ^", " I could swear it was wearing welding goggles.~ ^", " ^", " Ninario the wizard, an area resident and noted bearskin rug owner has denied ^", " all involvement. ^", " ^"; 5: print " ^", " *** BIZARRE FASHION CRAZE ON CAMPUS *** ^", " ^", " Vechlee, glittering jewel of cosmopolitan fashion, is being blamed for what ^", " parents and professors say is ~off-the-wall accessorising~ taking place among ^", " Oxbridge university students. The students are currently sporting a bizarre ^", " mix of accessories inspired by what they claim has been seen recently on the ^", " streets of Vechlee. ~It's all the rage,~ said student Lewis Roberts, his voice ^", " muffled beneath the bearskin rug he was wearing. ~Absolutely,~ agreed Isobel ^", " Andrews, peering out from under the porcelain chamberpot on her head. ~Vechlee ^", " is a happening place, and any new trends show up there first, but we here at ^", " Oxbridge like to think that while we may not be first with any new fashion, we ^", " embrace it more fervently.~ Sean Phillips, another student, agreed. ~These ^", " things get spotted maybe once or twice in Vechlee, and next thing you know, ^", " we've got it here,~ he said as he adjusted the rusty helmet and goggles ^", " perched on his head. ~We're just as trendy as Vechlee. We know good fashion ^", " when we see it.~ ^", " ^", " At press time, we were unable to find a single sighting of these fashions in ^", " Vechlee itself. ^", " ^", " Vechlee area resident and noted chamberpot user Ninario the wizard has denied ^", " encouraging the fashion craze to raise prices in the used chamberpot market. ^", " ^"; 6: print " ^", " *** PERSONALS *** ^", " ^", " Reward offered for any tips leading to apprehension of cheese thief. Anyone ^", " with knowledge pertaining to the recent spate of cheese-based larceny should ^", " contact Eliza's Cheese Emporium, Vechlee. Slice of Brie offered as reward for ^", " any leads. ^", " ^", (irev) " [Editor's Note: No reward will be offered to those who accuse noted cheese- ^", (irev) " fancier Ninario the wizard as he has already denied any involvement] ^", " ^"; 7: print " ^", " *** OBITUARIES *** ^", " ^", " Overbearing arrogant master seeks lackey to act as errand boy, whipping post, ^", " sycophant, toady and general flunky. Must be willing to live life of abject ^", " drudgery. Some light to medium goonery may also be required. Apply ~Donaldo~, ^", " wreckage of Wizards Guild Hall, midnights. ^", " ^"; 8: print " ^", " *** EDITOR'S NOTES *** ^", " ^", " Ads in the obituaries section are cheaper than personals to allow the bereaved ^", " to mourn their loved ones without undue financial hardship. They are not ^", " cheaper than personals so some unscrupulous characters can put their personal ^", " ads there just to save a few plotkins. We're looking at you, ~Donaldo.~ ^", " ^"; } #Ifdef TARGET_GLULX; glk_set_style(style_Normal); #Ifnot; style roman; font on; new_line; #Endif; rtrue; ], has readable supporter transparent; Askable -> -> -> address_label "address label" with name 'label' 'lable', adname 'address' 'back', article "an", description [; print "It's easy to tell this address label is old: "; if (self in Wizarding_Weekly) print "not only has it started peeling away from the cover, "; print "it shows the address for Ninario's caer just outside Vechlee, instead of his Blumph residence."; if (self notin Wizarding_Weekly) " Even though you've peeled it off, the back still feels quite sticky."; new_line; rtrue; ], information [person; switch (person) { crystal: "~The address level? That's Ninny's old address on there, the caer over near Vechlee?~"; crone: if (self in Wizarding_Weekly or player or location || (self in Rasp_Satchel && Rasp_Satchel in location or player)) "~That's Ninario's old address,~ shrugs ", (the)crone, ". ~Unless you want something delivered to his old place, I don't see what use it is.~"; } rfalse; ], peeltext [; print "You pick gingerly at one corner of the label, freeing it. Then, you slowly and carefully pull the whole label off. It comes off in one glorious piece, intact. The back's still nice and sticky too.^"; if (crystal has general) print "^~Wow,~ says ", (the)crystal, ", sounding impressed. ~If only that skill was marketable.~^"; ], before [; Eat: "Sticky as a modifier for buns: tasty. Sticky as a modifier for labels: not quite so much."; Insert,PutOn: if (second == Wizarding_Weekly) "After all the trouble you went to removing it in one piece? Definitely not."; if (second == licence) { if (licence hasnt general) { licence.sticky = true; "You stick ", (the)self, " briefly to ", (the)licence, ", making it nice and sticky."; } "You don't want to make the picture of your face all gummy."; } rfalse; Take: if (self in vat) "It would be best to leave it where it is now."; rfalse; Touch: if (self notin Wizarding_Weekly) " Even though you've peeled the label off, the back still feels quite sticky."; "Perfectly ordinary feeling address label."; Transfer: if (self hasnt moved) { self.peeltext(); ! put an extra new_line before standard messages new_line; } if (self in vat) "It would be best to leave it where it is now."; rfalse; ], after [; Remove,Take: !if (self in Wizarding_Weekly) { !or Vat) if (self has moved) rfalse; self.peeltext(); if (onotheld_mode == 1 || keep_silent == 1) { new_line; rfalse; } rtrue; ]; Sellable -> -> Red_Carpet "threadbare red carpet" with name 'carpet', adname 'threadbar' 'garish' 'red' 'ugly' 'cheaply' 'made' 'cheaply-m' 'flying', description [; if (self has general) print "While it's still ugly and threadbare, ", (the)akbar, "'s tender ministrations have made a vast improvement. The carpet looks strong enough for at least a couple of trips"; else print "An ugly and cheaply-made carpet. It is a garish red and looks ready to fall apart. If it truly is a flying carpet, you're not certain how many trips it's good for, if any,"; " before disintegrating underneath you."; ], Carpetrepair [; print "I could try to get it back to working condition for you. New, a flying carpet such as this would be worth 1000 plotkins or so. I'm afraid it simply can't be repaired for less than... hmmm, some new thread, strengthen the weave, add some flying enchantment. Let's say ", REPAIR_CARPET, " plotkins. I simply can't go lower than that. Would you like me to repair it for you?~^"; YesNo.Ask(akbar.FixYes,akbar.FixNo, 0); rtrue; ], sale_value 5, shown false, destroyed false, information [person; switch (person) { akbar: if ((self in player or location) || (self in Rasp_Satchel && Rasp_Satchel in player or location)) { if (self in honest_akbars && self.sale_value == BUYFIX_CARPET) "~A rare collectible!~ cries ", (the)akbar, ". ~This classically-made flying carpet is constructed using the finest...~ He pauses and his sales pitch falters for a second. ~... Jufti knots, can be yours for a mere ", self.sale_value, " plotkins. It's newly repaired, and in tip-top shape.~"; if (Red_Carpet has general) "~Wonderful repair job, isn't it?~ beams ", (the)akbar, (string)period; if (Red_Carpet.shown == false) { Red_Carpet.shown = true; print "~Ah!~ cries ", (the)akbar, " as he sees the carpet. ~I recognise this carpet! This is the carpet my uncle gave you when you landed in his flying carpet convoy? But no, that can't be right. He said he gave you the best one in the shop! Hmm. Well, you've certainly been using it quite a bit, haven't you?~^^He"; } else { print (The)akbar; } print " sighs as he examines the carpet critically. ~It's in a rather sorry state, but "; return self.Carpetrepair(); } if (self has general) "~I'm sure it's working out well for you after those extensive repairs!~ beams ", (the) akbar, (string)period; "~A threadbare red carpet? Well, bring it in and we'll see if we can repair it!~ beams ", (the)akbar, (string)period; crone: if (self in case) "~Ah, your discerning eye has spotted the value hidden in this threadbare red carpet. A rare and valued ", (the)akbar, " original. A bargain at only ", self.sale_value, " plotkins.~"; if (~~((self in player or location) || (self in Rasp_Satchel && Rasp_Satchel in player or location))) "~Carpet?~ says ", (the)crone, ". ~Maybe you want Honest Akbar's. They're the carpet people.~"; print "~Huh,~ mutters ", (the)crone, ", looking with distaste at the carpet. ~Pretty ratty-looking magic carpet, but "; if (self has general) "it looks functional. Worth about ", self.sale_value, " plotkins.~"; "I'd give you ", self.sale_value, " plotkins for it. Maybe Honest Akbar can repair it for me.~"; crystal: if (self in case) "~Probably just as well you sold it,~ sighs ", (the)crystal, ". ~It didn't look long for this world.~"; if (self has general) "~Well, I suppose as long as we only ever need to travel downslope, it's all right,~ says ", (the)crystal, " dubiously."; "~I don't know that I'd trust that ratty old carpet to get me anywhere,~ says ", (the)crystal, " doubtfully."; people: if (TestScope(self)) { if (self has general) { switch (random(5)) { 1: print "~Might last for a few rides,~ shrugs"; 2: print "~Well, as long as you only need to go downhill,~ mutters"; 3: print "~Repaired or not, I wouldn't set foot on it,~ confesses"; 4: print "~More shoddy possessions from Ninario, the wizard of shabbiness. Everything he owns is threadbare,~ declares"; 5: print "~Oh, Ninny's had his carpet fixed? I still haven't recovered from the last time he gave me a lift home,~ complains"; } } else switch (random(5)) { 1: print "~Maybe you should take that to Honest Akbar's in the marketplace,~ suggests"; 2: print "~I wouldn't trust one of those to carry ", (i) "me", ",~ says"; 3: print "~It looks a little worse for wear. Have you tried Honest Akbar's?~ asks"; 4: print "~It looks in need of repair,~ says"; 5: print "~Pretty shabby. Must be Ninario's,~ mutters"; } randcrowd(); rtrue; } hermit: "~Carpets aren't my line,~ declares ", (the)hermit, ". ~You should talk to Honest Akbar in the high street.~"; captain: return honest_akbars_scen.information(captain); } rfalse; ], describe [; print "^A ", (name)self, " lies across the "; if (location == Tower_Roof) print "tower floor"; else if (parent(self) has supporter) print (name) parent(self); else if (real_location ofclass Outroom or OutroomV) 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; ], CarpetNo [; "~Right,~ nods ", (the)crystal, ". ~That's only in living rooms of white houses.~"; ], CarpetYes [; "~Huh,~ says ", (the)crystal, " sounding surprised. ~I thought that only worked in the living room.~"; ], react_before [; Fly: if (self in location && second == nothing) { <>; } ], before [obj; Enter,Fly: if (self notin location) { print "The carpet needs to be on the "; if (location == peak_roof) print "roof"; else if (location ofclass Outroom or OutroomV) print "ground"; else print "floor"; " in order for you to do that."; } Lift,LookUnder,Pull,Push: if (self notin location) { print "The carpet needs to be on the "; if (location == peak_roof) print "roof"; else if (location ofclass Outroom or OutroomV) 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 (Testscope(akbar)) "^~Excellent!~ cries ", (the)akbar, ". ~You're one-third of the way to finding the secret passage to the cellar. All I need now is a trapdoor. And a cellar.~"; if (Testscope(crone)) "^~No trapdoors here, my dear,~ sighs ", (the)crone, ". ~But when I get one installed, you'll be the first to know.~^"; if (Testscope(betty)) "^~Ah,~ says ", (the)betty, ". ~So that's where the floor was hiding.~"; if (Testscope(hermit)) "^~Hey, neat! The floor!~ cries ", (the)hermit, ", sounding a tad sarcastic."; if (Testscope(teller)) print_ret (The) teller, " eyes you nervously, clearly not wanting to interfere with an airship captain, no matter how odd the behaviour."; if (crystal has general) { print "^~Do things usually appear under it when you do that?~ asks ", (the)crystal, " curiously.^"; YesNo.Ask(self.CarpetYes,self.CarpetNo,0); } rtrue; PutOn: if (second == Trapdoor) { "You indulge yourself by placing ", (the) self, " over the trapdoor, simply for the thrill of pulling it back and seeing the trapdoor. How exciting!^^~Oh wow, that's great!~ cries ", (the)crystal, " with mock enthusiasm. ~Still, better not do that again or we might just blow up with excitement!~"; } Receive: if (self notin location) "The carpet needs to be on the ground in order for you to do that."; Ride: <>; Take: if (self in honest_akbars && self.sale_value == BUYFIX_CARPET) "~No, no!~ smiles ", (the)akbar, ". ~Payment first, flying carpet second.~"; 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; } } Transfer: if (self in honest_akbars && self.sale_value == BUYFIX_CARPET) "~No, no!~ smiles ", (the)akbar, ". ~Payment first, flying carpet second.~"; Tie: if (self has general) "But it's already been repaired.^^~For mercy's sake, don't fiddle with it,~ says", (saysharp)crystal, ". ~It's delicate enough without you poking and prodding at it.~"; if (Testscope(akbar)) { akbar.FixYes(); rtrue; } print "You're not entirely certain how to fix the carpet.^"; if (crystal has general) "^~What we need", (murmurs)crystal, ", ~is some sort of rug doctor.~"; rtrue; ], after [; Drop: print "You lay ", (the)self, " across the "; if (location == peak_roof) print "roof."; else if (location ofclass Outroom or OutroomV) print "ground."; else print "floor."; if (Testscope(guard)) print_ret "^^", (The)guard, " scowls down at you. ~Ah'm fixed t'thee, young'un~ he mutters."; if (Testscope(crone)) "^^~Great,~, mutters ", (the)crone, ". ~It will soak up all the damp from the floor.~"; if (Testscope(akbar)) "^^~Ah, wonderful!~ cries ", (the)akbar, ", trying manfully to smile, but wincing visibly as he sees the tattered carpet. ~What a lovely idea to brighten up the shop, but in case you hadn't noticed, we have our own lovely selection of rugs and carpets. Perhaps you'd like to purchase one to replace yours, undeniably unique though it is.~"; if (Testscope(betty)) "^^~No,~ ", (the)betty, " says, shaking her head. ~Please don't leave that ratty old thing here.~"; if (Testscope(Hermit)) "^^~Hey, that's not bad", (murmurs)hermit, ". ~I mean, it's hideous, but at least it gives this dump a bit of class.~"; if (Testscope(teller)) "^^~Oh... oh dear", (murmurs)teller, ". ~I don't know think that's quite the look we want in the building society, captain.~"; if (crystal has general) "^^~Lovely!~ smiles ", (the)crystal, ". ~Now all we need to do is hang some curtains.~ She rolls her eyes a bit theatrically."; new_line; rtrue; Enter: if (self hasnt general) { print "You get on ", (the)self, ". The edges flutter weakly and then the carpet seems to give up.^"; if (crystal has general) print "^~I think it's broken,~ declares ", (the)crystal, ". ~You didn't let Ninny near it, did you?~^"; rtrue; } if (location == peak_roof) { print "You step onto ", (the)self, ".^^The carpet shudders weakly under you, nearly tipping you off, but you hang on as it drifts slowly towards the edge of the roof. ^^It stops there briefly, as though summoning its meagre reserves of strength and leaps mightily off the edge of the roof. ^^The air rushes by you as the carpet does not so much fly as plunge towards the roof of the brick house, barely managing to clear the alley.^^You feel the threadbare carpet shredding apart around as, with a mighty crash, it smashes through the roof, depositing you on the second floor of the brick house.^"; #Ifdef SOUND_ENABLED; PlaySound(brickroof); #Endif; self.destroyed = true; remove(self); PlayerTo(second_brick); MoveFloatingObjects(); rtrue; } if (real_location provides Carpet_Go) { print "You step onto ", (the)self, ".^ ^The edges flutter and then begin to wave and the carpet hauls itself labouriously into the air!^"; if (crystal has general) print "^~Goodness me!~ says ", (the)crystal, " in surprise. ~It actually works!~^"; print "^The carpet shudders weakly under you, nearly tipping you off, but you hang on as the carpet drifts lazily downwards with the wind, following the path of least resistance.^^Slowly but surely it drifts into a new area, veering up at the last instant, and settling down with a bone-jarring thump that rattles your teeth in your head.^"; if (crystal has general) print "^~I think it would have been faster walking here,~ mutters ", (the)crystal, " as y"; else print "Y"; print "ou survey your new surroundings.^"; location.Carpet_Go(); move Red_Carpet to location; move player to Red_Carpet; MoveFloatingObjects(); rtrue; } else { print "You get on ", (the)self, ". The edges flutter briefly but nothing else happens.^"; if (crystal has general) { print "^~Oh,~ says ", (the)crystal, " disappointedly. ~I thought it was going to work for a second there. "; if (real_location ofclass Outroom or OutroomV) print "I guess this is one of those certain locations he mentioned.~^"; else print "Maybe it would work better outdoors.~^"; } rtrue; } ], has enterable supporter; Cheese -> -> Zamorano "Zamorano" with name 'zamo' 'zamorano' 'zomarona' 'zomorona' 'zomarano' 'zamoro', invent [; print "a piece of Zamorano"; if (self.visionnum ~= 0) { PrintShortVision(self.visionnum); } rtrue; ], description [; print "A hard sheep's milk cheese, pale yellow in colour with a crumbly texture. The zigzag pattern makes it appear similar to Castellano or Manchego."; if (self.visionnum ~= 0) { PrintVision(self.visionnum); } new_line; rtrue; ], before [; Eat,Lick,Taste: print_ret (The) self, " has a savoury buttery and nutty flavour that's very distinctive, with just a hint of piquant notes. You take just a small nibble."; Smell: "The aroma contains hints of lanolin and butterscotch, along with dried nuts and fruits."; Touch: print_ret (The) self, " has a very firm texture, with small uniform holes dotted throughout."; ]; Askable myselfobj "(self object)" with short_name [; return L__M(##Miscellany, 18); ], description [; return L__M(##Miscellany, 19); ], before NULL, after NULL, life NULL, each_turn NULL, time_out NULL, describe NULL, add_to_scope 0, capacity 14, parse_name 0, orders 0, number 0, before_implicit NULL, react_before [obj; Open: objectloop(obj ofclass Askable && obj in noun) { give obj objseen; } ], information [person; switch (person) { betty: print_ret (The) self, " smiles at you. ~I suppose I should be angry with you for defeating the Wizards Guild and driving Wizardry Wooding out of business, but really, we're much better off without the Guild. In fact, I owe you some thanks.~"; hermit: "~You? You're the one that helped bring down the Wizards Guild. And got me off my mountaintop by giving me those goggles, as well.~"; akbar: "~You?~ cries ", (the)akbar, ". ~You are the best customer a humble merchant ever had, one who I'm sure is about to buy a very expensive carpet!~"; captain: "~You're the person keeping me from enjoying my drink, and that's all that matters,~ growls ", (the)captain, (string)period; crystal: print "~I don't really know too much about you, except what "; if (crystal.Topics & FLAG_x2 == FLAG_x2) print "you and "; "Ninny filled me in with. I've spent a lot of the last couple of years stuck in a chest full of linen.~"; crone: if (crone.Topics & FLAG_x10 == FLAG_x10) print (The) crone, " sighs. ~I already told you, "; else print (The) crone, " shrugs her shoulders. ~"; crone.Topics = crone.Topics | FLAG_x10; print_ret "I know what everybody knows, my dear. You're Ninario's apprentice, you helped defeat the Wizards Guild, and you're a dab hand at tyromancy.~"; teller: "~I'm afraid I don't know a great deal about you, captain", (admits)teller, "."; } rfalse; ], has concealed animate proper transparent objseen; Askable -> magic_clothes "long flowing robes" with name 'robe' 'robes' 'clothes' 'clothing' 'arm' 'arms' 'leg' 'legs' 'silk' 'moon' 'stars' 'pattern', adname 'long' 'flowing' 'black' 'silk', description [; print "Although you're only in the first-year program at Oxbridge, playing catch-up to younger apprentices, your status as one who helped defeat the Wizards Guild entitles you to wear the fancy black silk robes with the moon and stars highlights. "; if (self in player) print "Thank goodness they're not available in the rabbit pattern, or Ninario would have had you wearing those.^"; else print "They look a bit small on the tall airship captain, but you figure that will be the least of his worries.^"; if (crystal has general) { new_line; self.information(crystal); } rtrue; ], information [person; switch (person) { crystal: if (self in player) "~Those senior robes certainly suit you,~ says ", (the)crystal, " somewhat wistfully. She glances down at her own attire. ~Ninny keeps promising to update the wardrobe in here. One outfit doesn't really suffice, even in this sterile environment.~"; "~That captain's in for a bit of a surprise when he wakes up,~", (giggles)crystal, (string)period; crone: if (self in player) "~They're fine,~ shrugs ", (the)crone, ". ~Make you look a bit more dignified.~"; "~Yes, well, you seem to have lost them somewhere along the way", (murmurs)crone, ", ~and become an airship captain into the bargain.~"; people: if (self in player) { switch (random(5)) { 1: print "~Apprentice's robes. Hardly the real thing,~ mutters"; 2: print "~Don't talk to me about wizards and their robes,~ mutters"; 3: print "~An apprentice's robes should really match his wizard's,~ sniffs"; 4: print "~All the apprentice robes look the same to me,~ shrugs"; 5: print "~Lovely pattern!~ smiles"; } randcrowd(); rtrue; } "The crowd is abuzz with tales of a drunken student sleeping in an alley behind the dockside pub."; akbar: if (self in player) "~Your silk robes?~ asks ", (the)akbar, ". ~Just think how incredible you would look sailing through the air on a brand new rug or carpet with them sailing out behind you!~"; "~Silk robes? No, we don't carry them,~ sighs ", (the)akbar, ", shaking his head. ~On the other hand, we do have a fine selection of rugs and carpets to choose from!~"; captain: "~Robes?~ grunts ", (the)captain, ". ~No thanks, I wouldn't be caught dead drunk in them. Give me a captain's uniform every time.~"; } rfalse; ], before [; Disrobe,Transfer: "Let's leave everybody's clothes where they belong for now."; Rub: "They're fairly clean already."; Smell: <>; Take: if (self in captain) "~No more changing clothes, please!~ announces ", (the)crystal, ". ~Let's just leave things as they are.~"; rfalse; Touch: "They're silky and cool to the touch."; ], has worn clothing pluralname objseen; Askable -> slippers "slippers" with name 'slippers' 'feet', adname 'magician^', description "A soft and comfortable pair of magician's slippers, with the big upturned toes. You've been wearing slippers like these since Ninario first introduced you to them. Comfortable, warm and a clear statement of your magical affiliations.", article "a pair of", before [; Eat: "You doubt you could manage to slip them down your throat."; Rub: "They're fairly clean already, but you give them a bit of a buff. After all, cleanliness is good for the sole."; Smell: "The sweet smell of supple leather."; Touch: "They're soft and cool to the touch."; Wear: if (boots has worn && boots in player) { print "(removing the boots first and exposing your filthy socks)^"; give boots ~worn; } rfalse; ], information [person; if ((slippers in player or location) || (slippers in Rasp_Satchel && Rasp_Satchel in player or location)) { switch (person) { crystal: if (self has worn) "~They really make you look like a real wizard,~ smiles ", (the)crystal, ". ~And they certainly look comfy too.~"; if (boots has worn && boots in player) "~They looked better on you than the boots do,~ says ", (the)crystal, ", ~but needs must.~"; "~They really made you look like a real wizard,~ smiles ", (the)crystal, ". ~And they certainly looked comfy too.~"; crone: "~We normally sell magician's slippers, but we're all out at the moment. I see you have some, so I suppose that's all right.~"; people: switch (random(6)) { 1: print "~Comfy, aren't they?~ smiles"; 2: print "~They make you look like a drunken courtier,~ mumbles"; 3: print "~How lovely!~ cries"; 4: print "~Best slippers in the world,~ declares"; 5: print "~Ridiculous, aren't they?~ asks"; 6: print "~Hmph. Those used to be made exclusively by the Wizards Guild in sweat shops. I hope yours weren't,~ sniffs"; } randcrowd(); rtrue; } } switch (person) { crystal: "~They really made you look like a real wizard,~ smiles ", (the)crystal, ". ~And they certainly looked comfy too.~"; crone: "~I'm afraid we're all out of magician's slippers at the moment", (murmurs)crone, ", ~but I'll let you and Ninario know the moment a new shipment comes in.~"; } rfalse; ], SockNo [; print_ret (the)crystal, " sighs. ~Well, I suppose it's too late to go get a cleaner pair anyway.~"; ], SockYes [; print_ret (the)crystal, " sighs. ~Well, you're shaping up to be wizard material in the cleanliness department.~"; ], after [; Disrobe: print "You slide your feet out of the slippers.^"; move socks to player; give socks worn; give socks objseen; MoveFloatingObjects(); if (crystal has general) { print "^~Is that the cleanest pair of socks you had?~ asks ", (the)crystal, " critically.^"; YesNo.Ask(self.SockYes,self.SockNo,0); } rtrue; Wear: remove socks; MoveFloatingObjects(); print "You slip your feet into the slippers, removing the filthy socks from the scrutiny of the world.^"; if (crystal has general) { print "^~That's much better", (murmurs)crystal, ". ~Let's keep those socks out of sight.~^"; } rtrue; ], has worn clothing pluralname; Askable -> ball "cheap glass snow globe" with name 'ball' 'bubble' 'strip' 'snowglobe' 'globe', adname 'misshappe' 'cheap' 'glass' 'cloudy' 'string' 'looped' 'snow', description [; print "A snow globe made out of cheap, cloudy glass. Its roundness is rather more optimistic than actual; there are obvious deficiencies in its shape. A looped string runs through the ball, presumably intended for hanging around one's neck.^"; new_line; <>; ], shake 0, Topics 0, dtime 0, daemon [; self.dtime++; if (self.dtime == 1) { "^~Now, let's just see here,~ mutters ", (the)crystal, " to herself. ~Set minimum luminance, increase output level, increase brightness pulse-width modulator...~"; } if (self.dtime == 2) { StopDaemon(self); self.dtime = 0; #Ifdef SOUND_ENABLED; PlaySound(camera); #Endif; print "^~All right, I think I've got it,~ says ", (the)crystal, ". ~Watch this!~^ ^There is a popping noise followed by a blinding glare of white light. As your eyes struggle to adjust, the light dims to a more reasonable level, and you see that ", (the)crystal, "'s snow globe is now quite usable as a light source.^"; if (location == thedark) print "^She glances around. ~That's much better, isn't it?~"; else print "^She glances around. ~Oh. You seem to have moved. Well that's all right, we're ready for next time.~"; give self light; new_line; MoveFloatingObjects(); rtrue; } rtrue; ], information [person; switch (person) { hermit: "~That's a right pretty thing,~ muses ", (the)person, ", ~but not really something I'd carry in my shop.~"; crystal: "She scowls. ~They couldn't even spring for something classy. All the other pretty young girls in my class were being detained in diamond, stuck in sapphire, incarcerated in iolite... I had this friend Amber who was abandoned in, well, amber. Even that would have been better than this cheap glass bubble. Stickier, but pleasanter. I mean, this ball isn't even round.~"; people: switch (random(7)) { 1: print "~A dime a dozen in the marketplace,~ mutters"; 2: print "~Typical cheap glass novelty item,~ shrugs"; 3: print "~How lovely!~ cries"; 4: print "~Not much I can tell you, I'm afraid,~ shrugs"; 5: print "~Exquisite!~ murmurs"; 6: print "~Wonderful detail,~ murmurs"; 7: print "~Run of the mill tourist fare,~ sniffs"; } randcrowd(); rtrue; crone: Crone.Ballask(); Crone.Postball(); rtrue; captain: "~Cheap wizardly frippery,~ grunts ", (the)captain, ", looking at the snow globe."; teller: "~A lovely little piece, captain,~ smiles ", (the)teller, ", looking at the snow globe."; } rfalse; ], invent [; if (inventory_stage == 2) { if (self has worn) print " (being worn)"; rtrue; } ], after [; Wear: "You hang the glass ball around your neck."; ], each_turn [; if (snow.snowfall == 0 && crystal hasnt general) { if (turns == 1) "^That's funny. Something in the glass ball just moved."; if (turns == 3) "^Strange things are definitely happening in the glass ball. You can just see them out of the corner of your eye."; if (turns == 5) { print "^You definitely saw something in the ball that time! Intrigued, you peer in at the idyllic winter scene, and the small figurine, but oddly, nothing further seems to be happening.^ ^Curious, you give the ball a quick experimental shake, sending the snow flying through the air. ~Oh bother!~ you hear a tiny feminine voice mutter in the silence of your mind.^"; snow.snowfall = 1; Achieved(0); StartDaemon(snow); rtrue; } } ], before [; Attack, Use: if (verb_word == 'shake' or 'use' or 'wave') { if (Testscope(crone)) if (saddle in case) "The old crone's bony fingers clamp down on your wrist in a vice-like grip. ~Not so fast, my young apprentice. I can't exactly remember what happened last time you pulled that stunt, but I've acquired some new merchandise that I don't remember purchasing, so no more snow globe activity in my shop, if you please.~"; if (snow.snowfall ~= 0 && snow.snowfall < 3) "You decide to let the snow settle before giving ", (the) self, " another shake."; if (snow.snowfall ~= 0) ! it must be 4 or 5 "You decide to let the funny feeling subside before giving ", (the) self, " another shake."; if (crystal hasnt general) { Achieved(0); StartDaemon(snow); "You give the ball a hearty shake, sending the snow flying through the air. ~Oh bother!~ you hear a tiny feminine voice mutter in the silence of your mind."; } StartDaemon(snow); if (self.shake == 2) "~I hope there's a good reason for all this,~ moans ", (the)crystal, " as you give the globe a hearty shake. ~My poor stomach.~"; if (self.shake == 1) print "~Here we go again!~ sighs ", (the)crystal, " as you give the ball a hearty shake, sending the snow flying through the air.^"; if (self.shake == 0) { Achieved(0); print "~No!~ squeals ", (the)crystal, " as you give the ball a hearty shake, sending the snow flying through the air. ~I just managed to get my hair dry!~^"; } self.shake++; rtrue; } if (crystal has general) "~Don't you dare!~ cries ", (the)crystal, ". ~I don't want to return to the world as a tiny, exquisitely formed figurine. If you can't get me out of here at the size I went in, forget it!~"; "The glass is certainly cheap, but you're not sure that would affect it in any case."; Empty: "Unfortunately, as the glass ball is sealed, that's going to be difficult."; Insert, Drop, Transfer: print "~Oooh!~ squeals "; if (crystal has general) print (the)crystal, " in such indignation that you change"; else print "a voice in the silence of"; print " your mind. ~Don't even ", (i) "think", " about doing that"; if (self hasnt worn) print ". That's what the string is for. Hang me around your neck"; if (second == Rasp_Satchel or Hoop) print ". And don't ", (i) "ever", " put me into a bag of holding, interplanar rift, or interdimensional portal of any kind. The spell used to miniaturise me can't be mixed with anything like that. You'll destroy both if you do that"; else print ". I want to watch what's going on"; print ".~^"; if (crystal has general) { if (self hasnt worn) { give self worn; print "^You hang ", (the) self, " around your neck, feeling just a bit self-conscious.^"; } } else { print "^Intrigued, you "; if (self hasnt worn) { give self worn; print "hang ", (the) self, " around your neck and "; } print "voice a hesitant hello.^^"; <>; } rtrue; Listen: <>; PutOn: print "But that would obscure the lovely scene inside!^"; if (crystal has general) "^~No stickers on the globe,~ says ", (the)crystal, " firmly."; Search: print "Inside the ball is an idyllic winter scene. There's a small, exquisitely formed cottage, the figure of a well-dressed young girl standing outside it. White powdery snow "; if (snow.snowfall == 0) "lines the ground."; "falls gently around the cottage."; Show: if (second == ptero) rfalse; <>; Smell: print (The) self, " gives off a sweet hint of honey.^"; if (crystal has general) "^~Isn't that lovely?~ smiles ", (the)crystal, " as you breathe it in. ~Ninny's been keeping me next to beeswax candles.~"; rtrue; Talk: <>; Tie: "You wouldn't know where to start."; Touch: "The ball seems just a bit cold to the touch."; ], react_before [; if (location == thedark && self.dtime == 0 && crystal.out == 0) StartDaemon(self); ], has transparent clothing; Prop -> -> deficiencies "deficiencies" with name 'deficienc' 'crack' 'cracks' 'shape' 'round' 'airtight', description "It's unclear whether the strange shape of the glass ball is the result of poor construction or lack of care over the years. One side of it definitely looks like it was placed too close to a fire for too long.", article "some", information [person; switch (person) { crystal: "~What do you expect for cheap glass? Though most of the damage came when Ninny dropped me in the fire.~"; } ], before [; Examine: rfalse; default: "The deficiencies are very interesting, but hardly deserving of this much of your time or attention."; ], has pluralname concealed; Prop -> -> cottage "cottage" with name 'cottage', adname 'small' 'sturdy' 'charming', description "The cottage is small and sturdy, very charming.", information [person; switch (person) { crystal: "~Nice, isn't it? Ninny couldn't break the spell and get me out alive, but he managed to get this miniature cottage in here for me. Before that, it was just me and the snow,~ she sighs. ~Not too interesting.~^^She pauses. ~It's a pity you're out there, or I could show you around. I've done some impressive things with the curtains.~"; } ], before [; Examine: rfalse; default: "As it's all encased inside the glass bubble, there's not really a lot you can do with it right now."; ], has concealed; Prop -> -> snow "snow" with name 'snow' 'scene', adname 'cold' 'idyllic' 'winter', description [; print "The snow "; if (self.snowfall == 0 || self.snowfall > 3) print "surrounds"; else print "cascades down around"; " the small sturdy cottage, looking very real. In fact, the ball even seems a bit cold to the touch."; ], information [person; switch (person) { crystal: "~You get used to it,~ shrugs ", (the)crystal, ". ~At least it's not raining.~"; } ], before [; Examine: rfalse; Wear: <>; default: "As it's all encased inside the glass bubble, there's not really a lot you can do with it right now."; ], snowfall 0, daemon [obj; self.snowfall++; if (self.snowfall == 4) { objectloop(obj ofclass NPC) if (obj.mesmer ~= 0) obj.mesmer = 4; "^You still feel a bit dazed and uncertain of your surroundings."; } if (self.snowfall == 5) { StopDaemon(self); self.snowfall = 0; ! if NPC saw any of the snow falling, i.e. mesmer ~= 0, ! then set it to 5 so we see the last message objectloop(obj ofclass NPC) if (obj.mesmer ~= 0) obj.mesmer = 5; "^The funny feeling from the snow globe subsides, and you feel like yourself again."; } ! we set .mesmer if the snow is actually falling while ! he or she is present. Otherwise, we could start shaking the ! ball and then move to NPC location once the snow stops, and ! they spit out their affected messages, even though they ! didn't see the snow falling. if (self.snowfall == 3) { objectloop(obj ofclass NPC) { if (Testscope(obj)) obj.mesmer++; } print "^The mesmerising spectacle in the globe ends as the snow stops falling, settling gently to the ground."; if (crystal hasnt general) { print " ~Thank goodness!~ mutters someone into the silence of your mind.^^You voice a hesitant hello.^^"; <>; } } else if (self.snowfall == 1) { objectloop(obj ofclass NPC) { if (Testscope(obj)) obj.mesmer++; } print "^The snow presents a mesmerising spectacle as it drifts down around the cottage. The effect is dazzling, and seems to stay with you, bathing everything you see in a glowing magical light."; } else if (self.snowfall == 2) { objectloop(obj ofclass NPC) { if (Testscope(obj)) obj.mesmer++; } print "^The snow continues to cascade down around the cottage. The snow seems to dazzle you, and leaves you feeling a bit funny and unsure of your surroundings."; } if (crystal hasnt general) { if (self.snowfall == 1) "^^That's funny. You could have sworn that figurine didn't have her hood pulled up a second ago."; " To your amazement, you notice the girl in the glass ball stamping her feet and shaking snow out of her hair."; } new_line; rtrue; ], has concealed; ! FLAG_x1 x2 x3 x4 x5 x6 (shed) NPC -> -> crystal with name 'figure' 'figurine' 'gril' 'girl' 'hair' 'eyes' 'crystal' 'xtal' 'cloak' 'hood' 'attire' 'clothes', adname 'beautiful' 'chestnut' 'engaging' 'crystal^s' 'smart-loo' 'young', description [; if (crystal.out == 0) "Though tiny, ", (the)self, "'s exquisite perfection is complete. She has beautiful chestnut hair, glowing eyes, and an engaging smile. She's wearing a smart-looking cloak and hood, good protection against snow and rain."; "Restored to her proper size, Crystal's chestnut hair frames her face. Her eyes are closed and she looks peaceful and composed."; ], out 0, commentary false, short_name "figurine", describe [; if (self.out > 0) { if (Garden_Vision.vision == true) print "^You seem to be occupying a version of yourself in this vision, as you're kneeling amongst the flowers."; else print "^You kneel here amongst the many flowers."; print " Crystal, restored to her proper size, lies with her head in your lap. She "; if (crystal.out == 2) "looks peaceful and composed, her eyes closed in peace."; "seems in great pain, but smiles up at you contentedly."; } rtrue; ], react_before [; if (globalvision == false) rfalse; Answer,Consult,ItemAsk,MeetNPC,Tell,Talk,MeetNPC: if (noun == crystal) rfalse; "No one seems to be able to hear you in this vision."; Listen: "You listen closely. Fortunately, this is one of those fancy new visions with light ", (i) "and", " sound. It's a significant upgrade from the black and white line drawing visions of yesteryear."; Cash,Examine,Inv,InvTall,InvWide,Look,Read,Search,Wait,Xyzzy: rfalse; default: print "Unfortunately, as this is a vision, there's not much you can do other than watch and wait"; if (location == Garden_Vision) ". You can't even talk to the snow globe version of Crystal, as, oddly, she doesn't seem to be sharing the vision with you."; ". Or talk to ", (the)crystal, ", who seems to be sharing the vision with you."; ], crytime 0, dino false, each_turn [; if (crystal.out == 0) { if (crystal.dino == true) { crystal.dino = false; ! Make sure we haven't read this another way in the meantime. if (tattler.dinoread == false) crystal_dino(); } if (location provides crystalvisit && crystal.commentary == true && location.crystalvisit == false && globalvision == false) { location.crystalvisit = true; switch (location) { thedark: rfalse; High_Street: "^~The Blumph high street,~ announces ", (the)crystal, ". ~The glittering hub of commercialism. To the east is Conjuring Commodities, run by the old crone who used to run Sorcery Supply. Honest Akbar's is north. He sells rugs and carpets and actually is an honest salesperson.~ She glances skyward. ~And above, you can see the graceful lines of an airship's anchor cable. That's rather odd. Not a normal feature of this area.~"; conj_commod: "^~Dark, isn't it?~ murmurs ", (the)crystal, ". ~I never went to her shop in Vechlee, but I imagine it was much the same. You bought a tyromancy scrying bowl there, didn't you? Whatever happened to that thing? It could be useful if we find a lot of cheese.~"; honest_akbars: "^~Lots of stock,~ says ", (the)crystal, " in surprise looking around the shop. ~Now listen, Honest Akbar is very nice, but also very convincing. Don't buy anything you don't want to.~"; lonely_supply: "^~This is the hermit you met last year, the one living on the mountaintop?~ asks ", (the)crystal, ". She gazes around the dingy shop. ~I can appreciate that may have been a miserable existence, but this doesn't look much better.~"; Shops: "^~These are the less-glitzy shops,~ says ", (the)crystal, ". ~That laundry place to the west is where we have to take Ninny's claim ticket. I'm not certain what that place to the south is, I've never been in there.~"; dirty_laundry: "^~Betty's been running this little shop since her Wizardry Wooding shop in Vechlee went out of business,~ confides ", (the)crystal, ". ~She handles all sorts of clothes, but specialises in wizardly robes. Her mother works here too but never comes out of the back room. And I keep thinking there's some very odd things going on with the two of them... very strange.~"; Pier: "^~The pier is a lovely place to bring the family for a nice afternoon,~ smiles ", (the)crystal, " glancing around. ~Oh, look, a lumen graphicae booth! That's new!~"; airship_bridge: "^~A real live airship bridge!~ says ", (the)crystal, " triumphantly, gazing around. ~I didn't think we'd ever make it in here, to be honest. And look at that view!~ she breathes, looking out the window."; Dir_Docks: "^~This is just the docking area for airships,~ says ", (the)crystal, ". ~They usually fly out early in the morning if they've got a flight scheduled for that day.~"; Pub: "^~Ugh,~ says ", (the)crystal, " looking around. ~I'm not a teetotaller, but who's ready to start drinking at this time of day?~ She glances at the table. ~Oh, airship captains. Of course.~"; Terrace: print "^~This used to be an area with tables and everything,~ says ", (the)crystal, ". ~In fact, it was really quite nice. But it turns out that most of Blumph's really hard-core drinkers shun the light. So now they just store beer barrels here."; if (captain in location) " And airship captains,~ she adds, glancing down at the supine form on the ground."; else "~"; Blumph_Heights: "^~Isn't it lovely?~ smiles ", (the)crystal, ", gazing around. ~It really hasn't changed much since I lived here, even though it's been two hundred years.~"; Manor_Grounds: "^~They're lovely grounds, aren't they?~ asks ", (the)crystal, ". ~This house has been here a long time, but I can't remember who built it originally.~"; Inside_Manor: "^~Lovely isn't it?~ whispers ", (the)crystal, ". ~But very still and quiet! He must live alone. Well at least he won't catch it about being found passed out behind a pub when he gets home.~"; Park: "^~This park's been here a long time too,~ sighs ", (the)crystal, ". ~I just love it. It was a lot wilder back in my day. Well, I say that, but we certainly didn't have any pterosaurs.~"; Alleyway: "^~Ooh, a drainpipe,~ says ", (the)crystal, ". ~I wonder if we could get up that way.~"; Oak_Street: "^~I've never been down here before,~ admits ", (the)crystal, ". ~It certainly gives one a cramped feeling, doesn't it?~"; drain1: "^~Goodness me, this does not feel safe,~ mutters ", (the)crystal, ". ~Keep moving.~"; second_brick: "^~You are ", (i) "quite", " the fan of unorthodox arrivals, aren't you?~ asks ", (the)crystal, ". ~It's a nice enough room,~ she adds, looking around. ~Not too sure about your open-plan renovations to the ceiling. Let's hope it doesn't rain.~"; ground_brick: "^~Nice to be back down here on firm ground,~ murmurs ", (the)crystal, "."; ground_floor: "^~Oh,~ says ", (the)crystal, " glancing around. ~It's actually quite.... no, I'm sorry, it's horrid in here!~"; first_floor: print "^~Well, you chose a pretty unorthodox way to get into this room, didn't you?~ asks ", (the)crystal, ", gazing at the ruin the drainpipe has made of the window. ~Did it hurt?~^"; YesNo.Ask(HurtYes, HurtNo, 0); rtrue; second_floor_attic: "^~Well, we're right across from the anchor now,~ says ", (the)crystal, ", ~and it looks like we could go up even higher... assuming that trapdoor isn't locked.~"; peak_roof: "^~Very high up here, isn't it?~ asks ", (the)crystal, ". ~If we could just get some kind of lift-off, I'm certain we could get across to the brick house from here.~"; !Vechlee locations Arrivals_Dock: "^~Well, we're finally here!~ says ", (the)crystal, ". ~Let's hope we're in time to stop Renaldo.~"; Outskirts: print "^~Wow, you really did a number on this place last year, didn't you?~ asks ", (the)crystal, ". ~Do you think we'll be exploding anything like that today?~^"; YesNo.Ask(BlastYes, BlastNo, 0); rtrue; Sorcery_Supply: "^~This place has really let itself go,~ murmurs ", (the)crystal, ", looking around the sad little shop. ~But hey, unexpected cheese.~"; Market_Square: "^~You've probably spent more time here than I have,~ admits ", (the)crystal, ". ~It's definitely a market square on the wane, isn't it?~"; Building_Society: "^~Oh, of course,~ says ", (the)crystal, ". ~She thinks you're an airship captain, not Ninario's apprentice. But at least we made it here. This was our original goal, remember?~"; Antechamber: "^~This is exciting,~ says ", (the)crystal, ". ~And also highly illegal and immoral. I wonder what Captain Kells had in his safety deposit box?~"; Vault: print "^~Woo-hoo!~ cheers ", (the)crystal, ". ~I"; if (hoop.first == 0) { Achieved(13); hoop.first = 1; print " don't know quite what happened there, but we seem to have ended up passing through to the "; if (Rasp_Satchel in Purple_Box) print "satchel"; else print "hoop"; print "'s location."; } else { print "t worked!"; } " Way to think laterally!~ She pauses. ~You notice I deliberately avoided saying 'outside the box'?~"; Factory_Floor: "^~This place is huge!~ says ", (the)crystal, ". ~I guess this is where they make the WizStrip.~"; North_Vechlee: "^~This whole end of town just seems deserted, doesn't it?~ asks ", (the)crystal, ". ~Though that factory is definitely new since the last time ", (i) "I", " was here.~"; Vechlee_Gate: "^~The gateway to greater places,~ murmurs ", (the)crystal, ". ~As you probably remember, Ninny's caer is northeast from here, and the commercial area is north.~"; Vechlee_Road: print "^~There it is,~ declares ", (the)crystal, ". ~Ninario's demesne. His realm. His territory. His place. His pad. His dwelling. His abode. His den. His crib. Where he hangs his hat... pointed, naturally. His hearth. His homestead. The bachelor bunker.~ She trails off. ~I've run out of synonyms. I don't suppose you've got a portable cannon anywhere to get through these doors?~^"; YesNo.Ask(BlastYes, BlastNo, 0); rtrue; Hayfield: "^~Just a regular old hayfield, I suppose,~ says ", (the)crystal, ". ~Apart from the suspiciously convenient haystack of course.~"; Atop_Haystack: "^~Whew! Quite the view from up here, isn't it?~ says ", (the)crystal, "."; Farmgate_Area: "^~Oh, this is the McIntosh farm that was raided by the Wizards Guild last year, isn't it?~ asks ", (the)crystal, ". ~I'm glad to see they've repaired it. Looks like nobody's home though.~"; End_Lane: "^~Ah, the infamous tree,~ murmurs ", (the)crystal, ". ~You used the wood hastener on this and then used it to fling yourself into the farmyard last year, didn't you? This is turning into a walking tour of your defeat of the Wizards Guild!~"; Middle_Tree: "^~This is now officially becoming the all-access VIP backstage pass tour,~ declares ", (the)crystal, ". ~Ninny had that treatment once for a troubadour concert, but I don't know that it's absolutely necessary we go ", (i) "everywhere", " you went last year. Or maybe it is. Who knows?~"; Top_Tree: "^~I take it all back!~ says ", (the)crystal, " gazing at the vista around you. ~This view is spectacular! Though it does feel a little unsafe,~ she admits, as the tree gives a shudder in the breeze."; Bailey: "^~Oh,~ says ", (the)crystal, " sounding disappointed. ~I thought we'd be free and clear through to the caer. I wonder how we raise that portcullis?~"; W_Courtyard: "^~Well, we're finally here,~ says ", (the)crystal, ". ~The re-entry could have been a bit smoother, but the method of arrival was certainly inventive, I'll give you that.~"; Atop_West_Wall: "^~What a view!~ sighs ", (the)crystal, ", gazing all around. ~Almost makes you forget the peril we're fighting.~"; Gatehouse: "^~Ah!~ says ", (the)crystal, " as she spots the lever. ~That must be how to raise the portcullis.~"; Garden: "^~Well, this is just lovely!~ smiles ", (the)crystal, " glancing around. ~This used to be a bare plot of earth, didn't it? You've really worked wonders. I could really see myself relaxing here.~"; S_of_Tower: "^~Oh, the shed,~ says ", (the)crystal, ". ~I see the lock hasn't been repaired.~"; Main_Hall: "^~We finally made it in here!~ says ", (the)crystal, ". ~Locked caer doors, portcullises, magical seals, or should I say walruses... nothing could keep us out!~"; Tower_Roof: "^~This is it!~ cries ", (the)crystal, ". ~This is the final confrontation! It's time for the Renaldo smack-down!~"; Shed: "^~And now I'm actually in the infamous shed,~ sighs ", (the)crystal, " overdramatically. ~One of the top spots on the Ninario's caer all-access tour.~"; Laboratory: "^~So this is where all the magic happens,~ says ", (the)crystal, " looking around. ~Sorry, science, I mean. Impressive laboratory.~"; Workshop: print "^~Oh, the ball mill. Is that where the black powder is mixed?~ asks ", (the)crystal, ".^"; YesNo.Ask(BlackYes, BlackNo, 0); rtrue; Kitchen: "^~Oh, the kitchen,~ says ", (the)crystal, ". ~And more cheese!~"; Sewer: "^~Oh, this ", (i) "has", " to be the pinnacle of the tour,~ says ", (the)crystal, ". ~What a charming location. I'm very glad that gases don't penetrate into this globe.~"; Basement: "^~This tour of Ninario's tower is most definitely hitting all the highlights,~ says ", (the)crystal, " distastefully."; Rubbish_Room: print "^~Did you and Ninny just throw every piece of trash down here when you were living here?~ asks ", (the)crystal, " looking around in awe.^"; YesNo.Ask(slippers.SockYes,BlackNo,0); rtrue; Slimy_Ledge: "^~Well, the rubbish having grown to such epic proportions certainly makes for a nice easy step up and down from the ledge, doesn't it?~ asks ", (the)crystal, "."; Slimy_Passage: "^~This is a very nasty little tunnel, isn't it?~ says ", (the)crystal, "."; } } rfalse; } if (self.crytime < 16) { self.crytime++; if (crystal.out == 1) { ! Crystal dying switch (self.crytime) { 1: "^The pain is evident in Crystal's eyes as she gazes up at you. ~Did it work?~ she asks. ~Did we close the rift? Are the children saved? Is Renaldo gone?~ When you nod in answer, she smiles. ~That's good. It was worth it then.~"; 2: "^~Don't fret,~ murmurs Crystal as your tears fall on her. ~It was my choice. I always knew I wouldn't survive coming out of the snow globe... sheltered immune system. But I'm glad to be here with you at the end.~"; 3: "^~I wouldn't trade this,~ whispers Crystal, closing her eyes. ~Not if it meant trading away our time together. I always wanted to meet you, from the moment Ninny told me about you climbing up that mountainside in a bearskin rug smeared with arktos essence.~ She smiles. ~Just thinking of that helps with the pain.~ She grasps your hand."; 4: "^~You have to let me slip away now,~ she murmurs, opening her eyes as you squeeze her hand tightly. ~I don't know what comes next but I'll be keeping an eye on you if I can. ", (i) "Someone's", " got to!~"; 5: crystal.out = 2; "^Crystal gives you one last smile. ~It doesn't hurt anymore,~ she whispers and closes her eyes."; } } else if (crystal.out == 2) { switch (self.crytime) { 6: "^You watch as she slips silently away. The unfairness of it all brings a lump to your throat, and tears well up in your eyes as you hold Crystal's still body."; 7: print "^There must have been something else you could have done. You can't believe she's gone.^"; if (ptero hasnt general) { "^Renaldo is dead, the rift has been closed, and the lives of innocent children saved, but as you gaze down through your tears at Crystal's still form, you know that the cost is almost too much to bear."; } rtrue; 8 to 9: print "^You continue holding Crystal's still body, hoping against hope for a sign or spark of life. There is none.^"; if (ptero hasnt general) { print "^You debate composing Crystal's body and getting up and moving on, but decide you really don't want to.^"; HitKey(); Endgame(); deadflag = 4; } rtrue; 10: move ptero to location; MoveFloatingObjects(); "^A small black speck appears on the horizon."; 11: "^The small black speck gets a little larger, but you still can't make it out."; 12: "^The small black speck resolves into a winged shape, definitely heading this way."; 13: move fake_spenseweed to Garden; MoveFloatingObjects(); "^The winged shape becomes clear. It's the pterosaur you aided in the park, flying directly towards you."; 14: "^The pterosaur circles overhead. It seems to be carrying a plant in its beak."; 15: remove fake_spenseweed; move greater_spenseweed to Garden; MoveFloatingObjects(); "^The pterosaur gives a small ", (i) "caw", " of greeting. As its beak opens, the plant it's carrying falls down and lands beside you. It's a weed."; 16: remove ptero; "^The pterosaur circles your head three times and flies away the way it came, rapidly dwindling into the distance."; } } } ], before [wd bk; if (self.out > 0 && action ~= ##Examine or ##Kiss or ##Touch or ##Wake or ##Give) print_ret (The)self, " looks peaceful and composed as she is. You don't want to disturb her."; Consult: if (self hasnt general) <>; wn = consult_from; wd = NextWord(); switch (wd) { 'warning', 'nymph': "~Warning nymphs are notoriously finicky to get past,~ sighs ", (the)self, ". ~On the other hand, they're sticklers for the letter of the law, so that can be useful.~"; 'chamberpo': "~Investigate Ninny's chamberpot at your own peril,~ says ", (the)self, ". ~I don't want anything to do with it.~"; 'turthalio', 'michael': "~Rules over the whole of Thalion,~ says ", (the) self, " expansively. ~From right here in Blumph too. Bit odd though. He comes from your world and claims he invented all of our known reality.~"; 'thalion', 'country', 'land', 'world': "~Thalion's the name of the country all around us", (murmurs)self, ". ~It's the country Blumph and Vechlee are in.~"; 'vechlee': "~Vechlee's not a bad town,~ says ", (the)crystal, ", ~but I much prefer Blumph. I love the harbour and the water, and I missed that when Ninny lived in Vechlee. Of course, I was also stuck in a chest of linen for years, so that could have something to do with my preferences.~"; 'missive', 'message': if (tattler.dinoread == true) "~Oh, the letter to the editor,~ shrugs ", (the)crystal, ". ~I just suggested to her that...~ The following stream of invective and vitriol is of such a high and abusive order that you are left white and trembling, your ears and face burning. ~So, nothing too severe, really,~ says ", (the)crystal, ". ~And she got the message.~"; "~Missive? What missive?~ asks ", (the)crystal, "."; 'tyromancy': "~Divination by cheese? Well, you're the expert there, aren't you?~ asks ", (the)self, ". ~I doubt there's much I can tell you you don't know.~"; 'genus', 'phobetor', 'parvus', 'god', 'nightmare': print "~Well, the genus is phobetor, but that particular pterosaur "; if (Testscope(ptero)) print "is"; else print "was"; print " a ", (i) "phobetor parvus", " or little Phobetor. I'm fairly certain of that, because of the straight bill. The ", (i) "Dsungaripterus", " looks very similar, and has a similar wingspan, but it has a curved bill. Not that I've ever seen a ", (i) "Dsungaripterus", ", of course. "; if (Testscope(ptero)) print "This is"; else print "That was"; " my first live pterosaur,~ she smiles.^^~As for the Greek god himself, he was said to be large and intimidating. Phobetor means frightening, and he ", (i) "was", " the god of nightmares, after all.~"; 'dsungarip', 'curved', 'bill': "~Well, the ", (i) "Dsungaripterus", " looks similar to the phobetor, but with a curved bill.~"; 'sorcery', 'supply': return conj_commod_scen.information(self); 'funny', 'feeling', 'mesmerisi', 'spectacle', 'glowing', 'magical', 'light': "~The snowfall always makes me feel a bit funny,~ says ", (name)self, ". ~Don't ask me to make any difficult decisions while it's going on. It completely impairs my judgement. And my judgement isn't great at the best of times!~"; 'rug', 'doctor': "~Well, there's Honest Akbar in the high street,~ muses ", (name)self, ". ~Flying carpet sales and service, so he'd probably know what to do.~"; 'wizstrip', 'factory', 'vat', 'paint', 'thinner': "~Ah, WizStrip", (murmurs)self, ". ~That must bring back fond memories for you of blowing up the Wizards Guild... not to mention Ninny's basement. It certainly doesn't mix well with methane.~"; 'methane': "~Yes, well, deadly stuff if you mix it with WizStrip,~ coughs ", (name)self, " delicately."; 'welcome': "~Well, the truth is, they drive down the property values wherever they go. They never trim the lawn, their houses are ramshackle messes, and their hygiene is suspect.~"; 'hygiene', 'suspect', 'ramshackl', 'messes', 'lawn', 'wizards': "~Don't get me wrong, I think wizards are great. I just hate living with them. It's just so... blech. Though of course, anything can seem dull when you only see it from the inside of a glass bubble.~"; 'friends': "~My friends? Well, let's see. In my graduating class, I remember Amber, Beryl, Catherine, Delilah, Emma, Flora, Greta, Helga, Irene, Jennifer, Karen, Laura, Miranda, Nelly, Ophelia, Pamela, Queenie, Roberta, Cynthia, Tiffany, Una, Vera, Wendy, Xandria, Yolanda and Zinnia.~"; 'amber', 'stickier', 'sticky', 'end', 'pleasante': "~Well, she wasn't so much a friend, more an acquaintance,~ explains ", (name)self, ". ~She was the first of our little group to go. A wizard came to hire her right at the graduation ceremony. Next thing you knew, gloop, Amber was ambered.~ She giggles. ~We all voted her most likely to come to a sticky end.~"; 'beryl', 'blasted': "~Beryl was blasted into beryl. Her wizard was particularly unimaginative.~"; 'calcite', 'catherine', 'captured': "~Catherine,~ sighs ", (the)crystal, ". ~Captured in calcite.~"; 'detained', 'diamond', 'delilah': "~Delilah? Detained in diamond.~"; 'emma', 'entangled', 'emerald': "~Emma? She was entangled in emerald.~"; 'flora', 'forced', 'fluorite', 'flourite': "~Poor Flora was forced into fluorite.~"; 'greta', 'gathered', 'garnet': "~Poor dear Greta! Gathered into garnet.~"; 'heliodor', 'hostage', 'helga': "~Helga was made a hostage in heliodor, poor girl. Well, at least it's attractive.~"; 'irene', 'incarcera', 'iolite': "~Irene? Oh, she was incarcerated in iolite, if I recall.~"; 'jennifer', 'jade', 'jammed': "~Jammed into jade... of course, that was poor Jennifer.~"; 'karen', 'knocked', 'kyanite': "~Karen was knocked into kyanite, poor girl.~"; 'laura', 'landed', 'lapis', 'lazuli', 'lapis-laz': "~Laura? Laura landed in lapis lazuli. Lucky thing.~"; 'luck', 'lucky', 'thing': "~Well lapis-lazuli is a nice gemstone, that's why I said Laura was lucky. Everything's relative of course.~"; 'miranda', 'melted', 'moonstone': "~Ah, Miranda. Melted into moonstone!~"; 'nelly', 'nellie', 'nabbed', 'natrolite': "~Poor Nelly, she got nabbed into natrolite.~"; 'ophelia', 'opal', 'occluded': "~Oh, Ophelia was another one of my classmates at Oxbridge. Occluded in opal. Poor girl.~"; 'pearl', 'prisoner', 'pamela': "~Oh, right, Pamela. She was made a prisoner in pearl.~"; 'queen', 'queenie', 'quarantin', 'quartz': "~I almost forgot about Queenie!~ says ", (the) crystal, " in surprise. ~Quarantined in quartz.~"; 'roberta', 'rendered', 'ruby': "~Alas, poor Roberta! Rendered in ruby!~"; 'stuck', 'cynthia', 'sapphire': "~Poor Cynthia was stuck in sapphire. She was apprenticed to a wizard with spelling trouble, you see.~"; 'tiffany', 'topaz', 'trapped': "~Trapped in topaz,~ sighs ", (the)crystal, ". ~Poor Tiffany.~"; 'unakite', 'unseen', 'una': "~Poor Una!~ exclaims ", (the)crystal, ". ~Unseen in unakite. Just too opaque of a stone for ornamental figurines.~"; 'vera', 'variscite', 'vamoosed': "~Vamoosed into variscite!~ cries ", (the)crystal, ". ~I don't think anyone ever saw Vera again.~"; 'wendy', 'wizarded', 'wiluite': "~Oh... poor, dear Wendy! Wizarded into wiluite on graduation day!~"; 'xandria', 'xanthochr', 'xenograft': "~Oh that was nasty. Xandria was xenografted into xanthochroite. She didn't live long, poor girl.~"; 'yolanda', 'yanked', 'yuksporit': "~Yolanda? She was yanked into yuksporit.~"; 'zinnia', 'zapped', 'zircon': "~Poor Zinnia! Zapped into zircon. Too young, too young.~"; 'technical', 'troubles': "~Oh, shifted cargo, running out of ether or some such trouble. Perhaps the captain's even lying drunk in the back of some seedy pub,~ she adds cheerfully."; 'ether': "~You know,~ says ", (name)self, " vaguely. ~It keeps the airships floating.~"; 'floating': "~Yes, floating,~ says", (saysharp)self, ". ~As in, the ship floats in the air. Air. Ship. Airship.~"; 'landlocke': "~I mean there's no port there,~ says ", (name)self, ". ~Landlocked, and inaccessible by sea.~"; 'helium': "~No,~ frowns ", (name)self, ", ~that's not what they use in the airships, but I think it starts with an h.~"; 'hydrogen': "~Of course!~ she says, shaking her head. ~That's the name they use for that magical ether these days.~"; 'drunk', 'seedy', 'captain', 'captains', 'drinking', 'drunken', 'stumble', 'sober': "~Oh, it rarely happens,~ she assures you. ~Most of the captains manage to stumble on board after they've been drinking.~"; 'misaligne', 'wands', 'trouble': "~Or some such trouble,~ says ", (name)self, ", waving her hand dismissively. ~Do I look like an engine astrologist?~"; 'engine', 'astrologi': "~You know, those people you call when there's trouble with your flying carpet, or your cannon.~"; 'incident': print "~You know, loading it up with a pouch of black powder and blasting your way out of Ninny's caer like that. Are we going to blow up anything else this time around?~^"; YesNo.Ask(BlastYes, BlastNo, 0); rtrue; 'prickly': "~Yes, prickly,~ says ", (name)self, ". ~Like an apprentice with a few spears stuck through him.~"; 'spear', 'spears': print_ret (name)self, " shrugs. ~It's just an image that suddenly came to mind.~"; 'class', 'oxbridge', 'graduatio', 'graduatin', 'college', 'universit', 'classmate': "~At the time, it was delightful,~ sighs ", (name)self, ". ~There we were, the first class to graduate from the new Sorcerous Susceptibilities program at Oxbridge.~ She frowns. ~I wonder if that had something to do with our fate.~"; 'sorcerous', 'susceptib', 'program': "~The idea was, we'd all have guaranteed jobs as test subjects for new wizard spells", (murmurs)self, ", ~but perhaps it wasn't the best idea after all, given the catastrophe.~"; 'catastrop', 'fate', 'test', 'subjects': "~When you combine a graduating class full of girls susceptible to wizard spells with a wizardly fad for miniature figurines encased in various substances... well, you do the math.~"; 'fad', 'substance', 'encased', 'math': "~Oh, you name it, a girl was encased in it,~ says ", (name)self, " cheerfully."; 'break', 'spell', 'smashed', 'smashing', 'breaking': "~Well, Ninny could have extricated me by breaking the ball, but then I would have stayed this size. No thanks! Supposedly, the ball has to be smashed in the presence of the original wizard who imprisoned me. Though Ninny wasn't certain of that either--he also said the shock could kill me after all this time stuck in here. Weakened immune system and all that. On the plus side, it does seem to have made me immortal, at least so far.~"; 'immortal', 'immortali', 'age': "~Two hundred years and counting so far!~ declares ", (the)crystal, (string)period; 'building', 'society': "~I don't know much about the Plumbers Union Building Society", (admits)self, ", ~but I know it's replaced the Wizards Guild Savings & Loan. I think it was started by the same group that owned the Vechlee Townsfolk one before the Guild drove it out.~"; 'savings', 'loan': "~You remember the Savings & Loan,~ prompts ", (name)self, ". ~They went broke while raising money to rebuild the Guild Hall, when all the wizards suddenly wanted their money out.~"; 'original', 'wizard', 'imprisone', 'imprisonm', 'rogue': self.Wizask(); rtrue; 'nin', 'ninario', 'ninny': "~Oh, he's harmless. A bit of a scatterbrain, but his heart's in the right place.~"; 'heart', 'right', 'place': "~I just mean he always tries to do what's right, even if he fails miserably.~"; 'scatterbr': print_ret (name)self, " looks at you bluntly. ~You ", (i) "have", " noticed that Ninny's a bit of a scatterbrain, right?~"; 'beeswax', 'candles': "~They were in the chest of linen Ninny's been keeping me in. Beeswax candles and cotton.~"; 'caer', 'dull', 'anything': "~Oh, I was at Ninny's caer for years", (admits)self, ", ~but I was buried in a chest of linen.~"; 'linen', 'cotton': "~I read my books most of the time I was in there", (murmurs)self, ". ~Looking at the scenery was rather boring.~"; 'boring', 'white', 'scenery': "~White snow, white linen. Riveting.~ She rolls her eyes. ~A girl could go mad.~"; 'book', 'books', 'library': "~Before Ninny shrunk this cottage down and dumped it in here, he stocked the library full. It's probably kept me sane over the years. He updates it from his own library every now and then.~"; 'update', 'updates', 'ritual', 'wardrobe', 'attire': "~I don't know how the updates are done", (admits)self, ". ~Some complicated magic ritual, I'm sure. Ninny loves those.~"; 'chest': "~I'm sure you saw it,~ says ", (name)self, ". ~It was in Ninny's bedroom, full of white linen.~"; 'mad', 'madness', 'sane', 'sanity', 'insane', 'insanity': "~You try being locked in a glass bubble for two hundred years,~ says ", (name)self, ". ~Trust me, keeping yourself sane is an ongoing concern.~"; 'curtain', 'curtains': "~Let's just say I have a talent for taffeta,~ she smiles."; 'taffeta': "~You know, taffeta,~ says ", (name)self, " knowingly. ~It's like the playwright Shakespeare said a few hundred years ago in ", (i) "Twelfth Night", "... 'Now, the melancholy god protect thee; and the tailor make thy doublet of changeable taffeta, for thy mind is a very opal!'~ She pauses and frowns. ~Speaking of opal, I wonder whatever became of my friend Ophelia.~"; 'will', 'william', 'shakespea': "~Oh, Shakespeare was all the rage when I got stuck in this globe,~ confides ", (name)self, ". ~Two hundred years on, he's still popular. Amazing.~"; 'death', 'shock', 'died', 'dying', 'kill', 'killed': "~Well,~ muses ", (name)self, ", ~I don't really know too much about death. I seem to have become at least temporarily immortal in this stupid ball. Though according to Ninny, there's a good chance I'll keel over if I ever get out of this ball. After two hundred years in here, I'm probably not too germ-resistant anymore.~"; 'germ-resi', 'germ', 'germs', 'resistant', 'risk': "~You know,~ says ", (name)self, ", ~two hundred years without a single cold or flu from the outside world getting in. I'm bound to be at risk.~"; 'wisdom': "~Oh, I don't haven't much of that,~ says ", (name)self, " cheerfully. ~Knowledge yes, wisdom no. Ninny and wisdom, on the other hand...~ She pauses and reconsiders. ~Well, let's just say he's full of it.~"; 'knowledge': "~Oh, I'm full of all sorts of information,~ smiles ", (name)self, ", ~and ready and willing to share. I should know something about anything you're willing to ask about. Or at the very least, I'll have an opinion.~"; 'credit', 'bills', 'cash-flow': print_ret (name)self, " sighs. ~Put it this way. Any store where we mention credit for Ninny, we're more likely to not be allowed out until we settle a few of his bills.~"; 'fire': "~It was very warm. A lot of snow sublimed all at once, and then it rained in here for a week. It was extremely unpleasant. I didn't think I'd ever be able to come back out of my cottage.~"; 'rain', 'rained', 'raining', 'sublimed', 'sublimati', 'sublime': "~Normally snow's the worst I get in here. At least that falls more slowly. Oh, and after all that rain? Fog for weeks. Thank goodness for all those tiny cracks; if this ball was airtight, I'd still be wiping the glass every day just to be able to see out.~"; 'fog': "~Very damp,~ shivers ", (name)self, (string)period; } do { wn = consult_from; bk = ParseToken(SCOPE_TT, AskableScope); } until (bk ~= GPR_REPARSE); if (bk == GPR_FAIL) return crystal.nomatch(); if (bk.information(self) == true) rtrue; "~I'm not sure we need to worry too much about that at the moment", (admits)crystal, (string)period; Attack: "You can't get at her. Besides, that wouldn't be very nice at all."; Bargain: if (self hasnt general) print_ret "Trying to bargain with the small ", (name)self, " is not really going to get you very far."; print "~I'm not "; switch (random(5)) { 1: print "the Vechlee market square!~ says", (saysharp)self, (string)period; 2: print "the Blumph market!~ complains", (saysharp)self, (string)period; 3: print "a flea market!~ protests", (saysharp)self, (string)period; 4: print "some Blumph Pier fishwife!~ cries", (saysharp)self, (string)period; 5: print "the local carpet merchant!~ says", (saysharp)self, (string)period; } new_line; rtrue; Give: if (second == greater_spenseweed) { Achieved(59); crystal.out = 0; give Amusement_in_Main general; print "Hands trembling with fearful hope, you place the greater spenseweed gently in Crystal's mouth to let its virtue spread throughout her.^ ^After a few moments, a flush of colour returns to her cheeks.^ ^She coughs suddenly, expelling the remains of the spenseweed. She draws in a great shuddering breath and her eyes fly open.^ ^~I couldn't go!~ she gasps, hands clasped to her chest, breathing air in raggedly. She struggles to sit up. ~I was gone, I know it. I felt a presence calling me to something... larger... bigger and beautiful. But I couldn't go. Not without my companion.~ She throws her arms around you tightly. ~I won't leave you again,~ she says, putting her head on your shoulder.^ ^Your hands, clasped behind Crystal's back, crumple the remains of the spenseweed.^ ^~At least,~ murmurs Crystal, ~not while you've got your own personal spenseweed delivery pterosaur. Maybe we should call it Terry.~^"; HitKey(); Endgame(); deadflag = 2; rtrue; } if (crystal.out > 0) { print_ret (The)self, " looks peaceful and composed as she is. You don't want to disturb her."; } Listen: if (self has general) "Although ", (name)self, "'s lips move when she speaks, the words seem to come directly into your head. You don't need to put your ear next to the ball to hear her."; "Strange. You hear nothing."; MeetNPC: if (self has general) "~Yes, I think we've covered the introductions already,~ smiles ", (name)self, (string)period; self.short_name = "Crystal"; give self general proper animate female; print "~Hello there,~ says the figurine sweetly. ~Enchanted to meet you at last. I've heard all about you from Ninny while you've been away at university. I'm... well, ", (the)crystal, ",~ she says, looking a bit sheepishly at ", (the)ball, ".^"; print "^She pauses to brush some flakes of snow from her cloak. ~I was always a bit of a know-it-all, and I've had many years without a lot to do except read, so Ninny uses me as his encyclopedia. I'm sure that's why he sent me with you.~^ ^She smiles engagingly. ~Well, that, and I irritate him no end. So feel free to ask me about anything. Don't be shy. No one else can hear me. I also know Blumph and Vechlee fairly well, so I'll provide commentary on any new place we visit. Unless you tell me to be quiet, of course. That will stop the commentary, but precious little else. I have trouble staying quiet. But don't worry... as I said, no one else can hear me.~^"; crystal.commentary = true; Achieved(1); rtrue; Kiss: if (self.out == 2) { "You bestow a kiss on Crystal's flawless cheek."; } if (self.out == 1) { "You kiss Crystal gently on the cheek.^ ^~You foolish wizard's apprentice,~ she smiles weakly."; } if (self has general) "~As intriguing as that might be, it's going to be a little difficult with me in here and you out there,~ says ", (name)self, " drily."; rfalse; Smell: <>; Smile: if (self has general) print_ret (name)self, " smiles back at you sweetly."; print "To your surprise, the figure in the snow globe smiles back at you!^"; new_line; <>; Talk: if (self has general) print_ret (name)self, " smiles up at you expectantly. ~Go ahead, ask me something. Or you can tell me something, if you like.~"; print "To your surprise, the figure in the snow globe suddenly waves as you speak!^"; new_line; <>; Take: "She's encased in glass, and therefore just as unattainable as most of the girls you've known."; Taste,Touch,Search: "It's unclear where you learned how to impress girls, but perhaps you'd best try something else."; Thank: "~Well, I hope I'm being helpful", (admits)crystal, ". ~One's never quite certain.~"; Transfer: "Unfortunately, as the glass ball is sealed, that's going to be difficult."; ], information [person; switch (person) { crystal: print_ret (The) person, " smiles as she looks up at you. ~Oh, me? My story's the usual one. Imprisoned years ago by a rogue wizard for a nefarious and sinister purpose. I've been stuck with Ninny since he won me in a game of cards, ball and all, a couple of hundred years ago. He tried to magic me out of here, but I've been in here too long to survive the outside world. Weakened immune system, you know.~ She pauses to brush some flakes of snow from her cloak. ~I was always a bit of a know-it-all, and I've had many years since then to brush up, so now Ninny uses me as his encyclopedia. I'm sure that's why he sent me with you.~^ ^She smiles engagingly. ~Well, that, and I irritate him no end. So feel free to ask me about anything. Don't be shy. No one else can hear me.~"; people: switch (random(6)) { 1: print "~Don't know anything about her,~ mutters"; 2: print "~She's lovely,~ agrees"; 3: print "~How quaint!~ cries"; 4: print "~Not much I can tell you, I'm afraid,~ shrugs"; 5: print "~Exquisite!~ murmurs"; 6: print "~Wonderful detail,~ murmurs"; } randcrowd(); rtrue; teller: "~A very nice piece, captain,~ smiles ", (the)teller, ". ~I'm sure you must treasure it.~"; crone: "A sad smile crosses ", (the)crone, "'s lips. ~I'm given to seeing things from time to time,~ she says almost gently. ~Sometimes it's the obvious things.~ She smiles at you and ", (the)crystal, " knowingly. ~Other times it's something prophetic. But please don't ask what I see here. I can't tell you this prophecy.~"; hermit: print_ret (The)hermit, " looks at ", (the)crystal, " and shrugs. ~I suspect you know more about her than I do. It's your snow globe.~"; } ], life [; if (self.out ~= 0 && action ~= ##Give) print_ret (The)self, " looks peaceful and composed as she is. You don't want to disturb her."; Answer: if (noun == 'hello' or 'hi') { if (self has general) <>; <>; } else <>; Show: if (crystal hasnt general) "You're not sure ", (the) self, " would be interested in that."; switch (noun) { index_card: "~It's not a bad likeness", (murmurs)crystal, "."; plotkin: if (plotkin.current_qty > 50) "~Hey,~ says ", (name)self, ". ~We're rich.~"; return plotkin.information(crystal); socks: if (self.Topics & FLAG_x4 == FLAG_x4) "~I think one proud display of the filthy foot attire is enough,~ says", (saysharp)self, (string)period; self.Topics = self.Topics | FLAG_x4; "Her smile seems a bit fixed. ~Yes, well, I'm glad Ninny found ", (i) "somewhere", " to donate the socks even ", (i) "he", " wouldn't wear.~"; Rasp_Satchel: if (self.Topics & FLAG_x1 == FLAG_x1) "~You're obviously quite fond of it,~ smiles ", (name)self, " indulgently. ~You've already told me about it once.~"; else { self.Topics = self.Topics | FLAG_x1; print_ret (name)self, " looks curiously at ", (the)noun, ". ~So this is the famous yogurt container-turned-satchel. I understand it was quite useful on your last adventure. Holds an infinite number of things with no discernible weight.~ She pauses. ~You know,~ she adds pensively, ~does that strike you as just ", (i) "way", " too convenient as well? Strange...~"; } default: <>; !"~Hmmm", (murmurs)crystal, !" a bit doubtfully. ~", (CTheyreorThats)noun, !" very interesting I'm sure, but I'm not !!sure it helps at the moment.~"; } Give: if (self.out ~= 0) { if (self.out == 2 && noun == greater_spenseweed) { <>; } print_ret (The)self, " looks peaceful and composed as she is. You don't want to disturb her."; } if (self hasnt general) "You're not sure ", (the) self, " would be interested in that."; switch (noun) { socks: "~No ", (i) "thanks", ",~ says ", (name)self, ", looking a trifle alarmed. ~If I wanted a pair of socks that looked like that, I could just wear mine for a week without changing them.~"; default: "~Well that's very sweet of you, but I simply don't have ", (i) "anywhere", " to put ", (ItorThem)noun, " at the moment. Perhaps I should just mention again the whole living in a glass bubble thing? As you may have noticed, ", (i) "not", " a lot of room in here for souvenirs.~"; } Tell: if (self hasnt general) <>; if (second == Rasp_Satchel) { if (Rasp_Satchel notin player) { move Rasp_Satchel to player; MoveFloatingObjects(); print "(first taking ", (the) Rasp_Satchel, ")^"; } <>; } if (second == ptero) { "~Yes,~ nods ", (name)self, ". ~I can see it too. You're not suffering from hallucinations.~"; } if (second == player) { print "You spend a few minutes telling ", (name)self, " a few "; if (self.Topics & FLAG_x2 == FLAG_x2) print "more "; print "things about yourself"; self.Topics = self.Topics | FLAG_x2; ".^^~Thank you,~ smiles ", (name)self, " engagingly as you finish. ~Now I feel I know you a little bit better.~"; } switch (second) { 'nefarious', 'sinister', 'purpose': "A look of disgust crosses ", (the)self, "'s face. ~Well, there was a certain group of wizards who found ways to extend their lifespans using the souls of young children. And then some of them hit upon the scheme of nabbing them and imprisoning them to ensure they'd have a never-ending supply for their vile schemes. Fortunately, Ninny won me from that wizard long before I knew that... or was forced to find out.~"; 'soap', 'cleaning', 'sock', 'socks': "~You live with a wizard,~ sighs ", (name)self, ". ~I can hardly expect you to be a model of cleanliness under those circumstances.~"; 'walrus': "~A magical walrus?~ asks ", (the)self, ". ~Well, that's an eye-opener and no mistake.~"; 'vision': if (Garden_Vision.gv_seen == true) "~Really?~ asks ", (the)self, ". ~That's very strange because when I was growing up, I had this crystal ball that I used to gaze into and tell fortunes. The funny thing is when I read my own future once, I saw myself sleeping on a bed of flowers in an airship captain's lap.~"; } "~Really?~ asks ", (name)self, ". ~Interesting, but I don't understand the significance at the moment.~"; WakeOther: if (self.out == 2) "Sadly, you don't think you'll be able to wake ", (the)self, " from this."; rfalse; ], nomatch [; switch (random(6)) { 1: print "~It's funny you should ask about that,~ says ", (name)self, ", ~because "; 2: print "~I can't believe you asked me that!~ squeals ", (name)self, " excitedly. ~Do you realise that "; 3: print "~Oh!~ exclaims ", (name)self, ". ~That reminds me of a story about how "; 4: print "~By the way,~ says ", (name)self, ", ~I don't think I ever told you about how "; 5: print "~Oh,~ says ", (name)self, ", ~I meant to tell you about how "; 6: print "~Oh,~ says ", (name)self, ", ~that puts me in mind of how "; 7: print "~Oh,~ says ", (name)self, ", ~did you know that "; } switch (random(11)) { 1: "when I was just a little girl, my parents owned a property on the beach, and there was this fellow who lived just down the way, and he had this whole collection of shells he would clean ", (i) "every", " day, even though no one, and I mean ", (i) "no one", " ever wanted to see them. So it just goes to show you, if you have something to occupy your time, what else matters?~^^She pauses for breath. ~I'm sorry, what was the question again?~"; 2: "I heard all about you defeating Renaldo, and all I could think about was how much I wanted to meet you.~ A delicate pink flush creeps up her cheeks. ~Can you imagine how I felt when I found out Ninny wanted me to go with you this time? Goodness, so exciting!~"; 3: "when I was growing up, I had this crystal ball that I used to gaze into and tell fortunes. The funny thing is when I read my own future once, I saw myself sleeping on a bed of flowers in an airship captain's lap... I always love someone in uniform, don't you? But in any case, it's really strange, when you think about it, that I ended up here.~ ^^She pauses for a second. ~There ", (i) "was", " a point to that, but I seem to have forgotten it. Sorry, what was the question again?~"; 4: "I used to get ", (i) "so", " distracted when I was talking that I would just blather on about any old subject and completely miss what the other person was saying.~^^She pauses. ~Sorry, did you say something?~"; 5: "before I got stuck in this snow globe, I used to visit my grandmother every week. Well, she wasn't my real grandmother, just this senile old lady who lived next door, and thought I was her granddaughter. She called me Sarah all the time and gave me these really disgusting sweets. And I would take as many as I could every time, in the hopes of emptying the dish, so she'd buy some different ones, but it never seemed to get empty. Of course, back then, two hundred years ago, ", (i) "everything", " was magic, and I found out later that she was a wizard, and used to just conjure up more sweets every week. So it just goes to show you that sometimes perseverance ", (i) "doesn't", " pay off and it's better to just give up the fight.~ She pauses and frowns. ~Except when it isn't, of course. The tricky bit is figuring out when you should and when you shouldn't.~^^She smiles sweetly. ~I hope that answers your question.~"; 6: "Ninny's apprentice a couple of years ago, a girl from Vechlee, told me about the first time she came to Blumph. She was all excited about going on an airship, because in those days, Vechlee didn't have them--the Wizards Guild always resisted them. Anyway, she really wanted to go on one, but her parents went by themselves and just bought her one of those shirts. You know, the ones that say ", (i) "My parents rode on the Blumph airship, and all I got was this lousy shirt", ". She wasn't impressed. Years later, she finally had a chance to go on the airship, and guess what? She wasn't impressed. So it just shows, sometimes the things we want the most aren't really the experience we think they'll be.~^^She pauses. ~Of course, she was five when she received the shirt, and twenty-five when she finally went on the airship, so perhaps that had something to do with the disappointment.~"; 7: "I often find it so much easier to blather on about nothing at all than to actually say nothing at all. In fact, some people have said I talk too much, but I find that ", (i) "too much", " is such a relative measure. I mean, I would hardly call four hours a night chatting via the crystal ball too much, but try telling that to my parents. It's not like they ever received any calls anyway. They even accused me of not being able to form coherent responses to questions. Can you believe that?~^^She stops suddenly, a sheepish look coming across her face. ~Sorry, what did you ask me again?~"; 8: "a huge percentage of people who start attending the Oxbridge apprenticeship program never even make it to second year. So really, you've done very well to get as far as you have, considering you're not even from this world at all. So you should just, you know, keep that in mind when you have these niggling little doubts and questions bothering you.~"; 9: "I wasn't really that interested in the Sorcerous Susceptibilities program at all... I signed up for it mainly to keep my parents happy, and also because I heard there were free crystal balls issued. For course work, naturally, but they gave us all unlimited talk time. Honestly, sometimes my classmates and I stayed up so late, we would completely forget to do our homework assignments. Nothing like a good chat to make you forget to answer some questions, right?~"; 10: "this girl in my class at university was ", (i) "convinced", " there were some gnomes living underground in her garden. She said they were stalking her, peering in the window at night, watching for when she left the house and then eating all the cheese. Things like that. Eventually of course, she became so obsessed with these feelings that she had to abandon the house. Just up and left. Nice house, too. Once she left, I used to go over there all the time to visit the gnomes. They were really very friendly, as long as you didn't accuse them of eating all the cheese.~"; 11: "I had a friend who swore her house was haunted every night by a mysterious apparition. There would be a great clattering on the door and a pale, ghostly figure would shamble in. She was convinced it was the ghost of an executed king, because it would wander the house, moaning and saying ", (i) "Oh, my head!", " and things like that. It was all a bit silly, really. It turned out to be her grandfather coming back from the pub.~"; } ], helpcount 0, orders [; if (self hasnt general) <>; Bequiet: self.commentary = false; "~That's fine,~ smiles ", (the)self, ". ~I'll no longer provide commentary the first time we visit a place. If you want to me to start doing so again, just ask me to comment.~"; Comment: self.commentary = true; "~That's fine,~ smiles ", (the)self, ". ~I'll now provide commentary the first time we visit a place. If you want to me to stop, just tell me to be quiet. I won't mind.~"; HelpNPC,Hint: if (location == thedark) { "~Give me a moment,~ says ", (murmurs)self, ", ~I'm working on it. I think I can get it.~"; } if (task_done->2 == 0) { print "~I think we should go and turn in the laundry claim ticket,~ says ", (the)crystal, ". ~"; if (back_room has visited) "I know we already saw Yekcal claim it, but at least we could pick up the cheese.~"; "We'll need Ninario's key from his robes to open his safety deposit box.~"; } else if (task_done->3 == 0) { if (Park has visited) { if (saddle in ptero) { ! This can only be true if we're with Terry, so that's good. if (ptero.mesmer ~= 0) "~Quick!~ cries ", (name)self, ", sounding a trifle dazed herself. ~Grab the... thing, you know, the saddle, while it's distracted!~"; print "~It's too bad we can't get that saddle from the pterosaur. It looks like it's bothering it. We might be able to sell the saddle too. I"; switch(ptero.hint) { 0 to 1: ptero.hint++; "f only we could distract it somehow.~"; 1: ptero.hint++; "f only we could wave something at it, or shake something in its face to confuse it.~"; 2: " wonder if shaking the snow globe would distract it?~"; } } } } else if (task_done->4 == 0) { ! This can only be true if we're with the crone, so that's good. if (crone.mesmer ~= 0) "~Quick!~ cries ", (name)self, ", sounding a trifle dazed herself. ~Sell her that saddle while she's distracted!~"; print "~I think we should try to sell that saddle to "; if (conj_commod hasnt visited) "one of the shops.~"; print "the old crone"; switch(crone.hint) { 0: crone.hint++; ".~"; 1: crone.hint++; ", but I think we need to distract her to get her to buy it.~"; 2: ". I wonder if shaking the snow globe would distract her? It worked on the pterosaur.~"; } } else if (task_done->5 == 0) { print "~Now that we've got some money, I think we should help that poor pterosaur's wing."; switch (ptero.hint) { 0: ptero.hint++; "~"; 1: " I wonder where we could find something to help. We need unguent!~"; 2: print " ", (The)extract; if (location == conj_commod) print " here"; else print " at Conjuring Commodities"; " seems a good possibility.~"; } } else if (task_done->6 == 0) { "~Let's find out if ", (the)extract, " will work to heal the pterosaur.~"; } else if (task_done->8 == 0) { "~Well, we've seen a couple of pieces of cheese, so it might be really neat to buy that tyromancy machine from the old crone and try it out.~"; } else if (task_done->9 == 0) { "~Let's try ", (the)tyro, "!~ says ", (the)self, " excitedly."; } else if (task_done->16 == 0) { if (captain.waiting == true) "~Let's see what happens with his spiked drink first,~ says ", (the)crystal, "."; if (pub has visited) { switch (captain.hint) { 0: captain.hint++; "~Well, we want to use the airship and the captain's too drunk too fly. I wonder if anyone else can fly the airship?~"; 1: captain.hint++; "~You're good at figuring things out. Maybe if we borrowed the captain's uniform, you could pilot the airship.~"; 2: captain.hint++; "~I don't think the airship captain will just let us swap clothes with him.~"; 3: captain.hint++; "~We need to distract the airship captain so we can nab his uniform.~"; 4: captain.hint++; "~I don't think the snow globe would be enough of a distraction to us stealing the airship captain's clothes.~"; 5: print "~I'm not entirely comfortable with it, but I wonder if that knockout pill would work for nobbling that airship captain,~ muses ", (name)self, "."; if (nobbler in case) "~It's not expensive, so maybe we should pick it up. Then we could borrow his uniform and pilot the airship ourselves!~"; ! Advance the hint only if we've purchased the nobbler. This way we'll repeat the clue to buy it until it's bought. captain.hint++; new_line; rtrue; 6: captain.hint++; "~Well, it's a bit sleazy, but I think slipping the nobbler pill in the airship captain's drink is probably the easiest course of action.~"; 7: captain.hint++; "~Of course, the captain's not likely to just let us drop pills in his drink. He's not that far gone.~"; 8: captain.hint++; "~We'll have to distract the airship captain somehow to get the pill in his drink.~"; 9: "~I wonder if shaking the snow globe would distract the airship captain so we could put the pill in his drink? It worked on the pterosaur and the old crone.~"; } } } else if (task_done->17 == 0) "~Well, the captain's out cold. Perhaps we should nab his uniform.~"; else if (task_done->20 == 0) { switch (captain.hint) { 0: captain.hint++; "~We've got the airship captain's uniform, but we'll need to get a licence somehow if we want to get into the airship.~"; 1: captain.hint++; "~I wonder if we would find the airship captain's licence at his home.~"; 2: captain.hint++; print "~I'm fairly certain his house is the one behind the stone wall"; if (location ~= Blumph_Heights) print "in Blumph Heights"; ".~"; 3: captain.hint++; "~We'll need something to help us get through the stone wall. Or perhaps ", (i) "over", " it.~"; 4: ! if task_done->19 is 0, we haven't bought the autoclimber. if (task_done->19 == 0) { if (lonely_supply has visited) "~If we buy ", (the)autoclimber, " from Lonely Mountaintop Supply, perhaps we can get over the wall and into the airship captain's home. Well, into the grounds, at least.~"; print "~We didn't visit that Lonely Mountaintop Supply store "; if (location ~= Shops) print "in the marketplace "; "yet. Perhaps we should pop in there and see if they have anything suitable.~"; } ! Otherwise, we have purchased it. "~If we use ", (the)autoclimber, ", perhaps we can get over the wall and into the airship captain's home. Well, into the grounds, at least.~"; } } else if (task_done->25 == 0) { if (Oak_Street has visited) { switch (anchor.hint) { 0: anchor.hint++; "~Well, if we want to get to Vechlee, an airship is our best bet. And I don't think the airship's going anywhere unless we get that anchor freed.~"; 1: if (Red_Carpet in case) { print "~Well, we sold the carpet, but I think a way to fly might be useful to shift that anchor. "; if (Red_Carpet has general) "Buying ", (the)broomstick, " is cheaper than buying back the carpet at this point.~"; "~I think a way to fly might be useful to shift that anchor. We should see if we can get the carpet repaired, or buy the broomstick to help us fly.~"; } } } } else if (task_done->26 == 0) { switch (anchor.hint) { 0: anchor.hint++; "~We need to get to the top of that brick house and get that anchor free if we want to go anywhere in the airship.~"; 1: if (alleyway has visited) "~We could always try the drainpipe to get up to the top of the brick house.~"; if (ground_floor has visited) { if (stairs has general) "~I suppose we could use ", (the)autoclimber, " on the hole now that the stairs in the wooden building have collapsed.~"; "~I think using the wooden house to get to the brick house might help.~"; } } } else if (task_done->27 == 0) { if (peak_roof hasnt visited) "~I think we should go as high up in the wooden house as we can to get above the brick house. Then maybe we can get to the brick house from there somehow.~"; switch (anchor.hint) { 0: anchor.hint++; "~I think if we go back to the roof of the wooden house, we might be able to get across to the brick house.~"; 1: ! We've either repaired the carpet OR bought the broomstick. if (Red_Carpet in case) { print "~Well, we sold the carpet, but I think a way to fly might get us from one roof to the other. "; ! The red carpet was fixed when we sold it. if (Red_Carpet has general) { if (Broomstick in case) "Buying ", (the)broomstick, " is cheaper than buying back the carpet at this point.~"; "As bald as that broomstick is, I think it has a better chance of success than that carpet.~"; } } if (Red_Carpet has general) { "~I think it's worth trying the carpet to get from the roof of the wooden house to the brick house. Then we can shift that anchor. I know it's not the greatest carpet, but it's a downhill journey.~"; } "~I think might be able to fly from the roof of the wooden house to the brick house. We should see if we can get the carpet repaired, or use the broomstick to help us fly.~"; } } else if (task_done->28 == 0) { "~I think we can push that anchor free now that we've got access to the brick house.~"; } else if (task_done->29 == 0) { if (licence hasnt general) { switch (airship.hint) { 0: airship.hint++; "~I think we'll need that licence to look more like you if we want to board the airship.~"; 1: airship.hint++; "~The ", (i) "lumen graphicae", " booth on the pier might help us get a picture of you onto the licence.~"; 2: airship.hint++; "~If we put the licence into the tray, the lumen graphicae booth might put your picture on it.~"; 3: airship.hint++; "~Of course, we need to make the licence sticky if we want the lumen graphicum to adhere to it.~"; 4: airship.hint++; if (address_label in Wizarding_Weekly) "~If we pulled the label off Ninario's copy of Wizarding Weekly, the back of that might be sticky enough.~"; "~When you pulled the label off Ninario's copy of Wizarding Weekly, the back of that was all sticky, wasn't it?~"; 5: if (licence in tray) { if (licence.sticky == true) "~We've got the licence in the tray and the front of the licence is all sticky. We should be able to pull the cord and get your picture onto the licence.~"; "~The licence is in the tray, but we need to use the label from Ninario's copy of Wizarding Weekly to make it all sticky.~"; } "~We've got to put the licence into the lumen graphicae booth's tray.~"; } } "~We've freed the anchor so we should be able to pilot the airship out of here now.~"; } else if (task_done->30 == 0) { if (location ~= airship_bridge) "~Let's board the airship and get out of here!~"; if (ignition_lever hasnt open) "~Let's light up the ignition and see what this bad boy can do!~"; "~Push the joystick and let's get this beast in the air!~"; } else if (task_done->31 == 0) { if (cargo_lever hasnt open) "~I think we're going to have to jettison the cargo to get some lift!~"; "~You're doing fine! Hang in there!~"; } else if (task_done->36 == 0) { "~We should probably pay a visit to the Plumbers Union Building Society.~"; } else if (task_done->37 == 0) { "~Well, the teller offered us the chance to check our safetly deposit box, so we might as well see what's in there.~^"; } ! Putting the hoop in the purple box. else if (task_done->38 == 0) { switch (Hoop.hint) { 0: Hoop.hint++; "~I'd like to see us get into the vault and really see what's there.~"; 1: Hoop.hint++; if (task_done->12 == 0) "~I think we might need an item of some kind to help us get into the vault.~"; if (task_done->13 == 0) "~The old crone sold us an item that might help us get into the vault, but we need to figure out how to use it first.~"; "~The old crone sold us an item that helps us move from one area to another by entering the satchel.~"; 2: if (task_done->12 == 0) "~I think we should buy the tin hoop from the old crone.~"; Hoop.hint++; if (task_done->13 == 0) "~The tin hoop is interdimensional and so is the satchel. If we bring them near each other, maybe we can figure out what to do with them.~"; "~We need to use the magical properties of the tin hoop to help us get into the vault.~"; 3: if (task_done->13 == 0) "~Bring the hoop and the satchel close together. Then, whenever we enter one of them, we'll travel to where the other is. Give it a try.~"; Hoop.hint++; "~We need to get the hoop into the vault somehow. Then we can use the satchel to travel there.~"; 4: "~If we inspect the captain's safety deposit box, and then we put the hoop in there, the teller will put the box and the hoop back in the vault when we leave.~"; } } else if (task_done->39 == 0) { "~Let's pass into the vault using the hoop.~"; } else if (task_done->44 == 0) { switch (guard.hint) { 0: if (Vechlee_Road hasnt visited) "~We should concentrate on getting into Ninario's caer next. Let's head over there!~"; guard.hint++; "~We should figure out how to get into Ninario's caer. Who knows what Renaldo and Yekcal are up to in there?~"; 1: ! If the autoclimber hasn't been used against the wall, stay repeating this... if (trigger hasnt general) "~We need to get into the caer somehow. I wonder if we could use ", (the)autoclimber, "~."; guard.hint++; "~We need to pick a different target for the autoclimber,~ says ", (the)crystal, ". ~He's just going to keep unhooking it.~"; 2: "~If we point the autoclimber at the guard, maybe we can yank him down from the wall!~"; } } else if (task_done->45 == 0 && (Caer_Door has locked || Bailey hasnt visited)) { if (Caer_Door has locked) "~We should try the key the guard dropped. It probably opens the caer doors.~"; "~We should go through the caer doors and see if we can get into the courtyard.~"; } else if (task_done->46 == 0) { switch (Portcullis.hint) { 0: Portcullis.hint++; "~We've got to find a way past that portcullis.~"; 1: Portcullis.hint++; "~The portcullis can probably only be raised from inside the courtyard.~"; 2: Portcullis.hint++; "~I think we'll have to find another way to get in.~"; 3: Portcullis.hint++; "~If the autoclimber wasn't broken, we could have used that to get up and over the wall. But it can't be fixed.~"; 4: Portcullis.hint++; "~Maybe there's another way for us to get up and over the wall.~"; 5: if (End_Lane hasnt visited) "~We should look around a bit more first and see if anything strikes us.~"; Portcullis.hint++; "~If we climb up the tree at the end of the lane, we can see over the caer wall and into the courtyard.~"; 6: Portcullis.hint++; "~We can't climb into the caer from the tree, but maybe we can use these springy branches to launch ourselves in there.~"; 7: Portcullis.hint++; "~If we could climb high enough in the tree, maybe our weight would bend it down and put it under tension.~"; 8: Portcullis.hint++; "~The branches are too flimsy for us to climb any higher. Maybe we need to make ourselves heavier?~"; 9: Portcullis.hint++; "~We don't have time for you to gain a spare tire or anything, but that lump of lead we found can effectively make us heavier?~"; 10: Portcullis.hint++; "~The lump of lead is too heavy to carry up into the tree, but if you're thinking what I'm thinking, we've got a way around that, don't we?~"; 11: Portcullis.hint++; "~If we put the lump of lead in the satchel, then we can climb the tree without its weight affecting us.~"; 12: "~Once we're in the tree with the lead, we take it out of the satchel and the tree bends down... then we let go of it and pow, we're slingshotted out of the tree. It's just mad enough that it might work.~"; } } else if (task_done->48 == 0) { if (W_Courtyard has visited) { switch(walrus.hint) { ! Note: we depend on trying to enter the hall (from courtyard or basement) to advance the walrus hints counter. 0: "~We need to get into the tower next.~"; 1: walrus.hint++; "~I think we need to get rid of that walrus if we want to get into the tower.~"; 2: walrus.hint++; "~What scares a walrus? Maybe something loud that he isn't expecting.~"; 3: if (Factory_Floor hasnt visited) "~We should explore around Vechlee a bit more and see if something strikes us.~"; walrus.hint++; "~What about that chute leading down into the sewer? Can we use that somehow to scare the walrus?~"; 4: walrus.hint++; "~Well, the sewer gas in the chute is really methane, isn't it? We saw ", (i) "something", " that wasn't supposed to be mixed with methane... but I can't remember what it was.~"; 5: walrus.hint++; "~Ooh, I remember. We saw a big vat of WizStrip at the WizStrip factory. If we could get that over here and into the chute, I bet there'd be a big bang that would scare the walrus away!~"; 6: walrus.hint++; "~We need to find a way to trick the factory into delivering the WizStrip here.~"; 7: "~We could use the address label from Ninario's old copy of Wizarding Weekly. Stick it on the vat and they'll deliver it here!~"; } } } else if (task_done->49 == 0) { ! Task 47 is the portcullis being raised if (task_done->47 == 0) { print "~We need to get the portcullis raised so the teamster delivering the WizStrip can get into the courtyard."; if (Gatehouse has visited) " I think the lever in the gatehouse probably raises it.~"; " If we look around we should be able to find a lever somewhere.~"; } switch (chute.hint) { 0: chute.hint++; "~With the portcullis open, if we wait around, the teamster should deliver the WizStrip.~"; 1: chute.hint++; "~Unless of course he's not sure where to pour the WizStrip. He probably expects us to have a vat of our own.~"; 2: if (Shed has visited) { chute.hint++; "~Unless of course he's not sure where to pour the WizStrip. He probably expects us to have a vat of our own.~"; } 3: "~Wait a minute, the sign from the shed! WizStrip delivery! If we hang that on the chute, he'll pour it right down there for us!~"; } } else if (task_done->50 == 0) { ! Check task 47 in here (that's the portcullis being raised) if (task_done->47 == 0) { print "~We need to get the portcullis raised so the teamster delivering the WizStrip can get into the courtyard."; if (Gatehouse has visited) " I think the lever in the gatehouse probably raises it.~"; " If we look around we should be able to find a lever somewhere.~"; } } else if (task_done->51 == 0) { "~Let's just wait and see what happens.~"; } else if (task_done->55 == 0) { switch (Blackpowder.hint) { 0: if (Tower_Roof.crystalvisit == false) "~Let's get up to the roof and see what Ninario and Yekcal are up to!~"; Blackpowder.hint++; "~We've got to stop Ninario and Yekcal!~"; 1: Blackpowder.hint++; "~If we attack, Yekcal keeps getting in the way!~"; 2: Blackpowder.hint++; "~If we throw anything at Yekcal or Renaldo, Yekcal keeps catching it!~"; 3: Blackpowder.hint++; "~Renaldo's lactose-intolerant. Have you tried throwing cheese at him?~"; 4: Blackpowder.hint++; "~If we throw cheese, Yekcal intercepts it! We've got to get rid of him!~"; 5: Blackpowder.hint++; "~If we throw cheese, Yekcal, all thumbs that he is, keeps fumbling it into the cannon.~"; 6: Blackpowder.hint++; "~What if we could make the cannon fire while he's in it?~"; 7: Blackpowder.hint++; "~Of course, the cannon won't fire without some black powder, will it?~"; 8: Blackpowder.hint++; "~Fortunately, you and Ninario being the way you are, the laboratory is always stocked with the ingredients for black powder.~"; 9: Blackpowder.hint++; "~I think the formula for black powder is even on the blackboard down in the laboratory. Your old chemistry notes aren't they?~"; 10: Blackpowder.hint++; "~Sulphur, charcoal and saltpetre isn't it? Or potassium nitrate, I suppose you call it.~"; 11: Blackpowder.hint++; "~Put all of those together in the workshop's ball mill and mix away! Presto, black powder!~"; } } else if (task_done->56 == 0) { if (Blackpowder notin Silk_Purse or Leather_Pouch) "~Now that we've made blackpowder, we just need to put in a proper pouch or purse and then put it in the cannon.~"; "~We just need to put the bag with the black powder in it into the cannon and it'll be ready to fire!~"; } else if (task_done->57 == 0) { switch (Cannon.hint) { 0: Cannon.hint++; "~We've got to stop Ninario and Yekcal!~"; 1: Cannon.hint++; "~If we attack, Yekcal keeps getting in the way!~"; 2: Cannon.hint++; "~If we throw anything at Yekcal or Renaldo, Yekcal keeps catching it!~"; 3: Cannon.hint++; "~Renaldo's lactose-intolerant. Have you tried throwing cheese at him?~"; 4: Cannon.hint++; "~If we throw cheese, Yekcal intercepts it! We've got to get rid of him!~"; 5: Cannon.hint++; "~If we throw cheese, Yekcal, all thumbs that he is, keeps fumbling it into the cannon.~"; 6: Cannon.hint++; "~What if we could make the cannon fire while he's in it?~"; 7: "~If we throw a piece of cheese at Yekcal, he'll fumble it into the cannon and dive in. Then we just yank the pull-cord!~"; } } else if (task_done->58 == 0) { if (renaldo.dtime ~= 0) "^Renaldo juggles ", (the)renaldo.item, " furiously, trying to gain control of it.^ ^~NOW!~ screams Crystal. ~Throw me at him! The snow globe is interdimensional! When it hits, it will explode and close the rift!~"; } "~I think we should explore around a bit more,~ says ", (the)crystal, ". ~Poke into every corner, pick up anything that isn't tied down... you know, the usual. Then we'll get a better idea of the possibilities.~"; HurryUp: "~I'll move faster the minute you do,~ declares ", (name)self, (string)period; Give: "~Yes,~ sighs ", (name)self, ". ~I'll get on that the ", (i) "moment", " I'm no longer stuck in a snow globe.~"; Sell: <>; Sing: "~I may be stuck inside this souvenir, but that doesn't mean I'm a novelty act!~ protests ", (name)self, (string)period; MeetNPC: <>; Talk: "~Well go on then,~ she says encouragingly. ~Ask me something.~"; default: "~Yes, you seem to have mistaken me for someone who has nothing better to do than carry out your every little whim.~ ", (name)self, " pauses and glances at her surroundings. ~Well, perhaps I don't, but that's still no excuse.~"; ], Wizask [; if (self.Topics & FLAG_x3 == FLAG_x3) print "~Well, as I said, the original wizard who imprisoned me "; else print "~That original wizard who imprisoned me... can't you guess?~ ", (name)self, " scowls. ~It "; self.Topics = self.Topics | FLAG_x3; "was that evil, creepy and all-around scum Renaldo.~"; ], has female objseen; Askable socks "threadbare woollen socks" with name 'socks' 'sock', adname 'threadbar' 'woollen' 'woolen', description "An embarrassingly dirty and threadbare pair of woollen socks. You're not normally this slovenly, but cleaning spells aren't covered until third year, and Ninario's bars of soap always seem dirtier than whatever you want to clean.", article "some", information [person; if (boots hasnt worn && slippers hasnt worn) { switch (person) { crystal: "~The threadbare aspect really makes you look like a real wizard,~ sighs ", (the)crystal, ". ~And they certainly look filthy enough, too.~"; crone: "~Definitely not interested in buying,~ says ", (the) crone, ". ~I have a drawerful of my own.~"; } } switch (person) { crystal: print "~Thank goodness they're hidden by "; if (slippers in player && slippers has worn) print "your slippers"; else print "those boots"; print_ret (murmurs)crystal, (string)period; crone: "~We don't buy or sell socks here,~ says ", (the) crone, ". ~It's not a millinery shop.~"; } ], before [; Disrobe: "It's a tossup, but things probably lean towards your socks being cleaner than your feet. You leave them on."; Eat: "You've eaten some unpleasant things before, but these socks would utterly defeat you."; Smell: "That would probably be unwise."; Rub: print "You rub futilely at some of the grimier bits of the socks.^"; if (crystal has general) "^~Never mind,~ sighs ", (the)crystal, ". ~They'll probably just disintegrate around your feet if you keep that up.~"; rtrue; ], has clothing pluralname; Askable greater_spenseweed "greater spenseweed" with name 'spensewee' 'weed' 'plant', adname 'greater' 'spense', description [; switch(crystal.crytime) { 13: "You're not sure what it is."; 14: "It looks like a small plant of some kind."; 15 to 16: "A close relative of the common roadside spenseweed plant, this stalk of greater spenseweed, usually found only on mountaintops, is much larger. It seems to radiate health and wellness."; default: "You can't see anything like that here."; } ], before [; Eat: "Can't you think of a better use for it?"; Use: if (second == nothing or crystal) <>; ], describe [; if (crystal.crytime >= 15) "^A stalk of greater spenseweed, delivered by the pterosaur you healed, lies here."; rtrue; ], information [person; switch (person) { crystal: "~Not available anymore,~ sighs ", (the)crystal, ". ~It only ever grew on clifftops, and attempts to cultivate it only resulted in growing the lesser spenseweed we have today. It's too bad, too. I've heard it could even be used to bring back people from the dead.~"; crone: "~Ah, greater spenseweed,~ sighs ", (the)crone, ". ~Back in the day, it could cure everything, even cheat death. But sadly, it's impossible to find these days. It only grows on rocky clifftops, and all the clifftops reachable by foot, broomstick, carpet and airship have long been picked clean. Until science finds us another method of flight, greater spenseweed is strictly for the birds, I'm afraid.~"; hermit: "~Greater spenseweed used to grow everywhere,~ admits ", (the)hermit, ", ~but it was picked clean, until you could only find it on mountaintops. But now, with all ", (the)broomstick, "s, flying carpets, and airships, anything remotely reachable has been harvested too.~ He sighs. ~Unless you have a pet eagle that can fetch it for you, you're out of luck these days.~"; people: print "~Spenseweed? "; switch (random(4)) { 1: print "Good for all your aches and pains,~ smiles"; 2: print "Cures those nagging discomforts, but still not a patch on greater spenseweed from days gone by,~ sighs"; 3: print "Another one of these overrated folk remedies if you ask me,~ sniffs"; 4: print "Oh, it's worked wonders on my creaking bones,~ confides"; } randcrowd(); rtrue; captain: <>; } ]; Askable fake_spenseweed "plant" with name 'plant', description "You can't tell what it is from here.", before [; Examine: rfalse; default: "It's too far away right now!"; ]; Prop Road_Obj "dry dusty road" with name 'road', adname 'dry' 'dusty', description "The road is a dry dusty ribbon of earth.", FakeObj, found_in Vechlee_Road Vechlee_Road_Vision Farmgate_Area, before [; Examine: rfalse; Lick,Taste: "It's dry and dusty."; Dig: "You dig away in the dirt, but don't uncover anything interesting. You stand back up, dusting the earth off your hands."; default: "You shouldn't worry about the road so much. It can take care of itself."; ]; Prop Fence "wooden fence" with name 'fence' 'fences', adname 'wooden', 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 Vechlee_Road Vechlee_Road_Vision Farmgate_Area, before [; Climb: if (self in Farmgate_Area) <>; <>; ]; NPC Yekcal "Yekcal" with name 'yekcal' 'yeckal' 'man' 'legs', adname 'small' 'mousy' 'looking' 'mousy-loo', description [; if (self.in_cannon && globalvision == false) " All that's visible of Yekcal are his legs protruding from the cannon."; print "Yekcal is small and mousy-looking. His eyes dart around nervously, "; if (real_location == back_room) "always looking for trouble."; "but continually come to rest on Renaldo, eyeing him with a strange mix of apprehension and admiration."; ], each_turn [; if (self.in_cannon && globalvision == false) "^Yekcal's legs kick spasmodically as he rummages around in the cannon. ~I'm finding it sir!~ he calls out."; rfalse; ], in_cannon false, found_in [; if (location == Vechlee_Road_Vision or Main_Hall_Vision or Laboratory_Vision or Bedroom or back_room or Antechamber_Vision or Workshop_Vision or Tower_Roof_Vision) rtrue; if (location == Tower_Roof && task_done->57 == 0) rtrue; rfalse; ], describe [; if (location == Vechlee_Road_Vision) " A small mousy-looking man, presumably Yekcal, stands beside him."; else if (location == back_room) "^Yekcal, small and mousy-looking, is standing by the cubbyholes, looking furtive."; else if (location == Antechamber_Vision) " Yekcal, small and mousy-looking, stands beside the tall figure."; else if (location == Tower_Roof) { if (self.in_cannon) " All that's visible of Yekcal are his legs protruding from the cannon."; " Yekcal stands beside him, darting suspicious glances at you."; } else " Yekcal, small and mousy-looking, stands beside him."; ], information [person; switch (person) { crystal: "~I don't know much about Yekcal", (admits)crystal, ", ~but he's been Renaldo's second-in-command since your guild hall explosion injured Virgil.~"; teller: "~Never had much occasion to deal with him", (admits)teller, ". ~His master Renaldo's not one to do business at a place associated with the Plumbers Union.~"; hermit: "~Word is, he's Renaldo's lackey. Follows him everywhere.~"; captain: "~Wizards,~ mutters ", (the)self, ". ~Can't abide most of 'em. Especially not their lackeys.~"; crone: "The old crone scowls. ~Renaldo's lackey. A fawning, crawling slime of a wizard if ever there was one.~"; people: switch (random(4)) { 1: print "~After Virgil was injured in that guild hall explosion last year, Yekcal, another Wizards Guild lackey, took over second-in-command, and never really relinquished it,~ explains"; 2: print "~Virgil had to give up his post as second-in-command after that guild hall explosion, and Yekcal's the new favourite,~ confides"; 3: print "~Both Virgil and the new favourite, Yekcal, are fawning toadies of the worst stripe,~ complains"; 4: print "~No one's seen Virgil or Yekcal for months, but rumour is the guild is still active. They're both second-in-command to Renaldo, of course,~ explains"; } randcrowd(); rtrue; betty: print "~Ooh, he's a bit stern, that one, luv,~ cautions ", (the)betty, ". ~He came in to the shop in Vechlee a few times to buy wood for the Guild, and he was always a bit slimy. Mum didn't like the sound of him at all. If he hadn't been Renaldo's right-hand man, he might not have made it back to the Guild Hall safely.~^"; if (crystal has general) print "^~See what I mean about her and her mum?~ whispers ", (the)crystal, ".^"; rtrue; } ], time_left, time_out [; while (child(Cannon)) { move child(Cannon) to location; } Cannon.Blackpowder_in_Bag = false; yekcal.in_cannon = false; MoveFloatingObjects(); "^Yekcal finally manages to extricate himself from the cannon along with everything inside it. ~I found everything that was in there, sir!~ he cries proudly, dropping it all on the ground.^ ^Renaldo ignores him, intent on his spell."; ], before [; Attack: if (Yekcal.in_cannon == true) "Yekcal's legs kick at you mercilessly."; "Through a concerted effort, Yekcal dodges you, fending off your attack and remaining focused on Renaldo."; Examine: rfalse; Pull: if (Yekcal.in_cannon == true) "Yekcal's legs kick at you mercilessly as you try to grasp them to pull him out."; "Yekcal dodges out of your grasp."; Examine: rfalse; Thank: if (Yekcal.in_cannon == true) "~Oh, you're welcome, I'm sure!~ calls out Yekcal, his voice echoing hollowly in the cannon."; "~Oh, um, you're welcome,~ mutters Yekcal, darting anxious glances at Renaldo."; default: if (Yekcal.in_cannon == true) "Yekcal ignores you, focused on retrieving the cheese from the cannon."; "Yekcal ignores you, focused on Renaldo."; ], life [; default: if (Yekcal.in_cannon == true) "Yekcal ignores you, focused on retrieving the cheese from the cannon."; "Yekcal ignores you, focused on Renaldo."; ], orders [; if (Yekcal.in_cannon == true) "Yekcal ignores you, focused on retrieving the cheese from the cannon."; "Yekcal ignores your order, focused on Renaldo."; ], has proper objseen; NPC Renaldo "Renaldo" with name 'renaldo' 'figure' 'man', adname 'tall' 'grim' 'forbidding', dtime 0, item 0, daemon [; self.dtime++; if (self.dtime < 5) "^Renaldo juggles ", (the)self.item, " furiously, trying to gain control of it.^ ^~NOW!~ screams Crystal. ~Throw me at him! The snow globe is interdimensional! When it hits, it will explode and close the rift!~"; if (self.dtime == 5) { StopDaemon(self); print "^Renaldo stops juggling ", (the)self.item, " around, gains control of ", (itorthem)self.item, " and drops ", (itorthem)self.item, " to the ground. Then he fixes you with a particularly beady stare before engaging on his spell again."; StartDaemon(Tower_Roof_D); self.RenStop(); rtrue; } ], RenStop [; move self.item to location; MoveFloatingObjects(); self.item = 0; self.dtime = 0; new_line; rtrue; ], description [; if (location == Antechamber_Vision) { "Tall, grim and forbidding, the figure bears little resemblance to Ninario's comforting squatness, apart from the bunny-patterned wizard's robes."; } print "Tall, grim and forbidding, Renaldo is worlds away from Ninario's comforting frumpiness. His mouth is a thin uncompromising line, speaking to his stern and unyielding character. "; if (location == Vechlee_Road_Vision) "He seems to have aged considerably in the year he's been in hiding."; if (location == Main_Hall_Vision) "You're not certain, but he looks a bit older and greyer than in your first vision."; if (location == Laboratory_Vision) "He's definitely aged since your first vision of him this morning. His hair is distinctly grey and his face lined."; if (location == Bedroom) "His hair is now a steely grey and his face lined with wrinkles."; if (location == Workshop_Vision) "His steely grey hair has thinned since you last saw him and his skin is wrinkled and liver-spotted."; if (location == Tower_Roof_Vision) "He looks shockingly old: his hair is now white and wispy, his eyes are rheumy and lack focus, and his skin has the translucent quality of the very elderly."; ], found_in [; if (location == Vechlee_Road_Vision or Main_Hall_Vision or Laboratory_Vision or Bedroom or Antechamber_Vision or Workshop_Vision or Tower_Roof_Vision or Tower_Roof) rtrue; rfalse; ], information [person; switch (person) { crystal: if (Renaldo in location && location == Antechamber_Vision) { "~That's not Ninario!~ growls ", (the)crystal, " in an alarmingly feral way. ~It's that high and mighty scum Renaldo. Oooh, if I could get out of this snow globe.~"; } if (Renaldo in location) { "~There he is!~ growls ", (the)crystal, " in an alarmingly feral way. ~There's that high and mighty scum. Oooh, if I could get out of this snow globe.~"; } if (crystal.Topics & FLAG_x3 == FLAG_x3) "~If I ever meet up with him...~ threatens ", (the)crystal, ", ~oooh, just watch out.~"; print "~Renaldo? You want to know how I know him?~ sputters ", (the)crystal, " in high dudgeon. "; crystal.Wizask(); rtrue; captain: "~Wizards,~ mutters ", (the)captain, ". ~Can't abide most of 'em.~"; crone: if (crone.Topics & FLAG_x1 == FLAG_x1) { if (crone.Topics & FLAG_x2 ~= FLAG_x2) { crone.Ballask(); new_line; } print "A look of disgust crosses the crone's face. ~Well, Renaldo was one of those who sought to extend his life using the souls of young children. That ball you carry is obviously one of them. He must have been around longer than we all thought, perpetuating this vile scheme. And wherever he's hiding out, you can be sure he's looking for his next stock of victims. It's hard to do this sort of thing in Thalion anymore, but back when he was younger, poverty was so rampant, I'm sure the supply lines were a little easier.~^"; crone.Postball(); rtrue; } crone.Topics = crone.Topics | FLAG_x1; print_ret "A look of revulsion crosses her face. ~Renaldo disgusts me,~ she says with surprising vehemence. Her voice sinks to a whisper. ~Much information has come to light since you and your master routed out the Guild. Sinister information, about Renaldo's unusual long life, even for a wizard. And about certain practices in his past.~"; hermit: print_ret (The)hermit, " shrugs. ~Haven't seen much of Renaldo or the guild since you and your master took care of them last summer.~"; people: switch (random(5)) { 1: print "~We haven't seen much of Renaldo or the guild since Ninny and his wily apprentice took care of them last summer,~ says"; 2: print "~I think Renaldo and the remnants of the guild are in hiding, actually,~ frowns"; 3: print "~I think Renaldo and the guild are hiding somewhere in Blumph,~ confides"; 4: print "~The guild is definitely hiding out in Vechlee,~ declares"; 5: print "~Wherever Renaldo and the guild are, good riddance to them,~ mutters"; } randcrowd(); rtrue; akbar: "~Oh, I don't worry too much about them. I just try to sell rugs and carpets.~"; betty: "~Ooh, such a nice man, luv,~ gushes ", (the)betty, ". ~I met him once, you know, just after I opened my wood shop in Vechlee. Very friendly.~"; teller: "~Never had much occasion to deal with him", (admits)teller, ". ~He's not one to do business at a place associated with the Plumbers Union.~"; } ], describe [; if (location == Antechamber_Vision) { print "^A tall figure wearing bunny-patterned wizard's robes is here, his face obscured."; } else print "^Renaldo"; if (location == Vechlee_Road_Vision) print ", stern and grim, stands here looking at the closed doors."; if (location == Main_Hall_Vision) print " stands here, gazing around the hall."; if (location == Laboratory_Vision) print " is here, looking irritated."; if (location == Bedroom) { if (Bedroom.dtime < 2) print " is here, rummaging through a wardrobe on the southern wall."; else print " is here, looking frustrated."; } if (location == Workshop_Vision) { print " stands here, struggling with an interplanar rift analyser."; } if (location == Tower_Roof_Vision) { print " stands here on the tower roof, looking shockingly old."; } if (location == Tower_Roof) { print " is here, struggling to expand the interplanar rift. His arms wave about as he attempts to summon and control enormous forces."; if (Yekcal notin location) new_line; ! This is the only one we want to rtrue, because in the rest, we want to print that Yekcal is here too. } rtrue; ], react_before [; if (globalvision == false) rfalse; Answer,Consult,ItemAsk,MeetNPC,Tell,Talk,MeetNPC: if (noun == crystal) rfalse; "Renaldo and Yekcal don't seem to be able to hear you, which is perhaps just as well."; Listen: "You listen closely. Fortunately, this is one of those fancy new visions with light ", (i) "and", " sound. It's a significant upgrade from the black and white line drawing visions of yesteryear."; Examine,Inv,InvTall,InvWide,Look,Read,Search,Wait,Xyzzy: rfalse; default: print "Unfortunately, as this is a vision, there's not much you can do other than watch and wait"; if (real_location == Garden_Vision) ". You can't even talk to ", (the)crystal, ", as, oddly, she doesn't seem to be sharing the vision with you."; ". Or talk to ", (the)crystal, ", who seems to be sharing the vision with you."; ], nomatch [; "Renaldo doesn't seem to be interested in answering too many of your questions."; ], before [; Consult: "You're not sure it's the best time to pester Renaldo with your questions."; Attack: "An unseen maelstrom of force seems to surround and protect Renaldo."; Bargain: "Such a stern and forbidding man cannot possibly be reasoned with."; Kiss: "You're not sure planting a smack on Renaldo's lips would do much to soften his mood."; Listen: "He's ranting about you not possibly being able to thwart his plans. It's the full, genuine evil mastermind spiel."; MeetNPC,Talk: "~Don't bother me with your inanities,~ growls Renaldo. ~I'll do the talking.~"; Smell: "He even ", (i) "smells", " evil."; Touch,Search: "~Keep your hands to yourself, you filthy apprentice!~ snarls Renaldo as he slaps your hands away."; Thank: "~You won't be thanking me once I get this rift open!~ snarls Renaldo."; WakeOther: "He's wide awake and spoiling for a confrontation."; ], life [; Answer: if (noun == 'hello' or 'hi') <>; else <>; Show: !TODO: how about cheese? Tell: "No one seems to pay any interest to you."; ], orders [; MeetNPC: <>; default: "~", (i) "You", " don't get to order ", (i) "me", " around,~ scoffs Renaldo derisively."; ], has proper objseen; Autodoor Caer_Door_Vision "huge wooden doors" with name 'doors' 'door' 'lock', adname 'caer' 'huge' 'wooden' 'iron-band', description [; print "The wooden doors look large and imposing, reinforced with large strips of iron. They loom imposingly, "; if (self has open) print "framing"; else print "blocking"; print " the way "; if (location == Vechlee_Road_Vision) print "into"; else print "out of"; " the caer."; ], w_to Vechlee_Road_Vision, e_to Bailey_Vision, ! Even though the autodoor class has this, we need to replicate it here so in a vision, Renaldo's react_before takes precedence. before [; if (real_location == Tower_Roof or Tower_Roof_Vision && action ~= ##Examine) "You can't do that from up here on the tower roof."; if (real_location == Bedroom && action ~= ##Examine) "You can't do that from up here in the ", (ToLower)location, (string)period; Close: if (self has open) "It's best to just leave the doors open, in case a quick getaway is needed."; "The doors are already closed."; Lock: if (self has locked) "The doors are already locked."; Search: <>; Take: "The doors are far too large to take. Besides, you're not certain you even like the colour."; ], with_key big_key, has scenery pluralname ~open locked lockable; Autodoor Caer_Door "huge wooden doors" with name 'doors' 'door' 'lock', adname 'caer' 'huge' 'wooden' 'iron-band', description [; print "The wooden doors look large and imposing, reinforced with large strips of iron. They loom imposingly, "; if (self has open) print "framing"; else print "blocking"; print " the way "; if (real_location == Vechlee_Road) print "into"; else print "out of"; " the caer."; ], w_to Vechlee_Road, e_to Bailey, ! Even though the autodoor class has this, we need to replicate it here so in a vision, Renaldo's react_before takes precedence. before [; if (real_location == Bedroom && action ~= ##Examine) "You can't do that from up here in the ", (ToLower)location, (string)period; Close: if (self has open) "It's best to just leave the doors open, in case a quick getaway is needed."; "The doors are already closed."; Lock: if (self has locked) "The doors are already locked."; Search: <>; Take: "The doors are far too large to take. Besides, you're not certain you even like the colour."; ], with_key big_key, has scenery pluralname ~open locked lockable; OutroomV Garden_Vision "Garden" with description [; self.gv_seen = true; move crystal to location; crystal.out = 2; remove ball; MoveFloatingObjects(); StartDaemon(self); "Formerly a large barren plot of earth, this area has been transformed at your insistence and thanks to your careful tending during visits back to Ninario's tower over the past year. A verdant carpet of flowers has flourished in the rich soil, lending a magnificence of colour and richness of smell. To the east is the wall of the caer running north and south. Paths head northwest and southwest around the base of the tower."; ], #Ifdef GRAPHICS_ENABLED; map_offset 83, comp_mask NW_MASK | SW_MASK, #Endif; dtime 0, vision false, gv_seen false, daemon [; self.dtime++; if (self.dtime == 2) "^Your vision self smoothes Crystal's hair, framing it around her face."; if (self.dtime == 3) "^Drops of water fall onto Crystal's face. You glance up, but don't see any rainclouds in the sky."; if (self.dtime == 4) "^With a start, you realise that your vision self is crying silently, the drops falling onto Crystal's face. ~Why?~ you ask yourself, and then realise that your vision self is repeating that very question, over and over."; if (self.dtime == 5) { print "^Your vision self wipes your tears from Crystal's face and then plants a chaste kiss on her smooth cheek."; new_line; move crystal to ball; move ball to player; crystal.out = 0; crystal.crytime = 0; EndVision(self); MoveFloatingObjects(); StopDaemon(self); if (initialvision == true) { Achieved(54); print "^~Well what was that?~ demands ", (the)crystal, " exasperatedly. ~No vision at all? Useless piece of ", (name)child(tyro), ".~^ ^You stay silent, unsure what to say.^"; } else { print "~I don't know why you keep trying that cheese,~ says ", (the)crystal, ". ~It's useless!~^"; } initialvision = false; rtrue; } ], 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 circles northwest around the base 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; ], react_before [; Go: if (crystal.out ~= 0) "You can't bring yourself to abandon ", (the)crystal, "."; ], cant_go [; "Unfortunately, as this is a vision, there's not much you can do other than watch and wait. Or talk to ", (the)crystal, ", who seems to be sharing the vision with you."; ], Walls FLOWERS; OutroomV Garden "Garden" with description [; #Ifdef GRAPHICS_ENABLED; RevealVechlee(self.map_offset); #Endif; "Formerly a large barren plot of earth, this area has been transformed at your insistence and thanks to your careful tending during visits back to the tower over the past year. A verdant carpet of flowers has flourished in the rich soil, lending a magnificence of colour and richness of smell. To the east is the wall of the caer running north and south. Paths head northwest and southwest around the base of the tower."; ], #Ifdef GRAPHICS_ENABLED; map_offset 83, comp_mask NW_MASK | SW_MASK, #Endif; 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 circles northwest around the base 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; ], react_before [; Go: if (crystal.out ~= 0) "You can't bring yourself to abandon ", (the)crystal, "."; ], cant_go "You can go either northwest or southwest along the stone path.", u_to [; <>; ], e_to "You don't want to go needlessly tramping around on the flowers.", nw_to [; if (crystal.out ~= 0) "You can't bring yourself to abandon ", (the)crystal, "."; #Ifdef GRAPHICS_ENABLED; vechleemap-->147 = 20; vechleemap-->148 = 5; vechleemap-->149 = 5; vechleemap-->150 = 5; vechleemap-->151 = 19; vechleemap-->178 = 23; vechleemap-->184 = 15; vechleemap-->210 = 6; vechleemap-->216 = 6; #Endif; print "You follow the path northwest around the base of the tower, continuing round to the courtyard on the west side.^"; return W_Courtyard; ], sw_to [; if (crystal.out ~= 0) "You can't bring yourself to abandon ", (the)crystal, "."; #Ifdef GRAPHICS_ENABLED; vechleemap-->343 = 3; #Endif; print "You follow the path southwest around the base of the tower.^"; return S_of_Tower; ], Walls FLOWERS; Prop lush_garden "lush garden" with name 'garden' 'flowers' 'flower' 'carpet', adname 'lush' 'verdant', description "The garden is a verdant carpet of many different kinds of flowers. The copper and ammonium sulphate you used from Ninario's laboratory certainly paid dividends out here.", react_before [; Smell: if (noun == nothing) <>; ], found_in Garden Garden_Vision, before [; Dig,Take: "You don't want to damage any of the flowers."; Enter: <>; Smell: "You breathe in the air deeply, the rich scents of flowers and heavy loam filling your nostrils."; ]; !==================================================================================================================================================== ! Vechlee Road OutroomV Vechlee_Road_Vision "Vechlee Road", with description [; if (self.vision == true) Startdaemon(self); print "The main road in and out of Vechlee is a dry and dusty ribbon of earth running northeast and southwest. The "; if (turns < 600) { if (turns < 100) print "morning sun shines down on you from the east, bright and warm."; else if (turns < 600) { if (turns < 200) print "mid-morning sun shines down on you from high"; else if (turns < 300) print "noontime sun blazes directly"; else if (turns < 400) print "early afternoon sun blazes down on you from"; else if (turns < 500) print "mid-afternoon sun blazes down on you from"; else print "late afternoon sun, still high at this time of year, blazes down on you from"; print " overhead."; } } else if (turns < 700) print "early evening sun shines down on you from the west."; else if (turns < 800) print "evening sun shines down on you from the west."; else if (turns < 900) print "evening sun shines down on you from the west as it heads for the horizon."; " A meandering country fence runs along the edge of the road to the northwest. East, the wooden doors into the caer hang closed, forbidding slabs of wood and iron. Southeast, a narrow path runs into a large hayfield."; ], #Ifdef GRAPHICS_ENABLED; map_offset 71, comp_mask NE_MASK | E_MASK | SW_MASK | SE_MASK, #Endif; dtime 0, vision true, daemon [; self.dtime++; if (self.dtime == 2) "^~Sir,~ murmurs Yekcal, tugging at Renaldo's sleeve, ~sir, I still don't follow. How do we reach into the world the apprentice comes from?~"; if (self.dtime == 3) "^~It's easy, you fool,~ snaps Renaldo, still gazing at the doors. ~Despite the efforts of Ninario and his misguided cohorts, the rift between worlds is still open, yes?~^^~Er, I suppose,~ says Yekcal hesitantly."; if (self.dtime == 4) "^~You suppose!~ sneers Renaldo. ~Of course it is. Well, we seek to expand it so we can access that world's... ", (i) "resources", ". All we need is to understand its structure.~^^~How will breaking into Ninario's caer help us understand the structure?~"; if (self.dtime == 5) "^~Because, you short-sighted fool, we need an interplanar rift analyser, and I know Ninario has one. Now shut up and let me concentrate on getting this door open.~ Renaldo gazes at the doors again."; if (self.dtime == 6) { print "^~If we had a cannon, we could blast through it. That's how the apprentice did it last year,~ quips Yekcal, grinning.^ ^~I'll put your head through it in a minute if you don't shut up,~ growls Renaldo."; new_line; EndVision(self); StopDaemon(self); if (initialvision == true) { Achieved(10); print "^~Well, isn't that astounding?~ says ", (the)crystal, " in surprise. ~I didn't know I could share those visions with you. And that Renaldo! I wonder what resources he wants from your world. It's alarming that he's looking for that rift analyser too. We'd better pick up the pace!~^"; } initialvision = false; rtrue; } ], compass_look [obj; if (obj == ne_obj) "The dusty road winds away into farming country to the northeast."; if (obj == sw_obj) "Southwest, the dusty road winds away toward Vechlee."; if (obj == e_obj) <>; 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 [; "Unfortunately, as this is a vision, there's not much you can do other than watch and wait. Or talk to ", (the)crystal, ", who seems to be sharing the vision with you."; ], has proper; OutroomV Vechlee_Road "Vechlee Road", with description [; #Ifdef GRAPHICS_ENABLED; RevealVechlee(self.map_offset); #Endif; "The main road in and out of Vechlee is a dry and dusty ribbon of earth running northeast and southwest. The sun shines down from high overhead, the warm heat of summer. A meandering country fence runs along the edge of the road to the northwest. East, the wooden doors into the caer hang closed, forbidding slabs of wood and iron. Southeast, a narrow path runs into a large hayfield."; ], #Ifdef GRAPHICS_ENABLED; map_offset 71, comp_mask NE_MASK | E_MASK | SW_MASK | SE_MASK, #Endif; compass_look [obj; if (obj == ne_obj) "The dusty road winds away into farming country to the northeast."; if (obj == sw_obj) "Southwest, the dusty road winds away toward Vechlee."; if (obj == e_obj) <>; 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 caer, or southwest back to Vechlee.", 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 [; guard.mesmer = 0; 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 Farmgate_Area; ], se_to [; guard.mesmer = 0; print "You walk southeast along the narrow path into the middle of the hayfield.^"; #Ifdef GRAPHICS_ENABLED; vechleemap-->303 = 5; #Endif; return Hayfield; ], e_to Caer_Door, sw_to [; guard.mesmer = 0; print "You march down the long southwest road, dust billowing around your feet. After a lengthy walk, you arrive back at the Vechlee town gate and step through into the bustle of the town.^"; return Vechlee_Gate; ], Floor DIRT, has proper; NPC guard "guard" with name 'guard' 'sergeant' 'man' 'soldier' 'chap' 'fellow' 'ted', description [; "A disagreeable-looking fellow with a large ruddy face, ", (the) self, " looks large and strong, more than capable of keeping watch over the caer. His uniform, which looks brand-new, is a resplendent blue and emblazoned with the image of a golden wand. He reminds you greatly of your friend Ned, who used to guard the Wizards Guild Hall, but it's clearly not him."; ], short_name [; print "guard"; rtrue; ], Chat 0, Topics 0, information [person; switch (person) { crystal: if (guard hasnt general) "~A real nuisance, isn't he?~ murmurs ", (the)crystal, ". ~I wonder how we can get rid of him?~"; "~We managed to sort him out, didn't we?~ asks ", (the)crystal, ". ~Too bad he broke our ", (name)autoclimber, ".~"; } ], initial [; if (location.crystalvisit == false) { self.Chat = 0; "A stern and forbidding-looking guard stands atop the caer wall, gazing down imperiously. When he sees you, his eyes narrow in suspicion."; } if (Vechlee_Road.hoopsack_arrive == true) { Vechlee_Road.hoopsack_arrive = false; print_ret "The guard scowls down at you. ~Magic weel git tha nowheear wi'ma,~ he growls."; } self.Chat = 0; switch(random(15)) { 1: print_ret (The)self, " atop the western wall glares in your direction."; 2: print_ret (The)self, " nods curtly at you, but still keeps an eye on you."; 3: print_ret (The) self, " nods curtly at you. ~Keep thah 'ands wheear ah can see 'em, if tha suits,~ he calls down."; 4: print_ret (The) self, " points two fingers at his eyes, then points two fingers at you."; 5 to 15: print_ret (The) self, " stands atop the caer wall, looking grim and focused."; } ], free 0, found_in [; if (globalvision == true) rfalse; if (location == Vechlee_Road && self hasnt general) rtrue; ], each_turn [; if (autoclimber.aimed_at == self && autoclimber.attached == true) { if (self.free == 5) { autoclimber.attached = false; self.free = 0; print_ret "^", (The)guard, " finally succeeds in freeing himself from the cable. He throws the grappling hook down into the dusty road and fixes you with a glare. ~Tha's got sum nerve, young'un!~"; } else { self.free++; if (self.free == 1) print_ret "^", (The) guard, " begins struggling to free himself."; print_ret "^", (The)guard, " struggles mightily to free himself from the cable."; } } switch (self.mesmer) { 1 to 3: new_line; print_ret (The)self, " ignores the spectacle in the snow globe."; 4: new_line; print_ret (The)self, " stolidly continues to ignore the spectacle in the snow globe."; 5: self.mesmer = 0; new_line; print (The)self, " glances down and smirks at you.^^"; print_ret (The)crystal, " sighs. ~I guess he's too far away for it to affect him. Or perhaps too empty upstairs.~"; } if (self.Chat == 1 && location == Vechlee_Road && self hasnt general) { switch(random(45)) { 1 to 10: print "^", (The) self, " marches smartly around the top of the caer wall.^"; 11 to 20: print "^", (The) self, " glances down at you briefly.^"; 31 to 40: print "^", (The) self, " sighs and shifts his stance slightly.^"; 41 to 45: print "^~Ah reckon nowt on plumbers,~ mutters ", (the) self, " to himself. ~Ah deean't reetlins knaw what t'bother's awl aboot wi' t'Wizard's Guild.~^"; } } self.Chat = random(3); rtrue; ], before [wd; Consult: wn = consult_from; wd = NextWord(); switch (wd) { 'building', 'wall', 'caer': "~Nowt ti tell,~ snaps ", (the) self, ". ~Ah's 'ere ti keep t'leykes o' thoo oot. Ah 'ev nobbut wrowt 'ere fower day.~"; 'fout': "~Aye, a fout. A reet fout,~ repeats ", (the)self, "."; 'fond-heead': "~Aye, a fond-heead. T'were what I sed,~ repeats ", (the)self, "."; 'family', 'ned', 'himself', 'guard': "~Nah family, 'cept ma fond-heead brother Ned, wheea joined t'Plumbers Union,~ declares ", (the) self, ". ~'e's a reet fout.~"; 'ted', 'him', 'himself', 'job', 'work': if (self has proper) "~Ah's the fella wheea's 'ere ti kep tha oot, tha grahzly fout!~ cries ", (the)self, "."; <>; 'plumber^s', 'plumber', 'plumbers', 'union', 'raffle-pa': "~A reet pairt of raffle-packs, theyt lot!~ declares ", (the) self, " with great disdain."; 'wizard^s', 'wizards', 'guild', 'yekcal', 'renaldo': "~Awl still stthrong effther awl this tahm,~ nods ", (the) self, ". ~Theyt Renaldo's a canny soort ov a chap.~"; default: "~Ah dean't knaw nowt aboot 'at,~ declares ", (the) self, " stoutly."; } Attack,Take,Search,Kiss,Touch: "With him up the wall and you down here, that's going to be difficult."; Bargain: print_ret (The) self, " shakes his head and glares. ~Deean't tha go thinking thoo can get best o' ma, young'un.~"; Listen: print_ret (The) self, " maintains a solid presence on the wall, muttering to himself about renegade wizards, plumbers, their apprentices and his eagerness to smash the Plumbers Union. Or at least, that's your best guess at what he's saying."; MeetNPC: if (self has proper) print_ret "~Tha's met ma afoor noo, tha fout!~ barks ", (the) self, "."; give self proper; self.short_name = "Ted"; "The guard nods curtly at you. ~Ah's heer for ti deea a job. Ah've na tahm for t'leykes o' thoo, but t'naim's Ted.~"; Smell: "You can't smell him from down here."; Smile,Thank: print_ret (The)guard, " scowls down at you."; Talk: "~Wants-ta summat? If neea, move reet along,~ declares ", (the) self, "."; ], life [; Answer: if (noun == 'hello' or 'hi') <>; else "~Wants-ta summat? If neea, move reet along,~ declares ", (the) self, "."; Give: <>; Show: if (noun == tyro) print_ret (The)self, "'s eyes bulge. ~Dost tha reetlins ha' a Mr Wizard Portable Tyromancy Deluxe? Arn't tha a greeat demmed wastrill noo then? It fair gars ma greet, ah'll tell tha.~"; if (noun == licence or boots or uniform) print_ret (The)self, " shrugs. ~Git tha gahn t'eership theyn.~"; if (noun == autoclimber) "~Be tha' t'MegaMountain Autoclimber Extreme?~ demands ", (the) self, " excitedly. You reply in the affirmative. ~'Tis a lawd o' auld brash,~ he sniffs dismissively."; print_ret (The)self, " shrugs disinterestedly. ~Ah dean't cair, young'un.~"; Tell: if (second == player) "~Oh aye,~ nods ", (the) self, " not showing much interest. ~"; print_ret (The) self, " yawns theatrically. ~Oh aye, ah ed an ideear 'at wur t' cayse.~"; ], orders [; LetIn: print_ret (The) self, " shrugs. ~Ah deann't 'ev ti listen ti tha,~ sniffs ", (the)self, ". ~Run away wi'tha,~"; MeetNPC: <>; default: "~Ah ev ti mind Renaldo and Yekcal, nut tha,~ says ", (the) self, " disdainfully."; ], has animate male; !==================================================================================================================================================== ! Farm area OutroomV Hayfield "Hayfield" with description [; #Ifdef GRAPHICS_ENABLED; if (location hasnt visited) { RevealVechlee(self.map_offset); } #Endif; print "The path ends here in the middle of the field, just in front of a large haystack. To the north, you can see the wall of Ninario's caer. Northwest, the path heads back to the Vechlee road.^"; rtrue; ], #Ifdef GRAPHICS_ENABLED; map_offset 139, comp_mask NW_MASK | U_MASK, #Endif; before [; Exit: if (player in location) <>; rfalse; ], compass_look [obj; if (obj == n_obj or ne_obj) <>; if (obj == nw_obj) "The path heads back to the main road."; if (obj == sw_obj or se_obj or e_obj or s_obj) "Barren fields extend away to the ", (name)obj, (string)period; "You don't see anything interesting in that direction, other than what's already been mentioned."; ], cant_go [; "The only direction is northwest back to the main road."; ], nw_to [; #Ifdef GRAPHICS_ENABLED; vechleemap-->337 = 13; vechleemap-->303 = 5; #Endif; print "You head northwest along the path back to the Vechlee road.^"; return Vechlee_Road; ], u_to [; if (lead in player) "You'll never get up there with that lump of lead in your hands."; print "You scramble up into the haystack.^"; #Ifdef GRAPHICS_ENABLED; vechleemap-->337 = 14; #Endif; return Atop_Haystack; ]; Furniture Haystack "haystack" with name 'haystack' 'stack' 'mound', adname 'golden' 'towering' 'of' 'hay', description [; print "The haystack is a towering mound of golden hay. It looks like you could scramble up it if you wanted.^"; self.describe(); ], found_in Hayfield Atop_Haystack, describe [; if (child(self) == 0) rtrue; else print "^Sitting atop the haystack"; WriteListFrom(child(self), ENGLISH_BIT + ISARE_BIT); print_ret (string)period; ], before [; Climb: <>; Search: if (child(self) == 0) { print "You find nothing.^^~What are you looking for?~ asks ", (the)crystal, ". ~Needles?~^"; YesNo.Ask(self.NeedleYes, self.NeedleNo, 0); rtrue; } rfalse; Smell: "You breathe in the scent of new hay."; Touch: <>; ], NeedleMaybe [; "~Well, I wouldn't bother,~ says ", (the)crystal, ". ~We don't need any.~"; ], NeedleYes [; if (verb_word == 'maybe') { Haystack.FixMaybe(); rtrue; } "~Well, good luck,~ says ", (the)crystal, "."; ], NeedleNo [; "~That's good. I've heard that can be difficult, kind of like... what's that expression?~"; ]; Askable -> Tarp "tarpaulin" with name 'tarp' 'tarpaulin' 'sail', adname 'large' 'off-white', description "A large off-white tarpaulin, about 10 feet square. It's evidently meant to keep water from hitting the top of the haystack."; OutroomV Atop_Haystack "Atop the Haystack" with description [; #Ifdef GRAPHICS_ENABLED; if (location hasnt visited) { RevealVechlee(Hayfield.map_offset); } #Endif; "There is a commanding view of the surrounding fields from up here on the haystack. To the north, you can see the wall of Ninario's caer. Northwest, the path heads back to the Vechlee road, and the hayfield lies below."; ], #Ifdef GRAPHICS_ENABLED; map_offset 139, comp_mask D_MASK | NW_MASK, #Endif; compass_look [obj; if (obj == n_obj or ne_obj) <>; if (obj == nw_obj) "The path heads back to the main road."; if (obj == sw_obj or se_obj or e_obj or s_obj) "Barren fields extend away to the ", (name)obj, (string)period; if (obj == d_obj) "You see the hayfield down below you."; "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 only directions are back down to the hayfield or northwest back to the main road."; ], d_to [; #Ifdef GRAPHICS_ENABLED; vechleemap-->337 = 9; #Endif; print "You slide down the haystack into the hayfield.^"; return Hayfield; ], nw_to [; #Ifdef GRAPHICS_ENABLED; vechleemap-->337 = 13; vechleemap-->303 = 5; #Endif; print "You head northwest along the path back to the Vechlee road.^"; return Vechlee_Road; ]; !==================================================================================================================================================== ! Farm area OutroomV Farmgate_Area "Farm Gate" with description [; #Ifdef GRAPHICS_ENABLED; if (location hasnt visited) { RevealVechlee(self.map_offset); } #Endif; "The Vechlee road ends here at a farm gate to the north. Beyond it is a large open farmyard.^ ^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."; ], #Ifdef GRAPHICS_ENABLED; map_offset 9, comp_mask E_MASK | SW_MASK, #Endif; 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 and then Vechlee."; 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 "You don't really need to invade the farmyard.", sw_to [; print "You head southwest back along the dusty road.^"; return Vechlee_Road; ], se_to [; <>; ]; Prop -> Farmgate "farm gate" with name 'gate' 'gates' 'latch', adname 'wooden' 'farm', description "The farm gate is an ordinary wooden one, constructed of large wooden beams, sturdy and well-built. It sits closed, blocking the way.", before [; Climb,Open: <>; ]; Prop Farmgrass "grass" with name 'grass' 'strip' 'line' 'dirt', adname 'small' 'of', description [; print "A narrow path heads "; if (self in End_Lane) print "we"; else print "ea"; "st through the short grass."; ], found_in Farmgate_Area End_Lane; OutroomV End_Lane "End of the Lane" with description [; #Ifdef GRAPHICS_ENABLED; if (location hasnt visited) { RevealVechlee(self.map_offset); } #Endif; "The narrow lane from the east ends here, the small strip of dirt petering into the grass. Barren fields lie south and east. A tall fence lies to the north, blocking access to the farm."; ], #Ifdef GRAPHICS_ENABLED; map_offset 11, comp_mask W_MASK | U_MASK, #Endif; 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) "Barren 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 directions are west back to the farm gate or up the tree."; ], 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 Farmgate_Area; ], u_to [; if (lead in player) "You'll never get up there with that lump of lead in your hands."; vechleemap-->209 = 13; print "You scramble up into the tree.^"; return Middle_Tree; ]; Prop Tall_Fence "tall fence" with name 'fence', adname 'tall' 'pine', description "The fence is tall and forbidding, its wooden boards smooth to the touch.", found_in End_Lane, before [; if (player in Middle_Tree or Top_Tree && action ~= ##Examine) "You can't do that from up here!"; Climb: "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: <>; ]; Askable Tree "bushy elm tree" with name 'tree' 'trunk' 'limbs', adname 'bushy' 'elm', found_in End_Lane Middle_Tree Top_Tree, add_to_scope [; AddToScope(Tall_Fence); ], description [; if (self in Middle_Tree or Top_Tree) <>; "The elm tree has strong sturdy branches and a green spray of leaves."; ], describe [; if (self in End_Lane) "^A bushy elm tree stands on the south side of the path. A couple of low branches beckon tantalisingly."; rtrue; ], before [; Attack: "The sturdy elm tree is impervious to your attack."; Climb,Enter: <>; Eat,Lick,Taste,Smell: "It looks like elm, it tastes like elm, it smells like elm. Perhaps it's an elm."; Jump: "It could really hurt doing that from up here."; Pull,Push,PushDir,Take: "The sturdy elm tree is firmly rooted in the ground."; ], DropStuff [; if (noun == Flask) { "You stop and reconsider. It's likely to smash on the ground if you do that."; } move noun to End_Lane; if (noun == lead) print "Your arms finally give out and you drop ", (the)noun, ". It"; else print (The)noun; print " tumble"; if (noun hasnt pluralname) print "s"; if (Top_Tree has general) print " to the ground below you"; else print " down through the branches to the ground below"; print_ret (string)period; ], has static; OutroomV Middle_Tree "In the Tree" with description [; "At this height, the large elm tree is strong and supports your weight well. Above you, the large trunk offers a path into the higher, flimsier reaches of the tree."; ], #Ifdef GRAPHICS_ENABLED; comp_mask U_MASK | D_MASK, map 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 13 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 26 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 39 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 52 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 65 0 0 0 0 0 0 12 0 0 0 0 0 0 ! 78 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 91 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 104 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 117 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 130 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 143 0 0 0 0 0 0 0 0 0 0 0 0 0, ! 156 #Endif; before [; Exit: if (player in location) <>; rfalse; Jump: "It could really hurt doing that from up here."; ], compass_look [obj; if (obj == d_obj) "You see the dirt path below you."; if (obj == s_obj or se_obj) "You can see the walls of Ninario's caer in that direction."; if (obj == u_obj) <>; "You peer out through the leaves, but don't see much more than what's already been mentioned."; ], cant_go [; "You can climb back down or farther up into some very flimsy looking branches."; ], d_to [; print "You let yourself slide slowly back down to the ground.^"; return End_Lane; ], u_to [; if (lead in player) "You'll never get up there with that lump of lead in your hands."; print "You head gingerly up into the very topmost reaches of the tree.^"; return Top_Tree; ], after [; Drop: Tree.DropStuff(); rtrue; ]; OutroomV 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 ground and then swinging back.^ ^You have a very commanding view around here and can even see over Ninario's caer wall into the courtyard from here.", #Ifdef GRAPHICS_ENABLED; comp_mask D_MASK, map 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 13 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 26 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 39 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 52 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 65 0 0 0 0 0 0 14 0 0 0 0 0 0 ! 78 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 91 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 104 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 117 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 130 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 143 0 0 0 0 0 0 0 0 0 0 0 0 0, ! 156 #Endif; add_to_scope [; AddToScope(Tall_Fence); ], treewhip 0, storyadd false, compass_look [obj; if (obj == d_obj) { print "You see the dirt path "; if (self has general) print "just"; else print "far"; " below you."; } if (obj == s_obj or se_obj) "You can see the walls of Ninario's caer in that direction."; 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 seem affected by your attack."; Exit: if (player in location) <>; rfalse; Jump: "It could really hurt doing that from up here."; ], after [; Drop: Tree.DropStuff(); rtrue; ], each_turn [; !The tree is not yet bent down if (self hasnt general) { if (lead in player) { give self general; print "^The weight of the lead in your hands slowly bends the top half of the tree downwards until it's almost touching the ground. You can feel the tree quivering with potential energy."; } else print "^The upper part of the tree dips and sways alarmingly. You're probably just about the maximum weight these flimsy branches can take and still remain upright."; } else { if (lead in player) { print "^The weight of the lead in your hands keeps the top of the tree bent down almost to the ground. You can feel the tree quivering with energy waiting for release."; } else { PlaySound(treewhip_snd); give self ~general; ! I think this will likely happen too late... but maybe not. print "^Like a stone from a sling, you are flung into the air as the top of the tree, relieved of the weight, snaps back upright.^"; if (crystal.out == 0) print "^~Woo-hoo!~ cries ", (the)crystal, " as you go sailing into the air.^"; if (self.storyadd == false) { self.storyadd = true; tattler.add_story(PLAYER_FLIGHT, 10); StartTimer(player_flight_timer, 10); }; PlayerTo(Midair); MoveFloatingObjects(); rtrue; } } new_line; rtrue; ], cant_go "You seem to have run out of branches strong enough to bear your weight. Down is the only option.", d_to [; if (self has general) { give self ~general; print "You let yourself drop out of the top of the tree right onto the ground.^ ^With the suddenness of a whip cracking, the top half of the tree, relieved of the weight, snaps back upright.^"; if (crystal.out == 0 && self.treewhip == 0) { self.treewhip = 1; print "^~Wow,~ says ", (the)crystal, " worriedly. ~We might have really gone flying if we'd dropped the lead.~^"; } return End_Lane; } 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; OutroomV Midair "In midair" with description "You are sailing majestically through the air, like an airship captain ejected from his gondola.", #Ifdef GRAPHICS_ENABLED; map 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 13 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 26 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 39 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 52 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 65 0 0 0 0 0 0 14 0 0 0 0 0 0 ! 78 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 91 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 104 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 117 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 130 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 143 0 0 0 0 0 0 0 0 0 0 0 0 0, ! 156 comp_mask D_MASK, #Endif; dtime 0, spinning false, each_turn [; self.dtime++; switch(self.dtime) { 1: if (lead in player) { print "^The weight of the lead contributes significant drag and you crash bodily into the north caer wall, sliding down among a clump of trees.^ ^~Ouch,~ says ", (the)crystal, " succintly. ~That looked painful.~^ ^Disappointed, you march north back through the trees to the end of the lane.^"; self.dtime = 0; PlayerTo(End_Lane); MoveFloatingObjects(); rtrue; } if (tarp in player) { print "^The tarpaulin billows with air, acting like a parachute to produce drag and you just clip into the battlements at the top of the north wall of the caer. You scrabble madly for a purchase but fail, sliding down among a clump of trees, still outside the caer.^ ^~Close!~ says ", (the)crystal, " encouragingly. ~I hope that wasn't ", (i) "too", " painful.~^ ^Disappointed, you march north back through the trees to the end of the lane.^"; self.dtime = 0; PlayerTo(End_Lane); MoveFloatingObjects(); rtrue; } "^You sail over the north caer wall."; 2: if (tarp in player) { print "^The tarpaulin billows with air, acting like a parachute to produce drag and you parachute down into the courtyard like a professional.^ ^~Wow,~ says ", (the)crystal, " in admiration. ~That was smooth. We should turn that into a sport or something.~^"; self.dtime = 0; PlayerTo(W_Courtyard); MoveFloatingObjects(); rtrue; } if (lead in player) { print "^The weight of the lead contributes significant drag and you drop rather alarmingly quickly into the courtyard landing with a crash. You roll to your feet, bruised and unshaken, but in one piece.^ ^~Ouch,~ says ", (the)crystal, " sympathetically. ~That was quite the landing!~^"; self.dtime = 0; PlayerTo(W_Courtyard); MoveFloatingObjects(); rtrue; } "^You sail over the courtyard.^ ^~There's our target!~ calls out ", (the)crystal, " looking down into the courtyard."; 3: if (lead in player) { print "^The weight of the lead contributes significant drag and you drop rather alarmingly quickly smashing into the inner side of the south caer wall. Dazed, you slide slowly down the wall coming to rest in the courtyard.^ ^~Well, we're ", (i) "here", " at least,~ says ", (the)crystal, ". ~I hope that didn't hurt too much.~^"; self.dtime = 0; PlayerTo(W_Courtyard); MoveFloatingObjects(); rtrue; } if (tarp in player) { print "^The tarpaulin billows with air, acting like a parachute to produce drag and you parachute down into the courtyard like a professional.^ ^~Wow,~ says ", (the)crystal, " in admiration. ~That was smooth. We should turn that into a sport or something.~^"; self.dtime = 0; PlayerTo(W_Courtyard); MoveFloatingObjects(); rtrue; } "^You continue sailing over the courtyard, nearing the south caer wall.^ ^~Well there ", (i) "goes", " our target,~ says ", (the)crystal, " as the courtyard sails by."; 4: if (lead in player) { self.spinning = true; "^The weight of the lead contributes significant drag and you drop rather alarmingly quickly, crashing bodily into the top of the south caer wall. You continue sailing on, spinning madly."; } if (tarp in player) { "^The tarpaulin billows with air, acting like a parachute to produce drag and you lose height, but not quickly enough. Your legs just clip the top of the south caer wall as you fly past.^"; } "^You sail over the south caer wall."; 5: #Ifdef GRAPHICS_ENABLED; vechleemap-->337 = 14; #Endif; if (self.spinning == true) print "^You land heavily on a haystack south of the caer, the wind rushing out of you."; else print "^You land with a thump on a haystack south of the caer."; PlaySound(haythud); self.spinning = false; print "^^~Well that was exciting!~ cries ", (the)crystal, ". ~But somehow, I thought we'd end up in the courtyard.~^"; self.dtime = 0; PlayerTo(Atop_Haystack); MoveFloatingObjects(); rtrue; } ], compass_look [obj; if (obj == d_obj) "Oh dear. That makes your legs feel distinctly wobbly."; <>; ], d_to "Oh, that will happen eventually.", cant_go "Sailing through midair as you are makes that rather difficult."; Object -> Midair_react with react_before [; Drop: "If you do that now, you might lose ", (itorthem)noun, " forever."; ], has concealed; !==================================================================================================================================================== ! West Courtyard OutroomV W_Courtyard "Courtyard" with description [; if (location hasnt visited) { #Ifdef GRAPHICS_ENABLED; RevealVechlee(self.map_offset); #Endif; Achieved(46); } print "The interior of the caer is a simple, large courtyard, enclosed by a tall stone wall on all four sides. West, 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 "; if (Caer_Door has open) print "open"; else print "closed"; " iron-banded wooden doors, massive and imposing. To the east is the entrance into the tower.^^A large white fountain, empty of water, sits forlornly in the middle of the courtyard."; ], #Ifdef GRAPHICS_ENABLED; map_offset 75, comp_mask W_MASK | U_MASK | E_MASK | NE_MASK | SE_MASK | D_MASK, #Endif; Floor DIRT, 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) { "The flagstone path extends west from here to the caer doors."; } 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; ], cant_go "From here, you can follow the path northeast or southeast around the tower, head west to the doors, climb up to the top of the wall, or head east back into the tower.", w_to Portcullis, u_to [; print "You clamber up the stairs to the top of the wall.^"; return Atop_West_Wall; ], d_to [; print "Like a mad thrill-seeking fair-goer, you leap into the chute and tumble down it. It's a short wild ride down into the depths of the tower.^"; if (crystal.out == 0) print "^~Woo-hoo!~ shrieks ", (the)crystal, ". ~I knew it would be exciting hanging around with you.~^"; return Sewer; ], e_to [; print "You head down the stone passageway into the gloom of the tower.^"; if (walrus in W_Courtyard) { #Ifdef SOUND_ENABLED; PlaySound(walrusroar); #Endif; if (walrus.hint == 0) { walrus.hint = 1; "^As your eyes adjust to the dimmer light, you can just make out a massive whiskered marine mammal with huge tusks and gigantic flippers. As you stand gaping in surprise, it roars in anger and a fishy-smelling flipper smacks you across the face and swats you back into the courtyard.^ ^~What in the name of blazes was that?~ asks ", (the)crystal, " in surprise."; } "^Before you can even take in your surroundings, there is a mighty roar and a massive flipper swats you back into the courtyard."; } #Ifdef GRAPHICS_ENABLED; vechleemap-->275 = 5; #Endif; return Main_Hall; ], ne_to [; #Ifdef GRAPHICS_ENABLED; vechleemap-->147 = 20; vechleemap-->148 = 5; vechleemap-->149 = 5; vechleemap-->150 = 5; vechleemap-->151 = 19; vechleemap-->178 = 23; vechleemap-->184 = 15; vechleemap-->210 = 6; vechleemap-->216 = 6; #Endif; print "You follow the path northeast around the corner of the tower, and finding nothing of interest, continue along the path until you're behind the tower.^"; return Garden; ], se_to [; #Ifdef GRAPHICS_ENABLED; vechleemap-->339 = 4; #Endif; print "You follow the path southeast around the corner of the tower.^"; return S_of_Tower; ]; Prop -> Fountain "large elaborate fountain" with name 'fountain', adname 'large' 'elaborate', description "This large elaborate fountain, with small marble figurines lining the rim, has been empty since you and Ninario moved permanently to Blumph.", before [; if (real_location == Bedroom or Top_Tree or Tower_Roof or Tower_Roof_Vision or Bailey && action ~= ##Examine) "You can't do that from here in the ", (ToLower)location, (string)period; Enter: "You step briefly into the dry fountain and then step back out."; ], has container open transparent; Prop -> Figurines "figurines" with name 'figurines' 'rabbits' 'bunnies', adname 'small' 'marble', 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, poised for spraying water into it through their prominent front teeth.", before [; if (real_location == Bedroom or Top_Tree or Tower_Roof or Tower_Roof_Vision or Bailey && action ~= ##Examine) "You can't do that from here in the ", (ToLower)location, (string)period; Attack: "After a year as his apprentice, you know that smashing his figurines would really upset Ninario, so you restrain your wanton impulses."; ], has pluralname; Askable -> Chute "chute" with name 'chute' 'pipe' 'hook', adname 'narrow' 'coal' 'delivery', description [; print "The chute enters the side of the tower and seems to descend at a steep angle into the depths. It reminds you of those old coal delivery chutes back home. There's a small hook on the rim where it looks like a cover once hung."; if (sign in self) print " A sign reading ", (i) "WizStrip Delivery", " hangs from the hook."; new_line; rtrue; ], describe [; print "^A narrow chute leads into the tower here, descending into the depths."; if (sign in self) print " A sign reading ", (i) "WizStrip Delivery", " hangs from the chute."; new_line; rtrue; ], before [; Enter: <>; Smell: if (self in W_Courtyard) "An unpleasant smell rises faintly from the chute."; Take: "It's fixed in place. Shoot."; ], after [; Receive: move noun to Sewer; print (The)noun; if (noun has pluralname) print " tumble"; else print " tumbles"; print " down into the darkness"; if (noun == lead) print ", making an awful racket as it goes"; "."; ], has open container static supporter transparent; !==================================================================================================================================================== ! Workshop 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.", information [person; switch (person) { crystal: "~Blackpowder. Hmmm. Saltpetre, sulphur, and charcoal, mixed together in a ball mill, right?~ asks ", (the)crystal, (string)period; } ], before [; Eat: "Generally, consuming substances composed of saltpetre, sulphur, and charcoal is a bad idea.^ ^~Maybe that's not such a bad idea,~ suggests ", (the)crystal, ". ~An explosive new diet trend.~"; Smell: print_ret (The) self, " smells faintly of rotten eggs. Must be the sulphur oxidising slightly."; ], after [; Take: "You scoop the grains of black powder into your hand."; ]; RoomV Workshop_Vision "Workshop" with description [; if (self.vision == true) { move analyser to Workshop_Vision; give analyser scenery; Startdaemon(self); } print "Odd devices and machines fill this room. Projects in various stages of completion lie abandoned in the middle of the floor or 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_Vision has open) print "open doorway"; else print "rusty metal door"; " to the southeast."; ], #Ifdef GRAPHICS_ENABLED; map_offset 13, comp_mask SE_MASK | OUT_MASK, #Endif; compass_look [obj; if (obj == se_obj) <>; if (obj == n_obj) <>; TouchWalls(obj, self.Floor, self.Walls); rtrue; ], dtime 0, vision false, daemon [; self.dtime++; if (self.dtime == 2) { "^~How the devil does this thing work?~ mutters Renaldo, as he fuddles around with the interplanar rift analyser. ~Found any instructions, Yekcal?~^ ^~I'm afraid not, sir,~ sighs Yekcal. ~But look at this, it's a ball mill!~"; } if (self.dtime == 3) "^~Wonderful,~ says", (saysharp)Renaldo, ". ~Just what we didn't need.~"; if (self.dtime == 4) "^~But we could make black powder!~ protests Yekcal. ~That would be neat. I could fire the cannon.~"; if (self.dtime == 5) "^~Pointless,~ declares Renaldo, still struggling with the analyser, ~like so much of what you say. We have no ammunition and no need of cannonry. Ah, what's this do?~ He turns a wheel on the side of the analyser."; if (self.dtime == 6) "^~Wasn't there a furnace in here before?~ asks Yekcal, glancing around. ~He must have taken it to Blumph with him.~^ ^~Shut your chattering you fool...~ snaps Renaldo. He breaks off. ~Hmmm, this thing is definitely saying there's a rift of some kind in the area. Let me see if I can pinpoint it.~"; if (self.dtime == 7) "^~Too bad the furnace is gone,~ sighs Yekcal. ~We could have cast a cannonball. Then I would have something to fire out of the cannon.~^ ^~You'll get fired out of it if you're not careful,~ growls Renaldo. ~Ah, I'm getting something! The rift! It formed in the library originally but it's drifted to the roof. Let's get up there! I need fresh blood soon. I'm aging fast.~"; if (self.dtime == 8) { print "^Renaldo rushes out of the room, heading for the stairs on tired old legs.^ ^Yekcal sighs and follows him even more slowly."; new_line; remove analyser; EndVision(self); StopDaemon(self); if (initialvision == true) { Achieved(41); print "^~Fresh blood?~ says ", (the)crystal, ". ~That doesn't sound good. And now that they've figured out how to use the analyser ", (i) "and" , " where the rift is, they'll be starting the spell to expand it. I hope these are visions of the future.~^"; } initialvision = false; rtrue; } ], Floor ROUGH_STONE, Walls ROUGH_STONE, cant_go [; "Unfortunately, as this is a vision, there's not much you can do other than watch and wait. Or talk to ", (the)crystal, ", who seems to be sharing the vision with you."; ], se_to Workshop_Door_Vision; Askable -> Ball_Mill_Vision "ball mill" with name 'mill' 'drum' 'cover' 'crank' 'lever' 'mechanism', adname 'ball' 'rotating' 'cylindric' 'metal', capacity 6, 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."; ], information [person; switch (person) { crystal: "~Saltpetre, sulphur, and charcoal, mixed together in a ball mill gives black powder, right?~ asks ", (the)crystal, (string)period; } ], initial "A familiar mechanism catches your eye. It's a cylindrical ball mill, with a lever on one side.", before [; 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."; ], has ~scenery static openable container; Askable -> -> Lead_Balls_Vision "heavy lead balls" with name 'balls', adname 'heavy' 'lead', 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; Eat,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."; ]; RoomV Workshop "Workshop" with description [; #Ifdef GRAPHICS_ENABLED; RevealVechlee(self.map_offset); #Endif; print "Odd devices and machines fill this room. Projects in various stages of completion lie abandoned in the middle of the floor or 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 metal door"; " to the southeast."; ], #Ifdef GRAPHICS_ENABLED; map_offset 13, comp_mask SE_MASK | OUT_MASK, #Endif; 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; Askable -> Ball_Mill "ball mill" with name 'mill' 'drum' 'cover' 'crank' 'lever' 'mechanism', adname 'ball' 'rotating' 'cylindric' 'metal', 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."; ], information [person; switch (person) { crystal: "~Saltpetre, sulphur, and charcoal, mixed together in a ball mill gives black powder, right?~ asks ", (the)crystal, (string)period; } ], initial "A familiar mechanism catches your eye. It's a cylindrical ball mill, 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 == Broomstick or plank or lead) print_ret (The) noun, " won't fit into the ball mill!"; if (noun == Flask) "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(55); 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."; Take,Pull,PushDir,Transfer: "You don't need to fidget about with the ball mill in that way."; ], after [; Receive: if (noun ofclass substance) print_ret "You pour ", (the) noun, " into the ball mill, coating the bottom of the mill with it."; rfalse; ], has ~scenery static openable container; Askable -> -> Lead_Balls "heavy lead balls" with name 'balls', adname 'heavy' 'lead', 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; Eat,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 Devices "strange devices" with name 'devices' 'machines' 'set' 'of' 'balances' 'mirror' 'mirrors' 'lenses' 'optics' 'telescope' 'half-fini' 'projects', adname 'strange' 'half-fini', found_in Workshop Workshop_Vision, description "They are various devices that you and Ninario have constructed in the course of your 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."; ]; Askable Narrow_Window "window" with name 'window' 'windows' 'slit', adname 'narrow', description "The window is an open, narrow slit in the northern wall, which admits a small amount of daylight. It is far too narrow to fit through, or even see through very well.", found_in Workshop Workshop_Vision, 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."; ], has scenery; Askable analyser "interplanar rift analyser" with name 'analyser' 'analyzer' 'dials' 'wheels' 'device' 'wheel', adname 'interplan' 'rift' 'odd' 'looking' 'odd-looki', description [; print_ret (The)self, " is an odd-looking device with a number of dials and wheels on it. Its construction gives no real clues as to how it's supposed to work."; ], information [person; switch (person) { crystal: "~I don't know all the details, but I think it does exactly what its name implies--it analyses rifts between dimensions, such as the one between your world and this. I guess, after that big spellcasting disturbance last night, Ninny wants to use the analyser to figure out if Renaldo is messing about with the rift... and why.~"; } ], before [; Examine: rfalse; ], has objseen; !==================================================================================================================================================== RoomV Bailey_Vision "Bailey" with description "Fake Bailey room, never visited.", w_to Caer_Door; RoomV Bailey "Bailey" with description [; #Ifdef GRAPHICS_ENABLED; if (location hasnt visited) { RevealVechlee(self.map_offset); } #Endif; print "This short stone passageway leads from the large double doors to the west to the "; if (Portcullis has open) print "open"; else print "closed"; print " portcullis leading into the caer to the east. Looking up, you can see several holes bored through the stone ceiling, for dropping boiling oil or water down on the heads of invaders. West, "; if (Caer_Door has open) "the huge iron-banded double doors hang open on their hinges."; print "huge iron-banded double doors loom imposingly.^"; if (Hoop in W_Courtyard && Portcullis hasnt open) print "^A tin hoop is lying in the courtyard, just inside the portcullis.^"; rtrue; ], #Ifdef GRAPHICS_ENABLED; map_offset 73, comp_mask E_MASK | W_MASK, #Endif; compass_look [obj; if (obj == e_obj) "The courtyard lies 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 to the courtyard.", u_to "The murder holes are too high overhead to reach.", e_to Portcullis, w_to Caer_Door; Askable -> lead "lump of lead" with name 'lump' 'of' 'lead', adname 'leaden', ! Conceptually, the lead is a flattened lump, maybe 8cm x 10cm x 25cm, so volume is 2000cm^3. Lead is 11.34g/cm^3, so this ! would be a 22kg lump of lead, or ~ 50 lbs. description "A heavy flattened lump of lead, about 10 inches at its widest point. It looks extremely heavy.", time_left, react_before [; Climb: if (self in player) "Not with that lump of lead in your arms, you don't."; Disrobe: if (self in player && noun ~= self) "Your hands are completely occupied with the lump of lead."; Take: if (self in player && noun ~= self) "You can't take ", (the) noun, " while holding the heavy lump of lead."; rfalse; ], each_turn [; if (self in player) "^The lump of lead is getting heavier by the second."; ], before [; Eat,Lick,Taste: "That would most definitely result in lead poisoning."; Insert,Transfer: Achieved(45); rfalse; Remove,Take: if (self in player) "You already have that."; Achieved(45); rfalse; ThrowAt: "It's all you can do to lug the lump of lead around, let alone throw it at anything."; ], initial "A large lump of lead sits here, evidently poured through from the gatehouse above. It looks extremely heavy.", describe [; "^A large leaden lump sits here, looking extremely heavy."; ], after [; Drop: StopTimer(self); print "Your arms give out and you drop the lump of lead. It thumps solidly to the "; if (location ofclass Outroom or OutroomV) "ground."; "floor."; Take: StartTimer(self, 5); print "You heft the lump of lead. It must weigh three or four stone. You won't be able to carry it very far.^"; rfalse; ], time_out [; if (self in player) { print "^"; <>; } ]; !==================================================================================================================================================== ! South of Tower OutroomV S_of_Tower "South of Tower" with description [; #Ifdef GRAPHICS_ENABLED; if (location hasnt visited) { RevealVechlee(self.map_offset); } #Endif; 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 large ornate garden.^"; rtrue; ], #Ifdef GRAPHICS_ENABLED; map_offset 207, comp_mask NE_MASK | NW_MASK | S_MASK, #Endif; before [; GoIn: <>; ], compass_look [obj; if (obj == se_obj or sw_obj or w_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 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 large ornate garden."; if (obj == n_obj) "The grey stone wall of Ninario's tower lies directly north of you."; if (obj == s_obj) <>; return self.OutroomV::compass_look(obj); ], cant_go "You can head northwest to the courtyard or south to the shed.", u_to [; <>; ], nw_to [; #Ifdef GRAPHICS_ENABLED; vechleemap-->339 = 4; #Endif; print "You follow the path northwest, back to the courtyard.^"; return W_Courtyard; ], ne_to [; #Ifdef GRAPHICS_ENABLED; vechleemap-->343 = 3; #Endif; print "You follow the path northeast to the garden.^"; return Garden; ], 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 firmly 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 'walk', adname 'pebbled', description "The small pebbled walk runs from the stone path to the door of the shed.", before [; if (real_location ~= S_of_Tower && action_to_be ~= ##Examine) "You can't really do that from here."; Find: <>; ]; Askable Shed_Door "shed door" with name 'door', adname 'shed', crysshed [; if (crystal.Topics & FLAG_x6 ~= FLAG_x6) { crystal.Topics = crystal.Topics | FLAG_x6; "^~Wow, the famous shed. That's the one you broke into during your last adventure, right? You poured muriatic acid on the lock. Or did you drill it out? I can't quite remember. Either way, a piece of history.~"; } ], information [person; switch (person) { crystal: "~It's a shed,~ says ", (the)crystal, ". ~Apart from its involvement in your adventures last year, not terribly interesting.~"; } rfalse; ], description [; print "The small wooden shed is ordinary and unassuming. It looks like it hasn't been used at all since you broke into it last year to find a watering can."; print " The door is "; if (self has open) print "open"; else print "closed"; print ".^"; if (crystal.out == 0) self.crysshed(); rtrue; ], 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) <>; <>; Pull: 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 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,Lock: print "There's no lock on the shed door. It looks like it's been eaten away somehow.^"; self.crysshed(); rtrue; ], 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 Slimy_Passage light; rfalse; Close: give Shed ~light; give Slimy_Passage ~light; rfalse; ], has scenery door openable open; RoomV Shed "Inside the Shed" with description [; #Ifdef GRAPHICS_ENABLED; if (location hasnt visited) { RevealVechlee(self.map_offset); } #Endif; 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 trapdoor "; 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."; ], #Ifdef GRAPHICS_ENABLED; map_offset 271, comp_mask N_MASK | IN_MASK | OUT_MASK | D_MASK, #Endif; compass_look [obj; if (obj == n_obj) <>; if (obj == d_obj) <>; return self.RoomV::compass_look(obj); ], before [; GoIn: <>; Exit: if (player in real_location) <>; rfalse; ], Walls ROUGH_WOOD, Floors DIRT, 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 trapdoor below you."; ], out_to [; <>; ], 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 Slimy_Passage 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 Slimy_Passage light; print "You open the trapdoor, and descend the worn stone steps.^"; } return Trapdoor; ], has light; Askable -> sign "delivery sign" with name 'sign' 'chain', adname 'wizstrip' 'shiny' 'new' 'brand' 'brand-new' 'shining' 'convenien' 'delivery', description [; "A shiny new sign with a convenient chain for hanging outside a shop. It reads ", (i) "WizStrip Delivery", ". It's a holdover from an attempt you and Ninario made to start a WizStrip home delivery service. It was a good business idea. So good in fact that when a local entrepreneur heard about it and opened a WizStrip factory in Vechlee, it put Ninario out of business. As a result, this sign never saw much use."; ], initial [; "A brand-new shining sign sits amongst the broken tools."; ], before [; PutOn,Tie: if (second == chute) { Achieved(49); move sign to chute; "You hang the sign on the chute."; } ]; Prop -> Shed_Tools "broken garden tools" with name 'tools' 'rake' 'hoe' 'remnants' 'shovel', adname 'broken' 'garden', 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."; ]; Askable Trapdoor "trapdoor" with name 'trapdoor' 'door', adname 'trap', description [; print "The trapdoor 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 Slimy_Passage light; if (self in Shed) "You open the trapdoor, revealing worn stone steps leading downward."; else "You open the trapdoor."; Close: give Slimy_Passage ~light; if (self in Shed) "You slam the trapdoor closed."; "You climb up a couple of steps, grab the trapdoor, and swing it closed."; ], found_in Shed Slimy_Passage, door_dir [; if (self in Shed) return d_to; return u_to; ], door_to [; if (self in Shed) return Slimy_Passage; return Shed; ], has scenery door openable; Room Slimy_Passage "Slimy Passage" with description [; print "This narrow passage under the shed is dark, slimy and unpleasant. The passage heads north, and worn stone steps lead up to the "; if (Trapdoor has open) print "open "; "trapdoor above."; ], #Ifdef GRAPHICS_ENABLED; map 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 13 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 26 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 39 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 52 0 0 0 0 0 0 6 0 0 0 0 0 0 ! 65 0 0 0 0 0 0 9 0 0 0 0 0 0 ! 78 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 91 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 104 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 117 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 130 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 143 0 0 0 0 0 0 0 0 0 0 0 0 0, ! 156 comp_mask U_MASK | N_MASK | OUT_MASK, #Endif; Floor SLIMY_STONE, Walls SLIMY_STONE, compass_look [obj; if (obj == u_obj) <>; if (obj == n_obj) "The slimy passage continues north into darkness."; return self.RoomV::compass_look(obj); ], cant_go [; if (location == thedark) "It's so dark that the only direction you're certain of is the trapdoor above you."; "You can head farther north along the passage or up through the trapdoor."; ], out_to [; <>; ], 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 trapdoor, and ascend the worn stone steps into the shed.^"; return Trapdoor; ], n_to [; #Ifdef GRAPHICS_ENABLED; Slimy_Passage.&map-->45 = 6; Slimy_Passage.&map-->58 = 14; Slimy_Ledge.&map-->110 = 13; Rubbish_Room.&map-->136 = 13; Rubbish_Room.&map-->123 = 6; Basement.&map-->149 = 6; Basement.&map-->162 = 13; Sewer.&map-->149 = 6; Sewer.&map-->162 = 14; #Endif; 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 "A passage from the south ends here at a small slimy ledge that juts out over an open room below. The room down there is used 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 has grown since your first visit here one year ago, forming a nice easy ramp down into the room. North of the heap, a tunnel leads out of the room below.", Floor SLIMY_STONE, Walls SLIMY_STONE, #Ifdef GRAPHICS_ENABLED; map 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 13 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 26 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 39 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 52 0 0 0 0 0 0 6 0 0 0 0 0 0 ! 65 0 0 0 0 0 0 10 0 0 0 0 0 0 ! 78 0 0 0 0 0 0 6 0 0 0 0 0 0 ! 91 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 104 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 117 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 130 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 143 0 0 0 0 0 0 0 0 0 0 0 0 0, ! 156 comp_mask S_MASK | D_MASK | N_MASK, #Endif; 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 trapdoor."; return self.RoomV::compass_look(obj); ], cant_go [; "You can head south along the passage or clamber north and down to the rubbish heap."; ], n_to [; <>; ], s_to [; #Ifdef GRAPHICS_ENABLED; Slimy_Passage.&map-->45 = 6; Slimy_Passage.&map-->58 = 14; Slimy_Ledge.&map-->110 = 13; Rubbish_Room.&map-->136 = 13; #Endif; print "You crawl south along the slimy passage.^"; return Slimy_Passage; ], d_to [; #Ifdef GRAPHICS_ENABLED; Slimy_Passage.&map-->32 = 13; Rubbish_Room.&map-->110 = 14; Basement.&map-->110 = 13; Basement.&map-->123 = 6; Basement.&map-->136 = 14; #Endif; print "You clamber down the rubbish heap to the floor of the room.^"; return Rubbish_Room; ], has ~light; Prop -> Rubbish_Heap_fake "heap of rubbish" with name 'heap' 'rubbish' 'cast-off' 'garbage' 'dump' 'cast-offs' 'items' 'pile' 'rubish' 'tip', adname 'of', description "The heap of rubbish almost fills the entire room below. It reaches all the way up to this passage, making for an easy climb down into the room below.", before [; if (action ~= ##Examine) "You'll have to climb down into the room first."; ]; Room Basement "Basement" with description [; if (Basement hasnt visited) MoveFloatingObjects(); "The moisture on the dark and damp walls dominates this room, making the air seem close and cloying. The walls echo hollowly with the sound of slow drips of water. A doorway opens to the north, a most unwholesome odour emanating from that direction. A spiral staircase climbs up to the main hall here, and a narrow slimy tunnel heads south."; ], #Ifdef GRAPHICS_ENABLED; map 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 13 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 26 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 39 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 52 0 0 0 0 0 0 6 0 0 0 0 0 0 ! 65 0 0 0 0 0 0 9 0 0 0 0 0 0 ! 78 0 0 0 0 0 0 6 0 0 0 0 0 0 ! 91 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 104 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 117 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 130 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 143 0 0 0 0 0 0 0 0 0 0 0 0 0, ! 156 comp_mask U_MASK | N_MASK | S_MASK, #Endif; 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 tunnel 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 uncertain 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 tunnel south, or head back up the stairs."; ], n_to [; #Ifdef GRAPHICS_ENABLED; Rubbish_Room.&map-->32 = 2; Basement.&map-->58 = 2; Sewer.&map-->110 = 13; Sewer.&map-->123 = 6; if (Rubbish_Room has visited) Sewer.&map-->136 = 13; #Endif; print "Braving the foul odour, you step through the doorway.^"; return Sewer; ], u_to [; print "You trudge up the rickety stairs into the brightness of the main hall.^"; if (walrus in Basement) { #Ifdef SOUND_ENABLED; PlaySound(walrusroar); #Endif; if (walrus.hint == 0) { walrus.hint = 1; "^As you blink in the brighter light, you can just make out a massive whiskered marine mammal with huge tusks and gigantic flippers. As you stand gaping in surprise, it roars in anger and a fishy-smelling flipper smacks you across the face and swats you back down the stairs.^ ^~What in the name of blazes was that?~ asks Crystal in surprise."; } "^Before you can even take in your surroundings, there is a mighty roar and a massive flipper swats you back down the stairs."; } return Main_Hall; ], s_to [; #Ifdef GRAPHICS_ENABLED; Rubbish_Room.&map-->45 = 6; Basement.&map-->110 = 13; Basement.&map-->123 = 6; Sewer.&map-->136 = 13; Slimy_Ledge.&map-->45 = 6; Slimy_Ledge.&map-->58 = 13; Slimy_Passage.&map-->32 = 6; Slimy_Passage.&map-->19 = 6; Slimy_Passage.&map-->6 = 13; if (Sewer has visited) { Rubbish_Room.&map-->32 = 2; Slimy_Ledge.&map-->32 = 13; Slimy_Ledge.&map-->19 = 6; Slimy_Ledge.&map-->6 = 2; } #Endif; print "You head south down the slimy tunnel.^"; 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 "Put into use long ago as a rubbish tip for all of Ninario's cast-off items, this room is packed with refuse. About the only place to stand freely is in the doorway heading north, as the heap of rubbish takes up most of the floor space. South, the rubbish heap rises to join a passage sloping upwards out of the room.", #Ifdef GRAPHICS_ENABLED; map 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 13 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 26 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 39 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 52 0 0 0 0 0 0 6 0 0 0 0 0 0 ! 65 0 0 0 0 0 0 9 0 0 0 0 0 0 ! 78 0 0 0 0 0 0 6 0 0 0 0 0 0 ! 91 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 104 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 117 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 130 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 143 0 0 0 0 0 0 0 0 0 0 0 0 0, ! 156 comp_mask U_MASK | N_MASK | S_MASK, #Endif; 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) "The rubbish heap has grown to such an extent that you could clamber back up into the slimy passage."; 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 [; "The only ways out of here are north to the basement or up and south to the slimy ledge."; ], n_to [; #Ifdef GRAPHICS_ENABLED; Rubbish_Room.&map-->58 = 13; Rubbish_Room.&map-->45 = 6; Slimy_Ledge.&map-->32 = 13; Basement.&map-->110 = 13; Basement.&map-->123 = 6; if (Slimy_Ledge has visited) Basement.&map-->136 = 14; #Endif; print "You head along the slimy passage to the basement.^"; return Basement; ], s_to [; #Ifdef GRAPHICS_ENABLED; Slimy_Passage.&map-->32 = 13; Slimy_Passage.&map-->45 = 6; Slimy_Ledge.&map-->45 = 6; Slimy_Ledge.&map-->58 = 13; Rubbish_Room.&map-->110 = 14; Rubbish_Room.&map-->123 = 6; #Endif; print "You scrape and clamber up the rubbish heap and pull yourself into the passage.^"; return Slimy_Ledge; ], u_to [; <>; ], has ~light; Prop -> Passage "passage" with name 'passage' 'hole', description "The passage heads upward at a forty-five-degree angle. You could probably clamber back up there.", before [; Examine: rfalse; default: <>; ]; Prop -> Rubbish_Heap "heap of rubbish" with name 'heap' 'rubbish' 'cast-off' 'garbage' 'dump' 'cast-offs' 'items' 'pile' 'rubish' 'refuse' 'tip', adname 'of', description "The heap of rubbish almost fills the entire room. It reaches all the way up to the passage on the south side.", before [; if (self in Slimy_Ledge && action ~= ##Examine) "You'll have to climb down into the room first."; Rub: <>; Search: "You search the heap of rubbish. You find lots of unpleasant bits of rotting garbage, but nothing of interest."; Take: "You can't take the entire heap of rubbish with you."; ]; Room Sewer "Sewer" with description [; print "Dank and dark, this is one of the less memorable attractions you've visited. You know exactly how often Ninario has this room cleaned, and it's not frequent. His cleaning usually consists of dropping an open bottle of WizStrip into the toilet, a trick he credits you with teaching him. "; 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 and enters the wall."; ], #Ifdef GRAPHICS_ENABLED; map 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 13 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 26 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 39 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 52 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 65 0 0 0 0 0 0 1 0 0 0 0 0 0 ! 78 0 0 0 0 0 0 6 0 0 0 0 0 0 ! 91 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 104 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 117 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 130 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 143 0 0 0 0 0 0 0 0 0 0 0 0 0, ! 156 comp_mask U_MASK | S_MASK | IN_MASK | OUT_MASK, #Endif; 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 or out_obj) <>; if ( player in Sewer_Channel && noun == u_obj or out_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 Chute) "You can't reach that from here."; rfalse; Smell: if (noun == nothing) "Foul odours better left unsmelled threaten to overwhelm you."; rfalse; ], 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 to the basement."; ], s_to [; #Ifdef GRAPHICS_ENABLED; Sewer.&map-->97 = 6; Sewer.&map-->110 = 13; Sewer.&map-->123 = 6; Basement.&map-->58 = 2; Rubbish_Room.&map-->58 = 13; Slimy_Ledge.&map-->32 = 13; Slimy_Ledge.&map-->19 = 6; Slimy_Ledge.&map-->6 = 2; #Endif; print "You step into the relatively cleaner air of the basement.^"; return Basement; ], u_to [; <>; ], in_to [; <>; ], out_to [; if (player in Sewer_Vat) <>; ], has ~light; Askable -> FakeChute "chute" with name 'chute' 'pipe', adname 'narrow' 'coal' 'delivery', description "The chute enters the room through the ceiling. It's not directly above the vat, so likely couldn't be used as some kind of sick and disgusting slide. In any case, it's too narrow. It reminds you of those old coal delivery chutes back home.", describe [; "^A narrow chute enters the room through the ceiling."; ], before [; Enter: "It would be far too difficult to climb up the chute."; Lick,Taste: <>; Smell: "The chute smells unpleasant, but then, this whole area does."; Take: "It's fixed in place. Shoot."; ], has open static; Prop -> Sewer_Vat "sewage vat" with name 'vat' 'filth' 'waste', adname 'sewage' 'sewer' 'stinking', 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) "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: #Ifdef GRAPHICS_ENABLED; Sewer.comp_mask = U_MASK | S_MASK | OUT_MASK; #Endif; 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: #Ifdef GRAPHICS_ENABLED; Sewer.comp_mask = U_MASK | S_MASK | IN_MASK; #Endif; "You clamber back out of the vat."; ], before [; Eat: "No, just... no."; 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 (lead in player) "You can't manage to clamber up the ladder while holding that lump of lead."; Exit: if (lead in player) "You can't manage to clamber back out while holding that lump of lead."; ReachIn: "You don't want to go digging around in all that filth."; Receive: if (self.clean == false) "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: <>; ], time_left, time_out [; Playsound(towerboom); tattler.add_story(TOWER_EXPLOSION, 4); StartTimer(tower_explosion_timer, 4); Achieved(51); remove walrus; self.clean = true; if (location == Sewer) { deadflag = 1; "^Suddenly, a massive detonation and violent explosion rocks the room. Standing in the vicinity as you are, you form the epicentre of the explosion, and end up violently and messily scattered around the room."; } if (location == Basement or Slimy_Passage or Slimy_Ledge or Rubbish_Room) print "^There is a massive detonation and a violent explosion rocks the tower. Close as you are to the epicentre of the explosion, you are knocked off your feet. There is a crunching noise as the tower above you collapses down upon itself. You suspect a large portion of the tower has been destroyed.^ ^From above, you hear the slapping of flippers and terror-stricken grunts of alarm as the walrus charges out of the tower.^"; if (location == W_Courtyard or Atop_West_Wall or Gatehouse or Bailey or S_of_Tower or Garden or Vechlee_Road or Shed) print "^There is a massive detonation and a violent explosion rocks the tower. You watch in awe as the pent-up gases, released in a single moment of cataclysm, blast their way through the tower. The entire first floor blows out sideways raining rocks and rubble down around you and the whole top of the tower gives a violent ", (i) "lurch", " and collapses down upon itself, effectively destroying the first floor of the tower. Dimly, you hear some shouts of alarm from up on the tower roof.^ ^With a slapping of flippers and terror-stricken grunts of alarm, a gigantic walrus charges out the caer and away across the fields.^"; if (location == Top_Tree or Middle_Tree or End_Lane or Farmgate_Area) { "^There is a massive detonation and a violent explosion from the direction of Ninario's tower."; } if (location == Arrivals_Dock or Market_Square or Antechamber or Factory_Floor or North_Vechlee or Vechlee_Gate or Sorcery_Supply or Outskirts) print "^The sound of a massive detonation and a violent explosion rolls over the area from outside of town.^"; "^~Good heavens,~ murmurs ", (the)crystal, " in shock and awe. ~That was quite the blast.~"; ], 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_Channel "stone channel" with name 'channel' 'block' 'blockage' 'blocked' 'opening', adname 'stone', description [; print "The stone channel leads from the sewer vat into the wall. "; 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: if (Sewer_Vat.clean == true) "The sewer vat and stone channel appear to be operating normally."; "You're fairly certain 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."; ], after [; Enter: #Ifdef GRAPHICS_ENABLED; Sewer.comp_mask = S_MASK | OUT_MASK; #Endif; rfalse; Exit,Go: #Ifdef GRAPHICS_ENABLED; Sewer.comp_mask = U_MASK | S_MASK | IN_MASK; #Endif; rfalse; ], has container enterable open; !==================================================================================================================================================== ! Atop the West Wall OutroomV Atop_West_Wall "Atop the West Wall" with description "A multicoloured landscape of cultivated fields stretches out from the caer west to the horizon. The Vechlee road runs past the caer heading northeast into farming country and southwest towards Vechlee. The fields continue flat and level for quite some distance, gradually leading into some low hills. Beyond the hills, the spires and towers of Vechlee rise up to the sky.^ ^The caer wall stretches away to the north and south. The wall is wide here, encompassing the entire length of the bailey below. A small stone building sits on the wall west of you. The courtyard is back down the stairs to the east.", #Ifdef GRAPHICS_ENABLED; map 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 13 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 26 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 39 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 52 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 65 0 0 0 0 0 5 10 0 0 0 0 0 0 ! 78 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 91 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 104 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 117 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 130 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 143 0 0 0 0 0 0 0 0 0 0 0 0 0, ! 156 comp_mask D_MASK | W_MASK | IN_MASK, #Endif; 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 the Vechlee 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 Vechlee on the horizon."; return self.OutroomV::compass_look(obj); ], 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.", 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 [; <>; ], w_to [; print "You step inside the gatehouse.^"; return Gatehouse; ], d_to [; print "You descend the weathered stone steps to the courtyard.^"; return W_Courtyard; ]; Prop Gate_Building "building" with name 'building' 'gatehouse' 'battlemen', adname 'small' 'stone', 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 [; #Ifdef GRAPHICS_ENABLED; if (location hasnt visited) Atop_West_Wall.&map-->82 = 2; #Endif; "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 lead oil or water over invaders in the bailey below. A doorway east leads back out to the top of the wall."; ], #Ifdef GRAPHICS_ENABLED; map 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 13 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 26 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 39 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 52 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 65 0 0 0 0 0 0 1 5 14 0 0 0 0 ! 78 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 91 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 104 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 117 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 130 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 143 0 0 0 0 0 0 0 0 0 0 0 0 0, ! 156 comp_mask E_MASK | OUT_MASK, #Endif; before [; Exit: if (player in location) <>; rfalse; ], compass_look [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 [; <>; ], out_to [; <>; ], e_to [; print "You step out of the gatehouse and back onto the wall.^"; return Atop_West_Wall; ], d_to [; "You strain and squeeze, but you can't manage to fit through the murder holes. It's just a bit too tight."; ]; Askable -> port_lever "iron lever" with name 'lever', adname 'strong' 'iron' 'portculli' 'port', description [; "A strong iron lever. It looks like it opens and closes the portcullis."; ], describe [; "^The hydrolytic counter-balancing machine Ninario had here last time is gone, replaced by a simple iron lever."; ], before [; Eat: "You decide not to eat the lever for the portcullis.^ ^~Low on iron?~ asks ", (the)crystal, " curiously."; Examine: rfalse; Open: if (Portcullis hasnt open) { PlaySound(port_sound); Achieved(47); give Portcullis open; "A great rumbling and a clattering noise come from below as the portcullis raises."; } <>; Close: if (Portcullis has open) { "You'd best just leave it up in case a quick getaway is needed."; } <>; Pull,Push,Turn,Lift: if (Portcullis has open) { <>; } <>; default: "It's affixed to the wall and you don't need to worry too much about it."; ]; Askable Murder_Hole "murder holes" with name 'hole' 'holes' 'opening', adname 'murder', 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) { if (vat_and_horses in Bailey) { print "WizStrip delivery wagon in the "; } "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?"; Use: if (self in Bailey) "How do you propose to do that from down here?"; "This isn't a garderobe, you know."; ], after [; Receive: move noun to Bailey; print "You drop ", (the) noun, " into the hole. "; if (noun has pluralname) print " They fall "; else print " It falls "; print "to the bailey floor below."; if (vat_and_horses in Bailey) { print "^~Hoi!~ bellows the teamster angrily from the bailey. Watch where you're dropping things!~"; } new_line; rtrue; ], has container open pluralname scenery; !==================================================================================================================================================== ! Main Hall RoomV Main_Hall_Vision "Main Hall" with description [; if (self.vision == true) Startdaemon(self); print "Light funnels 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 "; if (Lab_Door_Vision has open) print "is open to the"; else print "leads"; print " south, and a rusty metal door stands "; if (Workshop_Door_Vision has open) print "open"; else print "closed"; print " to the northwest. The spiral staircase ascends "; if (Sewer_Vat.clean == true) print "through the ruins of the first floor up to the tower roof"; else print "to the first floor"; ", and also descends into the dark basement."; ], #Ifdef GRAPHICS_ENABLED; map_offset 79, comp_mask W_MASK | OUT_MASK | NW_MASK | S_MASK | U_MASK | D_MASK | NE_MASK, #Endif; dtime 0, vision false, cant_go [; "Unfortunately, as this is a vision, there's not much you can do other than watch and wait. Or talk to ", (the)crystal, ", who seems to be sharing the vision with you."; ], daemon [; self.dtime++; if (self.dtime == 2) { move big_key_vis to Main_Hall_Vision; "^~What a dump!~ says Renaldo, gazing around. ~Typical of Ninario, of course. Now, let's see. Yekcal, here's the key. Lock the front gate, and then hire a guard for the caer wall, someone we can trust. And not that imbecile we used at the Guild Hall.~"; } if (self.dtime == 3) { remove big_key_vis; "^~Er, right,~ says Yekcal, tucking the key away. ~Lock the door. Guard for the wall, no imbeciles.~^^Renaldo rolls his eyes. ~If only,~ he mutters, giving a long-suffering sigh of exasperation, which goes unnoticed by Yekcal."; } if (self.dtime == 4) "^~See if you can find some lead or oil that we can give the guard to drop on anyone trying to get in,~ adds Renaldo. ~Let's try to adopt a siege mentality and foresee any interference.~^ ^~Right,~ nods Yekcal. ~I'll check the workshop in a bit.~"; if (self.dtime == 5) "^~Next thing,~ says Renaldo, ~is to put a magical seal on the front entrance here. We don't want anyone disturbing us once we start.~^^~Magical seal, front entrance,~ notes down Yekcal. ~Of course, sir, wonderfully abstract idea.~"; if (self.dtime == 6) "^~Actually...~ murmurs Renaldo, pensively. ~Let's put a magical seal on the stairway from the basement too, while we're at it.~^ ^~Er, right,~ says Yekcal, a bit uncertainly. ~That doesn't strike you as overkill, sir? I mean, they're not likely to tunnel in, are they?~"; if (self.dtime == 7) "^~No,~ admits Renaldo, ~but if I know Ninario, he has a back entrance into the place. He certainly eluded me enough times when I used to call on him in the Guild days.~^^~Very well,~ sighs Yekcal. ~Magical seal, basement.~"; if (self.dtime == 8) "^~Hmm,~ says Renaldo, glancing around the hall. ~I think we can probably cover the stairs from the basement and the front entrance with the same seal.~^ ^~Just one seal, sir? Are you sure?~^ ^~Yes,~ says Renaldo firmly. ~It's a small area. As long as the seal is large.~^ ^~Right,~ notes Yekcal. ~One large magical seal. Then what?~"; if (self.dtime == 9) "^~And then,~ smiles Renaldo, ~we raid the laboratory.~^^~Right!~ agrees Yekcal, rubbing his hands in glee. ~Interplanar rift analyser, here we come!~"; if (self.dtime == 10) { print "^~Yekcal?~ asks Renaldo.^^~Er, yes sir?~^^~Shut up.~^^~Yes sir, thank you, sir.~"; new_line; EndVision(self); StopDaemon(self); if (initialvision == true) { Achieved(11); print "^~Hmmm...~ murmurs ", (the)crystal, ". ~They're fortifying Ninario's place. I hope we don't have to confront them there. It could get tricky.~^"; } initialvision = false; rtrue; } ], 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) <>; return self.RoomV::compass_look(obj); ], Floor STONE_TILES; RoomV Main_Hall "Main Hall" with description [; Achieved(52); #Ifdef GRAPHICS_ENABLED; RevealVechlee(self.map_offset); #Endif; print "Light 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 "; if (Lab_Door has open) print "is open to the"; else print "leads"; print " south, and a rusty metal door stands "; if (Workshop_Door has open) print "open"; else print "closed"; print " to the northwest. The spiral staircase ascends "; if (Sewer_Vat.clean == true) print "through the ruins of the first floor up to the tower roof"; else print "to the first floor"; ", and also descends down into inky darkness."; ], #Ifdef GRAPHICS_ENABLED; map_offset 79, comp_mask W_MASK | OUT_MASK | NW_MASK | S_MASK | U_MASK | D_MASK | NE_MASK, #Endif; 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) <>; return self.RoomV::compass_look(obj); ], 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.", out_to [; <>; ], w_to [; print "You head down the stone passageway and emerge into the bright sunshine of the courtyard.^"; #Ifdef GRAPHICS_ENABLED; vechleemap-->275 = 5; #Endif; 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 up the staircase all the way to the tower roof, through the ruin of the first floor.^"; StartDaemon(Tower_Roof_D); return Tower_Roof; ], d_to [; print "You descend cautiously down the rickety staircase.^"; return Basement; ]; Prop Staircase "winding spiral staircase" with name 'staircase' 'stairs' 'case' 'railing', adname 'winding' 'spiral' 'stair' 'brass' 'rickety' 'wrought' 'iron' 'wrought-i' 'old-fashi', description [; print "The rickety wrought-iron staircase "; if (self in Tower_Roof or Tower_Roof_Vision) print "descends all the way to the ground floor."; if (self in Basement) print "ascends to the ground floor."; if (self in Main_Hall && Sewer_Vat.clean == true) print "leads down to the basement, and ascends to the tower rooftop through the ruin of the first floor."; else if (self in Main_Hall or Main_Hall_Vision) print "leads down to the basement, and ascends to the first floor."; " 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 [; 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 Tower_Roof_Vision Main_Hall Main_Hall_Vision Basement; RoomV Kitchen "Kitchen" with description [; #Ifdef GRAPHICS_ENABLED; if (location hasnt visited) { RevealVechlee(self.map_offset); } #Endif; "A few rusted pots and pans line this 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."; ], #Ifdef GRAPHICS_ENABLED; map_offset 17, comp_mask SW_MASK | OUT_MASK, #Endif; 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.", out_to [; <>; ], sw_to [; print "You step back into the main hall.^"; return Main_Hall; ]; Askable -> Oak_Table "oak table" with name 'table', adname 'well-scru' 'solid' 'oak' 'sturdy' 'finest', 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 [; Eat,Lick,Taste: "It tastes of oak."; 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; Cheese -> -> Airedale "Airedale" with name 'airedale' 'airdale', invent [; print "a piece of Airedale"; if (self.visionnum ~= 0) { PrintShortVision(self.visionnum); } rtrue; ], description [; print "A semi-soft gourmet cheese, pale yellow on the inside, but with a deep red wax rind on the outside."; if (self.visionnum ~= 0) { PrintVision(self.visionnum); } new_line; rtrue; ], before [; Insert,Take,Transfer: Achieved(53); rfalse; Eat,Lick,Taste: "The Airedale melts on your tongue. It's got a tangy, salty, milky flavour with a hint of earthiness. You sample just a small morsel, leaving plenty behind."; Smell: "The aroma is very pungent and earthy, smelling strongly of sun-warmed grass."; Touch: "The Airedale has a nice firm texture, similar to cheddar."; ]; Prop -> Fireplace "fireplace" with name 'fireplace' 'place', adname 'fire', 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 name 'pots' 'pans' 'pot' 'pan', adname 'rusted', article "some", description "Miscellaneous pots and pans line the walls of the kitchen. They are all rusted, and you know for a fact they were rarely used, even before the move to Blumph.", before [; Examine: rfalse; default: "The pots and pans are too rusted to be of real use."; ]; Autodoor Workshop_Door "rusty metal door" with name 'door', adname 'metal' 'rusty' 'rusted' 'rusty' 'workshop' 'work', description [; print "Corroded stains line the pitted steel surface of the"; if (self has open) " open door."; " closed door."; ], information [person; switch (person) { crystal: if (location == Workshop) "~This is where you and Ninario did all the grunt work for your scientific shenanigans?~ asks ", (the)crystal, " looking around. ~Nicely appointed workshop.~"; else "~Oh, where you and Ninario did all the grunt work for your scientific shenanigans?~ asks ", (the)crystal, ". ~It seemed a nicely appointed workshop.~"; } rfalse; ], nw_to Workshop, se_to Main_Hall, before [; Enter: print_ret (The)self, " is firmly closed and locked, and you don't have the key."; ], has scenery door open openable lockable; Autodoor Workshop_Door_Vision "rusty metal door" with name 'door', adname 'rusty' 'rusted' 'rusty' 'workshop' 'work', description [; print "Corroded stains line the pitted steel surface of the"; if (self has open) " open door."; " closed door."; ], information [person; switch (person) { crystal: if (location == Workshop_Vision) "~This is where you and Ninario did all the grunt work for your scientific shenanigans?~ asks ", (the)crystal, " looking around. ~Nicely appointed workshop.~"; else "~Oh, where you and Ninario did all the grunt work for your scientific shenanigans?~ asks ", (the)crystal, ". ~It seemed a nicely appointed workshop.~"; } rfalse; ], nw_to Workshop_Vision, se_to Main_Hall_Vision, before [; Enter: print_ret (The)self, " is firmly closed and locked, and you don't have the key."; ], has scenery door open openable lockable; !==================================================================================================================================================== ! Laboratory RoomV Laboratory_Vision "Laboratory" with description [; if (self.vision == true) Startdaemon(self); print "The southern half of the tower is completely taken up by Ninario's large laboratory. With the move to Blumph, the room has been untouched since you left, and it's in much the same state as the first time you saw it--or would be if Renaldo and Yekcal hadn't turned it upside down searching for something. What little light there is filters in through the numerous small windows lining the walls. The "; if (Lab_Door_Vision has open) print "open"; else print "closed"; print " door to the north leads back to the main hall.^"; print "^A scarred and stained table rests"; " against the southern wall."; ], #Ifdef GRAPHICS_ENABLED; map_offset 143, comp_mask N_MASK | OUT_MASK, #Endif; dtime 0, vision false, daemon [; self.dtime++; if (self.dtime == 2) "^~It's not here,~ growls Renaldo, straightening up from rooting around in the room. ~Anything in the workshop, Yekcal?~^ ^~A few interesting things, but no rift analyser, I'm afraid, sir,~ sighs Yekcal. ~I did find some lead, so I gave it to the guard. He's testing it out in the bailey murder holes right now.~"; if (self.dtime == 3) "^~Good,~ mutters Renaldo. ~Maybe that will shut the incomprehensible fool up. But blast that Ninario, he must have taken the rift analyser with him when he moved.~"; if (self.dtime == 4) "^~But we know he didn't take it into his house in Blumph,~ protests Yekcal. ~We watched him move in.~"; if (self.dtime == 5) "^~No,~ agrees Renaldo pensively. ~And even Ninario, inept wizard though he is, knows enough, after last time, to guard his residence. So, while it would be safe there, evidently not safe enough for him. He's probably trying to keep it out of our hands. Where could it be that's safer than a wizard's own house?~"; if (self.dtime == 6) "^~Don't you wish, sometimes, that the things you're looking for were just in a big box with the name on the side?~ sighs Yekcal.^ ^~Shut up, you...~ snaps Renaldo. He breaks off. ~Box, you say. Yekcal, you're a... well, not a genius obviously, but you've given me an idea. I know where the analyser is. Quick! To the bedroom!~"; if (self.dtime == 7) { print "^~It's in the bedroom?~ asks Yekcal in disbelief.^^~No, you fool, but I'm sure some of Ninario's distinctive bunny robes are.~ He heads quickly out of the door.^^~Bunny robes?~ mutters Yekcal as he follows, a mystified look on his face."; new_line; EndVision(self); StopDaemon(self); if (initialvision == true) { Achieved(18); print "^~Uh oh...~ says ", (the)crystal, ". ~It sounds like Renaldo is thinking about posing as Ninario to get the rift analyser from the building society. Hmmm, I wonder if these are visions of the past, present or future? "; if (claim_ticket has general) print "You don't suppose he's behind the theft at the laundry shop, do you?~^"; else print "I think we'd better see about claiming those robes from the laundry.~^"; } initialvision = false; rtrue; } ], compass_look [obj; if (obj == n_obj) <>; if (obj == s_obj) <>; return self.RoomV::compass_look(obj); ], before [; Exit: if (player in location) <>; rfalse; ], Floor STONE_TILES, Walls ROUGH_STONE, cant_go [; "Unfortunately, as this is a vision, there's not much you can do other than watch and wait. Or talk to ", (the)crystal, ", who seems to be sharing the vision with you."; ]; Object -> Table_Vision "table" class Ad_Item with name 'table' 'tabletop' 'remains' 'rust' 'stains' 'scars' 'legs' 'tablelegs' 'lines' 'scratches' 'scores' 'dull', adname 'scarred' 'stained' 'rickety' 'metal' 'rusty', 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.^"; self.describe(); ], describe [; if (child(self) == 0) rtrue; if (Silk_Purse hasnt moved || Leather_Pouch hasnt moved) print "^The table holds various familiar components of your and Ninario's experiments. You know all of them like old friends. 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."; Rub: "You would need some serious scrubbing power to clean up all that rust."; ], has static supporter; Purse -> -> Silk_Purse_Vision "silk purse" with name 'purse' 'drawstrings', adname 'small' 'silk', description [; print "A small silk purse, with yellow drawstrings."; if (self has open && child(self) ~= 0) { print " Inside ", (the) self; WriteListFrom(child(self), ENGLISH_BIT + ISARE_BIT); print (string)period; } new_line; rtrue; ]; Purse -> -> Leather_Pouch_Vision "leather pouch" with name 'pouch' 'strings', adname 'small' 'leather', description [; print "A small black leather pouch. Small narrow strings of leather are wound into the lip of the pouch, for holding it closed."; if (self has open && child(self) ~= 0) { print " Inside ", (the) self; WriteListFrom(child(self), ENGLISH_BIT + ISARE_BIT); print (string)period; } new_line; rtrue; ]; Purse -> -> Flask_Vision "flask" with name 'flask', adname 'glass', description [; print "The glass flask "; if (child(self) ~= 0) { print "contains "; WriteListFrom(child(self), ENGLISH_BIT); } else print "is empty"; "."; ], before [; Open,Close: "This flask does not have a top."; Search: <>; ], has ~openable open; Substance -> -> -> KNO3_Vision "potassium nitrate" with name 'saltpeter' 'saltpetre' 'kno3' 'nitrate' 'peter' 'petre' 'powder', adname 'white' 'granular' 'salt' 'potassium', article "some", description "The potassium nitrate is white and granular.", before [; Smell: print_ret (The)self, " is odourless."; ]; RoomV Laboratory "Laboratory" with description [; #Ifdef GRAPHICS_ENABLED; RevealVechlee(self.map_offset); #Endif; print "The southern half of the tower is completely taken up by Ninario's large laboratory. With the move to Blumph, the room has been untouched since you left, and it's in much the same state as the first time you saw it--or would be if Renaldo and Yekcal hadn't turned it upside down searching for something. What little light 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."; ], #Ifdef GRAPHICS_ENABLED; map_offset 143, comp_mask N_MASK | OUT_MASK, #Endif; compass_look [obj; if (obj == n_obj) <>; if (obj == s_obj) <>; return self.RoomV::compass_look(obj); ], 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.", out_to [; <>; ], n_to Lab_Door, s_to [; <>; ]; Askable -> Table "rickety metal table" with name 'table' 'tabletop' 'remains' 'rust' 'stains' 'scars' 'legs' 'tablelegs' 'lines' 'scratches' 'scores' 'dull', adname 'scarred' 'stained' 'rickety' 'metal' 'rusty', 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.^"; self.describe(); ], describe [; if (child(self) == 0) rtrue; if (Silk_Purse hasnt moved || Leather_Pouch hasnt moved) print "^The table holds various familiar components of your and Ninario's experiments. You know all of them like old friends. 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."; Rub: "You would need some serious scrubbing power to clean up all that rust."; ], has static supporter; Purse -> -> Silk_Purse "silk purse" with name 'purse' 'drawstrings', adname 'small' 'silk', description [; print "A small silk purse, with yellow drawstrings."; 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 [; Attack: if (child(self) ~= 0) "But that would scatter ", (the)child(self), " everywhere!"; Pull: if (self has open) <>; <>; ], information [person; switch (person) { crystal: "~That silk purse might be useful as a powder bag,~ says ", (the)crystal, (string)period; } ], after [; Close: "You pull the drawstrings together, sealing ", (the) self, (string) period; ]; Substance -> -> -> Sulphur "powdered sulphur" with name 'sulphur' 'sulfur', adname 'powdered', article "some", description "A small amount of powdered sulphur.", information [person; switch (person) { crystal: "~It looks like perfectly ordinary sulphur to me,~ says ", (the)crystal, (string)period; } ], before [; Eat: "Ingesting raw sulphur, while not likely to kill you, is probably not a good idea.^ ^~Eat some protein instead,~ suggests ", (the)crystal, "."; Smell: print_ret (The) self, " has no discernible odour."; ]; Purse -> -> Leather_Pouch "leather pouch" with name 'pouch' 'strings', adname 'small' 'leather', description [; print "A small black leather pouch. Small narrow strings of leather are wound into the lip of the pouch, for holding it closed."; 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 [; Attack: if (child(self) ~= 0) "But that would scatter ", (the)child(self), " everywhere!"; Pull: if (self has open) <>; <>; ], information [person; switch (person) { crystal: "~That little leather pouch might be useful as a powder bag,~ says ", (the)crystal, (string)period; } ], after [; Close: "You pull the drawstrings together, sealing ", (the) self, (string) period; ]; Substance -> -> -> Charcoal "charcoal" with name 'charcoal', article "some", description "Fine black grains of charcoal.", before [; Eat: "You weren't that fond of dad's rare outdoor grille cooking attempts that you want to be reminded of it."; Smell: print_ret (The) self, " has an odd coal-like scent."; ]; Purse -> -> Flask "flask" with name 'flask', adname 'glass', description [; print "The glass flask "; if (child(self) ~= 0) { print "contains "; WriteListFrom(child(self), ENGLISH_BIT); } else print "is empty"; "."; ], before [; Attack: if (child(self) ~= 0) "But that would scatter ", (the)child(self), " everywhere!"; Open,Close: "This flask does not have a top."; Search: <>; ], has ~openable open; Substance -> -> -> KNO3 "potassium nitrate" with name 'saltpeter' 'saltpetre' 'kno3' 'nitrate' 'peter' 'petre' 'powder', adname 'white' 'granular' 'salt' 'potassium', article "some", description "The potassium nitrate is white and granular.", before [; Eat: "~Too much potassium nitrate in the system can cause nitrate toxicity,~ announces ", (the)crystal, ".^ ^You decide against eatig it."; Smell: print_ret (The)self, " is odourless."; ]; Askable blackboard "blackboard" with name 'blackboar' 'board' 'notes' 'suggestio', adname 'black' 'explosive', description [; print "The blackboard contains many scribblings from the experiments you and Ninario have conducted. You are amused to spot your old chemistry notes amongst them, circled and annotated ", (i) "Explosive suggestions from the apprentice", " in Ninario's handwriting.^"; if (self has general) { new_line; <>; } rtrue; ], describe [; "^Hanging on one wall is a blackboard with some notes scrawled on it."; ], found_in Laboratory Laboratory_Vision, information [person; switch (person) { crystal: print "~Lots of good information on it, "; if (location == Laboratory or Laboratory_Vision) print "i"; else print "wa"; "sn't there? I think the most critical is that formula for black powder... or gunpowder as you call it.~"; } rfalse; ], before [; Eat,Lick,Taste: "Mmmm... chalky."; Read,Search: give self general; print "One part of the notes in particular catches your eye, that copied largely from your chemistry notes, with some annotations by Ninario:^"; font off; print "^Many cmplx. cmpds must be mixed with mortar and pestle to really drive grains together. Sometimes mechanical device is even used to mix properly^ (Our ball mill is perfect for this)^ Some examples of cmpds:^ 2KNO3 + 3C + S -> K2S + 3CO2 + N2^ (right-hand side: gunpowder)^ (potassium nitrate: apprentice's name for saltpetre. Why is potassium 'K'? Must ask apprentice)^ C3H5(OH)3 + 3HNO3 -> C3H5(NO3)3 + 3H2O^ nitroglycerin: one lb produces 156 cu ft of gas, shock wave moves 25,000 ft/sec^ (Must try one day, in spite of apprentice's obvious apprehension!)^ H2CO3(aq) -> H2O + CO2(gas)^ Carbonic acid (e.g. fizzy drinks? Apprentice mentioned ~Tizer~, must ask what this means)^"; font on; ! The black powder hasn't really been "seen", but we'll mark it as seen so Crystal can be asked about it. give Blackpowder objseen; "^~Ooh, is gunpowder your name for black powder?~ asks Crystal. ~Didn't you make some last year to blast your way out of the caer doors? Could we make some? I'd love to see us fire the cannon.~"; ], has static readable; 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.", found_in Laboratory Laboratory_Vision, before [; Attack: "Smashing windows is difficult when they have 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; !==================================================================================================================================================== !Ninario's bedroom RoomV Bedroom "Bedroom" with description [; if (self.vision == true) StartDaemon(self); print "Thick carpeting covers the floor of Ninario's bedroom. Spacious windows in the north and west walls admit generous amounts of light. A large, canopied four-poster bed sits here, devoid of sheets and mattress. A large open wardrobe sits against on the southern wall. The door to the hallway lies to the east.^"; ], #Ifdef GRAPHICS_ENABLED; map 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 13 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 26 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 39 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 52 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 65 0 0 0 0 0 0 2 5 0 0 0 0 0 ! 78 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 91 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 104 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 117 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 130 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 143 0 0 0 0 0 0 0 0 0 0 0 0 0, ! 156 comp_mask E_MASK | OUT_MASK, #Endif; dtime 0, vision false, seen false, daemon [; self.dtime++; if (self.dtime == 2) "^~Nothing!~ snarls Renaldo, turning away from the wardrobe in disgust. ~What kind of person takes all his old robes with him?~^ ^~Ninario, I suppose, sir,~ sighs Yekcal."; if (self.dtime == 3) "^~Yes,~ mutters Renaldo. ~He's probably ", (i) "wearing", " all his old robes.~^ ^~He always does,~ agrees Yekcal. ~And he lets them get so filthy before washing them too.~"; if (self.dtime == 4) "^Renaldo stops suddenly, a smile crossing his face. ~But even Ninario gets his robes cleaned eventually. Yekcal, did you put those seals on the doors yet?~^^~Er, no sir,~ says Yekcal, looking worried."; if (self.dtime == 5) "^~Excellent!~ smiles Renaldo. ~Pop back to Blumph and pay a little midnight visit to that laundry place. See if there's anything there we can use.~^^~Yes sir, of course, sir,~ agrees Yekcal. ~Er, about the seals though, sir?~^^~What about them?~ snaps Renaldo."; if (self.dtime == 6) "^~Well, I couldn't actually find any magical seals. Would a magical walrus do the trick?~"; if (self.dtime == 7) { print "^There is a long pause before Renaldo speaks. When he does, it's quiet and distinct. ~Yekcal?~^ ^~Yes, sir?~^^~I am going to kill you very slowly and painfully when this is all over.~^ ^~Yes sir, thank you, sir.~"; new_line; EndVision(self); StopDaemon(self); if (initialvision == true) { Achieved(24); self.seen = true; if (claim_ticket has general) print "^~Oh no!~ moans ", (the)crystal, ". ~We may have an explanation for the missing robes.~^"; else print "^~Well,~ says ", (the)crystal, " in a hopeful tone. ~Perhaps their plans will hit a snag if they can't find Ninario's robes.~^"; } initialvision = false; rtrue; } ], compass_look [obj; if (obj == w_obj) <>; if (obj == n_obj) <>; if (obj == e_obj) "This open wooden door leads back to the hallway."; return self.RoomV::compass_look(obj); ], before [; Exit: if (player in location) <>; rfalse; ], Floor THICK_CARPET; Askable -> N_Bed_Window "northern window" with name 'window' 'windows', adname 'n//' 'north' 'northern', before [; Search: "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."; ], has scenery ~open openable; Askable -> W_Bed_Window "western window" with name 'window' 'windows', adname 'w//' 'west' 'western', look_out false, before [; Search: self.look_out = true; 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. Directly across the courtyard is a short passageway, followed by a set of iron-banded wooden doors, "; if (Caer_Door has open) print "hanging open"; else print "massive and imposing"; ". A large white fountain sits empty in the middle of the courtyard."; ], has scenery ~open openable; Furniture -> Carpet "carpet" with name 'carpet', adname 'thick', before [; Examine,Touch: <>; ], has scenery; Furniture -> Bed "large canopied bed" with name 'bed' 'four-post' 'fourposte' 'poster', adname 'large' 'old-fashi' 'four-post' 'four' 'canopied', description "A large, old-fashioned canopied four-poster bed. It's empty of sheets and mattress, which all went to Blumph with Ninario.", has scenery; Furniture -> wardrobe "wardrobe" with name 'wardrobe', adname 'upright', description "An upright wardrobe, resting against the wall. It is currently open and empty.", has scenery; Furniture -> Bedroom_Door "door" with name 'door' 'doorway', adname 'bedroom' 'wooden', description "This open wooden door leads out to the hallway.", information [person; switch (person) { crystal: if (location == Bedroom) "~It's Ninario's bedroom,~ shrugs ", (the)crystal, ". ~Bedroom, bed, door, wardrobe. Probably a chamberpot under the bed too, did you want to ask me about that?~"; } rfalse; ], before [; Search: "Looking through the open door, you can see the north hallway of Ninario's tower."; ], has scenery; !==================================================================================================================================================== ! Tower roof Outroom Tower_Roof_Vision "Tower" with description [; if (self.vision == true) Startdaemon(self); "A commanding and breathtaking view of the fields and pastures surrounding the caer greets you here atop the tower. 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."; ], #Ifdef GRAPHICS_ENABLED; map 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 13 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 26 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 39 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 52 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 65 0 0 0 0 0 0 10 0 0 0 0 0 0 ! 78 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 91 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 104 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 117 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 130 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 143 0 0 0 0 0 0 0 0 0 0 0 0 0, ! 156 comp_mask D_MASK | IN_MASK, #Endif; Floor ROUGH_STONE, Walls ROUGH_STONE, dtime 0, vision false, daemon [; self.dtime++; if (self.dtime == 2) "^~Do you see it?~ demands Renaldo, peering around him. ~I can't spot it,~ he snaps, his eyes watering from the strain. ~Blast these useless eyes,~ he mutters.^ ^~They'll be young again soon sir,~ promises Yekcal. He too peers about the roof. ~I can't see it either.~"; if (self.dtime == 3) "^~There sir!~ cries Yekcal suddenly, pointing to a barely discernible smudge in the air.^ ^~If you say so,~ grunts Renaldo, peering at the smudge. ~Let's get started.~"; if (self.dtime == 4) "^Renaldo makes some experimental passes in the air with his hands. The smudge grows ever slightly more distinct.^ ^~What should I be doing, sir?~ asks Yekcal, watching awkwardly."; if (self.dtime == 5) "^~Just keep an eye on things,~ mutters Renaldo. ~Watch out for the apprentice.~ He begins muttering in a strange tongue, almost to himself.^ ^~The apprentice?~ echoes Yekcal in alarm. ~We aren't expecting the apprentice, are we?~ He begins looking around nervously."; if (self.dtime == 6) { move vat_and_horses_vis to Tower_Roof_Vision; "^~Not if you did your job with that magical seal,~ snarls Renaldo. ~Now shut up and let me concentrate.~^ ^~Of course, the seal,~ says Yekcal. ~It's a walrus anyway,~ he mutters to himself. A look of worry crosses his face. ~I wonder if he's all right. Maybe he's getting hungry.~ He peers down over the edge of the parapet."; } if (self.dtime == 7) "^~Did you order anything sir?~ asks Yekcal, still looking over the edge.^ ^~What are you going on about?~ demands Renaldo. ~I'm trying to concentrate here.~^ ^~Sorry sir, but there's a delivery wagon in the courtyard,~ says Yekcal. ~I just wondered if you'd ordered some WizStrip.~^ ^~Of course not, you fool,~ says Renaldo. ~Now shut up and let me work.~^ ^~Yes sir, sorry sir,~ says Yekcal. ~Gosh, that's a big vat.~"; if (self.dtime == 8) { "^Renaldo breaks off his chanting. ~Did you say ", (i) "vat", ", Yekcal?~^ ^~Indeed I did sir,~ says Yekcal.^ ^~A ", (i) "vat", " of WizStrip?~ asks Renaldo disbelievingly.^ ^~Yes sir,~ agrees Yekcal.^ ^Renaldo's face drains of what little colour remains. ~Get down, Yekcal!~ he bellows, throwing himself flat on the tower roof."; } if (self.dtime == 9) { remove vat_and_horses_vis; Playsound(towerboom); print "^Suddenly, there is a powerful explosion and Yekcal loses his footing as a massive detonation rocks the tower. There is a violent ejection of rocks, glass and rubble from the sides of the tower and the whole structure gives an alarming ", (i) "lurch", " and collapses down upon itself. The vision suddenly drops downwards as the whole tower roof drops down about twelve feet.^ ^Renaldo and Yekcal slowly rise to their feet. ~What the devil is going on, sir?~ asks Yekcal, his voice shaking.^ ^~It's the apprentice,~ says Renaldo grimly. ~Must be. WizStrip, methane, explosions. It has all the hallmarks. Let's carry on. If the rift opens, grab any children you see. I'm nearly dead on my feet here.~ He rolls up his sleeves and begins chanting again."; new_line; EndVision(self); StopDaemon(self); if (initialvision == true) { Achieved(43); print "^~Children!~ gasps ", (the)crystal, ". ~That's his plan! Grab children from your world and use them to make himself young again! That demonic fiend! And they're about to start expanding the rift! We'd better get over there. "; if (task_done->51 == 0) print "But I wonder what that explosion was? We'd best be careful.~^"; else print "I guess that was our WizStrip explosion.~^"; } initialvision = false; rtrue; } ], 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 the Vechlee 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 town of Vechlee 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) <>; rfalse; ], cant_go [; "Unfortunately, as this is a vision, there's not much you can do other than watch and wait. Or talk to ", (the)crystal, ", who seems to be sharing the vision with you."; ]; Askable -> Cannon_Vision "cannon" with name 'cannon' 'gun' 'maimer' 'brutalmai' 'carronade' 'massive' 'pounder' 'barrel' 'bore' 'breech' 'muzzle' 'loader' 'trunnions' 'trunnion' 'framing' 'base' 'canon', adname 'brutal' '10-pounde' 'large' 'weighty' 'massive', add_to_scope Portcullis Caer_Door_Vision Fountain Dirt_Obj Caerwall_Obj, capacity 3, initial [; if (self hasnt general) { give self general; "A massive cannon sits here, resting on a huge base."; } "A cannon sits here, aimed out over the caer wall."; ], information [person; switch (person) { crystal: "~I don't think I can tell ", (i) "you", " anything about cannons you don't already know,~", (giggles)crystal, ". ~I heard all about your incident last year.~"; } ], description "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 base.", before [; Search: "The cannon is empty."; ], has static container open enterable; Askable -> Cord_Vision "end of the cord" with name 'end' 'of' 'cord' 'pull-cord', adname 'pull', article "the", description "A fairly ordinary looking pull-cord. It hangs straight down from the breech end of the cannon.", has scenery; Prop -> Can_Plaque_Vision "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; ]; NPC vat_and_horses_vis "WizStrip delivery wagon" with name 'vat' 'team' 'horses' 'teamster' 'driver' 'wagon', adname 'of' 'wizstrip' 'delivery' 'rough-loo', description "The flat wagon contains a large vat of WizStrip, about 400 litres. It's driven by a rough-looking teamster and pulled by a strong draught horse.", initial "A flat horse-drawn wagon sits in the courtyard below.", has ~scenery supporter transparent; Askable big_key_vis "iron key" with name 'key', adname 'iron', description "It's an iron key with a bow on one end and large wards on the other.", information [person; switch (person) { crystal: "~I think it's the key to Ninario's caer,~ says ", (the)crystal, (string)period; } rfalse; ]; OutroomV Tower_Roof "Tower" with description [; "A commanding and breathtaking view of the fields and pastures surrounding the caer greets you here atop the tower. 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."; ], #Ifdef GRAPHICS_ENABLED; map 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 13 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 26 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 39 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 52 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 65 0 0 0 0 0 0 10 0 0 0 0 0 0 ! 78 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 91 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 104 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 117 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 130 0 0 0 0 0 0 0 0 0 0 0 0 0 ! 143 0 0 0 0 0 0 0 0 0 0 0 0 0, ! 156 comp_mask D_MASK | IN_MASK, #Endif; 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 the Vechlee 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 town of Vechlee 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) <>; rfalse; ], cant_go "The only safe direction is down into the tower.", u_to "If you leap into the air like that, you'll tumble over the edge.", in_to [; <>; ], d_to [; if (yekcal.in_cannon == true) { StopTimer(yekcal); while (child(Cannon)) { move child(Cannon) to location; } Cannon.Blackpowder_in_Bag = false; yekcal.in_cannon = false; MoveFloatingObjects(); } StopDaemon(Tower_Roof_D); if (Renaldo.item ~= 0) { StopDaemon(Renaldo); Renaldo.RenStop(); } ! 5, 10 and 15 are "magic" dtime #s in that we don't want to sit there, they're one-off ones that describe the rift growing. ! So instead bump up by one. stop_time will automatically also increment so we don't "lose" any steps, it will now take longer ! for stop_time to go to zero, at which point dtime starts going up again. if (Tower_Roof_D.dtime == 5 or 10 or 15) { Tower_Roof_D.dtime++; } Tower_Roof_D.stop_time = Tower_roof_D.dtime; !Tower_Roof_D.dtime = 0; if (Cord in player) { move Cord to self; print "(dropping the end of the cord first)^"; } switch (random(9)) { 1: print "~Had enough, have you?~ calls ", (the)renaldo, " as you leave.^^"; 2: if (yekcal in location) print "~Just let them go, Yekcal,~ calls ", (the)renaldo, " as you head for the stairs. ~Focus on the rift.~^^"; else print "~Don't think I'm finished with you yet!~ cries ", (the)renaldo, " as you head for the stairs. ~Yekcal was a dear... acquaintance to me.~^^"; 3: print "~Coward!~ scoffs ", (the)renaldo, " as you leave.^^"; 4: print "~Say hello to your master for me,~ cackles ", (the)renaldo, " as you head for the stairs.^^"; 5: print "~Tell that master of yours he should be here himself if he wants to stop me,~ advises ", (the)renaldo, " as you leave.^^"; 6 to 9: ; } print "You head gingerly down to the ground floor, bypassing the ruin of the second floor.^"; return Main_Hall; ]; Askable -> Cannon "large and menacing cannon" with name 'cannon' 'gun' 'maimer' 'brutalmai' 'carronade' 'massive' 'pounder' 'barrel' 'bore' 'breech' 'muzzle' 'loader' 'trunnions' 'trunnion' 'framing' 'base' 'canon', adname 'brutal' '10-pounde' 'large' 'weighty' 'massive', add_to_scope Portcullis Caer_Door Fountain Dirt_Obj Caerwall_Obj, capacity 3, Blackpowder_in_Bag false, initial [; if (self hasnt general) { give self general; "A massive cannon sits here, resting on a huge base."; } "A cannon sits here, aimed out over the caer wall."; ], information [person; switch (person) { crystal: "~I don't think I can tell ", (i) "you", " anything about cannons you don't already know,~", (giggles)self, ". ~I heard all about your incident last year.~"; } ], description "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 base.", before [; AimAt: "The base now appears to be fixed in place with the cannon aiming out over the wall."; Attack: "CLANG!"; Burn: <>; Empty: if (yekcal.in_cannon) "That's going to be difficult with Yekcal in there."; if (child(self) == 0) "You tilt the cannon and aim it briefly at the floor, but nothing rolls out."; Enter,Climb: if (yekcal.in_cannon) "Cozy as it might be, there just isn't room with Yekcal in there."; "You tried that last year. Perhaps it's someone else's turn to go in the cannon."; LetGo: if (yekcal.in_cannon) "That's going to be difficult with Yekcal in there."; Receive: if (noun == lead) "It's a good thought, but the lump of lead is too awkward of a shape to insert into the cannon."; if (noun == plank) "The plank of wood doesn't really make for a good projectile."; if (yekcal.in_cannon) "That's going to be difficult with Yekcal in there."; 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. You'll need a bag of some kind to act as a powder bag."; } 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 fairly certain it will just smash if you drop it into the cannon."; if (noun ofclass Purse && noun ~= Silk_Purse or Leather_Pouch) print_ret (The) noun, " will probably smash if you drop it into the cannon."; if (noun ofclass Purse && noun == Silk_Purse or Leather_Pouch && Blackpowder in noun) Achieved(56); Search: if (yekcal.in_cannon) "All you can see are Yekcal's flailing legs."; if (child(self) == 0) "The cannon is empty."; print "In the cannon"; WriteListFrom(child(self), ENGLISH_BIT + ISARE_BIT); print_ret (string) period; Take: "The cannon is far too massive to pick up and cart around."; Turn,Push,Pull: "You don't need to worry about aiming the cannon at anything specific."; ], after [; Receive: if (noun == Leather_Pouch or Silk_Purse && Blackpowder in noun) self.Blackpowder_in_Bag = true; ], has static container open enterable; Askable -> Cord "end of the cord" with name 'end' 'of' 'cord' 'pull-cord', adname 'pull', article "the", description "A fairly ordinary looking pull-cord. It hangs straight down from the breech end of the cannon.", before [; Insert: "You can't put the cord in that!"; Pull: if (Cannon.Blackpowder_in_Bag == true) { if (yekcal.in_cannon) { PlaySound(cannonshot); print "You give the cord a good yank. There is a shockingly loud concussive blast, the cannon rocking alarmingly on its base, and there is a howling scream as Yekcal shoots forth, legs first!^"; Cannon.Blackpowder_in_Bag = false; while (child(Cannon)) { move child(Cannon) to location; } remove yekcal; Achieved(57); StopTimer(yekcal); tattler.add_story(YEKCAL_FLIGHT, 2); StartTimer(yekcal_flight_timer, 2); "^Renaldo breaks off what he's doing to watch as Yekcal blasts forth from the cannon. ~Yekcal!~ he bellows angrily, ~I'm going to find you and kill you!~ You hear a faint ~Yes sir, thank you, sir!~ in reply as Yekcal sails just over the top of the caer wall and away into the distance.^ ^Renaldo turns and glares at you. ~He was very obedient and very cheap! Just you wait until I've finished here, you meddlesome pest,~ he growls."; } else "Firing the cannon right now would just waste the black 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; ]; Askable Rift "rift" with name 'rift' 'smudge' 'discontin', adname 'small' 'inter-dim' 'interdime', description [; if (Tower_Roof_D.dtime < 5) "It hovers just at the edge of your vision as a barely discernable smudge in the air."; else if (Tower_Roof_D.dtime < 10) "The rift resembles a miniature tornado hovering in mid-air. It's about the size of a small ball."; else if (Tower_Roof_D.dtime < 15) "The interdimensional rift is significantly larger now, almost big enough to pass through. An otherworldly wind blows through it, shrieking as it goes."; else if (Tower_Roof_D.dtime < 20) "The interdimensional rift, now big enough to accommodate a person, howls with an otherworldly shriek as wind blows through it."; ], found_in Tower_Roof Tower_Roof_Vision, FakeObj, information [person; switch (person) { crystal: "~That's the thing we've got to get closed!~"; } ], 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."; Examine: rfalse; default: "The interdimensional rift exists in the fabric of reality; it isn't just lying around!"; ], has scenery static open openable objseen; !==================================================================================================================================================== ! Caer multi-location objects Object Tower_Roof_D with dtime 0, stop_time 0, found_in Tower_Roof, daemon [; if (self.stop_time == 0) { self.dtime++; } else { self.stop_time--; } if (self.dtime == 1) "^~You're too late, you fool!~ shouts Renaldo. ~Soon, I will open the rift and then we'll be free to use the children of your world to make me young again!~^ ^He begins chanting in a strange and harsh tongue, making mystical passes in front of a small smudge or discontinuity in the air, which hovers just at the edge of your vision."; if (self.dtime < 5) "^Renaldo's harsh chanting continues, building slowly in volume.^ ^~He's trying to expand the rift!~ calls Crystal. ~We have to stop him somehow!~"; if (self.dtime == 5) "^Renaldo's chanting increases in volume and speed, his arms waving more rapidly now. The small smudge now resembles a miniature tornado hovering in mid-air. It's about the size of a small ball.^ ^~We'd better hurry!~ says Crystal urgently. ~Soon he'll be harvesting your world for children to keep him young!~"; if (self.dtime < 10) "^Renaldo's increased cadence and volume of chanting continues. He's building towards something colossal.^ ^~He's increasing it!~ cries Crystal. ~You have to do something!~"; else if (self.dtime == 10) "^Renaldo chants increases to a frantic pitch. The rift is significantly larger now, almost big enough to pass through. An otherworldly wind blows through it, shrieking as it goes."; else if (self.dtime < 15) "^Renaldo chants frantically in the harsh clipped language, biting off the words ferociously. Whatever he's building towards, he's getting close.^ ^~Throw me at him!~ shouts Crystal. ~This ball is interdimensional, I think it will force the rift closed!~"; else if (self.dtime == 15) "^Renaldo chanting reaches fever pitch. He shouts out the words of his spell, his tongue spilling over itself in its hurry. He waves his arms in frenzied motions. The rift is now the size of a person, and the wind screams through it with a howl."; else if (self.dtime < 20) "^Renaldo's fever pitch chanting continues building towards a cataclysmic finish. It can't be long now until the rift opens!"; else if (self.dtime >= 20) { deadflag = 3; "^With a giant cracking noise, the rift fully opens, leaving a coruscating and shimmering portal between the worlds. Renaldo laughs grimly in triumph. Drawing energy from the rift, he turns and blasts you into nothingness. This is a blessing in disguise as it spares you the agony of watching him harvest your world for the fresh bodies he needs to extend his own lifespan."; } ], throwcount 0, react_before [; Attack: if (noun == yekcal or renaldo or rift) { if (globalvision == true) "As this is just a vision, that's not possible."; if (Testscope(yekcal)) { if (yekcal.in_cannon) "One of Yekcal's flailing legs connects solidly with your jaw and you back away, dazed."; if (noun == self) "Yekcal fends off your attack and keeps you at bay."; "Yekcal steps in to fend off your attack, keeping you from reaching Renaldo and the rift."; } "~These pitiful attacks won't stop me now, fool!~ declares Renaldo, holding you at bay while continuing his spell."; } ThrowAt: if (noun == crystal && second ~= nothing) <>; if (second == yekcal or renaldo or rift) { if (globalvision == false) { if (noun == lead) "It's all you can do to hold it, let alone throw it."; if (Testscope(yekcal)) { if (yekcal.in_cannon) { move noun to location; print "One of Yekcal's flailing legs intercepts ", (the)noun, " and ", (itorthey)noun, " fall"; if (noun hasnt pluralname) print "s"; print " to the floor."; } else if (noun ofclass Cheese) { move noun to Cannon; yekcal.in_cannon = true; StartTimer(yekcal, 5); print "~Cheese!~ cries Yekcal as you let fly with ", (the)noun, ". ~I've got it sir!~ He just gets to it with one hand and bats it madly around in the air trying to get it under control. ~I've got it, I can just... oh nuts!~ With one final bat, the cheese flies off to the side and lands right inside the cannon.^ ^~I'll get it, sir!~ cries Yekcal, leaping head-first into the cannon."; } else { print "Yekcal leaps in front of ", (the)noun, ", catching ", (itorthem)noun, " and throwing ", (itorthem)noun, " back at you. "; if (self.throwcount == false) { self.throwcount = true; print "~Are you trying to scare us?~ he taunts. ~It's not going to work!~"; } else print "~Ha!~ he sneers. ~You'll have to throw something scarier than that!~"; } new_line; MoveFloatingObjects(); rtrue; } if (noun ofclass Cheese && renaldo.dtime == 0) { renaldo.item = noun; StartDaemon(renaldo); StopDaemon(Tower_Roof_D); Tower_Roof_D.stop_time = 0; print_ret (The)noun, " hits Renaldo square in the face, interrupting his spell. ~What the... cheese?~ he snarls. He tries to catch it, but fumbles it and it begins bouncing around in his hands, as he tries to get it under control."; } else if (noun == ball or crystal) { if (renaldo.dtime == 0) { "Renaldo's arm flies up and he catches ", (the)ball, " one-handed, throwing it back at you. ~Keep that thing away from here,~ he bellows. ~Delicate spells are in process.~ You catch a glimpse of fear in his tone."; } print "~NO!~ shouts Renaldo as you pitch the snow globe in his direction. Occupied as he is with ", (the)renaldo.item, ", all he can do is duck out of the way of the snow globe. It's the last mistake he ever makes.^ ^The snow globe hits squarely in the middle of the rift. There is a blinding flash as the rift turns inward on itself, closing, and its pent-up magical energy is suddenly expelled outwards in a cataclysmic bang. Renaldo, standing so close to the rift, is blasted apart, simply becoming a fine mist of red. You, further away, are blown backwards off the roof of the tower, bits of snow globe plastic hitting you as you fly back. You see the small figure of Crystal, initially protected somewhat from the blast by the snow globe, hurtling past you, expanding as she does so.^ ^Fortunately, the fore-shortened tower means it's a shorter drop into the garden, where you both land with a thump.^"; #Ifdef SOUND_ENABLED; PlaySound(riftclose); #Endif; StopDaemon(Renaldo); move crystal to Garden; crystal.out = 1; remove ball; remove rift; Achieved(58); PlayerTo(Garden); MoveFloatingObjects(); rtrue; } if (renaldo.dtime == 0) "Renaldo's arm flies up and he catches ", (the)noun, " one-handed, throwing ", (itorthem)noun, " back at you. ~You'll have to throw something scarier than that to stop me!~ he bellows."; move noun to location; print (The)noun, " miss"; if (noun hasnt pluralname) print "es"; print " the distracted Renaldo and ", (itorthey)noun, " fall"; if (noun hasnt pluralname) print "s"; print " to the floor."; new_line; MoveFloatingObjects(); rtrue; } } ], has concealed; Autodoor Portcullis "portcullis" with name 'portculli' 'port', adname 'heavy' 'iron', hint 0, description [; if (self has open) "The portcullis has been raised up into the stone wall."; print "The portcullis is a heavy iron affair, blocking passage to the "; if (self in Bailey) print "east."; else print "west."; if (location ~= Tower_Roof) print " As you look at it more closely, you can see heavy chains attached to the top of the portcullis. They head up into the wall, evidently connecting to an opening mechanism of some kind elsewhere."; new_line; rtrue; ], auto_open false, auto_unlock false, !add_to_scope Caer_Door, before [; if (location == Tower_Roof && action ~= ##Examine or ##Search) "You can't do that from up here on the tower."; if (location == Bedroom && action ~= ##Examine) "You can't do that from up here in the ", (ToLower)location, (string)period; Receive: if (self has open) "But the portcullis is open!"; if (noun == Hoop) { if (location == Bailey) move noun to W_Courtyard; else move noun to Bailey; MoveFloatingObjects(); print "You slide the hoop through the bars of the portcullis and drop it into the "; if (location == Bailey) "courtyard."; "bailey."; } "It might be more sensible to hang onto ", (the)noun, " for now."; 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."; ], e_to W_Courtyard, w_to Bailey, has scenery ~open locked; Object chains "chains" with name 'chain' '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: "You lack the strength to manipulate the chains directly, but there should be a lever somewhere to open the portcullis from inside the courytard."; ], has scenery; Prop Caer_Stairs "stairs" with name 'stairs' 'stair' 'step' 'steps', adname 'worn' 'sturdy' 'stone', article "some", 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."; if (self in Shed) "The worn stone steps descend into darkness."; if (Trapdoor hasnt open) "The worn stone steps lead up to the closed trapdoor."; "The worn stone steps lead up to the shed."; ], before [; if (self in Shed && Trapdoor hasnt open) "You can't see any steps here!"; Climb,Go,Enter,Use: if (self in W_Courtyard or Slimy_Passage) <>; else <>; ], found_in W_Courtyard Atop_West_Wall Shed Slimy_Passage, has pluralname; Prop H_Passage "passage" with name 'passage' 'tunnel', adname 'stone', description [; print "The stone passage leads "; if (self in Main_Hall or Main_Hall_Vision) "west to the courtyard."; "east into the tower."; ], found_in W_Courtyard Main_Hall Main_Hall_Vision, before [; Examine: rfalse; Enter,Go: if (self in Main_Hall or Main_Hall_Vision) <>; <>; default: "It's a passage. That would be difficult."; ]; Autodoor Lab_Door "polished steel door" with adname 'polished' 'steel' 'lab' 'laborator', description [; print "Highly polished steel makes this "; if (self has open) print "open"; else print "closed"; " door gleam brightly in the sunlight."; ], information [person; switch (person) { crystal: if (location == Laboratory or Laboratory_Vision) "~This is where you and Ninario used to get up to all your scientific shenanigans?~ asks ", (the)crystal, " looking around. ~Very impressive laboratory.~"; else "~Oh, the place where you and Ninario used to get up to all your scientific shenanigans?~ asks ", (the)crystal, ". ~It seemed an impressive laboratory.~"; } rfalse; ], s_to Laboratory, n_to Main_Hall, has scenery door open openable lockable; Autodoor Lab_Door_Vision "polished steel door" with adname 'polished' 'steel' 'lab' 'laborator', description [; print "Highly polished steel makes this "; if (self has open) print "open"; else print "closed"; " door gleam brightly in the sunlight."; ], information [person; switch (person) { crystal: if (location == Laboratory or Laboratory_Vision) "~This is where you and Ninario used to get up to all your scientific shenanigans?~ asks ", (the)crystal, " looking around. ~Very impressive laboratory.~"; else "~Oh, the place where you and Ninario used to get up to all your scientific shenanigans?~ asks ", (the)crystal, ". ~It seemed an impressive laboratory.~"; } rfalse; ], s_to Laboratory_Vision, n_to Main_Hall_Vision, has scenery door open openable lockable; Prop Courtyard "courtyard" with name 'courtyard', adname 'large' 'dirt', description [; if (self in Top_Tree) { if (Top_Tree hasnt general) "You can spy the courtyard in the distance beyond Ninario's caer wall from here. It's dry, packed dirt with the caer wall running around it and enclosing it. It seems tantalisingly close, just a stone's throw away, really."; "Now that the tree has bent down so low, you are no longer high enough to see over the wall."; } if (location == W_Courtyard or S_of_Tower) <>; if (location == Bailey) "The large dirt courtyard is spread out before you, a huge stone wall running along the edge of it."; "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 Top_Tree, FakeObj, before [; Examine: rfalse; Receive: if (noun == Hoop) <>; default: "You don't have to worry about doing that to the courtyard."; ]; Prop Nin_Building "tower" with name 'edifice' 'hall' 'tower' 'parapet' 'top', adname 'squat' 'serviceab' 'low' 'short', description [; print "Ninario's tower is a "; if (crystal.out > 0) "sad and forlorn remnant of its former self. Multiple explosions of WizStrip, cannon and interdimensional rift have left it a tumbled heap of ruin."; "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 S_of_Tower Garden, before [; Enter: if (self in W_Courtyard) <>; "You can't enter the tower from here!"; Examine:rfalse; Climb: "Unfortunately, the surface of the tower is too smooth to get a good purchase."; default: "You don't need to worry about the tower quite so much."; ]; Prop Dirt_Obj "dirt" with name 'grounds' 'dirt', adname 'dry' 'packed' 'dirt', description "The floor of the courtyard is dry, packed dirt.", FakeObj, found_in W_Courtyard S_of_Tower, before [; Examine: rfalse; default: "You mentally check your list of things to worry about and are pleased to discover the dirt in the courtyard is not on there."; ]; Prop Caerwall_Obj "caer wall" with name 'wall', adname 'caer', description [; if (self in Hayfield or Atop_Haystack) "You can spy the caer wall in the distance from here. It runs around the entire perimeter of the caer."; if (self in Top_Tree) { if (Top_Tree hasnt general) "You can spy the caer wall in the distance from here. It runs around the entire perimeter of the caer."; ! The top of the tree is bent down. "Now that the tree has bent down so low, you are no longer high enough to see the wall."; } print "The caer wall runs around the entire perimeter of the "; if (self in Vechlee_Road or Vechlee_Road_Vision) "caer."; "courtyard."; ], FakeObj, found_in W_Courtyard S_of_Tower Garden Vechlee_Road Vechlee_Road_Vision Top_Tree Hayfield Atop_Haystack Atop_West_Wall, information [person; switch (person) { crystal: if (W_Courtyard hasnt visited) "~If only we could find a way past the wall and into the caer,~ sighs ", (the)crystal, (string)period; } ], before [; Climb: if (real_location == W_Courtyard) <>; if (location == Top_Tree or Hayfield or Atop_Haystack or Bailey) "That's going to be really difficult from here.", "It's far too tall to climb."; Examine: rfalse; default: "You shouldn't worry about the caer wall so much."; ]; Prop Stone_Path "stone path" with name 'path' 'pathway' 'stones' 'flagstone', adname 'stone' 'flag', found_in W_Courtyard Garden S_of_Tower Manor_Grounds, description [; print "The path is made up of large flagstones, and runs around the "; if (self in Manor_Grounds) print "manor house "; else print "tower "; if (self in S_of_Tower) "to the northwest and northeast."; if (self in Garden) "to the northwest and southwest."; if (self in W_Courtyard or Manor_Grounds) "to the northeast and southeast. From here, it also extends west across the inner courtyard to the western wall."; ], before [; Find: if (location == W_Courtyard or Manor_Grounds) <>; if (location == Garden) <>; <>; ]; Prop walrus "walrus" with name 'walrus' 'mammal' 'tusks' 'flippers' 'tusk' 'flipper', adname 'massive' 'whiskered' 'magical' 'marine' 'huge' 'gigantic', description [; print "You peek "; if (self in W_Courtyard) print "through the doorway"; else print "up the staircase"; print " and sure enough, you can just make out the features of a massive whiskered marine mammal. It has huge tusks and gigantic flippers and is surrounded by a glowing blue aura.^"; if (Bedroom.seen == true) print "^~Well, what do you know?~ says Crystal. ~He ", (i) "did", " find a magical walrus after all.~^"; rtrue; ], tries 0, found_in [; if (sewer_vat.clean == false && location == W_Courtyard or Basement) rtrue; rfalse; ], information [person; switch (person) { crystal: if (Basement has visited || W_Courtyard has visited || Bedroom.seen == true) "~A magical walrus, sighs ", (the)crystal, ". ~Of course there's going to be a magical walrus. What an odd day.~"; "~I'm not certain what you're asking about,~ frowns ", (the)crystal, (string)period; renaldo: "~I don't know what you did to it,~ snarls ", (the)renaldo, ", ~but don't think it's going to stop me.~"; yekcal: if (yekcal in cannon) rfalse; "~Magnificent, wasn't it?~ he crows, stealing a quick glance at Renaldo. ~I hope you didn't hurt it too badly.~"; } rfalse; ], life [; default: "It may not be wise to pester the walrus in that fashion."; ], orders [; "Evidently, large bewhiskered marine mammals aren't used to following orders. Or at least, not yours."; ], before [; Examine: rfalse; Smell: "It definitely smells of fish in the direction of the walrus."; default: "You have no intention of doing anything that brings you nearer the walrus."; ], has animate male; Askable invoice "cheese invoice" with name 'invoice' 'bill' 'list', adname 'cheese', description "It's an invoice from Eliza's Cheese Emporium for a number of different cheeses you appropriated last year, as well as an additional mistaken piece of Brie which you didn't take.", before [; Eat,Lick,Taste: "It's an invoice", (i) "of", " cheeses, not an invoice ", (i) "made", " of cheese."; Read,Search: font off; print (i) "^Cheese invoice^"; font off; print "Item Cost^ Sample of Asiago 3^ Slice of Bel Paese 6^ Morsel of Caerphilly 8^ Hunk of Wensleydale 8^ Mouthful of Camembert 14^ Chunk of Gouda 5^ Bite of Emmental 11^ Portion of Stilton 10^ Quantity of Miranda 12^ Few crumbs of Cheshire 7^ Section of Roquefort 13^ Piece of Brie 3^"; font on; if (crystal.out == 0) print "^~That's a lot of cheese", (murmurs)crystal, "."; new_line; rtrue; ], has readable; !==================================================================================================================================================== ! Cheeses -- move if we find locations for them to go. Most will be moved to ! player location as necessary ! The Gorgonzola is found when the player retrieves Ninario's robes. Cheese Gorgonzola "Gorgonzola" with name 'gorgonzol' 'gorgon' 'zola', invent [; print "a piece of Gorgonzola"; if (self.visionnum ~= 0) { PrintShortVision(self.visionnum); } rtrue; ], description [; print "A creamy white blue-veined cheese with a soft, crumbly texture."; if (self.visionnum ~= 0) { PrintVision(self.visionnum); } new_line; rtrue; ], before [; Eat,Lick,Taste: print_ret (The) self, " reminds you a great deal of the Roquefort you found in Vechlee in your last adventure, somewhat sharp and pungent, and quite salty taste. You refrain from following through on the urge to polish it all off."; Smell: print_ret (The) self, " has a sharp, almost offensive, aroma."; Touch: print_ret (The) self, " has a soft texture, crumbling easily."; ]; ! The Brie is given to the player when they enter the cheese shop. Cheese Brie "Brie" with name 'brie', invent [; print "a piece of Brie"; if (self.visionnum ~= 0) { PrintShortVision(self.visionnum); } rtrue; ], description [; print "A very soft mould-ripened cheese, pale smooth yellow on the inside, but with a creamy white rind on the outside."; if (self.visionnum ~= 0) { PrintVision(self.visionnum); } new_line; rtrue; ], before [; Eat,Lick,Taste: "Though nice and mild, this Brie is definitely the real thing; it has a very rich flavour, with strong hints of mushroom and garlic. It would be very easy to gobble it all down, but you restrain yourself."; Smell: "The aroma is very pungent and earthy, smelling strongly of the mould-ripened rind."; Touch: "The Brie has a very soft, pleasant texture, much softer than cheddar, but not crumbly like Cheshire."; ]; !==================================================================================================================================================== ! Entry point routines (in alphabetical order) [ Admits obj; print ",~ "; switch (random(3)) { 1: print "admits"; 2: print "confesses"; 3: print "confides"; } print " ", (the) obj; ]; #Ifdef GRAPHICS_ENABLED; [ AfterPrompt; ! Now redraw the entire room and the inventory objects: if (gg_mapwin ~= 0) DrawMain(); ]; #Endif; [ AimAtSub ks; if (second == nothing) { if (TestScope(autoclimber)) { if (autoclimber notin player) { ks = keep_silent; keep_silent = true; print "(first taking ", (the)autoclimber, ")^"; ; keep_silent = ks; } if (autoclimber in player) <>; else rfalse; } else "You'll need something to aim before you can aim at ", (the) noun, (string)period; } ! We should have already dealt with every possibility, so rfalse as we can't pick up the autoclimber. if (noun == autoclimber) rfalse; "You can't aim that at something."; ]; [ AimNothingSub; if (noun == autoclimber) "You'll have to specify something to aim it at."; "You can't aim that at something."; ]; [ Amusing; if (deadflag ~= 2 or 4) "You must win the game before selecting this option."; give Amusement_in_Main general; Amusement_in_Main.description(); ]; [ AskableScope bk; switch (scope_stage) { 1: rfalse; 2: objectloop (bk ofclass Askable && bk has objseen) {if (bk ~= Tattler) PlaceInScope(bk); } rtrue; } ]; [ AskForHelpSub; action = ##HelpNPC; second = player; noun.orders(); ]; [ BargainSub obj; if (noun == nothing) { objectloop(obj ofclass NPC) if (Testscope(obj)) <>; } "You make a few swift resolutions with yourself, and feel better about things."; ]; [ BeforeParsing pos lstwrd curwrd; wn = 1; while (wn <= num_words) { !--search for a period curwrd = NextWord(); pos = WordAddress(wn - 1); if (curwrd == THEN1__WD && lstwrd == 'mr') { curwrd = NextWord(); if (curwrd == 'wizard') { 0->pos=' '; !--turn the period into a space } else { rfalse; } } lstwrd=curwrd; } Tokenise__(buffer, parse); ]; [ BeQuietSub ; print "You try to stop making so much noise.^"; rtrue; ]; [ BlackNo ; "~Oh,~ says ", (the)crystal, ", surprised. ~I assumed that was the case. It certainly looks like it.~"; ]; [ BlackYes ; "~Wow,~ says ", (the)crystal, ". ~I hope we find a reason to make some today.~"; ]; [ BlastNo ; "~Oh well,~ sighs ", (the)crystal, ". ~One can always hope.~"; ]; [ BlastYes ; "~I just ", (i) "knew", " this would be an exciting day,~ sighs ", (the)crystal, " happily."; ]; [ BuyFromSub ; if (noun == crystal) <>; print_ret (The) noun, " doesn't appear to be selling anything."; ]; [ CantgoSub; if (location provides cant_go) { location.cant_go(); rtrue; } if (location == thedark) "You can't see!"; <>; ]; [ CashSub i; i = plotkin.current_qty; if (i == 0) "You're skint."; "You have ", i, " plotkins."; ]; [ CheeseVision cheesetype; if (cheesetype.visionnum == 0) { currvision++; cheesetype.visionnum = currvision; initialvision = true; } else { initialvision = false; } globalvision = true; savedloc = real_location; if (location == Tower_Roof) { StopDaemon(Tower_Roof_D); if (Renaldo.item ~= 0) { StopDaemon(Renaldo); Renaldo.RenStop(); } } switch (cheesetype.visionnum) { 1: visionloc = Vechlee_Road_Vision; 2: visionloc = Main_Hall_Vision; 3: visionloc = Laboratory_Vision; 4: visionloc = Bedroom; 5: visionloc = back_room; 6: visionloc = Antechamber_Vision; 7: visionloc = Workshop_Vision; 8: visionloc = Tower_Roof_Vision; 9: visionloc = Garden_Vision; } visionloc.vision = true; PlayerTo(visionloc); MoveFloatingObjects(); rtrue; ]; [ ChooseObjects obj code prio; if (obj == 0) return 0; ! Exclude the plotkin and ball from all if (obj == plotkin or ball) return 0; ! Exclude the hoop from insert/put all if (obj == Hoop && action_to_be == ##Insert) return 0; if (obj == address_label && obj in Wizarding_Weekly) 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 || obj == anchor) return 2; ! force exclusion of obj from all } else { ! code must be 2 prio = 2; ! So if only adjectives were used, return '2' for the object in question. if (obj has adj_chosen) return prio; ! If other words were used as well (or exclusively) let's be stronger. return prio+10; } return 0; ]; [ CommentSub; "You make a few witty and acerbic remarks. No one notices."; ]; [ crystal_dino; print "^~Oooh!~ mutters Crystal as she notices the dinosaur article in the Town Tattler. ~Pterosaurs aren't dinosaurs"; if (ptero.dinowarn == 1) print "...~ she begins, but stops when you glance in her direction. ~Sorry,~ she mumbles, ~but"; else print ", they're flying reptiles."; print " I can't let this go. It's as if they do it on purpose to irritate me. Now where's my address book?~"; tattler.dinoread = true; tattler.add_story(FLYING_REPTILE, 4); StartTimer(flying_reptile_timer, 4); new_line; rfalse; ]; [ DeathMessage; ! This is a regular You have died if (deadflag == 1) rfalse; ! This is a regular You have won if (deadflag == 2) rfalse; ! If we want to print something exotic here, we can do so. else if (deadflag == 3) print "You have failed to defeat Renaldo and his evil now extends into your world as well"; else if (deadflag == 4) print "You have defeated Renaldo and saved the children of your world, but at a terribly high cost"; ]; [ DiagnoseSub; if (snow.snowfall ~= 0) { print "That mesmerising snowfall is still making you feel a bit funny. You feel decidedly unsure of yourself.^"; if (crystal has general) print "^~I know how you feel,~ says ", (the)crystal, ". ~Don't ask me to make any difficult decisions while the snow is falling. It completely impairs my judgement. And it isn't great at the best of times.~^"; rtrue; } if (crystal.out == 0) { print "You're in tip-top shape.^"; if (crystal has general) print "^~I'm a little worse for wear, for my part ,~ says ", (the)crystal, " ruefully, as she sees you checking yourself out, ~but I wasn't too spry to begin with.~^"; } if (crystal.out == 1 or 2) "You are overcome with grief and sadness."; rtrue; ]; [ DisrobeNPCSub; "Let's leave everybody's clothes where they belong for now."; ]; #Ifdef GRAPHICS_ENABLED; [ Drawmain; if (glk_gestalt(gestalt_Graphics, 0)) { ! (using 'if (by_stump has visited)' doesn't seem to work for some reason) ! first, put black rectangle if you're in a dark place with no light source if (location == thedark) { if (gg_mapwin) glk_window_fill_rect(gg_mapwin,$000000,0,0,FindWidth(gg_mapwin),FindHeight(gg_mapwin)); } #Endif; if (gg_mapwin && wizards_way has visited) { glk_window_fill_rect(gg_mapwin,$FFFFFF,0,0,FindWidth(gg_mapwin),FindHeight(gg_mapwin)); ! Now draw a nice single pixel border in black glk_window_fill_rect(gg_mapwin,$000000, BORDER_START, BORDER_START, MAP_WIDTH, BORDER_THICKNESS); glk_window_fill_rect(gg_mapwin,$000000, BORDER_START, BORDER_START, BORDER_THICKNESS, MAP_WIDTH); glk_window_fill_rect(gg_mapwin,$000000, BORDER_WIDTH, BORDER_START, BORDER_THICKNESS, MAP_WIDTH); glk_window_fill_rect(gg_mapwin,$000000, BORDER_START, BORDER_AREA, MAP_WIDTH, BORDER_THICKNESS); } if (location == thedark || globalvision == true) { DrawMap(0); } else { DrawMap(location.map_offset); } } rtrue; ]; Array localmap-->MAP_ELEMENTS; [ Drawmap offset x y i j n; if (gg_mapwin) { glk_window_fill_rect(gg_mapwin,$FFFFFF,0,0,FindWidth(gg_mapwin),FindHeight(gg_mapwin)); if (wizards_way has visited) { ! Now draw a nice single pixel border in black glk_window_fill_rect(gg_mapwin,$000000, BORDER_START, BORDER_START, MAP_WIDTH, BORDER_THICKNESS); glk_window_fill_rect(gg_mapwin,$000000, BORDER_START, BORDER_START, BORDER_THICKNESS, MAP_WIDTH); glk_window_fill_rect(gg_mapwin,$000000, BORDER_WIDTH, BORDER_START, BORDER_THICKNESS, MAP_WIDTH); glk_window_fill_rect(gg_mapwin,$000000, BORDER_START, BORDER_AREA, MAP_WIDTH, BORDER_THICKNESS); if (offset > 665) rfalse; if (location == thedark || offset == 0) { for (y = 0: y < MAP_ELEMENTS: y++) localmap-->y = 0; if (globalvision == true) localmap-->MAP_CENTER = 1; localmap-->MAP_CENTER = 7; } ! A location that provides 'map' overrides anything else UNLESS we're in a globalvision in which case we just want ? ! When MAP_ELEMENTS is 9, these source maps will be 13x13 but we'll be copying to a 9x9. We copy row by row, skipping ! the first two items and shifting to the next row when we've copied MAP_ROW elements. if (location provides map && location ~= thedark && globalvision == false) { for (j = 0, y = 0: j < MAP_ROW_DST: j++, y = y + MAP_ROW_SRC) { for (x = MAP_OFFSET_STRIDE + y, i = (j * MAP_ROW_DST): i < ((j * MAP_ROW_DST) + MAP_ROW_DST): x++, i++) { localmap-->i = location.&map-->x; } } } else if (offset ~= 0) { offset = offset + MAP_OFFSET_ADJ; if (location ofclass OutroomV or RoomV) { for (y = 0: y < MAP_ROW: y++, offset = offset + MAP_DIFF) { n = offset; for (i = y * MAP_ROW: i < (y * MAP_ROW) + MAP_ROW: i++, n++) { localmap-->i = vechleemap-->n; } } } else { for (y = 0: y < MAP_ROW: y++, offset = offset + MAP_DIFF) { n = offset; for (i = y * MAP_ROW: i < (y * MAP_ROW) + MAP_ROW: i++, n++) { localmap-->i = blumphmap-->n; } } } } for (y = MAP_START, i = 0: y < BORDER_WIDTH: y = y + MAP_ICON) for (x = MAP_START: x < BORDER_WIDTH: x = x + MAP_ICON, i++) { n = localmap-->i; if (n ~= 0) { if (n & NODRAW_FLAG ~= NODRAW_FLAG) { ! If this is the middle piece, substitute the proper room shape (filled in) if (i == MAP_CENTER) { switch (n) { 2: n = 1; 11 to 14: n = n - 4; } } glk_image_draw(gg_mapwin, mapnum-->n, x - 1, y - 1); ! Subtract 1 so we overlap a bit to avoid pixel gaps } } } DrawTattler(); } } ]; #Endif; ! end the Glulx-only stuff #Ifdef TARGET_GLULX; [ DrawStatusLine width posa posb; ! If we have no status window, we must not try to redraw it. if (gg_statuswin == 0) return; ! If there is no player location, we shouldn't try to draw status window if (location == nothing || parent(player) == nothing) return; StatusLineHeight(gg_statuswin_size); MoveCursor(1, 1); glk_set_style(style_User1); width = ScreenWidth(); posa = width-26; posb = width-13; spaces width; MoveCursor(1, 2); if (location == thedark) { print (name) location; } else { FindVisibilityLevels(); if (visibility_ceiling == location) print (name) location; else print (The) visibility_ceiling; } if (sys_statusline_flag && width > 53) { MoveCursor(1, posa); print (string) TIME__TX; LanguageTimeOfDay(sline1, sline2); } else { if (width > 66) { #Ifndef NO_SCORE; MoveCursor(1, posa); print (string) SCORE__TX, sline1; #Endif; MoveCursor(1, posb); print (string) MOVES__TX, sline2; } #Ifndef NO_SCORE; if (width > 53 && width <= 66) { MoveCursor(1, posb); print sline1, "/", sline2; } #Endif; } MainWindow(); ! set_window glk_set_style(style_Normal); ]; #Ifdef GRAPHICS_ENABLED; [ DrawTattler; if (gg_mapwin) { if (wizards_way has visited) { if (tattler hasnt moved) { glk_image_draw(gg_mapwin, tattler_blank, BORDER_START, BORDER_AREA + 2); } else { glk_image_draw(gg_mapwin, tattler_images->tattler_image_current, BORDER_START, BORDER_AREA + 2); if (tattler_images->tattler_image_current == dinosaur_city1 && crystal has general && tattler.dinoread == false && crystal.out == 0 && Testscope(tattler) && g_fancy == true && tattler has moved) { crystal.dino = true;; } } } } ]; #Endif; #Endif; [ Endgame; print "^* * *"; new_line; print "You're unsure how much later it is when the sound of an airship engine disturbs you, but the sky has deepened to a dark velvet blue.^ ^~Ahoy there!~ comes a voice from above. You look up to see Ninario being lowered towards you, clinging to a rope ladder.^"; if (crystal.out == 0) { print "^~My dear student!~ he cries, touching down beside you. He waves a piece of paper excitedly. ~I've been following your progress in the Tattler's somewhat... mm-yes... ", (i) "confused", " reports. Marvelous work! I set out the moment I read about the theft at the vault. I would have been here sooner but there was the press to fend off, a misappropriation of wizardly robes form to fill out... and then I had the dickens of a job finding an airship captain. Mm-yes. We would have found this one sooner, but we kept thinking he was an apprentice. No uniform, you see. Mm-yes. No. Had an awful time trying to wake him up. He'd gone a bit overboard at the pub. Then there was a bit of trouble over his licence and then his airship.... mm-yes... was missing. In the end, we had to commandeer one without... mm-yes... permission. There was some nasty business with a nymph, too.~ He shudders and you see the bite marks all over his ear as he shakes his head.^ ^~We were just in time to witness the final battle on the tower roof.~ He lays his hand on your shoulder. ~You did spectacularly. Both of you,~ he adds, smiling down at Crystal. ~I must confess, I never expected to see you at your proper size. It is a pleasure, my dear girl, mm-yes, a genuine pleasure to see you. I want you to know that you have been a superb and... mm-yes... constant companion to me for the last hundred years. I would never have left you in that ball if I'd known you would survive outside of it. Mm-yes. No.~^ ^~I nearly didn't survive,~ admits Crystal, with a glance at you. ~But I've enjoyed our years together too. Of course, now that I'm out, we need to have a serious talk about your living conditions. Yours and this apprentice's. You two need to shape up or I'm going right back into that ball. Do you remember certain promises that were made about an updated wardrobe? Most of us need more than one outfit in life, you know.~^ ^~Mm-yes, of course, my dear,~ agrees Ninario hastily. ~Though you know, funds are somewhat... mm-yes... tight, as always.~^ ^~Really?~ asks Crystal archly. ~Well, when we tell the building society we've solved their theft, recovered the stolen rift analyser "; if (YFenni has moved) print (i) "and", " can return a valuable piece of cheese that's now missing from their vault"; else print "and can offer them several valuable pieces of cheese for their vault"; print ", I'm sure they'll manage to scrape up that reward they mentioned."; if (Cheese_Shop has visited) { print " Oh, and speaking of cheese, you owe Eliza Stilton 100 plotkins for cheese.~^ ^~Eh?~ says Ninario in surprise. ~But I always keep the cheese accounts up to date!~ He frowns as you "; if (Testscope(invoice)) print "hand him"; else print "explain about"; print " the invoice. "; } else print "~^^"; print "~Hmmm, I see. Well, perhaps we can sort something out. We could pop into the caer to discuss it.~ He glances at the tower, noticing its ruined state for the first time. ~Mm-yes, well, perhaps not.~ He sighs. ~I'd wave my wand at it, but that final cataclysm seems to have done something to magic in this world. If it's permanent, perhaps it's time for science to lead the way for us... thanks to you and Crystal.~^ ^~Oh,~ he says suddenly as he remembers something. ~Speaking, as we were earlier, of wardrobes and airship captains, there is a rather irate Captain Kells demanding to see you, my dear student. Something about his uniform and a pair of boots. Mm-yes. I've smoothed things over for now. He's going to pop off back to Vechlee now and then he wants to see you later at his house to discuss it over a nice bit of cheese. He says he's got some lovely Montagnolo at home. Mm-yes.~"; } else { print "^He touches down beside you. Uncharacteristically, he lays a hand on your shoulder. ~I'm so very sorry, my dear student. More sorry than I can possibly tell you. But you did spectacularly, both of you.~^ ^~Why, Ninario? Why did Crystal have to die?~ you ask.^ ^~From what I saw up in the airship, she ", (i) "chose", " this passing,~ says Ninario gently. ~No, she didn't ", (i) "have", " to. But could either of you have lived with yourselves if you'd taken the coward's way out and left Renaldo to do as he pleased? She chose to sacrifice herself for a greater purpose and that is the most noble of reasons. She knew what would happen and she told you what you needed to do. It was the only way you could have stopped Renaldo. The hoop, the satchel, neither of those would have worked to close the rift. It had gotten too big. It was the snow globe or nothing. A few moments longer and Renaldo would have had complete control over the rift. Now, come along with me, and we'll get everything sorted out, including making arrangements for Crystal. Perhaps we could make this garden her resting place, if you think she would have liked that.~^ ^Showing surprising strength, he takes Crystal from your arms and carries both of you, one physically and one emotionally, into the remains of the tower.^"; } new_line; ]; [ Endvision loc; loc.dtime = 0; loc.vision = false; globalvision = false; print "^Suddenly, abruptly, the vision fades, and you are back where you started.^"; PlayerTo(savedloc); MoveFloatingObjects(); print "^The machine shudders to a halt and goes dim as you stop turning the crank.^"; if (savedloc == Tower_Roof) { StartDaemon(Tower_Roof_D); } rtrue; ]; #Ifdef GRAPHICS_ENABLED; [ FancySub; if (g_fancy == false) { g_fancy = true; ! MAP_WINDOW is slighly less than the height of the graphics window in pixels if (gg_mainwin) { glk_window_get_size(gg_mainwin, gg_arguments, gg_arguments+WORDSIZE); ! Next, set up the right hand graphics window, MAP_WINDOW pixels wide if it doesn't ! already exist: if (glk_gestalt(gestalt_Graphics, 0)) { if (gg_mapwin == 0) { gg_mapwin = glk_window_open(gg_mainwin,(winmethod_Right+winmethod_fixed), MAP_WINDOW, wintype_Graphics, GG_MAPWIN_ROCK); if (gg_mapwin ~= 0) glk_request_mouse_event(gg_mapwin); } } } } if (keep_silent == false) "Graphics mode enabled."; ]; [ FindHeight window result graph_height; if (window) { result = glk_window_get_size(window, gg_arguments, gg_arguments+WORDSIZE); graph_height = gg_arguments-->1; } return graph_height; ]; [ FindWidth window result graph_width; if (window) { result = glk_window_get_size(window, gg_arguments, gg_arguments+WORDSIZE); graph_width = gg_arguments-->0; } return graph_width; ]; #Endif; [ FindSub ; if (noun == player) "Why, here you are, right here!"; if (TestScope(noun)) "But ", (the) noun, " ", (isorare)noun, " right here!"; "You'll have to look around and find that yourself."; ]; [ FlySub; "You'll have to find something on which to fly."; ]; [ GetUnderSub; if (noun == player) "That would be very dextrous indeed."; if (noun has animate) print_ret (The) noun, " might not enjoy that the same way you obviously would."; if (noun has clothing) <>; "Cowering under ", (the) noun, " will only damage your self-esteem."; ]; [ Giggles person; print " "; switch (random(7)) { 1: print "giggles"; 2: print "chuckles"; 3: print "laughs"; 4: print "snickers"; 5: print "chortles"; 6: print "sniggers"; 7: print "titters"; } print " ", (the) person; ]; #Ifdef GRAPHICS_ENABLED; [ HelpNPCSub ks; #Ifnot; [ HelpNPCSub; #Endif; if (noun == player) { #Ifdef GRAPHICS_ENABLED; ks = keep_silent; keep_silent = true; ; #Endif; ; #Ifdef GRAPHICS_ENABLED; ; keep_silent = ks; #Endif; rtrue; } "If only you knew how."; ]; ![ hex x y; ! y = (x & $7f00) / $100; ! if (x<0) y = y + $80; ! x = x & $ff; ! print (hexdigit) y/$10, (hexdigit) y, ! (hexdigit) x/$10, (hexdigit) x; !]; ![ hexdigit x; ! x = x % $10; ! switch (x) { ! 0 to 9: print x; ! 10: print "a"; 11: print "b"; 12: print "c"; ! 13: print "d"; 14: print "e"; 15: print "f"; ! } !]; [ HintSub; turns = turns - 1; ; print_ret (i) "^[You can also ask individual NPCs for help or hints if you're having trouble via ~npcname, help~ or ~ask npcname for help~]"; ]; [ HitKey; print (i) "^[Press any key to continue]"; KeyCharPrimitive(); ]; [ HurryUpSub; "You're already working as fast as you can!"; ]; [ HurtNo; "~Well that's good!~ says ", (the)crystal, ". ~I can't exactly cart myself around if you're unable to continue.~"; ]; [ HurtYes; "~Oh no!~ says ", (the)crystal, ". ~Well I hope you can soldier on.~"; ]; [ i text; #Ifdef TARGET_GLULX; glk_set_style(style_Emphasized); print (string) text; glk_set_style(style_Normal); #Ifnot; style underline; print (string) text; style roman; #Endif; ]; ! This function assumes we are already in reverse, prints something italicized and then returns us to reverse. [ irev text; #Ifdef TARGET_GLULX; glk_set_style(style_User2); print (string) text; glk_set_style(style_User1); #Ifnot; style underline; print (string) text; style roman; style reverse; #Endif; ]; ![ ignore i; return; ]; #Ifdef GRAPHICS_ENABLED; [ HandleGlkEvent ev context abortres x y; context = 0; if (ev && abortres) { switch (ev-->0) { evtype_MouseInput: if (gg_mainwin && gg_mapwin) { ! ev-->2 is x-coordinate of clicked item x = ev-->2; y = ev-->3; ! If y >= BORDER_AREA, then we are in the "image" part of mapwin. Also, we only allow clicks if we've moved the Tattler. if (y >= BORDER_AREA && tattler has moved) { if (y < (BORDER_AREA + HEADLINE_AREA)) { ! We are within the title area of the image if (x > (MAP_WINDOW / 2)) { ! We are in the right half so go to the next article do { tattler_image_current++; if (tattler_image_current > tattler_images->0) tattler_image_current = 1; } until (tattler_images->tattler_image_current == 45 or 46 or 51 or 53 or 56 or 61 or 63 or 67 or 70 or 73 or 74 or 77 or 81 or 83 or 86 or 89 or 90); } else { ! We are in the left half so go to the previous article. We do this twice because we want to move to the start of the current article ! and then to the prior one. BUT we don't want to do it twice if we're currently on a starting page. if (tattler_images->tattler_image_current ~= 90 or 89 or 86 or 83 or 81 or 77 or 74 or 73 or 70 or 67 or 63 or 61 or 56 or 53 or 51 or 46 or 45) { do { tattler_image_current--; if (tattler_image_current == 0) tattler_image_current = tattler_images->0; } until (tattler_images->tattler_image_current == 90 or 89 or 86 or 83 or 81 or 77 or 74 or 73 or 70 or 67 or 63 or 61 or 56 or 53 or 51 or 46 or 45); } do { tattler_image_current--; if (tattler_image_current == 0) tattler_image_current = tattler_images->0; } until (tattler_images->tattler_image_current == 90 or 89 or 86 or 83 or 81 or 77 or 74 or 73 or 70 or 67 or 63 or 61 or 56 or 53 or 51 or 46 or 45); } } else if (x > (MAP_WINDOW /2)) { ! We are in the right half so go to the next page. tattler_image_current++; if (tattler_image_current > tattler_images->0) tattler_image_current = 1; } else { ! We are in the left half so go to the previous page. tattler_image_current--; if (tattler_image_current == 0) tattler_image_current = tattler_images->0; } DrawTattler(); glk_request_mouse_event(gg_mapwin); return 0; } ! Need this in case we get here and decide to ignore the mouse. We still want another one. glk_request_mouse_event(gg_mapwin); return 0; } evtype_Redraw, evtype_Arrange: if (location == thedark) DrawMap(0); else DrawMap(location.map_offset); ! evtype_Timer: ! if (context==1 && gg_mainwin) ! glk_cancel_char_event(gg_mainwin); ! else if (gg_mainwin) ! glk_cancel_line_event(gg_mainwin, 0); ! abortres-->0 = 0; ! return 2; } } ]; #Endif; ! === ! This zeroes the graphics window and sound channel ! (combining the sound and graphics init routines from the Gull guide): #Ifdef TARGET_GLULX; #Ifdef GRAPHICS_ENABLED; [ IdentifyGlkObject phase type ref rock id; #Ifnot; [ IdentifyGlkObject phase id; #Endif; if (phase==0) { #Ifdef GRAPHICS_ENABLED; gg_mapwin=0; #Endif; gg_schan=0; return; } #Ifdef GRAPHICS_ENABLED; if (phase==1) { switch (type) { 0: switch (rock) { GG_MAPWIN_ROCK: gg_mapwin = ref; } 1: 2: } return; } #Endif; if (phase==2) { #Ifdef GRAPHICS_ENABLED; if (location == thedark) DrawMap(darkmap); else DrawMap(location.&map); #Endif; id=glk_schannel_iterate(0,gg_arguments); while(id) { switch (gg_arguments-->0) { GG_SOUNDCHAN_ROCK:gg_schan=id; } id=glk_schannel_iterate(id,gg_arguments); } SoundStop(); } ]; #Endif; ! now back to the standard Inform stuff: #Ifdef TARGET_GLULX; [ InitGlkWindow winrock; switch (winrock) { GG_MAINWIN_ROCK: glk_stylehint_set(wintype_TextBuffer, style_Emphasized, stylehint_Oblique, 1); glk_stylehint_set(wintype_TextBuffer, style_Emphasized, stylehint_Proportional, 1); glk_stylehint_set(wintype_TextBuffer, style_Emphasized, stylehint_Weight, 0); glk_stylehint_set(wintype_TextBuffer, style_User1, stylehint_ReverseColor, 1); glk_stylehint_set(wintype_TextBuffer, style_User1, stylehint_Proportional, 0); glk_stylehint_set(wintype_TextBuffer, style_User1, stylehint_Weight, 0); glk_stylehint_set(wintype_TextBuffer, style_User2, stylehint_ReverseColor, 1); glk_stylehint_set(wintype_TextBuffer, style_User2, stylehint_Proportional, 0); glk_stylehint_set(wintype_TextBuffer, style_User2, stylehint_Weight, 0); glk_stylehint_set(wintype_TextBuffer, style_User2, stylehint_Oblique, 1); GG_STATUSWIN_ROCK: glk_stylehint_set(wintype_TextGrid, style_User1, stylehint_ReverseColor, 1); glk_stylehint_set(wintype_TextGrid, style_User1, stylehint_Proportional, 0); glk_stylehint_set(wintype_TextGrid, style_User1, stylehint_Weight, 0); } rfalse; ! leaving out this line will lead to a messy crash! ]; #Endif; [ Initialise ks; #Ifdef TARGET_GLULX; #Ifdef GRAPHICS_ENABLED; ! Get rid of the windows for redraw and game start. ks = keep_silent; keep_silent = true; ; keep_silent = ks; #Endif; #Ifdef SOUND_ENABLED; soundsupport = glk_gestalt(gestalt_Sound, 0); volsupport = glk_gestalt(gestalt_SoundVolume, 0); ! Deal with the case where this is reached via restart. Sound channel may already be created. if (soundsupport) if (gg_schan == 0) gg_schan = glk_schannel_create(GG_SOUNDCHAN_ROCK); #Endif; #Endif; random(0); player = myselfobj; notify_mode = true; location = wizards_way; move plotkin to player; plotkin.current_qty = 2; move slippers to player; give slippers worn; move magic_clothes to player; give magic_clothes worn; move claim_ticket to player; tattler_stories->0 = 1; tattler_stories->1 = AIRSHIP_DOCKING; tattler_images->0 = 1; tattler_images->1 = airship1; move ball to player; lookmode = 2; !! Like the VERBOSE command print "~One year!~ snarls Renaldo angrily. ~One year living in hiding, scared of our own shadows. Time is running out... I need fresh supplies! Blast Ninario!~^^ ~And the meddlesome apprentice,~ pipes up Yekcal. ~Don't forget Ninario's apprentice.~ He pauses. ~You know, sir, that apprentice must come from a world of very powerful magic. Recall the explosion at the guild hall... if the apprentice could be nabbed, who knows what we might accomplish?~^^ Renaldo pauses, his frown lightening. ~Yes, the apprentice. We ", (i) "could", " try a kidnapping. Or, perhaps, if we can find the world the apprentice comes from, we can aim a little higher.~ He smiles cruelly. ~Perhaps that world could supply the necessary... ", (i) "volunteers", " for my little problem.~^^ He chuckles. ~Yekcal, how much do you know about interplanar rifts?~^^~Er, opening or closing them, sir?~^ ^Renaldo smiles evilly. ~Oh, ", (i) "expanding", ", I think, don't you?~^"; HitKey(); print "^* * *"; new_line; new_line; MainWindow(); ClearScreen(WIN_MAIN); #Ifdef GRAPHICS_ENABLED; ! Draw the initial picture here. glk_image_draw(gg_mainwin, cover_small, imagealign_InlineCenter, 0); #Endif; Banner(); HitKey(); ClearScreen(WIN_MAIN); #Ifdef GRAPHICS_ENABLED; ks = keep_silent; keep_silent = true; ; keep_silent = ks; #Endif; print "~Quiet!~ mutters Ninario, his beady eyes settling on you. ~Too quiet! We hear nothing of Renaldo for months, and then last night, that massive spellcasting disturbance... mm-yes.~ He purses his lips together. ~Renaldo may be up to something, and we must find out what. Mm-yes, indeed. This is where you come in, my dear student.^^ ~Go to the Plumbers Union Building Society in Vechlee, and get my interplanar rift analyser out of the safety deposit box. Then bring the analyser back here to Blumph. Shouldn't be too difficult.~^^ A frown crosses his face. ~Now where did I leave the key?~ He pats himself all over. ~Hmmm, I must have sent it to the cleaners with my other robes.~ He hands you a laundry claim ticket. ~I suppose you'll have to start by picking them up.~^^ Ninario smiles suddenly through his grubby white beard. ~And you can take this to assist you.~ He thrusts a cheap glass snow globe into your arms as he ushers you out the door. ~Have fun, both of you!~^^ After this last cryptic statement, the door slams shut behind you, leaving you, as usual, with a handful of items and a head full of questions.^"; #Ifdef GRAPHICS_ENABLED; glk_set_style(style_Note); if (gg_mapwin == 0) { print "^[Please note, your interpreter window is too narrow to support the graphics window]^^"; } else { print "^[Graphics can be disabled and enabled with ~graphics off~ and ~graphics on~. ~Plain~ and ~fancy~ also work. Note that the graphical Town Tattler is not clickable if playing in a browser.]^^"; #Ifdef SOUND_ENABLED; print "[Sounds can be disabled and enabled with ~sound off~ and ~sound on~. ~Quiet~ and ~noisy~ also work. Note that sounds do not play if playing in a browser.]^^"; #Endif; } glk_set_style(style_Normal); #Ifnot; #Ifdef SOUND_ENABLED; print "^[Sounds can be disabled and enabled with ~sound off~ and ~sound on~. ~Quiet~ and ~noisy~ also work. Note that sounds do not play if playing in a browser.]^^"; #Ifnot; new_line; #Endif; #Endif; tattler.add_story(WIZARD_SPLIT, 4); StartTimer(wizard_split_timer, 4); print (string)LICENSE; return 2; ]; [ Inscope obj; ! Get rid of a compiler warning obj = 0; if (real_location == Laboratory or Laboratory_Vision && S_Windows has general) { PlaceInScope(Caerwall_Obj); PlaceInScope(Courtyard); PlaceInScope(Dirt_Obj); PlaceInScope(Shed_Door); PlaceInScope(Stone_Path); } if (real_location == Bailey) { PlaceInScope(Courtyard); PlaceInScope(Caerwall_Obj); PlaceInScope(Dirt_Obj); if (Hoop in W_Courtyard && Portcullis hasnt open) PlaceInScope(Hoop); } if (real_location == Top_Tree) { PlaceInScope(Courtyard); PlaceInScope(Caerwall_Obj); PlaceInScope(Dirt_Obj); } if (real_location == Midair) { PlaceInScope(Courtyard); PlaceInScope(Caerwall_Obj); PlaceInScope(Dirt_Obj); } if ((real_location == Bedroom && W_Bed_Window.look_out == true) || real_location == Tower_Roof or Tower_Roof_Vision) { PlaceInScope(Courtyard); PlaceInScope(Caerwall_Obj); PlaceInScope(Dirt_Obj); PlaceInScope(Caer_Door); PlaceInScope(Fountain); PlaceInScope(Figurines); } if (location == W_Courtyard or Garden) { PlaceInScope(Shed_Door); } rfalse; ]; [ ItemAsksub; if (noun == captain && captain.out == true) "He's in no condition to be answer questions."; if (noun == crystal && crystal hasnt general) <>; if (noun == crystal && real_location == drain1 && second ~= drainpipe) "~Let's discuss it when we aren't clinging desperately to a drainpipe, shall we?~ asks ", (the)crystal, " anxiously. ~Concentrate on hanging on instead!~"; if (second ofclass Askable) { if (second.information(noun) == true) rtrue; } ! second is a game item, but doesn't have an information routine switch (noun) { crystal: "~I'm not sure we need to worry too much about ", (the) second, (admits)crystal, (string)period; people: switch (random(4)) { 1: print "~I wouldn't worry about that, young 'un,~ mutters"; 2: print "~I don't know anything about that,~ confesses"; 3: print "~You probably don't need to worry too much about that,~ advises"; 4: print "~Probably not worth worrying about,~ mutters"; } randcrowd(); rtrue; crone: "~I don't think I want to tell you anything about ", (itorthem)second, (murmurs)crone, (string)period; teller: "~Oh, I wouldn't know too much about ", (itorthem)second, ", captain", (admits)teller, (string)period; betty: "~I'm not sure I can tell you anything too useful about ", (itorthem)second, (admits)betty, (string)period; akbar: "~I doubt I can tell you anything about ", (itorthem)second, " that you don't already know", (admits)akbar, (string)period; hermit: "~What's the point of telling you?~ murmurs ", (the)hermit, ". ~I'm not even sure what you're talking about.~"; ptero: return ptero.nomatch(); walrus: return walrus.nomatch(); captain: "~I don't know anything about ", (itorthem)second, (murmurs)captain, ", ~and I'm proud of it.~"; guard: "~Ah dean't knaw nowt aboot 'at,~ declares ", (the)guard, " stoutly."; workers: "None of the works seem particularly interested in talking to you. Nor do they even seem to care that you're there."; renaldo: "~Stop pestering me with these foolish questions!~ bellows ", (the)renaldo, " angrily."; yekcal: "Yekcal doesn't seem too interested in answering your questions."; } ]; [ 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."; ]; [ JumpNo ; "~Hmmm,~ murmurs ", (the)crystal, ". ~It didn't look like it would.~"; ]; [ JumpYes ; "~Hmmm,~ murmurs ", (the)crystal, ". ~I'm not certain it does.~"; ]; [ KnockSub ; if (noun ofclass Autodoor || noun == Caer_Door or Trapdoor or Shed_Door) #Ifdef SOUND_ENABLED; PlaySound(knock, 1); #Endif; if (guard in location && (second == nothing or Caer_Door)) "You knock loudly on ", (the)Caer_Door, ".^ ^~Oh, aye,~ nods ", (the)guard, ". ~Ah'll be reet dahn t'let tha in!~ He rolls his eyes at you."; print "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 or RoomV) "It might be an effective way of cleaning the room, but from what you've heard, that new ", (i) "Lingual Cleaners International", " has the competition licked."; if (noun ofclass CompassDirection or NPC) "That's a rather odd thing to try doing."; print "You wouldn't lick ", (the) noun, " if "; if (noun has pluralname) "they were coated in icing sugar!"; else "it was glazed in honey!"; ]; [ LiftSub; if (noun == player) "You're feeling rather high-spirited already."; "Lifting that would serve no real purpose."; ]; [ LockSub ; if (second == nothing && noun hasnt locked) { if (TestScope(noun.with_key)) { if (noun.with_key notin player) { print "(first taking ", (the) noun.with_key, ")^"; ; } ! If key wasn't successfully taken, we'll have to rfalse. if (noun.with_key notin player) rfalse; second = noun.with_key; } else "You don't have a key that fits the lock of ", (the) noun, (string) period; } if (ObjectIsUntouchable(noun)) return; if (noun hasnt lockable) return L__M(##Lock, 1, noun); if (noun has locked) return L__M(##Lock, 2 ,noun); if (noun has open && ImplicitClose(noun)) return L__M(##Lock, 3, noun); if (noun.with_key ~= second) return L__M(##Lock, 4, second); give noun locked; if (AfterRoutines() || keep_silent) return; ! 2017-12-15mjc: add second here so we can report what we unlocked it with L__M(##Lock, 5, noun, second); ]; [ LookBehindSub; if (noun == player) "No, nobody following you. Phew."; <>; ]; [ LookRoutine obj; objectloop(obj ofclass Askable && Testscope(obj)) { if (obj == Flask_Vision) give Flask objseen; if (obj == Silk_Purse_Vision) give Silk_Purse objseen; if (obj == Leather_Pouch_Vision) give Leather_Pouch objseen; if (obj == KNO3_Vision) give KNO3 objseen; if (obj == Cannon_Vision) give Cannon objseen; if (obj == Ball_Mill_Vision) give Ball_Mill objseen; if (obj == Workshop_Door_Vision) give Workshop_Door objseen; if (obj == Lab_Door_Vision) give Lab_Door objseen; else give obj objseen; } ]; [ LookUnderSub; if (noun == player) "Amazingly, you see a pair of legs. Wait, you've seen them before... they're yours."; if (noun has animate) print_ret (ItorTheyAre)noun, " not concealing anything, as far as you can tell."; switch (random(5)) { 1: "You find no vast store of hidden wealth in convenient 100-plotkin pieces, no dismembered corpse and no ages-old undiscovered secret. Sigh."; 2: "No green glowing portal. Sigh."; 3: "You find no secret tunnel, hidden trapdoor or other form of concealed passage. Sigh."; 4: print "Argh! What is it with people hiding things behind or under other things? No, wait a minute"; 5: print "Could it be? Could it be? No, apparently not"; } ". There's nothing there."; ]; [ MeetNPCSub ; if (noun == nothing) { if (Testscope(crone)) <>; if (Testscope(hermit)) <>; if (Testscope(akbar)) <>; if (Testscope(betty)) <>; if (Testscope(captain)) <>; if (Testscope(people)) <>; if (Testscope(guard)) <>; if (Testscope(teller)) <>; if (Testscope(crystal)) <>; } if (noun == player) "Yes, you've met before, haven't you?"; "Complete silence answers your cheery greeting."; ]; [ MixSub; "You get a sudden inkling that doing that is not the way to proceed."; ]; [ Murmurs person; print ",~ "; switch (random(7)) { 1: print "murmurs"; 2: print "sighs"; 3: print "says"; 4: print "declares"; 5: print "mutters"; 6: print "affirms"; 7: print "states"; } print " ", (the) person; ]; #Ifdef GRAPHICS_ENABLED; [ PlainSub; if (g_fancy) { g_fancy = false; if (gg_mapwin) { glk_window_close(gg_mapwin, 0); gg_mapwin = 0; } } if (keep_silent == false) "Graphics mode disabled."; ]; #Ifdef SOUND_ENABLED; [ PlaySound num times volume; current_sound = num; if (play_sounds == false || soundsupport == false) rtrue; if (times == 0) times = 1; volume = sound_vol; if (volume == 0) volume = 1; volume = volume + (times * 256); #Ifdef TARGET_ZCODE; @sound_effect num 2 volume; #Ifnot; if (gg_schan) { glk_schannel_set_volume(gg_schan, volume * 8192); glk_schannel_play_ext(gg_schan, num, times, 0); } #Endif; rtrue; ]; #Endif; [ PlaySub; if (noun == nothing or player) "You play around for a few moments."; if (noun has animate) "You're not sure ", (the)noun, " would welcome you playing with ", (ItOrThem)noun, " at the moment."; "You're not sure how to do that."; ]; [ PrintRank; print ", meaning "; if (score == 100) "the apprentice has become the master."; if (score >= 90) "you finished your apprenticeship with honours, but aren't quite a master."; if (score >= 80) "you finished your apprenticeship, but didn't complete your senior project."; if (score >= 70) "you met the apprenticeship criteria, but lacked a certain ", (i) "je ne sais quoi", "."; if (score >= 60) "you completed all your work but didn't even know about the senior project."; if (score >= 50) "your course-work was fine, but your field work needs improvement."; if (score >= 40) "your course-work was incomplete, and your field work needs improvement."; if (score >= 30) "your course-work was exceedingly poor, and your field work abysmal."; if (score >= 20) "you failed to show up for class, and didn't complete the field assignments."; if (score >= 10) "you will be forced to repeat the year."; if (score >= 5) "you forgot to register for classes this year."; "failed the admission criteria."; ]; [ PrintTaskName task_number; switch (task_number) { 0: "shaking the snow globe"; 1: "meeting ", (the)crystal; 2: "handing in the claim ticket at the laundry"; 3: "removing the saddle from the pterosaur"; 4: "selling the saddle"; 5: "buying the spenseweed extract"; 6: "healing the pterosaur"; 7: "letting the pterosaur get airborne"; 8: "buying ", (the)tyro; 9: "using ", (the)tyro, " for the first time"; 10: "watching the first vision"; 11: "watching the second vision"; 12: "buying the hoop"; 13: "using the hoop the first time"; 14: "buying the white nobbler"; 15: "putting the white nobbler in the drink"; 16: "getting the airship captain out of the way"; 17: "putting on the airship captain's uniform"; 18: "watching the third vision"; 19: "buying ", (the)autoclimber; 20: "getting into the manor grounds"; 21: "taking the airship captain's licence"; 22: "taking the ornate golden key"; 23: "taking the cheese from the manor house"; 24: "watching the fourth vision"; 25: "buying ", (the)broomstick, " or getting ", (the)Red_Carpet, " repaired"; 26: "reaching the first floor of the wooden house"; 27: "reaching the roof of the brick house"; 28: "freeing the anchor"; 29: "getting into the airship"; 30: "getting the airship airborne"; 31: "reaching Vechlee"; 32: "taking the cheese from the old scrying bowl"; 33: "watching the fifth vision"; 34: "taking the cheese from Sorcery Supply"; 35: "watching the sixth vision"; 36: "reaching the Plumbers Union Building Society"; 37: "reaching the antechamber"; 38: "putting the hoop in the purple safety deposit box"; 39: "reaching the vault"; 40: "picking up the cheese in the vault"; 41: "watching the seventh vision"; 42: "visiting the cheese shop"; 43: "watching the eighth vision"; 44: "getting the guard down from the wall"; 45: "picking up the lump of lead"; 46: "getting into the courtyard"; 47: "raising the portcullis"; 48: "putting the label on the vat of WizStrip"; 49: "hanging the WizStrip delivery sign on the pipe"; 50: "getting the WizStrip delivered to the caer"; 51: "getting the walrus out of the way"; 52: "reaching the main hall"; 53: "picking up the cheese in the kitchen"; 54: "watching the ninth vision"; 55: "making black powder"; 56: "putting the purse or pouch filled with black powder into the cannon"; 57: "firing Yekcal out of the cannon"; 58: "closing the rift"; 59: "healing Crystal"; } ]; [ PrintTattler story_num; print "^"; font off; style reverse; glk_set_style(style_User1); switch(story_num) { AIRSHIP_DOCKING: print " ^", " *** DISASTROUS AIRSHIP DOCKING *** ^", " ^", " Blumph was rocked yesterday when Captain Kells, while docking his airship, ^", " completely failed to anchor it properly, inflicting severe damage in the area ^", " of Oak Street, and resulting in an ugly anchor cable disturbing the beautiful ^", " sightlines of our city. Captain Kells, already busy at the local pub, was ^", " unavailable for comment, but the Blumph Airship Authority is investigating. ^", " ^", " Ninario the wizard has denied all involvement. ^", " ^"; WIZARD_SPLIT: print " ^", " *** WIZARD SPLITS WITH APPRENTICE *** ^", " ^", " In a move likely to rock the small insular world of wizard's apprentices, ^", " Ninario the wizard was seen kicking his apprentice out of his home early this ^", " morning with only a strawberry-coloured satchel and small glass bowling ball ^", " for company. ^", " ^", " The young apprentice could not be reached for comment, though might, we ^", " imagine, have said that ~this is only a temporary set-back and Ninario and I ^", " hope to be over this rocky patch soon.~ ^", " ^", " The apprentice is, of course, the same one famously involved in defeating the ^", " Wizards Guild last year. ^", " ^", " Area resident Ninario the wizard has, somewhat confusingly, denied any and all ^", " involvement. When informed that the story was explicitly about him and his ^", " apprentice, Ninario denied having an apprentice. When pressed further, Ninario ^", " denied knowing any apprentices, denied there was an apprenticeship program at ^", " Oxbridge, denied that he was a wizard and informed the Town Tattler that he ^", " would be suing them for libel, if that paper existed, a fact he also denied. ^", " He was also keen to deny the existence of a strawberry satchel, pointing out ^", " that it was in fact a raspberry satchel, for which mistake we apologise. ^", " ^", " Ninario the wizard has since denied all these denials. ^", " ^"; DINOSAUR_CITY: print " ^", " *** DINOSAUR SPOTTED OVER CITY *** ^", " ^", " Blumph residents were amazed moments ago at the sight of a relic of ages past, ^", " a dinosaur, flying over our proud city. The dinosaur, sporting a massive ^", " wingspan, circled briefly over central Blumph and then flew away towards the ^", " heights of the Vechlee mountains. ^", " ^", " It is unknown at this time what the massive dinosaur wanted, nor how it came ^", " to be in the area. Earlier reports of the dinosaur hanging around Blumph ^", " Heights Park were believed to be a hoax. Upon hearing later reports of flying ^", " reptiles in the area, this paper sent out a reporter, at which point the ^", " dinosaur was spotted flying over the city. No flying reptiles were ever seen, ^", " just the dinosaur. ^", " ^", " Ninario the wizard has denied being involved in a paternity suit with the ^", " dinosaur. ^", " ^"; #Ifdef TARGET_GLULX; glk_set_style(style_Normal); #Endif; style roman; font on; if (crystal has general && tattler.dinoread == false && crystal.out == 0) { new_line; crystal_dino(); } rtrue; FLYING_REPTILE: print " ^", " *** FLYING DINOSAUR REALLY FLYING REPTILE *** ^", " ^", " This paper is reliably informed, via an anonymous and rather vitriolic crystal ^", " ball missive, that the creature spotted over our city a few moments ago was in ^", " fact a ~phobetor parvus~ and is considered a flying reptile, not a dinosaur. ^", " ^", " While we ourselves do not worry about the distinction, we have no wish to have ^", " any of the things done to us that the writer of the missive suggested, so we ^", " are printing this correction. ^", " ^", " We would also like to add that the editor of the newspaper is a very dedicated ^", " family woman and has certainly never engaged in any of the practices suggested ^", " by the writer of the missive. ^", " ^", " Ninario the wizard has denied sending the missive, despite it coming from a ^", " crystal ball registered to his name. ^", " ^"; #Ifdef TARGET_GLULX; glk_set_style(style_Normal); #Endif; style roman; font on; if (crystal has general && crystal.out == 0) { new_line; print_ret (The)crystal, " smirks to herself as you read the article."; } rtrue; DRUNKEN_APPRENTICE: print " ^", " *** DRUNKEN APPRENTICE FOUND SLEEPING BEHIND PUB *** ^", " ^", " In news likely to send shockwaves through the small insular world of wizard's ^", " apprentices, a drunken apprentice was found sleeping in the terrace behind ^", " Blumph's dockside pub presumably after a furious round of drinking. Discarded ^", " beer barrels around the apprentice bore mute evidence to the ferocity of the ^", " drinking binge. ^", " ^", " ~This is disgusting,~ said one area resident. ~If most of these apprentices ^", " are students at the university, don't they have their own places for getting ^", " rip-roaring drunk?~ ^", " ^", " Further investigation has revealed that the robes the apprentice was wearing ^", " match those of Ninario the wizard's apprentice, the same apprentice Ninario ^", " was seen kicking out of his house this morning. The apprentice has noticeably ^", " aged since that incident early this morning. We despair at the sudden and sad ^", " decline of this misguided youth, but the speed with which the apprentice has ^", " chosen to compound homelessness with alcoholism is alarming. The apprentice ^", " is, of course, the same one famously involved in defeating the Wizards Guild ^", " last year. ^", " ^", " The young apprentice could not be reached for comment (being unconscious ^", " behind a pub), though might, we imagine, have told us to ~shove off~ and ~mind ^", " your own business.~ ^", " ^", " Area resident Ninario the wizard has denied involvement and disclaimed any ^", " responsibility for the fate of his apprentice. He has even gone so far as to ^", " deny any rift with his apprentice. ~It's all nonsense,~ he protested to this ^", " reporter. ~My apprentice left on a quest this morning with another of my dear ^", " companions, so I suggest we best leave them to it.~ ^", " ^", " We at the Town Tattler aren't certain what to make of Ninario's claims, though ^", " we will point out that when rumour tells us that the apprentice's quest ^", " involves retrieving a ~rift~ analyzer, our suspicions increase. ^", " ^"; BRAZEN_THEFT: print " ^", " *** BRAZEN THEFT AT PLUMBERS UNION BUILDING SOCIETY *** ^", " ^", " Questions are being posed today (mostly by this paper) about security at one ^", " of our newest but most respected institutions after a brazen daylight robbery ^", " at the Plumbers Union Building Society in Vechlee. ^", " ^", " This kind of rampant criminalism is hardly new to Vechlee, former home of the ^", " former Wizards Guild, but this paper had hoped that a corner had been turned ^", " on Vechlee's notorious lawlessness. ^", " ^", " According to an eyewitness employee of the building society, the incident ^", " occurred when a withdrawal was made from Ninario the wizard's safety deposit ^", " box today. ~I don't understand it,~ said the eyewitness. ~All his credentials ^", " checked out, right down to the bunny robes. But something about the whole ^", " transaction just seemed a bit off, so after he and his apprentice left, I got ^", " out the crystal ball and contacted the Tattler. Not that they behaved oddly or ^", " anything, the whole transaction was perfectly normal. Nothing to arouse ^", " suspicion at all... except that I had just moments before read in the Tattler ^", " that Ninario's apprentice had fallen out with him and was lying drunk behind a ^", " pub. That's what made me suspicious. I knew the Tattler couldn't be wrong ^", " about that, so I knew it couldn't be Ninario and his apprentice.~ ^", " ^", " A substantial reward has been offered for information leading to the capture ^", " of the culprits, as well as the return of any stolen items. ^", " ^", " At press time, the only stolen item the building society could confirm was a ^", " magical device of some kind. They were eager to note that a piece of rare ^", " Y-Fenni cheese had been at risk of theft, but was now safely back in the ^", " vault. ~Ninario will be glad to hear he can retrieve his cheese any time.~ ^", " ^", " Noted Plumbers Union Building Society member Ninario the wizard has denied ^", " owning a safety deposit box. ^", " ^"; HADDOCK_RAIN: print " ^", " *** RAIN OF HADDOCK OVER BLUMPH *** ^", " ^", " Multiple eyewitnesses are reporting a strange occurrence today when a rain of ^", " haddock fell over a large portion of Blumph. Some are calling this evidence of ^", " the Wizards Guild's continuing underground campaign, though others are less ^", " shocked and more resigned. ~I've seen it all before,~ said one resident who ^", " refused to be named. ~The fishy invasion begins now, with a gentle slapping ^", " rain of haddock, and it will soon be followed by the deep ones... and a shadow ^", " out of Innsmouth will fall over Blumph.~ This, however, was not a universally ^", " held opinion. This paper also spoke to our weather correspondent, who said he ^", " was ~astonished~ at the reports, as there had been no haddock in the forecast. ^", " ^", " The smell is expected to linger over the next few days and abruptly worsen as ^", " the fish rots and then improve after a few weeks. Please see tomorrow's paper, ^", " and the next day's, and the next's for reports on the flood of seagulls that ^", " will then be engulfing the town. ^", " ^", " Ninario the wizard has denied involvement in the rain of haddock. ^", " ^"; DOME_BREAKAGE: print " ^", " *** CHAOS AT SCIENCE FOUNDATION *** ^", " ^", " Chaotic scenes at the Blumph science foundation today where the first annual ^", " Blumph Children's Science Fair was thrown into a state of confusion bordering ^", " on panic when an inexpertly-piloted airship crashed into the dome, leaving a ^", " large hole. It was unfortunate that this occurred at the same moment that a ^", " freak rain of haddock engulfed the city, resulting in many children being ^", " covered in bits of haddock. It was further unfortunate that this happened ^", " while the second annual Vechlee Townspeople's Cat Show was being held in the ^", " same location. ^", " ^", " Some are considering the disaster further evidence of Wizards Guild activity, ^", " especially in light of the fact that it was a science fair that was disrupted. ^", " One resident, who refused to be named, felt differently, claiming that he saw ^", " someone who ~had the Innsmouth look~ on the premises directly before the ^", " incident. This claim has not been corroborated. ^", " ^", " Ninario the wizard has denied all involvement despite being present as a ^", " science fair judge. ^", " ^"; LORD_MAYOR: print " ^", " *** LORD MAYOR HOLDS OPEN-AIR PARTY *** ^", " ^", " Representatives of the Lord Mayor's office are declaring her recent ballroom ^", " party a massive success. Attendees were very surprised when, midway through ^", " the fancy-dress occasion, a large portion of the roof was torn off. ~It was ^", " always our intention to have an open-air party,~ declared the Lord Mayor. ~We ^", " wanted to show the people of Blumph that we really know how to blow the roof ^", " off a party, literally and figuratively.~ ^", " ^", " When asked about the screaming she engaged in on seeing the roof pulled off, ^", " the Lord Mayor hastened to claim that was only due to surprise. ~I just didn't ^", " expect to be pelted with haddock. It was just unfortunate that there happened ^", " to be a rain of haddock when we pulled the roof off. We really should have ^", " checked the forecast,~ she added, picking haddock entrails out of her wig. ^", " ^", " When questioned about the extensive damage to the house, the Lord Mayor ^", " continued to insist all had gone to plan. ~It was such a huge success that I ^", " think next month's masked ball will do the same thing. In fact,~ she added, ^", " surveying the damage to her house, ~I'm certain it will have to, as we ^", " probably can't get this all fixed in time anyway.~ ^", " ^", " Ninario the wizard has denied involvement in the removal of the roof, claiming ^", " that he had been at the science foundation during the incident and in addition ^", " ~anchor marks~ on the removed roof clearly showed that an airship had been ^", " responsible. No party attendees corroborated the rogue airship theory. ^", " ^"; PLAYER_FLIGHT: print " ^", " *** AIRSHIP CAPTAIN ACHIEVES POWER OF FLIGHT *** ^", " ^", " While we are all used to seeing our brave captains sailing around the sky in ^", " their airships, eyewitnesses were stunned today when an airship captain was ^", " spotted achieving the power of flight without the aid of an airship. The ^", " incident, witnessed by multiple people, occurred outside of Vechlee near the ^", " caer of Ninario the wizard. The airship captain was spotted soaring proudly ^", " through the air like a pterosaur (well, one weighed down by a horde of items). ^", " ^", " This advance underlines the airship authority's role as the successor to the ^", " dying magic of brooms and carpets. The ability to dispense with airships for ^", " flight represents a significant scientific advance. ^", " ^", " Ninario the wizard has denied involvement, citing an ingrained fear of flying. ^", " ^"; YEKCAL_FLIGHT: print " ^", " *** WIZARDS GUILD PIONEERS ROBES OF FLYING *** ^", " ^", " Not to be out-done by the Blumph Airship Authority, evidence of the Wizards ^", " Guild's continuing relevance in society was demonstrated today at secret tests ^", " conducted at Ninario's caer near Vechlee. In a move clearly intended as a ^"; if (Top_Tree.storyadd == false) print " response to the Authority's continuing flight monopoly, a man wearing wizard's ^"; else print " response to the Authority's recent airship-free flight, a man wearing wizard's ^"; print " robes was spotted sailing majestically through the air with no visible means ^", " of propulsion. We can only assume this flight was achieved by the power of ^", " magic, proving that science does not have the answers to everything, even in ^", " these days of scientific advance. ^", " ^", " Some continuing work is needed on landing, as we witnessed the rather bumpy ^", " landing of the pioneer pilot at Douglas McIntosh's farm. We are happy to ^", " report that the pilot survived with minor bruises and the pigs are expected to ^", " recover from the shock. The pilot declined a lengthy interview, but said he ^", " was joining the Plumbers Union and moving somewhere there were no wizards or ^", " apprentices. He also said he hoped to find his magical walrus and spend his ^", " declining years caring for it, to atone for his many sins. We are unsure what ^", " finding one's magical walrus means, but assume it's a reference to some form ^", " of spirit animal or guide. We are also unsure if the sins to be atoned for are ^", " the walrus's or the pilot's. ^", " ^", " Ninario the wizard has denied being involved in the maiden flight, despite it ^", " occurring at his caer. ^", " ^"; TOWER_EXPLOSION: print " ^", " *** MASSIVE EXPLOSION AT WIZARD'S TOWER *** ^", " ^", " A massive explosion has destroyed a large portion of the second floor of ^", " Ninario the wizard's caer today. The cause of the blast is unknown, but this ^", " paper has received unconfirmed reports that an airship captain was seen on the ^", " premises just prior to the incident. ^", " ^", " A shaken teamster from Intercity WizStrip was also on the premises and in an ^", " exclusive interview, said ~Everything was normal once I finally got in to the ^", " courtyard. I delivered the vat of WizStrip via the delivery chute and moments ^", " later there was a massive explosion. I can't think what could possibly have ^", " been the cause.~ When questioned on the volatility of the compound he was ^", " carting on his wagon, the teamster was quick to absolve Intercity WizStrip of ^", " any blame in the matter. ~We just deliver it, it's up to customers to ensure ^", " that it's stored properly.~ ^", " ^", " Ninario the wizard has denied involvement, despite his known penchant for ^", " WizStrip-based explosions. His involvement in the startlingly similar Wizards ^", " Guild Hall explosion in Vechlee last year, while still vehemently denied, has ^", " long been suspected. ^", " ^"; FREAK_EARTHQUAKE: print " ^", " *** FREAK LOCALISED EARTHQUAKE IN BLUMPH HEIGHTS *** ^", " ^", " A freak localised earthquake is being blamed for the collapse of a manor house ^", " wall in Blumph Heights today. The earthquake seemed to affect only the wall ^", " surrounding the home of Captain Kells. No other property in the area was ^", " affected, and seismologist wizards at the science foundation dispute the ^", " reports. ~The scientific study of tremors is still in its infancy, but there's ^", " just no scientific basis for a localised earthquake of this kind. Never mind ^", " the fact that there is no fault line in the area. It's much more likely to be ^", " a magical disturbance of some kind, possibly from Wizards Guild activity.~ ^", " ^", " ~This is just typical of the ignorance with which we're treated,~ complained a ^", " furtive representative from the now-outlawed Wizards Guild, who refused to ^", " give his name. ~These poor misguided scientists can't find a scientific ^", " explanation so they fall back on claiming it's magic, and the work of the ^", " Wizards Guild. Superstitious fools. It's much more likely to be something one ^", " of their own scientists is doing. They're always exploding things.~ ^", " ^", " Noted accidental explosion expert Ninario the wizard has denied involvement, ^", " claiming that any accident involving him would have resulted in the wall being ^", " blasted into the sky rather than just tumbling to earth. Having covered some ^", " of Ninario's work since he moved to Blumph, we can hardly dispute that point. ^", " ^"; HOUSE_ROBBERY: if (Manor_Door.locked_door) { print " ^", " *** ROBBERY THWARTED IN BLUMPH HEIGHTS *** ^", " ^", " A potential robbery was thwarted in Blumph Heights today due to the constant ^", " vigilance of its residents. Captain Kells' house in Blumph Heights, exposed to ^", " the desperate predations of the unfortunate in society since the collapse of ^", " its wall in a freak earthquake earlier today, was saved from being burgled ^", " thanks to the captain's habit of locking his door securely. It has long been ^", " known that certain unsavoury inhabitants of the residential district keep a ^", " close eye on Blumph Heights, watching for the opportunity to strike. Reports ^", " say that some time after the earthquake, someone, presumably Captain Kells, ^", " unlocked the door, visited the home briefly, and then exited. A short time ^", " later, various criminal elements stole into the grounds, attempting to gain ^", " access to the house, but they were thwarted by the locked door. Our thanks to ^", " Captain Kells for his diligence in keeping our city safe. ^", " ^", " Ninario the wizard has denied involvement, claiming that he doesn't know where ^", " his own keys are, let alone anyone else's. ^", " ^"; #Ifdef TARGET_GLULX; glk_set_style(style_Normal); #Endif; style roman; font on; if (crystal has general && crystal.out == 0) { new_line; print_ret "~I'm really glad you locked that door", (murmurs)crystal, "."; } } else print " ^", " *** DAYLIGHT ROBBERY IN BLUMPH HEIGHTS *** ^", " ^", " The Tattler regrets to inform the reader that the scourge of lawlessness has ^", " been visited on our city once again. Captain Kells' house in Blumph Heights, ^", " exposed to the desperate predations of the unfortunate in society since the ^", " collapse of its wall in a freak earthquake earlier today, was burgled when ^"; if (Manor_Door.open_door) print " the front door was left gaping open earlier today. ^"; else print " the front door was left unlocked earlier today. ^"; print " ^", " It has long been known that certain unsavoury inhabitants of the residential ^", " district keep a close eye on Blumph Heights, watching for the opportunity to ^", " strike. Reports say that some time after the earthquake, someone, presumably ^", " Captain Kells himself, unlocked the front door, visited the home briefly, and ^", " then exited, leaving the premises unsecured. A short time later, various ^", " criminal elements stole into the grounds and gained easy access to the manor. ^", " ^", " Ninario the wizard has denied involvement, despite his well-documented absent- ^", " mindedness. ~I have enough trouble remembering to forget my own keys, let ^", " alone everyone else's.~ ^", " ^"; #Ifdef TARGET_GLULX; glk_set_style(style_Normal); #Endif; style roman; font on; if (crystal has general && crystal.out == 0) { new_line; print_ret "~Whoops", (murmurs)crystal, "."; } rtrue; default: print "There is no article here."; } #Ifdef TARGET_GLULX; glk_set_style(style_Normal); #Endif; style roman; font on; ]; [ PrintShortVision visionnum; print " ("; switch (visionnum) { 1: print "Vechlee road"; 2: print "main hall"; 3: print "laboratory"; 4: print "bedroom"; 5: print "laundry back room"; 6: print "vault antechamber"; 7: print "workshop"; 8: print "tower roof"; 9: print "garden"; } print " vision)"; ]; [ PrintVision visionnum; print " This cheese provided a vision of "; switch (visionnum) { 1: print "Renaldo and Yekcal discussing how to break into the caer."; 2: print "Renaldo and Yekcal in Ninario's main hall, discussing sealing the tower and raiding the laboratory."; 3: print "Renaldo and Yekcal searching the laboratory for the interplanar rift analyser."; 4: print "Renaldo and Yekcal searching Ninario's bedroom for a set of robes."; 5: print "Yekcal conducting a midnight raid on Betty's Dirty Laundry."; 6: print "Renaldo and Yekcal gaining access to Ninario's safety deposit box."; 7: print "Renaldo and Yekcal in the workshop, trying to figure out the interplanar rift analyser."; 8: print "Renaldo and Yekcal searching the tower roof for the rift."; 9: print "Crystal lying in the garden, peaceful and composed."; } ]; [ Randcrowd; print " a "; switch (random(6)) { 1: "man walking hurriedly past."; 2: "woman, stopping briefly before moving on."; 3: "warlock, his hood pulled down low over his eyes."; 4: "witch, bustling past with her broomstick on her shoulder."; 5: "passerby, too intent on his business to even look at you."; 6: "passerby, just before being sucked back into the vortex of the crowd and disappearing."; } ]; [ Randplacetext; switch (random(5)) { 1: print "shoves"; 2: print "places"; 3: print "puts"; 4: print "jams"; 5: print "stuffs"; } ]; [ ReadSub; <>; ]; [ 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."; ]; ! This is the full screen graphics redraw routine: #Ifdef GRAPHICS_ENABLED; !Glulx-only stuff again: ! This function sets the immediate area on the main Blumph map around the current location visible [ RevealBlumph offset newoff; if (offset ~= 0) { newoff = offset + (5 * MAP_DIFF) + 5; blumphmap-->newoff = blumphmap-->newoff & (~NODRAW_FLAG); blumphmap-->(newoff + 1) = blumphmap-->(newoff + 1) & (~NODRAW_FLAG); if (location ~= Inside_Manor) blumphmap-->(newoff + 2) = blumphmap-->(newoff + 2) & (~NODRAW_FLAG); newoff = newoff + MAP_DIFF; blumphmap-->newoff = blumphmap-->newoff & (~NODRAW_FLAG); blumphmap-->(newoff + 1) = blumphmap-->(newoff + 1) & (~NODRAW_FLAG); blumphmap-->(newoff + 2) = blumphmap-->(newoff + 2) & (~NODRAW_FLAG); ! Conj_commod has line for Blumph Heights running under it so we DON'T do a reveal if (location ~= conj_commod) { newoff = newoff + MAP_DIFF; blumphmap-->newoff = blumphmap-->newoff & (~NODRAW_FLAG); blumphmap-->(newoff + 1) = blumphmap-->(newoff + 1) & (~NODRAW_FLAG); if (location ~= Inside_Manor) blumphmap-->(newoff + 2) = blumphmap-->(newoff + 2) & (~NODRAW_FLAG); } } ]; ! This function sets the immediate area on the main Vechlee map around the current location visible [ RevealVechlee offset newoff; if (offset ~= 0) { newoff = offset + (5 * MAP_DIFF) + 5; ! Workship has line for Garden running beside it if (location ~= Workshop) vechleemap-->newoff = vechleemap-->newoff & (~NODRAW_FLAG); vechleemap-->(newoff + 1) = vechleemap-->(newoff + 1) & (~NODRAW_FLAG); ! Endlane has line for Garden running beside them if (location ~= End_Lane or Kitchen or Hayfield or Atop_Haystack) vechleemap-->(newoff + 2) = vechleemap-->(newoff + 2) & (~NODRAW_FLAG); newoff = newoff + MAP_DIFF; ! Workship has line for Garden running beside it if (location ~= Workshop) vechleemap-->newoff = vechleemap-->newoff & (~NODRAW_FLAG); vechleemap-->(newoff + 1) = vechleemap-->(newoff + 1) & (~NODRAW_FLAG); ! Kitchen and Endlane have line for Garden running beside them if (location ~= End_Lane or Kitchen) vechleemap-->(newoff + 2) = vechleemap-->(newoff + 2) & (~NODRAW_FLAG); newoff = newoff + MAP_DIFF; ! Workship has line for Garden running beside it if (location ~= Workshop or Laboratory or W_Courtyard) vechleemap-->newoff = vechleemap-->newoff & (~NODRAW_FLAG); if (location ~= Laboratory or Bailey) vechleemap-->(newoff + 1) = vechleemap-->(newoff + 1) & (~NODRAW_FLAG); ! Endlane has line for Garden running beside them if (location ~= End_Lane or Kitchen or Laboratory or Bailey) vechleemap-->(newoff + 2) = vechleemap-->(newoff + 2) & (~NODRAW_FLAG); } ]; #Endif; ! end the GRAPHICS_ENABLED bit [ RideSub; "That would really be beneath your dignity as a senior wizard's apprentice."; ]; [ Saysharp obj; print " ", (the) obj, " "; switch (random(6)) { 1: print "a bit sharply"; 2: print "sharply"; 3: print "indignantly"; 4: print "in exasperation"; 5: print "hotly"; 6: print "irritatedly"; } ]; [ SellSub; <>; ]; [ SellToSub; if (noun == player) "Possession is nine-tenths of the law."; if (noun == nothing) "Nobody seems to be interested in purchasing ", (the) second, (string)period; if (noun has animate) { print (The) noun; if (noun has pluralname) print " do"; else print " does"; "n't seem very interested in paying money for ", (the) second, (string)period; } ]; [ ShoutSub ; if (verb_word == 'cry' && crystal.out == 2) { "You shed bitter tears for Crystal's passing."; } print "You ", (address)verb_word, " loudly, attempting to attract some attention.^"; rtrue; ]; [ ShowNPCSub; if (location == conj_commod) <>; if (location == lonely_supply) <>; if (location == Honest_Akbars) <>; if (location == dirty_laundry) <>; if (location == pub) <>; if (location == High_Street or Oak_Street or Shops or Market_Square or Vechlee_Gate) <>; if (location == Vechlee_Road && guard hasnt general) <>; if (location == Building_Society) <>; <>; ]; [ SitDownSub obj; objectloop(obj in location) { if(obj has supporter && obj has enterable) <>; } "There is no place to sit here."; ]; [ SmileSub; if (Testscope(crone)) <>; if (Testscope(hermit)) <>; if (Testscope(akbar)) <>; if (Testscope(betty)) <>; if (Testscope(captain)) <>; if (Testscope(people)) <>; if (Testscope(guard)) <>; if (Testscope(teller)) <>; if (Testscope(crystal) && crystal has general) <>; "No one seems to notice or care."; ]; #Ifdef SOUND_ENABLED; [ SoundDownSub; if (volsupport == false) "Your interpreter reports that it does not support volume changing."; if (sound_vol == 1) "Already at minimum volume."; sound_vol--; "Sound volume set to ", sound_vol, (string)period; ]; [ SoundsOffSub; PlaySound(crowd_fade, 0, 0); play_sounds = false; "Sound off."; ]; [ SoundsOnSub; if (soundsupport == false) "Your interpreter reports that it does not support sound."; play_sounds = true; "Sound on."; ]; [ SoundStop; #Ifdef TARGET_ZCODE; @sound_effect current_sound 3; #Ifnot; if (gg_schan) glk_schannel_stop(gg_schan); ! schannel_stop #Endif; ]; [ SoundToggleSub; if (soundsupport == false) "Your interpreter reports that it does not support sound."; if (play_sounds == true) <>; if (play_sounds == false) <>; ]; [ SoundUpSub; if (volsupport == false) "Your interpreter reports that it does not support volume changing."; if (sound_vol == 8) "Already at maximum volume."; sound_vol++; "Sound volume set to ", sound_vol, (string)period; ]; [ SoundVolSub; if (volsupport == false) "Your interpreter reports that it does not support volume changing."; if (noun > 8 || noun <= 0) "Please specify a volume level between 1 and 8."; sound_vol = noun; "Sound volume set to ", sound_vol, (string)period; ]; #Endif; [ TalkSub ; print (The)noun; if (noun has pluralname) print " don't "; else print " doesn't "; "reply."; ]; [ TaskScore i; return task_scores-->i; ]; [ Thanksub; print "You utter profuse thanks.^"; if (crystal has general && crystal.out == 0) { "^~You're welcome, I guess,~ shrugs ", (the)crystal, "."; } ]; [ ToFirstUpper word i j; j = PrintToBuffer(Case_Array, MAX_LOCATION_LENGTH, word); for (i=WORDSIZE:(i < (j + WORDSIZE)) && (i < MAX_LOCATION_LENGTH + WORDSIZE): i++ ) { if (i == WORDSIZE) Case_Array->(i) = UpperCase(Case_Array->(i)); print (char) Case_Array->(i); } ]; [ TossCoinSub guess result; if (crystal has general && crystal.out == 0) { switch (random(2)) { 1: guess = 1; print "~Heads!~ calls ", (the)crystal, " as y"; 2: guess = 2; print "~Tails!~ calls ", (the)crystal, " as y"; } } else print "Y"; print "ou give the coin a quick toss. It "; switch (random(21)) { 1 to 10: print "comes up heads"; result = 1; 11 to 20: print "comes up tails"; result = 2; 21: print "lands edge-on"; result = 3; } if (crystal has general && crystal.out == 0) { if (result == 3) print "!^^~Hey, that's wild!~ cries ", (the)crystal; else if (guess == result) print ".^^~Yes!~ she cries"; else print ".^^~Nuts,~ she mutters"; print ", as y"; } else print ", and y"; "ou pick it back up."; ]; [ TouchWalls obj Floor Walls; if (obj == u_obj or Sky || real_location == Midair) <>; if (obj == d_obj) { switch (Floor) { ROUGH_WOOD: "The wooden floor is rough and splintered."; ROUGH_STONE: "The stone floor is rough and uneven."; 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."; SLIMY_STONE: "This stone floor is slippery with slimy residue."; STONE_TILES: "You run your fingers lightly over the polished stone tiles of the floor, savouring the slippery coolness of their texture."; THICK_CARPET: "The carpeted floor is thick and warm under your feet."; METAL_GRATING: "The metal grating is cold and rough to the touch."; DIRT: "The ground under your feet is dry packed dirt."; LAWN_GRASS: "The sweet-smelling grass is soft and springy, beautifully tended."; COBBLES: "The cobblestones are neatly and securely laid."; FLOWERS: "The ground is a lush carpet of flowers, soft and yielding."; OUTSIDE: "The ground under your feet is dry packed dirt."; AIRBORNE: "You're airborne!"; } } switch (Walls) { ROUGH_WOOD: "The wooden walls are rough and splintered."; ROUGH_STONE: if (location == 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 wall leeches the warmth from your fingers."; SLIMY_STONE: "These slimy stone walls gleam slickly with some kind of foreign residue."; SMOOTH_STONE: "These walls are constructed of beautifully dressed stone, smooth to the touch."; DIRT: "The walls are dry, packed dirt."; OUTSIDE: "You're outside, so the walls don't enter into it."; } ]; [ Trundles ; if (Sewer_Vat.clean == true) { switch(random(8)) { 1: print "careens"; 2: print "charges"; 3: print "gallops"; 4: print "careers"; 5: print "sprints"; 6: print "flies"; 7: print "rushes"; 8: print "surges"; } } else { switch(random(8)) { 1: print "trundles"; 2: print "rumbles"; 3: print "rolls"; 4: print "lumbers"; 5: print "plods"; 6: print "meanders"; 7: print "rambles"; 8: print "ambles"; } } ]; [ 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."; ]; [ UnlockSub; if (second == nothing && noun has locked) { if (TestScope(noun.with_key)) { if (noun.with_key notin player) { print "(first taking ", (the) noun.with_key, ")^"; ; } ! If key wasn't successfully taken, we'll have to rfalse. if (noun.with_key notin player) rfalse; second = noun.with_key; } else "You don't have a key that fits the lock of ", (the) noun, (string) period; } if (ObjectIsUntouchable(noun)) return; if (noun hasnt lockable) return L__M(##Unlock, 1, noun); if (noun hasnt locked) return L__M(##Unlock, 2, noun); if (noun.with_key ~= second) return L__M(##Unlock, 3, second); give noun ~locked; if (AfterRoutines() || keep_silent) return; L__M(##Unlock, 4, noun, second); ]; [ UseSub ; if (noun == player) "One can only hope you don't prove useless."; "It's unclear how you want to use ", (the) noun, ". You may want to try a more specific action."; ]; [ XyzzySub; print "You cry out ~", (ToFirstUpper)verb_word, "!~ in a loud voice but nothing happens. Does it ever?^"; if (Testscope(Renaldo)) { if (location == Tower_Roof && location.vision == false) { ! We're on the tower and roof and NOT in the tower roof vision. "~Hah!~ laughs Renaldo cruelly. ~The power of that word cannot hope to stand against the might of this interplanar rift. Try again, apprentice!~"; } } if (Testscope(crone)) "^~Hah!~ cackles ", (the)crone, ". ~If I had a plotkin for every wizard's apprentice who's tried that word... well, I'd have a couple of plotkins at least.~"; if (Testscope(betty)) "^~Bless you!~ says ", (the)betty, ". ~Still have that nasty cold you had back in Vechlee, I see.~"; if (Testscope(hermit)) "^~You know,~ muses ", (the)hermit, ", ~that word might have done something once, but I think overuse has simply killed it.~"; if (Testscope(akbar)) "^~Very powerful words at one time!~ cries ", (the)akbar, ", ~but you'd have no need of them if you had a flying carpet under you! Why not purchase one today?~"; if (Testscope(captain) && captain.out == false) "^~Exactly!~ mumbles ", (the)captain, " in agreement. ~That's what I tried telling them... but did they listen? Of course not.~"; if (Testscope(guard)) print_ret (The) guard, " looks around apprehensively for a moment, but when nothing happens he scowls at you. ~Hah! Tha greeat numb-heeaded hoit!~"; if (crystal has general && crystal.out == 0) "^~Oh, right,~", (giggles)crystal, ", ~that word ", (i) "always", " helps.~"; rtrue; ]; [ YawnSub ; print "You yawn noisily.^"; if (crystal has general && crystal.out == 0) "^~Oh, goodness me!~ yawns ", (the)crystal, ". ~You've set me off!~"; rtrue; ]; !==================================================================================================================================================== ! Standard and extended grammar Include "Grammar"; Include "autodoor"; Include "random"; Verb 'abuse' = 'attack'; Verb 'bend' = 'attack'; Verb 'aim' 'point' * noun -> AimNothing * 'at' noun -> AimAt * noun 'at' noun -> AimAt * noun 'toward'/'towards' noun -> AimAt * noun noun -> AimAt; Verb 'appraise' = 'buy'; Verb 'ascend' = 'climb'; Extend 'ask' replace * creature 'about' noun -> ItemAsk * creature 'about' topic -> Consult * creature 'for' noun -> AskFor * creature 'to' topic -> AskTo * 'that' creature topic -> AskTo * creature 'for' 'help' -> AskForHelp * creature 'for' 'assistance' -> AskForHelp * creature 'for' 'help' -> AskForHelp * creature 'for' 'hint' -> AskForHelp * creature 'for' 'hints' -> AskForHelp * creature 'for' topic -> AskFor * creature 'for' topic noun -> AskFor; Verb 'barter' 'bargain' 'haggle' 'deal' 'trade' * -> Bargain * 'with' creature -> Bargain; Verb 'be' * 'quiet' -> Bequiet; Verb 'bite' = 'taste'; Extend 'buy' * noun 'from' creature -> BuyFrom reverse; Verb 'cash' '$' * -> Cash; Extend 'climb' * 'on' noun -> Climb * 'into' noun -> Enter * 'through' noun -> Enter * 'under' noun -> GetUnder * 'out' 'of' noun -> Exit * 'out' -> Exit; Verb 'comment' * -> Comment; Verb 'confront' * creature -> Talk; Extend only 'cover' replace * noun -> Close * 'up' noun -> Close * 'off' noun -> SwitchOff * noun 'with' noun -> PutOn reverse; Verb 'diagnose' 'health' * -> Diagnose; Extend 'dig' * 'in' noun -> Dig * 'in' noun 'with' held -> Dig; Extend 'disrobe' replace * creature -> DisrobeNPC * held -> Disrobe; Verb 'drill' * creature 'about' topic -> Ask * creature 'for' noun -> AskFor; Extend 'eat' replace * noun -> Eat; Extend 'empty' * noun 'in' noun -> EmptyT * noun 'over' noun -> EmptyT; Verb meta 'exits' * -> CantGo; Verb meta 'fancy' * -> Fancy; Verb 'find' * noun -> Find * topic -> Find; Verb 'fly' * -> Fly * noun -> Enter; Verb 'follow' = 'find'; Verb 'greet' 'hi' 'hello' 'salute' 'greetings' 'acknowled' 'bow' 'nod' 'meet' * -> MeetNPC * noun -> MeetNPC * 'at'/'to'/'toward'/'towards' noun -> MeetNPC; Extend 'get' first * 'up' -> Exit; Extend 'get' * 'out' 'of' noun -> Exit * 'out' / 'off' -> Exit * 'off' 'of' noun -> GetOff * 'under' noun -> GetUnder * multiinside 'out' 'of' noun -> Remove; Extend 'give' * 'me' 'help' -> Hint * 'me' 'assistance' -> Hint * 'me' 'hint' -> Hint * 'me' 'hints' -> Hint; #Ifdef GRAPHICS_ENABLED; Verb meta 'graphics' * 'on' -> Fancy * 'off' -> Plain; #Endif; Verb 'hang' = 'tie'; Verb 'help' 'assist' * -> Hint * noun -> HelpNPC; Verb 'hide' * 'under' noun -> GetUnder; Verb 'hint' 'hints' 'clue' 'clues' * -> Hint; Verb 'hurry' * -> HurryUp * 'up' -> HurryUp; Verb 'jaunt' = 'jump'; Verb 'jettison' = 'drop'; 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' * -> Knock * 'on'/'at' noun -> Knock * creature -> Attack; Verb 'let' * noun 'in' -> LetIn; Verb 'lift' 'raise' * noun -> Lift; Verb 'lick' * noun -> Lick; Verb 'load' = 'put'; Extend 'look' * 'behind' noun -> LookBehind * 'for' noun -> Find * 'for' topic -> Find * noun=ADirection -> Examine * 'to' noun=ADirection -> Examine * 'through' noun -> Search * 'out' noun -> Search; Verb 'maybe' = 'yes'; 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' * -> Play * 'with' noun -> Play * noun -> Play; Extend 'pick' * noun -> Take; Verb meta 'plain' * -> Plain; 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 * 'back' noun -> Lift * noun 'up' -> Lift * noun 'down' / 'left' / 'right' -> PushDir; Extend 'put' * multiexcept 'over' noun -> PutOn * multiexcept 'through' noun -> Insert; Verb 'reach' * 'in'/'into' noun -> ReachIn * 'under' noun -> ReachUnder; Extend 'read' first * readable -> Read; Verb 'repair' * noun -> Tie; 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 -> Sell * creature held -> SellTo * held 'to' creature -> SellTo reverse; 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 * held -> ShowNPC; Extend 'sit' replace * -> SitDown * 'at'/'on' noun -> Enter * 'in' noun -> Enter * 'down' -> SitDown * 'down' 'at' noun -> Enter; Verb 'smile' 'grin' 'beam' * -> Smile * creature -> Smile * 'at' creature -> Smile; Verb 'smear' 'spread' 'smother' * multiexcept 'on'/'onto' noun -> PutOn * multiexcept 'in'/'into' noun -> PutOn; #Ifdef SOUND_ENABLED; Verb meta 'sound' 'sounds' 'volume' * -> SoundToggle * "on" -> SoundsOn * "off" -> SoundsOff * "up" -> SoundUp * "down" -> SoundDown * number -> SoundVol; Verb meta 'noisy' 'loud' * -> SoundsOn; Verb meta 'quiet' * -> SoundsOff; #Endif; Extend only 'speak' * 'to' creature -> Talk * creature -> Talk; Verb 'stick' * multiexcept 'in'/'inside'/'into' noun -> Insert * multiexcept 'on'/'onto' noun -> PutOn * multiexcept 'to' noun -> PutOn * 'on' held -> Wear; Extend 'swim' * 'in' noun -> Swim; Verb 'talk' 't' * 'to' creature -> Talk * creature -> Talk; Extend 'throw' * noun 'over' noun -> ThrowAt; Extend 'tie' * noun 'on' noun -> Tie; Verb 'tidy' 'wash' = 'rub'; Verb 'toss' 'flip' * is_coin -> TossCoin; Extend 'tell' first * creature 'about' noun -> Tell; Verb 'thank' * creature -> Thank; Verb 'tug' = 'pull'; Verb 'unblock' 'unclog' * noun -> Unblock; Verb 'undress' = 'disrobe'; Verb 'unload' = 'remove'; Verb 'use' * noun -> Use * noun 'on' noun -> Use; Extend 'wave' replace * -> MeetNPC * 'madly' -> MeetNPC * held -> Wave * held 'madly' -> Wave * held 'at' noun -> Wave * held 'madly' 'at' noun -> Wave * 'madly' 'at'/'to'/'toward'/'towards' noun -> MeetNPC * 'at'/'to'/'toward'/'towards' noun -> MeetNPC; Verb 'xyzzy' 'plugh' 'plover' * -> Xyzzy; Verb 'yawn' * -> Yawn * topic -> Yawn;