X-Git-Url: https://jxself.org/git/?a=blobdiff_plain;f=src%2Fborphee.inf;fp=src%2Fborphee.inf;h=dd0b71aa52abb0d984c8b061be197bef7277c273;hb=8cf6c360a875867b3cb9b78b9e73a0e72d527d17;hp=0000000000000000000000000000000000000000;hpb=eabbe6652d6c382ba6fe25cba07074f73020b4d0;p=spiritwrak.git diff --git a/src/borphee.inf b/src/borphee.inf new file mode 100644 index 0000000..dd0b71a --- /dev/null +++ b/src/borphee.inf @@ -0,0 +1,1725 @@ + +! ************************************************************* +! BORPHEE.INF -- add-on for SPIRITWRAK +! ************************************************************* + +! (Single global variable to store progress of 'Trophy room puzzle' +global trophy_stage = 0; ! equals 'stage' completed, up to 4(th) + +Object BORPHEE_GUSStop "Downtown New Borphee" + with description "You're right in the middle of downtown \ +New Borphee -- perhaps the busiest, most crowded \ +city you've ever seen. Huge brand-new buildings \ +and throngs of fast-moving people make the whole \ +scene somewhat surreal. The streets head north to \ +a business district, while a set of stairs here leads \ +down.", + name "buildings" "throngs" "crowd" "people" "streets" "district" +"stairs", + n_to BORPHEE_BD, + d_to BORPHEE_GUSStation, + cant_go "You walk around downtown a bit, are appalled by the \ + sights, and hastily return here.", + ! w_to "You walk around downtown a bit, are disturbed by the \ + ! sights, and hastily return here.", + has light; + +Object BORPHEE_BD "Business District" + with description "You're in a crowded business district filled \ +with busy people. The city thins out a bit to the north, \ +while city streets head west and south. Directly to the east is a \ +building so tall it makes you dizzy just looking at it.", + name "building" "crowd" "streets" "people", + s_to BORPHEE_GUSStop, + n_to BORPHEE_burbs, + w_to BORPHEE_CS, + e_to Skyscraper, + each_turn [; + if (self hasnt general) { + give self general; + move flour_scroll to BORPHEE_BD; + "^A number of people rudely brush past you and \ +accidentally knock you down. A kindly old lady helps you \ +to your feet. ~I think you dropped that,~ she says, pointing \ +to a paper object nearby that doesn't seem familiar. She \ +walks off, and is soon lost in the crowd."; + } + ], + has light; + +Object BORPHEE_CS "City Streets" + with description "You're on some busy side street in New Borphee. \ +There's a crowded walk back east. To the north is the \ +entrance to some sort of open area, with a large open arch.", + name "street" "walk" "area", + e_to BORPHEE_BD, + n_to GUE_Gate, + has light; + +Nearby fake_arch "arch" + with name "open" "arch", + description "A large metal and stone arch. You'll have \ +to get closer to see anything more.", + has scenery; + +Object Skyscraper "Inside Skyscraper" + with description "You're inside a gigantic \ +skyscraper. The marble and brass fixtures and trim \ +exude professionalism. There's a small open chamber \ +to the north. City streets are to the west.", + name "marble" "brass" "fixtures" "trim" "skyscraper" +"streets" "chamber", + w_to BORPHEE_BD, + e_to "You can't go that way.", ! but later... + n_to Elevator, + before [; + Go: + if (noun == n_obj) + print "As you enter the small chamber, metal \ + doors suddenly spring forward and close \ + behind you!^"; + ], + has light; + +Object ss_sign "sign" Skyscraper + with initial "There is a large sign posted near the small chamber.", + name "sign", + description [; + print "The sign reads:^^\ +~ELEVATOR UNDER CONSTRUCTION^PLEASE USE STAIRS."; + if ((self hasnt general) && (magic_door notin Skyscraper)) { + give self general; + "~^^Oddly, there don't seem to be any stairs."; + } + else "~"; + ], + has static; + +Object Elevator "Inside Elevator" + with description "You are inside a cramped metal room, with \ +featureless walls. There are no obvious exits.", + s_to "The doors seem to be closed tight.", + each_turn [; + if (random(20) == 1) { + print "^Suddenly, the doors spring open! You \ +dive out."; + PlayerTo(SkyScraper); + rtrue; + } + ], +; + +Object elevator_sign "sign" Elevator + with name "sign", + initial "There's a small paper sign attached to a wall.", + description "~Shep:^^Put the elevator buttons _here_.^^-T~", + has static; + +! (Not real doors, of course) +!Object elevator_doors "doors" Elevator +! with name "doors" "door", +! description "Solid-looking metal sliding doors.", +! before [; +! Push, Pull, Open: +! "Try as you might, the doors are shut fast."; +! Close: +! "They appear to already be closed."; +! ], +! has scenery; + +Object BORPHEE_burbs "Suburbs" + with description "A suburb starts here, in contrast to the start \ +of a big downtown to the south. For a residential area, \ +it's surprisingly crowded. A main street runs \ +north-south here.", + name "suburb" "downtown" "street", + n_to BORPHEE_Outskirts, + s_to BORPHEE_BD, + has light; + +Object BORPHEE_Outskirts "Outskirts" + with description "New Borphee stops here, although it probably \ +won't for long. A rough trail leads off into some \ +woods to the northwest, or you can enter the city to \ +the south.", + name "trail" "woods" "city", + s_to BORPHEE_burbs, + nw_to BORPHEE_forest, + ne_to "Accardi-By-The-Sea is closed to visitors these days.", + has light; + +Object BORPHEE_forest "Forest" + with description "Deep forest surrounds you. A rough trail runs \ +north and southeast.", + name "forest" "trail", + se_to BORPHEE_Outskirts, + n_to Over_river, + has light; + +Object Over_river "Over River" + with description "You're on a nice new bridge crossing some \ +large river below. Trails lead north and south into \ +woods.", + name "bridge" "trails" "woods", + n_to Forest_trail, + s_to BORPHEE_forest, + before [; + Jump: "Bridge-jumping carries a stiff fine around here."; + ], + has light; + +Object c5 "coin" Over_river class coin_class; + +Object Phee_river "river" Over_river + with name "river" "Phee", + description "Just a large east-west river.", + before [; + Receive: + remove noun; + print "You drop "; DefArt(noun); " into the river and \ + watch it disappear."; + Search, LetGo, Rub, Take, Push, Pull, Touch, Squeeze, Turn, Shake: +"The river is far below the bridge."; + ], + has scenery container; + +Object Forest_trail "Forest Trail" + with description "A beaten trail cuts through some very dense \ +forest running north and south.", + name "trail" "forest", + s_to Over_river, + n_to Ravine_pass, + has light; + +Object Ravine_pass "Ravine Pass" + with description "A forest ravine opens into some sort of clearing \ +to the north here, or a trail heads south.", + name "ravine" "forest" "clearing" "trail", + s_to Forest_trail, + n_to [; + if (army in self) + "The group of soldiers won't let you pass."; + else return Forest_clearing; + ], + has light; + +Nearby army "group of soldiers" + with name "group" "soldiers" "army", + description "A group of well-armed soldiers, who look a little \ + haggard.", + life [; + Attack: "Forget it."; + default: "The soldiers are a little too weary to pay you any \ +direct attention at the moment."; + ], + has animate; + +! (A rather mangled version of the Byzantine Generals Problem) +! (actually, completely different -- i.e., the BGP is unsolvable +! with three armies...) + +Object wicker_cage "wicker cage" Ravine_pass + with name "cage" "wicker", + description "A wicker cage, with two compartments, and a lever \ +attached to the front.", + capacity 3, + size 20, + before [; + Open: + "You can't seem to pry open the cage door by hand."; + ], + add_to_scope cage_lever, + has static container transparent; + +Object cage_lever "lever" + with name "lever", + description "A wooden lever attached to the cage.", + before [; + Pull: + if (Morgan in Delbins) + "A soldier slaps your hand away. ~That windcat \ + messenger box belongs to our Captain, \ + Morgan Grueslayer, so don't mess with it!~"; + if (Morgan notin Ravine_pass) + "You pull the lever and watch the cage door \ + momentarily open, then shut."; + if ((children(E_windcat) == 0) || (children(W_windcat) == 0)) + "Morgan stops you and points at the windcats. ~An \ +instruction must be sent with both of the cats, using the signal flags!~"; + print "Morgan stops your hand, just as you are about to \ +pull the lever. She looks at the cats. \ +~Are you quite sure, Priest?~^^\ +Now, that seems like a reasonable question. So, are you? "; + if (YesOrNo() == 0) "You pause, to reconsider."; + else { + remove E_windcat; + remove W_windcat; + remove army; + remove Morgan; + print "You nod and yank the lever. The cage door \ + latch is loosened enough for both windcats to break free! The \ + spotted windcat tears off to the west, and the speckled cat \ + zips off to the east!^^There is a somewhat stressful pause.^^"; + ! simply put, the flags must both be red + if (((rf1 in E_windcat) && (rf2 in W_windcat)) || + ((rf2 in E_windcat) && (rf1 in W_windcat))) { + Achieved(13); + "Simultaneously, from the east and west, a three horn signal sounds! \ + Morgan smiles triumphantly. ~A truce has been declared! The \ + war has ended!~ The army soldiers yell a round of ~Three cheers!~ \ + before heading off. Morgan shakes your hand \ + with almost enough force to break it. ~Well done indeed, Priest. \ + Your wisdom only compliments your tranquil nature.~ She walks off, \ + seeking the next challenge."; + } + else { + move battle to Forest_clearing; + "Suddenly, from somewhere, a single horn note sounds! The sounds \ + of a fight to the north are soon heard. Morgan \ + gives you a sad, tired look. ~Perhaps it was meant to be,~ she \ + says, as she and the army quickly march north to join their \ + comrades."; + } + } + ], + has static; + + +Object rf1 "red flag" Ravine_pass + class flag_class, + with name "red", + plural "red flags", + description "A red square of cloth."; +Object rf2 "red flag" Ravine_pass + class flag_class, + with name "red", + plural "red flags", + description "A red square of cloth."; +Object bf1 "blue flag" Ravine_pass + class flag_class, + with name "blue", + plural "blue flags", + description "A blue square of cloth."; +Object bf2 "blue flag" Ravine_pass + class flag_class, + with name "blue", + plural "blue flags", + description "A blue square of cloth."; + +Object E_windcat "speckled windcat" wicker_cage + with name "windcat" "cat" "speckled", + description "A sleek, speckled salt-and-pepper windcat, with \ +large paws.", + capacity 1, + before [; + Take: + "The windcat hisses and struggles until you desist."; + Receive: + if (noun hasnt is_flag) + "I don't think the windcat would appreciate that."; + Push, Pull, Attack, Squeeze, Turn: + "I don't think the windcat would appreciate that."; + Rub, Touch: "The windcat purrs."; + ], + has supporter; + +Object W_windcat "spotted windcat" wicker_cage + with name "windcat" "cat" "spotted", + description "A sleek, spotted black-and-white windcat, with \ +large paws.", + capacity 1, + before [; + Take: + "The windcat hisses and struggles until you desist."; + Receive: + if (noun hasnt is_flag) + "I don't think the windcat would appreciate that."; + Push, Pull, Attack, Squeeze, Turn: + "I don't think the windcat would appreciate that."; + Rub, Touch: "The windcat purrs."; + ], + has supporter; + +Object Forest_clearing "Forest Clearing" + with description "A open clearing is surrounded by forest trees here. \ +A ravine pass is to the south, and a short trail heads northwest. \ +You can just see a small cave opening to the northeast.", + name "clearing" "forest" "trees" "ravine" "pass" "trail" "cave", + s_to Ravine_pass, + nw_to [; + if (battle in self) + "You're not getting past that bloody battle (intact)."; + else return Forest_brambles; + ], + ne_to [; + if (battle in self) + "You're not getting past that bloody battle (intact)."; + else return Forest_cave; + ], + has light; + +Object battle "bloody battle" + with name "battle" "war" "warriors", + initial "There's a violent battle taking place in the middle \ +of the field.", + description "It's a fierce battle. Kobolds and soldiers are locked \ +in mortal combat. Getting too close would be certain death.", + life [; + Attack: + deadflag = 1; + "You give a yell and plunge into the battle, and get \ +skewered by a kobold arrow moments later."; +default: "At the moment, everyone seems rather occupied."; + ], + has animate; + +Object Forest_brambles "Forest Brambles" + with description "There's a small area of forest surrounded by \ +brambles and shrubs here. A trail leads southeast.", + name "forest" "brambles" "shrubs" "trail", + se_to Forest_clearing, + has light; + +Object Forest_cave "In front of cave" + with description "A small cave mouth enters into darkness to the \ +north here. A clearing lies to the southwest.", + name "cave" "mouth" "darkness" "clearing", + sw_to Forest_clearing, + n_to CAVE_NSTUNNEL, + has light; + +Object CAVE_NSTUNNEL "North-South Tunnel" + with description "You're in a natural cave tunnel running north and \ +south. To the south you can see a glimmer of daylight.", + name "glimmer" "daylight" "tunnel", + s_to Forest_cave, + n_to CAVE_INTER, + ; + +Object CAVE_INTER "Tunnel Intersection" + with description "Several natural cave tunnels intersect here, \ +running north, south, and east.", + name "tunnel" "tunnels", + s_to CAVE_NSTUNNEL, + n_to CAVE_CURVE, + e_to CAVE_NCREVASSE, + ; + +!Object CAVE_BARE "Bare Cavern", +! with description "A bare cavern. The exit is east.", +! e_to CAVE_INTER, +! ; + +Object CAVE_CURVE "Twisting Tunnel", + with description "A natural cave tunnel makes short twists and \ +turns here, running south and east.", + name "tunnel" "twists" "turns", + s_to CAVE_INTER, + e_to CAVE_DAMP, + ; + +Object CAVE_DAMP "Damp Cave" + with description "You're in a small cave with noticeably damp walls. \ +Exits lie to the west and south.", + name "cave" "damp", + w_to CAVE_CURVE, + s_to CAVE_NCREVASSE, + ; + +Object CAVE_NCREVASSE "Sloping Tunnel" + with description "You're in a windy tunnel that gradually slopes up to the \ +east, or down to the west. A cold breeze blows from a tunnel to the north.", + name "tunnel" "breeze", + w_to CAVE_INTER, + n_to CAVE_DAMP, + e_to CAVE_WINDY, + d_to CAVE_INTER, + u_to CAVE_WINDY, + ; + +Object CAVE_WINDY "Windy Tunnel" + with description "A strange wind seems to howl through this \ +winding tunnel heading east and west. A crack in the tunnel \ +wall exposes an exit north.", + name "wind" "tunnel" "crack", + w_to CAVE_NCREVASSE, + e_to CAVE_BARE2, + n_to Ancient_Tunnel, + before [; + Listen: "A light wind howls through this tunnel."; + ], + ; + +Object CAVE_BARE2 "Bare Cavern", + with description "A bare cavern. The exit is west.", + w_to CAVE_WINDY, + ; + +! (torn -- planes are reachable) +Object p4 "torn parchment" CAVE_BARE2 + class parchment_class, + with name "torn", +description "~...places no mortal man should go, \ +There are planes of existence far beyond our own, that \ +connect and interlace, so that even mortal man may \ +tread upon the featureless gray of . But, \ +I believe that there may be other planes, perhaps \ +where the Implementors are said to live. Are these \ +places just parts of existing planes or planes unto \ +themselves? I do not...~"; + +Object Ancient_Tunnel "Ancient Hallway" + with description "You're in a stone hallway, clearly man-made. \ +The dust and musty smell indicate the place hasn't \ +been used in quite some time. The corridor runs north, while the \ +south wall has a large crack, creating a dark opening.", + name "dust" "hallway" "crack" "opening", + s_to CAVE_WINDY, + n_to End_of_hall, + before [; + Smell: "The air smells a bit musty and stale."; + ], + ; + +Object End_of_hall "End of Hallway" + with description "You're at the north end of a long stone hallway. \ +You can follow the hallway back south, or you can take a set of \ +cracked stone stairs up.", + name "hallway" "stairs", + s_to Ancient_Tunnel, + u_to Domed_chamber, + ; + +Object Domed_chamber "Domed Chamber" + with description [; + print "You are in a large man-made underground chamber, with a \ +perfectly domed high ceiling. Smooth stone archways lead to rooms to the \ +north, south, east and west. Stone cut steps lead down. In the very \ +center of the ceiling you notice a strange circular depression in \ +the stone"; + if ((self hasnt general) && (amulet has worn)) { + give self general; + ".^^Your amulet suddenly gives off a flash of purple light, then fades!"; + } + else "."; + ], + name "dome" "archways" "steps" "ceiling", + d_to End_of_hall, + n_to TROPHY_N, + e_to TROPHY_E, + s_to TROPHY_S, + w_to TROPHY_W, + u_to "The ceiling is too far above you."; + +Nearby fake_depression "depression" + with name "depression" "circle" "hole", + description "It looks like a slightly recessed circular depression \ +in the ceiling. It's hard to tell from here if it was something cut out of \ +the stone, or perhaps it's a separate piece.", + has scenery; + +! (Player can only get here in end game, and probably doesn't want to be here either) +Object TROPHY_SECRET "Secret Trophy Room" + with description "You're in a small domed stone room. The only exit, \ +unfortunately, is a hole in the stone floor to a floor of another chamber \ +far below. Engraved in the wall is: ~LORD DUNCANTHRAX'S PRIVATE TROPHY \ +ROOM~.", + number 0, + name "hole", + each_turn [; + if (TROPHY_SECRET.number == 0) { + TROPHY_SECRET.number = 1; + TROPHY_SECRET.description = "You're in a small domed stone room. \ +There appear to be no exits -- the hole in the floor appears to have been \ +sealed with stone. Engraved in \ +the wall is: ~LORD DUNCANTHRAX'S PRIVATE TROPHY ROOM~."; + give self ~light ~visited; + "^Lord Duncanthrax and some of his soldiers are here.^^\ +Duncanthrax looks up and sees you. ~Who is that?~ he asks. ~Looks like a \ +priest,~ a soldier says. ~Wonderful. First, the black paint, and now, \ +a priest breaks into my trophy room.~ He sighs. ~Will no one rid me of \ +this meddlesome priest?~ One of the soldiers takes the hint and knocks \ +you out cold.^^You awake a short time later."; + } + else { + deadflag = 1; + "^You soon run out of air in the sealed stone room."; + } + ], +has light; + +Object TROPHY_N "North Trophy Room" + with description "This is a bare cubical stone chamber. Some worn black \ +lettering on the wall reads: ~THE EAST CHAMBER IS NOT THE FIRST TROPHY \ +ROOM~. An archway exits south.", + name "archway" "stone", + s_to Domed_chamber, +; + +Object TROPHY_E "East Trophy Room" + with description "This is a bare cubical stone chamber. Some worn black \ +lettering on the wall reads: ~THE NORTH CHAMBER HAS SILVER LETTERING~. \ +An archway exits west.", + name "archway" "stone", + w_to Domed_chamber, +; +! sigh: logic bug in rel 1. Try the following stmt below instead. Note +! that two solutions are possible in this case... +! on the wall reads: ~THE NORTH CHAMBER HAS GOLD LETTERING AND THE SOUTH \ +! CHAMBER IS THE SECOND TROPHY ROOM~. \ + +Object TROPHY_S "South Trophy Room" + with description "This is a bare cubical stone chamber. Some worn black \ +lettering on the wall reads: ~THE EAST CHAMBER HAS SILVER LETTERING AND \ +I HAVE GOLD LETTERING~. An archway exits north.", + name "archway" "stone", + n_to Domed_chamber, +; + +Object TROPHY_W "West Trophy Room" + with description "This is a bare cubical stone chamber. Some worn black \ +lettering on the wall reads: ~EITHER I AM THE SECOND TROPHY ROOM AND THE \ +NORTH CHAMBER IS THE LAST TROPHY ROOM, OR I HAVE GOLD LETTERING~. \ +An archway exits east.", + name "archway" "stone", + e_to Domed_chamber, +; + +Object lettering "lettering" + with name "lettering" "black" "writing", + description [; ; ], + found_in TROPHY_N TROPHY_E TROPHY_S TROPHY_W, + has scenery; + +! (Now, the special key depressions +! AUTHOR NOTE: Originally, I represented all 4 by one object. I +! switched to four identical but separate objects to simplify the +! ease of have the trophy still sitting in the given depression +! (potentially increasing the likelihood that the player might +! drop the trophy in more than once, thereby fouling the puzzle) +Object Nkey_depression "circular depression" TROPHY_N + class trophy_dep_class, + with before [; + Receive: + if (noun ~= trophy) + "That doesn't quite fit."; + else { + if (trophy_stage == 3) { + ! got it --- drop rod if in chamber + trophy_stage = 0; ! could get 'reset' + print "You hear a click"; + move trophy to self; + if (white_rod_piece in TROPHY_SECRET) { + Achieved(14); + move white_rod_piece to Domed_chamber; + move air_spirit to Domed_chamber; + Domed_chamber.description = "You are in a large man-made underground chamber, with a \ +perfectly domed high ceiling. Smooth stone archways lead to rooms to the \ +north, south, east and west. Stone cut steps lead down. In the very \ +center of the ceiling you notice a circular hole."; + fake_depression.description = "It's a small circular hole shrouded in darkness."; + ", followed by a dull thump \ + from the south."; + } + else "."; + } + else { + trophy_stage = 0; ! reset + move trophy to self; + "You hear a click."; + } + } + ], +; + +Object Ekey_depression "circular depression" TROPHY_E + class trophy_dep_class, + with before [; + Receive: + if (noun ~= trophy) + "That doesn't quite fit."; + else { + move trophy to self; + if (trophy_stage == 0) trophy_stage = 1; + else trophy_stage = 0; ! reset + "You hear a click."; + } + ], +; + +Object Skey_depression "circular depression" TROPHY_S + class trophy_dep_class, + with before [; + Receive: + if (noun ~= trophy) + "That doesn't quite fit."; + else { + move trophy to self; + if (trophy_stage == 2) trophy_stage = 3; + else trophy_stage = 0; ! reset + "You hear a click."; + } + ], +; + +Object Wkey_depression "circular depression" TROPHY_W + class trophy_dep_class, + with before [; + Receive: + if (noun ~= trophy) + "That doesn't quite fit."; + else { + move trophy to self; + if (trophy_stage == 1) trophy_stage = 2; + else trophy_stage = 0; ! reset + "You hear a click."; + } + ], +; + +! (GUE Tech -- with new curriculum...) +Object GUE_Gate "GUE Entrance" + with description "You're standing under an open archway that has \ +the letters ~GUE TECH~ prominently displayed in \ +twisted brass and copper. A busy street lies to the \ +south, and the campus quad opens up to the north.", + name "letters" "street" "quad", + s_to BORPHEE_CS, + n_to GUE_QuadS, + has light; + +Nearby GUE_arch "archway" + with name "arch" "archway", + description "It's an elaborate metal and stone affair that \ +probably cost a fortune. On one side, an inscription reads \ +~Forburn Gate~.", + has scenery; + +Object GUE_QuadS "South Quad" + with description "You're walking across a grassy field. More \ +lawn lies to the north, while an archway exits the area to the \ +south. To the west is a low stone building with the word \ +~GYMNASIUM~ etched in stone across the entrance. To the east \ +is a old brick building covered in ivy.", + name "grass" "field" "lawn" "archway" "building" +"ivy", + s_to GUE_Gate, + n_to GUE_Quad, + w_to GUE_Gym, + e_to GUE_Hum, + has light; + +Object GUE_Quad "Center of Quad" + with description "The center of the campus is a nicely tended \ +green lawn with a bronze statue in the center. \ +Paths lead north and south across grassy fields. \ +To the west is a small brick building. To the east \ +is a large stone building with a lintel roof and the \ +words ~WOOMAX LIBRARY~ enscribed across the entrance.", + name "lawn" "grass" "fields" "building" "lintel", + s_to GUE_QuadS, + n_to GUE_QuadN, + w_to GUE_Cafe, + e_to GUE_Library, + each_turn [ i ; + i = random(20); + if (i==8 or 17) + "^Some students walk by. They must be upperclassmen, \ +as they don't even look in your direction."; + if (i==9 or 14) + "^Some students walk by. They must be underclassmen, \ +as some of them look at you with puzzled expressions."; + ], + has light; + +Nearby belboz_statue "statue" + with name "statue" "bronze", + description "An old bronze statue of a wise-looking \ +man in wizard's clothes with a stern, disapproving look. An inscription \ +at the base reads ~BELBOZ AT MITHICUS~.", + has scenery; + +Object GUE_QuadN "North Quad" + with description "You're walking across a grassy field. More \ +lawn lies to the south, while a large building that resembles a \ +auditorium of some sort is north. An inscription near the entrance \ +reads ~ENCHANTER HALL~. To the west you see a small house-like \ +building. To the east you see a low stone building, clearly new \ +and rather modern looking in contrast to its surroundings.", + name "grass" "field" "lawn" "building" "auditorium", + s_to GUE_Quad, + n_to GUE_Enchanter_hall, + w_to GUE_Dorms, + e_to GUE_Labs, + has light; + +Object GUE_Gym "Gymnasium" + with description "There's a large field house here, filled with \ +gym equipment and helpful rubber mats. The exit is east.", + e_to GUE_QuadS, + before [; + Jump: "You do a bit of exercise."; + ], + has light; + +Nearby gym_stuff "equipment" + with description "Various things useful to those who exercise.", + name "equipment" "mats", + before [; + Pull, Push: "You do a bit of exercise."; + ], + has scenery; + +Object dorm_key "flat key" GUE_Gym + with name "key" "flat" "dorm", + initial "Someone left a key here.", + description "A flat metal key with ~102~ marked on one side.", + !weight 5, + size 5, +; + +Object GUE_Hum "Humanities Building" + with description "You're in the humanities building, which is \ +vacant and closed for the summer. The exit is west.", + w_to GUE_QuadS, + has light; + +Object History_book "history book" GUE_Hum + with name "book" "history", + initial "Someone left a history book here.", + description "It's a biography on the life and times of \ + Duncanthrax the Bellicose. Most of it chronicles fairly \ + dry stuff about his much publicized conquests of the \ + Eastlands and his famous battles. There is an interesting \ + bit about some secret trophy chamber that Duncanthrax \ + had constructed near the end of his reign, but for more \ + details, I'd suggest ~look up (word) in book~ specifically.", + before + [ w1; Consult: + if (consult_words > 1) + "The index is rather terse, try limiting your lookup \ + to one word."; + wn = consult_from; w1 = NextWord(); + switch (w1) { + 'trophy', 'secret': + "Apparently, in 680 GUE, Duncanthrax grew increasingly \ + withdrawn. At this time, of foremost importance to him was his collection of \ + various battle trophys and awards he had bestowed to \ + himself (for unusual valor on the field of battle) \ + over the years. He decided to construct a hidden \ + underground chamber south of Egreth to sequester this \ + collection, which would be locked in a most clever means. \ + He decided to order the construction of \ + a ~four-room key~ which, when a miniature trophy \ + was inserted and removed (once) in a special keyhole in each \ + of the four rooms (in a specific order), would unlock a holding chamber \ + in a center room containing his prized trophies. \ + Priding himself on his logic skills, he requested that \ + two captured foreigners produce a logic puzzle plainly \ + inscribed in the four key rooms themselves that would \ + detail the exact order that the key rooms were to be \ + ~applied~. A Prevaricon, \ + who could not help but write untruths, was given a can of \ + gold paint, while a Veritassi, who could only write the \ + truth, was given a can of silver paint. Imagine \ + Duncanthrax's rage when he discovered that the two \ + prisoners had secretly painted over their gold and \ + silver key phrases with _black_ paint! \ + The prisoners were \ + summarily executed, of course, but Duncanthrax sealed \ + off the chamber and researchers can only guess at \ + the final fate of the trophy collection of Duncanthrax."; + 'Zilbo': + "Zilbo the third was overthrown in the great revolt lead \ + by Duncanthrax in 659 GUE. The biographers suggest \ + reading their companion text ~How Zilbo Came to Mithicus~."; + 'Griffspotter', 'Antharia': + "In 665 GUE, Duncanthrax humiliated the Antharian naval \ + Armada in the famous battle at Fort Griffspotter. \ + (Well, okay, there's quite a bit more in the book about \ + this battle, but remember, you're a priest, not a \ + navy sailor.)"; + 'Diablo', 'Massacre': + "In 666 GUE, Duncanthrax invaded Zorbel Pass in the \ + Eastlands and severely trounced a local militia of \ + trolls armed with clubs and garlic. The key \ + significance of this victory on Duncanthrax's \ + conquest of the Eastlands, as well as the immediate \ + recall of all vampiric soldiers in Duncanthrax's \ + military force, cannot be understated."; + 'Ogre', 'battle', 'duel': + "In late 666 GUE, Duncanthrax was engaged in a fierce \ + battle with forces near Globby Hills. In a brilliant \ + tactical move, Duncanthrax goaded the opposing force \ + into decided the fate of the battle on a single duel -- \ + himself versus their champion. Unfortunately for \ + Duncanthrax, the Globby Hill champion turned out to \ + be an Ogre of immense size. In an attempted diversion, \ + Duncanthrax was quoted as saying to the Ogre, \ + ~It's all right, we're with Silvermane.~ The Ogre \ + was quoted as responding with ~Huh?~. Duncanthrax then, \ + perhaps in a moment of sheer bravado, was heard to \ + say ~Your shoes are untied.~ As the Ogre bent down \ + to examine his unshod feet, Duncanthrax gave the \ + signal, and the Ogre was buried under a massive \ + pile of granola."; + 'Silvermane': + "Silvermane, the book notes, was the name of \ + Duncanthrax's pet Dire Wolf."; + 'Index', 'index': + "There appear to be notable entries on ~trophy~, \ + ~Zilbo~, ~Griffspotter~, ~Diablo~, ~Ogre~, and \ + ~Silvermane~."; + default: + "You can't find anything interesting about that."; + } + ], + !weight 20, + size 15, +; + +Object GUE_Cafe "Cafeteria" + with description "A small cramped area with lots of tables and \ +chairs and food stains. The exit is east.", + name "table" "tables" "chair" "chairs" "food" "stains", + e_to GUE_Quad, + has light; + +Nearby cafe_mess "mess" + with name "mess" "cups" "napkins" "junk", + initial "Someone must've had a late night recently, as \ +there is quite a mess of coffee cups, napkins, and other junk \ +on one table.", + before [; + Search: + if (self hasnt general) { + give self general; + move sugar_cube to GUE_Cafe; + move decaf_coffee_can to GUE_Cafe; + "You dig through the mess and find an \ +unopened can of coffee and a sugar-cube."; + } + Take: + "There's too much to carry."; + Rub, Push, Pull, Turn, Touch, Shake: +"You mess with the mess. Nothing happens."; + ], + has static; + +Object sugar_cube "sugar cube" + with name "sugar" "cube", + short_name "sugar cube", + description "A perfect featureless white cube (of sugar).", + !weight 5, + size 5, + has edible; + +Object GUE_Library "Library" + with description "A student library is here, filled with \ +various texts. The exit is west.", + w_to [ x y z ; + objectloop (x in player) { + if ((x == marked_scroll) && (librarian hasnt general)) +"Some strange invisible force stops you as you try \ +to leave. The librarian doesn't look up, but merely says, \ +~If you want to check something out, I'll \ +need to see some ID first.~"; +! (now, instead of doing recursive tree traverse, I do two levels +! of checking, to save code space, since there aren't that many +! workable containers in this game) + if (children(x) > 0) { + objectloop (y in x) { + if ((y == marked_scroll) && (librarian hasnt general)) +"Some strange invisible force stops you as you try \ +to leave. The librarian doesn't look up, but merely says, \ +~If you want to check something out, I'll \ +need to see some ID first.~"; + if (children(y) > 0) { + objectloop (z in y) { + if ((z == marked_scroll) && (librarian hasnt general)) +"Some strange invisible force stops you as you try \ +to leave. The librarian doesn't look up, but merely says, \ +~If you want to check something out, I'll \ +need to see some ID first.~"; + } + } + } + } + } + return GUE_Quad; +! if ((marked_scroll notin GUE_Library) && (librarian hasnt general)) + ], + has light; + + +Object magazine_lib "wrinkled magazine" GUE_Library + with name "magazine" "wrinkled" "report", + initial "There's a wrinkled magazine (~US News and Dungeon Report~) here.", + description "SPIRITWRAK Author notes:^\ +3/96 -- Initial (beta) release. Functionally complete, some \ +nagging bugs and typos may still be present.^\ +4/96 -- Second release. Reported bugs fixed. A few puzzles \ +added, some removed.^\ +6/96 -- Third release. Bug fix release.", + size 15; + + + +Object GUE_Dorms "Dorms" + with description "You're in a short hallway inside some student \ +dormitories. The exit is east.", + e_to GUE_QuadN, + n_to dorm_doorN, + s_to dorm_doorS, + w_to "You wander the halls a bit and return here.", + has light; + +Object dorm_doorN "northern door" GUE_Dorms + with name "door" "northern", + when_closed "There's a closed door to the north.", + when_open "There's an open door to the north.", + description "A wooden door with a keylock. A note \ +attached to it says ~DOING WORK ABROAD~.", + with_key dorm_key, + door_dir n_to, + door_to GUE_dormroom, + after [; + Open: + give dorm_doorN2 open; + Close: + give dorm_doorN2 ~open; + ], + has static door openable lockable locked; + + +Object dorm_doorS "southern door" GUE_Dorms + with name "door" "southern", + when_closed "There's a closed door to the south.", + description "A wooden door with a keylock. A note \ +attached to it says ~BEWARE OF DOG~.", + door_dir n_to, + door_to GUE_Dorms, ! doesn't really go anywhere + before [; + Open: + deadflag = 1; + "As you open the door, an enormous hellhound jumps \ +out! The unusual watchdog creeps back into the room and closes the \ +door -- after having mauled you to pieces, of course."; + ], + has static door openable lockable; + +Object GUE_ID1 "dirty ID card" GUE_Dorms + with name "ID" "card" "dirty", + description "A slightly dirty ID card. There's a picture \ +of some woman with short dark hair and glasses, and the name \ +~Stephanie~ on the front.", + size 5, +; + +Object GUE_ID2 "clean ID card" + with name "ID" "card" "clean", + description "An ID card with a picture \ +of some young student and the name \ +~Harold~ written on the front.", + size 5, +; + +Object GUE_dormroom "Dorm room" + with description "A cramped room, mostly empty, with some \ +bare furnishings.", + name "furnishings" "desk" "chair" "bed", + s_to dorm_doorN2, + has light; + +! (due to short name confusion ("northern door"), 2nd half +! of this door done separately) +Object dorm_doorN2 "door" GUE_dormroom + with name "door", + when_closed "There's a closed door to the south.", + when_open "There's an open door to the south.", + description "An unremarkable wooden door.", +! with_key dorm_key, + door_dir s_to, + door_to GUE_Dorms, + after [; + Open: + give dorm_doorN open ~locked; + Close: + give dorm_doorN ~open; + ], + before [; + Lock: + "You can't lock the door from this side."; + Unlock: + "You can't unlock the door from this side."; + ], + has static door openable lockable; + +!Nearby dormroom_furnishings "furnishings" +! with name "furnishings" "desk" "chair" "bed", +! description "Minimal furnishings -- a desk and chair, \ +!a small bed. Almost reminds you of the Monastery.", +! has scenery; + +Object textbook "textbook" GUE_dormroom + with name "book" "textbook" "text", + initial "A forgotten textbook is lying in one corner of \ +the room.", + description [; + if (self hasnt open) + "The cover reads ~Ancient Mythology~."; + else + "~A colorful myth among ancient races has been \ +called 'The myth of the Four Brothers' by Elder Kroonwatz \ +(the famous Royal Chronicler). The story states that at the dawn of time, four \ +evil gods, who were brothers, sought dominance over that \ +which would become our world. Great battles were fought \ +between forces of light and darkness, and these \ +brothers were often victorious. \ +Fortunately for us, they \ +could not cooperate with each other, and \ +fought amongst themselves in petty power \ +struggles, driven individually by power and greed. +Indeed, legends state that on occassions, the brothers \ +would seek ways to actually destroy their own siblings, \ +along with the forces of good. \ +One brother constructed a strange artifact that would \ +have given him great power, but was discovered by agents of good. \ +He was imprisoned within the very object he built. The remaining \ +three, facing certain defeat without the combined strength of their \ +trapped brother, fled into planes unknown, but made a pact \ +that if the brother were ever freed, and the artifact of \ +power returned to him, the four would \ +agree to make their final attack against the forces of good. \ +Kroonwatz points out the obvious parallels with various other \ +mythologies that foretell the end of the known world.~"; + ], + !weight 20, + size 15, + before [; + Open: + if (self hasnt general) { + give self general; + give self open; + move GUE_ID2 to parent(player); + "As you open the book, a small card flies out and lands \ +at your feet."; + } + ], + has openable; + +Object GUE_Enchanter_hall "Enchanter Hall (top)" + with description "You're at the top of a large auditorium which \ +is empty. You can walk down a long aisle to the \ +front of the hall, or out to the south.", + name "aisle" "seats", + s_to GUE_QuadN, + d_to GUE_Enchanter_hall_front, + n_to GUE_Enchanter_hall_front, + has light; + +Object GUE_Enchanter_hall_front "Enchanter Hall (bottom)" + with description [; + print "You're at the very front of a large \ +auditorium. From here you can look south and sees rows upon \ +rows of empty seats focused on the stage-like area where you now \ +stand. You can walk back into the seats to the south"; + if (hall_switch has on) + ". A soft dim glow highlights your current area."; + else "."; + ], + name "rows" "seats" "glow", + s_to GUE_Enchanter_hall, + u_to GUE_Enchanter_hall, + has light; + +Nearby hall_switch "switch" + with name "switch", + initial "There's a curious switch in the wall here.", + description "A small switch in the far wall.", + before [; + SwitchOn: + if (self hasnt on) { + give self on; + print "You hear a click. A dim light now makes the \ +nearby area less gloomy.^"; + } + else "It seems to be on already."; + if (self hasnt general) { + give self general; + move notebook to hall_desk; + "^A student creeps out of the shadows. He looks \ +at you sheepishly. ~Sorry I haven't been to class all semester, \ +Professor,~ he begins. ~Anyway, here's my final paper.~ He puts \ +a notebook on the desk. ~All this stuff about the new 'science' \ +-- I don't know what all the fuss \ +is about. Magic was okay too, wasn't it? There's a part in my \ +conclusion where --~ He stops and looks at the notebook. ~Well, \ +anyhow.~ he says, and disappears back into the shadows."; + } + else rtrue; + SwitchOff: + if (self has on) { + give self ~on; + "The dim light fades."; + } + else "It seems to be off already."; + ], + has static switchable; + +Object hall_desk "large desk" GUE_Enchanter_hall_front + with name "desk", + description "A long desk sits in the middle of this area.", + capacity 30, + has static supporter; + +Object notebook "notebook" + with name "notebook", + capacity 3, + description "A plain white notebook with some loose pages.", + !weight 10, + size 10, + before [; + Receive: + if ((noun ~= term_paper) && (noun hasnt is_scroll)) + "You can't put that into the notebook."; + ], + has container openable; + +Object term_paper "term paper" notebook + with name "paper" "term", + !weight 5, + size 10, + description "~Magic, so what's it good for?~ by \ +Wilbur Lunchbox. It's a long-winded haphazard writing about \ +the virtues of magic in a time of science. Some of the topic \ +sentences are particularly clumsy. However, there's an insightful \ +bit at the end about how under certain circumstances, magic and \ +science become indistinguishable.", +; + +Object GUE_Labs "Science Center" + with description "You are in a short hallway of some new \ +building. The words ~SCIENCE CENTER~ are painted on one wall. \ +The hallway opens to rooms to the east, or you can escape to the west.", + name "words", + w_to GUE_QuadN, + e_to GUE_Labs_Eng, + has light; + +Object GUE_Labs_Eng "Engineering Labs" + with description "\ +You shudder as you look around this area. \ +Clearly a place of science, piles of heavy machinery and strange \ +delicate-looking tools and artifacts are everywhere here. Hallways \ +run west and east.", + name "machinery" "tools" "artifacts", + w_to GUE_Labs, + e_to GUE_Labs_Office, + s_to GUE_Lab_door, + has light; + +Object wood_book "research paper" GUE_Labs_Eng + with name "paper" "research", + description "~On the Structural Strength of Woods~, \ +a short, fairly dry research paper. Apparently, the researcher was testing \ +the breaking point of various woods. The conclusions reached \ +are summed up in the final paragraph:^^\ +~In summary, our findings indicate that out of the materials \ +tested, Ebony wood is clearly the best choice, and Balsa wood \ +clearly the worst. Balsa wood structures broke immediately when \ +even the slightest weight was tested on them. Pine wood structures \ +fared slightly better, holding light weights, but tended to break \ +on repeated stress. Ebony wood structures were approximately twice \ +as strong as Pine structures, holding up to at least one repeated \ +stress test before breaking.~", + !weight 5, + size 15; + +Object GUE_Labs_Office "Office" + with description "You're in a small office of some sort. The \ +only exit is west.", + w_to GUE_Labs_Eng, + has light; + +Nearby Lab_desk "desk" + with name "desk", + initial "A small desk sits in one corner here.", + description "It's quite tiny really.", + has static supporter; + +Object Lab_journal "lab journal" Lab_desk + with name "journal" "lab", + description "Some loose handwritten pages read:^\ +^~...DAY 14) We've put the artifact in the south lab. Still \ +^ no idea what it does, but I'm sure I can find \ +^ some lab student who can figure it out. \ +^ DAY 20) My lab assistant Peabody believes that it's \ +^ some sort of 'mystical gate'. \ +^ Clearly this is hogwash. However \ +^ my grant has been awarded, so I have allowed \ +^ Peabody to continue work. \ +^ DAY 25) Peabody demonstrated something fantastic today. \ +^ He took my briefcase and put it on \ +^ the artifact and in a white flash, it was gone! \ +^ DAY 27) This is my last entry. I am leaving the University \ +^ tomorrow. Peabody, in my request to retrieve my briefcase \ +^ stepped onto the artifact, and was gone! I've read \ +^ his recent research notes, and if he's right, he's \ +^ now lost in a place unimaginable! I've locked the \ +^ artifact away and destroyed the combination -- I pray no \ +^ one ever sees it again!...~\ +^ (The journal breaks off here)", + !weight 15, + size 15, +; + +Object GUE_Lab_door "lab door" + with name "door" "lab", + when_closed [; + print "There's a closed heavy metal door to the"; + if (self in GUE_Labs_Eng) + " south."; + else " north."; + ], + when_open [; + print "There's an open metal door to the"; + if (self in GUE_Labs_Eng) + " south."; + else " north."; + ], + description "A large door made of some shiny hard metal. \ + There are no obvious handles or hinges.", + door_dir [; + if (self in GUE_Labs_Eng) return s_to; + else return n_to; + ], + door_to [; + if (self in GUE_Labs_Eng) return GUE_Labs_SECRET; + else return GUE_Labs_Eng; + ], + before [; + Close: + if (self has open) { + left_dial.number = random(9); + right_dial.number = random(9); + center_dial.number = random(9); + give self ~open locked; + "You close the door and hear some mechanisms spin."; + } + ], + found_in GUE_Labs_Eng GUE_Labs_SECRET, + has static door openable lockable locked; + +! (and now a combination lock, which is probably going to be more +! of an effort to code than for the player to figure out) +Object special_lock "set of dials" GUE_Labs_Eng + with name "dials", + initial "There's an odd set of dials in the wall near the \ +metal door.", + description [; + print "Three dials are in a left-to-right row. Above \ +each dial is a tiny square window with some number visible behind it. \ +The windows currently read: ~",left_dial.number,center_dial.number, right_dial.number; +"~. Right next to the set of dials is a small green button. \ +Letters right above the dials read: ~FrobozzCo~."; + ], + has static transparent; + +Class dial_class + with name "dial", + number 0, + description [; + print "A small dial. The window above reads ~", self.number; + "~."; + ], + has static; + + +Object left_dial "left dial" special_lock + class dial_class + with name "left", + before [; + Turn: + left_dial.number = left_dial.number + 1; + if (left_dial.number > 9) left_dial.number = 0; + print "The left window now reads: ~", left_dial.number; + "~."; + SetTo: + if ((second < 0) || (second > 9)) + "The left dial apparently only goes from 0 to 9."; + else left_dial.number = second; + print "The left window now reads: ~", left_dial.number; + "~."; + ], +; +Object center_dial "center dial" special_lock + class dial_class + with name "center" "middle", + before [; + Turn: + center_dial.number = center_dial.number + 1; + if (center_dial.number > 9) center_dial.number = 0; + print "The center window now reads: ~", center_dial.number; + "~."; + SetTo: + if ((second < 0) || (second > 9)) + "The center dial apparently only goes from 0 to 9."; + else center_dial.number = second; + print "The center window now reads: ~", center_dial.number; + "~."; + ], +; +Object right_dial "right dial" special_lock + class dial_class + with name "right", + before [; + Turn: + right_dial.number = right_dial.number + 1; + if (right_dial.number > 9) right_dial.number = 0; + print "The right window now reads: ~", right_dial.number; + "~."; + SetTo: + if ((second < 0) || (second > 9)) + "The right dial apparently only goes from 0 to 9."; + else right_dial.number = second; + print "The right window now reads: ~", right_dial.number; + "~."; + ], +; + +Object green_button "green button" special_lock + with name "button" "green", + number 0, + weight 0, + description "A small green button next to the dials.", + before [; + Push: + ! a simple game of mastermind. NOTE: I hate mastermind... + if (GUE_Lab_door has open) + "You hear a short buzzing noise."; + if ((left_dial.number == 7) && + (center_dial.number == 3) && + (right_dial.number == 4)) { + give GUE_Lab_door ~locked open; + Achieved(15); + "You hear three clicks, and the door swings open!"; + } + ! observe the bizarre numerical method of tracking guesses... + ! ('0' implies wrong) + ! (As with regular mastermind, we first check for all + ! 'right # and right spot' and build a bitstring that + ! indicates this (i.e. 700 combo would give 100 bitstring). + ! Then, we scan over the slots that were not marked as + ! 'right # and right spot' to check for 'right #, wrong + ! spot'. If, notably, we already found that number in + ! the 1st scan, we do _not_ treat it as 'right #, wrong + ! spot' (i.e. 777 should give us 1 click, not 1 click, + ! 2 thunks). + ! -- Author's note: There is no doubt a simpler method + ! to do this, and you Inform junkies should feel free + ! to let me know this, however I found this method to + ! be easy to code, easy to understand, and pretty + ! robust. + green_button.number = 0; ! RESET + green_button.weight = 0; ! (# of 'thunks') + ! FIRST SCAN + if (left_dial.number == 7) green_button.number = 100; + if (center_dial.number == 3) + green_button.number = green_button.number + 10; + if (right_dial.number == 4) + green_button.number = green_button.number + 1; + ! SECOND SCAN + if (green_button.number ~= 100 or 101 or 110) { + if (green_button.number ~= 11) { + if ((left_dial.number == 3) && + (green_button.number ~= 10)) + green_button.weight = green_button.weight + 1; ! 'add a thunk' + if ((left_dial.number == 4) && + (green_button.number ~= 1)) + green_button.weight = green_button.weight + 1; ! 'add a thunk' + } + } + if (green_button.number ~= 10 or 11 or 110) { + if (green_button.number ~= 101) { + if ((center_dial.number == 7) && + (green_button.number ~= 100)) + green_button.weight = green_button.weight + 1; ! 'add a thunk' + if ((center_dial.number == 4) && + (green_button.number ~= 1)) + green_button.weight = green_button.weight + 1; ! 'add a thunk' + } + } + if (green_button.number ~= 1 or 11 or 101) { + if (green_button.number ~= 110) { + if ((right_dial.number == 7) && + (green_button.number ~= 100)) + green_button.weight = green_button.weight + 1; ! 'add a thunk' + if ((right_dial.number == 3) && + (green_button.number ~= 10)) + green_button.weight = green_button.weight + 1; ! 'add a thunk' + } + } + ! Print number of clicks and thunks + if (green_button.number == 0 && green_button.weight == 0) + "Nothing happens."; + if (green_button.number == 1 or 10 or 100) { + print "You hear a single click"; + if (green_button.weight == 0) "."; + else print " followed by "; + } + else { + if (green_button.number == 11 or 101 or 110) { + print "You hear two clicks"; + if (green_button.weight == 0) "."; + else print " followed by "; + } + else { + print "You hear "; + } + } + EnglishNumber(green_button.weight); + if (green_button.weight == 1) + " thunk."; + else " thunks."; + + ], + has static; + + + +Object GUE_Labs_SECRET "Strange Lab" + with description "This is an odd room, cramped even by lab \ +standards. The place seems to have been cleared out recently.", + n_to GUE_Lab_door, +has light; + + +! ************* +! critters/people +! ************* + +Object librarian "librarian" GUE_Library + with name "librarian" "student" "Stephanie", + description "A young woman with short dark hair and \ +gold-framed glasses.", + life [; + Attack, ThrowAt: + "Attacking librarians is not very becoming of \ + a priest."; + Show, Give: + if (noun == glasses) + "~Thanks no, I already have a pair.~"; + if (noun == GUE_ID1) { + remove GUE_ID1; + "The librarian snatches the ID out of your hand. \ +~Where'd you get my ID?~ she says. ~I've been looking for it \ +everywhere.~"; + } + if (noun == GUE_ID2) { + print "The librarian peers at the ID. ~Hi "; + if (self has general) + "again, Harold,~ she says."; + else { + give self general; + "Harold,~ \ +she says. ~I heard you were going to be away for a least two \ +more years. Got tired of Mithicus, eh? Well, anyway, remember to \ +return anything you borrow after summer session is over.~ She \ +scribbles something down in a notebook."; + } + } + default: "The librarian is currently too busy \ +cataloging books."; + ], + react_before [; + Cast: + "The librarian frowns as you start to chant. \ +~Quiet! This is a library, you know.~ she says."; + Blow: + if (noun==whistle) + "You make an unusually high-pitched noise. \ +The librarian frowns. ~Please! This is a library, you know.~"; + Yell: + "The librarian frowns. ~Please! This is a library, you know.~"; + Sneeze: + "~You should see the school nurse about that cold.~"; + ], + has animate female; + + +Object kobold "large kobold" Forest_brambles + with name "kobold" "large", + initial "There appears to be a wounded kobold here, resting \ + against a shrub.", + description "He's a pretty tough looking kobold. The large wound \ + in his shoulder clearly has him in a foul mood.", + each_turn [; + if (random(20) == 1) + "^The kobold swipes at you with a club in his good arm, \ + but due to his condition, doesn't come close."; + ], + life [; + Attack,ThrowAt: "Attacking a defenseless wounded would be somewhat \ +unsporting."; + default: "The kobold hisses at you and spits out some words that \ + you can't understand at all."; + ], + before [; + Cast: + if (the_spell_was == espnis_spell or foblub_spell) + "The kobold cannot understand your language. The \ + chant fails."; + if (the_spell_was == taclor_spell) { + move green_sphere to Forest_brambles; + remove self; + "You begin your chant, and the kobold seems stricken with \ + fear. Soon, however, the kobold stands up and looks at \ + his healed shoulder with wonder. He starts to say something, \ + realizes you don't speak kobold, and stops. Puzzled by \ + your actions, he stares at you for a moment, then searchs \ + his jerkin, finding a small object which he tosses at your \ + feet. He walks off into the deep forest, and vanishes."; + } + ], + has animate; + +Object air_spirit "air spirit" + with name "spirit", + description "It looks like a small, animated tornado capable \ + of taking you for quite a spin.", + each_turn [ i ; + ! spirit attack + ! (in general, the 4 spirits are _very_ dangerous. + ! There's a 1/5 chance of killing outright, and 2 + ! chances of doing 10 and 5 points of damage respectively. + ! In short, the player needs to realize it's time to swanko, + ! and do so, quickly) + if (self hasnt general) { + give self general ~concealed; + "^You hear a strange intake of air from the hole above \ + your head. Without warning, a small tornado seems to \ + flow in from above. It seems to be sentient!"; + } + i = random(5); + if (i == 1) { + deadflag = 1; + "^The air creature moves with amazing speed! \ + It surrounds you in a mass of whirling winds, and you \ + find yourself spinning helplessly. The speed increases, \ + and you are soon torn apart!"; + } + if (i == 2) + Player_HP_CUR = Player_HP_CUR - 10; + if (i==3) + Player_HP_CUR = Player_HP_CUR - 5; + if (Player_HP_CUR <= 0) { + deadflag = 1; + "^The last blow from the air spirit was too much for \ + you, I'm afraid to say. You are picked up and \ + tossed against the wall in a lifeless heap by a \ + massive gust of wind."; + } + print "^The air spirit "; + if (i==2) + "picks you up in a powerful gust \ + of wind and sends you flying across the chamber! Ouch."; + if (i==3) + "surrounds you with flying dust and \ + debris, momentarily choking you! You break free \ + just in time."; + "charges, but you evade the moving tornado."; + ], + before [; + Cast: + if (the_spell_was == swanko_spell) { + remove self; + "As you speak the chant, the air spirit falls back \ + in fear! You finish the chant, and the air spirit \ + slowly dissipates and grows smaller, until the \ + creature vanishes completely."; + } + print "A sharp gust of wind practically \ + tears your chant out of your lungs.^"; + ], + life [ ; + Attack: + print "You "; + if (random(20) >= 8) + "strike the air creature, but your attack passes \ + harmlessly through it! Strange laughter seems to \ + echo from everywhere."; + "attack the air spirit, but miss!"; + default: "It's too busy trying to kill you."; + ], + has animate concealed; + + +! ************* +! scrolls/spells +! ************* + +Object flour_scroll "flour-coated scroll" + class scroll_class, + with name "flour-coated", +; + +Object gloth_spell "fold dough 83 times" flour_scroll + class spell_class, + with name "gloth", + magic [; + if (second has animate) + "Well, when you see a living creature made out of \ + dough around here, let me know."; + "The chant fails. I suppose you probably need actual dough \ + for it to work."; + ], +; + +Object marked_scroll "pen-marked scroll" GUE_Library + class scroll_class, + with name "pen-marked", + initial "There's a pen-marked scroll sitting amongst some books here.", +; + +Object taclor_spell "heal wounds" marked_scroll + class spell_class, + with name "taclor", + magic [; + if (second == 0) + "The chant searches for a body to heal, and fails."; + if (second == player) { + Player_HP_CUR = Player_HP_MAX; + "You speak the chant, and feel a warm glow surround you. \ + In moments, you feel physically renewed!"; + } + if (second hasnt animate) { + print "It's apparently beyond your powers to \ + heal "; DefArt(second); "."; + } + else { + CDefArt(second); + " is no doubt grateful for the gift of better health."; + } + ], +; + + +! ************* +! interesting objects +! ************* +Object white_rod_piece "white rod piece" TROPHY_SECRET + class rod_class, + with name "white", + initial "In the center of the room is a short white rod.", + description "It's a short section of a rod made of some \ +undeterminable hard substance, \ +colored cloud-white. A piece of the Rod of the Ancients, no doubt!", +; + +Object green_sphere "green sphere" + class sphere_class, + with name "green", + description "A tiny perfect green sphere, made of some strange \ + unknown metal.", +;