2 ! **************************************************************
3 ! GURTH.INF -- Add-on for SPIRITWRAK
4 ! (all rights reserved, copyright 1996, D. Yu
6 ! SPIRITWRAK is free software; you can redistribute it and/or modify
7 ! it under the terms of the GNU General Public License as published by
8 ! the Free Software Foundation; either version 3 of the License, or
9 ! (at your option) any later version.
11 ! SPIRITWRAK is distributed in the hope that it will be useful, but
12 ! WITHOUT ANY WARRANTY; without even the implied warranty of
13 ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 ! General Public License for more details.
16 ! You should have received a copy of the GNU General Public License
17 ! along with SPIRITWRAK. If not, see <https://www.gnu.org/licenses/>.
18 ! **************************************************************
20 ! (author note to self -- Gurth currently isn't going to be too
21 ! exciting -- I'm running out of .z5 code space. The main
22 ! planned features are:
23 ! 1) The abandoned house with the oven for baking the cake
24 ! 2) A deep forest area somewhat north of the city where
25 ! a sphere piece will be hidden
27 ! The string array for labels on the GUE Oven dial (may be changed)
28 Array OVEN_settings table [;
37 "Thermo-nuclear Flash";
40 Object GURTH_GUSStop "Gurth City Streets"
41 with description "A foggy sky covers the ever-busy city of \
42 Gurth. A road heads southeast into a larger \
43 portion of the city, and stairs lead down here.",
44 name "fog" "sky" "road" "stairs",
45 d_to GURTH_GUSStation,
46 se_to GURTH_NDistrict,
49 Object umbrella "umbrella" GURTH_GUSStop
54 else print "A closed";
55 " black-cloth umbrella.";
62 if (parent(self) == player) {
65 "You snap the umbrella open.";
67 else "You need to be holding the umbrella to do that.";
69 if (parent(self) == player) {
72 "You snap the umbrella closed.";
74 else "You need to be holding the umbrella to do that.";
78 Object GURTH_NDistrict "North District"
79 with description "Probably the safest district in Gurth, the \
80 North District is mostly cobblestone roads and barricaded \
81 buildings. A main road heads south, or forks northwest and \
83 name "cobblestone" "buildings" "road",
89 Object GURTH_Forest "Forest Edge"
90 with description "Dark forest meets dark city outskirts here. \
91 The only exit is along an old path to the southwest -- \
92 the forest is too thick for travel otherwise. \
93 Rain falls periodically from a dark stormy sky.",
94 name "forest" "path" "rain",
95 sw_to GURTH_NDistrict,
98 "^A rumble of thunder booms overhead.";
103 if (Treant in GURTH_Forest)
104 "You hear muffled cries for help from \
105 somewhere inside the log cabin!";
109 Object storm1 "storm" GURTH_Forest
110 with name "storm" "clouds" "sky" "dark",
111 description "It does look a bit stormy overhead.",
114 if (the_spell_was == shazok_spell) {
115 print "A bolt of lightning rips down from the \
116 clouds overhead as you finish your chant! It strikes ";
117 if (Treant in GURTH_Forest) {
118 print "the angry treant! \
119 A portion of its top branches catch fire! Howling in pain, \
120 the creature runs off into the woods and disappears!";
126 "you, frying you to a crisp!";
132 Object Treant "angry treant" GURTH_Forest
133 with name "treant" "angry" "blighted",
134 description "Treants are basically animated trees. They \
135 are considered mythical creatures, usually solitary and quite \
136 rare. This particular treant looks similar to a great elm tree. \
137 You notice that it seems covered with spots of some sort of \
142 print "^The treant ";
144 if (WOOD_House.number == 3) {
145 WOOD_House.number = 4;
147 "pounds the cabin, and it collapses into \
148 splinters! The treant grabs a hapless woodsman from the \
149 wreckage and stalks off into the forest with his victim!";
152 WOOD_House.number = WOOD_House.number + 1;
153 "hammers on the house and you hear a \
154 crack! The cabin sustains some damage!";
157 else "angrily attacks the wood cabin, which shakes \
158 with the continued blows.";
162 if (the_spell_was == egdelp_spell) {
164 "The treant is covered with a waxy buildup, which \
165 washes off in the rain. The treant, already \
166 rather incensed, turns his attentions to you and mauls you \
167 with two giant branches/arms.";
169 if (the_spell_was == throck_spell) {
171 "The treant grows a bit bigger. His current bad \
172 mood seems to increase proportionately! He turns his attentions \
173 to you and pounds you with two huge branches/arms.";
175 if (the_spell_was == taclor_spell) {
176 print "The treant seems to turn a shade of deep \
177 green, and the patches of blight disappear! The ancient tree \
178 creature pauses, regards you solemnly, and then walks \
179 off into the forest.";
186 Object WOOD_House "log cabin" GURTH_Forest
187 with name "cabin" "log" "house",
189 print "A small house built of logs";
190 switch (self.number) {
192 1: print ". It looks slightly damaged.";
193 2: print ". It looks partially damaged, the roof logs \
194 are broken in several places.";
195 3: print ". It looks very damaged. One wall is \
196 nearly broken through.";
197 default: print " that has collapsed into little more \
198 than a pile of broken logs.";
200 if (self has general)
201 " You notice some area of wood have spots of wax \
208 if (Treant in GURTH_Forest)
209 "The angry treant seems to be in the way.";
210 "It's just a tiny log cabin that probably \
211 has nothing interesting inside.";
213 if (the_spell_was == egdelp_spell) {
215 "The outside of the cabin is now covered \
216 with spots of waxy buildup.";
224 move red_sphere to player;
225 "^^Moments later, a woodsman appears from the battered log \
226 cabin. ~Much thanks, sir,~ he says. ~Appears I mistook that \
227 treant for a dead tree and tried to cut it down. Can't say \
228 he took it too well.~ he says sheepishly. ~Say, you don't \
229 look like you're from around these parts. Kinda like this \
230 funny thing I found in the woods the other day.~ He hands \
231 you a strange round object. ~Maybe you know what to do with \
232 it?~ He hefts a small hatchet over his shoulder. ~Well, \
233 back to do a little logging,~ he says, as he walks off into the \
234 deep forest, whistling.";
237 Object GURTH_MDistrict "Market District"
238 with description "The famous Gurth Market District is as noisy, \
239 crowded, and dangerous as it ever was. A cobblestone road heads \
240 north and south here.",
241 name "cobblestone" "road",
242 n_to GURTH_NDistrict,
243 s_to GURTH_SDistrict,
244 e_to "~Get out 'o me way!~ some rude fellow says as you \
246 w_to "~No push'n, no shov'n!~ some old hag screams at you, \
247 and promptly shoves you back.",
249 if ((random(10) < 5) && (self hasnt general)) {
252 "^A clumsy hawker stumbles into you as he \
253 crosses the street, hustling off without so much as an \
254 apology. You notice he dropped something in his hurry.";
259 Object c7 "coin" class coin_class;
261 Object GURTH_SDistrict "South District"
262 with description "The general gloomy atmosphere is more noticeable \
263 than ever here, in the extremely dangerous South District. The \
264 general area is filled with boarded-up houses, and a few shifty-eyed \
265 characters are the only people milling about here. A road leads \
266 north. To the east is an abandoned flat, probably in better shape \
268 name "houses" "characters" "people" "road" "flat",
269 n_to GURTH_MDistrict,
271 print "You wander down ";
272 if (random(20) == 5) {
274 "a back alleyway, and are immediately \
275 assaulted by a group of vicious thugs, who batter you senseless.";
277 else "an alleyway, find a dead-end, and return \
281 print "You wander down ";
282 if (random(20) == 5) {
284 "a sidestreet, and are immediately \
285 assaulted by a group of vicious thugs. One of them seems to \
286 recognize you. ~That's the Preacher-man who got Davey arrested! \
287 Let's show 'em what we think'o that!~ They proceed to beat you senseless.";
289 else "a sidestreet, find a dead-end, and return \
295 Object GURTH_House "Front of House"
296 with description "You're standing at the rotting front steps of \
297 a small flat. The front door to the east has been battered down and \
298 you could probably walk right in, or return to the street to \
300 name "street" "steps" "flat",
301 w_to GURTH_SDistrict,
306 Object GURTH_House2 "Front of House"
307 with description "You're standing near a small construction site. \
308 A city street lies west, and a construction ditch is east.",
309 name "street" "ditch",
312 "You step into the street, and several locals \
313 give you strange looks. The surrounding neighborhood seems \
314 new and busy -- various construction sites mark the \
315 work of enterprising shop-keepers of the area.^^\
316 ~Watch out there!~ someone cries. A sudden \
317 pile of bricks falls from a nearby scaffolding, and \
320 e_to Construction_site,
324 Object bad_brick "dusty brick" GURTH_House2
325 with name "brick" "dusty" "old",
326 initial "An old discarded brick lies nearby.",
327 description "An old brick, slightly cracked in several places.",
331 ! Construction Worker appears
332 if ((good_brick in Construction_site) ||
333 ((good_brick notin Construction_site) &&
334 (bad_brick notin Construction_site))) {
336 foundation_wall.number = 1;
340 foundation_wall.number = 2;
342 if (location == Construction_site) {
343 print "^From behind some scaffolding, a construction \
344 worker appears. He walks to a part of the ditch and starts to \
345 make some finishing touches on part of a low wall. \
346 He finds a brick nearby and applies it to the wall with \
347 a good patch of mortar.";
348 if (foundation_wall.number == 1)
349 " Brushing himself off, he walks off \
350 and is soon out of sight.";
352 " He looks at the patch somewhat \
353 unsatisfied, but shrugs, and walks off, soon out of sight.";
356 "^You hear some brief noises from the east.";
360 Object Construction_site "Construction Site"
361 with description "This is a long square ditch that is \
362 likely to be the starting point for some building. It is \
363 framed by wood slats and short brick walls. The only way \
364 out is to the west.",
365 name "ditch" "slats" "wood",
369 Object good_brick "thick brick" Construction_site
370 with name "brick" "thick",
373 initial "A thick brick lies nearby.",
374 description "A thick brick, solid as a rock.",
377 Object foundation_wall "portion of wall" Construction_site
378 with name "wall" "foundation" "portion" "hole" "recess",
379 initial "You notice a foundation side wall \
384 switch (self.number) {
385 0: "It looks somewhat unfinished. Part of it \
386 is open into a dark recess in the side of the ditch.";
387 1: "The wall is a finished work of brick and \
388 mortar. It looks quite strong.";
389 2: "The wall is a finished work of brick and \
390 mortar. You see a spot where the brickwork seems a bit \
397 "The wall is currently sealed shut.";
400 print "You put ", (the) noun, " into the ";
401 "small hole in the wall.";
405 "The wall is currently sealed shut.";
407 if (self.number == 0) {
409 "You kick at the wall. Unfortunately, it wasn't \
410 all that stable, and the wall falls apart, burying you under a \
411 pile of loose bricks.";
413 if (self.number == 1) {
415 print "You try to break the wall, but only end up \
416 hurting your hand. ";
419 give foundation general;
420 print "You knock on the weak portion of the \
421 wall, and produce a slight crack, that no doubt will \
422 cause the homeowners some worry in the future. ";
424 ! give GURTH_House ~general;
425 while (child(player) ~= 0) remove child(player);
426 ! while (child(GURTH_House) ~= 0) remove child(GURTH_House);
427 print "The wall seems to start to glow a purple color, and you \
428 step back, to find your surroundings replaced by cold natural \
430 Mystical_Cave.number = Mystical_Cave.number + 1;
431 PlayerTo(Mystical_Cave);
434 has static container open;
436 Object House_Ent "Entrance Room"
437 with description "A bare room, with peeling paint and rotting, \
438 water-stained walls. There's a room to the east, and a rickety \
439 stairway down. The outdoors lie west.",
440 name "paint" "stairway" "outdoors",
447 Object House_Basement "Basement"
448 with description "A musty, smelly basement. Stairs head up.",
452 Smell: "It's smells musty down here, as though \
453 the place has been unused for quite some time.";
457 Object House_switchbox "dusty metal box" House_Basement
458 with name "dusty" "metal" "box",
459 when_closed "There's a dusty metal box attached to the wall here.",
461 print "There's an open metal box attached to the wall here. ";
463 if (x == 0) "It seems to be empty.";
464 print "It contains:^";
465 x = FULLINV_BIT + INDENT_BIT + NEWLINE_BIT + RECURSE_BIT;
466 WriteListFrom (child(self), x, 1);
471 description "A dusty metal box, attached to the wall.",
473 Open, Push, Pull, Turn, Touch:
474 if (GHOST in House_Basement)
475 "Slowly, but quite deliberately, the zombie \
476 prevents you from getting near the box.";
478 has static container openable;
481 Object wire "thin wire" House_switchbox
482 with name "wire" "thin",
483 ! initial "Inside the box is a loose wire.",
484 description "A thin stiff string of metal.",
486 size 1, ! must fit in subway gate slot...
489 if ((the_spell_was == huncho_spell or luncho_spell) &&
490 (self hasnt general))
491 "Your chant goes unanswered.";
492 Take, Push, Pull, Touch, Rub, Squeeze:
493 if (self hasnt general) {
494 if (rubber_gloves has worn) {
495 if (action==##Take) give self general;
496 print "As you touch the wire, you notice a \
497 bright spark! Good thing you were wearing rubber gloves! ";
500 print "As your fingers get near the wire, \
501 a bright spark of electricity ";
502 if (random(10) < 4) {
504 move GHOST to House_Basement;
505 "arcs into your hand! The results are quite shocking, I'm afraid.";
508 "flashes near your fingers! You pull back just in time.";
514 Object foundation "foundation" House_Basement
515 with name "foundation" "break" "hole",
516 initial "A large break in the wall exposes a good portion of \
517 the house's foundation.",
518 description "Water damage, or simply age, has exposed a large \
519 hole in one of the walls, through which you can see exposed \
520 wood and brick, part of the foundation of the house.",
523 "No need to put things in the foundation like that.";
525 if (self hasnt general)
526 "You briefly search the decaying foundation, but find nothing.";
528 print "You dig around in a familiar spot in the hole ";
530 if (children(foundation_wall) == 0)
533 while (child(foundation_wall) ~= 0)
534 move child(foundation_wall) to House_Basement;
535 "and find something!";
540 Object House_Kitchen "Kitchen"
541 with description "You're in the kitchen, by the looks of things. \
542 Some broken cabinets are on the wall. Light from partially boarded-up \
543 windows lets you see the rotting wood floors. Rooms lie to the \
545 name "cabinets" "windows" "wood",
550 ! (An oven, a typical inform object)
551 Object OVEN "GUE-Automatic oven" House_Kitchen
552 with name "oven" "GUE-Automatic",
553 when_closed "Strangely untouched and undamaged, a GUE-Automatic oven is \
554 sitting closed in a corner of the room.",
557 print "Strangely untouched and undamaged, a GUE-Automatic oven is \
558 sitting open in a corner of the room.";
560 if (x == 0) " It seems to be empty.";
561 print " It contains:^";
562 x = FULLINV_BIT + INDENT_BIT + NEWLINE_BIT + RECURSE_BIT;
563 WriteListFrom (child(self), x, 1);
567 description "A FrobozzCo best-seller -- this small green oven is \
568 perfect for those adventurers who want a home-cooked meal, but are short \
569 on time and space. There's a dial and a button \
574 if (self hasnt open) {
576 print "You open the oven, ";
578 if (x==0) "which is empty.";
580 x = FULLINV_BIT + INDENT_BIT + NEWLINE_BIT + RECURSE_BIT;
581 WriteListFrom (child(self), x, 1);
584 add_to_scope oven_dial oven_button,
585 has static container openable;
587 Object oven_dial "oven dial"
591 print "A round dial with small printed words. A line on the \
592 oventop marks which dial setting is currently active, which at the \
593 moment is ~", (string) OVEN_settings-->(oven_dial.number); "~.";
597 oven_dial.number = oven_dial.number + 1;
598 if (oven_dial.number > 9) oven_dial.number = 1;
599 print "The line is now pointing to ~", (string) OVEN_settings-->(oven_dial.number);
602 "The dial has somewhat unusual \
603 settings. You'll need to turn to the one you want.";
607 Object oven_button "oven button"
608 with name "button" "black",
610 description "A small round black button on the top of the oven.",
614 "There is an irritated buzz.";
616 print "You press the button and hear a low spinning noise. \
617 Suddenly, the oven makes a ";
618 if (oven_dial.number == 9) {
619 ! Ye old nuclear flash setting
620 if (children(OVEN) ~= 0)
622 "tremendous 'bang', and nearly springs off \
623 the floor! A bright flash of light seems to originate from somewhere \
624 inside the oven! Then, just as suddenly, everything is quiet again.";
626 ! check object in oven
627 ! if obj exists, check for edible
628 ! or cake, mutate appropriately.
629 if (children(OVEN) ~= 0) {
630 if ((Baking_Pan in oven) && (cake in Baking_Pan)) {
631 ! we're no doubt cooking the cake again.
632 ! as a nice feature of the GUE auto, if the cake
633 ! was undone, and the oven setting == 4, give
634 ! the cake the 'done' result
635 if ((cake.number == 1) && (oven_dial.number == 4))
637 ! otherwise, nothing changes
639 if ((Baking_Pan in oven) && (dough in Baking_Pan)) {
640 ! first, check oven setting (too cold or too hot)
641 ! if setting ok, check number of times folded
642 ! (too few, too many). Move 'cake' to pan, make
643 ! dough child of cake, and set the 'result' number
644 ! of cake accordingly (0, ok, 1 underdone, 2
645 ! overdone, 3 underfolded, 4 overfolded)
646 ! (assumption is that dough will be only thing
647 ! in pan [add's are trapped by dough]
648 move dough to cake; ! Zen cooking...
649 move cake to Baking_Pan;
650 if (oven_dial.number == 4) {
651 if (dough.number < 83)
653 if (dough.number > 83)
655 else cake.number = 0; ! well done baker
658 if (oven_dial.number < 4)
660 if (oven_dial.number > 4)
665 "a loud 'pop' and nearly springs off \
666 the floor! Then, just as suddenly, everything is quiet again.";
671 Object House_Pantry "Pantry"
672 with description "This was once probably a pantry of some \
673 sort. It's now a bare closet-sized room. The exit is south.",
677 Object Baking_Pan "baking pan" House_Pantry
678 with name "pan" "baking",
679 description "It's a nice round flat-bottomed ceramic pan.",
686 if (children(Baking_Pan) == 0)
687 "There doesn't seem to be anything in the pan to mix.";
689 if (cake in Baking_Pan)
690 "You can't mix anything with the already baked cake in the pan.";
691 ! if the dough is already in the pan, add the
692 ! 'new children', if any
693 if (dough in Baking_Pan) {
695 move dough to OVEN; ! Temp
696 while (child(Baking_Pan) ~= 0) {
698 move child(Baking_Pan) to dough;
700 move dough to Baking_Pan;
702 "You need to add something to the pan if you \
703 want to mix something new into the dough.";
704 "You mix in the new ingredients into the dough.";
706 ! Minimally, if the flour, butter and egg are in the
707 ! pan, 'dough' will be produced
708 if ((flour notin Baking_Pan) ||
709 (corbie_egg notin Baking_Pan) ||
710 (butter notin Baking_Pan))
711 "You mix the contents of the pan around a bit, but \
712 some things don't quite coagulate, and the contents remain unmixed.";
714 while (child(Baking_Pan) ~= 0) {
715 move child(Baking_Pan) to dough;
717 move dough to Baking_Pan;
718 "You start mixing. Like magic, in short time you \
719 have a doughy mixture in the pan.";
723 if (noun == dough or cake) {
724 CDefArt(noun); " is stuck fast in the pan and \
725 you can't get it out.";
728 ! we've modified certain ingredient objs that we want \
729 ! to 'preserve' in the pan.
730 if ((noun == flour) || (noun == sugar_cube) ||
731 (noun == baking_powder) || (noun == butter) ||
732 (noun == corbie_egg) || (noun==dornberries))
733 "It's somewhat scattered about in the pan right \
734 now, and you can't quite remove it cleanly.";
738 "The cake takes up the entire space in the pan.";
739 ! -- trap and nicely parse putting
740 ! ingredients in pan, will require modifying
741 ! 'short_name's of various ingredients.
743 flour.short_name = "pile of flour";
744 move flour to Baking_Pan;
745 flour.description = "A heap of white flour.";
746 "You break open the bag and add the flour to the pan.";
748 if (noun == sugar_cube) {
749 sugar_cube.short_name = "quantity of sugar";
750 move sugar_cube to Baking_Pan;
751 sugar_cube.description = "Some sugar scattered about.";
752 "You crumble the sugar cube into the pan.";
754 if (noun == baking_powder) {
755 baking_powder.short_name = "small sprinkling of baking powder";
756 move baking_powder to Baking_Pan;
757 baking_powder.description = "A small pile of very fine white powder.";
758 "You open the packet and add the powder to the pan.";
760 if (noun == corbie_egg) {
761 corbie_egg.short_name = "bit of raw egg";
762 move corbie_egg to Baking_Pan;
763 corbie_egg.description = "The yolk and the white parts from an egg.";
764 "You crack the egg and drop the gooey contents into the \
765 pan, discarding the shell.";
770 Object pan_sticker "sticker" Baking_Pan
772 initial "There's a sticker stuck to the bottom of the pan.",
774 Frobozz Magic Baking Pan^^\
776 To mix ingredients placed in pan, simply say 'MIX PAN'. \
777 Baked goods should be removed with a Frobozz Magic \
783 Object dough "lump of dough"
785 number 0, ! equals the number of times folded
788 description "It looks like a nice beige lump of uncooked dough.",
791 if (action==##Eat) remove self;
794 if (the_spell_was == gloth_spell) {
795 dough.number = dough.number + 83;
796 if (dough.number > 500) dough.number = 500;
797 "As you speak the chant, the dough seems to \
798 twinkle! With a sudden puff of flour, the dough spins and \
799 neatly kneads itself many times!";
802 dough.number = dough.number + 1;
803 print "You roll up your sleeves and start kneading. \
805 if (dough.number > 500) dough.number = 500;
806 if (dough.number < 50)
808 if (dough.number > 200)
809 "has the consistency of a soft rock.";
817 ! number = condition:
818 ! 0 ok, 1 undercooked, 2 overck, 3 underfld, 4 overfld
821 switch (cake.number) {
822 1: "somewhat raw-looking cake.";
823 2: "nice-looking cake, except that it \
824 looks a little burned.";
825 default: "nice-looking cake.";
826 ! The player will have to taste the cake to check the
833 "Not bad. Unfortunately, it looks like you can't have \
834 your cake and eat it too.";
836 print "You taste a tiny bit of the cake. ";
837 switch (cake.number) {
838 1: "It tastes a bit underdone.";
839 2: "It tastes a little burned.";
840 3: "It's a little too soft.";
841 4: "It's a bit tough.";
842 default: "It tastes great!";
855 Object GHOST "frightening zombie" House_Basement
856 with name "zombie" "frightening",
857 description "A frightening gaunt member of the \
858 living dead, with pale skin, and even paler eyes.",
861 if (the_spell_was == wigro_spell) {
863 "The zombie crumbles into dust, turned.";
868 if (noun==holywater) {
869 remove holywater; remove self;
870 "The vial breaks into shards, scattering \
871 holy water all over the zombie. The zombie shrieks, and \
872 crumbles into dust.";
874 Attack: "Your attack knocks it back, but it \
875 seems completely unharmed, somehow!";
877 if (noun==rubber_gloves) {
878 move wire to House_Basement;
879 move rubber_gloves to House_Basement;
880 give rubber_gloves ~worn;
882 give House_switchbox open;
884 "The zombie seems to regard the gloves, and slowly puts \
885 them on. It proceeds to open the metal box and remove a \
886 loose wire, producing a few sparks in the process. Finally, \
887 it places the loose wire on the floor, satisfied. It \
888 slowly crumbles into dust, but you just manage to hear, \
889 ~Thanks, I've been trying to get rid of that wire for ages,~ \
890 in the faintest of whispers.";
892 default: "Zombies are usually not very responsive to \
893 those among the living. This one is no exception.";
901 Object gray_scroll "gray scroll" House_Basement
906 Object tossio_spell "turn granite to pasta" gray_scroll
910 if ((location == THIEF_Storeroom) &&
911 (second == w_obj) && (THIEF_Storeroom hasnt general)) {
912 give THIEF_Storeroom general;
913 move pasta to THIEF_Storeroom;
914 move c50 to THIEF_Storeroom;
915 "As you finish the chant, the granite wall is replaced \
916 by a large mass of pasta. A hidden section of the room is revealed, \
917 along with the mass of gold coins it was holding! The coins spill \
918 out, and nearly flood the room.^^In a flash, a large group of \
919 financial nymphs appear on the scene. ~It looks like we found the \
920 missing GUS earnings,~ one nymph says to another. Producing large \
921 sacks, they quickly collect the mass of coins and disappear with a \
922 twinkle.^^Moments later, a single coin falls out of a crack in the \
923 previously hidden alcove, rolling to a stop near your feet.";
925 "Your chant goes unanswered. I guess you need pure granite.";
933 Object red_sphere "red sphere"
936 description "A tiny perfect red sphere, made of some strange \