! ------ Home world (Theater) #ifndef SKIP_THEATER; Constant playcount_Applause 11; Constant playcount_Emptying 13; Global botheractors = 0; ! see life of class acthom Global crowdnoise = 0; ! see each_turn of audience Object theplay "stage" with name "play" "actors" "stage" "set", found_in [; rtrue; ! simple, but effective, as long as we give absent when we leave the theater ! and then never return. ], description [; switch (self.number) { 1: "Rito and Imita are glaring at each other."; 2: "Rito is blazing fury at the defiant Imita."; 3: "Imita stares helplessly off at the vanished Rito."; 4: "Rito advances on Tato, as Imita looks on."; 5: "Rito and Tato face each other, as Imita looks on."; 6: "Rito and Tato circle each other, as Imita looks on."; 7: "Rito and Tato are locked in a whirl of ringing metal, and \ Imita backs away."; 8: "Tato lies at Rito's feet, blood drenching his back. Imita \ is astonished and exultant together at what she has done."; 9: "Rito and Imita embrace over Tato's corpse."; 10: "The stage is set only with scattered flowers and a pool of blood."; 11, 12: "The players are bowing furiously."; default: "The stage is dark and empty, but for scattered flowers and ribbons."; } ], number 0, ! counter for play action daemon [; self.number = self.number+1; switch (self.number) { 1: print "^The play is into the final act. Rito has finally found out about \ Imita's affair, and he stalks the stage, whipping voice and hands \ about himself. A footfall behind him; he turns, and sees Imita. She \ backs a step at the force of his gaze.^"; give rito general; give imita general; give tato ~general; 2: print "^The players continue....^^"; print " ", (emphstring) "Rito:", "^ How come you, harlot? Dare you come this way,^", " your skin yet dark with Tato's shadow's stain?^^"; print " ", (emphstring) "Imita:", "^ Young lord, I will not kneel. And shadowed dark,^", " or white with rays of moon or sun or moon,^", " my flesh is mine. Or nearly so; I find --^^"; print " ", (emphstring) "Rito:", "^ Say on! What more has hated Tato done?^"; crowdnoise = 2; ! glimpse Aessa 3: print "^ ", (emphstring) "Imita:", "^ Oh, do not hate. For dazzled though she was,^", " Imita's put him by; he's naught and gone --^", " But nearly, for she carries Tato's son.^^"; print " ", (emphstring) "Rito:", "^ She -- you -- you say -- aah!^^", " (He rushes from the stage.)^"; give rito ~general; 4: print "^Imita turns and pleads her dilemma to the audience: ~What scourge, \ what scourge I bear, from what red star / So near to happiness, and \ yet so far?~ She is in despair; but this whispered soliloquy is soon \ interrupted by voices rising in the wings. Rito, in a fury, backs Tato \ onto the stage.^"; give rito general; give tato general; crowdnoise = 3; ! can't see Aessa any more 5: print "^ ", (emphstring) "Rito (icily):", "^ Stench of the grave on the day of your birth^", " Shadows the shape first your eyes ever saw^", " Curdled with gall was the milk on your lips^", " Foul luck...^^"; print " ", (emphstring) "Imita:", "^ Enough!^^"; print " ", (emphstring) "Rito:", "^ It is blood I will have,^", " Good red to flood the black ebb of your luck.^"; 6: print "^ ", (emphstring) "Tato (drawing his sword):", "^ I did not look to draw this moment here;^", " Imita's choice has whipped my tongue and soul;^", " I would withdraw. But if my mistress' word^", " Would leash me, yet the wolfish howl will stir^", " The blood of any hound. Attend thy sword!^^"; print " ", (emphstring) "Imita:", "^ Cease you this play --^^"; print " ", (emphstring) "Tato:", "^ In the poisonous marl^", " And the tangling thorn fell the step you first took...^^"; print " (Rito draws as well, and Tato begins circling him, still \ intoning the ritual.)^"; 7: new_line; print (emphstring) "Ting!"; print " The pure tone of steel against steel. It comes again, and again \ faster; and then Rito and Tato rush at each other in a fury of \ chimes, in harmony. The sounds come from off-stage, of course, not \ from the swords. That's the way it's done. Melody weaves into the \ ringing, counterpoint to the flow of the fight -- falter, recover, \ the upper hand lost and gained -- and two men and two swords flicker \ in electric light.^"; 8: print "^Rito gains enough breath between attacks to declaim an insult or \ three. ~War-rat, peace-pup / Love's-fool / Bright-tongue, limp \ slug...~ Tato leaps for him again, another bell-jangle of motion. \ Dancing, even yet, Rito falls back.^^"; print " ", (emphstring) "Tato (shouting):", "^ Love's-fool? You think I'd spare my heart^", " To she whose glance you melt to see?^", " I touched her but to touch your throat,^", " Your softer foot that I could sting --^^"; print "Rito cannot even speak; the pain and horror are all in his eyes. And \ then they are in Tato's eyes too, and the spear that jerks in Tato's \ back is barely an afterthought. He jolts forward a step, tries to \ catch himself on Rito's wrapped velvets. But Rito backs, still silent, \ and Tato lands on his knees; reaches again; and falls.^^"; print "Imita, spear-hand still outflung, is on her knees as well.^"; 9: print "^Rito moves forward, slowly, around the shape that lies before him. He \ draws Imita to her feet. She gazes at his face, with not a flicker at \ the dark wet that stains his velvets. (And you don't even wonder at \ the players'-craft that makes it so. The stage is gone; their faces \ are the moment.)^^"; print " ", (emphstring) "Imita (simply):", "^ Ah, my love. Can you forgive me?^^"; print " ", (emphstring) "Rito:", "^ How can I deny you? There is nothing to forgive.^"; 10: print "^The audience sighs, released. The rest of the play is accomplished \ with commendable speed: wedding flowers, declarations of passion, \ bells and drums. Tato's corpse is carried reverently away; and the \ procession follows.^^"; print "As the stage empties, someone behind you begins to clap.^"; give rito ~general; give tato ~general; give imita ~general; 11: print "^The players sweep out of the wings, bowing. \ Everyone is on their feet and applauding wildly"; if (player in theaterbench) print " (except for you, you barbarian)."; else print "."; new_line; give rito general; give tato general; give imita general; 12: print "^The players dash offstage, and return a bare heartbeat later. \ People are shrieking, \ and flinging flowers, ribbons, sweetmeats, and occasionally themselves \ at the stage.^"; move stagebouquets to theplay; 13: print "^The tumult finally begins to rattle to a halt, and people \ start to drift towards the doors. The players, giving in to the \ inevitable, bow themselves into the wings and are gone.^"; remove rito; remove tato; remove imita; print "^A wrinkled old man, laden with damp rags, pokes irritably \ at your elbow. ~Move yar,~ he mumbles"; if (player in theaterbench) { print "; you jump up, and he begins scrubbing under the bench \ where you were sitting.^"; PlayerTo(LowerTheater, 1); } else print ", and begins scrubbing at the floor where you were standing.^"; give janitor ~absent; move janitor to location; 14: print "^The crowd has dissipated. The energy of the play is gone, \ leaving the gloom merely cavernous and dim. On the other hand, it's \ no longer quite so stiflingly hot.^"; remove audience; } rtrue; ], before [; Enter: "Thematically apt, but in practice the theater management would object."; ], react_before [; ! Wait: ! ! standing in the crowd annoys them. Except that this really interferes with ! ! watching the play. Forget it. ! if (player notin theaterbench) ! crowdnoise = 1; ! rfalse; Applaud: if (theplay.number < playcount_Applause-1) "~'s not over,~ mutters someone behind you, disgustedly."; if (theplay.number < playcount_Emptying) "You applaud happily with the rest of the audience."; "You applaud the empty stage for a few moments. Then, suddenly \ uneasy, you turn -- the old man is staring curiously at \ you. After a long cold pause, he looks away and goes back to scrubbing."; Sing: if (theplay.number < playcount_Applause-1) "You open your mouth, and draw breath. Someone jabs an elbow irritably into \ your side."; if (theplay.number < playcount_Emptying) "You essay a few notes, which are mostly drowned in applause. \ A few people look at you oddly."; "You essay a few notes, which echo wonderfully in the empty hall. Then, suddenly \ uneasy, you turn -- the old man is staring curiously at \ you. After a long cold pause, he looks away and goes back to scrubbing."; Jump: if (player in theaterbench) "You're sitting down."; if (theplay.number < playcount_Applause-1) "The people behind you just might start a riot."; rfalse; ], has scenery transparent; Nearby audience "crowd" ! in theplay with name "audience" "crowd" "people", description "There are many, many people in here, and they're all just as \ hot and sticky as you. None of them, as well as you can see, are Aessa.", before [; Push, Pull, Turn: "Someone pushes right back."; Search: "You can't see Aessa anywhere."; ], life [; Answer, Ask, Tell, Order: "~Quiet!~ hisses someone behind you, grouchily."; default: "Oh, what a good idea."; ], number 0, ! used by TheaterTryGo() to cycle through move failures. each_turn [ ix; ix = crowdnoise; crowdnoise = 0; switch (ix) { 1: if (theplay.number < playcount_Applause) { new_line; PrintInsult(); new_line; } rtrue; 2: print "^You shake your head, trying to net your straying thoughts, and \ catch a flash of copper hair. A few rows back, by the aisle -- Aessa \ couldn't have shown up and ", (emphstring) "not", " seen you, could she? \ She wouldn't be avoiding you.^"; rtrue; 3: print "^You can no longer see Aessa, if you did at all. "; if (player in theaterbench) { print "Irritable mutters rise behind you as you crane your neck."; } else { PrintInsult(); } new_line; rtrue; } ], has scenery animate hiddengender; [ PrintInsult; print "~"; switch (random(5)) { 1: print "Sit down"; 2: print "Shift you"; 3: print "Shorten it"; 4: print "Out of the light"; 5: print "Out of the way"; } print ", "; switch (random(7)) { 1: print "pig"; 2: print "slug"; 3: print "dug"; 4: print "horse"; 5: print "mud"; 6: print "fat"; 7: print "long"; } switch (random(5)) { 1: print "-shadow"; 2: print "-butt"; 3: print "-ass"; 4: print "-head"; 5: print "-muck"; } print ",~ "; switch (random(5)) { 1: print "says"; 2: print "mutters"; 3: print "mumbles"; 4: print "grumbles"; 5: print "growls"; } print " someone behind you, "; switch (random(5)) { 1: print "grouchily"; 2: print "sullenly"; 3: print "irritably"; 4: print "angrily"; 5: print "sourly"; } print "."; ]; Class acthom with before [; if (action == ##Examine) { rfalse; } if (self hasnt general) { print "Even if interrupting the performance were a good idea, ", (name) self, " is off-stage at the moment.^"; rtrue; } if (action == ##Bow) "You're not the one on stage here."; rfalse; ], life [; Answer, Ask, Tell, Order: botheractors++; if (botheractors > 4) "Oh, stop bothering the actors."; "~Hissh!~ mutters someone behind you, irritably."; default: botheractors++; if (botheractors > 4) "Oh, stop bothering the actors."; "You're not the one on stage here."; ], has animate proper; ! general means on-stage Nearby rito "Rito" ! in theplay class acthom, with name "Rito", description [; if (self has general) { print "Rito is a tall young man, clad in blue and violet, \ the rich wrapped velvets of the Lily Years. His face is \ pale, his eyes dark haggard shadows. "; <>; } else { "Rito is not on-stage."; } ]; Nearby imita "Imita" ! in theplay class acthom, with name "Imita", description [; if (self has general) { print "Imita is (of course) a beautiful young woman, in intricately \ layered silks, sea-grey, sea-green. Her eyes are reddened, and a \ tear-mark sparkles down her face. "; <>; } else { "Imita is not on-stage."; } ], has female; Nearby tato "Tato" ! in theplay class acthom, with name "Tato", description [; if (self has general) { print "Tato is a tall, powerful man, clad in red and violet wrapped \ velvets. His face is tinged with red, and his brows are heavy and \ dark. "; <>; } else { "Tato is not on-stage."; } ]; Object stagebouquets "tumult of favors" with name "tumult" "flower" "flowers" "favor" "favors" "ribbon" "ribbons" "sweetmeat", description "The stage is left with a tumult of flowers and ribbons, the favors thrown \ by the audience.", before [; Examine: rfalse; default: "That's all down on the stage."; ], has scenery; Object LowerTheater "Lower Theater" with description [; if (player in theaterbench) print "If nothing else, you have a good seat."; else print "If nothing else, you had a good seat."; print " The stage is only a few rows to the north."; if (theplay.number < playcount_Applause) " People are jammed on benches in every direction; you \ think the aisle is somewhere to the west."; if (theplay.number < playcount_Emptying) " Everyone is on their feet, but you think the aisle is \ somewhere to the west."; " You are surrounded by empty benches; the aisle is somewhere \ to the west."; ], cant_go #r$TheaterCantGo, w_to [; return TheaterTryGo(ByAisle); ], out_to [; return TheaterTryGo(ByAisle); ], after [; Exit: ! this is for getting off of the bench crowdnoise = 1; if (theplay.number < playcount_Applause) "You push yourself to your feet. Naturally, your spot on the bench \ instantly vanishes in the crush."; if (theplay.number < playcount_Emptying) "You join the rest of the standing ovation."; "You push yourself to your feet."; ], has light; Nearby theateraisle1 "aisle" with name "aisle", before [; Enter: <>; default: "The aisle is somewhere off to the west."; ], has scenery; Nearby theaterbench "bench" ! in LowerTheater with name "wood" "bench" "benches" "chair" "chairs" "seat" "seats", article "your", description [; if (janitor has absent) "Wood, barely polished, not clean."; "Wood, barely polished... but clean."; ], before [; Take: if (theplay.number >= playcount_Applause) "This is not going to happen. The benches are barely-smoothed \ tree trunks."; else "This is not going to happen. The benches are barely-smoothed \ tree trunks, and there are people sitting all over them."; Enter: if (player in theaterbench) "You're already seated."; else { if (theplay.number < playcount_Applause) "A shadowy shape mutters, ~Kick out. It's full.~"; rfalse; } LookUnder: if (janitor has absent) "You see much mud and many feet, but nothing important."; "The floor is nicely clean."; ], after [; Enter: if (theplay.number < playcount_Emptying) "You sit down, earning yourself disapproving glares from your \ fellow play-goers."; "You sit, enjoying the elbow-room."; ], has scenery enterable supporter; Object ByAisle "Theater Near Aisle" with description [; if (theplay.number < playcount_Applause) print "You are adrift in a sea of knees. People squirm to give you room, \ glowering politely around you as they try to watch the play."; else { if (theplay.number < playcount_Emptying) print "You are adrift in a sea of cheering play-goers."; else print "You are adrift in a sea of empty benches."; } " The aisle is nearby, west, and your seat is far in to the east."; ], cant_go #r$TheaterCantGo, e_to [; return TheaterTryGo(LowerTheater); ], in_to [; return TheaterTryGo(LowerTheater); ], w_to [; return TheaterTryGo(LowerAisle); ], out_to [; return TheaterTryGo(LowerAisle); ], has light; Nearby theateraisle2 "aisle" with name "aisle", description [; print "The aisle is just to the west."; if (theplay.number < playcount_Emptying) print " It's packed -- people sitting on the steps, \ leaning against the walls. None of them look familiar, however."; new_line; rtrue; ], before [; Examine: rfalse; Search: <>; Enter: <>; default: "The aisle is to the west."; ], has scenery; Object LowerAisle "Lower Aisle" with name "aisle" "steps", description [; if (theplay.number < playcount_Applause) print "It's actually harder to navigate here in the aisle. \ People are sitting on the steps, leaning up against \ the wall, and in some places perched on the gas-lights. The aisle \ extends north and south from here, but towards the stage it's even \ more crowded."; else { if (theplay.number < playcount_Emptying) print "It's actually harder to navigate here in the aisle. \ People are everywhere on their feet, clapping madly. \ The aisle \ extends north and south from here, but towards the stage it's even \ more crowded."; else print "The aisle is almost roomy now that everyone is gone. \ It extends north and south."; } " Your seat is somewhere deep in the benches to the east."; ], cant_go #r$TheaterCantGo, e_to [; return TheaterTryGo(ByAisle); ], in_to [; return TheaterTryGo(ByAisle); ], s_to [; return TheaterTryGo(MiddleAisle); ], u_to [; return TheaterTryGo(MiddleAisle); ], n_to [; if (janitor hasnt absent) return TheaterCantGo(); "The front of the aisle is entirely packed."; ], d_to [; if (janitor hasnt absent) return TheaterCantGo(); "The front of the aisle is entirely packed."; ], nw_to #r$TheaterWall, w_to #r$TheaterWall, sw_to #r$TheaterWall, has light; Object MiddleAisle "Halfway Up Aisle" with name "aisle" "steps", description [; print "You're halfway up the aisle on the west side of the theater."; if (theplay.number < playcount_Emptying) { print " It's still full of people, but you can maneuver north and south."; } else { print " Everything is dim."; } new_line; rtrue; ], cant_go #r$TheaterCantGo, n_to [; return TheaterTryGo(LowerAisle); ], d_to [; return TheaterTryGo(LowerAisle); ], s_to [; return TheaterTryGo(UpperAisle); ], u_to [; return TheaterTryGo(UpperAisle); ], nw_to #r$TheaterWall, w_to #r$TheaterWall, sw_to #r$TheaterWall, has light; Nearby aislecrack "narrow crack" ! in MiddleAisle with name "narrow" "crack" "hole" "gap", description [; print "It's a bare fingerwidth across and perhaps a yard long; \ just a gap where the wall planks have warped. A hint of cool \ air breathes out of it.^"; AisleBreezeCheck(); ], react_before [; Examine, Search: if (noun == w_obj) { print "There is a crack in the west wall. "; <>; } LookBehind: if (noun == w_obj) <>; ], before [; Enter: "Your smallest finger might make it through. The rest of you won't."; Search, LookBehind: "The wall planking is too thick to get any kind of view through \ the crack."; ], has scenery; Nearby aislebreeze "breath of cool air" ! in MiddleAisle with name "breath" "cool" "air" "breeze" "wind" "thread", description [; print "It's gone, and there it is again -- a touch of cool air. \ You turn your head from side to side, feeling... it seems \ to be coming from a crack in the west wall.^"; AisleBreezeCheck(); ], before [; Touch: <>; Smell: print "The air smells of dry leaves, smoke, distant frost; autumn.^"; AisleBreezeCheck(); rtrue; Follow: <>; Take: "Unlikely."; ], react_before [; if (action == ##Smell && noun == 0) <>; ], number 0, ! used by each_turn each_turn [; self.number = self.number+1; switch (self.number) { 1: self.number = self.number+1; ! again, to hasten next notice "^You feel the faintest cool breath of air."; 4: self.number = 1; print "^Again, you feel that cool thread of air across your face.^"; AisleBreezeCheck(); rtrue; } ], has scenery; ! general means you've done your double-take. [ AisleBreezeCheck; if (aislebreeze has general) return; give aislebreeze general; "^Wait. Wait. What's ever cool in this suffocating summer heat? It comes again, \ slight, smoky, deep with autumn. Impossible."; ]; Object UpperAisle "Upper Aisle" with name "aisle" "steps" "doors", description [; if (theplay.number < playcount_Emptying) { "You've struggled your way to the top of the aisle; the theater \ stretches away to the north and east. Everything east is a solid \ mass of benches and people, of course, and more playgoers are lined \ up along the back wall. \ Wide doors to the south lead outside."; } else { "You're at the top of the aisle; the theater \ stretches away to the north and east, echoing dark. \ Everything east is a solid mass of benches, of course. \ Wide doors to the south lead outside."; } ], cant_go #r$TheaterCantGo, n_to [; return TheaterTryGo(MiddleAisle); ], d_to [; return TheaterTryGo(MiddleAisle); ], s_to [; print "You escape into the searing light of the high summer afternoon. \ The air is still oppressively hot, but at least it's fresh, and the \ theater portico gives a bit of shade.^"; LeaveTheater(); return TheaterPortico; ], nw_to #r$TheaterWall, w_to #r$TheaterWall, sw_to #r$TheaterWall, se_to "The back wall of the theater is that way.", u_to "You're at the top of the aisle.", has light; Object otherbenches "benches" with name "wood" "bench" "benches" "chair" "chairs" "seat" "seats", found_in [; ! see comment for theplay. if (location == LowerTheater) rfalse; rtrue; ], before [; "The other benches aren't important."; ], has scenery; Object janitor "wrinkled old man" with name "wrinkled" "old" "man", found_in [; rtrue; ! see comment for theplay, except the janitor starts absent. ], describe [; "^The wrinkled old man is scrubbing slowly under some benches nearby."; ], description "He looks old enough to have scrubbed bloodstains in the Calamoscan \ Cyclia in his youth. And, if so, he's still annoyed at the slaves for \ having bled so much.", life [; Order, Ask, Tell, Answer: "The old man slowly glances up to you, \ and then he slowly glances back down to his rag, \ and then he starts scrubbing again. Slowly."; default: "He looks like he has enough problems."; ], has animate absent transparent; Object janitorrag "rag" janitor with name "rag" "rags", description "It's a rag. It's seen a lot of bench, but that doesn't make it \ interesting.", before [; Examine: rfalse; default: "The old man's rag isn't important."; ], has scenery; [ TheaterCantGo; if (theplay.number < playcount_Applause) "If you start crawling over people in here, you're likely \ to be hung from a scene-scaffold before the play is over."; if (theplay.number < playcount_Emptying) "If you start crawling over people in here, you're likely \ to be hung from a scene-scaffold."; if (janitor hasnt absent) "The wrinkled old man gives you such a slow, incandescent glare \ that you retreat to the aisle."; "Elves grab your toes and pull you back. [BUG]"; ]; [ TheaterWall; "You're by the theater's west wall."; ]; [ TheaterTryGo dest; if (theplay.number >= playcount_Emptying) { return dest; } if (theplay.number % 2 == 1) { print "You push through the crowd...^"; crowdnoise = 1; return dest; } print "As you start to push through the crowd,"; audience.number = audience.number+1; switch (audience.number) { 1: print " you find a knee jammed \ unpleasantly in your path. You manage not to trip. \ The owner of the \ knee mumbles pungently, jams it out of your way (into \ someone else's), and curtly gestures you to pass.^"; 2: print " someone pushes through even harder in the opposite direction.^"; 3: print " a child darts unrepentantly under your feet.^"; default: audience.number = 1; ! don't redo the first one print " you slam up against a solid wall of sweaty shoulders. A \ vigorous elbow or two helps break the wall apart.^"; }; rtrue; ]; ! Clean up everything which no longer applies once you leave the theater. [ LeaveTheater; give theplay absent; remove theplay; give janitor absent; remove janitor; give otherbenches absent; remove otherbenches; StopDaemon(theplay); ]; Object TheaterPortico "Theater Portico" with name "street" "portico" "theater" "servant" "garb", description "People flock here, in the shade of the colonaded portico, talking \ and drinking sharp beer. The main entrance to the theater is back north; \ the street runs bright and dusty to the south, \ and the crowded portico continues to the west.", n_to "A servant, looking terribly uncomfortable in dark formal garb, blocks your \ way. ~Can't let yar back in. They'll be setting up for another show \ after sundown. Sorry, sar.~", s_to [; if (self has general) { deadflag = 3; "You resolutely put the theater and its oddities from your mind. \ That leaves you with, well, Aessa and her oddities, and that \ depressing thought occupies you through the long hot miserable \ streets."; } give self general; print "You hesitate at the curb."; if (aislebreeze has general) " That cool draft of air back in the theater -- \ surely it deserves some investigation."; else " There was something back in the theater, something out of place."; ], se_to [; <>; ], sw_to [; <>; ], e_to "The wall of the adjacent building stands in your way.", nw_to "The theater entrance is north.", ne_to [; <>; ], w_to WestPortico, has light outdoors; ! general means you've been warned about leaving Object porticocrowd "crowd" with name "people" "crowd", description "People stand around the portico, talking, drinking, avoiding the \ dreadful afternoon sun, if not the heat.", found_in TheaterPortico WestPortico, react_before [; Listen: if (noun == 0) <>; ], before [; Push, Pull, Turn: "Someone pushes right back."; Search: print (string) self.description; " But you don't see Aessa anywhere."; Listen: if (self.number == 0 && self hasnt general) { give self general; print_ret "You edge closer to the argument about the moons. You've heard most of \ it before, actually. Are the two moons chunks of stone, with no \ more meaning to their endless circling than there would be if they \ fell? Or are they emanations of spirit, changing like the moods \ of the gods, with no physical substance to them at all? The astronomers \ can argue the cases for months. Which ", (emphstring) "has", " led to \ something new -- you lean closer -- there's a proposal to reach out and \ see, somehow. Something about a beam of light? You don't understand \ the worked arts."; } "People talk about the awful weather, the council, cyclia teams, the miserable \ weather... summer talk in the city."; ], life [; Answer, Ask, Tell, Order, Show, Give: "Nobody pays much attention to you."; default: "Oh, what a good idea."; ], number 4, ! used in each_turn each_turn [; if (self.number > 0) { self.number = self.number - 1; if (self.number == 0) { "^A couple of people nearby are discussing the moons. That's right; \ tonight is the night that the astronomers have been going on about. \ You'll have to be sure to watch. Snuggled in a blanket, ideally... \ if you ever find Aessa."; } } ], has scenery animate hiddengender transparent; ! general means heard about moons (in detail) Nearby beer "flasks of beer" ! in porticocrowd with name "flask" "flasks" "of" "sharp" "beer", before [; Buy: if (location == WestPortico) "You haven't any coin; you spent the last of this week's on the \ play. Anyway, you're more a let-cider person."; else "Nobody here is selling any."; default: "The beer isn't yours, and anyway you're more a let-cider person."; ], has scenery; Object WestPortico "West Portico" with name "street" "portico" "theater", description [; print "More people are relaxing here, perhaps because of the kegman who \ sells his beer under the theater portico. The main street bakes in sunlight to \ the south; the front of the theater continues to the north, adorned by some \ decorative potted shrubs."; if (theaterdoor in WestPortico) print " Half-hidden behind the shrubs is a doorway."; new_line; rtrue; ], s_to [; ! ought to merge with TheaterPortico.s_to if (self has general) { deadflag = 3; "You resolutely put the theater and its oddities from your mind. \ That leaves you with, well, Aessa and her oddities, and that \ depressing thought occupies you through the long hot miserable \ streets."; } give self general; print "You hesitate at the curb."; if (aislebreeze has general) " That cool draft of air back in the theater -- \ surely it deserves some investigation."; else " There was something back in the theater, something out of place."; ], se_to [; <>; ], sw_to [; <>; ], e_to TheaterPortico, w_to "The kegman's stand is in your way.", nw_to "There's no way in there.", ne_to [; <>; ], n_to [; if (theaterdoor in WestPortico) { print "Ignoring the sign, you slip inside.^"; } else { print "You slip behind the shrubs, and discover a concealed doorway! \ (What a shock.) Ignoring a sign on the jamb, you slip inside.^"; move theaterdoor to WestPortico; } return TheaterHallS; ], has light outdoors; ! general means you've been warned about leaving Nearby westporticobreeze "breath of cool air" with name "breath" "cool" "air" "breeze" "wind" "thread", description [; print "It's gone, and there it is again -- a touch of cool air. \ You turn your head from side to side, feeling... it seems \ to be coming from the direction of the potted shrubs.^"; AisleBreezeCheck(); ], before [; Touch: <>; Smell: print "The air smells of dry leaves, smoke, distant frost; autumn.^"; AisleBreezeCheck(); rtrue; Follow: <>; Take: "Unlikely."; ], react_before [; if (action == ##Smell && noun == 0) <>; ], number 0, ! used by each_turn each_turn [; self.number = self.number+1; switch (self.number) { 1: self.number = self.number+1; ! again, to hasten next notice print "^You feel the faintest cool breath of air.^"; AisleBreezeCheck(); rtrue; 4: self.number = 1; "^Again, you feel that cool thread of air across your face."; } ], has scenery; Nearby kegman "kegman" with name "kegman" "keg" "man" "stand", description "The kegman is selling sharp beer in cheap clay flasks. You see \ quite a few being tilted and expansively waved around the crowd.", before [; Buy: "~The whole keg, ei?~ The kegman laughs musically. ~You, be go kegman \ yourself? Eia, no.~"; ], orders [; Give: ! man, give noun to second (or: ask man for noun) if (noun == beer) <>; "~Ei, just beer. Two coin, two,~ chants the kegman. ~Beer, is only.~"; NotUnderstood: ! man, 'noun' if (noun == 'beer') <>; ], life [; Ask: ! ask noun about second if (second == 'beer') "~Sharp beer, two coin, two,~ chants the kegman."; "~Ei, just beer. Two coin, two,~ chants the kegman. ~Beer, is only.~"; Order, Tell, Show, Give: "The kegman shrugs fluidly."; default: "There's no need to harass him."; ], has scenery animate; Nearby theatershrubs "potted shrubs" with name "potted" "shrub" "shrubs" "plant" "plants" "bush" "bushes", description [; print "You know nothing about gardening. Whatever the shrubs are, \ they're tall, leafy, and not quite dead of the heat."; if (theaterdoor notin WestPortico) { move theaterdoor to WestPortico; print "^^You notice a doorway, half-hidden behind the shrubs.^"; } else { print " There's a doorway behind them.^"; } ], before [; Search: <>; LookBehind: if (theaterdoor notin WestPortico) { move theaterdoor to WestPortico; "You notice a doorway, half-hidden behind the shrubs."; } else { "There's a doorway behind the shrubs."; } ], has scenery; Object theaterdoor "doorway" with name "door" "doorway", description "It's just a plain doorway, leading into the relative dimness of \ the theater. A small sign by the jamb reads ~By right, please.~", before [; Enter: <>; ], has scenery transparent; Object theaterdoorsign "small sign" theaterdoor with name "small" "sign" "by" "jamb", description "The sign reads ~By right, please.~", has scenery; Object TheaterHallS "Theater Hall, South" with description "This is obviously a service hallway for the theater. You are \ surrounded by crates and arbitrary stacks of paper, and pieces of scenery \ lean against the rough planking walls of the hallway to the north. \ Light glares in from the south.", s_to [; print "You emerge, and drift out from behind the potted shrubs.^"; return WestPortico; ], n_to TheaterHallN, cant_go "The hall runs north and south.", has light; Nearby southhallbreeze "breath of cool air" with name "breath" "cool" "coolness" "air" "breeze" "wind" "thread", description "The cool air is definitely coming from the north, up the hallway.", before [; Touch: <>; Smell: "The air smells of dry leaves, smoke, distant frost; autumn."; Follow: <>; Take: "Unlikely."; ], react_before [; if (action == ##Smell && noun == 0) <>; ], number 0, ! used by each_turn each_turn [; self.number = self.number+1; switch (self.number) { 1: self.number = self.number+1; ! again, to hasten next notice "^The coolness touches your face again."; 4: self.number = 1; "^That cool touch of air stirs past you."; } ], has scenery; Nearby theaterstuff "crates and things" with name "crates" "crate" "paper" "stack" "stacks" "piece" "pieces" "scenery" "things", before [; "The stuff here is neither yours nor important."; ], has scenery; Object TheaterHallN "Theater Hall, North" with description "The hallway ends at a heavy door to the north, and a storage room \ opens west. The wooden planking of the walls is old and unpainted; \ you notice a narrow \ crack to the east. The heavy door is closed.", cant_go "The hall runs south; there's a door to the north and a doorway \ to the west.", n_to theaterlockeddoor, s_to TheaterHallS, w_to TheaterStorage, before [; Go: if (noun == n_obj) "The door is closed."; ], has light; Nearby theaterlockeddoor "heavy door" with name "heavy" "oak" "door" "handle", description "Just a door, in heavy oak, with a wrought-metal handle. \ The door is closed.", door_to 0, door_dir n_to, before [; Enter: "The door is closed."; LookUnder: "You can't see under the door."; Open, Push, Pull: "It's locked; the handle is immobile."; Lock, Unlock: "That doesn't seem to fit the lock."; Listen: if (random(21) < 11) "The voices can only barely be heard, now."; else "You can hear nothing, now."; Attack: <>; ], react_before [; Listen: if (noun == 0) <>; ], number 0, ! counter used by each_turn each_turn [; self.number = self.number + 1; switch (self.number) { 1: "^Sharp voices filter out through the door. They are too \ muffled to make out more than the tone of anger."; 3: print "^One voice, a "; if (random(21) < 11) print "man"; else print "woman"; ", rings out through the door, for a syllable or two."; 4, 5: if (random(21) < 11) self.number = 0; 6: "^Faint sobs drift through the closed door."; 7: self.number = 0; } ], has scenery door openable locked; Nearby northhallvoices "voices" with name "voice" "voices" "sobs", before [; Examine, Listen: <>; Follow: "The voices come from behind the door."; default: "They're just voices."; ], has scenery; Nearby northhallbreeze "breath of cool air" with name "breath" "cool" "coolness" "air" "breeze" "wind" "thread", description "The cool air breathes from the western doorway.", before [; Touch: <>; Smell: "The air smells of dry leaves, smoke, distant frost; autumn."; Follow: <>; Take: "Unlikely."; ], react_before [; if (action == ##Smell && noun == 0) <>; ], number 0, ! used by each_turn each_turn [; self.number = self.number+1; switch (self.number) { 2: self.number = self.number+1; ! again, to hasten next notice "^The coolness touches your face again."; 5: self.number = 2; "^That cool touch of air stirs past you."; } ], has scenery; Nearby hallcrack "narrow crack" with name "narrow" "crack" "hole" "gap", description "It's a bare fingerwidth across and perhaps a yard long; \ just a gap where the wall planks have warped.", react_before [; Examine, Search: if (noun == e_obj) { print "There is a crack in the east wall. "; <>; } LookBehind: if (noun == e_obj) <>; ], before [; Enter: "Your smallest finger might make it through. The rest of you won't."; Search, LookBehind: "The wall planking is too thick to get any kind of view through \ the crack."; ], has scenery; Object TheaterStorage "Theater Storage" with name "rijusticas" "column" "columns" "avenue" "dirt" "dust" "cobwebs", description "Or perhaps ex-storage, since the room is almost bare. A small \ dirty window to the west admits bright beams, but they fall across \ only the floor and a battered cabinet against the north wall. The doorway \ lies to the east.", e_to TheaterHallN, cant_go "The doorway lies to the east.", has light; Nearby storagebreeze "breath of cool air" with name "breath" "cool" "air" "breeze" "wind" "thread", describe [; "^The air here is rich with autumn, brisk and cool. It's impossible, \ absurd."; ], description "This part of Tertuga has borne the silent vise of high summer sun \ for weeks. But, in the heart of a city baked to dust, \ this room has the tang of a smoky autumn wind. You don't know \ what it means; but the breeze is coming from... behind the cabinet?", before [; Touch: <>; Smell: "You smell dry leaves, smoke, distant frost; autumn."; Follow: <>; Take: "Unlikely."; ], react_before [; if (action == ##Smell && noun == 0) <>; ], number 0, ! used by each_turn each_turn [; self.number = self.number+1; switch (self.number) { 4: self.number = 1; "^The air swirls briskly around you."; } ], has static; Nearby storagelight "beams of sunlight" with name "beam" "beams" "of" "light" "sun" "sunlight", description "Beams of sunlight filter in through the window. They cut bright \ rhombuses onto the floor, and onto the cabinet, leaving dark shadow behind \ it.", before [; Touch, Enter: "The light is hot on your skin, even filtered through dirt."; Take: "I'm not sure what to make of that request."; Push, Pull, Turn: "It's just light."; Search: "There is nothing in the light but some drifting dust."; Receive: print "You hold ", (the) noun, " in the light, which shines \ prettily upon it.^"; rtrue; ], has scenery container; Nearby storagewindow "dirty window" with name "dirty" "small" "glass" "window", description "The glass is old and wavery, and streaked with dirt and cobwebs \ besides. Nonetheless, sun scorches in. Outside you see the avenue that \ crosses by the theater; beyond that tower the columns of the rijusticas.", before [; Search, LookBehind: <>; Open, Push, Pull: "It's not a hinged window."; Attack, KnockOn: "Glass may not be the folly of the rich any more, but you're still \ unwilling to break it."; ], has scenery; Nearby storageshadow "shadow behind the cabinet" class shadowclass, with description [; print "Blackness lies behind the cabinet. Opaque... in this \ brightly lit room, no shadow should be so thick."; if (self hasnt general) { give self general; print "^^As you step back from the cabinet, the shadow ", (emphstring) "flares.", " A sunbeam might shine off crystal \ to paint the whole world white for one angle of an instant; \ so this shadow widens into a gulf beneath black and wider than \ everything. Then you move a fraction farther, and it is only a \ line of too-black behind chipped wood.^"; rtrue; } " The darkness widens and narrows, impossibly, as you shift your line \ of vision back and forth."; ], door_to NovRoad, door_world world_November, before [; Smell: <>; Receive: print (The) noun, " slides into the shadow, in a way which \ has nothing to do with the narrow space behind the cabinet. \ Then, without your ever quite having let go, it is gone.^"; rfalse; Enter: print "The shadow ", (emphstring) "flares", " again as you set foot \ to it. The cabinet is to your left and the wall to your right, never \ mind the space that isn't there between them, and then never mind \ anything because blackness has taken the world, never mind, never world, \ not even you, never you --^^"; PauseClear(); print "-- And then daylight smacks you in the behind, ordinary as a dirt \ road.^^"; rfalse; ]; ! general means you've done your double-take. Nearby theatercabinet "cabinet" with name "battered" "wooden" "wood" "panels" "cabinet" "cupboard", describe [; if (self hasnt open) rtrue; new_line; <>; ], description [; if (self hasnt open) { "A closed cabinet, chipped and stained, stands against the wall. Sunlight \ brings a tattered, hopeful glow out of the old wood, but \ shadow falls behind."; } else { print "A cabinet, chipped and stained, stands against the wall. Sunlight \ brings a tattered, hopeful glow out of the old wood, but \ shadow falls behind. "; <>; } ], before [; Take: "The cabinet is old, but heavily made, and it's taller than you."; Search: if (self hasnt open) "The cabinet is not open."; print "The cabinet stands open"; if (children(self) == 0) " -- empty but for dusty shelves and hooks."; if (children(self) == 1 && child(self) == voicebox) { "; an unusual wooden box rests on the top shelf."; } print "; inside"; WriteListFrom(child(self), ISARE_BIT | ENGLISH_BIT | RECURSE_BIT); "."; LookBehind: <>; GoBehind: <>; ReceiveBehind: <>; LookUnder: "The cabinet rests on the floor; you can't see under it."; Pull, Push, Turn: "The cabinet is too heavy to move."; ], after [; Open: if (self hasnt general) { if (children(self) ~= 1 || child(self) ~= voicebox) { "An elf reaches out and slams the door shut. [BUG]"; } give self general; "You swing open the door. The cabinet is mostly empty; bare \ shelves and hooks and a scatter of dust. But on the top \ shelf rests an unusual, off-square wooden box, its rich polish \ at odds with the battered panels that surround it."; } rfalse; ], has container openable static; ! general means you've opened it before. Object cabinetshelf "shelves and hooks" TheaterStorage ! hack, but it'll work with name "shelves" "hooks" "shelf" "hook", before [; if (theatercabinet hasnt open) "You can't see any such thing."; "The shelves and hooks aren't important."; ], has scenery; Object voicebox "odd wooden box" theatercabinet with name "odd" "wood" "wooden" "box", article "an", description "The box is strange, even stranger for being so simple. Just \ polished wooden sides, trapezoidal, no two faces parallel. But the joinings \ are precise; no seams show. The craftwork is exact. No mark shows on \ the rich reddish wood, except for the natural grain; \ and also a row of paler circles on each side. These seem to be inlaid discs \ of a blond wood, flush with the surface, each incised with a deep star-shaped mark.", number 1, ! used in Attack counter react_before [; Sing: ! These strings are also cached in darkchord.react_before. if (noun == self && self in player) { "You essay a few notes, holding the box close to your mouth. The \ sound is immense: a resonant thrum, echoing you \ in harmonics that shift subtly with your voice."; } "You essay a few notes. The odd wooden box resonates slightly, producing \ a faint thrum that shifts with your voice."; ], before [; Open: "None of the seams of the box look to be meant to open."; Close: "It's already closed, assuming it opens at all."; Turn: "You turn the box over in your hands. No side looks much \ different from any other side."; Touch: "The wood is smooth and richly polished."; Rub: "The wood responds with a unexpectedly rich hiss as your fingers move \ across it."; Attack, KnockOn: switch (self.number) { 1: self.number = self.number + 1; "You tap the box, which responds with a deep, resonant note."; 2: self.number = self.number + 1; "You tap the box, which responds with a higher note than before."; 3: "You tap the box in several places; the resulting notes \ glance oddly up and down the scale."; } ], has transparent; Nearby voiceboxscrews "pale wooden discs" ! in voicebox with name "pale" "blond" "wood" "wooden" "disc" "discs" "disk" "disks" "circle" "circles" "star" "stars" "mark", description "The discs are each about as long as the last joint of your thumb. \ They are arranged in precise rows of three discs each, one row on each face of the box. \ Each disc is incised with a mark in the shape of a three-pointed star.", before [; Take, Pull: "The discs are set in flush, and do not seem to move."; Turn: "You cannot turn the discs, even when pressing your nails into the incised \ marks."; Push: "The discs do not seem to move at all."; Attack, KnockOn: "You rap on one of the pale discs. It produces only a muffled clack."; ], has scenery; #ifnot; ! SKIP_THEATER; Object theaterbench "Starting Box" with description "First room.", has light outdoors; Nearby theplay "play" with daemon [; StopDaemon(self); ], has static absent; Nearby voicebox "box", with name "box", has transparent; Object voiceboxscrews "screws" voicebox with name "screw" "screws", has scenery; Global WestPortico = theaterbench; [ LeaveTheater; rfalse; ]; Object porticocrowd "portico crowd" has static; #endif; ! SKIP_THEATER;