!======================================================================== Constant Story "The Moonlit Tower"; Constant Headline "^Interactive Fiction, v.1.0 ^Yoon Ha Lee, copyright 2002 ^Newcomers may want to type HELP or ABOUT.^"; Constant AMUSING_PROVIDED; Constant MANUAL_PRONOUNS; Replace MakeMatch; Replace Identical; Replace NounDomain; Replace TryGivenObject; Replace DrawStatusLine; Replace ScoreSub; Include "Parser"; Include "/Users/yhlee/Applications/yhl-if/pname/pname"; ! replacing some library messages Object LibraryMessages with before [; 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 the default ~verbose~ mode, which always gives long descriptions of locations, even if you've been there before."; LMode3: " does not support ~superbrief~ mode."; Miscellany: if (lm_n == 44 && action_to_be == ##Take) "You can't use ALL in this context."; ]; ! ditching TAKE ALL ! After Roger Firth's "Advanced Aspects" ! http://www.firthworks.com/roger/informfaq/aa.html#7 [ ChooseObjects obj code retval; obj = obj; ! Avoid a compiler warning switch (code) { 0: ! Parser is excluding obj from ALL ; ! ... accept parser's decision 1: ! Parser is including obj in ALL if (action_to_be == ##Take) retval = 2; ! ... force exclusion if TAKE; accept otherwise 2: ! Parser is asking for 'appropriateness' hint ; ! ... but we don't provide one } return retval; ]; Replace LMode3Sub; Include "VerbLib"; Include "/Users/yhlee/Applications/yhl-if/Menus"; !======================================================================== ! Menu of credits, information, etc. Menu about_menu "The Moonlit Tower"; Option -> "About the Game" with description [; style underline; print "The Moonlit Tower"; style roman; print " was written by Yoon Ha Lee, a dabbler in math, sf/f writing, linguistics, and other things, as an entry in IFComp 2002. I began coding it in the summer of 2002 when my sister introduced me to the evils of Interactive Fiction with Emily Short's "; style underline; print "Pytho's Mask"; style roman; print " and Andrew Plotkin's "; style underline; print "Shade"; style roman; print ". I've since encountered other wonderful examples, but those were my first, and what got me hooked.^^ This is my first attempt at creating Interactive Fiction if you don't count Choose Your Own Adventure-type juvenalia written in grade school; it's certainly my first effort programming in Inform.^^ I can be reached at^^ Yoon Ha Lee^ 39 Montgomery St. #3^ Cambridge, MA 02140^ U.S.A.^ Earth^"; style underline; print "requiescat@@64cityofveils.com"; style roman; print_ret "^^for bug reports (transcripts are welcome!), comments, or constructive or destructive criticism. And if you really, really liked the game, donations (especially of used books) are appreciated."; ]; Option -> "The Opening" with description "This is for people like me who type ABOUT and then realize that they can't go back and read the introductory text without quitting out:^^ No, not a prison, though stone stands around you, as expressionless as a mirror awaiting face and form; and in the silence you hear no plaint of flute or roar of gong, but instead the crash of porcelain shattering."; Menu -> "How to Play Interactive Fiction"; Option -> -> "Getting Started" with description [; print "I'm a newcomer to IF myself, but if you're even more a newcomer, here are some tips to get you started.^^ As you start the IF, you're deposited in an unfamiliar world. What you actually want to do will depend on the particular IF and the scene it sets. In the case of "; style underline; print "The Moonlit Tower"; style roman; print_ret ", you're wandering around the eponymous tower trying to figure out what's going on. You do this by typing commands (by convention, shown here in all-caps) at the command prompt, which looks like this:^^ >^^ and hitting enter, at which point the game responds.^^ To move around, N (NORTH), S (SOUTH), E (EAST), W (WEST), NE (NORTHEAST), NW (NORTHWEST), SOUTHEAST (SE), SOUTHWEST (SW), U (UP) and D (DOWN) are handy. Some games also use IN and OUT; this one generally doesn't. Either the short form or the long form (in parentheses) will be understood, but given how often these commands are used, you'll probably find yourself using the short form in no time. Again by convention, the viewpoint character has perfect direction sense. It makes life more convenient all around.^^ X (EXAMINE) is indispensable. For example, you can:^^ >X SELF^ As good-looking as ever.^^ or^^ >X MIRROR^ What did you expect to see?^^ at which the game will tell you what there is worth noting, or tell you it doesn't know what you're talking about (if you try to EXAMINE something that isn't there, for instance). Similarly, LOOK will generally repeat the description of the room you're in so you can refresh your memory. By default, this game gives the long description of a game every time you enter it. You can set it to do this only the first time you enter a room by typing BRIEF, which is the normal default for many games; VERBOSE will return it to printing the room description each time.^^ You can TAKE or GET things, and I (INVENTORY) will tell you what you're currently carrying. Larger or more complex games may impose a limit on how much you can carry; this one does not, but it's something to be aware of.^^ You can also HIT (something), TOUCH (something), SMELL, TASTE (something), DROP (something), SING, ATTACH (something) to (something else), and more, with varying effects. If something occurs to you, try it. In this particular game, the worst that can happen is that the unexpected happens, or nothing does, or the game doesn't understand what you're trying to do. To some extent each game has its own verbs or actions, though the ones listed above (among others) are standard for games written in Inform (.z5 or .z8 files).^^ Some games ~punish~ you to some degree for ill-advised experimentation, which may render the game unwinnable or prevent you from solving some puzzle. To a limited extent, UNDO (which will undo your last move, and only your last move), and SAVE (usually, but not necessarily, available) and RESTORE (which loads a saved game) may ameliorate this, not to mention that it keeps you from having to restart from square one if you decide you've had enough for the session. You can have as many saved games as you want, provided you give them all distinct filenames. Generally the game will suggest something like MOONLIT.SAV for you.^^ If the situation is truly dire you can RESTART or, of course, Q (QUIT).^^ Finally, if you get well and truly stuck, many games will either have a HELP or ABOUT menu (like the one you're reading right now), or else some notes that may make your life easier. In this game, HINT will take you directly to the ~Hints~ section.^^ As with most things, the fastest way to figure out how IF works is to plunge in and try a few. Have fun!"; ]; Option -> -> "A Sample Transcript" with description [; print "DISCLAIMER: This is by no means an optimal beginning, if such things exist, but it should give you some notion of the range of possibilities. Plain text is generated by the game; text in ALL CAPS at the command prompt (>) indicates what the player has typed in; comments made in asterisks, **thus,** are included to explain the player's rationale for the actions she took and would not normally appear in the course of the game.^^"; style bold; print "Moonlit Chamber"; style roman; print "^Moonlight diffuses through the walls, tracing out unreadable sigils in calligraphies of light and dark. Stairs adorned with bas-relief motifs spiral downward.^^ You can see a porcelain mask here.^^ >X MASK^^ **Might as well start by looking at the room's most interesting feature. X is short for EXAMINE.**^^ The half-mask is the pale, almost bluish color of the finest celadon, cracked with uncanny precision down its axis of symmetry. The face in its blank, sculpted features has no more personality than new-forged steel. Half a mask, though--that must mean the left half is--^^ >GET MASK^^ **No reason not to take anything that isn't nailed down.**^^ Taken.^^ >I^^ **So what else am I carrying around? I is short for INVENTORY.**^^ You are carrying:^ half a porcelain mask^ armor and silks (worn)^^ >X ARMOR^ Both armor and silks are in black and gold, night and sun, skins without sensation.^^ >TAKE OFF ARMOR^^ **Wonder what's beneath that armor?**^^ This would not be proper.^^ **Looks like I won't be allowed to do that. Oh well.**^^ >SING^^ **I like trying random actions since there are occasionally stray bits of humor lying around, if nothing else.**^^ A phrase of melody comes to you: an old court air.^^ **Wow, that actually did something. I'll have to remember that.**^^ >X SIGILS^ A curious thing, that the walls' stones should admit moonlight. A half moon, you think, from the level of illumination: a moment's memory suggests nights spent campaigning beneath open sky, but is soon gone.^^ >X MOON^ Alas, all around you lies stone, and the sky lies beyond your reach or your vision.^^ >UP^^ **Hey, it's worth a try.**^^ You are no magician to soar like the summer crane or the autumn hawk, and in any case, the blue-painted rafters arch above you to a remote and unassailable peak.^^ **That sounded pretty definitive. Let's see what else is in this place.**^^ >DOWN^"; style bold; print "Shadow Armory"; style roman; print_ret "^Shadows gather around you....^^ * * *^^ And that's it for the transcript. It's up to you to discover the rest!"; ]; Option -> -> "Standard Inform Verbs" with description [; print_ret "This list is not comprehensive, but it should be near enough for this game's purposes. Many games implement their own verbs or extend existing ones.^^ SAVE, RESTORE, UNDO, RESTART, QUIT, SCRIPT ON (handy if you want to send me a transcript of your doings!), SCRIPT OFF, VERSION.^^ N (NORTH), S (SOUTH), E (EAST), W (WEST), NORTHEAST (NE), NORTHWEST (NW), SOUTHEAST (SE), SOUTHWEST (SW), IN, OUT, CLIMB.^^ L (LOOK), X (EXAMINE), SEARCH, CONSULT (with books), I (INVENTORY), TOUCH, SMELL, TASTE^^ OPEN, CLOSE, DROP, PUT ON, TAKE OFF, GET, LOCK, UNLOCK, FILL, HIT, SET, ATTACH, TURN^^ EAT, DRINK, SING^^ YES, NO"; ]; Option -> -> "Verbs Specific to This Game" with description [; print_ret "This game uses the standard vocabulary of verbs for Inform. Others that are less standard have been implemented for your convenience, and may or may not be helpful:^^ BREATHE, FLY, LOOK UP, FOLD, TAKE APART, TAKE (something) WITH (something else), UNFOLD, UNTIE, ARRANGE (something) AS (something else), PLAY (instrument)^^ And of course, you know ABOUT or HELP, or you wouldn't be here; HINT will take you directly to the Hints."; ]; Option -> "Credits and Acknowledgements" with description [; print "Many thanks to Graham Nelson for Inform and the magisterial "; style underline; print "Inform Designer's Manual"; style roman; print " (or the Black Binder of Doom); to Roger Firth and Sonja Kesserich for "; style underline; print "The Inform Beginner's Guide"; style roman; print " (or the White Binder of Doom); Neil Cerutti for the pname library; Stephen Granade for organizing IFComp 2002; Lucian Smith for the beta-testing page; and the Tompkins County Public Library (Ithaca, NY) for its nonfiction collection.^^ Particularly inspirational were the "; style underline; print "Korean Heritage Series"; style roman; print " by the Korea Overseas Information Service, 1995; "; style underline; print "The Art of China Knowledge Cards"; style roman; print " by the Asian Art Museum of San Francisco; "; style underline; print "Mongolian Folktales"; style roman; print " by Hillary Roe Metternich, whose papercut illustrations by Mongolian artist Norovsambuugiin Baatartsog are not to be missed; "; style underline; print "The Encyclopedia of Fantasy"; style roman; print " ed. John Clute and John Grant; and the art of Stephanie Pui-Mun Law ("; style underline; print "http://www.shadowscapes.com"; style roman; ").^^ Thanks to my sister Yune Kyung Lee for introducing me to Interactive Fiction and Inform, helping me debug the fixes I'd gotten myself into, and for being an alpha/beta tester even of incomplete versions. Also thanks to Andrew Plotkin and Roger Firth for telling me how to set the default mode to VERBOSE, and Sonja Kesserich and David Welbourn for helping me with AMUSING.^^ Many thanks to the beta testers, without whom this would be a much poorer game (and not all contributions, alas, can be mentioned specifically!): Joseph Betzwieser, my beleaguered husband, whom I bullied into playing the thing; Jeff Johnson with his many reports and suggestions; Phil Swinbanks, who (among other things) pointed out that I ought to include ~armour~ as a British variant; Iain Merrick, who gave me advice on the prose and puzzles; Martin Bays, who, despite working on his own entry, tested many nooks and crannies and kindly told me how to get rid of the persistent Score: 0 in the status bar; Joao Mendes, fellow L5Rer; and Dylan (Tovey?), who thought up better ways to help cue the puzzles.^^ Thank you to all the people who wrote reviews or dropped me notes about their playing experiences. I've tried to address problem spots (TAKE ALL was but one of them), though I won't claim I got 'em all.^^ And best wishes to all the other IFComp 2002 entrants for the hours of entertainment they provided."; ]; Option -> "License" with description [; style bold; print "Interactive Fiction General Freeware Public License^"; style roman; print "("; style underline; print "http://www.firthworks.com/roger/license.html"; style roman; print ")^^ 1. This license grants you the right to use and distribute "; style underline; print "The Moonlit Tower"; style roman; print " (~the game~) under the conditions outlined below. You cannot use or distribute the game if you do not agree with these conditions.^^ 2. The game, including any and all associated files as well as all of the output produced by the game, and all derivative works, is copyright (c) 2002 by Yoon Ha Lee.^^ 3. Queries about the license should be directed to the copyright holder, whose address at the time of writing is "; style underline; print "requiescat@@64cityofveils.com"; style roman; print ". If contact cannot be established, you may be able to locate the copyright holder via the rec.arts.int-fiction Internet newsgroup.^^ 4. You are allowed to use the game and make free copies for your personal use without restrictions. You may also copy and distribute the game in any medium, as long as (a) you make no charge for doing so, and (b) the game, all associated files and this license are included and remain unmodified.^^ 5. You are "; style bold; print "not allowed"; style roman; print " to make a charge for distributing the game (either for profit or merely to recover your media and distribution costs) whether as a stand-alone product, or as part of a compilation or anthology, without explicit prior written permission.^^ 6. NO WARRANTY. This game is licensed and provided ~as is~ without warranty of any kind, express or implied, including, but not limited to, implied warranties of merchantability and fitness for a particular purpose or warranties of non-infringement.^^"; print "A more recent release, if any, and the Inform source code can eventually be found at "; style underline; print "http://pegasus.cityofveils.com/if.phtml"; style roman; print_ret " along with other notes. You're welcome to recycle pieces of the code (as opposed to the descriptions and text) in your own game(s), though I imagine it will seem clunky to experienced Inform programmers. Note that I am very likely to say ~yes~ to any reasonable request if you ask nicely."; ]; Option -> "Revision History" with description [; style bold; print "v.5 alpha release"; style roman; print " 17 September 2002^ An initial build for testing purposes.^^"; style bold; print "v.6 beta release"; style roman; print " 19 September 2002.^ Another initial build for testing purposes, but with all elements of the game now nominally functional; this version was submitted to the beta-testing page.^^"; style bold; print "v.7 beta release"; style roman; print " 24 September 2002.^ Already incorporating changes to make the game easier to play, based on the beta-testers' reports, though no major bugs have surfaced--yet. A few revisions remain to be made. (Released privately to another tester as the deadline creeps closer.)^^"; style bold; print "v.8 beta release"; style roman; print " 25 September 2002.^ Additions: more synonyms and parser details, along with general tightening-up and attending to details. Alternate solutions to various puzzles and, wonder of wonders, a new room. Added the HINT verb as well, which goes directly to the hint menu. (Released privately to one of the testers.)^^"; style bold; print "v.9 beta release"; style roman; print " 26 September 2002.^ Improvements and some additional flashbacks. (Released privately to a couple of the testers.)^^"; style bold; print "v.1.0 competition release"; style roman; print " 27 September 2002.^ If there are any more improvements (and inevitably there are), they'll have to wait until after IFComp 2002. Now I can start worrying about the "; style underline; print "next"; style roman; print " game. Really. (Hey, the numbering worked out...)^^"; style bold; print "v.1.1 post-competition fixes"; style roman; print " 26 January 2002.^ Yes, I know, many of you yelled at me about GET ALL, among other peccadilloes. Mea culpa. I can only say, in my defense, that I didn't even know there was a way around the GET ALL issue. I won't do it again, I swear...A number of minor issues and errors have been addressed, but there are no radical changes.^^"; print_ret "More releases will be detailed as they come to exist."; ]; Menu -> hint_menu "Hints"; Option -> -> "About the Hints" with description [; print "If you get truly stuck, you can resort to hints, though you'll probably get more out of the game if you experiment before doing so. That being said, as an abominable puzzle-solver myself, I do think it's important that they be available if you're having a rough time.^^ The wording of some hints is a touch oblique to prevent from spoiling later stages of puzzles, but I hope you can figure out which hints apply to you. Otherwise, this is a relatively standard exercise in both puzzle-solving and self-discovery.^^ Don't hesitate to let me know ("; style underline; print "requiescat@@64cityofveils.com"; style roman; print_ret ") if you have suggestions for better or different hints and/or puzzle solutions. (I am told authors are notorious for misjudging their own puzzles; and as a first-time author, I suspect I shall be especially prone to this phenomenon.)"; ]; Option -> -> "General Tips" with description [; print "The cruelty rating for this game (using Plotkin's categories) is ~polite,~ perhaps even ~merciful.~ I haven't figured out how to put the game in an unwinnable state, but it's possible one exists.^^ EXAMINE will be invaluable, and the messages of other senses should not be ignored. Experiment with those things that you find; the nature of the setting is such that you may have to make unorthodox uses of things in order to evoke the effects you desire. Unless there is a bug, you should be able to make your way straight through without needing to UNDO or RESTART (though of course there's nothing wrong with doing so).^^ You can also find a list of ~Verbs Specific to This Game~ under ~How to Play Interactive Fiction~ if you're positive something ought to be doable but aren't sure how to get it across to the parser.^^ That being said, the game attempts, as befits a ~polite~ game, to give you fair warning or prompt your own ingenuity. It is not my intent to put you through guess-the-verb or guess-the-noun, and any such instances are unintentional. In fact, they should probably be reported to me at "; style underline; print "requiescat@@64cityofveils.com"; style roman; print_ret " so they can be rectified. I've already included a number of alternate solutions and/or phrasings at the suggestion of the beta-testers, and more improvements in this area can only be good."; ]; Menu -> -> "Hints: The Jade Compass"; Option -> -> -> "How do I use the compass?" with description "Perhaps you can change its settings, which are marked on the compass itself. Even a little tinkering should get it to change its orientation randomly, if nothing else."; Option -> -> -> "I'm stuck--how do I use it, really?" with description "SET COMPASS TO CRANE (or HAWK, or FEATHER, or SWALLOW). SPIN NEEDLE and other variants will also work, with varying degrees of control."; Option -> -> -> "What does the compass do?" with description "Try looking around the garden, or examining parts of it, after you change the settings. Also, it may affect other parts of the tower in subtle ways."; Option -> -> -> "What is its significance?" with description "The symbols on the compass might themselves bear further inspection."; Menu -> -> "Hints: The Maple Leaf"; Option -> -> -> "What's the leaf's purpose?" with description "As it is folded, you may be able to unfold it; and the compass symbols, inspected closely, may suggest what to do with it."; Option -> -> -> "Where do I find a frame?" with description "If you look around the tower you might find a pair of chopsticks."; Option -> -> -> "Where do I find a string?" with description "A tassel might do, if you cut the strands. Of course, one wishes not to vandalize certain objects."; Option -> -> -> "Where do I find a knife?" with description "An armory would contain such things."; Option -> -> -> "How do I put everything together?" with description "ATTACH STICKS TO PAPER, then ATTACH STRING TO KITE."; Option -> -> -> "Why doesn't my creation work?" with description "There's an expected season for kite-flying."; Option -> -> -> "What did going through all this accomplish?" with description "Look around the garden and follow the wind to see what's new."; Menu -> -> "Hints: The Bronze Gong"; Option -> -> -> "How do I use the gong?" with description "You can PLAY it like any instrument."; Option -> -> -> "Where do I find an instrument?" with description "The Silent Symphony is a musicians' room, and it's likely that one of the absent musicians left something behind, which a little searching might turn up."; Option -> -> -> "How do I signal what piece to play?" with description "If you sing a song or play a piece of your own, it might give the musicians some more definite direction."; Option -> -> -> "What did this accomplish?" with description "Not everything in the room is the same as it was earlier, and the differences may hint at what's going on."; Menu -> -> "Hints: The Mural"; Option -> -> -> "What can I do with the mural?" with description "If you've figured out the mysteries of the gong, you should indeed be able to go where the mural says you can go, strange as it may be."; Option -> -> -> "Okay, I went in. How do I get out?" with description "Just as the mural revealed another passageway, the tapestries, if examined, suggest a way out."; Option -> -> -> "What's the purpose of this place?" with description "Have you searched the room for hints both mythological and substantial?"; Option -> -> -> "What's up with the lantern?" with description "With its starry qualities, you may find it useful in another location that looks for a guidestar, if you've run into it."; Menu -> -> "Hints: The Banquet"; Option -> -> -> "What are the chopsticks for?" with description "One of the garden's central puzzles may suggest an offbeat use for chopsticks; you may also find a use for them in handling the bones."; Option -> -> -> "What can I do about the bones?" with description "The wrongness of the bones may have to be remedied by righting the wrongness of the entire banquet arrangement. You may also find a use for chopsticks here."; Option -> -> -> "What does the banquet signify?" with description "You may wish to examine the arrangement more closely to get an idea of what's going on."; Option -> -> -> "Why can't I go downstairs?" with description "Guiding-stars will be necessary, and the banquet arrangement itself suggests a problem to be remedied. The sky will probably be best approached from the uppermost floor of the tower, if you can find a way to view it."; Option -> -> -> "How do I find a guiding-star?" with description "Wind might show you the way, if you could find it. The mysteries of the garden, if you haven't untangled them already, hold some clues in this direction. Alternately, the Silent Symphony may lead you to an another source of light."; Option -> -> -> "How do I rearrange the banquet?" with description "If you've viewed the constellations, ARRANGE CONSTELLATIONS AS (constellation of your choice) or SET ARRANGEMENT TO (constellation of your choice) will do the trick. Afterward you'll find that you are able to go downstairs."; Menu -> -> "Hints: The Hall of Hawks"; Option -> -> -> "Is there anything in this room?" with description "Other than yourself and the things you bring with you, not really. The symbolism of the place may become apparent to you with reflection, if it isn't already."; Option -> -> -> "How do I go through the southern passageway?" with description "The shadow ~fissure~ in the light beyond may suggest to you something else you have seen that is sundered."; Option -> -> -> "What must I do in order to deal with the shadow?" with description "You will find that certain actions involving the porcelain mask (you did bring it, didn't you?) are now possible, where they were not before."; Option -> -> -> "Why can't I leave?" with description "You should always be able to go up from the Hall of Hawks, unless some drastic bug has intervened. There is also a way to go south, depending on what you do with the mask."; !======================================================================== ! Object classes Class Room has light; Class Furniture with before [; Take,Pull,Push,PushDir: print_ret (The) self, " already has a place in the world's reckoning."; ], has static supporter; Class Tapestry with before [; Take: print_ret "The woven strands are part of the tapestry."; Attack,Cut: print_ret "In one of your earliest battles, you saw a temple plundered by soldiers intoxicated by victory. You hope never to see such a thing again."; CutWith: if (shadow_dagger in player) print_ret "In one of your earliest battles, you saw a temple plundered by soldiers intoxicated by victory. You hope never to see such a thing again."; else print_ret "An improbable way to cut anything."; Touch: print_ret "The tapestry's weave is tight and even."; ], has scenery; Class Screen with before [; Take: print_ret "The screens and their pictures are fitting to the room as they are."; Attack,Cut: print_ret "This thought of vandalism brings back an uneasy memory: Your brother once came back from a military campaign with screens of gold and cloth; you remember the blood upon the screens' corners, for all they were otherwise unmarred."; CutWith: if (shadow_dagger in player) print_ret "This thought of vandalism brings back an uneasy memory: Your brother once came back from a military campaign with screens of gold and cloth; you remember the blood upon the screen's corners, for all that they were untouched otherwise unmarred."; else print_ret "An improbable way to cut anything."; Touch: print_ret "Stiff paper, slightly rough to the touch."; ], has scenery pluralname; Class Intangible with before [; Taste,Smell,Listen,Touch,Take,Attack,Cut,CutWith,Search, Push,Pull,PushDir: print_ret "Improbable, despite the claims of certain scholars."; ], has scenery; Class Shadow with before [; Taste,Smell,Listen,Touch: print_ret "Too elusive for you to gain anything but a fleeting impression, unclassifiable except perhaps in the twilights of waking."; Take: print_ret "If you could call the shadows to your hand, you would be a greater general than you are."; Attack: print_ret "You would do more damage to yourself than the shadows."; Cut: if (shadow_dagger in player) print_ret "Shadows are not so substantial that you can cut them, no matter what blade you carry."; else print_ret "Even if you had a blade, you would have little success."; CutWith: if (second == shadow_dagger) print_ret "Shadows are not so substantial that you can cut them, no matter what blade you carry."; else print_ret "That seems an unlikely way to cut anything, let alone a shadow."; ], has scenery; !======================================================================== ! The game objects !------------------------------------------------------------------------ ! The moonlit chamber: uppermost in the tower, in which you begin. Room moon_room "Moonlit Chamber" with description [; print "Moonlight diffuses through the walls, tracing out unreadable sigils in calligraphies of light and dark. "; if (paper_kite.flown == true) print "Upwards, the sky is open to your eyes. "; if (lantern in player) print "The lantern brightens slightly, like a star as the night grows deeper. "; print_ret "Stairs adorned with bas-relief motifs spiral downward."; ], before [; LookUp: if (paper_kite.flown == true) { table_constellations.sky_seen = true; print_ret "The night spreads her wings above you, and shows no sign of welcoming her sister of the sunborn day. Constellations jewel the sky, half-hidden by clouds like nestling feathers: the Heavenly Horse and the Imperial Chrysanthemum."; } Touch: print_ret "The weight of armor is like the weight of obligation; the silk, like desire unfed."; Jump: print_ret "Your armor clatters as you land."; Listen: if (noun == 0) print_ret "Only the sandglass of your breathing, here."; Smell: print_ret "If moonlight had a fragrance, clear and ineffable, perhaps this would be it."; Sing: print_ret "A phrase of melody comes to you: an old court air."; Xyzzy: print_ret "(Meep!)"; ], daemon [; if (paper_kite.flown == true && location == self) { print "^Wind flings itself up the walls and toward the sky; you have but to look up.^"; StopDaemon(self); } ], d_to armory_room, u_to [; if (paper_kite.flown == true) print_ret "You are no magician to soar like the summer crane or the autumn hawk, and away into the waiting sky."; else print_ret "You are no magician to soar like the summer crane or the autumn hawk, and in any case, the blue-painted rafters arch above you to a remote and unassailable peak."; ], cant_go "The walls confine you as surely as the skeleton constrains the flesh, or the sheath constrains the sword."; Object easter_egg "easter egg" moon_room with name 'easter' 'egg', description "(Is it not nifty?)", before [; Attack,Touch,Open,Take,Push,PushDir: move self to unroom; print_ret "(The egg cracks open to reveal a chirping bird-dragon creature that cries, ~Aylee! Aylee!~ before disappearing.^^ The egg is no longer to be seen.)"; Search: print_ret "(It's only a mimesis-breaking egg. Honest. )"; ], has scenery; Intangible moon_light "moonlight" moon_room with name 'light' 'moonlight' 'illumination' 'sigil' 'sigils' 'calligraphy' 'calligraphies' 'characters' 'letters', description "A curious thing, that the walls' stones should admit moonlight. A half moon, you think, from the level of illumination: a moment's memory suggests nights spent campaigning beneath open sky, but is soon gone."; Intangible moon_dark "darkness" moon_room with name 'dark' 'darkness' 'shadow' 'shadows', description "To your eyes the darkness brings a certain greater clarity than the moonlight, limning the stones' past: they have long formed the walls of this--tower, you know now."; Intangible celestia "sky" moon_room with name 'sky' 'moon' 'stars' 'star' 'cloud' 'clouds' 'heavens' 'zodiac' 'night', description [; if (paper_kite.flown == true) { table_constellations.sky_seen = true; print_ret "The night spreads her wings above you, and shows no sign of welcoming her sister of the sunborn day. Constellations jewel the sky, half-hidden by clouds like nestling feathers: the Heavenly Horse and the Imperial Chrysanthemum."; } else print_ret "Alas, all around you lies stone, and the sky lies beyond your reach or your vision."; ]; Object moon_stones "stones" moon_room with name 'wall' 'walls' 'stone' 'stones' 'rock' 'rocks' 'mortar', description "The stones are of no kind you remember seeing before, though surely you would remember their peculiar light-admitting properties.", before [; Attack: print_ret "You hardly scar the stones."; Touch: print_ret "When you touch the stones of the walls, they have no more texture than glass, silk, steel, a hundred surfaces you knew in past years, yet none that ever presented themselves with the face of stone."; ], has scenery pluralname; Furniture marble_stairs "stairs" with name 'stairs' 'staircase' 'stair' 'step' 'steps' 'alabaster' 'marble' 'fingerprint' 'fingerprints' 'symbol' 'symbols', description "Each step is carved upon the side in bas-relief, though the design is abstract.", before [; Take: print_ret "The mass of marble withstands your attempts."; Touch: print_ret "Cool and smooth, save where the bas-relief interrupts the surface that your fingers meet."; ], found_in moon_room armory_room, has scenery pluralname enterable; Object bas_relief "bas-relief" marble_stairs with name 'bas-relief' 'bas' 'relief' 'carving' 'design' 'abstract', description "Like fingerprints cast upon paper by a careless calligrapher, though you cannot read the symbols, if symbols they are.", found_in moon_room armory_room, before [; Touch: print_ret "The relief's edges are still crisp, undiluted by the wearing hands of time."; ], has scenery; Object half_mask "porcelain mask" moon_room with name 'half' 'mask' 'porcelain' 'masque' 'celadon' 'face', invent "half a porcelain mask", description "The half-mask is the pale, almost bluish color of the finest celadon, cracked with uncanny precision down its axis of symmetry. The face in its blank, sculpted features has no more personality than new-forged steel. Half a mask, though--that must mean the left half is--", seen false, ! whether this has been examined or not before [; Attack: if (player in hawk_room && hawk_room.tried_south == true) { move self to unroom; ! the player's done with this hawk_room.unmasked = true; hawk_room.masked = false; player.description = "The weight of armor, the breath of silk, and now the strangeness of flesh, fully freed from its prison of porcelain, from now until the end of your story."; print "Suddenly and terribly inspired by the shadowed passage to the south, you smash the half-mask upon your "; style underline; print "own"; style roman; print_ret " face. The pain nearly blinds you. When you can see again, both halves of the mask are gone--and the passageway stands open, free of shadow."; } else print_ret "This mask shattered once, and only once, in a terrible clean fracture."; Touch: print_ret "Save for the jagged edge, the mask is cool and glazed-smooth."; Smell: print_ret "Though porcelain should have no fragrance, the mask smells faintly of plum blossoms."; Wear: if (player in hawk_room && hawk_room.tried_south == true) { move self to unroom; ! player's done with this move hawk_dark to hawk_room; hawk_room.unmasked = false; hawk_room.masked = true; ! the door_room is now closed to the player player.description = "The weight of armor, the breath of silk, and now the chill perfection of porcelain that serves you as a face, and shall forevermore."; hawk_room.description = "Hawks painted in gold and brown soar along the walls. It is strangely warm here, as though fires lived just beyond your perception. The entire hall is open and unobstructed except by your presence."; print_ret "Suddenly and disturbingly inspired by the riven passage to the south, you lift the mask to your face, momentarily shadowing your vision. When you can see clearly again, the mask has been rejoined flawlessly--and the shadows close around the passageway. Yours is the dragon's perfection, the dark journey skyward, as you have chosen."; } else { if (self.seen == false) { print_ret "Your hands play along its edge, but you see no obvious way of putting it on: no ribbon or hood, no scars--^^ Scars?"; } else { print_ret "The thought of putting this mask on suggests to you a disturbing question: how long have you been wearing porcelain as a face?"; } } Examine: if (self.seen == false) { self.seen = true; player.description = "The weight of armor and the breath of silk are familiar. Your face, though--when you reach up, it is porcelain that meets your touch on the left side, and you cannot remove it, though neither does it impede your senses. It seems the left half is a part of you, perhaps no more a mask than a hand is a glove..."; } ]; !------------------------------------------------------------------------ ! The shadow armory: on the 2nd floor (we're counting from the top) ! An antithesis of sight Room armory_room "Shadow Armory" with description [; if (self hasnt visited) { print "Shadows gather around you. For a moment, dregs of light defined by the negative space take on the shapes of maple leaf, kite, comb, and other shapes that flicker across the walls too rapidly for you to interpret.^^"; } if (lantern in player) print "The lantern seems to have no effect on the shadows that reside here, which remind you of long nights standing sentry, straining your eyes against the darkness.^^"; print_ret "Curiously, the only weapons here live amid light and cannot be worn: they are silhouettes flung against the walls. Stairs carved with bas-reliefs spiral upward.^^ Northward and westward lie passageways unhindered by door or folding screen."; ], shapes_seen false, ! keeps track of first time visiting room before [; Listen: if (noun == 0) print_ret "The far-off clamor of steel against steel, wood upon bone, suggests itself; but when you listen more closely, it bears an unsettling resemblance to the sounds of your boots, the clink of your armor, the movements of your joints."; Jump: print_ret "Your armor clatters as you land."; Smell: print_ret "The tang of oil and blood are by no means pleasant, but they awaken deep wellsprings of familiarity."; Sing: print_ret "You hum quietly, a tune that even you would have difficulty naming."; Xyzzy: print_ret "(What did you expect, Stormbringer?)"; ! this ensures the 3 shapes can only be seen the first time ! the player is in this room Go: if (self.shapes_seen == false) { self.shapes_seen = true; remove light_shapes; remove light_leaf; remove light_kite; remove light_comb; print "The shapes of light you saw as you entered fade irrevocably.^^"; } ], daemon [; if (paper_kite.flown == true && location == self) { print "^A wind gallops toward the stairs, seeking the sky.^"; StartDaemon(moon_room); StopDaemon(self); } ], u_to moon_room, n_to garden_room, w_to music_room, cant_go "You are not a thing of light and shadow, to pass through things substantial with sightless ease."; Intangible armory_light "light" armory_room with name 'light' 'illumination', description "Here the light, apparently sourceless, adirectional, takes on a burnished quality."; Object armory_stones "stones" armory_room with name 'wall' 'walls' 'stone' 'stones' 'rock' 'rocks' 'mortar', description "Here the stones are pale and lusterless, bland to the eye.", before [; Touch: print_ret "Cold and faintly grained."; Smell: print_ret "Dry and almost odorless, with no transgression of mildew or fungus."; ], has scenery pluralname; Intangible light_shapes "shapes" armory_room with name 'dreg' 'dregs' 'shape' 'shapes' 'triad' 'negative' 'space' 'spaces', description "Traced in light are leaf, comb, kite: a strange triad.", has pluralname; Intangible light_leaf "maple leaf" armory_room with name 'leaf' 'leaves' 'maple', description "Autumn is the maple's season, when all things die but fire and sun, pine and moon, last guardians before the door into winter and winter's snowlocked court. Once you knew a dark-haired woman who always wore red, gold and black, the maple's colors, even at the emperor's winter court, steadfast against the encroaching fashions of indigo or palest blue. She had a low ironic laugh, but she is lost to you.... ^^ Here, surrounded by stone, shadow, light, there is no indication of the season."; Intangible light_kite "kite" armory_room with name 'kite', description "There should be two kites, not one: brothers and sisters fly them as pairs during the kite-fighting auguries of spring. Alas, no wind stirs in this dustless place."; Intangible light_comb "comb" armory_room with name 'comb' 'hairpiece' 'teeth' 'tooth', description "The comb has the curved, tortoise-shell shape that you have seen in years past--but is one of the teeth broken?"; Shadow armory_shadows "shadow weapons" armory_room with name 'shadow' 'shadows' 'silhouette' 'silhouettes' 'walls' 'walls' 'weapon' 'weapons' 'dark' 'darkness', description [; print "Weapons line the walls, writ in shadow--yet you know their heft and balance, the patterns of movement that make one deadly in attack and another impenetrable in defense. If only you knew, as well, the histories of blood, patronage and betrayal--or loyalty--that they represent.^"; if (shadow_dagger hasnt moved) print_ret "^One of the weapons is more substantial than you realized at first, a bronze-hilted dagger with a tassel hanging from the pommel."; else return true; ], has pluralname; Object shadow_dagger "bronze-hilted dagger" armory_room with name 'dagger' 'blade' 'knife' 'bronze-hilted', description "Such daggers rarely leave the hands of the justiciars who wield them as their symbol of office. A white tassel hangs from the pommel of the hilt.", add_to_scope shadow_dagger_pommel shadow_dagger_tassel, before [; Take: give self ~concealed; return false; Attack,Cut,CutWith: print_ret "Surely not."; Touch: print_ret "Cold and sharp, like certain smiles."; Wear: print_ret "A justiciar's dagger, and your rank and position are other than this."; ], has concealed; Object shadow_dagger_pommel "tasseled pommel" shadow_dagger with pname '.x' 'tasseled' '.x' 'strand' '.x' 'strands' '.x' 'silk' 'pommel' 'hilt' 'bronze' 'bronze-hilted' 'hilted', description "The hilt's lack of ornamentation is itself ornamental. The silken strands are white, for death. The justiciar's last resort, someone said to you once--or did you say it?", before [; Take: print_ret "It is inseparable from the dagger."; Touch: print_ret "The pommel is comfortably weighted, and the strands flow through your fingers like wings."; Attack: print_ret "That would show little respect for either the justiciar or the craftmanship."; Cut,CutWith: print_ret "Surely not."; ], has scenery; Object shadow_dagger_tassel "white tassel" shadow_dagger with pname '.x' 'white' 'tassel', description "The silken strands are white, for death. The justiciar's last resort, someone said to you once--or did you say it?", before [; Tie: if (second == paper_kite) { print_ret "You would rather keep this tassel intact, in memory of the justiciar, but perhaps you could find another one."; } Take: print_ret "It is inseparable from the dagger."; Touch: print_ret "The strands flow through your fingers like wings."; Attack: print_ret "That would show little respect for either the justiciar or the craftmanship."; Cut,CutWith: if (garden_fan in player) print_ret "The fan's blue tassel may serve you better."; else print_ret "An unlikely proposition."; ], has scenery; ! The code for the marble_stairs is in the moon_room. !------------------------------------------------------------------------ ! The undying garden: on the 2nd floor (counting from the top) ! An antithesis of scent Room garden_room "Undying Garden" with description [; switch (garden_compass.season) { 'spring': print "Spring's blossoms and budding trees are here in profusion. "; 'summer': print "Summer's heady blooms are much in evidence. "; 'autumn': print "Autumn's fiery colors are evident in the trees and flowers around you. "; 'winter': print "Barren branches and pines suggest winter's quiet. "; default: print "Trees and flowers before you, none of them living, though they are arranged by the principles of geomancy. "; } if (lantern in player) print "Your lantern gives the chamber a quality of sharp angles at odds with the careful arrangements. "; print_ret "Metal and wood, painted and sculpted, the false garden is heedless of harvest, drought or rain.^^ A jade compass rests at the garden's metaphysical center, between translucence and opacity, curve and line, and other dichotomies too subtle for your eye. A gentle warmth from the surface invites touch.^^ Transactions of light show other rooms southward and westward."; ], before [; Jump: print_ret "Your armor clatters as you land."; Listen: if (noun == 0) print_ret "A faint stirring of leaves and trickling water, a poem whispered to a lover's ears..."; Smell: print_ret "A thousand small fragrances of flowers that rarely bloom in the same season, as though the year's bounty were compressed into a single sealed moment, and no matter that nothing living grows here."; Sing: print_ret "A hundred poems set to music suggest themselves to you, an evening's pastime among friends and lovers. It is with difficulty that you choose one, and too soon it is done."; Xyzzy: print_ret "(No Garden of Unearthly Delights, alas.)"; ], s_to armory_room, w_to banquet_room, cant_go "You are no vine, to wear away stone through the patient vegetable work of twining stem and clinging root."; Intangible garden_light "light" garden_room with name 'light' 'illumination' 'cloud' 'clouded', description "The light has a clouded quality, as though filtered by dreams."; Intangible garden_dark "darkness" garden_room with name 'dark' 'darkness' 'shadow' 'shadows', description "The shadows beneath tree and flower shift slightly with their rustling."; Object tortoise_comb "tortoise-shell comb" garden_room with name 'tortoise' 'shell' 'tortoise-shell' 'comb', invent "a lady's tortoise-shell comb", description "The comb is curved like a smile, though it seems fragile, easily broken by a chance hand.", comb_broken false, before [; Wear: print_ret "Surely it is meant to be worn by a lady."; Touch,Play: if (player in music_room) { music_room.song_sung = true; print_ret "The teeth make a faint, almost musical plucking sound as you run your thumb down the comb. In response, you hear a woman's soft sigh, then the businesslike cacophony of instruments being tuned to a new mode."; } else print_ret "The teeth make a faint, almost musical plucking sound as you run your thumb down the comb."; Attack: if (self.comb_broken == false) { self.comb_broken = true; self.description = "The comb is curved like a smile with long, slender teeth, three of which have been broken off."; move comb_teeth to player; ! in the unroom self.invent = "a lady's tortoise-shell comb (broken)"; print_ret "Three of the long central teeth flex, then snap in your fingers. The justiciar wore a comb long-broken as a memento; it proved an uneasy prophecy of waking passion and breaking promises."; } else print_ret "The teeth you broke off already should suffice for your purposes."; ]; Object garden "garden" garden_room with name 'garden' 'gardens' 'geomancy' 'paint' 'painted' 'sculpt' 'sculpted' 'metal' 'wood' 'plant' 'plants', description "This garden is fantastical indeed. How many artisans spent their hours striving to evoke the luster of life in lifeless media--and why?", before [; Attack: print_ret "A barbarian's act, not a soldier's. Nevertheless, you think of your brother the last time you met, crushing blossom and branch in his hands without even looking at them, or at you."; Touch: print_ret "The mechanism that drives the garden is too cleverly concealed for you to discover."; Take: print_ret "You would have better success trying to move the tower--a hopeless endeavor."; ], has scenery; Object winter_flowers "unliving flowers" garden_room with name 'flower' 'flowers' 'bloom' 'blooms' 'blossom' 'blossoms' 'bud' 'buds' 'petal' 'petals' 'frost', description "The faded petals shimmer as though frost-touched.", before [; Touch: print_ret "Even the artificers who created this garden could not give these blossoms a petal's velvet texture."; Attack: print_ret "It would be an affront to the artisans."; Take: print_ret "Even were the flowers real, they would be too withered."; CutWith: if (second == shadow_dagger) print_ret "Even were the flowers real, they would be too withered."; else print_ret "That seems an unlikely way to cut anything."; ], has scenery pluralname; Object winter_trees "unliving trees" garden_room with name 'tree' 'trees' 'evergreen' 'evergreens' 'pine' 'pines' 'barren' 'branch' 'branches', description "The trees are leafless, except the evergreens that nestle in silent serenity.", before [; Touch,Attack: print_ret "Despite their seeming frailty, they yield no more to your hand than ice under a fingerfall of snow."; CutWith: if (second == shadow_dagger) print_ret "Despite their apparent frailty, they yield no more to your blade than ice under a fingerfall of snow."; else print_ret "That seems an unlikely way to cut anything."; Climb: print_ret "You are not certain they would bear your weight."; ], has scenery pluralname; ! You can set the compass to one of four possibilities, ! each of which is associated with one of the four seasons, ! i.e. garden_compass.season ! Not only does this interact niftily with the garden_trees ! and garden_flowers, it allows niftier kite-flying opportunities. ! The code for switching the seasonal trees and flowers out is ! more awkward than I'd like, but it's the only method I've found ! that actually compiles (with the correct behavior). Furniture garden_compass "jade compass" garden_room with name 'jade' 'compass', season 'winter', fan_shown false, ! the garden_fan only appears on the compass ! in summer (crane) if it hasn't been ! taken or moved already by the player. leaf_shown false, description [; print "The compass is carved from a single piece of jade in which violet and green intermingle delicately; the cardinal directions--if such they be--are marked by hawk, swallow, crane and feather. More curiously still, the needle is of glass, suggesting that it homes to something other than the north. Perhaps you can set it yourself?^^"; switch (self.season) { 'autumn': print_ret "The needle points to the hawk."; 'winter': print_ret "The needle points to the feather."; 'spring': print_ret "The needle points to the swallow."; 'summer': print_ret "The needle points to the crane."; default: print_ret "(Error in setting the compass. Please report.)"; } ], before [ w1 num ; SetTo: wn = consult_from; w1 = NextWord(); if (consult_words == 0) { num = random(4); print "You spin the needle, which settles at a random position. "; switch (num) { 1: self.season = 'autumn'; 2: self.season = 'winter'; 3: self.season = 'spring'; 4: self.season = 'summer'; default: print_ret "The needle spins aimlessly, then settles back where it was."; } } if (consult_words == 1 && (w1 == 'hawk' || w1 == 'feather' || w1 == 'swallow' || w1 == 'crane' || w1 == 'it')) { switch (w1) { 'hawk': self.season = 'autumn'; 'feather': self.season = 'winter'; 'swallow': self.season = 'spring'; 'crane': self.season = 'summer'; 'it': switch (PronounValue('it')) { compass_hawk: self.season = 'autumn'; compass_crane: self.season = 'summer'; compass_feather: self.season = 'winter'; compass_swallow: self.season = 'spring'; default: print_ret "You might try setting the compass to one of the four symbols upon it."; } default: print_ret "(This is a bug. Please report...)"; } } else print_ret "You might try setting the compass to one of the four symbols upon it."; switch (self.season) { 'autumn': move autumn_trees to garden_room; move autumn_flowers to garden_room; move winter_trees to unroom; move winter_flowers to unroom; move spring_trees to unroom; move spring_flowers to unroom; move summer_trees to unroom; move summer_flowers to unroom; if (garden_fan hasnt moved && self.fan_shown == true) { self.fan_shown = false; move garden_fan to unroom; } if (garden_leaf hasnt moved && leaf_paper hasnt moved) { self.leaf_shown = true; move garden_leaf to autumn_trees; } print "The needle points to the hawk now. "; 'winter': self.leaf_shown = false; move winter_trees to garden_room; move winter_flowers to garden_room; move spring_trees to unroom; move spring_flowers to unroom; move summer_trees to unroom; move summer_flowers to unroom; move autumn_trees to unroom; move autumn_flowers to unroom; if (garden_fan hasnt moved && self.fan_shown == true) { self.fan_shown = false; move garden_fan to unroom; } if (self.leaf_shown == true) { self.leaf_shown = false; if (garden_leaf hasnt moved) move garden_leaf to unroom; if (leaf_paper hasnt moved) move leaf_paper to unroom; } print "If only you could change time so readily. The needle points to the feather now. "; 'spring': self.leaf_shown = false; move spring_trees to garden_room; move spring_flowers to garden_room; move summer_trees to unroom; move summer_flowers to unroom; move autumn_trees to unroom; move autumn_flowers to unroom; move winter_trees to unroom; move winter_flowers to unroom; if (garden_fan hasnt moved && self.fan_shown == true) { self.fan_shown = false; move garden_fan to unroom; } if (self.leaf_shown == true) { self.leaf_shown = false; if (garden_leaf hasnt moved) move garden_leaf to unroom; if (leaf_paper hasnt moved) move leaf_paper to unroom; } print "The needle points to the swallow now. "; 'summer': move summer_trees to garden_room; move summer_flowers to garden_room; move autumn_trees to unroom; move autumn_flowers to unroom; move winter_trees to unroom; move winter_flowers to unroom; move spring_trees to unroom; move spring_flowers to unroom; if (self.leaf_shown == true) { self.leaf_shown = false; if (garden_leaf hasnt moved) move garden_leaf to unroom; if (leaf_paper hasnt moved) move leaf_paper to unroom; } if (garden_fan hasnt moved) { self.fan_shown = true; move garden_fan to garden_compass; print "A tasseled fan appears upon the compass' surface. "; } print "The needle points to the crane now. "; default: print_ret "(This is a bug in the compass/needle code. Please report.)"; } print_ret "You hear a clear chiming sound as the garden's trees and flowers move subtly, obedient to this new season."; Set: num = random(4); print "You spin the needle, which settles at a random position. "; switch (num) { 1: self.season = 'autumn'; 2: self.season = 'winter'; 3: self.season = 'spring'; 4: self.season = 'summer'; default: print_ret "The needle spins aimlessly, then settles back where it was."; } switch (self.season) { 'autumn': move autumn_trees to garden_room; move autumn_flowers to garden_room; move winter_trees to unroom; move winter_flowers to unroom; move spring_trees to unroom; move spring_flowers to unroom; move summer_trees to unroom; move summer_flowers to unroom; if (garden_fan hasnt moved && self.fan_shown == true) { self.fan_shown = false; move garden_fan to unroom; } if (garden_leaf hasnt moved && leaf_paper hasnt moved) { self.leaf_shown = true; move garden_leaf to autumn_trees; } print "The needle points to the hawk now. "; 'winter': self.leaf_shown = false; move winter_trees to garden_room; move winter_flowers to garden_room; move spring_trees to unroom; move spring_flowers to unroom; move summer_trees to unroom; move summer_flowers to unroom; move autumn_trees to unroom; move autumn_flowers to unroom; if (garden_fan hasnt moved && self.fan_shown == true) { self.fan_shown = false; move garden_fan to unroom; } if (self.leaf_shown == true) { self.leaf_shown = false; if (garden_leaf hasnt moved) move garden_leaf to unroom; if (leaf_paper hasnt moved) move leaf_paper to unroom; } print "If only the seasons of men changed so readily; you could spin them back and change the unchangeable. The needle points to the feather now. "; 'spring': self.leaf_shown = false; move spring_trees to garden_room; move spring_flowers to garden_room; move summer_trees to unroom; move summer_flowers to unroom; move autumn_trees to unroom; move autumn_flowers to unroom; move winter_trees to unroom; move winter_flowers to unroom; if (garden_fan hasnt moved && self.fan_shown == true) { self.fan_shown = false; move garden_fan to unroom; } if (self.leaf_shown == true) { self.leaf_shown = false; if (garden_leaf hasnt moved) move garden_leaf to unroom; if (leaf_paper hasnt moved) move leaf_paper to unroom; } print "The needle points to the swallow now. "; 'summer': move summer_trees to garden_room; move summer_flowers to garden_room; move autumn_trees to unroom; move autumn_flowers to unroom; move winter_trees to unroom; move winter_flowers to unroom; move spring_trees to unroom; move spring_flowers to unroom; if (self.leaf_shown == true) { self.leaf_shown = false; if (garden_leaf hasnt moved) move garden_leaf to unroom; if (leaf_paper hasnt moved) move leaf_paper to unroom; } if (garden_fan hasnt moved) { self.fan_shown = true; move garden_fan to garden_compass; print "A tasseled fan appears upon the compass' surface. "; } print "The needle points to the crane now. "; default: print_ret "(This is a bug in the compass/needle code. Please report.)"; } print_ret "You hear a clear chiming sound as the garden's trees and flowers move subtly, obedient to this new season."; Touch: print_ret "It is oddly warm, with a frantic rapid heartbeat despite its status as stone."; Attack,Cut: print_ret "Jade is a stone with spiritual and physical virtue; you would be remiss in damaging it."; CutWith: if (second == shadow_dagger) print_ret "Jade is a stone with spiritual and physical virtue; you would be remiss in damaging it."; else print_ret "That seems an unlikely way to cut anything."; Climb: print_ret "You would look absurd perched upon that small surface."; ], add_to_scope compass_hawk compass_feather compass_swallow compass_crane, has scenery; Object compass_needle "glass needle" garden_compass with name 'glass' 'needle', description "The needle glints from its position upon the compass.", before [ w1 num; SetTo: wn = consult_from; w1 = NextWord(); if (consult_words == 0) { num = random(4); print "You spin the needle, which settles at a random position. "; switch (num) { 1: garden_compass.season = 'autumn'; 2: garden_compass.season = 'winter'; 3: garden_compass.season = 'spring'; 4: garden_compass.season = 'summer'; default: print_ret "The needle spins aimlessly, then settles back where it was. "; } } if (consult_words == 1 && (w1 == 'hawk' || w1 == 'feather' || w1 == 'swallow' || w1 == 'crane' || w1 == 'it')) { switch (w1) { 'hawk': garden_compass.season = 'autumn'; 'feather': garden_compass.season = 'winter'; 'swallow': garden_compass.season = 'spring'; 'crane': garden_compass.season = 'summer'; 'it': switch (PronounValue('it')) { compass_hawk: garden_compass.season = 'autumn'; compass_crane: garden_compass.season = 'summer'; compass_feather: garden_compass.season = 'winter'; compass_swallow: garden_compass.season = 'spring'; default: print_ret "You might try setting the compass to one of the four symbols upon it."; } default: print_ret "(This is a bug. Please report...)"; } } else print_ret "You might try setting the compass to one of the four symbols upon it."; switch (garden_compass.season) { 'autumn': move autumn_trees to garden_room; move autumn_flowers to garden_room; move winter_trees to unroom; move winter_flowers to unroom; move spring_trees to unroom; move spring_flowers to unroom; move summer_trees to unroom; move summer_flowers to unroom; if (garden_fan hasnt moved && garden_compass.fan_shown == true) { garden_compass.fan_shown = false; move garden_fan to unroom; } if (garden_leaf hasnt moved && leaf_paper hasnt moved) { garden_compass.leaf_shown = true; move garden_leaf to autumn_trees; } print "The needle points to the hawk now. "; 'winter': garden_compass.leaf_shown = false; move winter_trees to garden_room; move winter_flowers to garden_room; move spring_trees to unroom; move spring_flowers to unroom; move summer_trees to unroom; move summer_flowers to unroom; move autumn_trees to unroom; move autumn_flowers to unroom; if (garden_fan hasnt moved && garden_compass.fan_shown == true) { garden_compass.fan_shown = false; move garden_fan to unroom; } if (garden_compass.leaf_shown == true) { garden_compass.leaf_shown = false; if (garden_leaf hasnt moved) move garden_leaf to unroom; if (leaf_paper hasnt moved) move leaf_paper to unroom; } print "If only the seasons of men changed so readily; you could spin them back and change the unchangeable. The needle points to the feather now. "; 'spring': garden_compass.leaf_shown = false; move spring_trees to garden_room; move spring_flowers to garden_room; move summer_trees to unroom; move summer_flowers to unroom; move autumn_trees to unroom; move autumn_flowers to unroom; move winter_trees to unroom; move winter_flowers to unroom; if (garden_fan hasnt moved && garden_compass.fan_shown == true) { garden_compass.fan_shown = false; move garden_fan to unroom; } if (garden_compass.leaf_shown == true) { garden_compass.leaf_shown = false; if (garden_leaf hasnt moved) move garden_leaf to unroom; if (leaf_paper hasnt moved) move leaf_paper to unroom; } print "The needle points to the swallow now. "; 'summer': move summer_trees to garden_room; move summer_flowers to garden_room; move autumn_trees to unroom; move autumn_flowers to unroom; move winter_trees to unroom; move winter_flowers to unroom; move spring_trees to unroom; move spring_flowers to unroom; if (garden_compass.leaf_shown == true) { garden_compass.leaf_shown = false; if (garden_leaf hasnt moved) move garden_leaf to unroom; if (leaf_paper hasnt moved) move leaf_paper to unroom; } if (garden_fan hasnt moved) { garden_compass.fan_shown = true; move garden_fan to garden_compass; print "A tasseled fan appears upon the compass' surface. "; } print "The needle points to the crane now. "; default: print_ret "(This is a bug in the compass/needle code. Please report.)"; } print_ret "You hear a clear chiming sound as the garden's trees and flowers move subtly, obedient to this new season."; Set: num = random(4); print "You spin the needle, which settles at a random position. "; switch (num) { 1: garden_compass.season = 'autumn'; 2: garden_compass.season = 'winter'; 3: garden_compass.season = 'spring'; 4: garden_compass.season = 'summer'; default: print_ret "The needle spins aimlessly, then settles back where it was."; } switch (garden_compass.season) { 'autumn': move autumn_trees to garden_room; move autumn_flowers to garden_room; move winter_trees to unroom; move winter_flowers to unroom; move spring_trees to unroom; move spring_flowers to unroom; move summer_trees to unroom; move summer_flowers to unroom; if (garden_fan hasnt moved && garden_compass.fan_shown == true) { garden_compass.fan_shown = false; move garden_fan to unroom; } if (garden_leaf hasnt moved && leaf_paper hasnt moved) { garden_compass.leaf_shown = true; move garden_leaf to autumn_trees; } print "The needle points to the hawk now. "; 'winter': garden_compass.leaf_shown = false; move winter_trees to garden_room; move winter_flowers to garden_room; move spring_trees to unroom; move spring_flowers to unroom; move summer_trees to unroom; move summer_flowers to unroom; move autumn_trees to unroom; move autumn_flowers to unroom; if (garden_fan hasnt moved && garden_compass.fan_shown == true) { garden_compass.fan_shown = false; move garden_fan to unroom; } if (garden_compass.leaf_shown == true) { garden_compass.leaf_shown = false; if (garden_leaf hasnt moved) move garden_leaf to unroom; if (leaf_paper hasnt moved) move leaf_paper to unroom; } print "If only the seasons of men changed so readily; you could spin them back and change the unchangeable. The needle points to the feather now. "; 'spring': garden_compass.leaf_shown = false; move spring_trees to garden_room; move spring_flowers to garden_room; move summer_trees to unroom; move summer_flowers to unroom; move autumn_trees to unroom; move autumn_flowers to unroom; move winter_trees to unroom; move winter_flowers to unroom; if (garden_fan hasnt moved && garden_compass.fan_shown == true) { garden_compass.fan_shown = false; move garden_fan to unroom; } if (garden_compass.leaf_shown == true) { garden_compass.leaf_shown = false; if (garden_leaf hasnt moved) move garden_leaf to unroom; if (leaf_paper hasnt moved) move leaf_paper to unroom; } print "The needle points to the swallow now. "; 'summer': move summer_trees to garden_room; move summer_flowers to garden_room; move autumn_trees to unroom; move autumn_flowers to unroom; move winter_trees to unroom; move winter_flowers to unroom; move spring_trees to unroom; move spring_flowers to unroom; if (garden_compass.leaf_shown == true) { garden_compass.leaf_shown = false; if (garden_leaf hasnt moved) move garden_leaf to unroom; if (leaf_paper hasnt moved) move leaf_paper to unroom; } if (garden_fan hasnt moved) { garden_compass.fan_shown = true; move garden_fan to garden_compass; print "A tasseled fan appears upon the compass' surface. "; } print "The needle points to the crane now. "; default: print_ret "(This is a bug in the compass/needle code. Please report.)"; } print_ret "You hear a clear chiming sound as the garden's trees and flowers move subtly, obedient to this new season."; Push: print_ret "You may be able to set or spin it instead."; Attack: print_ret "Glass is too fragile to withstand such treatment."; Cut: print_ret "You would hardly scratch the glass."; CutWith: if (second == shadow_dagger) print_ret "You would hardly scratch the glass."; else print_ret "That seems an unlikely way to cut anything."; Touch: print_ret "The needle is warmed slightly by the compass, though not warm by any means."; Take: print_ret "The needle has its place upon the compass."; ], has scenery; Object compass_hawk "hawk" garden_compass with name 'hawk' 'bird', description "It was autumn when last you went hawking with the emperor's justiciar. Freed of court robes, she soared as surely as the kestrel that raced before her; her hair was black and scandalously unbound as the red-and-gold ribbons tore away in the wind to land in your waiting hand. Autumn...", before [; Touch: print_ret "A faint suggestion of talon, tearing beak and a hunter's updraft of wind meet your fingers."; ], has scenery; Object compass_feather "feather" garden_compass with name 'feather', description "Even for the emperor's winter court, the only birds that remain in the gardens are the jeweled nightingales, which sing dainty mechanical tunes when they are stroked with a feather. Your brother hated them passionately, but he listened to them readily enough whenever the justiciar asked, with that smile that lit her eyes, though it never reached her mouth.", before [; Touch: print_ret "Almost, though it is carved in stone, you imagine the feather's vanes parting softly at your touch."; ], has scenery; Object compass_swallow "swallow" garden_compass with name 'swallow' 'bird', description "Spring is the swallows' season, when they return from their sojourn in distant lands and signal the kite-flying auguries. If only an augury could help you now...", before [; Touch: print_ret "You feel a faint tugging at your fingertips, like that of a wayward kite at the end of its string."; ], has scenery; Object compass_crane "crane" garden_compass with name 'crane' 'bird', description "The most auspicious of all birds, save the imperial phoenix. Many a summer morning have you gazed upon cranes in flight, whether silhouetted against the setting sun or set in abalone-shell upon a fine lacquered cabinet, a cloisonne hairpin.", before [; Touch: print_ret "A suggestion of moisture, as though a summer monsoon threatened."; ], has scenery; !------------------------------------------------------------------------ ! The Silent Symphony: on the 2nd floor (counting from the top) ! An antithesis of sound Room music_room "Silent Symphony" with description "A single bronze gong hangs from its wooden frame in the room's center. There are also silk cushions arranged around the floor in a court ensemble's traditional half-circle, but no bamboo flutes or clay ocarinas, nine-stringed zithers or singers' unfolding fans, are in evidence. A mural that touches each wall in turn gives the room an illusion of greater depth. ^^ Two entrances, one east, one north; the former is wrapped in shadow, the latter in light.", song_sung false, ! All you have to do is sing to give ! the orchestra its cue. season 'none', before [ w1; Jump: print_ret "Your armor clatters as you land."; Smell: print_ret "A vague fragrance, as of silks perfumed days ago by an unseen hand, but evoking no particular flower."; Listen: if (noun == 0) print_ret "Faint strains of a song that a man you once knew loved beyond all reason: a summer poem set to a summer tune. Yet the room is silent."; Sing: self.song_sung = true; switch (garden_compass.season) { 'autumn': self.season = 'autumn'; print_ret "It is an autumn's melancholy melody that comes to you, suggesting flying geese and the fallen leaf."; 'spring': self.season = 'spring'; print_ret "A composition for voice and flute comes to mind, celebrating the first forsythias and the roving winds."; 'winter': self.season = 'winter'; print_ret "A song at turns slow and swift, evoking the vagaries of winter storms."; 'summer': self.season = 'summer'; print_ret "Some perversity leads you to choose a summer poem set to a summer tune, in keeping with the season suggested by this room's trappings, or else with the inner seasons of your heart."; default: print_ret "It is a vague, wavering melody that comes to you, perhaps a reflection of your own uncertain status."; } Bathe: print_ret "If only the pond in the mural were real--alas."; Recite: wn = consult_from; w1 = NextWord(); switch (w1) { 'poetry': print_ret "(~When last you lingered by the burning city,^ When you saw my eyes were parched of pity,^ I thought that you surely should depart--^ I thought I no longer held your heart.~)"; 'poem': print_ret "(~Walk silently in the shadow of the sunrise,^ knowing the warmth of days, of words and whispers,^ shall never touch you again.~)"; 'sonnet': print_ret "(You're not Shakespeare. Sorry.)"; 'limerick': print_ret "(~Me, myself and I^ were discussing mimesis and pie.^ Though the first is now broken,^ myself has awoken^ to the virtues of me and I.~)"; 'haiku': print_ret "~will she wait for me?^ beneath the kites and blossoms^ dreamfall of dark hair~"; 'sijo': print_ret "(Hangul mot boida.)"; 'doggerel': print_ret "(~The dog went woof!^ and ran over the roof.~^ Well, you asked for it.)"; 'Poe': print_ret "(~Once upon a midnight dreary...~)"; default: print_ret "(You can come up with something better than that.)"; } Xyzzy: print_ret "(arirang norae)"; ], e_to armory_room, n_to banquet_room, ne_to [; if (bronze_gong.orchestra_played == true) return court_room; else return false; ], cant_go "Hunting horns, war drums, temple gongs, hawk's cry: these things travel through walls and air. You cannot."; Intangible music_light "light" music_room with name 'light' 'brightness' 'illumination', description "The light almost has a dappled quality, with rhythms like that of rippling water."; Intangible music_dark "darkness" music_room with name 'dark' 'darkness' 'shadow' 'shadows', description "The gong's shadow outweighs your own, here."; Object music_mural "mural" music_room with name 'wall' 'walls' 'stone' 'stones' 'mural', description "The mural shows court ladies whispering to each other in a garden; men kneel to float folded-paper poems down the brook for them to read.", before [; Touch,Take: print_ret "The walls seem to ripple at your touch, as though echoing the eddies and flow of a brook."; Attack,Cut: print_ret "The stones are only stones after all, despite the violence you would do them."; ], add_to_scope mural_ladies mural_lords mural_garden mural_poems, has scenery; Object mural_ladies "court ladies" music_mural with name 'court' 'lady' 'ladies' 'woman' 'women' 'fan' 'fans' 'silk' 'silks' 'garb', description "The ladies wear the fine trailing silks of summer court, and though their faces are all but hidden by their fans, the cant of their eyes suggests laughter.", before [; Touch,Take: print_ret "The walls seem to ripple at your touch, as though echoing the eddies and flow of a brook."; Attack,Cut: print_ret "The stones are only stones beneath the paint, despite the violence you would do them."; ], has scenery pluralname; Object mural_lords "court lords" music_mural with name 'court' 'lord' 'lords' 'man' 'men' 'poet' 'poets' 'somber' 'color' 'colors' 'expression' 'expressions', description "They wear somber colors in contrast to the ladies, though their expressions are amused rather than grave.", before [; Touch,Take: print_ret "The walls seem to ripple at your touch, as though echoing the eddies and flow of a brook."; Attack,Cut: print_ret "The stones are only stones beneath the paint, despite the violence you would do them."; ], has scenery pluralname; Object mural_garden "garden" music_mural with name 'garden' 'plant' 'plants' 'vegetation' 'lotus' 'brook' 'carp' 'fish' 'pond' 'water' 'summer' 'flower' 'flowers' 'blossom' 'blossoms', description "The garden is lushly painted with summer blossoms, and a brook leads down to a pond of lotus and leaping carp.", before [; Touch,Take: print_ret "The walls seem to ripple at your touch, as though echoing the eddies and flow of a brook."; Attack,Cut: print_ret "The stones are only stones beneath the paint, despite the violence you would do them."; ], has scenery; Object mural_poems "poems" music_mural with name 'folded' 'paper' 'poem' 'poems' 'poetry' 'verse' 'verses', description "The poems float serenely, in no danger of sinking. Whether they convey melancholy or merriness will remain forever the mural-painter's secret.", before [; Touch,Take: print_ret "The walls seem to ripple at your touch, as though echoing the eddies and flow of a brook."; Attack,Cut: print_ret "The stones are only stones beneath the paint, despite the violence you would do them."; ], has scenery pluralname; Object silk_cushions "silk cushions" music_room with name 'silk' 'cushion' 'cushions' 'seat' 'seats' 'summer' 'color' 'colors' 'dye' 'dyed', description "The cushions are dyed in summer colors and embroidered with gold thread. You remember finding your brother's terse poetry, written on a slip of pale paper, under such a cushion.", ocarina_found false, before [; Take: print_ret "Awkward to carry, and what use do you have for one now?"; Touch: print_ret "Musicians would take pleasure in the cushions' soft luxury."; Cut,Attack: print_ret "There is little reason to do this."; CutWith: if (second == shadow_dagger) print_ret "There is little reason to do this."; else print_ret "That seems an unlikely way to cut anything."; Search,LookUnder: if (self.ocarina_found == false) { self.ocarina_found = true; move clay_ocarina to player; print_ret "Beneath one of the cushions you find an ocarina, as though it had been left by a careless musician."; } else { print_ret "Other than the gold embroidery, you find no secrets hidden within or under the cushions."; } ], has pluralname supporter scenery enterable; Object cushion_embroidery "embroidery" silk_cushions with name 'embroidery' 'thread' 'stitch' 'stitchery' 'sewing' 'gold' 'design' 'designs' 'leaf' 'vine', description "Designs of leaf and vine adorn the cushions.", before [; Cut,Attack: print_ret "The stitchery is too fine for such treatment."; CutWith: if (second == shadow_dagger) print_ret "The stitchery is too fine for such treatment."; else print_ret "That seems an unlikely way to cut anything."; Touch: print_ret "The golden thread is slightly prickly to the touch."; ], has scenery; Object bronze_gong "bronze gong" music_room with name 'bronze' 'surface' 'gong' 'percussion' 'wooden' 'frame', description "The gong stands taller than a man, and its rim is etched with faint characters. The surface has no patina; there is no mallet with which to strike it and signal the absent musicians to begin.", orchestra_played false, before [; Attack,Play: print "It rings a sonorous note."; if (music_room.song_sung == false) print " A faint shiver of music fades, awaiting instruction as to the proper piece to play."; if (music_room.song_sung == true && self.orchestra_played == false) { self.orchestra_played = true; music_mural.description = "The mural shows court ladies reading folded-paper poems that they have just fished from the brook; men stand upstream, watching their faces. In the northeast, a passageway stands open to the court beyond."; mural_ladies.description = "The ladies wear the red and saffron silks of autumn court. Their faces are all but hidden by fans, though the cant of their eyes suggests smiles. One in particular draws your eye, for the tilt of her head seems familiar, but it is only a painting after all."; mural_lords.description = "They wear somber colors in contrast to the ladies, but their faces are open to the eye, more anxious than serene. The two men standing farthest from each other might be brothers."; move mural_brothers to music_room; mural_garden.description = "The garden is lushly painted with autumn flowers, centering on the imperial chrysanthemum, and a brook leads down to a pond of lotus and leaping carp."; move mural_chrysanthemum to music_room; mural_poems.description = "The poets' sentiments are written on sheets of paper in faded colors, but the details were known to the painter alone. You know poems of your own, though, written in past pain and longing."; switch (music_room.season) { 'autumn': print " In the delicate layering of sound you can hear the lutes, the plaint of flutes like the cries of wild geese. The music fades note by note, like the best of autumn nights. "; 'spring': print " Flutes and voices evoke the first and finest winds of spring as the heartbeat of a drum steadies the wild arpeggios. Like all winds, it dies away, leaving a silence deeper than stone. "; 'winter': print " Music ebbs and flows; the gong's rhythms underscore the spiraling storm of melody. It ends abruptly, leaving a crystalline quiet in its wake. "; 'summer': print " Despite the delicacy of the song on which the ensemble's playing is based, their version has martial overtones: the beat of drum and crash of gong, the metallic accompaniment of chimes from an unseen sistrum. You are left wondering whether it is a march or a poem you have heard. "; default: print " The ensemble plays for a curiously short span of time, leaving you no more satisfied than before. "; } print_ret "The mural appears to have shifted subtly, like a hand seen beneath the surface of water."; } else print_ret " In the end, nothing remains but silence."; Climb: print_ret "The frame is sturdy, but the gong's great mass gives you pause."; Touch: print_ret "At your touch, the gong thrums almost imperceptibly below the threshold of your hearing."; ], add_to_scope gong_rim, has scenery; Object gong_rim "rim" bronze_gong with name 'rim' 'etched' 'character' 'characters' 'writing' 'inscription', description "The characters upon the gong form a poem:^ lightning over water^ white wing thunder^ a heron's wild cry", before [; Attack: print_ret "The gong vibrates."; Touch: print_ret "The etchings are barely perceptible."; ], has scenery; !------------------------------------------------------------------------ ! The Court of Lanterns: on the 2nd floor (counting from the top) ! An antithesis of touch Room court_room "Court of Lanterns" with description "Lanterns hang from the ceiling in a constellation of soft and shining stars. Tapestries on the wall promise tales of splendor and grace, while folding screens partition the room, if incompletely, as they are no real barrier to eye or foot.", before [; LookUp: print_ret "The lanterns' arrangement puts you in mind of nights when you gazed up at the sky after a battle's end and the price of blood."; Smell: print_ret "The perfumes of past years, scents for every face and occasion. The justiciar's favourite was a blend dominated by plums, you remember."; Jump: print_ret "The formality of the setting makes you hesitate."; Listen: if (noun == 0) print_ret "Laughter, and the murmur of double-edged conversations, the flatteries and flamboyance of courtiers."; Sing: print_ret "You think of songs you could request, if you walked still in the world of silken smiles and hidden knives."; Xyzzy: print_ret "(Twinkle, twinkle, little...never mind.)"; ], sw_to music_room, cant_go "All things in the world have their constraints. You are no exception."; Intangible court_light "light" court_room with name 'light' 'illumination' 'glow' 'constellation' 'constellations' 'star' 'stars' 'moonlight', description "The lanterns' soft, starlike glow mingles uneasily with the cooler, paler moonlight."; Furniture folding_screens "folding screens" court_room with name 'folding' 'screen' 'screens' 'partition' 'partitions' 'paper' 'bamboo', lantern_found false, description "The screens are of paper over bamboo, and their arrangement seems intended to allow fleeting moments of privacy rather than to serve as any real barrier. The brushstroke paintings show cats frolicking among flowers and butterflies.^^ Before your parents died, you and your brother used to run among the screens as though they were a labyrinth, tripping over hems and searching for abandoned letters.", before [; Search,LookUnder: if (self.lantern_found == false) { self.lantern_found = true; move lantern to player; print_ret "Following the elusive smell of plum blossoms, you find a strangely insubstantial lantern half-fallen beyond one of the screens. It hovers near your shoulder like an errant star."; } else { print_ret "As you pass between the screens, you think you smell various and distinctive perfumes, but there is nothing more concealed among the screens."; } Climb: print_ret "Your mass would all but destroy the screens."; Attack,Cut: print_ret "This thought of vandalism brings back an uneasy memory: Your brother once came back from a military campaign with screens of gold and cloth; you remember the blood upon the screen's corners, for all they were otherwise unmarred."; CutWith: if (shadow_dagger in player) print_ret "This thought of vandalism brings back an uneasy memory: Your brother once came back from a military campaign with screens of gold and cloth; you remember the blood upon the screen's corners, for all that they were untouched otherwise unmarred."; else print_ret "An improbable way to cut anything."; Touch: print_ret "Stiff paper, slightly rough to the touch."; ], add_to_scope screen_cats screen_flowers screen_butterflies, has pluralname scenery; Screen screen_cats "cats" folding_screens, with name 'cat' 'cats' 'kitten' 'kittens' 'feline' 'felines', description "The justiciar had a cat like these, white and orange and black; it was a gift from the emperor himself, before she fell from his favor.", has pluralname; Screen screen_flowers "flowers" folding_screens, with name 'stylized' 'flower' 'flowers' 'blossom' 'blossoms', description "The blossoms are so stylized that you cannot recognize them as belonging to any particular plant. If you look at them too long, they began to resemble the strange, flower-like shapes of drops of blood spilled in the snow.", has pluralname; Screen screen_butterflies "butterflies" folding_screens, with name 'butterfly' 'butterflies' 'insect' 'insects', description "The butterflies are painted with bright and fanciful colors, like those on the cloisonne hairpins the justiciar, and other ladies of the court, liked to wear.", has pluralname; Object paper_lanterns "paper lanterns" court_room with name 'paper' 'lantern' 'lanterns', description "The lanterns are hung in an artful scattering, hinting at unseen constellations. Their glow is warmer than the moonlight slanting through the walls.", before [; Attack,Take,Push,Pull,PushDir,Touch: print_ret "They lie out of your reach, and the quality of the light they shed suggest that, even if you could reach them, they would be less substantial than morning dew."; ], has pluralname scenery; Object court_stones "stones" court_room with name 'stone' 'stones' 'wall' 'walls', description "Behind the tapestries' textile weight, the stones are pale as bone and snow, pale as a woman's white hand on a dagger's hilt.", before [; Touch,Take: print_ret "The stones are integral to the tower."; Attack, Cut: print_ret "Stone does not yield so easily."; ], has pluralname scenery; Tapestry court_tapestries "tapestries" court_room with name 'tapestry' 'tapestries' 'hanging' 'hangings' 'wall-hanging' 'wall-hangings' 'cloth' 'textile' 'textiles', description "The tapestries show, in no particular sequence, the legend of the Sun in hiding. The dragon and the phoenix, both brothers, see her where she hides: the dragon glories in the untamed sky while the phoenix sings to soothe the Sun, and at last carries her on his back to the waiting world.^^ As to why the Sun went into hiding, and the injury done to her--that is another tale.^^ Mysteriously, a passage is woven into the tapestries, suggesting that southwest lies a way out of the legend.", before [; Take: print_ret "The tapestries are far more fitting where they are than they would be in your hands."; Search,LookUnder: print_ret "Though you peer behind the tapestries, nothing is visible but stones."; ], add_to_scope tapestry_sun tapestry_sky tapestry_world tapestry_phoenix tapestry_dragon tapestry_symbols tapestry_passage, has pluralname; Tapestry tapestry_sun "Sun" court_tapestries with pname 'Sun' 'solar' 'nimbus', description "The weavers suggested the Sun's shape indistinctly within a nimbus of light.", has proper; Tapestry tapestry_sky "sky" court_tapestries with name 'sky' 'skies' 'heavens' 'night' 'storm' 'stormy' 'dawn' 'morning' 'morn', description "Night skies, stormy skies, and finally a sky blushing with the tints of dawn. They are all skies you have known, in your time, as has anyone who walked the world."; Tapestry tapestry_world "world" court_tapestries with name 'world' 'earth' 'season' 'seasons', description "The world in its seasons of moisture and aridity, darkness and light, is shown in distant, dreamy symbols."; Tapestry tapestry_symbols "symbols" court_tapestries with name 'symbol' 'symbols' 'maple' 'magpie' 'wave' 'wind' 'autumn', description "The weavers stayed within the bounds of tradition: here a maple to represent the autumn, there a magpie for luck and warning, a stylized wave, a hint of wind.", has pluralname; Tapestry tapestry_dragon "woven dragon" court_tapestries with pname '.x' 'woven' 'dragon' 'pearly' 'scales' 'twinings' 'brother' 'brothers', description "With its pearly scales and sinuous twinings, the dragon looks like a figure of legend indeed."; Tapestry tapestry_phoenix "woven phoenix" court_tapestries with pname '.x' 'woven' 'phoenix' 'plumage' 'feather' 'feathers' 'brother' 'brothers', description "With its fanciful plumage in the colors of fire and sun, the phoenix looks like a figure of legend indeed."; Tapestry tapestry_passage "passage" court_tapestries with name 'passage' 'exit', description "If you squint, you think you see a garden beyond the passage."; !------------------------------------------------------------------------ ! The Skeletal Banquet: on the 2nd floor (counting from the top) ! An antithesis of taste Room banquet_room "Skeletal Banquet" with description "It seems this is a banquet room, if a banquet had no especial place for people to dine. Glassware and stoneware are arranged in deliberate shapes, as though they are constellations. ^^ South lies a chamber of brooding silence, and a vague, sweet fragrance comes from the east. Stairs of blackest marble lead downward.", before [; Smell: print_ret "Roast pheasant and boar, ox-tail's soup and candied azaleas, the tang of wine. Curiously, none of these arouse hunger in you."; Jump: print_ret "Your armor clatters as you land. If this were a real banquet, of course, you would hardly do such a thing."; Listen: if (noun == 0) print_ret "A murmur rises around you, as though in the next room people too courteous to interrupt you conferred; but the words are not words, the voices are no more than dust stirring."; Sing: print_ret "You would expect the entertainers to sing at a banquet, though your brother was fond of murmuring satiric poetry in your ear."; Xyzzy: print_ret "(Itadakimasu!)"; ], s_to music_room, e_to garden_room, stair_tried false, d_to [; if (table_constellations.arranged == false && ~~(lantern in player)) { if (self.stair_tried == false) { self.stair_tried = true; print_ret "As your feet meet that first step, a sudden vertigo overtakes you, as though you journeyed through skies beyond imagining, across hollow and infinite distances. You emerge back where you started: it seems the night's hold is too strong here, and you must find some guide-star to anchor your way."; } else { print_ret "After your prior experience, the idea of attempting the stairs again without some way to combat the dizziness gives you pause. Uncomfortably, you are reminded of long nights of silence, waiting for footsteps that never came."; } } else { if (lantern in player) { print "The lantern behind you brightens as you approach the stairs, anchoring a path for you through the sea of stars.^^"; } return hawk_room; } ], cant_go "Even the hunter's hound or the falconer's kestrel cannot escape so readily through stone, and you are none of these."; Furniture black_stairs "stairs" with name 'stairs' 'staircase' 'stair' 'step' 'steps' 'blackest' 'black' 'dark' 'darkest' 'starry' 'marble', description "The stairs grow darker the longer your eyes rest upon them, until nothing is visible except a starry suggestion of unknown portents.", before [; Touch: print_ret "Cold beyond the coldest nights, prompting you to snatch your fingers away."; ], found_in banquet_room hawk_room, has scenery pluralname enterable; Intangible banquet_light "light" banquet_room with name 'light', description "The light dances and flickers as though it came from gaily-lit lanterns."; Furniture banquet_table "table" banquet_room with name 'table', description "The table is lacquered in red and black, carved in elaborate motifs. The justiciar would have liked the colors.", before [; Eat: print_ret "Hardly edible."; Touch: print_ret "The wood's lacquered surface is smoother than anything solid ought to be."; Attack: print_ret "Striking the table will accomplish nothing but disarray."; ], has scenery; Object table_motifs "motifs" banquet_table with name 'motif' 'motifs', description "The motifs suggest leaf, vine and blossom before retreating into the uneasy shapes of abstraction.", before [; Touch: print_ret "The shapes glide under your hands, as unperturbed as carp beneath a bridge's arch."; Attack: print_ret "Striking the table will accomplish nothing but disarray."; ], has scenery; Object table_constellations "constellations" banquet_table with name 'arrangement' 'auspicious' 'shape' 'shapes' 'constellation' 'constellations' 'plate' 'plates' 'bowl' 'bowls', sky_seen false, arranged false, sign 'none', description [; if (self.sky_seen == true) print_ret "The arrangement is in the shape of the constellation called the White Archer, who shot the Sun out of the sky and wanders the night in penance. It seems a curiously ill-fortuned constellation for an ill-fortuned feast, and almost any other arrangement would be more auspicious."; else print_ret "The arrangement is in the shape of the constellation known as the White Archer. Legend says that he shot his love, the Sun, out of the sky while hunting. For ten days and nights, the Sun hid her face from the world, and ever after, in penance, he exiled himself to the night, unable to see her; his faithful horse, the Moon, travels between them, bearing messages between the parted lovers.^^ As to how the Sun was brought back to the world by the phoenix--that is another tale.^^ This seems an ill-fortuned constellation to complement an ill-fortuned feast."; ], before [ w1 w2 glyph; Touch,Take,Pull,PushDir: print_ret "You suspect some ill fortune would befall you if you disturbed this arrangement too hastily."; Push, SetTo: if (self.sky_seen == true) { if (self.arranged == false) { wn = consult_from; w1 = NextWord(); w2 = NextWord(); if (consult_words == 1 && (w1 == 'horse' || w1 == 'chrysanthemum')) glyph = w1; else if (consult_words == 2 && w1 == 'imperial' && w2 == 'chyrsanthemum') glyph = w2; else if (consult_words == 2 && w1 == 'heavenly' && w2 == 'horse') glyph = w2; else "Perhaps you should arrange this as one of the constellations enshrined in the zodiac."; switch (glyph) { 'chrysanthemum': self.arranged = true; self.sign = 'chrysanthemum'; self.description = "The arrangement is in the shape of the Imperial Chrysanthemum, which has graced the banners of countless emperors and empresses."; print_ret "The Imperial Chrysanthemum: a sign under which histories of ambition and loyalty, betrayal and beauty, have been played out. Even orphans have aspired to be touched by that sign. Generals, too. You meditate upon these things as you arrange the glassware and stoneware into a shape that, in its own way, can be as inauspicious to orphans and generals as the White Archer, despite its connotations of power."; 'horse': self.arranged = true; self.sign = 'horse'; self.description = "The arrangement is in the shape of the Heavenly Horse, sky-messenger and swift-runner."; print_ret "The Moon is the horse that bears the White Archer's messages to his lover the Sun, returning to rove the night's passages with him. The Heavenly Horse, though, is a messenger that submits to no rider, like the justiciar with her dark, proud eyes. It seems a strangely fitting sign for a stranger's feast."; default: print_ret "This constellation is unknown."; } } else print_ret "The arrangement has already been returned to harmony with the auspices of fortune."; } else print_ret "As the arrangement currently takes the shape of one constellation, another constellation would be a fitting rearrangement. You are at a loss, however, for a more appropriate sign. The sky might provide some inspiration, if you could only see it from the stones of this stifling tower."; Set: print_ret "Perhaps you should arrange the setting as something else."; Attack: print_ret "That would be a fool's act, or a jester's; you are neither."; ], has scenery; Object glassware "glassware" banquet_table with name 'glassware' 'glass' 'glasses', description "The glasses you see are nearly clear of tint or bubbles, and even those few flaws hint at the elusive shapes of liquid, though none dwells within.", before [ w1 w2 glyph; Attack: print_ret "It would be an ill thing to mistreat glass so painstakingly blown."; Touch: print_ret "You tap the rim of one glass and it chimes in a clear, sweet note that wavers as it fades, as though wine or water stirred; but there is none."; Take,Pull,PushDir: if (table_constellations.arranged == false) print_ret "The banquet's travesty, in its entirety, gives you pause. Perhaps you could arrange it in accordance with fortune, if you but knew how."; else print_ret "The arrangement is now in harmony, and you are loath to disturb it again."; Push, SetTo: if (table_constellations.sky_seen == true) { if (table_constellations.arranged == false) { wn = consult_from; w1 = NextWord(); w2 = NextWord(); if (consult_words == 1 && (w1 == 'horse' || w1 == 'chrysanthemum')) glyph = w1; else if (consult_words == 2 && w1 == 'imperial' && w2 == 'chyrsanthemum') glyph = w2; else if (consult_words == 2 && w1 == 'heavenly' && w2 == 'horse') glyph = w2; else "Perhaps you should arrange this as one of the constellations enshrined in the zodiac."; switch (glyph) { 'chrysanthemum': table_constellations.arranged = true; table_constellations.sign = 'chrysanthemum'; table_constellations.description = "The arrangement is in the shape of the Imperial Chrysanthemum, which has graced the banners of countless emperors and empresses."; print_ret "The Imperial Chrysanthemum: a sign under which histories of ambition and loyalty, betrayal and beauty, have been played out. Even orphans have aspired to be touched by that sign. Generals, too. You meditate upon these things as you arrange the glassware and stoneware into a shape that, in its own way, can be as inauspicious to orphans and generals as the White Archer, despite its connotations of power."; 'horse': table_constellations.arranged = true; table_constellations.sign = 'horse'; table_constellations.description = "The arrangement is in the shape of the Heavenly Horse, sky-messenger and swift-runner."; print_ret "The Moon is the horse that bears the White Archer's messages to his lover the Sun, returning to rove the night's passages with him. The Heavenly Horse, though, is a messenger that submits to no rider, like the justiciar with her dark, proud eyes. It seems a strangely fitting sign for a stranger's feast."; default: print_ret "This constellation is unknown."; } } else print_ret "The arrangement has already been returned to harmony with the auspices of fortune."; } else print_ret "As the arrangement currently takes the shape of one constellation, another constellation would be a fitting rearrangement. You are at a loss, however, for a more appropriate sign. The sky might provide some inspiration, if you could only see it from the stones of this stifling tower."; ], has scenery; Object stoneware "stoneware" banquet_table with name 'stoneware' 'pottery', description "The stoneware is dark to the eye, and the mottled surfaces complement the fragile sheen of glass.", before [ w1 w2 glyph; Attack: print_ret "Even this artistry, though subtle, would not break readily."; Touch: print_ret "Smoother than you would have thought, though at times pleasingly lumpy."; Take,Pull,PushDir: if (table_constellations.arranged == false) print_ret "The banquet's travesty, in its entirety, gives you pause. Perhaps you could arrange it in accordance with fortune, if you but knew how."; else print_ret "The arrangement is now in harmony, and you are loath to disturb it again."; Push, SetTo: if (table_constellations.sky_seen == true) { if (table_constellations.arranged == false) { wn = consult_from; w1 = NextWord(); w2 = NextWord(); if (consult_words == 1 && (w1 == 'horse' || w1 == 'chrysanthemum')) glyph = w1; else if (consult_words == 2 && w1 == 'imperial' && w2 == 'chyrsanthemum') glyph = w2; else if (consult_words == 2 && w1 == 'heavenly' && w2 == 'horse') glyph = w2; else "Perhaps you should arrange this as one of the constellations enshrined in the zodiac."; switch (glyph) { 'chrysanthemum': table_constellations.arranged = true; table_constellations.sign = 'chrysanthemum'; table_constellations.description = "The arrangement is in the shape of the Imperial Chrysanthemum, which has graced the banners of countless emperors and empresses."; print_ret "The Imperial Chrysanthemum: a sign under which histories of ambition and loyalty, betrayal and beauty, have been played out. Even orphans have aspired to be touched by that sign. Generals, too. You meditate upon these things as you arrange the glassware and stoneware into a shape that, in its own way, can be as inauspicious to orphans and generals as the White Archer, despite its connotations of power."; 'horse': table_constellations.arranged = true; table_constellations.sign = 'horse'; table_constellations.description = "The arrangement is in the shape of the Heavenly Horse, sky-messenger and swift-runner."; print_ret "The Moon is the horse that bears the White Archer's messages to his lover the Sun, returning to rove the night's passages with him. The Heavenly Horse, though, is a messenger that submits to no rider, like the justiciar with her dark, proud eyes. It seems a strangely fitting sign for a stranger's feast."; default: print_ret "This constellation is unknown."; } } else print_ret "The arrangement has already been returned to harmony with the auspices of fortune."; } else print_ret "As the arrangement currently takes the shape of one constellation, another constellation would be a fitting rearrangement. You are at a loss, however, for a more appropriate sign. The sky might provide some inspiration, if you could only see it from the stones of this stifling tower."; ], has scenery; Object banquet "banquet of bones" banquet_table with name 'banquet' 'feast' 'bone' 'bones' 'skeleton' 'skeletons' 'bird' 'rabbit' 'pheasant' 'leg' 'legs', description "The feast before you seems a mockery, for everywhere upon the plates and bowls there is nothing but skeletons artfully pieced together to create grotesqueries from ordinary game. A creature half-bird, half-rabbit, for one, or a pheasant with extra legs. Yet it is perhaps no more grotesque than some of the intrigues that poisoned the emperor's court, at times.", arranged false, before [; Eat,Taste: print_ret "Men have starved on greater fare."; Take,Pull,Push,PushDir,Touch: if (self.arranged == false) print_ret "Uncannily, the bones edge away, suggesting that another approach will be necessary."; else print_ret "After the effort you spent restoring the bones to some semblance of sanity, you are loath to disturb them yet again."; Attack: move self to unroom; print_ret "Though the skeletons shy away, they cannot escape your blows for long. As the bones crumble into dust and ash, ghostly smoke rises from them, taking the shapes of phoenix and dragon entwined, two brothers forever opposed and endlessly entangled. Then the bones are gone, and no banquet remains upon the table, skeletal or otherwise."; TakeWith: if (second == ivory_chopsticks) { if (self.arranged == false) { self.arranged = true; self.description = "Despite the fact that the feast is a mockery, the skeletons are now arrayed more decorously, suggesting in their twining a dragon and phoenix forever locked together."; print_ret "Bone calls to bone, it seems, for the skeletal feast flees no more. With great care you disentangle the bones and piece them back together in a more seemly fashion. Despite some puzzling conjunctions of joints, you discover that interlocking skeletons of dragon and phoenix form the centerpiece.^^ In a battle older than bone, says one story, the dragon and phoenix were brothers, both born of fire; but one ascended to burn in splendor, and the other clothed himself in lightning tongue and storm rains. The phoenix must die, but is ever reborn; the dragon lives no more, but never dies."; } else print_ret "After the effort you spent restoring the bones to some semblance of sanity, you are loath to disturb them yet again."; } else print_ret "Uncannily, the bones edge away, suggesting that another approach will be necessary."; ], has static; Object ivory_chopsticks "ivory chopsticks" banquet_table with name 'ivory' 'chopstick' 'chopsticks' 'stick' 'sticks' 'pair', description "The chopsticks are pale, almost too slender for practical use, and perfectly matched, though one is carved with a dragon, the other with a phoenix.", invent "a pair of ivory chopsticks", before [; Touch: if (self hasnt moved) print_ret "Smooth and slightly warm, as though they had rested upon a heated plate--which is not the case."; else print_ret "Smooth and slightly warm from your touch."; Tie,PutOn,Insert: if (second == leaf_paper) { move self to unroom; move leaf_paper to unroom; move paper_kite to player; print_ret "Carefully, you fold the paper and pierce it with the ivory chopsticks to form a delicate, string-less kite no larger than your hand."; } else return false; ], add_to_scope chopstick_dragon chopstick_phoenix, has pluralname; Object chopstick_dragon "ivory dragon" ivory_chopsticks with pname 'cloud' 'clouds' 'dragon', description "Even upon the chopstick's narrow surface the dragon is surrounded by the clouds of heaven.", before [; Take: print_ret "It is inseparable from the single chopstick."; ], has static; Object chopstick_phoenix "ivory phoenix" ivory_chopsticks with pname '.x' 'sun' 'moon' 'star' 'stars' 'phoenix', description "Even upon the chopstick's narrow surface the phoenix is surrounded by sun, moon and stars.", before [; Take: print_ret "It is inseparable from the single chopstick."; ], has static; !------------------------------------------------------------------------ ! The hall of hawks Room hawk_room "Hall of Hawks" with description [; if (self hasnt visited) { print "Memory overtakes you as you enter: you and your brother speaking to each other in low, tense voices (not shouting, never shouting before "; style underline; print "her"; style roman; print ") until the justiciar bids you leave, curtly. The next day, when the emperor stripped her of her rank, and neither you nor your brother had the influence to free her from the court's machinations--you have lived that day over and over, more than any man ought.^^"; } if (lantern in player) print "You see silhouettes out of the corner of your eye: blade, hand, a woman's hair floating long and free; they elude any attempt to view them directly, as though they ceased to dance across the walls when you do so.^^"; print_ret "Hawks painted in gold and brown soar along the walls. It is strangely warm here, as though fires lived just beyond your perception. The entire hall is open to the wind and warmth, unobstructed except by your presence.^^ Stairs of darkest marble circle upward. A passageway leads south into clear, colorless light."; ], before [; Smell: print_ret "The air is cool and bracing, carrying the scent of leaves beginning to decay and a hint of the first snows."; Jump: print_ret "Your armor clatters as you land."; Listen: if (noun == 0) print_ret "A hawk's hunting scream, and the murmur of a beloved voice beckoning you onward."; Sing: print_ret "The melancholy melody brings you little pleasure."; Xyzzy: print_ret "(Is that an ornithopter I spy?)"; ], unmasked false, ! has the player dealt with the mask ! by removing it? masked false, ! has the player dealt with the mask ! by choosing to wear it? tried_south false, ! has the player tried to go south yet? s_to [; if (self.unmasked == false) { if (self.masked == false) { self.tried_south = true; print_ret "As you approach, you realize that the shadows split the passageway in a terrible clean fracture, and your face aches unbearably; only when you move away does the pain ease."; } else { self.tried_south = true; print_ret "The shadows hold no more place for you."; } } else return door_room; ], u_to [; if (self.masked == true) { return storm_room; } else return banquet_room; ], cant_go "Hawks may soar, but they are rarely free to go where they will; you, too, are jessed by the limits of your self."; Object hawk_passage "passageway" hawk_room with name 'passage' 'passageway', description "If you look south, this passage leads into clear, colorless light, though you cannot see what lies beyond it.", has scenery; Intangible hawk_light "light" hawk_room with name 'light' 'illumination', description "Subtle gradations characterize the light in this room, as though it were filtered by great wings."; Object wall_hawks "painted hawks" hawk_room with name 'hawk' 'hawks' 'paint' 'painted' 'brown' 'gold' 'wall' 'walls' 'feather' 'feathers' 'flight' 'stone', description "A splendor of hawks in flight, each feather meticulously painted. Each one has a woman's dark eyes instead of a raptor's golden gaze.", before [; Touch,Take: print_ret "Beneath the rustling texture of shed feathers, the walls are only stone after all."; Attack: print_ret "The stones will not yield to you."; ], add_to_scope hawk_eyes, has scenery pluralname; Object hawk_eyes "raptors' eyes" wall_hawks with name 'eye' 'eyes' 'dark' 'black', description "As you gaze upon the eyes, they gaze back at you, forthright and unsmiling. Her eyes.", before [; Touch,Attack,Take: print_ret"They lie beyond your reach, like the woman they remind you of."; ], has scenery pluralname; !------------------------------------------------------------------------ ! The passage of storms Room storm_room "Passage of Storms" with description [; ! We're going to get rid of everything that could ! possibly be in inventory, to reflect the player's ! transfiguration, and change the player's description ! to reflect this. if (self hasnt visited) { remove tortoise_comb; remove chopstick_dragon; remove chopstick_phoenix; remove ivory_chopsticks; remove garden_fan; remove comb_teeth; remove clay_ocarina; remove armor; remove lantern; player.description = "Shapes no longer matter in this place of storm and silence, wind and violence."; } switch (garden_compass.season) { 'spring': print "Cherry blossoms and lilacs, kite-flying auguries and newly-budding leaves: the trappings of spring are far beneath you now, though the kite is a red speck dancing in the storm. "; 'autumn': print "Maple leaves and migrating birds, crisp breezes and colder nights: you have left the signs of autumn behind, though the red kite dances through the storm, a last reminder of spring. "; 'winter': print "Snowfall and icicle knife, hills of white and clouds of grey, are of no more concern to you now, though you spy the red kite drifting in the storm, free of any hand. "; 'summer': print "The monsoon's humidity and damp, the flooded fields and dancing cranes: the essence of summer is a thing for mortals, as is the red kite that dances away from you. "; default: print "It a seasonless place where you have come. "; } switch (table_constellations.sign) { 'horse': print_ret "The moonlit tower lays open beneath you, as though stones were no more than the barest skeleton, the merest shadow. Lightning and storm clouds gather around you, and in the sky above the Moon gallops beyond your reach to the horizon."; 'chrysanthemum': print_ret "The moonlit tower lays open beneath you, as though the stones were no more than songs of air and darkness. Lightning and storm clouds gather around you, and all above you the stars lay open to your gaze."; default: print_ret "The moonlit tower lays open beneath you, and lightning and storm clouds gather around you."; } ], before [; Inv: print_ret "You have cast off all tangible things, like chains, as is the way of dragons."; Smell: if (noun == 0) print_ret "Wild, wild air and the sharp tang of lightning."; Listen: print_ret "Wind and rain, rain and wind, twined and inseparable in your hearing."; LookUp: print_ret "Only the sky, above and around you."; Sing: print_ret "A dragon's song is a thing of exultation, and it brings you more of joy than regret."; Bathe: print_ret "You revel in the outpouring of water, though it is perhaps a frivolous thing now."; Fly: print "The sky is yours, in a dance unending, and you have shed your past (her eyes, the hand upon the blade, the blood, your brother's white and anguished face) as you ascend to your place in the zodiac."; deadflag = 2; return true; Xyzzy: print_ret "(Mimesis Breakdown Alert)"; ], cant_go [; if (deadflag == 2) print_ret ""; else print_ret "Only one path remains open to you and the signs you have chosen."; ], u_to [; print "The sky is yours, in a dance unending, and you have shed your past (her eyes, the hand upon the blade, the blood, your brother's white and anguished face) as you ascend to your place in the zodiac."; deadflag = 2; ]; Object moonlit_tower "moonlit tower" storm_room with name 'moonlit' 'tower' 'stone' 'stones', description "In its way the moonlit tower is like any other tower, despite the strange things trapped within; you are part of them no longer.", before [; Attack,Touch,Push,PushDir,Take: print_ret "It lies too far below."; ], has scenery; Object moon "Moon" storm_room with name 'moon' 'lunar', description "Above you sails the great white half-circle of the Moon, tireless messenger between the White Archer and the Sun his lover.", before [; Attack,Touch,Push,PushDir,Take: print_ret "The Moon is too distant for you to approach, and in any case it has its own errands."; ], has scenery; Object storm_clouds "storm clouds" storm_room with name 'storm' 'cloud' 'clouds' 'lightning' 'night', description "It is night, now and always, with the storm clouds and lightning your constant companions.", before [; Attack,Touch,Push,PushDir,Take: print_ret "Yours, now, as surely as song."; ], has scenery pluralname; Object storm_stars "stars" storm_room with name 'star' 'stars' 'constellation' 'constellations' 'zodiac' 'sky', description "The stars are your brothers and sisters in their endless parade through the sky, bright and unblinking.", before [; Attack,Touch,Push,PushDir,Take: print_ret "They have their places in the sky, as do you."; ], has scenery; Object storm_kite "red kite" storm_room with name 'red' 'kite', description "Caught in the grip of gale and rain, the kite dances, a last reminder of the human things you are leaving behind.", before [; Attack,Touch,Push,PushDir,Take: print_ret "It is receding from your reach already."; ], has scenery; !------------------------------------------------------------------------ ! The Hall of Doors Room door_room "Hall of Doors" with description [; if (self hasnt visited) print "At first, this place of polished surfaces seems like a profusion of mirrors and a kaleidoscope of doors. Looking more closely, though, all doors are one, save the one you came from. "; print_ret "The peculiar translucence of the walls suggests that it is growing light out.^^ Northward, a passageway no longer riven by shadow returns to the rest of the tower; across from it stands a door to the south."; ], before [; Jump: print_ret "Your armor clatters as you land."; Smell: if (noun == 0) { switch (garden_compass.season) { 'autumn': print_ret "Rain, and autumn's faded flowers; winter approaching, and summer dying."; 'spring': print_ret "The fragrance of lilacs, carried far by the spring breezes."; 'summer': print_ret "The heady sweetness of twining wisteria amid the smell of rain-soaked earth and silk."; 'winter': print_ret "The sleep of snow, and the sharp smell of storms."; default: print_ret "Only a fading fragrance, here."; } } Listen: switch (garden_compass.season) { 'autumn': print_ret "Words, a tumble of words, but the only ones you can hear clearly are ~beloved~ and ~farewell.~"; 'spring': print_ret "A young man's laughter, very like your own, suggesting some past bitterness, though you have bitternesses of your own."; 'summer': print_ret "Poetry read by quiet voices, in a scattering of sound and allusion, though no two of the lines you hear go together."; 'winter': print_ret "A woman's quiet, intense words, which slip through your hearing like snow and soft death."; default: print_ret "Only the faintest murmur, here."; } Sing: print_ret "A funeral song or a farewell song, you no longer know which."; Xyzzy: print_ret "(You should know better than this.)"; ], n_to hawk_room, s_to last_door, cant_go "The doors you see are the doors open to you; this is not one of them."; Object door_passage "passageway" hawk_room with name 'passage' 'passageway', description "If you look north, this passage leads into pale, striated light, though you cannot see what lies beyond it.", has scenery; Intangible door_light "light" door_room with name 'pale' 'clear' 'light' 'illumination', description "The light here has a clarity rarely found except in dreams or childhood, through which everyone must pass eventually."; Object door_stones "stones" door_room with name 'wall' 'walls' 'stone' 'stones', description "The walls are smooth and polished, reflecting every chance movement.", before [; Touch: print_ret "The silent, smooth perfection of stone."; Attack: print_ret "The march of reflections only becomes dizzying with your sudden movements."; ], has scenery pluralname; Intangible door_reflections "reflections" door_room with name 'reflection' 'reflections' 'mirror' 'mirrors' 'reflecting', description "In the images you see yourself in a hundred variations, the battles you fought and the pleasures you wrought, though no single image stays still long enough for you to see it clearly."; Object last_door "door" door_room with name 'door', description "The door is of the same strange stone that characterizes the tower.", door_dir s_to, door_to door_room, before [; Attack: print_ret "You have but to open it."; Touch: switch (garden_compass.season) { 'summer': "There is a faint suggestion of summer warmth."; 'spring': "There is a faint suggestion of spring's untidy breezes."; 'autumn': "Autumn's brisk winds nudge against your hands."; 'winter': "Outside, the quiet chill suggests a land wrapped in winter."; default: "The door is only a door, despite its smoothness."; } Open: switch (garden_compass.season) { 'summer': print "Cranes dancing, cranes flying, all around you a splendor of cranes, white wings and summer rain. You are no longer held in thrall by past dreams and defeats--or at least, no more than any man or woman is.^^"; 'spring': print "Swallows soaring and tumbling, the flowerfall of cherry blossom petals, a wind that needs no kites to augur good fortune. The paths you take are your own, now, no matter what jealousies you and your brother exchanged, knotted too deeply to be disentangled in past dreams.^^"; 'autumn': print "A hawk's hunting scream and the raptor's dizzying gyre, maple leaves (black and red and gold, ever and always) burning upon the trees and tumbling free in the wind. Perhaps you will see "; style underline; print "her"; style roman; print " again, in this turning of the world's fortunes.^^"; 'winter': print "It is a strangely quiet sky that awaits you, and the snow's restful fall, however cold, brushes your skin as tenderly as a kiss. There are winter courts beyond numbering in the world outside, and in one of them, somewhere, a black-haired woman may have freed herself from the chains of memory and regret, love and rivalry and suicide, to seek you out as you seek her.^^"; default: print "No season awaits you but the timeless season of freedom, whatever its trappings.^^"; } switch (table_constellations.sign) { 'chrysanthemum': print "The imperial sign guided you once, but the day is dawning, and no constellations remain but the one in your heart, a guidestar too terrible to bear, too precious to abandon. "; 'horse': print "The sky's messenger and the compass of the court's mercurial season guided you once, but the sun is rising, wreathing the world in a phoenix's rejoicing flame, and no compass remains but the one that, perhaps, you have always borne but were not always wise enough to follow. "; default: print "You leave the tower behind you, no longer trapped by the tyranny of moonlight. "; } print "The rest of your story is your own to tell and cherish, as you walk past the tower's broken boundaries and into the rest of your awakening."; deadflag = 2; return true; ], has scenery door openable; !------------------------------------------------------------------------ ! The unroom Room unroom "The unroom" with description "I'll be very surprised if you manage to get here, as it's just a placeholder room to move things in and out should I need to do so. In fact, the fact that you're here means there's a bug somewhere in the code, and I'd love to have a transcript so I can fix it."; ! The comb_teeth is moved to the player if s/he breaks the ! tortoise_comb. ! "tie teeth to paper" results in comb_teeth and leaf_paper being moved ! here to the unroom, and replaced by the kite. Object comb_teeth "comb's teeth" unroom with name 'comb^s' 'teeth' 'tooth', invent "three comb's teeth", description "They are of tortoise-shell, like the comb from which they came, and span the palm of your hand. Too light for hairpins, too dainty for weapons.", before [; Wear: print_ret "Even as a lady's improvised hairpins they would seem somewhat lacking."; Attack: print_ret "Light and frail though they are, perhaps another purpose awaits them."; Touch: print_ret "The teeth are smooth even where they have been broken off cleanly from the comb."; Tie,PutOn,Insert: if (second == leaf_paper) { move self to unroom; move leaf_paper to unroom; move paper_kite to player; print_ret "Carefully, you fold the paper and pierce it with the tortoise-shell teeth to form a delicate, string-less kite no larger than your hand."; } else return false; ], has pluralname; ! These trees and flowers are switched in and out from the garden_room ! as required by the garden_compass settings. Object autumn_flowers "unliving flowers" unroom with name 'flower' 'flowers' 'bloom' 'blooms' 'blossom' 'blossoms' 'bud' 'buds' 'petal' 'petals' 'rose' 'roses' 'cosmos' 'cosmoi', description "Cosmos, the peasant's flower, and the last autumn roses.", before [; Touch: print_ret "Even the artificers who created this garden could not give these blossoms a petal's velvet texture."; Attack: print_ret "It would be an affront to the artisans."; Take: print_ret "Surely this would be a strange way to acquire a bouquet."; ], has scenery pluralname; Object spring_flowers "unliving flowers" unroom with name 'flower' 'flowers' 'bloom' 'blooms' 'blossom' 'blossoms' 'bud' 'buds' 'petal' 'petals' 'forsythia' 'forsythias' 'magnolia' 'magnolias', description "Forsythia and magnolia, the earliest blooms of spring.", before [; Touch: print_ret "Even the artificers who created this garden could not give these blossoms a petal's velvet texture."; Attack: print_ret "It would be an affront to the artisans."; Take: print_ret "The flowers are more charming with their mechanisms undisturbed."; ], has scenery pluralname; Object summer_flowers "unliving flowers" unroom with name 'flower' 'flowers' 'bloom' 'blooms' 'blossom' 'blossoms' 'bud' 'buds' 'petal' 'petals' 'honeysuckle' 'honeysuckles' 'lotus' 'lotuses', description "Honeysuckle and lotus of a summer's languorous nights, though the imperial chrysanthemum is notably absent.", before [; Touch: print_ret "Even the artificers who created this garden could not give these blossoms a petal's velvet texture."; Attack: print_ret "It would be an affront to the artisans."; Take: print_ret "Even a child would hesitate to pluck these blossoms from their places."; ], has scenery pluralname; Object autumn_trees "unliving trees" unroom with name 'tree' 'trees' 'maple' 'maples' 'gingko' 'gingkos', description [; print "Maples in black, red and gold, like the colors "; style underline; print "she"; style roman; print " loved so well, and the cloven yellow of gingko.^"; if (garden_leaf in self) print "^A single maple leaf flutters loosely, as though seeking escape.^"; if (leaf_paper in self) print "^A single sheet of red paper flutters loosely, as though seeking escape.^"; else return true; ], before [; Touch,Attack: print_ret "Despite their seeming frailty, they yield no more to your hand than the oak to the storm."; Climb: print_ret "You are not certain they would bear your weight."; ! The trees have "supporter" for the garden_leaf's sake ! but the player isn't supposed to be able to put things ! on them. Receive: print_ret "The trees are for the pleasure of the senses, not furniture."; ], has scenery supporter pluralname; Object spring_trees "unliving trees" unroom with name 'tree' 'trees' 'bamboo' 'bamboos' 'grove' 'groves' 'grass' 'grasses', description "Bamboo groves, graceful though ungrowing.", before [; Touch,Attack: print_ret "Despite their seeming frailty, they yield no more to your hand than a petal beneath a butterfly."; Climb: print_ret "You are not certain they would bear your weight."; ], has scenery pluralname; Object summer_trees "unliving trees" unroom with name 'tree' 'trees' 'willow' 'willows' 'branch' 'branches' 'limb' 'limbs' 'sycamore' 'sycamores', description "The sweeping branches of willow, the tall limbs of sycamore.", before [; Touch,Attack: print_ret "Despite their seeming frailty, they yield no more to your hand than a leaf beneath a raindrop."; Climb: print_ret "You are not certain they would bear your weight."; ], has scenery pluralname; ! This maple leaf appears in the garden_room when the garden_compass ! (also found therein) is set to the hawk, for autumn; only then ! may it be taken by the player. ! At all other times it vanishes back to this unroom. ! It also returns here if it is "unfolded." Object garden_leaf "folded maple leaf" unroom with name 'fold' 'folded' 'maple' 'leaf' 'red' 'paper' 'mulberry' 'origami', description "This cleverly-folded leaf stirs as though, in its secret paper dreams, it yearns to fly.", before [; Touch: print_ret "Light in your hands, like a laugh."; Fold,Close: print_ret "It will not, alas, yield even more leaves."; Unfold,Open: move self to unroom; move leaf_paper to player; print_ret "You now have a sheet of red paper."; Cut,Attack: print "And what harm can paper do you?--but you think of a letter "; style underline; print "she"; style roman; print_ret " left for you, and you know. This paper, though, bears no words."; Fly: if (self in player) { print_ret "It would be a strange leaf that flew at your bidding alone, and even kites require frames and string."; } else { print_ret "Even if you held the leaf in your hand, it would be unlikely to grow wings and soar without more work on your part."; } ]; ! This origami sheet is swapped out for the leaf if the leaf is unfolded, ! and vice versa for folding the sheet. Object leaf_paper "sheet of red paper" unroom with name 'unfolded' 'red' 'paper' 'origami' 'mulberry' 'sheet' 'creased', description "It is hard to believe that this sheet of red-dyed mulberry paper can take upon the shape of a leaf with folding.", before [; Touch: print_ret "Light in your hands, like a tear."; Unfold,Open: print_ret "The paper cannot unfold any further."; Fold,Close: move self to unroom; move garden_leaf to player; print_ret "You now have a folded maple leaf."; Tie,PutOn,Insert: switch (second) { comb_teeth: move self to unroom; move comb_teeth to unroom; move paper_kite to player; print_ret "Gently, you fold the paper and pierce it with the tortoise-shell teeth to create a delicate, string-less kite no larger than your hand."; ivory_chopsticks: move self to unroom; move ivory_chopsticks to unroom; move paper_kite to player; print_ret "Gently, you fold the paper and pierce it with the ivory chopsticks to create a delicate, string-less kite no larger than your hand."; default: return false; } Cut,Attack: print "And what harm can paper do you?--but you think of a letter "; style underline; print "she"; style roman; print_ret " left for you, and you know. This paper, though, bears no words."; Fly: if (self in player) { print_ret "It would be a strange sheet that flew at your bidding alone, and even kites require frames and string."; } else { print_ret "Even if you held the paper in your hand, it would be unlikely to grow wings and soar without more work on your part."; } ]; Object garden_fan "tasseled fan" unroom with pname '.x' 'tasseled' 'fan', tassel_taken false, description [; if (self.tassel_taken == false) print_ret "More remarkable than the fan's intricate designs is the long blue tassel that trails from it. It is the kind of fan a lady might carry to cool herself during the summer's heat."; else print_ret "More remarkable than the fan's intricate designs is its long blue tassel, though a number of its strands have been removed."; ], add_to_scope fan_tassel, before [; Touch: print_ret "The tassel renders the fan oddly balanced."; Attack: print_ret "A gentler means may be at hand."; Unfold,Fold,Open,Close: print_ret "The fan itself is fixed, but as you look upon the tassel, it evokes the improbable memory of a kitestring tugging against your hand."; Tie: if (second == paper_kite) print_ret "If you cut strands from the tassel, it might make a passable kitestring."; Wave: print_ret "A gesture of summer heat and languid gestures, unsuited to you now, if ever."; Cut: if (self.tassel_taken == false) { if (shadow_dagger in player) { move fan_strand to player; self.tassel_taken = true; print_ret "A few neat cuts free some strands from the tassel, and tying them together results in--a kitestring?^^ For a second there is a dark-eyed boy beside you, whose laugh is yours, but wilder; whose smile is yours, but wider. If only you remembered the augury that you and your brother cast that spring in the kite-flying ritual, years before either of you met the woman who wore black and red and gold..."; } else print_ret "To cut some strands free of the tassel, you would need a blade."; } else print_ret "The strands you cut already should have sufficed for your purposes."; CutWith: if (second == shadow_dagger) { if (self.tassel_taken == false) { move fan_strand to player; self.tassel_taken = true; print_ret "A few neat cuts free some strands from the tassel, and tying them together results in--a kitestring?^^ For a second there is a dark-eyed boy beside you, whose laugh is yours, but wilder; whose smile is yours, but wider. If only you remembered the augury that you and your brother cast that spring in the kite-flying ritual, years before either of you met the woman who wore black and red and gold..."; } } else print_ret "A blade would be more appropriate for cutting something."; ]; Object fan_tassel "blue tassel" garden_fan with pname '.x' 'blue' '.x' 'silken' 'strand' 'strands' 'tassel', description "The silken strands are longer than your arm.", before [; Touch: print_ret "The strands are smooth and fine."; Attack: print_ret "A gentler means may be at hand."; Tie: if (second == paper_kite) print_ret "If you cut strands from the tassel, it might make a passable kitestring."; UnTie,Take: print_ret "The tassel is too firmly attached. A knife might serve you better."; Cut: if (garden_fan.tassel_taken == false) { if (shadow_dagger in player) { move fan_strand to player; garden_fan.tassel_taken = true; print_ret "A few neat cuts free some strands from the tassel, and tying them together results in--a kitestring?^^ For a second there is a dark-eyed boy beside you, whose laugh is yours, but wilder; whose smile is yours, but wider. If only you remembered the augury that you and your brother cast that spring in the kite-flying ritual, years before either of you met the woman who wore black and red and gold..."; } else print_ret "To cut some strands free of the tassel, you would need a blade."; } else print_ret "The strands you cut already should have sufficed for your purposes."; CutWith: if (second == shadow_dagger) { if (garden_fan.tassel_taken == false) { move fan_strand to player; garden_fan.tassel_taken = true; print_ret "A few neat cuts free some strands from the tassel, and tying them together results in--a kitestring?^^ For a second there is a dark-eyed boy beside you, whose laugh is yours, but wilder; whose smile is yours, but wider. If only you remembered the augury that you and your brother cast that spring in the kite-flying ritual, years before either of you met the woman who wore black and red and gold..."; } } else print_ret "A blade would be more appropriate for cutting something."; ], has scenery; Object fan_strand "kitestring" unroom with name 'blue' 'silk' 'strand' 'kitestring' 'string' 'thread', description "The blue silk strands are knotted together, and a kitestring requires a kite, of course.", before [; Tie: if (second == paper_kite) { move self to unroom; paper_kite.strung = true; paper_kite.invent = "a red paper kite ready to fly"; print_ret "Though it takes some patience, you tie the kitestring to the kite. Surely a season of gales and newborn blossoms awaits you, even in this skyless tower."; } else { if (~~(paper_kite in player)) print_ret "A kite is what it requires; perhaps, if you had paper and something to use as a frame..."; else print_ret "Surely a kitestring belongs on a kite?"; } Touch: print_ret "The strands are tightly-woven, and the knots hardly trouble your touch."; Cut,Attack,Untie: print_ret "What kite would fly for you then?"; ]; Object paper_kite "red paper kite" unroom with name 'red' 'paper' 'kite', invent "a red paper kite with no string", strung false, flown false, description [; if (self.strung == false) print_ret "A delicate kite no larger than your hand, though it lacks a string."; else print_ret "A delicate kite no larger than your hand, trailing an improvised string."; ], before [; Touch: print_ret "The construction is necessarily flawed, as you are no artificer."; Untie: if (self.strung == true) print_ret "It would be a pity to take apart the kite before it has a chance to soar, even if this fancy is nothing more than a moment's nostalgia."; else return false; Tie: if (second == fan_strand) { move fan_strand to unroom; self.strung = true; self.invent = "a red paper kite ready to fly"; print_ret "Though it takes some patience, you tie the kitestring to the kite. Surely a season of gales and newborn blossoms awaits you somewhere even in this skyless tower."; } else return false; Fly: if (self in player) { if (self.strung == true) { if (player in garden_room) { if (garden_compass.season == 'spring') { self.flown = true; move paper_kite to unroom; move star_horse to moon_room; move star_chrysanthemum to moon_room; StartDaemon(armory_room); print_ret "Spring: the season of augury. Red and black and gold, maple colors, kite colors; you no longer know which. A breeze stirs through the room, though the trees and flowers are no more affected by it than they would be by the sun's earnest light or a plague of locusts.^^ It was spring when your kite and your brother's became too entangled for one glass-edged string to cut the other's, for one to conquer the other, though entangled they flew yet; and spring when you were first parted from your brother on his first campaign and yours, two fatherless boys entering the emperor's service as adults. ^^ The kite tugs from your hand, as impatient as a hawk winning free of hood; dances perilously upward upon the wings of this nowhere breeze; and disappears. ^^ The breeze swells to a gale that rears southward and upward, seeking the sky in this enclosed and skyless room."; } else print_ret "The season seems somehow unfitting."; } else print_ret "Kite-flying has its expected place and season, as it brings the properties of the wind and sky to things that are normally earthbound."; } else print_ret "Without a string, it will dance from your hands with no more care than spring's first swallows."; } else print_ret "The kite requires more than your wish; you must hold it, first."; Cut,Attack: print_ret "What dreams of bird or wind would come to you then?"; ]; ! These are moved to the garden_room once the kite has been flown: ! paper_kite.flown. Object clay_ocarina "clay ocarina" unroom with name 'clay' 'ocarina' 'vessel' 'flute', first_seen false, description [; if (self.first_seen == false) { self.first_seen = true; print_ret "The ocarina is round, tapering at both ends, with eight finger-holes and one thumb-hole, a mouthpiece and a hole from which the sound emerges. You have seen musicians carry such instruments with them, as they are forgiving of the chance accidents that sometimes happen outside the sedate confines of a symphony chamber."; } else print_ret "The ocarina is round, tapering at both ends, with six finger-holes and one thumb-hole, a mouthpiece and a hole from which the sound emerges."; ], before [; Attack: print_ret "It is not a projectile."; Touch: print_ret "The glaze is smooth, though faintly raised around the ocarina's holes and mouthpiece."; Play,Blow: print "The ocarina's notes are high and sweet.^"; if (player in music_room) { music_room.song_sung = true; print "^In this place, they remind you of that first court dance, when you and you brother first saw the justiciar, a vision of red and black, a flash of gold. Someone played an ocarina that time, too. Flutes, zithers and lutes join in the cheerful clamor of instruments being tuned, though none of them are to be seen. "; switch (garden_compass.season) { 'autumn': music_room.season = 'autumn'; print_ret "You hear among the instruments the low, melancholy tones of an autumn dirge. "; 'summer': music_room.season = 'summer'; print_ret "In the noise, you hear a man's voice singing the last phrase of a summer poem. "; 'spring': music_room.season = 'spring'; print_ret "One of the flutes runs through a storm of arpeggios, suggesting the spring's wild winds. "; 'winter': music_room.season = 'winter'; print_ret "Some of them play swift phrases while others sustain long, low tones. "; default: print_ret "You hear snatches of an unfamiliar melody amid the sound. "; } } else return true; ]; ! These two constellations, star_horse and star_chrysanthemum, move ! to the moon_room once the kite has been flown: paper_kite.flown Intangible star_horse "Heavenly Horse" unroom with name 'heavenly' 'horse' 'equine' 'constellation' 'stallion' 'charger' 'steed' 'mount', description "The star-stallion rears like the chargers you once rode. The justiciar herself preferred such spirited mounts."; Intangible star_chrysanthemum "Imperial Chrysanthemum" unroom with name 'imperial' 'chrysanthemum' 'mum' 'flower' 'bloom' 'blossom' 'constellation', description "It is the first among constellations, open to the eyes of all people unlike the emperor himself. You and your brother saw him only once, when he called on you to stand together for your family's name."; ! These are moved to the music_room once the ensemble has played. Object mural_chrysanthemum "painted chrysanthemum" unroom with name 'painted' 'chrysanthemum' 'flower' 'blossom' 'bloom' 'imperial', description "The chrysanthemum blooms in singular splendor, opening its gold-edged petals to favor the lords and ladies.", before [; Attack,Touch,Take: print_ret "Irreverent, even toward an artistic depiction rather than a true chrysanthemum."; ], has scenery; Object mural_brothers "brothers" unroom with name 'brother' 'brothers', description "Your face. His. You see them upon the mural, two men who were boys closer than sword and spear, two boys who became men separated by war and love and duty.", before [; Attack,Touch,Take: print_ret "Paint, only paint, not flesh or porcelain, and therefore unyielding to the hand."; ], has scenery pluralname; ! This is moved into the hawk_room if the ! player chooses to wear the mask, hence closing the southern ! passage to the door_room. Intangible hawk_dark "shadows" unroom with name 'shadow' 'shadows' 'shade' 'shades' 'dark' 'darkness', description "Subtle gradations characterize the shadows, as though they were cast by great wings.", has pluralname; Object lantern "insubstantial lantern" unroom with name 'lantern' 'lanthorn' 'insubstantial' 'ethereal' 'glow', description "The lantern floats behind you, following you almost apologetically. Its glow flickers gently.", invent "an insubstantial lantern (floating behind your shoulder)", before [; Take,Touch,Attack,Push,PushDir,Pull,Drop: print_ret "Though the lantern follows you like an errant star, it refuses to be touched."; ], has light; !======================================================================== ! The player's possessions Object armor "armor and silks" with name 'armor' 'silks' 'silk' 'clothes' 'clothing' 'apparel' 'garb' 'armour', description "Both armor and silk are in black and gold, night and sun, skins without sensation.", invent "armor and silks (worn)", before [; Drop,Give,Disrobe,Attack,Cut: print_ret "This would not be proper."; Fold,Unfold,Tie,Untie: print_ret "You are wearing them, and likely to remain so."; ] has clothing pluralname; !======================================================================== ! Entry point routines [ Initialise; lookmode = 2; ! default is VERBOSE mode location = moon_room; move armor to player; give armor worn; move winter_trees to garden_room; player.description = "The weight of armor, the breath of silk: all these are familiar. The weight of memory, though, is strangely insubstantial; your face is no nearer than the secret shapes of reflections in a dark room."; print_ret "^^ No, not a prison, though stone stands around you, as expressionless as a mirror awaiting face and form; and in the silence you hear no plaint of flute or roar of gong, but instead the crash of porcelain shattering. ^^"; ]; ! replacement routine [ LMode3Sub; print (string) Story; L__M(##LMode3); ]; [ Amusing; amusing_menu.select(); ]; !======================================================================== ! Amusing menu--will change to NOTES later when I have time to figure ! out the code Menu amusing_menu "Some Final Words"; Option -> "Amusing Things to Try" with description "Have you...^^ ...been meeped at?^ ...found the game's one Easter Egg?^ ...discovered what XYZZY does (or doesn't do) for you?^ ...tried to take off your armor?^ ...examined yourself at various points in the game?^ ...played the comb?^ ...unfolded the sheet of red paper?^ ...folded the leaf?^ ...touched the compass' various symbols?^ ...climbed the compass?^ ...climbed the bronze gong?^ ...investigated the compass' repercussions outside the garden?^ ...jumped at the banquet?^ ...bathed? (One hopes so...)^ ...recited a sonnet?^ ...found all the game's variant endings?^^ (Yes, I admit it: only the custom(ized) verbs actually needed to get through the meat of the game are listed in the ABOUT/HELP menu.)"; Option -> "For the Copyright-Conscious Sonnet-Reciter" with description [; print "If you've found some of the various poetry fragments in the game, rest assured that anything you don't recognize immediately is by yours truly. In particular, one of the fragments is from my short story ~Alas, Lirette,~ in "; style underline; print "The Magazine of Fantasy and Science Fiction"; style roman; print_ret ", January 2001. Chalk it down to a moment of hubris. Plus, it amused me. And you may safely conclude that I am easily amused."; ]; Option -> "Notes on Development and Setting (Long)" with description [; print "This game's genesis can be blamed on two things: my sister's sudden discovery of and addiction to Interactive Fiction (IF), and my fascination with myth and symbol.^^ For the first, it's probably several kinds of insane to enter one's first work of IF in the IFComp. (I'm told that ~this is my first game~ is a bad way to start an entry...?) I found it to be several kinds of educational, though--I knew beta-testers were helpful and generous souls, but I hadn't realized "; style underline; print "how"; style roman; print " helpful and generous they were!--and the deadline encouraged me to finish the project instead of leaving it to float in limbo.^^ The fact that this is my first game also led to certain design decisions. For one thing, no NPCs. I admire the depth of conversation available in games like Emily Short's "; style underline; print "Pytho's Mask"; style roman; print ", but I peeked at the coding necessary to implement the most basic ASK/TELL system and concluded there was no way I was going to learn enough Inform to do a convincing job with one NPC, let alone several, within the time frame available. Implementing the "; style underline; print "inanimate"; style roman; print " jade compass and its associated seasonal changes turned out to be enough of a headache. I thought of having the player wake up in a tomb (generally a good reason for other people to be absent), the opening lines ~No, not a prison...~ came to me, and I was off and running.^^ (Aside: For an idea of the time I had available: I started learning Inform sometime in July. I got married on 3 August 2002, which was rather more of a priority, and moved from Ithaca, NY to Boston in mid-August. And my husband is already resigned to the fact that he's going to hear me muttering arcanely about ~forgot to give it pluralname~ and ~you should be scenery~ when I'm at my computer.)^^ For another, the tower was a deliberately extensible (or collapsible) design in that I figured I could add as many ~levels~ or floors as I had time for, with a small number of rooms per level. Hence, a wimpy three-storey tower with only half-a-dozen rooms. And no, I don't plan on adding more floors. I think I'm burned out on towers.^^ I also made the mistake of making up puzzles as I went along, which will "; style underline; print "not"; style roman; print " happen again. The only reason I got away with it (or not, as the case may be) was the small size of the game. It has, however, gotten me thinking about modular puzzle design, which might be a good thing, though unfortunately it isn't immediately useful to you.^^ The setting itself draws loosely from Korean, Japanese, Chinese, and Mongolian sources, though you won't find any isomorphisms. I took considerable liberty with the phoenix and dragon; the Heavenly Horse, which appears in a famous Shilla (Korean) tomb, was co-opted into a Moon-figure. The tale of the White Archer was adapted from ~The Legend of Erkhii Mergen, the Archer,~ which you can find in Hillary Roe Metternich's "; style underline; print "Mongolian Folktales"; style roman; print ", but I collided it with the Japanese and Chinese tales of the sun going into hiding and having to be sung back into the world. The chrysanthemum is a familiar Japanese symbol, and some of the earliest ocarinas were found in China. Kite-flying (and sometimes fighting, as well as various militant uses) were recorded from early times in China, Korea, and/or Japan. And for seasonal motifs I drew freely on my years in Korea, where my parents were born.^^ One element had nothing to do with mythology, and came from a homebrew roleplaying setting: the Brixten Shanai, a tower whose starry stairs stretched endlessly into the void. A minor thing, perhaps, but it has some nostalgia value for me and my sister.^^ Finally, one of the attractions of this medium for me is that it allows me both to exercise rusty computer programming skills (though arguably Andrew Plotkin's "; style underline; print "Lists and Lists"; style roman; print " would do that too!) and my writing skills. After getting used to linear storytelling, it was an interesting exercise trying to find some way of conveying a sense of story and setting without ~railroading~ the player overmuch. I've also been on a crusade for non-visual sensory details ever since I read Poul Anderson's rule of thumb for at least one non-visual detail per page. I don't know if I succeeded entirely--puzzle design in particular is going to be an Achilles heel for some time--but now I have a better idea of how to go about it.^^ Now that you've heard more than you ever wanted to know about the game, it's time to send you on your way so I can start working on my "; style underline; print "next"; style roman; print " crazy project!^^ Yoon Ha Lee ["; style underline; print "requiescat@@64cityofveils.com"; style roman; print "]^"; style underline; print "http://pegasus.cityofveils.com/if.phtml"; style roman; print_ret ""; ]; Option -> "A Last Apology" with description "I realize this isn't ~just~ AMUSING things; Sonja Kesserich and David Welbourn kindly told me how to implement NOTES, but I ran out of time to puzzle out all the intricacies of the code. Hence this menu, which I hope isn't too unsatisfactory."; !======================================================================== ! Standard and extended grammar Include "Grammar"; [ LookUpSub; if (noun == 0) print_ret "The ceiling above is only a ceiling."; else print_ret (The) noun, "is not above you."; ]; Extend 'look' * 'up' -> LookUp; [ CutWithSub; if (second == shadow_dagger) print_ret "Even weapons should be used in moderation."; else print_ret "That seems an unlikely way to cut anything."; ]; Extend 'cut' * noun 'with' held -> CutWith; Extend 'take' * noun 'with' held -> TakeWith; Extend 'get' * noun 'with' held -> TakeWith; [ TakeWithSub; print_ret "Try taking ", (the) noun, " without overcomplicating the matter."; ]; Extend 'set' first * noun 'to' topic -> SetTo; Extend 'turn' first * noun -> Set * noun 'to' topic -> SetTo; Extend 'rotate' first * noun 'to' topic -> SetTo; Verb 'spin' * noun -> Set * noun 'to' topic -> SetTo; Verb 'change' * noun -> Set * noun 'to' topic -> SetTo; Verb 'strike' * noun -> Attack; Verb 'bash' * noun -> Attack; Verb 'tear' * noun -> Attack; [ FoldSub; print_ret (The) noun, ": unlikely to yield in such a fashion."; ]; Verb 'fold' * noun -> Fold; [ UnfoldSub; print_ret (The) noun, "is not so easily disassembled."; ]; Verb 'unfold' * noun -> Unfold; [ FlySub; print_ret "Upon what wings?"; ]; Verb 'fly' * -> Fly * noun -> Fly; [ TakeApartSub; print_ret "Even a soldier wishes, at times, not to disturb what has been made."; ]; Extend 'take' * 'apart' noun -> TakeApart; Verb 'breathe' * -> Smell; [ UntieSub; print_ret "That would tax even a weaver's ingenuity."; ]; Verb 'untie' 'unknot' * noun -> Untie; [ PlaySub; print_ret (The) noun, " seems an unlikely instrument."; ]; Verb 'play' * noun -> Play; Extend 'blow' * noun -> Play * 'into' noun -> Play; Verb 'arrange' * noun -> Push * noun 'as' topic -> Push * noun 'to' topic -> Push * noun 'with' held -> TakeWith; [ XyzzySub; print_ret "Did you expect anything to happen?"; ]; Verb 'xyzzy' * -> Xyzzy; [ AboutSub; about_menu.select(); ]; Verb 'about' 'help' * -> About; [ HintSub; hint_menu.select(); ]; Verb 'hint' * -> Hint; [ CombSub; if (tortoise_comb in player) print_ret "It is a comb for taming a lady's hair, not untangling it--or other things."; else print_ret "With what comb?"; ]; Verb 'comb' * topic -> Comb; [ BatheSub; print_ret "In what water?"; ]; Verb 'bathe' * -> Bathe; Verb 'recite' * topic -> Recite; [ ReciteSub; print "(What are you, "; style underline; print "Bartlett's Quotations"; style roman; print_ret "?)"; ]; Extend 'score' replace * -> MyScore; Extend 'full' replace * -> MyScore; [ MyScoreSub; print_ret "This game does not use a point-scoring system, so the only score is the one you give yourself."; ]; ! We're ditching the score in the status bar, as this game doesn't use ! a point-system. Many thanks to Martin Bays for the code, which I ! most definitely didn't have the experience to come up with on my ! own. [ DrawStatusLine width; @split_window 1; @set_window 1; @set_cursor 1 1; style reverse; width = 0->33; spaces (width); @set_cursor 1 2; if (location) PrintShortName(location); @set_cursor 1 1; style roman; @set_window 0; ]; ! And this is due to Andrew Plotkin: ! http://www.eblong.com/zarf/inftricks/bug_noscore.html [ ScoreSub; if (deadflag == 0) "There is no score in this game."; ]; Extend only 'normal' replace * -> LMode2; !! NORMAL = VERBOSE !========================================================================