From: Jason Self Date: Mon, 19 Aug 2019 13:49:07 +0000 (-0700) Subject: Rename game files to lowercase X-Git-Url: https://jxself.org/git/?p=spiritwrak.git;a=commitdiff_plain;h=8cf6c360a875867b3cb9b78b9e73a0e72d527d17 Rename game files to lowercase --- diff --git a/src/ANTHAR.INF b/src/ANTHAR.INF deleted file mode 100644 index 564deca..0000000 --- a/src/ANTHAR.INF +++ /dev/null @@ -1,2034 +0,0 @@ - -! **************************************************************** -! ANTHAR.INF -! -- Add-on for SPIRITWRAK -! (Do not use alone!) -! **************************************************************** - -Object ANTHAR_GUSStop "Entrance to Greater Anthar" - with description "You're just west of Greater Anthar on the \ -island nation of Antharia. The bright sunlight \ -seems to make the city streets east of here glitter. \ -A stairway leads down.", - name "sunlight" "streets" "glitter" "stairway", - d_to ANTHAR_GUSStation, - e_to ANTHAR_West, - has light; - -Object ANTHAR_West "Anthar West" - with description "You are standing in a busy section of \ -West Greater Anthar City. The city seems to thin \ -out to the west. A roadway heads east, \ -the ever-popular Flathead \ -Stadium lies to the northeast, and a pub lies to the \ -south.", - name "roadway" "stadium" "pub", - w_to ANTHAR_GUSStop, - e_to ANTHAR_East, - s_to Delbins, - in_to Delbins, - ne_to Stadium_entrance, - cant_go "You walk around the area, take in the local scene, and \ - find yourself back here.", - before [; - Smell: "You can smell scents of local cooking coming \ - from the south."; - ], - has light; - -Object ANTHAR_East "Anthar East" - with description "You are standing in a busy section of \ -East Greater Anthar City. The city continues to \ -the west. There is a large odd structure to the \ -east, made mostly of glass. The ever-popular Flathead \ -Stadium lies to the northwest. A short walk down \ -to a waterfront area is to the south.", - name "structure" "glass" "stadium" "waterfront", - w_to ANTHAR_West, - e_to Conservatory_entrance, - s_to ANTHAR_Waterfront, - nw_to Stadium_entrance, - cant_go "You walk around the area, take in the local scene, and \ - find yourself back here.", - before [; - Smell: "You smell rather nice floral scents coming \ - from the east."; - ], - has light; - - -Object ANTHAR_Waterfront "Swank Waterfront" - with description "A pleasant waterfront walk is your current \ -location. You can see the Great Sea stretching out \ -before you to the south, a breath-taking sight. \ -A rail runs along the south end, preventing \ -an untimely fall into the rock shore below. The \ -city is back to the north.", - name "waterfront" "sea" "great" "railing" "rail" "rock" "shore", - n_to ANTHAR_East, - has light; - -Object telescope "viewing telescope" ANTHAR_Waterfront - with name "telescope" "viewing" "scope", - capacity 1, - when_closed "There's a viewing telescope here, attached to the railing.", - when_open [ x ; - print "There's a viewing telescope here, attached to the \ -railing. One of the lenses seems loose"; - if (children(self) == 0) "."; - else { - print ". Inside you see:^"; - x = FULLINV_BIT + INDENT_BIT + NEWLINE_BIT + RECURSE_BIT; - WriteListFrom (child(telescope), x, 1); rtrue; - } - ], - description "A nice tourist toy. Perfect for getting a good view.", - before [; - Open: print "You pry loose a lens. "; - Close: print "You push the lens back in place. "; - Search: - if (self hasnt open) { - print "You take a peak through the telescope"; - if (children(self) ~= 0) - " but oddly, there's something blocking your \ - view."; - else { - if (random(40)==1) - " and see a ship in the distance! Wait, perhaps not. \ -It's gone."; - " and see a nice expanse of the Great Sea."; - } - } - ], - size 10, - has static container openable; - -! (Conservatory gardens) - -Object Conservatory_entrance "Conservatory Entrance" - with description "You stand before the entrance to a large public \ -conservatory. You can enter the greenhouses to the northeast \ -and southeast, or walk back to Anthar to the \ -west.", - name "greenhouse" "greenhouses", - w_to ANTHAR_East, - ne_to Con_Desert_garden, - se_to Con_Flower_garden, - before [; - Smell: "You can smell floral scents from the southeast."; - ], - has light; - -Object Con_Desert_garden "Desert Garden" - with description "A nicely arranged collection of desert plants \ -is here in the ~Desert Garden~. Bright sunlight \ -and a sandy ground enhance the overall effect. \ -The conservatory entrance is to the southwest, or \ -more gardens lie to the south and east.", - name "sunlight" "plants" "sand" "gardens", - sw_to Conservatory_entrance, - e_to Con_Forest_garden, - s_to Con_Decor_garden, - has light; - - -Object Con_Flower_garden "Flower Garden" - with description "A rather lovely flower garden lies before you. \ -The multi-colored flowers are turning the air into \ -perfume. The conservatory entrance is northwest, \ -or more greenhouse gardens lie to the north and \ -east. A tiny trail leads south past the flower \ -beds.", - name "perfume" "entrance" "trail" "greenhouse", - nw_to Conservatory_entrance, - e_to Con_Jungle_garden, - n_to Con_Decor_garden, - s_to Con_storehouse, - before [; - Smell: "The bouquet of flowers is quite intoxicating."; - ], - has light; - -Nearby flowers "flowers" - with name "flowers" "flower" "garden", - description "A lovely assortment of flowers.", - before [; - Take: "Don't pick the flowers."; - Cast: - if (the_spell_was == throck_spell) - "Suddenly, a few more flowers spring out of the \ - ground!"; - ], - has scenery; - -Object Con_storehouse "Gardener's Storehouse" - with description "This must be a storehouse for the conservatory \ -gardeners. There are soil stains and plant debris all over. \ -The only exit is north.", - name "soil" "stains" "debris" "plant", - n_to Con_Flower_garden, - has light; - -Nearby toolshed "toolshed" - with name "toolshed" "shed", - description "A plain toolshed.", - with_key shed_key, - capacity 10, - size 20, - when_closed "A toolshed stands closed against the wall.", - when_open [ x; - print "The toolshed is open. "; - x = children(self); - if (x == 0) "It is empty."; - print "Inside "; - if (x == 1) print "is: "; else print "are: ^"; - x = FULLINV_BIT + INDENT_BIT + NEWLINE_BIT + RECURSE_BIT; - WriteListFrom (child(self), x, 1); - rtrue; - ], - has static container openable lockable locked; - -! (contents of shed) -Object gardeners_cap "cap" toolshed - with name "cap", - description "A cap with an odd green emblem stitched on \ -the front that looks like a clover.", - size 10, - has clothing; -Object hedge_clipper "hedge clipper" toolshed - with name "clipper" "clippers", - description "Basically a long pair of scissors.", - size 15, -; -Object rubber_gloves "rubber gloves" toolshed - with name "gloves" "pair" "rubber", - article "a pair of", - description "A pair of yellow rubber gloves, slightly \ -worn. Good for gardening, or washing dishes, I suppose.", - size 10, -has clothing; - -! (cracked -- magic has questionable source, doesn't always work) -Object p3 "cracked parchment" toolshed - class parchment_class, - with name "cracked", -description "~...is true that those who go by the title of \ -'Enchanters' need not wear any holy symbol through which \ -to draw magical power. Indeed, it seems as though the very \ -amulets we must wear are our only link to magical powers \ -at all. Worse yet, the powers are indeed granted from \ -powers above, but the Ancient Ones? I think not. For indeed, \ -I have found places where magic powers will not work, with or \ -without the amulet. Likewise, I have found places where \ -magic works, but praying to the Ancient Ones goes unanswered! \ -What this all...~"; - -Object Con_Decor_garden "Decorative Plants Garden" - with description "\ -You are standing in a small well-kept garden. The plots surrounding the \ -paths are filled with a variety of general ground-cover plants, all \ -appropriate for most discerning homeowners. Exits lie north and south.", - name "ground-cover" "plots" "flamingo" "tinsel" "ornament", - n_to Con_Desert_garden, - s_to Con_Flower_Garden, - has light; - -Object Con_Forest_garden "Forest Garden" - with description "A garden path winds through this narrow \ -greenhouse, which is stocked with various forest plants. \ -The path winds back to the west and south.", - name "path", - w_to Con_Desert_garden, - s_to Con_Fountain, - has light; - -Nearby plants1 "plants" - with name "plants" "plant" "tree" "forest", - description "You are reminded of a hiking trip you took once.", - before [; - Cast: - if (the_spell_was == throck_spell) - "The forest seems a bit livelier now."; - ], - has scenery; - -Object Con_Jungle_garden "Jungle Garden" - with description "A garden path winds through this \ -long greenhouse, which is filled with plants native to \ -jungle settings. The environment is somewhat \ -humid. The path heads west and north from here.", - name "path" "humid", - w_to Con_Flower_garden, - n_to Con_Fountain, - e_to [; - if (waterfall hasnt general) - "You can't go that way."; - else return Con_Nursery; - ], - before [; - Smell: "You smell flowers to the west."; - ], - has light; - -Nearby plants2 "plants" - with name "plants" "plant" "tree" "jungle", - description "Reminds you of a picture you once saw of \ -the Miznia jungles.", - before [; - Cast: - if (the_spell_was == throck_spell) - "The jungle seems a bit livelier now."; - ], - has scenery; - -Object waterfall "small waterfall" Con_Jungle_garden - with name "waterfall" "fall" "falls", - initial [; - if (self hasnt general) - print "A nice little waterfall enhances the jungle \ -setting"; - else - print "A fake waterfall hides a passage"; - " to the east."; - ], - description [; - print "A small"; - if (self has general) print " fake"; - " waterfall drops out of a mock-stucco \ -wall to the east."; - ], - before [; - Pull, Push, Touch, Search, Rub: - give self general; - "You reach out, expecting to get your hands wet, but \ - to your surprise, you feel a cloth-like substance. \ - On closer examination, you realize that the waterfall \ - is a clever realistic-looking fake, made of cloth \ - and wood. Stepping around some low plants, you also \ - notice the waterfall covers a passage east!"; - ThrownAt: - move noun to Con_Jungle_garden; - CDefArt(noun); ", to your surprise, literally \ - bounces off the waterfall, and lands with a thump \ - nearby."; - ], - has static; - -Object Con_Nursery "Nursery" - with description "This small back room is apparently the \ -conservatory nursery. Bits of soil and plant \ -debris are everywhere, along with immature \ -seedling plants. A exit lies west, partially \ -covered by some cloth.", - name "soil" "plant" "debris" "seedling" "cloth", - w_to Con_Jungle_garden, - has light; - -Object smallpot "small flower pot" Con_Nursery - with name "pot", - description "A small red-ceramic flower pot, \ -ideal for small plants, I suppose.", - before [; - Push, Take: - if ((location == Con_Nursery) && (self hasnt general)) { - give self general; - move shed_key to Con_Nursery; - print "Moving the pot uncovers a small key hidden \ -underneath it.^"; - if (action==##Push) rtrue; else rfalse; - } - LookUnder: - if ((location == Con_Nursery) && (self hasnt general)) { - "The pot does appear to be sitting crooked. But \ - you can't see whatever is under it."; - } - Cast: - if ((the_spell_was == huncho_spell or luncho_spell) && - (self hasnt general)) { - give self general; - move shed_key to Con_Nursery; - rfalse; - } - ], - size 15, - has container open transparent; - - -Object Con_Fountain "Fountain" - with description "A tasteful fountain intercepts a north-south \ -garden trail here.", - name "trail", - n_to Con_Forest_garden, - s_to Con_Jungle_garden, - each_turn [; - if (random(20) == 1) - "^You hear someone whistling nearby, but there doesn't \ -seem to be anyone around."; - ], - has light; - -Nearby fountain "fountain" - with name "fountain", - description "A stone basin with a central fountain spout \ -shaped like a fish. There's no water running currently.", - before - [ x; - Search: - if (self hasnt general) { - give self general; - move c3 to self; - "You fish in the fountain for a bit and find a coin!"; - } - else { - print "Mostly wet plant debris"; - x = children(self); - if (x == 0) - ", nothing interesting."; - print ". You also notice:^"; - x = FULLINV_BIT + INDENT_BIT + NEWLINE_BIT + RECURSE_BIT; - WriteListFrom (child(self), x, 1); rtrue; - } - Receive: - if (noun has is_coin) - print "Hoping for a little luck, I presume?"; - ], - capacity 10, - size 25, - has scenery container open; - -Object glasses "pair of glasses" Con_Fountain - with name "glasses", - initial "It looks like someone left their glasses here.", - description "Thick lenses and a heavy frame.", - before [; - Wear: "You put the glasses on for a moment, and it's like \ - looking through a fishtank. Deciding \ - against continuing your quest without adequate \ - vision, you take them off."; - ], - size 5, - has clothing; - -Object c3 "coin" class coin_class; - -Object shed_key "small key" - with name "key" "small", - description "A small metal key.", - size 4, -; - - -! (Delbin's Pub) - -Object Delbins "Delbin's Pub" - with description [; - print "Delbin's Pub has been a popular food and drink spot in \ - South Anthar for quite a while. "; - if (self hasnt general) - print "Usually, you need to \ - fight off barbarians to find a place to sit. At the moment, \ - however, the place is unusually quiet. A group of \ - barbarians seem paralyzed with fear near the back wall, \ - glancing nervously at the front of the bar."; - else print "A group of barbarians \ - are making a lot of noise nearby."; - " The exit is to the north."; - ], - name "back" "front", - number 0, - before [; - Listen: - if (self has general) - "The barbarians are a rather noisy bunch."; - Go: - if ((noun == n_obj) || (noun==out_obj)) -print "Delbin calls out ~Visit us again!~ as you leave.^"; - ], - n_to ANTHAR_West, - out_to ANTHAR_West, - each_turn [ i ; - if (Morgan in Delbins) { - i = random(3); - if ((i==1) && (Delbins.number == 0)) { - Delbins.number = 1; - "^The man in black makes a lightning fast move for the \ -glass of ale, but is countered by an equally fast move by the warrior. \ -~Lose something, thief?~ the woman says. ~No need to get violent, Morgan,~ \ -the thief says."; - } - if ((i==1) && (Delbins.number == 1)) { - Delbins.number = 2; - "^The wizard looks at his companions. ~Say, did I ever \ -show any of you my famous disappearing glass trick?~ He starts to take \ -off his wizard's hat, but the gentleman and ranger stop him. ~Don't \ -even try it, Frobar.~ the woman warrior says."; - } - if ((i==1) && (Delbins.number == 2)) { - Delbins.number = 3; - "^The female ranger fixates on the glass of ale. \ -~Look you two, some of us have better things to do, like fight wars.~ \ -The wizard scowls. ~Oh save it, Morgan.~ he says."; - } - } - ], - has light; - -Nearby barbarians "barbarians" - with name "barbarians" "group", - description "A group of dirty barbarians. One of them \ - sees you staring at them, and gives you a dirty look.", - life [; - default: - if (Morgan in Delbins) - "The barbarians are somewhat paralyzed with fear at the moment."; - else - "The barbarians are far too busy telling rude jokes \ -at the moment."; - ], - has animate concealed; - -Object headdress "headdress" Delbins - with name "headdress", - initial "A gaudy headdress of some kind is \ -hanging on a nearby wall.", - description "A large headdress made of animal fur and colorful \ -bird feathers.", - size 15, - has clothing; - -Object bar "bar" Delbins - with name "bar", - description "A long flat wood bar that could probably use a \ -washing.", - before [; - Cast: - if (the_spell_was == egdelp_spell) { - print "The bar is covered with a waxy film. \ -Delbin notices this and shrugs."; - } - LetGo: - if (noun==ale_glass) { - ; rtrue; } - ], - has scenery supporter; - -Object ale_glass "glass of ale" bar - with name "glass" "ale", - description "A small glass filled with an amber liquid.", - before [; - Take: - "You receive cold stares from the three individuals \ - at the bar. ~Get your own,~ the Ranger says and \ - pushes you back."; - Drink: - "You receive cold stares from the three individuals \ - at the bar. ~Get your own,~ the Thief says and \ - takes the glass from you before you can bring it \ - to your lips."; - Turn, Push, Pull, Shake: - "You receive cold stares from the three individuals \ - at the bar. ~Get your own,~ the Wizard says and \ - prevents you."; - ThrownAt: - deadflag = 1; - CDefArt(noun); " hits the glass and nearly topples it! \ - A voice from the back of the room says ~Garn! He \ - nearly ruined a perfectly good glass of ale, he did.~ \ - The three individuals at the bar turn to you with \ - angry stares, but before you can respond, some \ - barbarians pummel you to death for poor bar manners."; - Cast: - if (the_spell_was == zemdor_spell) { - give Delbins general; - remove self; - Achieved(8); - ! set up three NPCs - ! -- Morgan, fairly easy - move Morgan to Ravine_pass; - ! -- Frobar, a little tougher - move Frobar to FROBAR_Study; - if (Ench_mag in Frobar_mailbox) - move Ench_mag to Frobar; - StartDaemon(Frobar); - ! -- Thief, trickiest - remove Thief; ! he'll be back - if ((Painting_REAL in Museum_north) && - (glass_wall notin Museum_north)) - move Painting_REAL to THIEF_Storeroom; - ! Thief steals painting (no door left behind!) - "You quickly make the zemdor chant and watch the glass \ -of ale start to shimmer! In short time, there are three glasses filled \ -with ale on the bar!^^\ -Morgan the Ranger looks suspiciously at Frobar the Enchanter. \ -~Is this your doing, wizard?~ Frobar shakes his head. ~Surely not, \ -you know I can't do magic anymore.~ He glances briefly in your \ -direction. ~No matter,~ the thief says, and raises a glass. \ -~To the spirit of adventure!~ The three down their glasses quickly. \ -Morgan smiles. ~Now, that's good ale.~ She adjusts her broadsword. \ -~I'm off to the Egreth front. Want to help end a war, Frobar?~ \ -Frobar chuckles. ~Thank you, no. I've got, err, something to do \ -at home,~ he says and quickly leaves. ~Well, then, what about you, \ -thief?~ Morgan asks, and notices that the thief has already slipped \ -away. She shrugs and leaves the bar as well. ~Good hunting!~ Delbin \ -calls after her."; - } - if (the_spell_was == huncho_spell or luncho_spell) -"You begin the chant, but something about it gets the \ -Enchanter's attention. ~If you have something to say, \ -why don't you share it?~ With a subtle gesture, the Enchanter \ -dispels the chant."; - ], -; - -Object rag "dirty rag" bar - with name "rag" "dirty", - description "A slightly dirty cleaning rag.", - !weight 5, -; - - -! (Flathead stadium) - -Object Stadium_entrance "Entrance to Flathead Stadium" - with description "Here stands the entrance into the still \ - popular Flathead Stadium, home to esoteric \ - sports activities you never fully understood. \ - Walkways lie southeast and southwest from here, or \ - you can enter the stadium to the north.", - name "stadium" "walkways" "entrance", - sw_to ANTHAR_West, - se_to ANTHAR_East, - n_to Stadium_top, - in_to Stadium_top, - before [; - Listen: - "You can hear the roars of a good crowd from \ - inside the stadium. Must be playoff season."; - Go: - if ((noun==n_obj) || (noun==in_obj)) - print "You walk right into the stadium. The ticket-takers \ - must be on strike or something.^"; - ], - has light; - -! (fake stadium entrance, for "past") - -Object Stadium_entrance2 "Entrance to Flathead Stadium" - with description "You appear to be in front of Flathead Stadium once \ -again, however something seems different. Even the stadium itself seems \ -dissimilar, newer. Walkways lie southeast and southwest from here, or \ -you can enter the stadium to the north.", - name "stadium" "walkways" "entrance", - sw_to "A strange feeling compels you to stay.", - se_to "A strange feeling compels you to stay.", - n_to [; - deadflag = 1; - "As you head towards the entrance, a mob of crazed fans \ -rushes out of the stadium (~Isn't that Babe Flathead?~ you hear someone \ -scream) and tramples you to death."; - ], - before [; - Listen: - "The place is surprisingly quiet."; - ], - has light; - - -Object stadium_sign "stadium sign" Stadium_entrance - with name "sign", - initial "A stadium event sign is pasted to one of the stadium walls here.", - description - "~Today's event:^\ - GOLEM FIGHTS!!!^^\ - ALL CHALLENGERS WELCOME!!!^\ - THREE ROUNDS, THREE BOUTS!^\ - BIG CASH FOR THE WINNER!^^\ - (All Golems have undefeated records, so^\ - only trained golem-wrestlers need apply!)~", - has static; - -Object stadium_statue "stadium statue" Stadium_entrance - with name "statue", - initial "A statue depicting the legendary Babe \ -Flathead greets all visitors in front of the stadium.", - description - "According to the inscription, this statue honors the legendary Babe Flathead.", - before [; - LookUnder: - if (self has general) - "Oddly, the statue seems to sit slightly tilted."; - Push: - if (self has general) { - remove self; - move statue_base to Stadium_entrance; - Achieved(9); - "You give the statue a shove, and it wobbles and falls, \ -breaking into useless dust! A passing sportsfan notices your act \ -of vandalism, and says to a friend, ~Look at that. The guy wins one \ -bout of Golem wrestling, and he thinks he's better than Babe \ -Flathead.~"; - } - else "The statue seems to be firmly fixed in place."; - ], - has static; - -Object statue_base "square hole" Stadium_entrance2 - with name "hole" "square", - describe "In front of the stadium is a square hole.", - description "There's a large square hole in the ground near \ -the front of the stadium.", - time_left 0, - time_out [; -! move stadium_sign to Stadium_entrance; -! move stadium_statue to Stadium_entrance; - print "^You hear voices behind you, and suddenly, a \ -small crowd of people pass by, pushing a statue.^^\ -~Right there,~ someone shouts, and a few people position the \ -statue into the square hole."; - if (children(self) == 0) { - print " It fits neatly in place."; - remove red_rod_piece; - } - else { - give stadium_statue general; - print " It fits, but seems just slightly \ -tilted."; - } -! remove statue_base; -! give Stadium_entrance ~general; - Mystical_Cave.number = Mystical_Cave.number + 1; - print "^^~That's perfect,~ you hear a voice say, and \ -the crowd murmurs in agreement. Why, it's Babe Flathead himself! \ -He saunters up towards the statue, which is indeed a good \ -likeness, and starts handing out cigars. ~We'll get to \ -autographs later,~ he says while lighting your cigar as you \ -try to protest. Seconds later, the cigar explodes! You see \ -sparkling stars, which seem to change to purple flashes. You \ -blink.^"; - PlayerTo(Mystical_Cave); - ], - capacity 1, - size 15, -has static container open; - -Object Stadium_top "In Flathead Stadium, upper seats" - with description "\ -You are near the top cheap seats of Flathead Stadium. \ -The crowd is busy cheering whatever is going on down on the \ -field. Looking at the field, you see two small dots. The Stadium exit \ -is back south, or you can walk down to the front seats to \ -the north.", - name "seats" "crowd" "field" "dots" "fans", - s_to Stadium_entrance, - n_to Stadium_bottom, - d_to Stadium_bottom, - e_to "You try to push your way through the fans, but fail.", - w_to "You climb over a few seats, but the crowd blocks any \ - further progress west.", - before [; - Listen: "The crowd is deafening."; - ], -has light; - - -Object Stadium_bottom "In Flathead Stadium, lower seats" - with description "\ -You are near the good seats in Flathead Stadium. \ -The crowd is busy cheering for the current event on the \ -field. Looking at the field, you see two large dots. The \ -seats continue up and south, or you can walk down to the \ -field below.", - name "seats" "crowd" "field" "dots" "fans", - s_to Stadium_top, - u_to Stadium_top, - d_to [; - if (burly_man hasnt general) -"The burly man jumps out of his seat as you try to pass. \ -~Hey buddy, I'm saving those seats.~ He points to an entire \ -row of seats below you. ~I've been waiting all season, and \ -I don't want an obstructed view, so look for somewhere else to \ -sit.~ He sits back in his seat."; - else return Near_locker_room; - ], - n_to [; - if (burly_man hasnt general) -"The burly man jumps out of his seat as you try to pass. \ -~Hey buddy, I'm saving those seats.~ He points to an entire \ -row of seats below you. ~I've been waiting all season, and \ -I don't want an obstructed view, so look for somewhere else to \ -sit.~ He sits back in his seat."; - else return Near_locker_room; - ], - w_to "You try to push past a couple fans, but the angry looks make you stop.", - e_to "You try to push past a couple fans, but the rude looks make you stop.", - before [; - Listen: "The crowd is deafening."; - ], -has light; - -Object Near_locker_room "Near Locker Room" - with description "\ -You are near a locker room under Flathead field. \ -You can enter the locker room to the north, or start the climb back into \ -the roaring crowd to the south.", - name "crowd" "field" "fans", - s_to Stadium_bottom, - u_to Stadium_bottom, - n_to Locker_room, - each_turn [; - if (self hasnt general) { - give self general; - move pale_scroll to Near_locker_room; - "^A couple front row fans are getting a bit boisterous. \ -Several of them throw garbage and paper debris towards the field. \ -You notice something flutter down by your feet."; - } - ], - before [; - Listen: "The crowd is deafening."; - ], - has light; - -Object Locker_room "Locker Room" - with description "\ -You are inside a locker room under Flathead field. You can hear the \ -crowds outside. The room is empty. There is an exit \ -to the south, and the entrance to the field is to the north.", - name "field" "locker" "lockers", - n_to Flathead_field, - s_to Near_locker_room, - before [; - Listen: "You can hear the crowd outside."; - ], - has light; - -Object Flathead_field "Flathead Field" - with description "You're on Flathead field, in front of millions of zany \ -fans, a lifetime dream. Or not. Well, anyway, \ -there's a locker room to the south.", - name "field" "fans", - s_to [; - if (self has general) -"You head for the showers, but the coach springs out and blocks \ -your way. ~Come on kid, keep your head in the game.~"; - else return Locker_room; - ], - each_turn [ i; - if (self has general) { - i = random(20); - if (i == 1) - "^Someone in the crowd yells out, ~Get him a body bag!~ \ - We assume he was referring to the golem, not you."; - if (i == 5) - "^The crowd does 'the wave'."; - if (i == 7) - "^The crowd waves some strange colorful objects. \ -Rather distracting."; - if (i == 10) - "^Someone in the crowd screams ~Flathead that golem!~"; - } - ], - before [; - Listen: "The crowd is deafening."; - ], - has light; - - - - -! **************** -! People/creatures -! **************** - -Object Christmas_tree_monster "Christmas tree monster" Con_Decor_garden - with name "tree" "monster" "Christmas", - initial "A Christmas Tree stands in one plot, swaying back and forth.", - description "\ -The Christmas Tree monster has obviously seen some good years. It towers \ -above you, wrapped with tinsel that sparkles marvelously. The \ -plastic flamingo ornaments are a rather gaudy touch. Surprisingly, it seems to \ -have taken root in the soil.", - each_turn [ i ; - i = random(10); - if (i==1) -"^The Christmas Tree Monster belts out a few bars of 'I'm dreaming \ -of a Black Cavern' arranged by Bing Frozby."; - if (i==2) -"^The Christmas Tree Monster sings a few measures from Berknip's own \ -rendition of 'Silent Night', a rather morbid version."; - if (i==3) -"^The Christmas Tree Monster hums a few notes from 'Dornbeasts \ -Roasting on an Open Pyre'."; - if (i==4) -"^The Christmas Tree Monster whistles a part of 'Frosty the Snow Wight'."; - if (i==6) -"^The Christmas Tree Monster sways in time to 'Let it snow, let it snow, \ -let it snow'."; - if (i==8) -"^The Christmas Tree Monster treats you to an abridged version of \ -Handel's 'Messiah'."; - "^The Christmas Tree Monster hums to itself."; - ], - before [; - Cut: - if (hedge_clipper notin player) - "You'll need a gardening implement to do that."; - if (self has general) - "The gardener said he'd make you dig for slugs, and \ - that doesn't sound too exciting, so let's leave the tree \ - alone."; - if (self hasnt general) { -print "You being to clip a few of the lower branches of the Christmas Tree \ -Monster, who bellows in pain!^^\ -Out of nowhere, a short old man appears, wearing full gardener \ -regalia. He drags your hand away from the tree.^^\ -~What are ya trying to do there, kill the thing?~ he says. "; - if ((glasses hasnt moved) || (glasses in Con_Fountain)) { - remove glasses; - remove hedge_clipper; -"He pulls \ -out a pair of glasses and puts it on. ~Say, I don't know you,~ \ -he says. ~If you want to practice introductory horticulture, do \ -it in someone else's garden!~ He grabs the clippers from your hands \ -and stalks off."; - } - else { -print "He seems \ -to be squinting at you. ~Who are you sonny?~ he asks. He starts -searching his pockets. ~Confound it, lost my glasses again.~ "; - if (gardeners_cap hasnt worn) { - remove hedge_clipper; -"He squints again, and says, ~Well, whoever you are, the gardens are \ -for looking at, not practicing landscape design!~ He grabs the \ -clippers out of your hands and stalks off."; - } - if (gardeners_cap has worn) { - give self general; - Achieved(10); -"He looks at you again, and notices your cap. ~You must be one of the \ -new boys. Here, look, I'm not going to show you twice.~ He takes \ -the clippers and delicately clips away several lower branches, all \ -the while singing ~It's beginning to look a lot like Christmas~. \ -He finishes trimming the tree, leaving a nice opening exposing the \ -shrub next to it, and stops singing. ~I'm starting to hate \ -that tune,~ he says under his breath. He hands the clippers back \ -to you and says, ~Now if I catch you doing this wrong again, I'm \ -going to make you dig for slugs, understand?~ He disappears as \ -quickly as he appeared."; - } - } - } - Cast: - "You start chanting, but the tree starts singing \ - ~Plover the river and frotz the woods~ and you \ - can't help joining in, ruining your chant."; - ], - react_before [; - Sing: - "You song is drowned out by a boisterous chorus \ - by the tree."; - ], - life [; - Show: - if (noun==toy_volcano) - "The tree abruptly stops singing, and seems \ -a trifle flustered for some reason. Moments later, it \ -resumes its chorus."; - default: "The tree just keeps on singing."; - ], - has animate; - -! (ok, the bush isn't defined as alive. But it is...) -Object dornberry_bush "Dornberry bush" Con_Decor_garden - with name "shrub" "bush", - initial [; - print "A small shrub sits near and under the Christmas Tree"; - if (Christmas_tree_monster hasnt general) - ", almost covered by it."; - else - "."; - ], - description [; - if (self hasnt general) -"The small shrub looks rather poorly tended. Just a few green leaves \ -distinguish it from the surrounding soil."; - else -"The small shrub looks quite healthy. A cluster of green leaves and \ -branches make a nice plant. It's still smaller than the tree, though."; - ], - capacity 1, - before [; - Cast: - if (the_spell_was == throck_spell) { - if (Christmas_tree_monster hasnt general) -"The shrub seems to shake suddenly! A new leaf grows, searchs for the \ -sunlight, fails, and withers."; - if ((Christmas_tree_monster has general) && - (self hasnt general)) { - give self general; - move dornberries to self; -"The shrub seems to shake suddenly! A new leaf grows, searchs for the \ -sunlight, and finds it! Another leaf follows, and soon the shrub is \ -sprouting new branches. In the sunlight, flowers appear, and a cycle \ -of missed-out seasons is made-up for in minutes! The shrub is now \ -quite a thriving plant, covered with tiny red fruit."; - } - if (self has general) - "The shrub shakes a bit, but the plant remains the \ - same. For a Dornberry bush, it's already probably \ - the healthiest one you've ever seen."; - } - Receive: - if (noun ~= dornberries) - "I don't think the shrub can support that."; - ], - has static supporter; - -Object dornberries "bunch of dornberries" - with name "dornberries" "berries", - description "A bunch of tasty-looking red berries.", - !weight 5, - size 5, - has edible scored; - -! (moved here so that it shows up 'last' in room descr) -Object plaque "plaque" Con_Decor_garden - with name "plaque", - initial "A small plaque sticks out of the soil near the two plants.", - description [; - print "The plaque reads:^^"; - font off; -print "~CHRISTMAS TREE MONSTER DORNBERRY BUSH^"; -print " ~^"; - font on; - ], -! ~CHRISTMAS TREE MONSTER DORNBERRY BUSH^\ -! ~", - has static; - - -! (Characters in Flathead Stadium) - - -Object burly_man "burly man" Stadium_bottom - with name "man" "burly", - description "A big man who's apparently into sports.", - before [; - Cast: - if ((the_spell_was == foblub_spell) && (self hasnt general)) { - give self general; - Achieved(11); -"You begin your sermon. The man starts to tell you to knock \ -it off, but starts to listen with awe. As you finish, the man \ -tries to get up to shake your hand, but realizes he is stuck \ -fast. ~They gotta start cleaning these seats,~ he says."; - } - if (the_spell_was == espnis_spell) - "You begin a description of the 1700 different kinds of \ - holy water, but the man seems so enthralled with the \ - game below, he just isn't paying attention."; - ], - life [; - Show: - if (noun==trophy) - "~You were amazing pal. Ever think of going pro?~"; - Ask: - if (second=='fight' or 'game' or 'fights') - "~It's the three-golem special. One contestant \ - versus three golems, one after the other. Great \ - stuff.~"; - default: - "~Give it a rest pal, I'm watching the game.~"; - ], - has animate; - -Object coach "tough-looking coach" Locker_room - with name "coach", - description [; -print "An old fellow with bushy eyebrows and \ -a gruff demeanor. He's dressed like a sports coach"; -if (trophy in self) -". You also notice he's holding some sort of trophy."; -else "."; - ], - number 1, - each_turn [; - if (self hasnt general) { - if (Flathead_field hasnt general) { - give Flathead_field general; -print "^The coach looks up and notices you. ~Oh, you must be the \ -replacement,~ he says. He drags you over to the field entrance. \ -~Well, I hoped you're warmed up, cuz you're up.~ He shoves you \ -north. ~Remember, these guys are tough, so give 'em your \ -best stuff.~^"; - PlayerTo(Flathead_field); - } - else { - print "^The coach looks up and notices you. \ -~Where have you been? The ref was about to default \ -it to the golems!~ He shoves you north. ~Now get in there and \ -make me proud.~^"; - PlayerTo(Flathead_field); - } - } - if ((self has general) && (coach.number == 1)) { - move win_bag to player; - coach.number = 2; - "^The coach gives you a slap on the back that \ -knocks the wind out of you. ~You did it! I didn't think \ -you had it in you!~ He hands you a small bag. ~Here's the \ -winnings. I went ahead and took out my cut, of course.~^"; - } - ], - life [; - ! essentially, the only chances to do 'life' things - ! will occur when the coach is lingering around - ! the lockerroom after the match. - Attack: - "~You want a couple rounds with the old man \ -too? Well, I'm ready.~ For an old coach, he still looks \ -like he's in pretty good shape. You decide against violent \ -action."; - Answer: - "The coach merely nods."; - Ask: - if (second == 'trophy') - "~It's a beauty all right.~"; - if (second == 'winnings' or 'cut') - "~It's all there, count it if you want.~"; - if (second == 'life' or 'game' or 'sport') - "The coach looks momentarily reflective. \ -~Life is all about getting into the game,~ he says. \ -~Remember that, it's not about winning or losing, but \ -giving it your best shot.~"; - Show: - if (noun == cereal1 || - noun == cereal2 || - noun == cereal3 || - noun == cerealbox1 || - noun == cerealbox2 || - noun == cerealbox3) - "~A bowlful of that each morning is bound to make a \ -champion out of you.~"; - Order: -! *** note2: this seems to contradict documentation, -! i.e. 'ask coach for trophy' results in noun==trophy and -! second==(?)coach or player, not the other way -! around. - if ((action==##Give) && (noun==trophy) && - (trophy in self)) { - move trophy to player; - remove self; -"The coach looks lovingly at the trophy, and then at you. \ -~Fair enough kid, you earned it.~ he says, and gives it \ -to you. ~I've seen a lot of golem-wrestlers in my time, \ -but I gotta say, you're the best golem-wrestler I've ever \ -seen.~ He leaves the locker room to greet his fans."; - } - default: "At the moment, it looks like the coach is too busy \ - writing a Hall of Fame acceptance speech to \ - pay you much attention."; - ], - react_before [; - Cast: - "~What's that you're saying? Speak up, I'm your \ -coach, I'm hear to listen.~"; - ], - has animate transparent; - -Object referee "referee" Flathead_field - with name "referee" "ref", - description "A stout looking man in a funny striped shirt.", - each_turn [; - if (self hasnt general) { - give self general; -"^The ref blows his whistle and says ~Round 1~. The golem, not \ -needing any encouragement, jumps into the fray."; - } - ], - life [; - Attack: - "Your opponent is the golem, not the referee."; - Ask: - if (second == 'time' or 'timeout') - "~Sorry, no timeouts!~ the ref says."; - if (second == 'foul') - "~It looked good to me.~"; - if (second == 'round') { - if (wood_golem in Flathead_field) - "~You're in round 1.~"; - if (stone_golem in Flathead_field) - "~You're in round 2.~"; - if (iron_golem in Flathead_field) - "~You're in round 3, the final round.~"; - } - default: "The ref makes some completely \ -bewildering hand signal, that could be an insult, for \ -all you know about wrestling. In any event, nothing happens."; - ], - before [; - Cast: -if (the_spell_was == espnis_spell) { - deadflag = 1; - "You start to relate the advantages of Bingo over Double \ -Fanucci to the ref, and sooner that you can say ~Zounds~, the \ -ref is fast asleep! Unfortunately, the golem takes advantage of \ -this opportunity and breathes poison gas at you! You reflect \ -on this display of poor sportsmanship as you slowly lose \ -consciousness."; -} - ], - has animate; - -! -- the golems... -! In general: To be fair, the golems only have a 1 in 30 chance -! of actually hitting. When they do hit, however, it's pretty -! painful. They also tend to have high HP, although I guess -! theoretically, they could be beaten without spells. -! (note: I've tried this with the iron golem and never -! succeeded. The odds are definitely not in the players favor) -Object wood_golem "dangerous-looking wood golem" Flathead_field - with name "golem" "wood", - number 20, - description "\ -The wood golem stands at about twice your height, an animated statue \ -made completely of wood. He may move like an old cabinet, but \ -watch those hands!", - each_turn [ i ; - i = random(13); - if (i == 13) - Player_HP_CUR = Player_HP_CUR - 15; - if (Player_HP_CUR <= 0) { - deadflag = 1; - "^The wood golem jumps forward and flattens you, \ - which feels similar to getting hit by a falling \ - redwood tree."; - } - if (i == 13) - "^The golem staggers you with a punch that sends you \ - reeling!"; - if (i == 20) -"^The wood golem tries to move in for a clinch, and you dance \ -away."; - if (i == 10) -"^The wood golem makes a lumbering swing at your head, and misses!"; -"^The wood golem makes a swipe for you, and misses."; - ], - before [; - Cast: - if (the_spell_was == egdelp_spell) { - remove self; - move stone_golem to Flathead_field; -"The wood golem is suddenly covered with a waxy buildup! \ -Greatly embarrassed, he turns to call foul, and slips! \ -With a great thud, the golem hits the turf, and knocks \ -himself out cold!^^\ -The ref says ~Knockout!~. The crowd cheers in approval.^^\ -Several dwarves appear and cart the wood golem off. \ -Unfortunately, a stone golem soon walks into view!^^\ -The coach yells from the doorway ~You're doing great kid, \ -just hang in there.~^^\ -The ref says ~Round 2!~"; - } - ], - life [ i ; - Attack: - i = random(20); - if (i > 10) { - wood_golem.number = wood_golem.number - 1; - if (wood_golem.number <= 0) { - remove self; - move stone_golem to Flathead_field; -"With a thundering blow, you smash the golem into \ -kindling!^^\ -The ref says ~Knockout!~. The crowd cheers in approval.^^\ -Several dwarves appear and cart the wood golem off. \ -Unfortunately, a stone golem soon walks into view!^^\ -The coach yells from the doorway ~You're doing great kid, \ -just hang in there.~^^\ -The ref says ~Round 2!~"; - } - else { - print "Good shot! You whack the golem, and splinters fly"; - if (wood_golem.number > 10) - ". It didn't seem to slow him down, though."; - else "."; - } - } - "You swing, but miss."; - ], - has animate; - -Object stone_golem "fierce-looking stone golem" - with name "golem" "stone", - number 40, - description "\ -The stone golem is quite a towering piece of work. He looks like a crude \ -statue made of animated granite. He probably has all the \ -finesse of a giant boulder, so don't let him pin ya!", - each_turn [ i ; - i = random(13); - if (i == 13) - Player_HP_CUR = Player_HP_CUR - 20; - if (Player_HP_CUR <= 0) { - deadflag = 1; - "^The stone golem jumps forward and flattens you, \ - which feels similar to getting crushed by a giant \ - boulder."; - } - if (i == 13) - "^The golem hits you with a punch that sends you \ - reeling!"; - if (i == 20) - "^The golem jabs with his left, and misses!"; - "^The golem tries to close, and misses."; - ], - before [; - Cast: - if (the_spell_was == tossio_spell) { - remove self; - move iron_golem to Flathead_field; -"The golem is suddenly replaced with a pile of steaming \ -linguini alfredo!^^\ -The ref yells ~Takeout!~ The crowd goes wild! \ -Several dwarves appear and serve the pasta to the crowd \ -on platters. Unfortunately, an iron golem soon \ -walks into view! ^^\ -The coach yells out from the safety of the locker room ~Okay kid, drop \ -this golem, and we can celebrate.~^^\ -The ref yells ~Round 3!~"; - } - ], - life [ i ; - Attack: - i = random(20); - if (i > 10) { - stone_golem.number = stone_golem.number - 1; - if (stone_golem.number <= 0) { - remove self; - move iron_golem to Flathead_field; -"With a thundering blow, you smash the golem into \ -gravel!^^\ -The ref says ~Knockout!~. The crowd cheers in approval.^^\ -Several dwarves appear and cart the stone golem off. \ -Unfortunately, an iron golem soon walks into view!^^\ -The coach yells out from the safety of the locker room ~Okay kid, drop \ -this golem, and we can celebrate.~^^\ -The ref yells ~Round 3!~"; - } - else { - print "Solid blow! Stone chips fly."; - if (stone_golem.number > 10) - ". It didn't seem to slow him down, though."; - else "."; - } - } - "You swing, but miss."; - ], - has animate; - -Object iron_golem "deadly-looking iron golem" - with name "golem" "iron", - number 50, - description "\ -The iron golem resembles a huge nightmare made out of iron. \ -Towering at least 30 feet high, this animated iron statue isn't \ -something you'd want to meet in a dark alley, much less \ -in an arena filled with screaming fans.", - each_turn [ i ; - i = random(13); - if (i == 13) - Player_HP_CUR = Player_HP_CUR - 30; - if (Player_HP_CUR <= 0) { - deadflag = 1; - "^The iron golem jumps forward and flattens you, \ - which feels similar to getting mashed by a giant \ - block of iron. Oww."; - } - if (i == 13) - "^The golem staggers you with a punch that sends you \ - reeling! That felt quite painful."; - if (i == 20) - "^The golem tries to flatten you, and you evade just in time!"; - "^The golem tries to step on you, and you dodge."; - ], - before [; - Cast: - if (the_spell_was == bekdab_spell) { - remove self; - remove referee; - give Flathead_field ~general; - give coach general; - move trophy to coach; - Achieved(12); -"The golem suddenly develops many unsightly patches of rust. \ -Mortified, the golem calls for his oil trainer, but to no \ -avail! It soon falls apart into several rusty metal pieces!^^\ -The ref calls out ~The winner!~ and holds your hand aloft. \ -The crowd is on its feet! They'd probably be chanting your \ -name, if they knew it.^^\ -Several dwarves appear and drag off the rusty metal plates. \ -The ref explains that the prize money and a championship \ -trophy will be awarded in the \ -locker room, and exits."; - } - ], - life [ i ; - Attack: - i = random(20); - if (i > 10) { - iron_golem.number = iron_golem.number - 1; - if (iron_golem.number <= 0) { - remove self; - remove referee; - give Flathead_field ~general; - give coach general; - move trophy to coach; - Achieved(12); -"With a thundering blow, you smash the golem into \ -ball-bearings.^^\ -The ref calls out ~The winner!~ and holds your hand aloft. \ -The crowd is on its feet! They'd probably be chanting your \ -name, if they knew it.^^\ -Several dwarves appear and collect the ball-bearings. \ -The ref explains that the trophy will be awarded in the \ -locker room, and exits."; - } - else { - print "Solid blow! You make a small dent."; - if (iron_golem.number > 10) - ". It didn't seem to slow him down, though."; - else "."; - } - } - "You swing, but miss."; - ], - has animate; - -! (Three important NPCs) - -Object Morgan "Morgan the Ranger" Delbins - with name "ranger" "warrior" "Morgan" "captain" "maiden", - number 1, - initial [; - if (self in Delbins) - "There's a warrior-maiden sitting at the bar, her \ -eyes riveted to the glass of ale."; - else - "Morgan the Ranger is here."; - ], - description "She's nearly twice your height, and \ -probably twice your strength too. She's armed and armored in \ -typical military Ranger gear. She gives you the impression of \ -being the type who'd hunt dragons as a hobby -- assuming there were \ -any dragons left to hunt, of course.", - each_turn [; - if ((self in Ravine_pass) && (Morgan.number == 1)) { - Morgan.number = 2; - "^The Ranger sees you approach and recognizes you. \ - ~Well met again, Priest. I have need of your \ - assistance to end the kobold border war that has been going \ - on far too long.~ She pauses. ~To the \ - west and east are two of my lieutenants and their \ - soldiers, cut off from the rest of us by previous kobold \ - raids. I have the power to end this war and call a truce, \ - but to do so, I need \ - to inform both of my lieutenants to \ - stop fighting via \ - windcat message carriers.~ She points to the two windcats \ - in the wicker cage and the pile of colored flags. \ - ~The 'red' flags indicate 'attack', the \ - 'blue', truce. When my lieutenants receive the instructions, \ - they will verify my commands by sending additional messengers \ - with 'attack' or 'truce' instructions to each other. \ - Based on the two \ - received messages, each lieutenant will act accordingly.~ \ - She slaps you on the back, jolting you to attention. \ - ~Herein lies my problem, Priest. I know for a fact, that \ - one of my lieutenants is a traitor, who will \ - disobey my orders. Any instruction I send to the traitor, \ - the opposite will be sent by the traitor to my remaining \ - good lieutenant. The traitor will also take the two orders \ - he receives and do the opposite, if there is a majority, or \ - attack outright, if there are messages of 'truce' and 'attack'. \ - Thankfully, my good lieutenant will faithfully copy my \ - instructions to the other lieutenant, and will follow orders \ - received, if there is a majority, or follow a 'truce' if \ - there are mixed messages. My greatest problem, Priest, is that \ - I do not know which lieutenant is the traitor! If you \ - can bring peace once and for all to Southern Egreth, many \ - will remember your good deeds.~"; - } - ], - life [; - Answer: - if (special_word == 'hello') { - print "~Hello"; - if (Morgan.number == 2) - print " again"; - ", priest.~"; - } - Attack, ThrowAt: - "She's well-armed and probably dangerous."; - Give, Show: - "A gracious gesture, perhaps, but she isn't \ -interested."; - Kiss: - "She nearly splits your skull with the flat of \ -a huge broadsword before you even get close. ~For a man of \ -the cloth, you've got a lot of nerve,~ she says."; - Ask: - if (((second == 'cat') || (second=='cats') || - (second == 'windcat') || (second=='windcats')) && - (Morgan.number == 2)) - "~Right, the windcats. \ - The speckled cat will find the lieutenant to the east. \ - The spotted cat will find the lieutenant to the west."; - if (second == 'frobar' or 'wizard' or 'enchanter') { - print "She laughs. ~You've never heard of \ -Frobar, the dullest Enchanter? The Enchanter who was so dull \ -that his fellow wizards forgot to invite him to the last \ -great meeting? This saved him from becoming an amphibian, so \ -perhaps dullness has its virtues"; - if (self in Delbins) - ".~ The wizard looks rather insulted. \ -~Oh hush up, Morgan.~ the wizard says."; - else ".~"; - } - if (second == 'thief' or 'gentleman') { - print "She smiles. ~I can't say as I know \ -much about "; - if (self in Delbins) - "this fellow over here,~ she says and \ -gives the gentleman a whack on the back that nearly knocks his \ -teeth out. ~But I hear he's something of a thief.~ ~Nothing \ -of the sort!~ the gentleman protests."; - else - "that thief fellow. I've been told \ -he has a hideout somewhere, nearly impossible to find.~"; - } - if (second=='kobold' or 'war') -"~The war wages on, priest, even though the battle was lost \ -long ago, and there were no winners, kobold or man.~"; - if (second=='dragon' or 'dragons') -"Morgan becomes momentarily thoughtful. ~Some of the best \ -dragon-hunting I ever did was up in Frostham long ago. \ -Those white frost dragons are quite a vicious lot. Best not \ -to wake a sleeping white dragon unless you have a weapon handy \ -and know how to use it!~"; - else "~Sorry, I'm not sure about that.~"; - default: "Morgan the Ranger appears to be \ -thinking important thoughts at the moment."; - ], - before [; - Cast: - "~What's that you're mumbling there priest?~"; - ], - has animate female proper; - -Object Frobar "Frobar" Delbins - with name "Frobar" "wizard" "sorcerer" "enchanter", - initial [; - if (self in Delbins) - "There's an old wizard sitting at the bar, his \ -eyes riveted to the glass of ale."; - else "Frobar the Enchanter is here."; - ], - description "A wizardly old figure of a man.", - life [; - Attack, ThrowAt: - "You make a threatening move. The wizard practically yawns! \ -~Just what the world needs, another violent Priest.~ You stop, \ -somewhat embarrassed."; - Answer: - if (special_word=='hello') - "The wizard nods. ~Hello, hello, and all that rubbish.~"; - Ask: - if (self in Delbins) - "The wizard is somewhat occupied at the moment."; - else { - if (second=='magic' or 'mystic') { - print "Frobar scowls. ~Magic? We've seen the last \ -of magic, let me tell you. Does anyone remember what it did \ -for us? Does anyone mention the Enchanters that saved Quendor \ -from certain ruin many a time? Of course not. A bunch of \ -ingrates"; -if (term_paper notin self) -". I just hope they're teaching the kids at Tech what magic \ -was all about, before we got all this 'new science' stuff everyone's \ -blabbering about.~"; -else ".~"; - } - if (second=='golem' or 'golems') -"Frobar sighs. ~Golems used to be useful, you know. But now, \ -without magic to control them, they go off and get into all \ -sorts of mischief.~"; - if (second == 'thief' or 'gentleman') - "~Some fellow I've had some dealings with \ -in the past. Not a bad chap, but he does like to \ -supplement his income, if you know what I mean. Far \ -too risky a profession for my taste.~"; - if (second == 'morgan' or 'ranger' or 'warrior') - "~Morgan Grueslayer, top military Ranger \ -in her graduating class, I hear. If she asks you to join \ -her on one of her campaigns, just walk away. All that \ -fighting -- too stressful if you ask me.~"; - if (second == 'barsap' or 'snaboz') -!"~I don't even want to talk about it.~"; -"~Don't even get me started.~"; - } - Show: - if (self in Delbins) - "The wizard is somewhat occupied at the moment."; - if (noun == Ench_mag) { - move Ench_mag to Frobar; - "Frobar snatches the magazine out of your hands. \ - ~What are you doing with my mail?~ he says, irritated."; - } - if (noun has is_scroll) - "~A magic scroll, eh? Doesn't do me a lot of good \ -these days.~"; - if ((noun has is_rod) || (noun has is_sphere)) { - print "Frobar looks at ", (the) noun; - " for a moment. ~Something \ -more than meets the eye here. Couldn't tell you what, though.~"; - } - if (noun==wood_book) - "~So, you're a carpenter too?~ Frobar says, somewhat \ - sarcasticly."; - if ((noun==term_paper) && (glossy_scroll in self)) - { - FrobarGetsPaper(); - } - "~Hmm. Not very interesting.~"; - - Give: - if ((noun==term_paper) && (glossy_scroll in self)) - { - if (self notin Delbins) - FrobarGetsPaper(); - else "The wizard pushes your offering aside. \ -~I'm somewhat busy at the moment,~ he says, his eyes glued to \ -the glass of ale."; - } - if (noun == Ench_mag) { - move Ench_mag to Frobar; - "Frobar grabs the magazine. \ - ~What are you doing with my mail?~ he says, irritated."; - } - "~No, thank you.~"; - - default: "~I'm rather busy at the moment.~"; - ], - each_turn [ i ; - ! Handle Frobar's actions here...ALWAYS CHECK PARENT AND LOCATION - - if ((self in location) && (player in FROBAR_Bed)) { - print "Frobar seems annoyed. ~Get out of my bed!~ he says, \ - and drags you to your feet. "; - <>; - } - - ! Misc housekeeping actions... - if (random(3) < 3) { - if ((frobar_plant in parent(self)) && (self in location)) - print "^Frobar tends to the plant.^"; - if (FROBAR_Bed in parent(self) && self in location) - print "^Frobar arranges some quilts on the bed.^"; - if (FROBAR_shelves in parent(self) && self in location) - print "^Frobar pulls a book off the shelves, glances through it, and puts it back.^"; - if (parent(self) == FROBAR_Lounge && self in location) - print "^Frobar dusts the furniture a bit.^"; - } - - ! Random self mutterings... - i = random(5); - if (self in location && self notin Delbins) { - switch(i) { - 1 : "^Frobar mutters to himself, ~They didn't even invite \ - me to the Last Enchanter's Guild Meeting.~"; - 2 : "^Frobar mutters to himself, ~Good old dependable Frobar. Bah!~"; - 3 : if (Ench_mag in self) - "^Frobar leafs through a magazine he holds. ~What happened to \ - Barsap? Hah! Did they ask me? No, of course not.~"; - else - "^Frobar checks his pockets. ~What did I do with this \ - month's 'Enchanter Monthly'?~ he muses outloud."; - default: rtrue; - } - } - ], - daemon [ i j k Mdest Mdir; - ! This daemon will only deal with NPC movement... - ! (no doors either) - if (random(3) ~= 1) rfalse; ! doesn't always immed. move - - ! Count the available exits quickly - objectloop(i in Compass) - if (ZRegion(parent(self).(i.door_dir)) == 1) - k ++; - if (k == 0) rtrue; ! no exits... - - ! Pick a place to move to. - ! In Frobar's case, most of the time he only has one exit. - ! Also, we can block the sw exit of home here. - if (parent(self) == FROBAR_Foyer) { - Mdir = n_obj; - Mdest = FROBAR_Parlor; - MovePrintNPC(Frobar,Mdest,Mdir); - rtrue; - } - - ! Pick an exit at random and attempt to travel that way - j = random(k); k = 0; - objectloop(i in Compass) { - if (ZRegion(parent(self).(i.door_dir)) == 1) { - k ++; - if (k == j) { - Mdir = i; - Mdest = parent(self).(i.door_dir); - MovePrintNPC(Frobar,Mdest,Mdir); - rtrue; - } - } - } - ], - has animate proper; - -[ FrobarGetsPaper ; - Achieved(24); - move term_paper to self; - move glossy_scroll to player; - "Frobar glances over the term paper and his eyes widen. \ -~Wilbur -- why, that's my great nephew!~ He takes the paper and \ -reads. ~So true, so true,~ he mumbles and smiles. ~A fine boy, \ -perhaps he'll become a great man someday, if he stops skipping class. \ -He reminds me of my days at Tech -- all filled with dreams and hopes.~ \ -He pauses, and searches his pockets. ~I even perfected a spell, did \ -you know? Good old loyal, boring Frobar perfected a spell, and, \ -if it hadn't been for that Snaboz show-off who had to go and perfect the \ -izyuk spell, I might have even tried to publish mine.~ He finds a \ -scroll amongst his robes and hands it to you. ~You don't believe me? Here, \ -see for yourself.~"; -]; - -Object Thief "thief" Delbins - with name "thief" "character" "gentleman", - number 1, - initial [; - if (self in Delbins) - "There's a gentleman dressed in black sitting at the \ -bar, his eyes riveted to the glass of ale."; - ], - description "A lean crafty-looking individual, dressed mostly \ -in black. He seems a bit too scruffy to be a nobleman, but also \ -a bit too distinguished to be a common thug. Probably a thief, I'd \ -guess.", - life [; - Attack, ThrowAt: - "You make a threatening move, but the thief seems to \ -move twice as fast! You find yourself looking at the sharp end \ -of a stiletto. ~I'm too much of a gentleman to harm a Priest,~ \ -the thief says, ~so don't force me to make an exception.~"; - Answer: - if (special_word == 'hello') - "The gentleman gives a sharp nod in your direction."; - Ask: - if (second == 'magistrate') -"The thief gives you a knowing nod. ~The Aragain magistrate? \ -A honorless cur, if I ever saw one.~"; - if (second == 'painting') -"The thief shrugs. ~I hear there's a nice new painting on \ -exhibit at the royal museum. You might want to check it out.~"; - if (second == 'lock' or 'locks') -"The thief shrugs. ~Do I look like a locksmith?~"; - - Give: - if (noun has is_coin || noun==trophy) { - move noun to Thief; - "Confused, the thief pockets your offering. \ -~Quite generous of you, sir.~ he says."; - } - - default: "The gentleman glances at you with \ -dark suspicious eyes."; - ], - before [; - Cast: - "You speak the chant perfectly, but nothing \ -seems to happen! The gentleman smiles and pats his dark cloak, \ -which seems to glow briefly with mystic energy, then fade!"; - ], - has animate; - -Object thief_cloak "dark cloak" Thief - with name "dark" "cloak", - description "A coal-black cloak, which blends into \ -the surrounding shadows.", -before [; - Cast: - "You speak the chant perfectly, but nothing \ -seems to happen! The gentleman smiles and pats his dark cloak, \ -which seems to glow briefly with mystic energy, then fade!"; - ], -has clothing; - -Object Delbin "Delbin" Delbins - with name "Delbin" "bartender" "owner", - number 1, - initial "Delbin himself is standing behind the bar.", - description "Delbin is a stout bald fellow with laughing eyes and \ -a heavy beard. He somehow seems both young and old at the same \ -time.", - each_turn [ ; - if (random(20) == 1) - "^Delbin cleans some glasses behind the bar."; - ], - react_after [; - Take: - if (noun == headdress) - "~You're welcome to that unsightly thing, sir. \ -Been trying to get rid of it for sometime.~"; - if (noun == rag) - "Delbin give you a curious look, \ -but says nothing."; - ], - life - [ i ; - Attack, Kiss, ThrowAt: "Leave good old Delbin alone."; - Answer: - if (special_word == 'hello') - "~Welcome to Delbin's, good sir.~"; - Give: - if (noun has is_coin) { - print "Delbin refuses your offering. \ -~Keep your change, sir. If you're looking for a good tip, \ -I can tell you what I hear.~^^"; - <>; - } - if (noun == rag) { -move rag to bar; -"Delbin takes the rag and cleans a spot on the bar, leaving \ -it in a familiar place."; - } - "Delbin politely refuses."; - Show: - if (noun == headdress) -"~There's a good story behind that ugly thing. Maybe if you \ -keep reminding me, I'll remember it.~"; - print "~A nice ", (name) noun; - " you've got yourself there.~"; - Ask: - if (second == 'ale' or 'situation') { - if (Morgan in Delbins) - "~Quite a situation we've got sir. Those three at \ -the front of the bar all ordered a glass of Special Borphee Ale. Well, \ -with the shutdown of the Brewers Guild in Borphee since the Great \ -Change, I can't keep that particular beverage in stock, but I've got \ -that one left there. Seems none of them's leaving until they decide \ -who gets the ale -- and let me tell you, those three are folks who \ -don't like to be disappointed!~"; - "Delbin smiles. ~All out of ale sir. But I suppose \ -ye already knew that?~"; - } - if (second == 'rod') - "Delbin shrugs. ~Sounds vaguely familiar sir, \ -maybe I heard a rumor about it once. Can't really say, though.~"; - if (second == 'headdress') -"~There's a good story behind that ugly thing. Maybe if you \ -keep reminding me, I'll remember it.~"; - if (second == 'rag') -"~Not much more than a rag, sir.~"; - if (second == 'minirva') - "~I think that's the name of some old \ -Antharian Sea Goddess. Like a patron saint to sailors, in \ -the old days.~"; - if (second == 'morgan' or 'warrior' or 'ranger') - "~Morgan Grueslayer's a skilled ranger.~"; - if (second == 'frobar' or 'wizard' or 'enchanter') - "~Frobar's probably one of the last \ -enchanters around. He's a regular here.~"; - if (second == 'thief' or 'gentleman') - "~Don't really know that fellow's name. \ -He tips well, though.~"; - if (second == 'rumor' or 'rumors' or 'story') { - i = random(7); - print "Delbin scratches his ear and says, \ -~Yes, now, what did I hear...~^^"; - if (i==1) - "~People tell me this new Flathead king is \ -a fake, plain and simple. Hasn't stopped people from trying to \ -get on his good side, though. Now, I haven't seen the fellow \ -myself, but if you ask me, somebody somewhere is up to no good.~"; - if (i==2) - "~They say the kobold war up north is gonna \ -end real soon. I'll believe that when it happens.~"; - if (i==3) { - print "~Oh, this one's a good one."; - if (headdress in Delbins) - print " You see that headdress over there? \ -Well, this explorer fellow left it here, along with quite a story. \ -He"; -else print " Some explorer fellow"; -" claimed he found some lost ancient city in the Miznia \ -jungles. Said he made a map to the place, but lost it when bargaining \ -for his life with some jungle natives. I just nodded and let \ -the poor man talk.~"; - } - if (i==4) - "~This crazy-looking old fellow stops in \ -the other day. Said that he was a professor, at GUE Tech, but \ -that he was giving that all up! Something about his \ -research going bad, on something he called 'an ethereal gate'. \ -What all of that means, I can't say.~"; - if (i==5) - "~Say, you sorta remind me of this other Priest \ -fellow who stopped by here a long long time ago. Delbin \ -never forgets, you know? This fellow, who didn't give a name, \ -told me he was on an important \ -quest for something called -- now what was it -- 'The \ -Rod of the Ancients', or something like that. That \ -mean anything to you?~"; - if (i==6) { - print "~An artist friend of mine tells me that \ -this new Leonardo Flathead painting they've recently discovered \ -on display at the Royal Museum has a special secret. They \ -say that Leonardo painted over something else under the canvas, but no one's \ -saying what. They're keeping a watchful eye on it too, just \ -in case curiosity gets the better of some folk. In fact, \ -I hear they've already had a few people trying to steal the \ -thing"; - if (Thief in Delbins) - "!~ The thief suddenly starts to cough, and controls himself."; - else "!~"; - } - ! Add further rumors here... - "Delbin shrugs. ~Guess I'm getting old, \ -nothing comes to mind at the moment. Maybe if you \ -give me a moment, I'll think of something.~"; - } - ], - before [; - Cast: -if (the_spell_was == foblub_spell) - "You relate a fine sermon to Delbin about spirits -- \ -both the liquid kind and the not-so-liquid kind. Were \ -Delbin sitting rather than standing behind the bar, \ -he might even be glued to his seat by now. ~A fine \ -speech there, reverend.~"; -if (the_spell_was == espnis_spell) - "You relate a dull sermon to Delbin about the various \ -types of wood casks used in brewing Mithicus beer. \ -Delbin, being a bartender, is a good listener, and \ -manages to stay awake."; - ], - has animate proper; - -! **************** -! spells/scrolls -! **************** - -Object musty_scroll "musty scroll" telescope - class scroll_class, - with name "musty", -; - -Object fiznav_spell "make boat sea-worthy" musty_scroll - class spell_class, - with name "fiznav", - magic [; - if (second has animate) - "Your chant goes unanswered. It's not intended for \ - living creatures."; - else - "Your chant goes unanswered. It's intended for boats apparently."; - ], -; - -Object pale_scroll "pale scroll" - class scroll_class, - with name "pale", -; - -Object shazok_spell "call lightning from storm" pale_scroll - class spell_class, - with name "shazok", - magic [; - if (second==0 && location==GURTH_Forest) { - <>; - } - "Your chant goes unanswered. You need a genuine \ -natural storm, I suppose."; - ], -; - -Object glossy_scroll "glossy scroll" Frobar - class scroll_class, - with name "glossy" -; - -Object feeyuk_spell "allow creature to resist gravity" glossy_scroll - class spell_class - with name "feeyuk", - magic [; - if ((second == 0) || (second hasnt animate)) - "The chant backfires, and your feet feel numb!"; - if (second == player) { - has_resist_gravity = 1; - StartTimer(self,75); - "You speak the chant in clear tones. Initially, you \ -feel no different. And then, strangely, your back feels better \ -than it has in years, and your step seems lighter!"; - } - CDefArt(second); - " is no doubt thankful for the power to resist gravity."; - ], - time_left 0, - time_out [; - has_resist_gravity = 0; - "You feet feel heavy again."; - ], -; - -! ********** -! Misc objects -! ********** - -Object trophy "trophy" - with name "trophy", - description "A lovely gold and platinum grail-like trophy that looks \ - very antique. The letter ~D~ is inscribed on the side. \ - You notice three odd bumps on the bottom of the circular base.", - !weight 20, - size 8, -! capacity 1, -! before [; -! Receive: -! if (noun hasnt is_sphere) -! "That doesn't seem to fit."; -! ! else fancy light tricks -! ], - has scored; -! container open transparent; - -Object win_bag "bag" - with name "bag", - description "A small cloth bag.", - capacity 50, - !weight 10, - size 15, - has container open; - -Object c20 "coin" win_bag class coin_class; -Object c21 "coin" win_bag class coin_class; -Object c22 "coin" win_bag class coin_class; -Object c23 "coin" win_bag class coin_class; -Object c24 "coin" win_bag class coin_class; -Object c25 "coin" win_bag class coin_class; -Object c26 "coin" win_bag class coin_class; -Object c27 "coin" win_bag class coin_class; -Object c28 "coin" win_bag class coin_class; -Object c29 "coin" win_bag class coin_class; -!Object c30 "coin" win_bag class coin_class; - - diff --git a/src/ARAGAIN.INF b/src/ARAGAIN.INF deleted file mode 100644 index 9c80e1a..0000000 --- a/src/ARAGAIN.INF +++ /dev/null @@ -1,1642 +0,0 @@ - -! ******************************************************************* -! ARAGIN.INF -! -- Add-on for SPIRITWRAK (don't use alone!) -! for Aragain city, royal grounds, possibly Barsap's Gambit -! ******************************************************************* - - -Object ARAGAIN_GUSStop "Aragain North" - with description "You are just north of the newly \ -built Aragain City. The general vicinity \ -is busy with important-looking people. \ -A stairway goes down here, \ -while a large walkway heads south into Aragain.", - name "people" "stairway" "walkway", - d_to ARAGAIN_GUSStation, - s_to ARAGAIN_Entrance, - has light; - -Object ARAGAIN_Entrance "Aragain Entrance" - with description "Before you is a truly astounding sight. \ -A huge metal gate to the south blocks the entrance into the newly \ -built Aragain Royal Grounds. Worse yet, a seemingly \ -endless line of people stands before the gate. \ -They look like dignitaries, diplomats, or \ -just plain politicians. A walkway heads north.", - name "walkway" "pastries", - n_to ARAGAIN_GUSStop, - s_to ARAGAIN_Entrance_gate, - cant_go "The only interesting place seems to be past \ - that gate.", - has light; - -Nearby line1 "line" - with name "line" "people" "dignitaries" "diplomats" "politicians", - description "A god-awful line of well-dressed people. You \ - notice that many of them are holding what appear \ - to be round pastries of some sort.", - life [; -default: "No one in the line seems to be paying you any attention."; - ], - before [; - Cast: - if (the_spell_was == espnis_spell) -"A few people doze off as you canvass the line. They are \ -quickly replaced by others."; - ], - has animate concealed; - -Object gate_sign "large sign" ARAGAIN_Entrance - with initial "There is a large sign bolted to the gate.", - name "sign" "large", - description [; - print "The sign reads:^^\ -~WELCOME TO ARAGAIN!^^\ -As today (and everyday henceforth) has been decreed \ -his royal lordship's birthday, we request that all \ -visitors respect good king Sydney Flathead's wishes \ -and present a cake appropriate for the occasion before \ -entering."; - if (self hasnt general) { - give self general; -"~^^Well, that's odd. If memory and Brother \ -TuffBerry's Quendor History lessons serve, the \ -Flathead family died off more than a hundred years \ -ago."; - } - else "~"; - ], - has static; - - -Object ARAGAIN_Entrance_gate "huge entrance gate" ARAGAIN_Entrance - with name "gate" "entrance", - description "A solid steel gate, probably 40 feet tall, \ -complete with spikes at the top and close-set bars.", - door_dir [; - if (self in ARAGAIN_Entrance) - return s_to; - else return n_to; - ], - door_to [; - if (self in ARAGAIN_Entrance) - return ARAGAIN_Courtyard; - else return ARAGAIN_Entrance; - ], - found_in ARAGAIN_Entrance ARAGAIN_Courtyard, - when_open "The massive gate is open.", - when_closed "The massive gate is closed.", - before [; - Open, Push, Pull: - if (Entrance_guardian hasnt general) - "The guard shoves you away as you approach the gate. \ - He points at the sign. ~No cake, no castle.~"; - Close: - "It must weigh a ton, you can't seem to move it."; - ], - has static door openable locked; - -Object ARAGAIN_Courtyard "Courtyard" - with description "You're standing in a lovely courtyard with \ -magnificent topiary designs and real marble walkways. A large \ -gate stands to the north. To the east is a red stone building \ -with spires and columns. To the west is a large flat stone \ -building. To the south is a huge entranceway into what must \ -be the new Royal Palace, which appears to be carved out of the \ -face of a massive mountain.", - name "marble" "walkway" "red" "spires" "columns" "flat" -"entranceway" "mountain" "Palace", - n_to ARAGAIN_Entrance_gate, - e_to ARAGAIN_Museum, - w_to ARAGAIN_Gambit, - s_to ARAGAIN_Palace, -has light; - -Nearby topiary "topiary" - with name "topiary", - description "Cleverly abused shrubs in the shape of giant \ -crowns.", - has scenery; - -! -- The (rather empty) Royal Museum - -Object ARAGAIN_Museum "Royal Museum" - with description "You're in the entrance to a museum. The \ -lighting is rather dim, throwing light shadows all over the \ -walls. There are exhibit rooms to the north and south, or \ -an exit west.", - name "lighting" "shadows", - w_to ARAGAIN_Courtyard, - n_to Museum_north, - s_to Museum_south, - has light; - -Object Museum_north "North Exhibit Room" - with description "You are in a small exhibit room designed with \ -dark wood floors and plaster-on-stucco walls. The room is dimly lit by \ -hidden lamps or torches behind recessed wall niches. \ -The exit is south.", - name "wood" "plaster" "stucco" "lamps" "torches" "niches", - s_to ARAGAIN_Museum, - each_turn [; - if ((glass_wall in self) && (Thief notin Delbins)) { - if (random(10) == 2 or 7) - "^You get the odd feeling that there's someone behind \ -you, but when you turn around, you see no one!"; - } - ], - before [; - Cast: -if (the_spell_was == huncho_spell or luncho_spell) -"From nearby, a museum curator walks up and abruptly \ -stops your chant. ~Please don't disturb the other patrons,~ \ -he says and walks off. There doesn't seem to be anyone else \ -around, however."; - Blow: - if ((noun == whistle) && (glass_wall in self)) { - remove glass_wall; - print "You produce an extremely high-pitched noise. \ -Suddenly, to the north, a near-invisible wall of glass shatters \ -into a million little shards"; - if (Thief notin Delbins) { - move Painting_REAL to THIEF_Storeroom; - Painting_REAL.initial = nothing; - move magic_door to Museum_north; - "!^^From out of the shadows, a man dressed \ -in black appears! He performs a half-bow in your direction \ -before deftly prying the painting off the wall! ~I'm a great \ -appreciator of the arts, you understand,~ he says, as with a quick \ -twist of his cape, he melds into the shadows and disappears \ -with the painting!^^As you reflect on the thief's actions, \ -you can't help but notice that he apparently dropped something \ -while making his dramatic exit."; - } - else "!"; -! -- guards always come and move player to jail room ? -! -- if thief still in delbins, attempt to get painting is \ -! trapped below, player CANT TAKE IT (as a priest) - } - ], - has light; - -Nearby glass_wall "glass wall" - with name "wall" "glass", - description "Yes, there's a glass wall covering the \ -north wall, all right. It's exceptionally smooth and transparent.", - before [; - Attack: - "Your blows have no effect, it must be quite thick."; - ], - has static concealed; - -Object Painting_REAL "priceless painting" Museum_north - with name "painting", - short_name "priceless painting", - plural "priceless paintings", - initial "There is a priceless painting hanging on the north wall.", - description "It's a beautiful oil painting of a dark stormy \ -scene. On the horizon, you can see the edges of mountaintops. Near \ -the top of the painting, two winged figures are carrying a lone \ -individual towards a break in the clouds, where a bright white light \ -seems to emanate.", - size 25, - before [; - Take, Pull, Push, Turn, Attack, Rub, Cut, Touch, Search: - if (self in Museum_north) { - if (glass_wall in Museum_north) - "As you get close to the painting, you find yourself stopped by a \ -nearly-invisible glass wall!"; - else { - if (action == ##Search) - "You notice a slightly loose part \ -of the canvas in one corner, but the painting is apparently \ -bonded to the wall, which limits your investigation."; - if (action ~= ##Touch) - "You can't seem to move the painting at all. \ -It's somehow bonded to the museum wall!"; - } - } - else { - if ((action == ##Take) && (self in THIEF_Storeroom) && - (Painting_FAKE in THIEF_Storeroom)) - "They both look so genuine! You can't decide!"; - if (action == ##Search) { - if ((self in THIEF_Storeroom) && - (Painting_FAKE in THIEF_Storeroom)) - "Search which one? Goodness, you can't decide!"; - if (self hasnt general) { - give self general; - move white_scroll to player; - "You notice a slightly loose part \ -of the canvas in one corner. You carefully peel back a part of the \ -canvas from the back and reveal a hidden scroll!"; - } - } - } - Drop: - if (location == Museum_north) { - ! player returned painting to museum, give him a reward - move c4 to player; - move self to Museum_north; - "A museum curator appears and graciously takes the \ -painting. ~Thank you for recovering this priceless work.~ He \ -gives you a coin. ~The reward. We've been a little short on funds \ -lately.~ The curator somehow attaches the painting to the north wall, \ -and leaves."; - } - ], -; - -Object c4 "coin" class coin_class; - -Object Painting_plaque "plaque" Museum_north - with name "plaque", - initial [; -print "A metal plaque is attached to the wall"; -if (Painting_REAL in Museum_north) - " next to the painting."; -else "."; - ], - description "~ASCENDENCY~ Leonardo Flathead, 777 GUE", - before [; - Take, Pull, Push, Turn, Attack, Rub, Cut, Touch: - if ((self in Museum_north) && (glass_wall in Museum_north)) - "As you get close to the painting, you find yourself stopped by a \ -nearly-invisible glass wall!"; - ], - has static; - -Object Museum_south "South Exhibit Room" - with description "You are in a square exhibit room with \ -wood flooring and plain plaster walls. In the center of the \ -room is an exhibit platform made from a large slab of marble. \ -The room is lit brightly by hidden torches. The exit is north.", - name "wood" "plaster" "torches", - n_to ARAGAIN_Museum - has light; - -Nearby museum_dais "platform" - with name "platform" "slab" "marble", - description "It's a large flat slab of marble, polished \ -smooth, in the center of the floor.", - capacity 20, - has scenery supporter; - -Object TEMPLE_Artifact "flower vase" museum_dais - with name "artifact" "vase", - initial "There's an ancient wood vase sitting on the marble platform.", - description "An extremely narrow short wood vase, possibly for \ -holding long-stemmed flowers. It's clearly of ancient origin, well \ -preserved, with strange carvings and designs \ -of robed figures all over.", - capacity 1, - before [; - Receive: - if (noun hasnt is_rod) - "Strangely, it doesn't quite fit."; - LetGo: - if (self in TEMPLE_1_Opening) - "You can't reach the vase, much less the contents of the vase."; - ], - size 10, - has container open; - -! -- Okay maze-lovers, you asked for it -- Barsap's Gambit - -Object ARAGAIN_Gambit "Warm Room" - with description "You are in a long stone room, which is strangely \ -warm. In the very center of the room is a hole, with a ladder \ -down. An outdoor courtyard lies to the east.", - name "hole" "courtyard" "ladder", - e_to ARAGAIN_Courtyard, - d_to GAMBIT_11, - has light; - -Nearby Gambit_sign "large sign" - with initial "There is a large sign posted near the doorway.", - name "sign", - description "~Welcome to Barsap's Royal Gambit, a \ -delight to entertain all guests to the Aragain Royal Grounds. \ -Please consult your tourbook for rules and regulations regarding \ -this area. His highness, Sydney Flathead, and those in his \ -employ, cannot be held responsible for any accidents or minor -spills at this location.~", - has static; - -! (room names -- GAMBIT_XY, where X=level (1,2,3), Y=room #) - - -! ----------------------------------------------------- -! The all-important "CheckGambit" routine. Called by a -! room when a player attempts to move onto a beam. -! Various important things need to be passed... -! RETNS: 0 if cant go, 1 if player fell, 2 if can go -[ CheckGambit - i ! niche associated with dir player moving in - j ! niche directly below (if player falls) [0 if lev 3] - k ! 'level' currently on (1, 2 or 3) - m ! (local var) - ; - ! ** Step one -- check if there's even a beam there at all - if (children(i) == 0) - return 0; - ! ** Step two -- check if the beam is strong enough - m = child(i); - if (m.number == 99) ! (we have the 'wrong half') - m = child(i.counter_niche); - if (m.number <= 0) { - ! -- nope, beam breaks, we're about to fall - ! -- remove broken beam - remove child(i); remove child(i.counter_niche); - print "As you step onto the wood beam, it breaks with a \ -shuddering crack! "; - if (has_resist_gravity == 0) { - deadflag = 1; - print "You plummet quickly through the air, "; - switch (k) { - 1: print "pass by two levels of floating cubes and beams, "; - 2: print "pass by one level of floating cubes and beams, "; - } - print "and find the bottom of the chamber is filled with \ - red-hot lava..."; - return 1; - } - else { - ! -- player will float, but see if there's anything to float to... - print "Amazingly, you float downwards like a \ -feather, instead of falling to your death! "; - if (k==3) { ! (j==0) { on the bottom level - deadflag = 1; - print "Unfortunately, you float slowly down to \ -the bottom of the chamber, which is filled with red-hot lava."; - return 1; - } - print "You float down towards another network of floating \ -cubes and beams. "; - if (children(j) == 0) { ! no wood beam waiting - deadflag = 1; - print "You pass between two giant floating cubes, \ -similar to the ones you just left. Sadly, no wood beam seems \ -to connect these particular cubes, and you float downwards "; - if (k==1) - print "past yet another level of floating cubes and beams, "; - print "to a pit of hot lava."; - return 1; - } - print "You float to another wood beam and your feet \ -land on it, perfectly balanced! "; - m = child(j); - if (m.number == 99) ! (we have the 'wrong half') - m = child(j.counter_niche); - if (m.number <= 0) { - ! -- beam breaks (again!), player dies - ! -- remove broken beam - remove child(j); remove child(j.counter_niche); - print "Sadly, this wood beam also breaks! You \ -continue to float downwards "; - if (k==1) - print "past yet another level of floating cubes and beams "; - print "into a pit of hot lava."; - deadflag = 1; - return 1; - } - else { - print "^"; - ! -- beam is ok, decrement strength counter - m.number = m.number - 1; - ! -- MOVE PLAYER TO NEW BEAM - ! set-up new WN_TO and ES_TO - if (j.niche_dir == 3 or 4) { - WN_TO = parent(j); - ES_TO = parent(j.counter_niche); - } - else { - ES_TO = parent(j); - WN_TO = parent(j.counter_niche); - } - ! move to appropriate 'on beam' room - ! TODO update beam description.... - if (j.niche_dir == 2 or 4) { - if (k==1) - PlayerTo(GAMBIT_W21); - else - PlayerTo(GAMBIT_W31); - } - else { - if (k==1) - PlayerTo(GAMBIT_W22); - else - PlayerTo(GAMBIT_W32); - } - return 1; - } - } - } - else { - ! -- beam is ok, decrement strength counter - m.number = m.number - 1; - print "You step gingerly onto the wood beam...^"; - if (i.niche_dir == 3 or 4) { - WN_TO = parent(i); - ES_TO = parent(i.counter_niche); - } - else { - ES_TO = parent(i); - WN_TO = parent(i.counter_niche); - } - return 2; - } -]; -! ----------------------------------------------------- - - -Class Gambit_Room_Lev1_Class - with description "You are standing on a large floating white \ -stone cube in a very large underground chamber. The entire place is \ -dimly lit red from somewhere below.", - name "white" "stone" "cube" "chamber", - has light; - - -Object GAMBIT_11 "On Giant White Cube" - with description "As far as you can tell, you are standing on a \ -large white stone cube that somehow floats without visible supports in \ -a terrifyingly large underground chamber. The entire place is \ -dimly lit red from somewhere below. There is a ladder up to a hole \ -high in the ceiling here.", - name "white" "stone" "cube" "chamber" "ladder" "hole", - u_to ARAGAIN_Gambit, - w_to - [ i ; - i = CheckGambit(n112,n212,1); - if (i ~= 2) return i; - else return GAMBIT_W1; - ], - s_to - [ i ; - i = CheckGambit(n113,n213,1); - if (i ~= 2) return i; - else return GAMBIT_W2; - ], - has light; - -Object GAMBIT_12 "On Giant White Cube" - class Gambit_Room_Lev1_Class - with e_to - [ i ; - i = CheckGambit(n124,n224,1); - if (i ~= 2) return i; - else return GAMBIT_W1; - ], - w_to - [ i ; - i = CheckGambit(n122,n222,1); - if (i ~= 2) return i; - else return GAMBIT_W1; - ], - s_to - [ i ; - i = CheckGambit(n123,n223,1); - if (i ~= 2) return i; - else return GAMBIT_W2; - ], -; - -Object GAMBIT_13 "On Giant White Cube" - class Gambit_Room_Lev1_Class - with e_to - [ i ; - i = CheckGambit(n134,n234,1); - if (i ~= 2) return i; - else return GAMBIT_W1; - ], - s_to - [ i ; - i = CheckGambit(n133,n233,1); - if (i ~= 2) return i; - else return GAMBIT_W2; - ], -; - -Object GAMBIT_14 "On Giant White Cube" - class Gambit_Room_Lev1_Class - with w_to - [ i ; - i = CheckGambit(n142,n242,1); - if (i ~= 2) return i; - else return GAMBIT_W1; - ], - n_to - [ i ; - i = CheckGambit(n141,n241,1); - if (i ~= 2) return i; - else return GAMBIT_W2; - ], - s_to - [ i ; - i = CheckGambit(n143,n243,1); - if (i ~= 2) return i; - else return GAMBIT_W2; - ], -; - -Object GAMBIT_15 "On Giant White Cube" - class Gambit_Room_Lev1_Class - with e_to - [ i ; - i = CheckGambit(n154,n254,1); - if (i ~= 2) return i; - else return GAMBIT_W1; - ], - w_to - [ i ; - i = CheckGambit(n152,n252,1); - if (i ~= 2) return i; - else return GAMBIT_W1; - ], - n_to - [ i ; - i = CheckGambit(n151,n251,1); - if (i ~= 2) return i; - else return GAMBIT_W2; - ], - s_to - [ i ; - i = CheckGambit(n153,n253,1); - if (i ~= 2) return i; - else return GAMBIT_W2; - ], -; - -Object GAMBIT_16 "On Giant White Cube" - class Gambit_Room_Lev1_Class - with e_to - [ i ; - i = CheckGambit(n164,n264,1); - if (i ~= 2) return i; - else return GAMBIT_W1; - ], - n_to - [ i ; - i = CheckGambit(n161,n261,1); - if (i ~= 2) return i; - else return GAMBIT_W2; - ], - s_to - [ i ; - i = CheckGambit(n163,n263,1); - if (i ~= 2) return i; - else return GAMBIT_W2; - ], -; - -Object GAMBIT_17 "On Giant White Cube" - class Gambit_Room_Lev1_Class - with w_to - [ i ; - i = CheckGambit(n172,n272,1); - if (i ~= 2) return i; - else return GAMBIT_W1; - ], - n_to - [ i ; - i = CheckGambit(n171,n271,1); - if (i ~= 2) return i; - else return GAMBIT_W2; - ], -; - -Object GAMBIT_18 "On Giant White Cube" - class Gambit_Room_Lev1_Class - with w_to - [ i ; - i = CheckGambit(n182,n282,1); - if (i ~= 2) return i; - else return GAMBIT_W1; - ], - n_to - [ i ; - i = CheckGambit(n181,n281,1); - if (i ~= 2) return i; - else return GAMBIT_W2; - ], - e_to - [ i ; - i = CheckGambit(n184,n284,1); - if (i ~= 2) return i; - else return GAMBIT_W1; - ], -; - -Object GAMBIT_19 "On Giant White Cube" - class Gambit_Room_Lev1_Class - with e_to - [ i ; - i = CheckGambit(n194,n294,1); - if (i ~= 2) return i; - else return GAMBIT_W1; - ], - n_to - [ i ; - i = CheckGambit(n191,n291,1); - if (i ~= 2) return i; - else return GAMBIT_W2; - ], -; - - -! (level 1 niches) - -Object n112 "western niche" GAMBIT_11 - class niche_class - with name "western", - counter_niche n124, - niche_dir 2, ! 2 = on western edge of floor - ; -Object n113 "southern niche" GAMBIT_11 - class niche_class - with name "southern", - counter_niche n141, - niche_dir 3; - -Object n124 "eastern niche" GAMBIT_12 - class niche_class - with name "eastern", - counter_niche n112, - niche_dir 4; -Object n123 "southern niche" GAMBIT_12 - class niche_class - with name "southern", - counter_niche n151, - niche_dir 3; -Object n122 "western niche" GAMBIT_12 - class niche_class - with name "western", - counter_niche n134, - niche_dir 2; - -Object n134 "eastern niche" GAMBIT_13 - class niche_class - with name "eastern", - counter_niche n122, - niche_dir 4; -Object n133 "southern niche" GAMBIT_13 - class niche_class - with name "southern", - counter_niche n161, - niche_dir 3; - -Object n141 "northern niche" GAMBIT_14 - class niche_class - with name "northern", - counter_niche n113, - niche_dir 1; -Object n142 "western niche" GAMBIT_14 - class niche_class - with name "western", - counter_niche n154, - niche_dir 2; -Object n143 "southern niche" GAMBIT_14 - class niche_class - with name "southern", - counter_niche n171, - niche_dir 3; - -Object n151 "northern niche" GAMBIT_15 - class niche_class - with name "northern", - counter_niche n123, - niche_dir 1; -Object n154 "eastern niche" GAMBIT_15 - class niche_class - with name "eastern", - counter_niche n142, - niche_dir 4; -Object n152 "western niche" GAMBIT_15 - class niche_class - with name "western", - counter_niche n164, - niche_dir 2; -Object n153 "southern niche" GAMBIT_15 - class niche_class - with name "southern", - counter_niche n181, - niche_dir 3; - -Object n164 "eastern niche" GAMBIT_16 - class niche_class - with name "eastern", - counter_niche n152, - niche_dir 4; -Object n161 "northern niche" GAMBIT_16 - class niche_class - with name "northern", - counter_niche n133, - niche_dir 1; -Object n163 "southern niche" GAMBIT_16 - class niche_class - with name "southern", - counter_niche n191, - niche_dir 3; - -Object n171 "northern niche" GAMBIT_17 - class niche_class - with name "northern", - counter_niche n143, - niche_dir 1; -Object n172 "western niche" GAMBIT_17 - class niche_class - with name "western", - counter_niche n184, - niche_dir 2; - -Object n181 "northern niche" GAMBIT_18 - class niche_class - with name "northern", - counter_niche n153, - niche_dir 1; -Object n182 "western niche" GAMBIT_18 - class niche_class - with name "western", - counter_niche n194, - niche_dir 2; -Object n184 "eastern niche" GAMBIT_18 - class niche_class - with name "eastern", - counter_niche n172, - niche_dir 4; - -Object n191 "northern niche" GAMBIT_19 - class niche_class - with name "northern", - counter_niche n163, - niche_dir 1; -Object n194 "eastern niche" GAMBIT_19 - class niche_class - with name "eastern", - counter_niche n182, - niche_dir 4; - -! (level 1 initial wood beam layout) -! wood beam, as two 'halves' -! (the 'trick' here, is to devise a method of testing for the -! correct '.number', without having to constantly update -! both halves (which, when separated in niches, is impossible) -! Thus, one half will always have number=99, which indicates -! 'wrong half to test'. The other half, which is gained by -! checking child(self.counter_niche), has the useful .number - -! Object e11 "ebony beam" n112 class ebony_beam_class; -! Object e111 "ebony beam" n124 class ebony_beam_class with number 99; -Object e12 "ebony beam" n113 class ebony_beam_class; -Object e121 "ebony beam" n141 class ebony_beam_class with number 99; -Object e13 "ebony beam" n153 class ebony_beam_class; -Object e131 "ebony beam" n181 class ebony_beam_class with number 99; - -Object p11 "pine beam" n123 class pine_beam_class; -Object p111 "pine beam" n151 class pine_beam_class with number 99; -Object p12 "pine beam" n122 class pine_beam_class; -Object p121 "pine beam" n134 class pine_beam_class with number 99; -Object p13 "pine beam" n133 class pine_beam_class; -Object p131 "pine beam" n161 class pine_beam_class with number 99; -Object p14 "pine beam" n194 class pine_beam_class; -Object p141 "pine beam" n182 class pine_beam_class with number 99; -Object p15 "pine beam" n112 class pine_beam_class; -Object p151 "pine beam" n124 class pine_beam_class with number 99; - -! (side note: with balsa beams, 2nd side need not be 99, since -! it will always break on the first try, and the default number is 0 -Object b11 "balsa beam" n152 class balsa_beam_class; -Object b111 "balsa beam" n164 class balsa_beam_class; -Object b12 "balsa beam" n143 class balsa_beam_class; -Object b121 "balsa beam" n171 class balsa_beam_class; -Object b13 "balsa beam" n163 class balsa_beam_class; -Object b131 "balsa beam" n191 class balsa_beam_class; -Object b14 "balsa beam" n142 class balsa_beam_class; -Object b141 "balsa beam" n154 class balsa_beam_class; -Object b15 "balsa beam" n172 class balsa_beam_class; -Object b151 "balsa beam" n184 class balsa_beam_class; - - -! (remaining 2 levels in sep. files) -Include "gambit2.inf"; -Include "gambit3.inf"; - - -! tricky 'on beam' rooms -- only two for each level -! change description of fake_beam as appropriate -Object GAMBIT_W1 "On wood beam" - with description "You're walking along a very narrow wood beam that runs \ -east to west into darkness. Below, you can see the dark \ -silhouette of a network of beams and floating cubes. Much \ -farther below you can see a dull red glow.", - name "darkness" "network" "silhouette" "cubes" "glow", - w_to [; give self ~visited; return WN_TO; ], - e_to [; give self ~visited; return ES_TO; ], - before [; - Jump: - "There's barely enough room to walk, much less jump."; - Drop: - print "Dropping "; DefArt(noun); - print " will result in your losing both "; - DefArt(noun); - " and probably your balance."; - ], - has light; - -Object GAMBIT_W2 "On wood beam" - with description "You're walking along a very narrow wood beam that runs \ -north to south into darkness. Below, you can see the dark \ -silhouette of a network of beams and floating cubes. Much \ -farther below you can see a dull red glow.", - name "darkness" "network" "silhouette" "cubes" "glow", - n_to [; give self ~visited; return WN_TO; ], - s_to [; give self ~visited; return ES_TO; ], - before [; - Jump: - "There's barely enough room to walk, much less jump."; - Drop: - print "Dropping "; DefArt(noun); - print " will result in your losing both "; - DefArt(noun); - " and probably your balance."; - ], - has light; - -Object GAMBIT_W21 "On wood beam" - with description "You're walking along a very narrow wood beam that runs \ -east to west into darkness. Both above and below, you can see the dark \ -silhouette of a network of beams and floating cubes. \ -Farther below you can see a dull red glow.", - name "darkness" "network" "silhouette" "cubes" "glow", - w_to [; give self ~visited; return WN_TO; ], - e_to [; give self ~visited; return ES_TO; ], - before [; - Jump: - "There's barely enough room to walk, much less jump."; - Drop: - print "Dropping "; DefArt(noun); - print " will result in your losing both "; - DefArt(noun); - " and probably your balance."; - ], - has light; - -Object GAMBIT_W22 "On wood beam" - with description "You're walking along a very narrow wood beam that runs \ -north to south into darkness. Both above and below, you can see the dark \ -silhouette of a network of beams and floating cubes. \ -Farther below you can see a dull red glow.", - name "darkness" "network" "silhouette" "cubes" "glow", - n_to [; give self ~visited; return WN_TO; ], - s_to [; give self ~visited; return ES_TO; ], - before [; - Jump: - "There's barely enough room to walk, much less jump."; - Drop: - print "Dropping "; DefArt(noun); - print " will result in your losing both "; - DefArt(noun); - " and probably your balance."; - ], - has light; - -Object GAMBIT_W31 "On wood beam" - with description [; - print "You're walking along a very narrow wood beam that runs \ -east to west into darkness. Above you can see a network of floating beams \ -and cubes. Below you can see a red glow"; - if ((self hasnt general) && (GAMBIT_W32 hasnt general) && - (amulet has worn) && (ES_TO == GAMBIT_37)) { - give self general; - ".^^Your amulet suddenly gives off a bright flash, then fades!"; - } - else "."; -], - name "darkness" "network" "cubes" "glow", - w_to [; give self ~visited; return WN_TO; ], - e_to [; give self ~visited; return ES_TO; ], - before [; - Jump: - "There's barely enough room to walk, much less jump."; - Drop: - print "Dropping "; DefArt(noun); - print " will result in your losing both "; - DefArt(noun); - " and probably your balance."; - ], - has light; - -Object GAMBIT_W32 "On wood beam" - with description [; - print "You're walking along a very narrow wood beam that runs \ -north to south into darkness. Above you can see a network of floating beams \ -and cubes. Below you can see a red glow."; - if ((self hasnt general) && (GAMBIT_W31 hasnt general) && - (amulet has worn) && (ES_TO == GAMBIT_37)) { - give self general; - ".^^Your amulet suddenly gives off a bright flash, then fades!"; - } - else "."; - ], - name "darkness" "network" "cubes" "glow", - n_to [; give self ~visited; return WN_TO; ], - s_to [; give self ~visited; return ES_TO; ], - before [; - Jump: - "There's barely enough room to walk, much less jump."; - Drop: - print "Dropping "; DefArt(noun); - print " will result in your losing both "; - DefArt(noun); - " and probably your balance."; - ], - has light; - -Object fake_beam "wood beam" - with name "wood" "beam", - description "A long thin wood beam, barely wide enough for \ - both of your feet.", ! change as appropriate - before [; - Turn, Search, Rub, LookUnder, Attack, Take, Push, Pull: - "You'll have to show me how you intend to do \ -this, since you're standing on the wood beam."; - ], - found_in GAMBIT_W1 GAMBIT_W2 GAMBIT_W21 GAMBIT_W22 - GAMBIT_W31 GAMBIT_W32, - has scenery; - - - -! -- The Royal Palace, and its strange secret - -Object ARAGAIN_Palace "Palace Entrance Hall" - with description "A vast hall runs north and south \ -in this massive palace. Royal trappings decorate the walls \ -and ceiling, and red carpet lines the floor. \ -A tremendous open archway exits to the north into some \ -courtyard, while two open solid brass doors mark the \ -entrance south into some audience chamber. Two smaller \ -exits head east and west towards stairways up and down \ -respectively.", - name "trappings" "carpet" "archway" "courtyard" -"brass" "doors", - n_to ARAGAIN_Courtyard, - s_to Palace_Audience, - e_to Palace_office, - w_to Palace_Westwing, - u_to Palace_office, - d_to Palace_Westwing, - has light; - -Object Palace_Audience "Audience Hall" - with description "This is a giant audience hall, equivalent to \ -a large auditorium with a throne on the stage. The hall is \ -filled with luxurious decorations -- red carpeting, expensive \ -chandeliers, sweeping gold-edged drapery. The hall is also \ -currently filled with a large number of dignitaries and \ -important-looking people taking up all the seats. Open brass \ -doors lie to the north.", - name "carpeting" "chandeliers" "drapery" "seats" "brass" "doors", - n_to ARAGAIN_Palace, - has light; - -Nearby audience_people "people" - with name "people" "dignitaries" "diplomats", - description "Just your average throng of official-looking \ -people. Interestingly, many of them seem to be smeared \ -with flour.", - life [; - default: "The audience seems to be too busy waiting \ -for something interesting to happen."; - ], - before [; -Cast: - if (the_spell_was == foblub_spell) - "You give a marvelous sermon on patience. The audience \ -seems glued to their seats, which changes little."; - if (the_spell_was == espnis_spell) - "You give a rather overdone sermon on patience. A few \ -people in the back rows drop off to sleep."; - ], - has animate concealed; - -Object throne "throne" - with name "throne", - description "A large throne.", - before [; - Enter: "This is no time to be playing king."; - ], - has scenery enterable; - -Object Palace_office "Royal Bedroom" - with description "This might have once been a lavish bedroom \ -for royalty. At the moment, it seems like someone has converted \ -it into a private lounge of some sort. A stairway heads down.", - name "stairway", - d_to ARAGAIN_Palace, - has light; - -Object cab_key "shiny key" Gov_desk2 - with name "key" "shiny", - !weight 5, - size 5, - description "A shiny key.", -; - -Object Palace_cabinet "cabinet" Palace_office - with name "cabinet", - with_key cab_key, - description [; - print "A rather new-looking wooden cabinet"; - if (self has general) - ", with a bit of waxy build-up all over it."; - else "."; - ], - when_closed "A wooden cabinet stands against one wall, \ -clearly a new addition to the room.", - when_open [ x; - print "The wooden cabinet has been opened. "; - x = children(self); - if (x == 0) "It seems to be empty."; - print "It contains:^"; - ! if (x == 1) print "is "; else print "are:^"; - x = FULLINV_BIT + INDENT_BIT + NEWLINE_BIT + RECURSE_BIT; - WriteListFrom (child(self), x, 1); - rtrue; - ], - before [; - Cast: - if (the_spell_was == egdelp_spell) { - give self general; - "The cabinet is covered in waxy build-up."; - } - Open: - if ((self hasnt locked) && (self hasnt open)) { - print "You give the cabinet a good tug"; - if (self hasnt general) - ", but the \ -cabinet doors barely budge. The new-looking wood seems \ -to be rather tightly fitted."; - else { - give self open; - ". The wax makes the doors open with ease."; - } - } - ], - size 25, - capacity 20, - has static container openable lockable locked; - - -! (warped -- true story of the great battle) -Object p6 "warped parchment" Palace_cabinet - class parchment_class, - with name "warped", -description "~...truth. In fact, the truth too terrible to \ -believe, but believe it I must, for all the evidence I \ -have found indicates that the Ancient Ones went up against \ -the evil elementals and lost! With the Rod in hand, they \ -were defeated by trickery! The Rod was broken and \ -scattered into the world, but can be regained and rejoined \ -by any whose heart and spirit are pure! Did the \ -Ancient Ones forsake the spheres of...~"; - - -Object Palace_Westwing "Palace Dungeons" - with description "Dark and spooky, the palace dungeons seem \ -empty at the moment. The north portion of the room is sectioned-off \ -by iron bars that form a makeshift cell.", - n_to [; <>; ], - u_to ARAGAIN_Palace, - has light; - -Nearby prison_cell "prison cell" - with name "cell" "bars" "iron", - when_open [ x; - print "The cell stands open."; - x = children(self); - if (x == 0) { new_line; rtrue; } - print " Inside you notice:^"; - x = FULLINV_BIT + INDENT_BIT + NEWLINE_BIT + RECURSE_BIT; - WriteListFrom (child(self), x, 1); - rtrue; - ], - when_closed [ x; - print "The cell is closed."; - x = children(self); - if (x == 0) { new_line; rtrue; } - print " Inside you notice:^"; - x = FULLINV_BIT + INDENT_BIT + NEWLINE_BIT + RECURSE_BIT; - WriteListFrom (child(self), x, 1); - rtrue; - ], - description "A cramped space with a wall of iron bars.", - before [; - Cast: - if (the_spell_was == bekdab_spell) { - print "The bars seem to rust a bit"; - if (self has locked) { - give self ~locked; - ". You hear a lock mechanism in the cell door break!"; - } - else "."; - } - Go: - if ((noun == s_obj) && (player in prison_cell)) { - ; return 2; } - ], - size 50, - has static container openable transparent enterable; - - -! ***************** -! Creatures/people -! ***************** - -Object Entrance_guardian "Tough-looking Palace guard" ARAGAIN_Entrance - with name "guardian" "guard", - initial "A tough-looking palace guard is standing by the gate.", - description "Typical guard -- big, armed to the teeth, and a \ -sour disposition.", - before [; - Cast: - "The guard stops you in mid-chant by blowing a rather \ -shrill whistle. ~None of that priest mumbo-jumbo on \ -my watch!.~"; - ], - react_before [; - Blow: - if (noun==whistle) -"The guard stops you as you are about to blow the whistle. \ -~I blow the whistles around here.~"; - ], - life - [ i ; - Attack, ThrowAt: - "I'd advise against this. He's probably knows 101 \ -ways to dismember an opponent. \ -Also, he's armed and encased in plate mail."; - Ask: - if ((noun == 'cake' or 'gate') && (self hasnt general)) - "~It's pretty simple. Give me a cake, and you get in. \ -That's the rules.~"; - Show: - if ((noun == Baking_Pan) && (cake in Baking_Pan)) - "~Well, hand it over already.~"; - Give: - ! Now for the fun... - if ((noun == Baking_Pan) && (cake notin Baking_Pan)) - "The guard looks at the pan, and hands it back. \ -~I don't see any cake. What are you, a wise guy or something?~"; - if ((noun == Baking_Pan) && (cake in Baking_Pan)) { - move Baking_Pan to Entrance_guardian; - print "The guard grabs the pan, and, to your \ -annoyance, cuts himself a massive slice of cake with his broadsword. \ -The guard takes a bite"; - ! 1st, check for strange foreign objects - objectloop (i in dough) { - if ((i ~= flour) && - (i ~= sugar_cube) && - (i ~= baking_powder) && - (i ~= corbie_egg) && - (i ~= dornberries) && - (i ~= butter)) { - if (i hasnt edible) { - print " and you hear a strange \ -'crunch'. He removes ", (a) i; " from his teeth. ~What's this?~ the \ -guard says, clearly angry. ~I oughta report you to the 'Better \ -Bakers Bureau'.~"; ! hopefully, this will break out of objectloop - } - else { - print ", and chews for a bit. \ -His eyes widen, and he spits the cake out. ~Hey pal, I taste ", (name) i; -" in this so-called cake of yours! Grues could've done a better job \ -than this!~"; - } - } - } - ! 2nd, check overall quality of cake - if (cake.number ~= 0) { - print ", and chews for a bit. \ -He frowns. ~Sorry pal, this doesn't pass inspection. "; - if (cake.number == 1) - "It could stand some more cooking.~"; - if (cake.number == 2) - "Did ya burn it or something?~"; - if (cake.number == 3) - "It'd make an okay pancake, though.~"; - if (cake.number == 4) - "It's hard as a rock!~"; - } - ! finally, check that all proper ingredients are there. - if ((butter in dough) && - (sugar_cube in dough) && - (corbie_egg in dough) && - (baking_powder in dough) && - (dornberries in dough) && - (flour in dough)) { - ! good cake - give self general; - give ARAGAIN_Entrance_gate open ~locked; - Achieved(4); - ", and smacks \ -his lips. ~Finally, someone who can bake an acceptable cake.~ \ -He unlocks and opens the gate. ~You can pass.~"; - } - else - ", and chews for a bit. He seems displeased. \ -~I don't know where you learned to bake, but there's definitely \ -something missing here.~"; - } - default: - "The guard is amazingly good at ignoring distractions."; - ], - each_turn [ i; - i = random(25); - if (i == 1) - "^A couple of dignitaries from Gurth push their way to the \ -front and present a flat object to the guard. The guard frowns. \ -~A fish cake? I don't think so.~ The dignitaries return to the line."; - if (i==3) - "^The guard paces back and forth."; - if (i==5) - "^A representative from Borphee steps up and presents \ -a pile of baked dough-bits on a plate to the guard. ~Frobolli cake, eh? \ -Well, this may be popular where you come from, but it ain't popular \ -here.~ The representative walks off."; - if (i==7) - "^The guard practices his menacing stares."; - if (i==8) - "^The guard blows his whistle at some people in line."; - if (i==9) - "^An official presents a nice morgia root pie to the \ -guard. ~A pie?~ the guard says, clearly exasperated. He points at \ -the sign as the official leaves. ~Cakes folks, we're taking C-A-K-E-S.~"; - if (i==11) - "^The guard polishes a spot on his armor."; - if (i==13) - "^Some dignitary presents the guard with a strange \ -green cake with the words ~EAT ME~ written in frosting. The guard smiles, \ -cuts himself a piece, and suddenly stuffs it into the dignitary's mouth! \ -~You boys are going to have to do better than that,~ he says to the -now tiny dignitary, who stalks off."; - if (i==15) - "^The guard hums a military dirge to himself."; - ], -has animate; - -! -- The evil magistrate -Object Magistrate "magistrate" Palace_Audience - with name "magistrate", - initial "There is a royal magistrate here.", - description "A rather nasty-looking thin tall fellow with an \ -evil grin.", - number 1, - life [; - Attack, ThrowAt: - magroutine1(1); rtrue; - Show: - if (noun==Gov_ledger && Sydney notin Palace_Audience) { - move Sydney to Palace_Audience; - remove Gov_ledger; - "The Magistrate grabs the ledger and \ -frowns as he reads it. ~Fine, you want a presentation?~ He grabs a \ -young boy who was hiding behind \ -the throne and shoves him forward. ~Presenting his royal \ -Highness, King Sydney Flathead, lost heir to the Flathead monarchy!~ \ -The crowd reaction is somewhat mixed. ~Well, his head does look \ -flat,~ you hear one person say."; - } - if (noun==cab_key) { - move cab_key to self; - "The magistrate moves with surprising speed and \ -takes the key. ~I was looking for that!~ he says."; - } - else "~Oh, very interesting.~ he says with heavy \ -sarcasm."; - Give: - if (noun==Gov_ledger && Sydney notin Palace_Audience) { - <>; - } - if (noun==cab_key) { - move cab_key to self; - "The magistrate takes the key. \ -~I was looking for that!~ he says."; - } - else "~I have no need for that!~ he says with a sneer."; - default: "The magistrate pays you absolutely no attention."; - ], - react_before [; - Cast: - if (the_spell_was ~= ledak_spell) { - magroutine1(2); rtrue; - } - ], - each_turn [ i ; - i = random(20); - if (Sydney in Palace_Audience) { - if (i==1) - "^A diplomat approaches the little boy with a \ - document. The Magistrate steps forward and \ - stops him. ~Sydney is much too busy to bother \ - with that.~ the Magistrate says."; - } - else { - if (i==5) - "^An impatient diplomat shouts out, \ - ~Bring out the King!~ The Magistrate smiles \ - and says, ~Did anyone make a petition for \ - a royal presentation?~ The crowd is silent. \ - ~I didn't think so.~"; - } - ], - has animate; - -! (a short code-space saving routine) -[ magroutine1 - w - ; - - ! remove player's possessions - while (child(player) ~= 0) { - give child(player) ~worn; - move child(player) to Palace_office; - } - if (w == 1) - print "You move quickly, but from nowhere, two royal palace \ -guards appear and wrestle you to the ground. ~Lock this \ -fanatic up!~ "; - if (w == 2) - print "You start to chant, but the magistrate has sharp \ -ears, and recognizes your magic! With a quick signal, \ -two royal palace guards appear and wrestle you to the ground. \ -~Lock this babbler up!~ "; -print "the Magistrate says with a sneer. The guards \ -strip you of your possessions and drag you down to the royal \ -dungeons.^"; - PlayerTo(prison_cell); - give prison_cell ~open locked; - rtrue; -]; - - - -Object Sydney "young child" - with name "child" "boy" "sydney", - ! describe "There is a young boy here", - description [; - print "A little boy dressed in uncomfortable-looking frilly clothes"; - if (flat_hat in self) - ". He's wearing a small red hat."; - else "."; - ], - before [; - Cast: - if (the_spell_was == foblub_spell or espnis_spell) -"The boy seems to miss the subtle nuances of your sermon. All \ -that happens is that now he seems even more nervous than before."; - ], - life - [; - Ask, Tell: - if (self has general) - "Young Sydney Flathead only tucks his head lower and whimpers."; - else - "Young Sydney Flathead only shrugs."; - Answer: - if (special_word=='hello' or 'hi') { - if (self hasnt general) - "Young Sydney Flathead doesn't respond -- he seems \ -to find you a bit frightening."; - else - "~Hello,~ the young lad says, somewhat shyly."; - } - "Young Sydney Flathead only stares at you."; - Attack, ThrowAt: - give self ~general; - deadflag = 1; - "The young boy screams in terror as you move to threaten him \ - (shame on you!). Several guards appear out of nowhere, and club \ - you to death for attempting regicide."; - Give: - if (noun==stuffed_toy) { - give self general; - move stuffed_toy to self; - "Tentatively, the boy takes the stuffed toy. You \ -catch the glimpse of a sad smile as he holds it tightly."; - } - "Young Sydney cowers and shakes his head."; - Order: - if (action==##Give) { - if (noun==flat_hat) { - if (self has general) { - remove Magistrate; - remove self; - move flat_hat to player; - move brown_sphere to player; - "Little Sydney smiles and removes the hat and \ -hands it to you. You notice his head is actually round, and the hat \ -was cleverly hiding this.^^\ -~He's no Flathead!~ someone in the audience hall yells out. A distinct \ -murmur of discontent rises from the crowd. The Magistrate slowly \ -backs away. ~Wait! I can explain!~ the Magistrate \ -starts, but soon runs screaming out of the hall, with several angry diplomats \ -hot on his heels!^^\ -~Thank you, kind sir,~ someone behind you says. You turn around. \ -Little Sydney is happily in the arms of a kindly-looking couple. The woman \ -continues. ~Our son was kidnaped, a little while ago. We've \ -been waiting here, hoping to get him back. You did a very brave thing.~ \ -The man steps forward holding some small object. \ -~A priest fellow, such as yourself, told me a long time \ -ago that one day, someone would help us in our time of need, and that \ -I should give him this.~ He gives you a strange round object. \ -~It's the least we can do.~ he says. The couple leaves the hall, \ -with the little boy laughing in their arms."; - } - else "Little Sydney shrinks back and holds on to his \ -hat. He stares at you fearfully."; - } - "Little Sydney shrinks back and stares at you fearfully."; - } - "Sydney shakes his head fretfully."; - ], - has animate transparent; - - - -! ***************** -! scrolls/spells -! ***************** - -Object crumpled_scroll "crumpled scroll" Palace_cabinet - class scroll_class, - with name "crumpled", -; - -Object ledak_spell "detect forgery" crumpled_scroll - class spell_class, - with name "ledak", - magic [; - if ((location==Palace_Audience) && - (Sydney in Palace_Audience) && - ((second == 0) || (second == Sydney))) { -"You notice a soft yellow glow around the young boy. \ -The glow fades."; - } - if (second==0) - "The place appears to be free of forgeries, at the \ -moment."; - else { - if (second==player) "You appear to be the geniune thing."; - CDefArt(second); - " appears to be the genuine thing."; - } - ], -; - -! **************** -! Misc objects -! **************** - -Object flat_hat "red hat" Sydney - with name "hat" "red", - description "A little red hat with no brim. It's unusually \ -flat at the top.", - before [; - Wear: - "It's too small for your head."; - ], - size 10, - has clothing; - -Object brown_sphere "brown sphere" - class sphere_class, - with name "brown", - description "A tiny perfect brown sphere, made of some strange \ -unknown metal.", -; - -! THIEF'S magic door -! Contains an unusual amount of properties... -Object magic_door "strange door" - with name "door" "strange", - !weight 20, - size 30, - description [; - print "A small door labeled ~STAIRS~, of all \ -things"; - if (self hasnt static) - ". Oddest of all is the fact that it isn't \ -attached to anything!"; - else "."; - ], - door_dir [; - if (self has static) { - if (location == Skyscraper) return e_to; - else return w_to; - } - ], - door_to [; - if (self has static) { - if (location == Skyscraper) return THIEF_Bottom_of_staircase; - else return Skyscraper; - } - ], - found_in [; - if (self has static) { - if (location == Skyscraper or THIEF_Bottom_of_staircase) - rtrue; - else rfalse; - } - ! else rtrue???? - ], - describe [; - ! we force a describe routine here, rather than use - ! when_open/closed due to the results that happen - ! after an obj has been moved (which the door will be). - if (self hasnt static) - "^There's an unattached door lying on the ground here."; - else { - if (self has open) { - print "^There's an open door to the"; - if (location == Skyscraper) - " east."; - else - " west."; - } - else { - print "^There's a closed door"; - if (location == Skyscraper) - " in the eastern wall."; - else - " to the west."; - } - } - ], - time_left 0, - time_out [; - ! after timeout -- Thief locks the door - give self ~open locked; - if ((location == THIEF_Bottom_of_staircase) || - (location == THIEF_Ent) || - (location == THIEF_Foyer) || - (location == THIEF_Lounge) || - (location == THIEF_Storeroom)) { - print "^Suddenly, out of the shadows springs a \ -gentleman dressed in black! ~How did you get in here!~ he \ -cries. Quicker than lightning, he envelopes you in his dark \ -cape, which seems to fade into shadows, leaving you in...^"; - PlayerTo(Skyscraper); - rtrue; - } - if (location == Skyscraper) - "^Out of the shadows, a gentleman dressed in \ -black appears! He sees the door to the east and seems \ -somewhat annoyed. ~Much too busy for unexpected guests,~ \ -you hear him say as he slips through the door and closes \ -it behind him. Moments later you hear the sound of a lock \ -closing on the other side.^"; - ], - before [; - Enter: - if (self has static) { - if (location == Skyscraper) <>; - else <>; - } - else - "Since the door doesn't currently lead anywhere, \ -entering it seems pointless."; - Open: - if (self hasnt static) - "The door opens onto...thin air. Without a \ -doorway to attach to, it's not terribly useful, it appears."; - if ((self has static) && (self hasnt open) && - (self hasnt general)) { - give self general; - give self open; - StartTimer(magic_door,15); - "The door opens. There's a dark chamber \ -on the other side, which seems all but impossible, given \ -that the wall previously appeared solid!"; - } - Close: - if (self hasnt static) - "You close the door, which at this moment \ -means you turn the movable door to a new angle. Without a \ -doorway to attach to, it's not terribly useful, it seems."; - Drop: - if (location == Skyscraper) { - move self to Skyscraper; - give self static; - Skyscraper.e_to = magic_door; - THIEF_Bottom_of_staircase.w_to = magic_door; - "As you drop the door, it leaps off the ground \ -and flies towards the eastern wall! Amazingly, it seems to \ -attach itself to the eastern wall!"; - } - ], - has door openable; - - diff --git a/src/BORPHEE.INF b/src/BORPHEE.INF deleted file mode 100644 index dd0b71a..0000000 --- a/src/BORPHEE.INF +++ /dev/null @@ -1,1725 +0,0 @@ - -! ************************************************************* -! 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.", -; diff --git a/src/FROSTHAM.INF b/src/FROSTHAM.INF deleted file mode 100644 index 691db7e..0000000 --- a/src/FROSTHAM.INF +++ /dev/null @@ -1,1162 +0,0 @@ - -! ************************************************************** -! frostham.inf -! ------------ -! Frostham locations in SPIRITWRAK, included in spirit.inf -! (Do not compile and/or use separately!) -! ************************************************************** - -Object FROSTHAM_Outskirts "Frostham Outskirts" - with description [; - print "You are at the northern outskirts of Frostham. \ -The city proper is to the south. A few \ -snow covered residences are nearby. \ -A trail leads into a valley to the north"; - if (self hasnt general) { - give self general; - ".^^The last time you saw Frostham was before you \ -entered the Monastery -- many years ago at least. \ -Oddly, it seemed bigger and less desolate then."; - } - else "."; - ], - name "city" "snow" "residences" "trail" "valley", - n_to Valley_trail, - s_to FROSTHAM_2, - cant_go "You walk around the local area a bit, finding \ - nothing of interest.", - has light; - -Object FROSTHAM_2 "Frostham" - with description "You are in Frostham City, the famous winter-\ -lover's haven. The once booming ski vacation spot seems \ -to be a bit more run-down than in times past. \ -The city thins out towards the north, while \ -another section of town is to the south. To the west is \ -a large wood structure. To the southwest is a small \ -building. To the southeast is another small building, possibly a \ -store.", - name "wood" "structure" "building" "store", - n_to FROSTHAM_Outskirts, - w_to FROSTHAM_Resort, - sw_to FROSTHAM_Governer1, - s_to FROSTHAM_GUSStop, - se_to FROSTHAM_Store, - cant_go "You walk around the local streets a bit, finding \ - nothing of interest.", - each_turn [ i ; - if (GROC_hall1 has general) - i = CheckHall(); -! Why check the grocery hallway here? -! Conceptually, if the player dies in the hallway (rather -! difficult, but possible by swearing, for example), -! the hallway should 'adjust' itself to the new weight. -! I simply check this here, because the player must go -! this way to reach the hallway for a second time. - ], - has light; - -Object FROSTHAM_Store "General Store" - with description [; -print "This appears to be a small grocery store, \ -strangely abandoned at the moment. Shelves line the walls, \ -although, since no one is minding \ -the store, the current stock seems to be a bit depleted. \ -You notice an exit south marked ~EMPLOYEES ONLY~ that \ -appears to lead to "; -if (GROC_hall1.number == 1) -print "some hallway."; -else -print "a dark hole."; -" The way back out is to the northwest."; -], - name "stock" "shelves", - nw_to FROSTHAM_2, - s_to [; -if (GROC_hall1.number == 1) return GROC_hall1; -else - "You pull back before falling into what appears to be a deep \ -pit of some sort beyond the south exit."; -], - after [ i ; - Go: - if (noun == n_obj) { - i = CheckHall(); - if (i == 1) - print "You hear a grinding noise from behind \ -you.^"; - } - ], - has light; - -Class Barrel_class - with name "crate", - before [; - Take, Pull, Turn: "It's rather heavy."; - Push: "It's heavy, but you manage to make it slide \ -along the floor a bit."; - PushDir: -if (location == FROSTHAM_Store && second == nw_obj) - "A portion of the door seal blocks the crate from going outside."; -if (location == GROC_hall1 && second == s_obj) { - print "^You give the crate a good shove.^"; - move self to GROC_hall2; - <>; -} -if (location == GROC_hall1 && second == n_obj) { - print "^You give the crate a good shove.^"; - move self to FROSTHAM_Store; - <>; -} -if (location == GROC_hall2 && second == n_obj) { - print "^You give the crate a good shove.^"; - move self to GROC_hall1; - <>; -} -if (location == FROSTHAM_Store && second == s_obj && GROC_hall1.number == 1) { - print "^You give the crate a good shove.^"; - move self to GROC_hall1; - <>; -} -! (we do our own version to allow the CheckHall() to -! work properly) -AllowPushDir(); rtrue; - ], - has static; - -Object BARREL1 "dusty crate" FROSTHAM_Store - class Barrel_class, - with name "dusty", - description "A dust-covered crate.", -; -Object BARREL2 "moldy crate" FROSTHAM_Store - class Barrel_class, - with name "moldy", - description "A mold-covered crate.", -; -Object BARREL3 "filthy crate" FROSTHAM_Store - class Barrel_class, - with name "filthy", - description "A filth-covered crate.", -; - -Object GROC_hall1 "North end of Hallway" - with name "end" "hallway", - number 1, - description [; - print "You're at the north end of a short N-S hall. \ -The hallway"; - switch (GROC_hall1.number) { - 1: print " slopes sharply upwards to the south. \ -You notice two dark doorways above you along the northern wall, \ -one above the other, \ -but no obvious means of getting to them"; - 2: print " travels evenly to the south. \ -You notice a dark doorway above you along the northern wall, \ -but no obvious means of getting to it"; - 3: print " slopes sharply downwards to the south"; - } - ". To the north is an exit."; -], - each_turn [; - if (self hasnt general) { - give self general; - "^The hallway suddenly creaks underfoot! The floor \ -shakes briefly and dust seems to rise from cracks near the \ -walls. Apparently, your unexpected presence has jarred \ -some old mechanisms back to life!"; - } - ], - n_to [; -switch (GROC_hall1.number) { - 1: return FROSTHAM_Store; - 2: return GROC_stockroom; - 3: return GROC_attic; -} - ], - after [ i ; - Go: - if (noun == n_obj or s_obj) { - i = CheckHall(); - if (i == 2) -print "^You hear a low grinding noise. \ -The hallway underfoot suddenly shifts and drops!^"; - } - ], - s_to GROC_hall2, - before [; - Jump: "You jump for a bit. The floor feels strangely \ -unsteady."; - ], - has light; - - -Object GROC_hall2 "South end of Hallway" - with name "end" "hallway", - number 3, - description [; - print "You're at the south end of a short N-S hall \ -that seems to lead nowhere. The hallway"; - switch (GROC_hall2.number) { - 1: " slopes sharply upwards to the north."; - 2: " travels evenly to the north."; - 3: " slopes sharply downwards to the north."; - } - ], - after [ i ; - Go: - if (noun == s_obj) { - i = CheckHall(); - if (i == 1) -print "^You hear a low grinding noise. \ -The hallway underfoot suddenly shifts and drops!^"; - } - ], - before [; - Jump: "You jump for a bit. The floor feels strangely \ -unsteady."; - ], - n_to GROC_hall1, - has light; - -! (Routine for checking 'weights' of two sides of hallway) -! (assumes called from room's _after_ routine, thus all -! barrels and players are in their after_turn places) -! RETURNS: 0 if no change -! 1 if NORTH END now higher than before -! 2 if NORTH END now lower than before -[ CheckHall - i ! local total of weight points for north end - j ! local total of weight points for south end - k ! local -- orig setting of north end (.number) - ; - i = 0; j = 0; - k = GROC_hall1.number; - if (player in GROC_hall1) - i = i + 2; - if (player in GROC_hall2) - j = j + 2; - if (BARREL1 in GROC_hall1) i = i + 1; - if (BARREL1 in GROC_hall2) j = j + 1; - if (BARREL2 in GROC_hall1) i = i + 1; - if (BARREL2 in GROC_hall2) j = j + 1; - if (BARREL3 in GROC_hall1) i = i + 1; - if (BARREL3 in GROC_hall2) j = j + 1; - if (i == j) { - GROC_hall1.number = 2; - GROC_hall2.number = 2; - } - if (i > j) { - GROC_hall1.number = 1; - GROC_hall2.number = 3; - } - if (i < j) { - GROC_hall1.number = 3; - GROC_hall2.number = 1; - } - if (GROC_hall1.number == k) - return 0; - if (GROC_hall1.number > k) - return 1; - if (GROC_hall1.number < k) - return 2; -]; - - -Object GROC_stockroom "Stockroom" - with description [; -print "This is a tiny poorly lit room, that \ -is covered in dust. An exit south leads to a"; -if (GROC_hall1.number == 2) print " short hallway"; -else print " dark hole"; -if (GROC_attic has general) - print ". Above, a hole has been exposed in the ceiling structure"; -"."; - ], - name "dust", - u_to [; if (GROC_attic hasnt general) -"You can't go that way."; - else return GROC_attic; - ], - s_to [; -if (GROC_hall1.number == 2) return GROC_hall1; -else - "You pull back before falling into what appears to be a deep \ -pit of some sort beyond the south exit."; - ], - after [ i ; - Go: - if (noun == n_obj) { - i = CheckHall(); - if (i == 2 or 1) - print "You hear a low grinding noise behind you.^"; - } - ], - has light; - -Object GROC_attic "Attic" - with description [; -print "This is an exceptionally cramped attic, obviously \ -unused for some time. The floorboards are starting to crack."; -if (self has general) - print " One section of the floor is particularly poor, and has \ -a gaping hole leading downwards into darkness."; -" An exit heads south."; - ], - name "sag" "crack" "hole", - d_to [; - if (GROC_attic hasnt general) -"You can't go that way."; - else return GROC_stockroom; - ], - s_to [; -if (GROC_hall1.number == 3) return GROC_hall1; -else - "You pull back at the edge of the exit. The floor, it \ -appears, is too far below you!"; - ], - after [ i ; - Go: - if (noun == n_obj) { - i = CheckHall(); - if (i == 2) - print "You hear a low grinding noise behind you.^"; - } - ], - has light; - -Object attic_floorboards "floorboards" GROC_attic - with name "boards" "floorboards", - description [; -print "Some badly rotting floorboards"; -if (GROC_attic has general) - " with a noticeable hole in one section."; -else { - if (self has general) - " with a noticeable sag in one section."; - else "."; -} - ], - before [; - Take: "They're nailed into the floor."; - Push, Pull, Attack, Shake: -if (self has general) - "The floor shakes a bit, but nothing else happens."; -else { - move loose_board to GROC_stockroom; - give self general; - "The floor shakes under your abuse, and suddenly, a \ -portion in the middle sags considerably! But nothing else \ -happens."; -} - ], - has scenery; - -Object loose_board "loose board" - with name "loose" "board", - initial "You notice a loose board, partially \ -broken, hanging from the ceiling structure.", - description "A portion of the ceiling boards \ -has apparently broken loose.", - before [; - Pull, Attack, Shake: -give GROC_attic general; -remove self; -"You give the board a good couple of yanks. The board \ -soon breaks off, taking a small portion of the ceiling \ -with it! After the dust settles, you notice the rather \ -poor remodeling job you've done to the ceiling."; - ], -has static; - - -! (the coffee was moved to the cafe in Borphee) -Object decaf_coffee_can "can of decaf coffee" - with name "can" "coffee" "decaf", - description "The can reads: ~Frobozz coffee crystals~^^\ - ~Rich, mountain-grown flavor.~^^DECAFFEINATED.", - before [; - Open: - "You'd need a good can-opener for that."; - ], - size 15, -; - -Object icebox_key "square key" GROC_attic - with name "key" "square", - size 5, -; - - -Object icebox "icebox" GROC_stockroom - with name "icebox" "box", - description "A rather old-looking icebox.", - capacity 10, - size 20, - with_key icebox_key, - when_closed "A dust-covered icebox stands closed against \ -the northern wall.", - when_open [ x; - print "The icebox is open. "; - x = children(self); - if (x == 0) "It is also empty."; - print "Inside "; - if (x == 1) print "is: "; else print "are: ^"; - x = FULLINV_BIT + INDENT_BIT + NEWLINE_BIT + RECURSE_BIT; - WriteListFrom (child(self), x, 1); - rtrue; - ], - has static container openable lockable locked; - -Object cerealbox1 "blue cereal box" icebox - with name "box" "blue" "Crunchies", - description "A blue paper box with lettering that reads:^^\ - ~Grueslayer Crunchies!^^\ - (It's not just for adventurers anymore!)^^\ - [Free bonus scroll surprise inside!]~^^\ - Writing on the box reads ~50zm~.", - size 10, capacity 5, - before [; - Receive: - if (noun == cerealbox2 or cerealbox3) { - "That doesn't quite fit."; - } - Cast: - if (the_spell_was == zemdor_spell) { - if (self hasnt general) { - give self general; - move cerealbox2 to parent(cerealbox1); - move cerealbox3 to parent(cerealbox1); - Achieved(1); - "The box of cereal suddenly seems to dance with magic! \ - Before your very eyes, the box suddenly splits into \ - three boxes! The magic fades, but the boxes remain."; - } - else - "The magic fights against the cereal box, but fails. \ - I guess you can only triplicate once."; - } - ], - has container openable; - -Object cerealbox2 "navy-blue cereal box" - with name "box" "navy-blue" "Sugarglobs", - description "A navy-blue paper box with lettering that reads:^^\ - ~Frobozz Super Sugar Globs!^^\ - (Seventeen times the sugar of any other cereal!)^^\ - [Free bonus Frobozz toy inside!]~^^\ - Writing on the box reads ~50zm~.", - !weight 10, - size 10, capacity 5, - before [; - Receive: - if (noun == cerealbox1 or cerealbox3) { - "That doesn't quite fit."; - } - ], - has container openable; - -Object cerealbox3 "royal-blue cereal box" - with name "box" "royal-blue" "Dornflakes", - description "A royal-blue paper box with lettering that reads:^^\ - ~Dornflakes^^\ - (Just like Grandma Dimwit used to make!)^^\ - [Free bonus Frobozz toy inside!]~^^\ - Writing on the box reads ~50zm~.", - !weight 10, - size 10, capacity 5, - before [; - Receive: - if (noun == cerealbox1 or cerealbox2) { - "That doesn't quite fit."; - } - ], - has container openable; - -! A Breakfast cereal class -- what a concept -Class cereal_class - with name "cereal", - description "A quantity of overly-sweetened breakfast cereal.", - !weight 5, - size 8, - before [; - Eat: - remove self; - "You consume the cereal. The sugar rush occurs five seconds \ - later and ends just as quickly."; - ], - has edible; - -Object cereal1 "crunchy cereal" cerealbox1 - class cereal_class - with name "crunchy"; -Object cereal2 "sugary cereal" cerealbox2 - class cereal_class - with name "sugary"; -Object cereal3 "flaky cereal" cerealbox3 - class cereal_class - with name "flaky"; - -Object baking_powder "packet of baking powder" icebox - with name "powder" "baking" "packet", - short_name "packet of baking powder", - description "A single-use packet of baking powder from \ -~Port Foozle Bakers Guild~ products.", - !weight 5, - size 5, - before [; - Eat: - remove self; - "You eat the baking powder. Yuck."; - ], - has edible; - -Object butter "stick of butter" icebox - with name "butter" "stick" "fat", - description "A good-sized stick of butter.", - !weight 5, - size 5, - before [; - Eat: - remove self; - print "You eat the entire stick of butter."; - if (random(20) < 15) -" Your heart will no doubt thank you for that someday."; - deadflag = 1; - " The sudden \ -intake of concentrated fat is too much of a shock to your \ -system, and an important artery somewhere bursts."; - ], - has edible; - -Object FROSTHAM_Resort "Ski Resort" - with description "You are inside a large ski resort. Perhaps \ - it's not ski-season, as the entire place is \ - basically empty. Frostham city lies to the \ - east.", - name "resort" "city" "ski" "skis" "earmuff" "earmuffs", - e_to FROSTHAM_2, - out_to FROSTHAM_2, - w_to "You don't have a lift-ticket. Also, you don't have \ - skis. Most importantly, however, the slopes look \ - pretty lousy.", - has light; - -Object FROSTHAM_Governer1 "Governor's House, Waiting Room" - with description "You are in a waiting room in the house of the Frostham \ - Governor. The carpet is surprisingly plush. \ - The walls have been painted a rather bland \ - peach-like color. The furnishings \ - are also colored peach, which complements the \ - walls without being too nouveau. The way out \ - is to the northeast.", - name "carpet" "furnishings", - ne_to FROSTHAM_2, - out_to FROSTHAM_2, - s_to Gov_door, - after [; - Go: - if (noun==n_obj) { - give Gov_door ~open locked; - print "You hear the door slam and lock behind you.^"; - } - ], - has light; - -Object Gov_couch "couch" FROSTHAM_Governer1 - with name "couch" "peach", - initial "A comfortable-looking peach-colored couch is here.", - description "It looks pretty comfy, but the color wouldn't \ -have been your first choice.", - before [; - Search: - if (self hasnt general) { - give self general; - move c1 to FROSTHAM_Governer1; - "You rummage through the cushions and a coin falls out!"; - } - "You find nothing of interest."; - ], - has static enterable supporter; - -Object travel_posters "travel brochure" FROSTHAM_Governer1 - with name "brochure" "travel", - description "The brochure has pictures of various cheerful-looking \ - people in rather cheerful-looking places. \ - Bold lettering reads ~FEEL BETTER IN MIZNIA~, \ - ~IT'S ARAGAIN, AGAIN~, \ - and ~NEW BORPHEE, EVERYONE'S FAVORITE CITY~", - size 10, - ; - -Object c1 "coin" class coin_class; - -Object Gov_desk1 "desk" FROSTHAM_Governer1 - with name "desk" "waiting" "room", - description "A fairly plain-looking desk", - has scenery supporter; - -Object Gov_ledger "ledger" Gov_desk1 - with name "ledger", - description [; - if (receptionist in FROSTHAM_Governer1) - "The receptionist seems to be using it at the moment."; - "The ledger reads:^^\ - ~ -- New signed petition for presentation and coronation of \ -new King delivered to Aragain Magistrate, awaiting word of \ -event schedule.~^^That's all. I guess the governor hasn't been \ -very busy as of late."; - ], - !weight 20, - size 15, - before [; - Take: - if (receptionist in FROSTHAM_Governer1) - "The receptionist gives you a rather menacing look."; - ], -; - - -Object alarm_clock "alarm clock" Gov_desk1 - with name "clock" "alarm", - description [; -print "A small round desk-clock, with a set of bells \ -on the top, and a small pull-knob on the back. \ -Strangely, the clock seems to be stopped. Two hands, black and golden, \ -are sitting at ",alarm_clock.number," and ", -alarm_clock_dial.number; - " respectively."; - ], - article "an", - number 9, ! setting of the clock hand - time_left 0, - time_out [ x ; - alarm_clock.number = alarm_clock.number + 1; - if (alarm_clock.number > 12) alarm_clock.number = 1; - x = TestScope(alarm_clock,player); - if (x==1) print "^The alarm clock suddenly makes an \ -awful grinding noise"; - if (alarm_clock.number == alarm_clock_dial.number) { - ! alarm goes off - if (x==1) print ", followed by a ear-splitting clang!^"; - ! certain events follow: - ! if receptionist still in office and self in office, - ! receptionist leaves (if player in office, he'll - ! see this, or see it outside the office) - if ((receptionist in FROSTHAM_Governer1) && - (((self in FROSTHAM_Governer1) || (self in Gov_desk1)) || - ((self in player) && (player in FROSTHAM_Governer1))) ) { - remove receptionist; ! a long lunch hour, apparently... - ! give alarm_clock general; - Achieved(2); - if (player in FROSTHAM_Governer1) - "^The receptionist suddenly jumps from her \ -seat and rushes out of the room, screaming ~Lunchtime!~"; - if (player in FROSTHAM_2) - "^You see a woman rush out of the building \ -to the southwest, and quickly vanish."; - rtrue; - } - ! future: boutique in Miznia -- brings salesman to front - if (((self in MIZNIA_Boutique) || (self in player)) && - (player in MIZNIA_Boutique)) { - print "^From somewhere in the back of the \ -store, a tailor rushes out and"; - if (MIZNIA_Boutique hasnt general) { - give MIZNIA_Boutique general; - move fancy_scroll to player; - Achieved(23); -" sees you. ~We've got a rather \ -busy schedule,~ he explains, ~but let me see what I can do.~ \ -He gives you a somewhat unapproving look. ~The ascetic-monk \ -look is out, you know. Here.~ He pins a rolled paper object \ -to your clothes. ~The latest craze -- wearing magic scrolls. \ -Beats using them nowadays, I hear. Now, like I said, we're \ -very busy.~ He goes off to the back of the store."; - } - else -" recognizes you. \ -~I've done all I can for you right now,~ he explains as \ -goes off to the back of the store."; - } - rtrue; - } - else if (x==1) "!"; - ], - size 5, - add_to_scope alarm_clock_dial alarm_clock_bells alarm_clock_hands, - has transparent; - -Object alarm_clock_dial "knob" - with name "pull" "knob", - description "A small, pullable knob on the back of the clock.", - number 12, - before [; - Push: - print "The knob "; - if (self has general) { - give self ~general; - "pushes in a short bit."; - } - else "is as far in as it can go."; - Pull: - print "The knob "; - if (self hasnt general) { - give self general; - "pulls out a short bit."; - } - else "is as far out as it can go."; - Turn: - if (self hasnt general) { - ! wind clock - StartTimer(alarm_clock,1); - "The knob turns -- barely. You \ -hear a small clicking noise as well."; - } - else { - ! set alarm hand - alarm_clock_dial.number = alarm_clock_dial.number + 1; - if (alarm_clock_dial.number > 12) - alarm_clock_dial.number = 1; - print "The knob turns easily. You notice the \ -golden hand on the front sweep to ",alarm_clock_dial.number; - "."; - } - ! if (alarm_clock hasnt general) { - ! } - ! "It doesn't turn anymore. I guess the receptionist \ - ! broke the clock (not that it was in good shape to \ - ! begin with)."; - ], - has static; - -Object alarm_clock_hands "hands" - with name "hand" "hands" - has static; - -Object alarm_clock_bells "bells" - with name "bell" "bells" - has static; - -Object FROSTHAM_Governer2 "Governor's Office" - with description "You are in a rather spacious office. The \ -carpeting is quite plush, and all the furnishings seem \ -excessively lavish.", - name "carpeting" "furnishings", - n_to Gov_door, - has light; - -Object Gov_desk2 "desk" FROSTHAM_Governer2 - with name "desk" "office", - description "A fairly impressive looking desk, made from \ - a massive lacquered piece of black oak wood.", - before [; - Cast: - if (the_spell_was == egdelp_spell) - "The desk is covered with a ugly waxy film. \ -The governor looks extremely annoyed and wipes the desk clean with \ -a stack of papers."; - Push, Pull, Rub, Attack, Search: - "~Do you mind?~ the governor says."; - ], - has scenery supporter; - -Object Gov_door "door" - with name "door" "office", - when_closed [; - print "There's a closed door to the "; - if (self in FROSTHAM_Governer1) - "south."; - else "north."; - ], - when_open [; - print "There's an open door to the "; - if (self in FROSTHAM_Governer1) - "south."; - else "north."; - ], - description "It's just a thick door.", - door_dir [ ; if (location==FROSTHAM_Governer1) return s_to; - return n_to; - ], - door_to [ ; if (location==FROSTHAM_Governer1) - return FROSTHAM_Governer2; - return FROSTHAM_Governer1; - ], - before [ ; - Open: - if ((location==FROSTHAM_Governer1) && - (receptionist in FROSTHAM_Governer1)) - "The receptionist puts a hand in your way and says, \ - ~The governor is currently busy.~"; - Close: - if (location==FROSTHAM_Governer2) - "~Close it on your way _out_~, the governor snarls."; - ], - found_in FROSTHAM_Governer1 FROSTHAM_Governer2, - has static door openable lockable; - -Object FROSTHAM_GUSStop "Subway Entrance" - with description "You're near the southern end of the city. \ - The rest of the city lies to the north. \ - There's also a rather conspicuous \ - stairway down here.", - name "stairway", - n_to FROSTHAM_2, - u_to "You can't go that way.", - d_to FROSTHAM_GUSStation, - cant_go "You walk around the local streets a bit, finding \ - nothing of interest.", - has light; - - -! ****************************************************************** -! People/Creatures -! ****************************************************************** - -Object ski_instructor "ski instructor" FROSTHAM_Resort - with name "instructor" "dude" "skier" "guy" "tall" "lanky", - initial [; - print "A tall lanky guy is here, holding two colorful \ -skis. He seems to be "; - if (waxy_scroll in self) - "waxing them with a scroll."; - "concentrating greatly on waxing \ - his skis."; - ], - description "A tall lanky guy, like I said. He's \ - decked out in fancy bright winter clothes.", - life [; - Attack, ThrowAt: - "~Dude, you must chill.~"; - Answer, Tell: - if (special_word == 'hello' or 'hi') - "The skier gives you the 'thumbs-up' sign. \ -~Hey, dude.~"; - else "~Uh, whatever, dude.~"; - Show: - if (noun==rag) - "~Hey dude, can I borrow that?~"; - "~Uh, whatever, dude.~"; - Order: - if (action==##Give) { - if (noun=='skis') - "~No way, dude.~"; - if (((noun==waxy_scroll) && (self hasnt general)) || - ((noun==rag) && (self has general))) - "~I'm using it, dude.~"; - } - "~Dude, I have no idea what you're talking about.~"; - Ask: - if (second=='rag') - "~A rag makes an excellent ski-maintenance accessory, dude.~"; - if ((second=='scroll' or 'waxy') && (self hasnt general)) - "~Something I found at the top of a run. \ - Doesn't work too well, but hey, I gotta wax.~"; - if (second=='skis') - "~My rad Grayslopes Slaloms. If you don't wax 'em \ - every 30 seconds, they lose their speed.~"; - if ((second=='slopes') || (second=='slope') || - (second=='powder') || (second=='runs') || - (second=='skiing')) - "The skier takes you aside. ~Listen dude, \ - between you and me, the slopes here rot. They \ - used to be way better. But you know, I hear there \ - are some _killer_ drops up north.~"; - "~Dude, I have no idea what you're talking about.~"; - Give: - if (noun==rag) { - move waxy_scroll to FROSTHAM_Resort; - move rag to self; - give self general; - Achieved(3); - "The skier gladly takes the rag and starts \ - polishing immediately. He lets the scroll \ - fall to the ground. ~Excellent man, thanks!~"; - } - "~No thanks, dude.~"; - default: "At the moment, the skier is too busy waxing."; - ], - each_turn [; - if (waxy_scroll notin self && self hasnt general) { - Achieved(3); - remove self; - "^~Dude, like, that scroll thing just \ -vanished! What a cosmic experience!~ On that note, \ -the skier opts to head for the slopes, and leaves to the west."; - } - if (random(20) < 5) - "^The skier polishes a spot on his skis."; - ], - before [; - Cast: - if (the_spell_was == foblub_spell or espnis_spell) - "A pair of fluffy earmuffs the skier is wearing \ -prevents him from hearing the full impact of your sermon."; - ], - has animate transparent; - -Object receptionist "receptionist" FROSTHAM_Governer1 - with name "receptionist", - initial "A receptionist sits behind a desk, engrossed in \ - the ledger.", - description "A gruff-looking lady who apparently is far \ - more interested in her work than you.", - each_turn [; - if (receptionist hasnt general) { - give receptionist general; - "^Without even looking up, the receptionist says, \ - ~The governor is busy right now.~"; - } - if (random(10) == 1) - "^The receptionist turns a page in the ledger."; - ], - life [; - Answer, Order: - print "The receptionist"; - if (special_word=='hello') - ", without looking up, says \ - ~Can I help you?~."; - " seems to be ignoring you."; - Ask: - print "The receptionist"; - if (second=='governor') - ", without looking up, says \ - ~He's very busy right now.~."; - " shrugs."; - default: - "The receptionist seems to be ignoring you."; - ], - react_before [; - Cast: -"The receptionist, in a rather shrill voice says, \ -~If you're gonna wait, do it quietly,~ disrupting your chant."; - Blow: -if (noun==whistle) -"You make an unusually high-pitched noise. The receptionist, \ -in a rather shrill voice says, \ -~If you're gonna wait, do it quietly.~"; - Sneeze: -"~If you want to spread germs, do it outside.~"; - Yell: -"~If you're gonna wait, do it quietly.~"; - Sing: -"~We're not holding auditions, you know.~"; - ], - has animate female; - -Object governor "governor" FROSTHAM_Governer2 - with name "governor" "gov", - initial "The governor of Frostham is sitting behind a \ - desk here, trying to look busy.", - description "A sour-looking man who tries his best not \ - to notice you.", - each_turn [ i ; - if (governor hasnt general) { - give governor general; - move c2 to player; - "^The governor scowls as you enter. ~What do you want?~ \ - he says, and doesn't wait for a response. ~Oh, I know. \ - More complaints about the snow, I suppose? Well \ - look, I didn't ask for this job. Do you want it? I \ - didn't think so.~ He shoves something into your hand. \ - ~Here, buy yourself a cup of coffee, and stop \ - bothering me.~"; - } - i = random(4); - print "^The governor "; - if (i == 1) - "thumbs through some papers."; - if (i==2) - "balances a pencil on his nose."; - if (i==3) - "scribbles something meaningless."; - if (i==4) - "looks up and notices you. ~Don't you \ - have anything else to do?~ he says."; - ], - life [; - Ask: - if (second=='key' or 'shiny') { - print "~Some key an important visitor \ -forgot while visiting. Probably useless now"; - if (parent(cab_key) == player) - print ". You can keep it, for all I care"; - ".~"; - } - if (second=='receptionist') - "~I think she's out to lunch,~ he says, \ -with obvious annoyance."; - if (second=='magistrate' or 'king' or 'sydney') - "He looks at you suspiciously. \ -~Never heard of him,~ he says."; - if (second=='ledger') - "~I think my receptionist has it.~"; - if (second=='pencil') - "~Please! I'm a very busy man!~"; - "~Sorry, that's not my problem. Now run along.~"; - Kiss: - "The governor brushes you off. ~Are you \ -planning on running for office or something?~"; - Attack, ThrowAt: - deadflag = 1; - "As you make a threatening move, the governor \ -presses some unseen switch behind his desk. Before you \ -know it, a hidden trapdoor opens in the floor and you \ -plunge to your death. A good politician is always \ -prepared, it seems..."; - Tell: - "~Sure, sure. Scram, will you?~"; - Answer, Order: - if (special_word=='hello') - "~Yeah, sure. So what's your problem?~"; - "The governor is busy trying to look busy."; - Give: - "Bribing a politician, eh?"; - Show: - if (noun==Gov_ledger) - "~Hey, return that to the receptionist!~"; - "~Please! I'm a very busy man!~"; - ], - react_after [; - Take: - if (noun == cab_key) - "~Oh sure, just go ahead and take things \ -from my office. See if I care.~"; - ], - before [; - Cast: - if (the_spell_was == foblub_spell) - "Actually, the governor seems pretty glued to his \ -seat already. In any event, nothing seems to happen."; - if (the_spell_was == espnis_spell) - "The governor seems to nod off, but only for \ -a second."; - ], - has animate transparent; - - -! *************** -! More objects... -! *************** - -Object pencil "pencil" governor - with name "pencil"; - -Object c2 "coin" class coin_class; - -! (cereal box prizes) -Object whistle "whistle" cerealbox2 - with name "whistle", - description "A tiny plastic whistle.", - !weight 1, - size 1, - before [; - Blow: - "You make an unusually high-pitched noise."; - ], -; -! (a fancier packaged prize :) -Object plastic_wrapper "plastic wrapper" cerealbox3 - with name "wrapper" "plastic", - description "A small plastic see-through package.", - before [; - Open: - while (child(self)~=0) move child(self) to parent(self); - remove plastic_wrapper; - "The wrapper rips open with ease, and disintegrates, \ - leaving the contents behind."; - ], - !weight 0, - size 5, - has container openable transparent; - -Object toy_volcano "toy volcano" plastic_wrapper - with name "toy" "volcano", - description "A strange thing indeed -- a miniature \ - ceramic toy, that has been painted and shaped \ - in painstaking detail to look like a volcano.", - !weight 5, - size 5, -; - -Object volcano_note "instruction notice" plastic_wrapper - with name "notice" "instruction", - article "an", - description "~Frobozz Instant Volcano~^^\ - (parental supervision recommended)^^\ - To use: Just add a good quantity of water! We suggest \ - a very large safety radius.~", - size 5, -; - - - -! ****************** -! Scrolls and spells -! ****************** - -Object waxy_scroll "waxy scroll" ski_instructor - class scroll_class, - with name "waxy", -; - -Object egdelp_spell "create waxy build-up on wood" waxy_scroll - class spell_class, - with name "egdelp", - magic [; - if (second ~= 0 && second ~= player) { - CDefArt(second); " looks pretty polished as is."; } - else { "The chant, seeking wood to polish, fails."; } - ], -; - -Object sugar_scroll "sugar-coated scroll" cerealbox1 - class scroll_class, - with name "sugar-coated" "coated", -; - -Object zemdor_spell "triplicate object" sugar_scroll - class spell_class, - with name "zemdor", - number 0, - magic [; - if (second == 0) - "The chant, seeking a locus for \ -triplication, fails."; - if (second has animate) - "The chant, not designed for living creatures, fails."; - if (second has is_spell) -"This violates certain unwritten laws of magic."; - if (second has is_coin) { - ! new twist for zemdor, as sugg. by player - print "The coin shimmers suddenly! You blink in \ - disbelief as the coin seems to split \ - into three copies of itself! "; - if (self hasnt general) { - give self general; - move c12 to parent(second); - move c13 to parent(second); - "You notice there are now three coins where \ -there was once but one!"; - } - "Suddenly, a financial nymph appears! She gives \ -you a denunciatory look. ~Line 7234-6 of the Pierpont \ -tax laws clearly states that repeated unauthorized \ -triplication of monetary \ -items is strictly forbidden,~ she says, and takes the \ -the two newly created coins before disappearing."; - } - print (The) second, " shimmers suddenly! You blink in \ - disbelief as ", (the) second, " seems to split \ - into three copies of itself! "; - "But, as you finish the chant, \ - the mystic energy seems to fade, and the copies \ - coalesce back into one unchanged object. The \ -chant fails."; - ], -; - -Object c12 "coin" class coin_class; -Object c13 "coin" class coin_class; - diff --git a/src/FUBLIO.INF b/src/FUBLIO.INF deleted file mode 100644 index f121240..0000000 --- a/src/FUBLIO.INF +++ /dev/null @@ -1,1043 +0,0 @@ - -! ****************************************************************** -! FUBLIO.INF -! ---------- -! Add-on file for SPIRITWRAK -! -- Contains South Fublio Valley locations, items and creatures -! ****************************************************************** - -Object FUBLIO_GUSStop "Southern Fublio Valley" - with description "You are in a southern region of Fublio \ -Valley, where someone apparently decided to start \ -a city. So far, a couple huts and farmhouses are the \ -result. A rather run-down farmhouse lies to the \ -southwest, a trail runs through grasslands to \ -the south and a smaller trail runs along the hills to the \ -southeast. To the north, you see a decrepit old \ -building. There is also a stairway into the ground here.", - name "huts" "farmhouses" "farmhouse" "trail" "grasslands" -"hills" "stairway", - d_to FUBLIO_GUSStation, - sw_to Farm, - s_to Grasslands, - se_to Fublio_forest, - n_to Fublio_bank, - cant_go "You amble around the local area a bit, and return here.", - has light; - -Object Fublio_bank "Abandoned Bank" - with description "You're inside what must have once been a \ -small branch office of the once indestructible Bank of Zork. \ -However, the place has clearly been abandoned, and age has not \ -been kind. Even the required portrait of J. Pierpont Flathead \ -has been pilfered. An exit lies south.", - s_to [; -! first case, r & (!p & !q & !s) - if ((children(r_vault) == 20) && - (children(p_vault) == 0) && - (children(q_vault) == 0) && - (children(s_vault) == 0)) return FUBLIO_GUSStop; -! second case, (p & s) & (q & !r) - if (((children(s_vault) > 0) && - (children(p_vault) == children(s_vault))) && - ((children(q_vault) == (children(p_vault) + 5)) && - (children(r_vault) ~= 20))) - return FUBLIO_GUSStop; - "A buzzer sounds, and some mysterious force \ -prevents you from leaving!"; - ], - has light; - -Class vault_class - with name "vault", - description "Basically a hollow rectangular hole cut \ -into the wall.", - before [; - Receive: -if (noun hasnt is_coin) - "A strange force pushes your hand away."; - ], - capacity 100, - size 10, -has static container open transparent; - -Object p_vault "interest vault" Fublio_bank - class vault_class, - with name "interest", - initial [; - print "An vault labeled ~INTEREST PAID~ is \ -open in the wall"; -if (children(self) > 0) { - print ". Inside"; - WriteListFrom(child(self), FULLINV_BIT + ENGLISH_BIT + ISARE_BIT); -} -"."; - ], -; -Object q_vault "overhead vault" Fublio_bank - class vault_class, - with name "overhead", - initial [; -print "An vault labeled ~OVERHEAD~ is \ -open in the wall"; -if (children(self) > 0) { - print ". Inside"; - WriteListFrom(child(self), FULLINV_BIT + ENGLISH_BIT + ISARE_BIT); -} -"."; - ], -; -Object r_vault "basis vault" Fublio_bank - class vault_class, - with name "basis", - initial [; -print "An vault labeled ~BASIS~ is \ -open in the wall"; -if (children(self) > 0) { - print ". Inside"; - WriteListFrom(child(self), FULLINV_BIT + ENGLISH_BIT + ISARE_BIT); -} -"."; - ], -; -Object s_vault "loans vault" Fublio_bank - class vault_class, - with name "loans", - initial [; -print "An vault labeled ~LOANS~ is \ -open in the wall"; -if (children(self) > 0) { - print ". Inside"; - WriteListFrom(child(self), FULLINV_BIT + ENGLISH_BIT + ISARE_BIT); -} -"."; - ], -; - - -Object bank_memo "bank memo" Fublio_bank - with name "memo", -description "BANK WORKER GUIDELINES^^\ -If at any point, account activity has been suspended \ -(i.e. all regular account vaults have no funds) then \ -it must be ensured that 20 zorkmids remain in basis, \ -for potential loan requests.^^\ -Otherwise, vaults must be maintained as follows:^^\ -For interest waiting to be paid, the amount must \ -equal the amount held in the loan payments vault. \ -If this amount goes over the loan payments, talk \ -to your local gnome manager to see about getting \ -some outstanding loans paid back.^^\ -Overhead should be kept at the amount in interest, -plus five.^^\ -Loan payments should be kept at a positive amount.^^\ -Make sure that both the loan and interest vaults \ -are maintained properly, and at the same time, the \ -overhead vault is maintained while the basis vault \ -is kept at a non-suspended bank amount. If this \ -is not the case, you may need to put some overtime \ -in to straighten out the bank funds.", - size 15; - -Object c30 "coin" r_vault class coin_class; -Object c31 "coin" r_vault class coin_class; -Object c32 "coin" r_vault class coin_class; -Object c33 "coin" r_vault class coin_class; -Object c34 "coin" r_vault class coin_class; -Object c35 "coin" r_vault class coin_class; -Object c36 "coin" r_vault class coin_class; -Object c37 "coin" r_vault class coin_class; -Object c38 "coin" r_vault class coin_class; -Object c39 "coin" r_vault class coin_class; -Object c40 "coin" r_vault class coin_class; -Object c41 "coin" r_vault class coin_class; -Object c42 "coin" r_vault class coin_class; -Object c43 "coin" r_vault class coin_class; -Object c44 "coin" r_vault class coin_class; -Object c45 "coin" r_vault class coin_class; -Object c46 "coin" r_vault class coin_class; -Object c47 "coin" r_vault class coin_class; -Object c48 "coin" r_vault class coin_class; -Object c49 "coin" r_vault class coin_class; - -Object Farm "Farm" - with description "You're standing in front of a small farmhouse. \ -A trail leads northeast, a sand bar lies to the southwest, \ -and another trail heads east.", - name "trail", - ne_to FUBLIO_GUSStop, - sw_to Veg_fields, - e_to Grasslands, - has light; - -Nearby farmhouse "farmhouse" - with name "farmhouse" "house", - description "A small farmhouse, barely a shack.", - before [; - Enter: "The farmhouse is run-down enough already without you \ - stomping around in it."; - ], - has scenery; - -Object Veg_fields "Oyster Farm" - with description [; - print "A coastline sand bar curves west a short distance \ -here, ending in a shoal of large rocks. Nearby, \ -someone has dug some shallow holes in the \ -sand, probably farming for live Rotund Oysters, a popular \ -Eastland delicacy."; - if (self hasnt general) -"Unfortunately, the oyster \ -beds are too far inland, and they appear to be \ -empty. A bit to the west you can see a small \ -shoreline cave in the rocks."; - else -"The oyster \ -beds are filled with water (similar to a good portion \ -of the shoal) and look well stocked!"; - ], - name "sand" "bar" "shoal" "rocks" "cave", - before [; -Fill: "Seawater is hardly a rare commodity these days."; - ], - ne_to Farm, - w_to [; - if (self hasnt general) { - print "You try to head towards the cave, but \ -the unstable rocks and sea waves make it "; - if (FUBLIO_Cave hasnt general) { - give FUBLIO_Cave general; - print "difficult \ -to get there from here. Suddenly, a rock slips from underfoot! \ -You fall...^"; - return FUBLIO_Cave; - } - else - print "impossible \ -to get there from here.^"; return 1; - } - else - "Any remainder of the sand bar west is \ -now submerged by a high tide or rise in the sea."; - ], - has light; - -Nearby oyster_beds "oyster beds" - with name "beds" "holes" "hole", - description [; - print "Some shallow"; - if (Veg_fields hasnt general) - ", mostly empty holes in the sand."; - " holes in the sand, filled with sea water."; - ], - before [; - Search: - if (Veg_fields has general) - "You find a couple immature oysters, and throw \ -them back."; - Receive: - "Someone is obviously trying to use these holes \ -for oyster farming. Best to leave them as you found them."; - ], - has scenery; - -Object FUBLIO_Cave "Dark Damp Cave" - with description [; - print "You seem to be in some underground cave. "; - if (FUBLIO_Cave.number == 1) -"There are no visible exits. You feel rather claustrophobic. \ -You also hear some unexpected noises."; - else -"There is a small dark tunnel leading south. \ -You hear the sounds of rushing water from somewhere nearby."; - ], - number 1, - name "tunnel", - s_to [; - if (FUBLIO_Cave.number == 1) - "You can't go that way."; - if (FUBLIO_Cave.number == 3) - "The dark tunnel becomes blocked after a short distance \ -by a great tidal swell! The sea has risen above the entrance!"; - else { - print "^You crawl through the dark tunnel, which \ -seems to snake back and forth. After what seems like an \ -eternity, you see daylight, and stumble forward. You find \ -yourself on the sand bar again! Looking back, you can't \ -locate the tunnel you just left at all!^"; - FUBLIO_Cave.number = 3; - return Veg_fields; - } - ], - before [; - Listen: "You hear the sounds of the sea all around you."; - Smell: "You smell the musty odor of the sea."; - ], -; - - - -Object Grasslands "Grassland Beach" - with description [; - if (self hasnt general) - print "A nice beach with lots of tall grasses hides \ -behind a short dune here. The Great Sea stretches out \ -to the south."; - else - print "A deep marsh hides behind a short dune here. The Great Sea \ - is making some inroads here, apparently. That volcano in \ - the water to the south may have had something to do with it."; - " From here, you can go north, west or east. \ - You can just glimpse some sort of tower-like structure \ - far across the bay in the east."; - ], - name "beach" "grasses" "dune" "marsh" "sea" "tower", - w_to [; - if (player in sailboat) - "You'll have to get out of the sailboat first."; - else return Farm; - ], - e_to [; - if (player in sailboat) - "You'll have to get out of the sailboat first."; - else return Fublio_forest; - ], - n_to [; - if (player in sailboat) - "You'll have to get out of the sailboat first."; - else return FUBLIO_GUSStop; - ], - s_to [; - if (player in sailboat) return On_Fublio_bay; - else - "The tides here make swimming unadvisable."; - ], - before [; - Swim: - "The tides here make swimming unadvisable."; - ], - has light; - -Nearby sailboat "small sailboat" - with name "sailboat" "boat", - description [; - if (self hasnt general) - "A nice little sailboat that looks pretty sea-worthy. \ -The word ~MINIRVA~ is painted on one side."; - "A badly damaged sailboat. Several places bear deep \ -cracks, as though the boat had been tossed in a violent storm."; - ], - before [; - Go: - if (self has general) { - print "In it's current condition, this boat is lucky to \ - be floating.^"; - return 2; ! disallow movement but say nothing - } - else rtrue; - Cast: - if (the_spell_was == fiznav_spell) { - print "You perform a nice liturgy to the Sea Gods,"; - if (self has general) { - give self ~general; - Achieved(6); - " and before your very eyes, the sailboat repairs itself!"; - } - else " however the boat seems unchanged."; - } - Take: - "That's too cumbersome to carry."; - ], - capacity 15, - size 30, - has enterable static container open; - -! Object c6 "coin" sailboat class coin_class; - -Object On_Fublio_bay "On Fublio Bay" - with description [; - print "You are sailing on Fublio Bay. A shoreline lies \ -to the north. You could probably sail out of the bay \ -to the south, but I'd advise against it, \ -the winds aren't very strong. To the northeast \ -you can see "; - if (self hasnt general) - "the tip \ - of a peninsula where a lighthouse tower is standing."; - else - "a partially submerged lighthouse tower. \ - Also, to the southeast is a small volcanic island where \ - you could probably land."; - ], - name "shoreline" "bay" "peninsula" "tower" "lighthouse" -"island", - n_to Grasslands, - s_to Lost_at_sea, - ne_to [; - if (self hasnt general) - "The winds blow the wrong way, and you end up back here."; - else return Lighthouse2; - ], - se_to [; - if (self hasnt general) - "You can't go that way."; - else return Volcano_island; - ], - before [; - Go: - if (noun==s_obj) - print "^A sudden gust of wind sends your small craft \ - skimming out of control!^"; - Swim, Exit: - if (player in sailboat) - "The water's pretty deep here. I'd stay in the boat."; - Fill: "Seawater is hardly a rare commodity these days."; - ], - each_turn [; - if (seawater.number == 5) { - seawater.number = 10; - "^Many large bubbles are coming from somewhere deep in the \ - seawater near you, as though the water was boiling! Also, \ - you see some dark shape in the depths below rising!"; - } - if (seawater.number == 4) { - seawater.number = 5; - "^There appears to be a steady stream of bubbles coming from \ - somewhere deep in the water near you! Also, you see something \ - dark rising from the depths below you!"; - } - if (seawater.number == 3) { - seawater.number = 4; - "^You notice a few small bubbles rise to the surface of the sea."; - } - if (seawater.number == 2) - seawater.number = 3; - ], - - has light; - -Object Lost_at_sea "Lost at Sea" - with description [; - print "You're lost at sea. The winds are completely dead. \ -They managed to take you quite a ways out before they died, \ -however, and it's currently hard to tell which way land was \ -from here"; - if (self has general) - ". Oddly, there's a volcano far out to the south, \ - still smoldering from a recent eruption."; - else "."; - ], - name "sea" "winds" "land", - cant_go "The winds are dead, and you're not going anywhere.", - before [; - Swim, Exit: - if (player in sailboat) - "The water's pretty deep here. I'd stay in the boat."; - Fill: "Seawater is hardly a rare commodity these days."; - ], - each_turn [; - if (seawater.number == 9) { - seawater.number = 11; - "^Many large bubbles are coming from somewhere deep in the \ - seawater near you, as though the water was boiling! Also, \ - you see some dark shape in the depths below rising!"; - } - if (seawater.number == 8) { - seawater.number = 9; - "^There appears to be a steady stream of bubbles coming from \ - somewhere deep in the water near you."; - } - if (seawater.number == 7) { - seawater.number = 8; - "^You notice a small bubble rise to the surface of the sea."; - } - if (seawater.number == 6) - seawater.number = 7; - ], - has light; - -Object Fublio_forest "On Peninsula" - with description [; - print "You stand "; - if (self hasnt general) - "in a clearing on a grassland peninsula. A \ - trail leads northwest from here, and another leads west. \ - Off to the \ - southeast, there's an entrance into what looks like an old \ - abandoned lighthouse, just at the tip of the peninsula."; - if (self has general) - "on the southeast tip of a grassland peninsula. A \ - trail leads northwest from here, and another leads west. Off to the \ - southeast, you can see the top of what looks like a \ - lighthouse, partially submerged in the Great Sea."; - ], - name "clearing" "grassland" "peninsula" "trail" -"tower" "lighthouse" "sea", - nw_to FUBLIO_GUSStop, - w_to Grasslands, - se_to [; - if (self has general) - "Looks like you'd need a boat to get out to that \ - lighthouse now."; - else return Lighthouse1; - ], - has light; - -Object Lighthouse1 "Bottom of Lighthouse" - with description [; - print "You're inside an ancient lighthouse. The place \ - must have been deserted quite a long time ago, and \ - is now a mess of broken stone, cobwebs and seabird \ - droppings. The rest of the peninsula is back \ - northwest. You can see a hole above where a stairway \ - probably entered an upper floor of the place, but \ - the stairway itself crumbled into dust long ago"; - if ((self hasnt general) && (amulet has worn)) { - give self general; - ".^^Your amulet suddenly gives off a bright purple flash, then \ - returns to normal!"; - } - else "."; - ], - name "stone" "cobwebs" "droppings" "hole", - nw_to Fublio_forest, - u_to "The hole is too far above you.", - has light; - -! more scenery stuff. This one's key though -! (Sidenote: Here's an example of a situation where one would probably -! want an object that could be both a supporter and a container -- -! i.e. objects that float or sink could be handled easily.) -Object seawater "water" - with name "water" "sea" "ocean", - description "Salty blue-green water surrounds you.", - time_left 0, - number 1, - weight 0, - size 100, - before [; - ThrownAt, Receive: - if (noun == toy_volcano) { - if (location == On_Fublio_bay) { - seawater.number = 2; - seawater.weight = 1; - } - else { - seawater.number = 6; - seawater.weight = 2; - } - StartTimer(self,3); - remove toy_volcano; - "The toy volcano drops into the water and sinks like a stone."; - } - else { - remove noun; - if (noun == umbrella && umbrella has open) - "The umbrella seems to float on the water like a \ -cloth dome for a short bit, but eventually sinks into the water."; - CDefArt(noun); " sinks into the water and is soon out of sight."; - } - Push, Pull, Turn, Take, Attack, Rub, Squeeze: "The sea water runs through your fingers."; - Taste, Drink: "It's just salty sea water."; - Search, LookUnder: - if (seawater.weight > 0 && seawater.number < 12) - "There's something down there all right!"; - else { - if (random(10) < 2) - "You glimpse a large grouper swimming under the \ -water, and watch it swim away."; - else - "The water seems choppy and deep. You notice \ -nothing beneath the waves at the moment."; - } - ], - found_in On_Fublio_bay Lost_at_sea, - time_out [ ; - ! a fairly simple event here, but nonetheless dramatic... - ! -- 1st, if we dropped the volcano in the bay (correct) - ! set water descriptions so that player won't see bubbles - seawater.number = 12; - ! set CAVE number for endgame - FUBLIO_Cave.number = 3; - if (seawater.weight == 1) { - ! first, set up all room generals so that descriptions are - ! changed. - give Grasslands general; - give Veg_fields general; - give Fublio_forest general; - give farmer general; ! he'll give player sphere next encounter - give sailboat general; ! damages sailboat, regardless of where it is - move sailboat to Grasslands; - ! Modify On_Fublio_bay paths, new one to island, new one to tower. - give On_Fublio_bay general; - ! Now, check location. Certain areas will kill player in - ! tidalwave. Certain areas will cause an audible explosion. - ! Remainder do nothing (but shouldn't happen) - if (location == Veg_fields or Grasslands or Lighthouse1) { - deadflag = 1; - "^There's a massive explosion from the south! You turn \ - and rub your eyes in disbelief. There's a \ - volcano rising out of the sea! Unfortunately, \ - there's also a large tidalwave headed your way \ - (caused by volcanic eruption at sea, no doubt) which \ - engulfs you as you try to scramble for higher ground! \ - You struggle valiantly, but drown in deep water."; - } - if (location == FUBLIO_GUSStop or Farm or Fublio_forest) { - "^You hear a massive explosion from the south! \ - It sounded pretty far off, but whatever it was, it \ - was loud."; - } - if (location == On_Fublio_bay) { - deadflag = 1; - "^Suddenly, the water around you literally lifts you into \ - the sky in an enormous explosion! The last thing you \ - see is the emerging mouth of an active and hungry volcano!"; - } - if (location == Lost_at_sea) { - deadflag = 1; - "^You hear a large explosion off to the north! \ -A massive tidal swell rushes by and tosses your small craft violently, \ -knocking you into the water. As you watch the waves carry the boat -away, a giant grouper swims up and swallows you."; - } - } - ! -- else, we dropped it in the sea (bummer) - ! (this implies that 1) only the sea descrp will change, - ! 2) the player is still stuck at sea, and will be killed - ! for his trouble. - else { - give sailboat general; ! just keeping with the story... - give Lost_at_sea general; - move sailboat to Grasslands; ! made it back to shore somehow... - deadflag = 1; - "^Suddenly, the water around you literally lifts you into \ - the sky in an enormous explosion! The last thing you \ - see is the emerging mouth of an active and hungry volcano!"; - } - ], - has scenery container open; - - -Object Lighthouse2 "Near Submerged Lighthouse" - with description [; - print "You're on the outside of what looks like the upper \ - part of a lighthouse, sticking straight out of the sea. \ - The lighthouse is broken in many places, and several areas \ - provide ledge-space to stand on. In fact, you could probably \ - climb into the lighthouse through one of many large \ - cracks in the walls to the east. The rest of Fublio bay \ - is back southwest"; - if ((self has general) || (Lighthouse1 has general) || - (amulet hasnt worn)) - "."; - else { - give self general; - ".^^Your amulet suddenly gives off a bright purple flash, then \ - returns to normal!"; - } - ], - name "lighthouse" "cracks", - e_to [; - if (player in sailboat) - "You'll need to get out of the boat first."; - else return In_lighthouse; - ], - ! in_to [; - ! if (player in sailboat) - ! "You'll need to get out of the boat first."; - ! else return In_lighthouse; - ! ], - sw_to [; - if (player notin sailboat) - "The water looks pretty choppy. I'd suggest you use a \ - sea-going vessel of some sort."; - else return On_Fublio_bay; - ], - has light; - - -Object Volcano_island "Volcanic Island" - with description "You're on the north shore of a small volcanic \ - island in the middle of Fublio bay. A little more \ - shore lies to the south. The bay spreads out before \ - you to the northwest.", - name "bay", - nw_to [; - if (player notin sailboat) - "The water looks pretty choppy. I'd suggest you use a \ - sea-going vessel of some sort."; - else return On_Fublio_bay; - ], - s_to [; - if (player in sailboat) - "You'll need to get out of the boat first."; - else return Island2; - ], - before [; - Swim: "Near a still-active volcano? Not wise."; - ], - has light; - -Object Island2 "South Part of Island" - with description "You're on a southern section of a small \ - volcanic island in the middle of Fublio bay. Most \ - of the area here is lava-rock, still warm. You can \ - see a more open shore to the north.", - name "bay" "rock" "lava" "shore", - n_to Volcano_island, - before [; - Swim: "Near a still-active volcano? Not wise."; - ], - has light; - -Nearby shipwreck "old shipwreck" - with name "shipwreck" "wreck" "ship", - initial "An old shipwreck is almost embedded in the lava \ - here.", - description "It looks like an old navy vessel, \ - stuck fast in the surrounding rock. Its obviously \ - been underwater for some time, as it is covered in \ - barnacles and seaweed. The hull has partially rotted apart \ - in many places.", - before [; - Enter: - "You find that anything left to enter in the wreck \ - has pretty much decayed away."; - Cast: - if (the_spell_was == fiznav_spell) - "You perform a nice ritual to the Sea Gods, and \ - before your very eyes, the ship attempts to repair \ - itself! But there's too much damage, and not \ - even the aid of the Sea Gods can fix this craft. \ - The chant fails."; - Search: - if (self has general) { - move green_rod_piece to parent(self); - give self ~general; - Achieved(7); - "Something about the old boat rings a familiar tune. \ -You check near something that might have once been a mast, and \ -uncover a familiar green rod!"; - } - ], - has static; - -Object In_lighthouse "Lighthouse, upper level" - with description "You're inside an abandoned lighthouse, on what \ - must be an upper floor. The whole interior is lifeless and \ - barren. There's a large broken crack in the western wall. \ - You also notice a hole in the floor nearby, which might \ - have been an exitway a long, long time ago.", - name "crack" "hole", - w_to [; - if (water_spirit in self) - "The water spirit buffets you with water and \ - prevents you from leaving."; - else return Lighthouse2; - ], - d_to [; - deadflag = 1; - "You drop through the hole, and land in cold dark water! \ - Trapped in an enclosed pool of seawater, with the hole \ - too far above you, you drown shortly afterwards."; - ], - before [; - Listen: "You hear some sloshing noises from below the floor."; - ], -has light; - - - -! ************ -! creatures -! ************ - -Object farmer "farmer" Farm - with name "farmer", - initial "There's a tired-looking farmer here.", - description "It looks like he's been working pretty hard \ - in the sun.", - each_turn [; - if (self hasnt general) { - if (random(10) == 1) - "^~'Forget zucchini,' they told me, 'Go into oyster \ - farming. You'll make a fortune.' Ha!~"; - } - else { - remove farmer; - move silver_sphere to player; - "^The farmer sees you approach and rushes to \ - greet you. ~I saw what you did, sir, yes indeed. \ - A mighty crazy thing to do, calling a volcano outa \ - the water like that. But you did it! And \ - my oyster beds thank you kindly! I'd like to \ - repay the favor, but I'm only a poor farmer.~ He \ - pauses, then searches his pockets. ~Here,~ he says, \ - putting something in your hand. ~Found it digging in \ - the sand. Don't know what it is, but I'll bet you \ - can use it.~ He smiles and disappears into the \ - farmhouse."; - } - ], - life [; - Attack, ThrowAt: - "Something about attacking a down-on-his-luck \ -farmer just doesn't seem right, so you stop."; - Answer: - if (special_word == 'hello') - "The farmer nods in your direction. \ -~How do, stranger?~"; - Ask: - if (second == 'oyster' or 'farm' or 'oysters') - "~Did a foolish thing, sir, tried my luck with \ - oyster farming this year. The place is too far \ - from the sea, and I can't get any oysters in my \ - beds, 'cause there's no water to grow 'em in.~"; - Show: - if (noun has is_sphere) - "~Hey, I seen something like that once.~"; - Give, Tell: - "The farmer smiles, but shakes his head."; - default: "The farmer is preoccupied with something as \ -he squints into the sun."; - ], - before [; - Cast: - if (the_spell_was == foblub_spell or espnis_spell) -"~I'm just a simple farmer, sir. I'm afraid you're losing me \ -with your fancy words.~"; - ], - has animate; - -Object water_spirit "water spirit" In_Lighthouse - with name "spirit", - description "It looks like a large moving mass of seawater, \ - in a somewhat man-like shape.", - 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; - "^Suddenly, water seeps in from the west, and forms \ - into a large vaguely-humanoid shape before your very \ - eyes!"; - } - i = random(5); - if (i == 1) { - deadflag = 1; - "^The water creature moves quickly, and smothers you \ - in water! You try to escape, but the creature has \ - amazing strength and weight! The spirit soon \ - envelopes your head, and you drown..."; - } - 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 water spirit was too much for \ - you, I'm afraid to say. You sink to the ground, to \ - weak to defend yourself, as the spirit slowly oozes \ - towards you for the final blow..."; - } - print "^The water spirit "; - if (i==2) - "blasts you with a jet of seawater! \ - It feels like a battering ram just used you for a \ - practice drawbridge!"; - if (i==3) - "buffets you with small jets of water! \ - You feel exposed areas of skin getting rubbed raw by \ - the force of the water!"; - "forms into a small wave and tries to \ - crush you, but you evade just in time!"; - ], - before [; - Cast: - if (the_spell_was == swanko_spell) { - remove self; - "As you speak the chant, the water spirit falls back \ - in fear! You finish the chant, and the water spirit \ - makes one last attempt to smother you, but dissipates \ - with a splash!"; - } - print "The creature makes a banshee-howl as you chant.^"; - ], - life [ ; - Attack: - print "You "; - if (random(20) >= 8) - "strike the water creature, but your attack passes \ - harmlessly through it! You hear a strange noise from \ - the creature -- akin to a drowning man laughing."; - "attack the water spirit, but miss!"; - default: "It's too busy trying to kill you."; - ], - has animate concealed; - -Object mad_hermit "mad hermit" FUBLIO_Cave - with name "hermit" "madman" "mad", - description "He looks quite crazed -- his wild eyes \ -are almost unbearable to watch. His clothes are complete \ -tatters, and he looks rather emaciated.", - each_turn [ i ; - i = random(10); - switch(i) { - 1: "^The hermit stares at you and screams. \ -~Demon, trickster -- you'll not fool me again!~"; - 2: "^The hermit smiles at you. ~Come to pay \ -your respects to an old man, Humboz? I know it's you.~"; - 3: "^The hermit shrinks into a corner and weeps. ~No more, no more. I \ -can help you no more.~"; - 4: "^The hermit hums a little tune."; - 5: "^The hermit talks to someone or thing unseen. \ -~Closer, closer, nary a sound betray...~"; - 6: "^The hermit grabs your shoulder. ~I am hampered,~ \ -he pleads with you, ~by the lack of an algebraic solution! \ -That was where I went wrong!~"; - 7: "^The hermit babbles something about a shining \ -tower on a hill."; - 8: "^The hermit pauses. ~Listen, do you hear them? \ -The voices -- everywhere!~"; - default: "^The hermit giggles for no reason."; - } - ], - life [; - Answer: - if (special_word=='hello') - "~We meet again, do we not?~"; - Ask: - switch (second) { - 'exit', 'outside': "The hermit laughs. \ -~You want to leave already? Very well, you'll find \ -the exit where you came in.~"; - 'entrance': - print "The hermit chuckles. ~Forgotten where \ -you came in? It hasn't gone anywhere."; - if (FUBLIO_Cave.number == 1) { - FUBLIO_Cave.number = 2; - "~ He points at a space in the south wall, which \ -you realize is actually a well-hidden tunnel."; - } - else "~"; - ! 'sack': "~A fine pet, mine and mine forever.~"; - 'food', 'fish': "~My friends of the deep, they \ -sacrifice themselves for me, as I will some day for them.~"; - default: "~Many are the secrets you keep.~"; - } - Give: - if (noun has edible) { - print "The hermit greedily takes ", (the) noun, " and \ -gobbles it quickly"; - remove noun; - if (p1 in self) { - move p1 to player; - print ". ~Good, yes. \ -I have something for you -- something you will treasure as I have.~ He \ -gives you a piece of parchment."; - } - "."; - } - "~No, no, I already have many of those.~"; - Attack, ThrowAt, Order: - "The hermit cowers in one corner of \ -the cave, screaming. You stop, and reconsider."; - Kiss: - "Tears run down the hermit's cheek."; - Show, Tell: - if (noun has edible) - "The hermit visibly salivates."; - "The hermit gibbers maniacally."; - ], - before [; - Cast: - "The hermit joins in with your chanting, and \ -twists the meaning of the words! You quickly stop."; - ], - time_left 0, - time_out [; - deadflag = 1; - "^The hermit seems to recognize you through his madness! \ -~You have returned! The Big Man! Biggest of them all! \ -Returned to deliver me from my prison. I had never forsaken \ -you!~^^\ -~Wait,~ you protest, ~stop this madness!~^^\ -But the crazed hermit continues. He prostrates in front \ -of you and babbles incoherently. ~I put all my faith \ -in you -- I have to leave here, before I go insane! \ -The others, they abandoned hope. But not me. No! \ -You have always had our best interests in mind.~^^\ -He begins an eerie, frenetic song that jars your very soul. \ -You watch the water level start to rise near the southern \ -entrance, and wait for the end."; - ], - has animate transparent; - - - -! ************ -! spells/scrolls -! ************ - -Object spotted_scroll "spotted scroll" FUBLIO_Cave - class scroll_class, - with name "spotted", -; - -Object bekdab_spell "turn iron to rust" spotted_scroll - class spell_class, - with name "bekdab", - magic [; - "Your chant goes unanswered. I guess you need pure iron."; - ], -; - -! ************ -! Misc objects -! ************ - - -Object sack "fur sack" sailboat - with name "sack" "fur", - description "A fairly large sack made of furs and animal \ -hides.", - ! weight 20, - size 24, - ! capacity 20, - has container openable; - -! (wet -- Anabais is one of four evil elemental powers) -Object p1 "wet parchment" mad_hermit - class parchment_class, - with name "wet", -description "~...evidence that there are more demons like \ -the evil Anabais! In fact, I suspect that four demons, not \ -one, faced the Ancient Ones in spiritual battle at the \ -dawn of time! To suspect this is...~"; - - -! 1st rod piece -- GRAY -Object gray_rod_piece "gray rod piece" In_Lighthouse - class rod_class, - with name "gray", - initial "In the center of the room is a short gray rod.", - description "It's a short section of a rod made of some \ -undeterminable hard substance, \ -colored gray like murky water. A piece of the Rod of \ -the Ancients, no doubt!", -; - -! 1st sphere - SILVER -Object silver_sphere "silver sphere" - class sphere_class, - with name "silver", - description "A tiny perfect silver sphere, made of some strange \ - unknown metal.", -; - diff --git a/src/GAMBIT2.INF b/src/GAMBIT2.INF deleted file mode 100644 index 05f4037..0000000 --- a/src/GAMBIT2.INF +++ /dev/null @@ -1,353 +0,0 @@ - -! (level 2) - -Class Gambit_Room_Lev2_Class - with description "You are on the surface of a floating stone \ -cube. You can barely see another cube floating far above you in the \ -dim red light that illuminates the entire area.", - name "stone" "cube" "light", -has light; - -Object GAMBIT_21 "On Giant White Cube" - class Gambit_Room_Lev2_Class - with w_to - [ i ; - i = CheckGambit(n212,n312,2); - if (i ~= 2) return i; - else return GAMBIT_W21; - ], - s_to - [ i ; - i = CheckGambit(n213,n313,2); - if (i ~= 2) return i; - else return GAMBIT_W22; - ], -; - -Object GAMBIT_22 "On Giant White Cube" - class Gambit_Room_Lev2_Class - with e_to - [ i ; - i = CheckGambit(n224,n324,2); - if (i ~= 2) return i; - else return GAMBIT_W21; - ], - w_to - [ i ; - i = CheckGambit(n222,n322,2); - if (i ~= 2) return i; - else return GAMBIT_W21; - ], - s_to - [ i ; - i = CheckGambit(n223,n323,2); - if (i ~= 2) return i; - else return GAMBIT_W22; - ], -; - -Object GAMBIT_23 "On Giant White Cube" - class Gambit_Room_Lev2_Class - with e_to - [ i ; - i = CheckGambit(n234,n334,2); - if (i ~= 2) return i; - else return GAMBIT_W21; - ], - s_to - [ i ; - i = CheckGambit(n233,n333,2); - if (i ~= 2) return i; - else return GAMBIT_W22; - ], -; - -Object GAMBIT_24 "On Giant White Cube" - class Gambit_Room_Lev2_Class - with w_to - [ i ; - i = CheckGambit(n242,n342,2); - if (i ~= 2) return i; - else return GAMBIT_W21; - ], - n_to - [ i ; - i = CheckGambit(n241,n341,2); - if (i ~= 2) return i; - else return GAMBIT_W22; - ], - s_to - [ i ; - i = CheckGambit(n243,n343,2); - if (i ~= 2) return i; - else return GAMBIT_W22; - ], -; - -Object GAMBIT_25 "On Giant White Cube" - class Gambit_Room_Lev2_Class - with e_to - [ i ; - i = CheckGambit(n254,n354,2); - if (i ~= 2) return i; - else return GAMBIT_W21; - ], - w_to - [ i ; - i = CheckGambit(n252,n352,2); - if (i ~= 2) return i; - else return GAMBIT_W21; - ], - n_to - [ i ; - i = CheckGambit(n251,n351,2); - if (i ~= 2) return i; - else return GAMBIT_W22; - ], - s_to - [ i ; - i = CheckGambit(n253,n353,2); - if (i ~= 2) return i; - else return GAMBIT_W22; - ], -; - -Object GAMBIT_26 "On Giant White Cube" - class Gambit_Room_Lev2_Class - with e_to - [ i ; - i = CheckGambit(n264,n364,2); - if (i ~= 2) return i; - else return GAMBIT_W21; - ], - n_to - [ i ; - i = CheckGambit(n261,n361,2); - if (i ~= 2) return i; - else return GAMBIT_W22; - ], - s_to - [ i ; - i = CheckGambit(n263,n363,2); - if (i ~= 2) return i; - else return GAMBIT_W22; - ], -; - -Object GAMBIT_27 "On Giant White Cube" - class Gambit_Room_Lev2_Class - with w_to - [ i ; - i = CheckGambit(n272,n372,2); - if (i ~= 2) return i; - else return GAMBIT_W21; - ], - n_to - [ i ; - i = CheckGambit(n271,n371,2); - if (i ~= 2) return i; - else return GAMBIT_W22; - ], -; - -Object GAMBIT_28 "On Giant White Cube" - class Gambit_Room_Lev2_Class - with w_to - [ i ; - i = CheckGambit(n282,n382,2); - if (i ~= 2) return i; - else return GAMBIT_W21; - ], - n_to - [ i ; - i = CheckGambit(n281,n381,2); - if (i ~= 2) return i; - else return GAMBIT_W22; - ], - e_to - [ i ; - i = CheckGambit(n284,n384,2); - if (i ~= 2) return i; - else return GAMBIT_W21; - ], -; - -Object GAMBIT_29 "On Giant White Cube" - class Gambit_Room_Lev2_Class - with e_to - [ i ; - i = CheckGambit(n294,n394,2); - if (i ~= 2) return i; - else return GAMBIT_W21; - ], - n_to - [ i ; - i = CheckGambit(n281,n381,2); - if (i ~= 2) return i; - else return GAMBIT_W22; - ], -; - - -! (level 2 niches) - -Object n213 "southern niche" GAMBIT_21 - class niche_class - with name "southern", - counter_niche n241, - niche_dir 3; -Object n212 "western niche" GAMBIT_21 - class niche_class - with name "western", - counter_niche n224, - niche_dir 2; - -Object n224 "eastern niche" GAMBIT_22 - class niche_class - with name "eastern", - counter_niche n212, - niche_dir 4; -Object n223 "southern niche" GAMBIT_22 - class niche_class - with name "southern", - counter_niche n251, - niche_dir 3; -Object n222 "western niche" GAMBIT_22 - class niche_class - with name "western", - counter_niche n234, - niche_dir 2; - -Object n234 "eastern niche" GAMBIT_23 - class niche_class - with name "eastern", - counter_niche n222, - niche_dir 4; -Object n233 "southern niche" GAMBIT_23 - class niche_class - with name "southern", - counter_niche n261, - niche_dir 3; - -Object n241 "northern niche" GAMBIT_24 - class niche_class - with name "northern", - counter_niche n213, - niche_dir 1; -Object n242 "western niche" GAMBIT_24 - class niche_class - with name "western", - counter_niche n254, - niche_dir 2; -Object n243 "southern niche" GAMBIT_24 - class niche_class - with name "southern", - counter_niche n271, - niche_dir 3; - -Object n251 "northern niche" GAMBIT_25 - class niche_class - with name "northern", - counter_niche n223, - niche_dir 1; -Object n254 "eastern niche" GAMBIT_25 - class niche_class - with name "eastern", - counter_niche n242, - niche_dir 4; -Object n252 "western niche" GAMBIT_25 - class niche_class - with name "western", - counter_niche n264, - niche_dir 2; -Object n253 "southern niche" GAMBIT_25 - class niche_class - with name "southern", - counter_niche n281, - niche_dir 3; - -Object n264 "eastern niche" GAMBIT_26 - class niche_class - with name "eastern", - counter_niche n252, - niche_dir 4; -Object n261 "northern niche" GAMBIT_26 - class niche_class - with name "northern", - counter_niche n233, - niche_dir 1; -Object n263 "southern niche" GAMBIT_26 - class niche_class - with name "southern", - counter_niche n291, - niche_dir 3; - -Object n271 "northern niche" GAMBIT_27 - class niche_class - with name "northern", - counter_niche n243, - niche_dir 1; -Object n272 "western niche" GAMBIT_27 - class niche_class - with name "western", - counter_niche n284, - niche_dir 2; - -Object n281 "northern niche" GAMBIT_28 - class niche_class - with name "northern", - counter_niche n253, - niche_dir 1; -Object n282 "western niche" GAMBIT_28 - class niche_class - with name "western", - counter_niche n294, - niche_dir 2; -Object n284 "eastern niche" GAMBIT_28 - class niche_class - with name "eastern", - counter_niche n272, - niche_dir 4; - -Object n291 "northern niche" GAMBIT_29 - class niche_class - with name "northern", - counter_niche n263, - niche_dir 1; -Object n294 "eastern niche" GAMBIT_29 - class niche_class - with name "eastern", - counter_niche n282, - niche_dir 4; - -! (level 2 initial wood beam layout) - -Object e21 "ebony beam" n282 class ebony_beam_class; -Object e211 "ebony beam" n294 class ebony_beam_class with number 99; - -Object p21 "pine beam" n213 class pine_beam_class; -Object p211 "pine beam" n241 class pine_beam_class with number 99; -Object p22 "pine beam" n243 class pine_beam_class; -Object p221 "pine beam" n271 class pine_beam_class with number 99; -Object p23 "pine beam" n242 class pine_beam_class; -Object p231 "pine beam" n254 class pine_beam_class with number 99; -Object p24 "pine beam" n252 class pine_beam_class; -Object p241 "pine beam" n264 class pine_beam_class with number 99; - -! (side note: with balsa beams, 2nd side need not be 99, since -! it will always break on the first try, and the default number is 0 -Object b21 "balsa beam" n212 class balsa_beam_class; -Object b211 "balsa beam" n224 class balsa_beam_class; -Object b22 "balsa beam" n222 class balsa_beam_class; -Object b221 "balsa beam" n234 class balsa_beam_class; -Object b23 "balsa beam" n223 class balsa_beam_class; -Object b231 "balsa beam" n251 class balsa_beam_class; -Object b24 "balsa beam" n233 class balsa_beam_class; -Object b241 "balsa beam" n261 class balsa_beam_class; -Object b25 "balsa beam" n253 class balsa_beam_class; -Object b251 "balsa beam" n281 class balsa_beam_class; -Object b26 "balsa beam" n263 class balsa_beam_class; -Object b261 "balsa beam" n291 class balsa_beam_class; -Object b27 "balsa beam" n272 class balsa_beam_class; -Object b271 "balsa beam" n284 class balsa_beam_class; - diff --git a/src/GAMBIT3.INF b/src/GAMBIT3.INF deleted file mode 100644 index a8a534b..0000000 --- a/src/GAMBIT3.INF +++ /dev/null @@ -1,463 +0,0 @@ - -! (level 3) - -Class Gambit_Room_Lev3_Class - with description "You are on the surface of a floating stone \ -cube. The red light from below seems a bit brighter here.", - name "stone" "cube" "light", -has light; - -Object GAMBIT_31 "On Giant White Cube" - class Gambit_Room_Lev3_Class - with w_to - [ i ; - i = CheckGambit(n312,0,3); - if (i ~= 2) return i; - else return GAMBIT_W31; - ], - s_to - [ i ; - i = CheckGambit(n313,0,3); - if (i ~= 2) return i; - else return GAMBIT_W32; - ], -; - -Object GAMBIT_32 "On Giant White Cube" - class Gambit_Room_Lev3_Class - with e_to - [ i ; - i = CheckGambit(n324,0,3); - if (i ~= 2) return i; - else return GAMBIT_W31; - ], - w_to - [ i ; - i = CheckGambit(n322,0,3); - if (i ~= 2) return i; - else return GAMBIT_W31; - ], - s_to - [ i ; - i = CheckGambit(n323,0,3); - if (i ~= 2) return i; - else return GAMBIT_W32; - ], -; - -Object GAMBIT_33 "On Giant White Cube" - class Gambit_Room_Lev3_Class - with e_to - [ i ; - i = CheckGambit(n334,0,3); - if (i ~= 2) return i; - else return GAMBIT_W31; - ], - s_to - [ i ; - i = CheckGambit(n333,0,3); - if (i ~= 2) return i; - else return GAMBIT_W32; - ], -; - -Object GAMBIT_34 "On Giant White Cube" - class Gambit_Room_Lev3_Class - with w_to - [ i ; - i = CheckGambit(n342,0,3); - if (i ~= 2) return i; - else return GAMBIT_W31; - ], - n_to - [ i ; - i = CheckGambit(n341,0,3); - if (i ~= 2) return i; - else return GAMBIT_W32; - ], - s_to - [ i ; - i = CheckGambit(n343,0,3); - if (i ~= 2) return i; - else return GAMBIT_W32; - ], -; - -Object GAMBIT_35 "On Giant White Cube" - class Gambit_Room_Lev3_Class - with e_to - [ i ; - i = CheckGambit(n354,0,3); - if (i ~= 2) return i; - else return GAMBIT_W31; - ], - w_to - [ i ; - i = CheckGambit(n352,0,3); - if (i ~= 2) return i; - else return GAMBIT_W31; - ], - n_to - [ i ; - i = CheckGambit(n351,0,3); - if (i ~= 2) return i; - else return GAMBIT_W32; - ], - s_to - [ i ; - i = CheckGambit(n353,0,3); - if (i ~= 2) return i; - else return GAMBIT_W32; - ], -; - -Object GAMBIT_36 "On Giant White Cube" - class Gambit_Room_Lev3_Class - with e_to - [ i ; - i = CheckGambit(n364,0,3); - if (i ~= 2) return i; - else return GAMBIT_W31; - ], - n_to - [ i ; - i = CheckGambit(n361,0,3); - if (i ~= 2) return i; - else return GAMBIT_W32; - ], - s_to - [ i ; - i = CheckGambit(n363,0,3); - if (i ~= 2) return i; - else return GAMBIT_W32; - ], -; - -Object GAMBIT_37 "On Giant White Cube" - class Gambit_Room_Lev3_Class - with w_to - [ i ; - i = CheckGambit(n372,0,3); - if (i ~= 2) return i; - else return GAMBIT_W31; - ], - n_to - [ i ; - i = CheckGambit(n371,0,3); - if (i ~= 2) return i; - else return GAMBIT_W32; - ], -; - -Object GAMBIT_38 "On Giant White Cube" - class Gambit_Room_Lev3_Class - with w_to - [ i ; - i = CheckGambit(n382,0,3); - if (i ~= 2) return i; - else return GAMBIT_W31; - ], - n_to - [ i ; - i = CheckGambit(n381,0,3); - if (i ~= 2) return i; - else return GAMBIT_W32; - ], - e_to - [ i ; - i = CheckGambit(n384,0,3); - if (i ~= 2) return i; - else return GAMBIT_W31; - ], -; - -Object GAMBIT_39 "On Giant White Cube" - class Gambit_Room_Lev3_Class - with e_to - [ i ; - i = CheckGambit(n394,0,3); - if (i ~= 2) return i; - else return GAMBIT_W31; - ], - n_to - [ i ; - i = CheckGambit(n381,0,3); - if (i ~= 2) return i; - else return GAMBIT_W32; - ], -; - - -! (level 3 niches) - -Object n313 "southern niche" GAMBIT_31 - class niche_class - with name "southern", - counter_niche n341, - niche_dir 3; -Object n312 "western niche" GAMBIT_31 - class niche_class - with name "western", - counter_niche n324, - niche_dir 2; - -Object n324 "eastern niche" GAMBIT_32 - class niche_class - with name "eastern", - counter_niche n312, - niche_dir 4; -Object n323 "southern niche" GAMBIT_32 - class niche_class - with name "southern", - counter_niche n351, - niche_dir 3; -Object n322 "western niche" GAMBIT_32 - class niche_class - with name "western", - counter_niche n334, - niche_dir 2; - -Object n334 "eastern niche" GAMBIT_33 - class niche_class - with name "eastern", - counter_niche n322, - niche_dir 4; -Object n333 "southern niche" GAMBIT_33 - class niche_class - with name "southern", - counter_niche n361, - niche_dir 3; - -Object n341 "northern niche" GAMBIT_34 - class niche_class - with name "northern", - counter_niche n313, - niche_dir 1; -Object n342 "western niche" GAMBIT_34 - class niche_class - with name "western", - counter_niche n354, - niche_dir 2; -Object n343 "southern niche" GAMBIT_34 - class niche_class - with name "southern", - counter_niche n371, - niche_dir 3; - -Object n351 "northern niche" GAMBIT_35 - class niche_class - with name "northern", - counter_niche n323, - niche_dir 1; -Object n354 "eastern niche" GAMBIT_35 - class niche_class - with name "eastern", - counter_niche n342, - niche_dir 4; -Object n352 "western niche" GAMBIT_35 - class niche_class - with name "western", - counter_niche n364, - niche_dir 2; -Object n353 "southern niche" GAMBIT_35 - class niche_class - with name "southern", - counter_niche n381, - niche_dir 3; - -Object n364 "eastern niche" GAMBIT_36 - class niche_class - with name "eastern", - counter_niche n352, - niche_dir 4; -Object n361 "northern niche" GAMBIT_36 - class niche_class - with name "northern", - counter_niche n333, - niche_dir 1; -Object n363 "southern niche" GAMBIT_36 - class niche_class - with name "southern", - counter_niche n391, - niche_dir 3; - -Object n371 "northern niche" GAMBIT_37 - class niche_class - with name "northern", - counter_niche n343, - niche_dir 1; -Object n372 "western niche" GAMBIT_37 - class niche_class - with name "western", - counter_niche n384, - niche_dir 2; - -Object n381 "northern niche" GAMBIT_38 - class niche_class - with name "northern", - counter_niche n353, - niche_dir 1; -Object n382 "western niche" GAMBIT_38 - class niche_class - with name "western", - counter_niche n394, - niche_dir 2; -Object n384 "eastern niche" GAMBIT_38 - class niche_class - with name "eastern", - counter_niche n372, - niche_dir 4; - -Object n391 "northern niche" GAMBIT_39 - class niche_class - with name "northern", - counter_niche n363, - niche_dir 1; -Object n394 "eastern niche" GAMBIT_39 - class niche_class - with name "eastern", - counter_niche n382, - niche_dir 4; - -! (level 3 initial wood beam layout) -! wood beam, as two 'halves' - -Object p31 "pine beam" n322 class pine_beam_class; -Object p311 "pine beam" n334 class pine_beam_class with number 99; - -! (side note: with balsa beams, 2nd side need not be 99, since -! it will always break on the first try, and the default number is 0 -Object b31 "balsa beam" n312 class balsa_beam_class; -Object b311 "balsa beam" n324 class balsa_beam_class; -Object b32 "balsa beam" n313 class balsa_beam_class; -Object b321 "balsa beam" n341 class balsa_beam_class; -Object b33 "balsa beam" n323 class balsa_beam_class; -Object b331 "balsa beam" n351 class balsa_beam_class; -Object b34 "balsa beam" n333 class balsa_beam_class; -Object b341 "balsa beam" n361 class balsa_beam_class; -Object b35 "balsa beam" n342 class balsa_beam_class; -Object b351 "balsa beam" n354 class balsa_beam_class; -Object b36 "balsa beam" n352 class balsa_beam_class; -Object b361 "balsa beam" n364 class balsa_beam_class; -Object b37 "balsa beam" n343 class balsa_beam_class; -Object b371 "balsa beam" n371 class balsa_beam_class; -Object b38 "balsa beam" n353 class balsa_beam_class; -Object b381 "balsa beam" n381 class balsa_beam_class; -Object b39 "balsa beam" n363 class balsa_beam_class; -Object b391 "balsa beam" n391 class balsa_beam_class; -Object b3a "balsa beam" n372 class balsa_beam_class; -Object b3a1 "balsa beam" n384 class balsa_beam_class; -Object b3b "balsa beam" n382 class balsa_beam_class; -Object b3b1 "balsa beam" n394 class balsa_beam_class; - - -! extra goodies... - -Object Gambit_hole "large round hole" GAMBIT_37 - with name "hole" "round", - initial "In the center of the room is a large round \ -hole, going straight down through the floating cube.", - description "A large round hole cut straight through the \ -giant cube you stand on. All you need is a huge square peg.", - size 30, - before [; - Enter: - if (fire_spirit in GAMBIT_37) - "The towering fire spirit blocks your way!"; - print "^You close your eyes and jump straight \ -into the hole! There is a bright flash of light...^"; - Achieved(5); - PlayerTo(GAMBIT_11); - return 2; - Receive: - if (fire_spirit in GAMBIT_37) - "The towering fire spirit is in your way!"; - move noun to GAMBIT_11; - print "You drop "; DefArt(noun); - " into the hole. There is a bright flash of light, and \ -the object disappears!"; - Rub, Push, Pull, Touch, Squeeze, Turn, Shake: -"I don't know how to do that to a giant hole."; - ], - after [; - Search: - if (fire_spirit in GAMBIT_37) - "The towering fire spirit fills the hole currently!"; -else "Looking through the hole, you can see a reddish haze \ -far below."; - ], - has static container open enterable; - -! rod piece -- SMOKE -Object smoke_rod_piece "smoke rod piece" GAMBIT_37 - class rod_class, - with name "smoke", - initial "Sitting on the floor is a short smoke-colored rod.", - description "It's a short section of a rod made of some \ -undeterminable hard substance, \ -colored smoke. A piece of the Rod of \ -the Ancients, no doubt!", -; - - -Object fire_spirit "fire spirit" GAMBIT_37 - with name "spirit", - description "It looks like a tower of animated flame.", - 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; - "^Suddenly, a flash of flame bursts through the hole \ -in the center of the cube! A living tower of flame attacks!"; - } - i = random(5); - if (i == 1) { - deadflag = 1; - "^The fire creature engulfs you in a deadly inferno! \ -You are burned to a crisp."; - } - 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 fire spirit was too much for \ -you, I'm afraid to say. The spirit senses your \ -weakness and engulfs you in flame."; - } - print "^The fir spirit "; - if (i==2) - "singes you with a jet of fire!"; - if (i==3) { - "sends a small ball of \ -flame your way! You get slightly burned!"; - } - "tries to torch you in a sheet of \ -flame, but you evade just in time!"; - ], - before [; - Cast: - if (the_spell_was == swanko_spell) { - remove self; - "As you speak the chant, the fire spirit falls back \ -in fear! You finish the chant, and the fire spirit \ -dissipates into harmless smoke, banished!"; - } - print "Crackling flame drowns out your chant.^"; - ], - life [ ; - Attack: - if (random(20) >= 8) - "You strike the fire creature, but your attack passes \ - harmlessly through it! You hear a crackling noise \ -that could pass for laughter."; - "You attack the fire spirit, but miss!"; - default: "It's too busy trying to kill you."; - ], - has animate concealed; diff --git a/src/GURTH.INF b/src/GURTH.INF deleted file mode 100644 index 8d420a0..0000000 --- a/src/GURTH.INF +++ /dev/null @@ -1,925 +0,0 @@ - -! ************************************************************** -! GURTH.INF -- Add-on for SPIRITWRAK -! (all rights reserved, copyright 1996, D. Yu -! ************************************************************** - -! (author note to self -- Gurth currently isn't going to be too -! exciting -- I'm running out of .z5 code space. The main -! planned features are: -! 1) The abandoned house with the oven for baking the cake -! 2) A deep forest area somewhat north of the city where -! a sphere piece will be hidden - -! The string array for labels on the GUE Oven dial (may be changed) -Array OVEN_settings table [; - "Warm Soup"; - "Hot Chocolate"; - "Pizza"; - "Cake"; - "Fish"; - "Roast Chicken"; - "Baked Potato"; - "Rib Roast"; - "Thermo-nuclear Flash"; -]; - -Object GURTH_GUSStop "Gurth City Streets" - with description "A foggy sky covers the ever-busy city of \ -Gurth. A road heads southeast into a larger \ -portion of the city, and stairs lead down here.", - name "fog" "sky" "road" "stairs", - d_to GURTH_GUSStation, - se_to GURTH_NDistrict, - has light; - -Object umbrella "umbrella" GURTH_GUSStop - with name "umbrella", - description [; - if (self has open) - print "An open"; - else print "A closed"; - " black-cloth umbrella."; - ], - !weight 25, - size 16, - article "an", - before [; - Open: - if (parent(self) == player) { - give self open; - umbrella.size = 20; - "You snap the umbrella open."; - } - else "You need to be holding the umbrella to do that."; - Close: - if (parent(self) == player) { - give self ~open; - umbrella.size = 16; - "You snap the umbrella closed."; - } - else "You need to be holding the umbrella to do that."; - ], - has openable; - -Object GURTH_NDistrict "North District" - with description "Probably the safest district in Gurth, the \ -North District is mostly cobblestone roads and barricaded \ -buildings. A main road heads south, or forks northwest and \ -northeast.", - name "cobblestone" "buildings" "road", - nw_to GURTH_GUSStop, - s_to GURTH_MDistrict, - ne_to GURTH_Forest, - has light; - -Object GURTH_Forest "Forest Edge" - with description "Dark forest meets dark city outskirts here. \ -The only exit is along an old path to the southwest -- \ -the forest is too thick for travel otherwise. \ -Rain falls periodically from a dark stormy sky.", - name "forest" "path" "rain", - sw_to GURTH_NDistrict, - each_turn [; - if (random(10) < 4) { - "^A rumble of thunder booms overhead."; - } - ], - before [; - Listen: - if (Treant in GURTH_Forest) - "You hear muffled cries for help from \ -somewhere inside the log cabin!"; - ], - has light; - -Object storm1 "storm" GURTH_Forest - with name "storm" "clouds" "sky" "dark", - description "It does look a bit stormy overhead.", - before [; - Cast: - if (the_spell_was == shazok_spell) { - print "A bolt of lightning rips down from the \ -clouds overhead as you finish your chant! It strikes "; - if (Treant in GURTH_Forest) { - print "the angry treant! \ -A portion of its top branches catch fire! Howling in pain, \ -the creature runs off into the woods and disappears!"; - SaveWoodsman(); - rtrue; - } - else { - deadflag = 1; - "you, frying you to a crisp!"; - } - } - ], - has scenery; - -Object Treant "angry treant" GURTH_Forest - with name "treant" "angry" "blighted", - description "Treants are basically animated trees. They \ -are considered mythical creatures, usually solitary and quite \ -rare. This particular treant looks similar to a great elm tree. \ -You notice that it seems covered with spots of some sort of \ -blight.", - article "an", - each_turn [ i ; - i = random(20); - print "^The treant "; - if (i > 10) { - if (WOOD_House.number == 3) { - WOOD_House.number = 4; - remove self; - "pounds the cabin, and it collapses into \ -splinters! The treant grabs a hapless woodsman from the \ -wreckage and stalks off into the forest with his victim!"; - } - else { - WOOD_House.number = WOOD_House.number + 1; - "hammers on the house and you hear a \ -crack! The cabin sustains some damage!"; - } - } - else "angrily attacks the wood cabin, which shakes \ -with the continued blows."; - ], - before [; - Cast: - if (the_spell_was == egdelp_spell) { - deadflag = 1; - "The treant is covered with a waxy buildup, which \ -washes off in the rain. The treant, already \ -rather incensed, turns his attentions to you and mauls you \ -with two giant branches/arms."; - } - if (the_spell_was == throck_spell) { - deadflag = 1; - "The treant grows a bit bigger. His current bad \ -mood seems to increase proportionately! He turns his attentions \ -to you and pounds you with two huge branches/arms."; - } - if (the_spell_was == taclor_spell) { - print "The treant seems to turn a shade of deep \ -green, and the patches of blight disappear! The ancient tree \ -creature pauses, regards you solemnly, and then walks \ -off into the forest."; - SaveWoodsman(); - rtrue; - } - ], - has animate; - -Object WOOD_House "log cabin" GURTH_Forest - with name "cabin" "log" "house", - description [; - print "A small house built of logs"; - switch (self.number) { - 0: print "."; - 1: print ". It looks slightly damaged."; - 2: print ". It looks partially damaged, the roof logs \ -are broken in several places."; - 3: print ". It looks very damaged. One wall is \ -nearly broken through."; - default: print " that has collapsed into little more \ -than a pile of broken logs."; - } - if (self has general) - " You notice some area of wood have spots of wax \ -on them."; - new_line; - rtrue; - ], - before [; - Enter: - if (Treant in GURTH_Forest) - "The angry treant seems to be in the way."; - "It's just a tiny log cabin that probably \ -has nothing interesting inside."; - Cast: - if (the_spell_was == egdelp_spell) { - give self general; - "The outside of the cabin is now covered \ -with spots of waxy buildup."; - } - ], - number 0, - has static; - -[ SaveWoodsman ; - remove Treant; - move red_sphere to player; - "^^Moments later, a woodsman appears from the battered log \ -cabin. ~Much thanks, sir,~ he says. ~Appears I mistook that \ -treant for a dead tree and tried to cut it down. Can't say \ -he took it too well.~ he says sheepishly. ~Say, you don't \ -look like you're from around these parts. Kinda like this \ -funny thing I found in the woods the other day.~ He hands \ -you a strange round object. ~Maybe you know what to do with \ -it?~ He hefts a small hatchet over his shoulder. ~Well, \ -back to do a little logging,~ he says, as he walks off into the \ -deep forest, whistling."; -]; - -Object GURTH_MDistrict "Market District" - with description "The famous Gurth Market District is as noisy, \ -crowded, and dangerous as it ever was. A cobblestone road heads \ -north and south here.", - name "cobblestone" "road", - n_to GURTH_NDistrict, - s_to GURTH_SDistrict, - e_to "~Get out 'o me way!~ some rude fellow says as you \ -try to pass.", - w_to "~No push'n, no shov'n!~ some old hag screams at you, \ -and promptly shoves you back.", - each_turn [; - if ((random(10) < 5) && (self hasnt general)) { - give self general; - move c7 to self; - "^A clumsy hawker stumbles into you as he \ -crosses the street, hustling off without so much as an \ -apology. You notice he dropped something in his hurry."; - } - ], - has light; - -Object c7 "coin" class coin_class; - -Object GURTH_SDistrict "South District" - with description "The general gloomy atmosphere is more noticeable \ -than ever here, in the extremely dangerous South District. The \ -general area is filled with boarded-up houses, and a few shifty-eyed \ -characters are the only people milling about here. A road leads \ -north. To the east is an abandoned flat, probably in better shape \ -than the rest.", - name "houses" "characters" "people" "road" "flat", - n_to GURTH_MDistrict, - s_to [; - print "You wander down "; - if (random(20) == 5) { - deadflag = 1; - "a back alleyway, and are immediately \ -assaulted by a group of vicious thugs, who batter you senseless."; - } - else "an alleyway, find a dead-end, and return \ -here."; - ], - w_to [; - print "You wander down "; - if (random(20) == 5) { - deadflag = 1; - "a sidestreet, and are immediately \ -assaulted by a group of vicious thugs. One of them seems to \ -recognize you. ~That's the Preacher-man who got Davey arrested! \ -Let's show 'em what we think'o that!~ They proceed to beat you senseless."; - } - else "a sidestreet, find a dead-end, and return \ -here."; - ], - e_to GURTH_House, - has light; - -Object GURTH_House "Front of House" - with description "You're standing at the rotting front steps of \ -a small flat. The front door to the east has been battered down and \ -you could probably walk right in, or return to the street to \ -the west.", - name "street" "steps" "flat", - w_to GURTH_SDistrict, - e_to House_Ent, - in_to House_Ent, - has light; - -Object GURTH_House2 "Front of House" - with description "You're standing near a small construction site. \ -A city street lies west, and a construction ditch is east.", - name "street" "ditch", - w_to [; - deadflag = 1; - "You step into the street, and several locals \ -give you strange looks. The surrounding neighborhood seems \ -new and busy -- various construction sites mark the \ -work of enterprising shop-keepers of the area.^^\ -~Watch out there!~ someone cries. A sudden \ -pile of bricks falls from a nearby scaffolding, and \ -crushes you."; - ], - e_to Construction_site, - has light; - - -Object bad_brick "dusty brick" GURTH_House2 - with name "brick" "dusty" "old", - initial "An old discarded brick lies nearby.", - description "An old brick, slightly cracked in several places.", - size 15, - time_left 0, - time_out [; - ! Construction Worker appears - if ((good_brick in Construction_site) || - ((good_brick notin Construction_site) && - (bad_brick notin Construction_site))) { - remove good_brick; - foundation_wall.number = 1; - } - else { - remove bad_brick; - foundation_wall.number = 2; - } - if (location == Construction_site) { - print "^From behind some scaffolding, a construction \ -worker appears. He walks to a part of the ditch and starts to \ -make some finishing touches on part of a low wall. \ -He finds a brick nearby and applies it to the wall with \ -a good patch of mortar."; - if (foundation_wall.number == 1) -" Brushing himself off, he walks off \ -and is soon out of sight."; - else -" He looks at the patch somewhat \ -unsatisfied, but shrugs, and walks off, soon out of sight."; - } - else - "^You hear some brief noises from the east."; - ], -; - -Object Construction_site "Construction Site" -with description "This is a long square ditch that is \ -likely to be the starting point for some building. It is \ -framed by wood slats and short brick walls. The only way \ -out is to the west.", - name "ditch" "slats" "wood", - w_to GURTH_House2, - has light; - -Object good_brick "thick brick" Construction_site - with name "brick" "thick", - !weight 30, - size 15, - initial "A thick brick lies nearby.", - description "A thick brick, solid as a rock.", -; - -Object foundation_wall "portion of wall" Construction_site - with name "wall" "foundation" "portion" "hole" "recess", - initial "You notice a foundation side wall \ -in the ditch.", - number 0, - size 15, - description [; - switch (self.number) { - 0: "It looks somewhat unfinished. Part of it \ -is open into a dark recess in the side of the ditch."; - 1: "The wall is a finished work of brick and \ -mortar. It looks quite strong."; - 2: "The wall is a finished work of brick and \ -mortar. You see a spot where the brickwork seems a bit \ -lower in quality."; - } - ], - before [; - Receive: - if (self.number > 0) - "The wall is currently sealed shut."; - else { - move noun to self; - print "You put ", (the) noun, " into the "; - "small hole in the wall."; - } - Search, LetGo: - if (self.number > 0) - "The wall is currently sealed shut."; - Attack: - if (self.number == 0) { - deadflag = 1; - "You kick at the wall. Unfortunately, it wasn't \ -all that stable, and the wall falls apart, burying you under a \ -pile of loose bricks."; - } - if (self.number == 1) { - remove foundation; - print "You try to break the wall, but only end up \ -hurting your hand. "; - } - else { - give foundation general; - print "You knock on the weak portion of the \ -wall, and produce a slight crack, that no doubt will \ -cause the homeowners some worry in the future. "; - } -! give GURTH_House ~general; - while (child(player) ~= 0) remove child(player); -! while (child(GURTH_House) ~= 0) remove child(GURTH_House); -print "The wall seems to start to glow a purple color, and you \ -step back, to find your surroundings replaced by cold natural \ -cave walls.^"; - Mystical_Cave.number = Mystical_Cave.number + 1; - PlayerTo(Mystical_Cave); - rtrue; - ], - has static container open; - -Object House_Ent "Entrance Room" - with description "A bare room, with peeling paint and rotting, \ -water-stained walls. There's a room to the east, and a rickety \ -stairway down. The outdoors lie west.", - name "paint" "stairway" "outdoors", - e_to House_Kitchen, - d_to House_Basement, - w_to GURTH_House, - out_to GURTH_House, - has light; - -Object House_Basement "Basement" - with description "A musty, smelly basement. Stairs head up.", - name "stairs", - u_to House_Ent, - before [; - Smell: "It's smells musty down here, as though \ -the place has been unused for quite some time."; - ], -; - -Object House_switchbox "dusty metal box" House_Basement - with name "dusty" "metal" "box", - when_closed "There's a dusty metal box attached to the wall here.", - when_open [ x; - print "There's an open metal box attached to the wall here. "; - x = children(self); - if (x == 0) "It seems to be empty."; - print "It contains:^"; - x = FULLINV_BIT + INDENT_BIT + NEWLINE_BIT + RECURSE_BIT; - WriteListFrom (child(self), x, 1); - rtrue; - ], - capacity 3, - size 10, - description "A dusty metal box, attached to the wall.", - before [; - Open, Push, Pull, Turn, Touch: - if (GHOST in House_Basement) - "Slowly, but quite deliberately, the zombie \ -prevents you from getting near the box."; - ], - has static container openable; - - -Object wire "thin wire" House_switchbox - with name "wire" "thin", - ! initial "Inside the box is a loose wire.", - description "A thin stiff string of metal.", - !weight 2, - size 1, ! must fit in subway gate slot... - before [; - Cast: -if ((the_spell_was == huncho_spell or luncho_spell) && - (self hasnt general)) -"Your chant goes unanswered."; - Take, Push, Pull, Touch, Rub, Squeeze: - if (self hasnt general) { - if (rubber_gloves has worn) { - if (action==##Take) give self general; - print "As you touch the wire, you notice a \ -bright spark! Good thing you were wearing rubber gloves! "; - } - else { - print "As your fingers get near the wire, \ -a bright spark of electricity "; - if (random(10) < 4) { - deadflag = 1; - move GHOST to House_Basement; -"arcs into your hand! The results are quite shocking, I'm afraid."; - } - else -"flashes near your fingers! You pull back just in time."; - } - } - ], -; - -Object foundation "foundation" House_Basement - with name "foundation" "break" "hole", - initial "A large break in the wall exposes a good portion of \ - the house's foundation.", - description "Water damage, or simply age, has exposed a large \ - hole in one of the walls, through which you can see exposed \ - wood and brick, part of the foundation of the house.", - before [; - Receive: - "No need to put things in the foundation like that."; - Search: - if (self hasnt general) - "You briefly search the decaying foundation, but find nothing."; - else { - print "You dig around in a familiar spot in the hole "; - give self ~general; - if (children(foundation_wall) == 0) - "but find nothing."; - Achieved(17); - while (child(foundation_wall) ~= 0) - move child(foundation_wall) to House_Basement; - "and find something!"; - } - ], - has static; - -Object House_Kitchen "Kitchen" - with description "You're in the kitchen, by the looks of things. \ -Some broken cabinets are on the wall. Light from partially boarded-up \ -windows lets you see the rotting wood floors. Rooms lie to the \ -north and west.", - name "cabinets" "windows" "wood", - w_to House_Ent, - n_to House_Pantry, - has light; - -! (An oven, a typical inform object) -Object OVEN "GUE-Automatic oven" House_Kitchen - with name "oven" "GUE-Automatic", - when_closed "Strangely untouched and undamaged, a GUE-Automatic oven is \ -sitting closed in a corner of the room.", - capacity 1, - when_open [ x; - print "Strangely untouched and undamaged, a GUE-Automatic oven is \ -sitting open in a corner of the room."; - x = children(self); - if (x == 0) " It seems to be empty."; - print " It contains:^"; - x = FULLINV_BIT + INDENT_BIT + NEWLINE_BIT + RECURSE_BIT; - WriteListFrom (child(self), x, 1); - rtrue; - ], - size 15, - description "A FrobozzCo best-seller -- this small green oven is \ -perfect for those adventurers who want a home-cooked meal, but are short \ -on time and space. There's a dial and a button \ -on the top.", - before - [ x ; - Open: - if (self hasnt open) { - give self open; - print "You open the oven, "; - x = children(self); - if (x==0) "which is empty."; - print "revealing:^"; - x = FULLINV_BIT + INDENT_BIT + NEWLINE_BIT + RECURSE_BIT; - WriteListFrom (child(self), x, 1); - rtrue; } - ], - add_to_scope oven_dial oven_button, - has static container openable; - -Object oven_dial "oven dial" - with name "dial", - number 5, - description [; - print "A round dial with small printed words. A line on the \ -oventop marks which dial setting is currently active, which at the \ -moment is ~", (string) OVEN_settings-->(oven_dial.number); "~."; - ], - before [; - Turn: - oven_dial.number = oven_dial.number + 1; - if (oven_dial.number > 9) oven_dial.number = 1; - print "The line is now pointing to ~", (string) OVEN_settings-->(oven_dial.number); - "~ on the dial."; - SetTo: - "The dial has somewhat unusual \ -settings. You'll need to turn to the one you want."; - ], - has static; - -Object oven_button "oven button" - with name "button" "black", - number 0, - description "A small round black button on the top of the oven.", - before [; - Push: - if (OVEN has open) - "There is an irritated buzz."; - else { - print "You press the button and hear a low spinning noise. \ -Suddenly, the oven makes a "; - if (oven_dial.number == 9) { - ! Ye old nuclear flash setting - if (children(OVEN) ~= 0) - remove child(OVEN); -"tremendous 'bang', and nearly springs off \ -the floor! A bright flash of light seems to originate from somewhere \ -inside the oven! Then, just as suddenly, everything is quiet again."; - } - ! check object in oven - ! if obj exists, check for edible - ! or cake, mutate appropriately. - if (children(OVEN) ~= 0) { - if ((Baking_Pan in oven) && (cake in Baking_Pan)) { - ! we're no doubt cooking the cake again. - ! as a nice feature of the GUE auto, if the cake - ! was undone, and the oven setting == 4, give - ! the cake the 'done' result - if ((cake.number == 1) && (oven_dial.number == 4)) - cake.number = 0; - ! otherwise, nothing changes - } - if ((Baking_Pan in oven) && (dough in Baking_Pan)) { - ! first, check oven setting (too cold or too hot) - ! if setting ok, check number of times folded - ! (too few, too many). Move 'cake' to pan, make - ! dough child of cake, and set the 'result' number - ! of cake accordingly (0, ok, 1 underdone, 2 - ! overdone, 3 underfolded, 4 overfolded) - ! (assumption is that dough will be only thing - ! in pan [add's are trapped by dough] - move dough to cake; ! Zen cooking... - move cake to Baking_Pan; - if (oven_dial.number == 4) { - if (dough.number < 83) - cake.number = 3; - if (dough.number > 83) - cake.number = 4; - else cake.number = 0; ! well done baker - } - else { - if (oven_dial.number < 4) - cake.number = 1; - if (oven_dial.number > 4) - cake.number = 2; - } - } - } -"a loud 'pop' and nearly springs off \ -the floor! Then, just as suddenly, everything is quiet again."; - } - ], - has static; - -Object House_Pantry "Pantry" - with description "This was once probably a pantry of some \ -sort. It's now a bare closet-sized room. The exit is south.", - s_to House_Kitchen, - has light; - -Object Baking_Pan "baking pan" House_Pantry - with name "pan" "baking", - description "It's a nice round flat-bottomed ceramic pan.", - capacity 20, - !weight 10, - size 14, - before - [ i ; - Mix: - if (children(Baking_Pan) == 0) - "There doesn't seem to be anything in the pan to mix."; - else { - if (cake in Baking_Pan) - "You can't mix anything with the already baked cake in the pan."; - ! if the dough is already in the pan, add the - ! 'new children', if any - if (dough in Baking_Pan) { - i = 0; - move dough to OVEN; ! Temp - while (child(Baking_Pan) ~= 0) { - i = i + 1; - move child(Baking_Pan) to dough; - } - move dough to Baking_Pan; - if (i == 0) - "You need to add something to the pan if you \ -want to mix something new into the dough."; - "You mix in the new ingredients into the dough."; - } - ! Minimally, if the flour, butter and egg are in the - ! pan, 'dough' will be produced - if ((flour notin Baking_Pan) || - (corbie_egg notin Baking_Pan) || - (butter notin Baking_Pan)) - "You mix the contents of the pan around a bit, but \ -some things don't quite coagulate, and the contents remain unmixed."; - else { - while (child(Baking_Pan) ~= 0) { - move child(Baking_Pan) to dough; - } - move dough to Baking_Pan; - "You start mixing. Like magic, in short time you \ -have a doughy mixture in the pan."; - } - } - LetGo: - if (noun == dough or cake) { - CDefArt(noun); " is stuck fast in the pan and \ - you can't get it out."; - } - else { - ! we've modified certain ingredient objs that we want \ - ! to 'preserve' in the pan. - if ((noun == flour) || (noun == sugar_cube) || - (noun == baking_powder) || (noun == butter) || - (noun == corbie_egg) || (noun==dornberries)) - "It's somewhat scattered about in the pan right \ -now, and you can't quite remove it cleanly."; - } - Receive: - if (cake in self) - "The cake takes up the entire space in the pan."; - ! -- trap and nicely parse putting - ! ingredients in pan, will require modifying - ! 'short_name's of various ingredients. - if (noun == flour) { - flour.short_name = "pile of flour"; - move flour to Baking_Pan; - flour.description = "A heap of white flour."; - "You break open the bag and add the flour to the pan."; - } - if (noun == sugar_cube) { - sugar_cube.short_name = "quantity of sugar"; - move sugar_cube to Baking_Pan; - sugar_cube.description = "Some sugar scattered about."; - "You crumble the sugar cube into the pan."; - } - if (noun == baking_powder) { - baking_powder.short_name = "small sprinkling of baking powder"; - move baking_powder to Baking_Pan; - baking_powder.description = "A small pile of very fine white powder."; - "You open the packet and add the powder to the pan."; - } - if (noun == corbie_egg) { - corbie_egg.short_name = "bit of raw egg"; - move corbie_egg to Baking_Pan; - corbie_egg.description = "The yolk and the white parts from an egg."; - "You crack the egg and drop the gooey contents into the \ - pan, discarding the shell."; - } - ], - has container open; - -Object pan_sticker "sticker" Baking_Pan - with name "sticker", - initial "There's a sticker stuck to the bottom of the pan.", - description "\ -Frobozz Magic Baking Pan^^\ -HELLO, BAKER!^^\ -To mix ingredients placed in pan, simply say 'MIX PAN'. \ -Baked goods should be removed with a Frobozz Magic \ -Spatula.", - !weight 1, - size 5, -; - -Object dough "lump of dough" - with name "dough", - number 0, ! equals the number of times folded - !weight 10, - size 14, - description "It looks like a nice beige lump of uncooked dough.", - before [; - Eat, Taste: - if (action==##Eat) remove self; - "Ugg. Raw dough."; - Cast: - if (the_spell_was == gloth_spell) { - dough.number = dough.number + 83; - if (dough.number > 500) dough.number = 500; - "As you speak the chant, the dough seems to \ -twinkle! With a sudden puff of flour, the dough spins and \ -neatly kneads itself many times!"; - } - Fold: - dough.number = dough.number + 1; - print "You roll up your sleeves and start kneading. \ -The dough "; - if (dough.number > 500) dough.number = 500; - if (dough.number < 50) - "folds easily."; - if (dough.number > 200) - "has the consistency of a soft rock."; - "is pliable."; - ], - has edible; - -Object cake "cake" - with name "cake", - number 0, -! number = condition: -! 0 ok, 1 undercooked, 2 overck, 3 underfld, 4 overfld - description [; - print "It's a "; - switch (cake.number) { - 1: "somewhat raw-looking cake."; - 2: "nice-looking cake, except that it \ -looks a little burned."; - default: "nice-looking cake."; - ! The player will have to taste the cake to check the - ! 'fold quality'. - } - ], - before [; - Eat: - remove self; - "Not bad. Unfortunately, it looks like you can't have \ -your cake and eat it too."; - Taste: - print "You taste a tiny bit of the cake. "; - switch (cake.number) { - 1: "It tastes a bit underdone."; - 2: "It tastes a little burned."; - 3: "It's a little too soft."; - 4: "It's a bit tough."; - default: "It tastes great!"; - } - ], - !weight 10, - size 14, - has edible; - - - -! *************** -! animated beings -! *************** - -Object GHOST "frightening zombie" House_Basement - with name "zombie" "frightening", - description "A frightening gaunt member of the \ -living dead, with pale skin, and even paler eyes.", - before [; - Cast: - if (the_spell_was == wigro_spell) { - remove self; - "The zombie crumbles into dust, turned."; - } - ], - life [; - ThrowAt: - if (noun==holywater) { - remove holywater; remove self; - "The vial breaks into shards, scattering \ -holy water all over the zombie. The zombie shrieks, and \ -crumbles into dust."; - } - Attack: "Your attack knocks it back, but it \ -seems completely unharmed, somehow!"; - Give: -if (noun==rubber_gloves) { - move wire to House_Basement; - move rubber_gloves to House_Basement; - give rubber_gloves ~worn; - give wire general; - give House_switchbox open; - remove self; - "The zombie seems to regard the gloves, and slowly puts \ -them on. It proceeds to open the metal box and remove a \ -loose wire, producing a few sparks in the process. Finally, \ -it places the loose wire on the floor, satisfied. It \ -slowly crumbles into dust, but you just manage to hear, \ -~Thanks, I've been trying to get rid of that wire for ages,~ \ -in the faintest of whispers."; -} - default: "Zombies are usually not very responsive to \ -those among the living. This one is no exception."; - ], - has animate; - -! *************** -! spells/scrolls -! *************** - -Object gray_scroll "gray scroll" House_Basement - class scroll_class, - with name "gray", -; - -Object tossio_spell "turn granite to pasta" gray_scroll - class spell_class, - with name "tossio", - magic [; - if ((location == THIEF_Storeroom) && - (second == w_obj) && (THIEF_Storeroom hasnt general)) { - give THIEF_Storeroom general; - move pasta to THIEF_Storeroom; - move c50 to THIEF_Storeroom; - "As you finish the chant, the granite wall is replaced \ -by a large mass of pasta. A hidden section of the room is revealed, \ -along with the mass of gold coins it was holding! The coins spill \ -out, and nearly flood the room.^^In a flash, a large group of \ -financial nymphs appear on the scene. ~It looks like we found the \ -missing GUS earnings,~ one nymph says to another. Producing large \ -sacks, they quickly collect the mass of coins and disappear with a \ -twinkle.^^Moments later, a single coin falls out of a crack in the \ -previously hidden alcove, rolling to a stop near your feet."; - } - "Your chant goes unanswered. I guess you need pure granite."; - ], -; - -! *************** -! misc items -! *************** - -Object red_sphere "red sphere" - class sphere_class - with name "red", - description "A tiny perfect red sphere, made of some strange \ - unknown metal.", -; diff --git a/src/MAKESPIR b/src/MAKESPIR deleted file mode 100644 index ff19015..0000000 --- a/src/MAKESPIR +++ /dev/null @@ -1,6 +0,0 @@ -./inform '$huge' '$MAX_OBJECTS=850' '$MAX_SYMBOLS=8150' '$MAX_CLASSES=25' '$MAX_DICT_ENTRIES=1500' '$MAX_ZCODE_SIZE=200000' '$MAX_BANK_SIZE=5000' spirit -#./inform '$huge' '$MAX_OBJECTS=800' spirit - -# The below cmd version should only be used for creating -# abbreviations (this will take a while too) -#./inform -u '$huge' '$MAX_OBJECTS=800' '$MAX_TRANSCRIPT_SIZE=300000' '$MAX_SYMBOLS=8000' '$MAX_CLASSES=20' '$MAX_DICT_ENTRIES=1500' '$MAX_ZCODE_SIZE=200000' spirit diff --git a/src/MIZNIA.INF b/src/MIZNIA.INF deleted file mode 100644 index 6a18b50..0000000 --- a/src/MIZNIA.INF +++ /dev/null @@ -1,892 +0,0 @@ -! ******************************************************************* -! MIZNIA -- add-on for SPIRITWRAK -! ******************************************************************* - - -Object MIZNIA_GUSStop "Mizniaport" - with description "The Great Change certainly hasn't changed the \ -ultra-swank city of Mizniaport. The entire place is filled with \ -splashy color and a disturbing sense of moderness. There's a \ -stairway down here, while side walkways head west and \ -northeast.", - name "color" "moderness" "stairway" "walkway" "walkways", - d_to MIZNIA_GUSStation, - w_to MIZNIA_Park, - ne_to FROBAR_Ent, - has light; - -Object MIZNIA_Park "Miznia Suburbs" - with description "Overly cozy-looking homes sprout up all over \ -the place here. Ridiculously \ -well-trimmed front lawns remind you that you're still in Miznia. \ -A nice pebble path heads east and west. You see the entrance to \ -a swank-looking boutique to the south.", - name "homes" "lawns" "pebble" "path", - e_to MIZNIA_GUSStop, - w_to MIZNIA_Outskirts, - s_to MIZNIA_Boutique, - in_to MIZNIA_Boutique, - has light; - -Object MIZNIA_Boutique "Swank Boutique" - with description "A ultra-swank accessory store, filled with \ -flashy items for the fashion-unconscious shopper. \ -An exit lies north.", - name "items" "accessory", - out_to MIZNIA_Park, - n_to MIZNIA_Park, - has light; - -Object boutique_sign "small sign" MIZNIA_Boutique - with description "The sign reads ~PLEASE RING BELL FOR SERVICE~", - name "small" "sign", - has static; - -Object MIZNIA_Outskirts "City Limits" - with description "The city stops here abruptly. The Miznia jungle \ -makes its presence known for real here, forming a natural barrier. A \ -path leads east, while an almost overgrown path leads into the jungle \ -to the southwest.", - name "path" "jungle" "barrier", - e_to MIZNIA_Park, - sw_to Jungle_Edge, - has light; - -Object c8 "coin" MIZNIA_Boutique class coin_class; - -Object Jungle_Edge "Edge of Jungle" - with description "Wild birds and wilder vegetation distract you from \ -a faint trail through the jungle here. The path leads northeast and \ -southwest.", - name "birds" "vegetation" "trail", - ne_to MIZNIA_Outskirts, - sw_to Deep_Jungle, - has light; - -Object Deep_Jungle "Deep Jungle" - with description "You're in very deep jungle, just on the verge of \ -getting lost. Your surroundings are green and untamed. A path \ -leads northeast, while a muddy path heads south.", - name "mud" "path", - ne_to Jungle_Edge, - s_to Swamp, - has light; - -Object Swamp "Swamp" - with description [; - print "You're knee-deep in a murky swamp. Huge swamp grasses \ -wall you in"; - if (self has general) - print ", except for a section to the west"; - ". Drier land is north or south."; - ], - name "swamp" "land", - n_to Deep_Jungle, - s_to Jungle_Clearing, - w_to [; - if (self hasnt general) - "You can't go that way."; - else return Jungle_Ruins; - ], - has light; - -Nearby grasses "grasses" - with name "grass" "grasses", - description "Tall, thick swampgrass.", - before [; - Push, Pull, Cut, Attack: - "The grass is extremely hardy."; - Search: - if ((Jungle_Map notin player)) - "You hunt around in the grasses for a while and find nothing."; - else { - give Swamp general; - Achieved(21); - "You check the jungle map. Sure enough, there's a loose \ -patch of grass that you could duck under to the west."; - } - Cast: - if (the_spell_was == throck_spell) - "Grasses don't grow much more than this."; - ], - has scenery; - - -Object Jungle_Clearing "Jungle Clearing" - with description "The Jungle clears out a bit here, so you can actually \ -see patches of sky and walk ten paces without running into a tree. There's \ -a path into the jungle undergrowth to the north. \ -You notice a group of jungle natives gathered here.", - name "sky" "path", - number 1, - n_to Swamp, - each_turn [ ; - if (Jungle_Clearing.number == 2) { - move Shaman to Jungle_Clearing; - Jungle_Clearing.number = 5; - "^A single native tribesman breaks away from the group and \ -approaches you."; - } - if (Jungle_Clearing.number == 1) - Jungle_Clearing.number = 2; - ], - has light; - -Nearby natives "natives" - with name "natives" "group", - description "A group of jungle natives in elaborate feather and \ - fur clothing. They appear to be armed with large spears.", - life [; -default: "The group of natives looks at you with distrusting stares."; - ], - before [; -Cast: - if (the_spell_was == espnis_spell or foblub_spell) -"They can't understand your language, thus the meaning of \ -the sermon is lost on them."; - ], - has animate concealed; - - - -Object Jungle_Ruins "Hidden Ruins" - with description "Hidden here in some extremely deep jungle \ - are the ruins of some ancient civilization. Broken sandstone \ - structures are nearly covered with jungle vines and mosses. \ - There is a partially intact structure to the north. \ - It seems to be a short pyramid-like building, with a single \ - dark entrance hidden amongst vines. Definitely a find to \ - write the Monastery about, or at least your local \ - Archeology Guild.", - name "sandstone" "structures" "structure" "vines" -"pyramid" "entrance" "mosses", - e_to Swamp, - n_to TEMPLE_Ent, - has light; - -! (The ancient temple, unlit, of course) -Object TEMPLE_Ent "Pyramid Entrance" - with description "A damp, dark, unmarked stone room. You can hear \ - the sounds of the jungle from the exit to the south. There \ - are dark passages north and east.", - s_to Jungle_Ruins, - e_to TEMPLE_Statue_room, - n_to TEMPLE_Trap, - before [; - Listen: "You hear noises of the jungle from the south."; - ], -; - -Object TEMPLE_Statue_room "Statue Room" - with description "A tiny dark chamber, with a passage west.", - w_to TEMPLE_Ent, -; - -Nearby TEMPLE_Statue "large statue" - with name "statue", - description "A stone statue of some ancient \ - warrior, probably intended to frighten off visitors.", - before [; - ! manual dealing with PushDir (only 3 possible locs anyway) - PushDir: - if (self has general) - "The statue is stuck fast and doesn't budge."; - if ((self in TEMPLE_Statue_room) && (second == w_obj)) { - print "^There's a grinding noise as you push the statue west.^"; - AllowPushDir(); rtrue; - } - if ((self in TEMPLE_Ent) && (second == s_obj)) - "^The statue doesn't appear to fit through the \ - entranceway."; - if ((self in TEMPLE_Ent) && - ((second == n_obj) || (second == e_obj))) { - print "^There's a grinding noise as you push the statue.^"; - AllowPushDir(); rtrue; - } - if ((self in TEMPLE_Trap) && (second == s_obj)) { - print "^There's a grinding noise as you push the statue south.^"; - AllowPushDir(); rtrue; - } - if ((self in TEMPLE_Trap) && (second == n_obj)) { - give self general; - move rollers to TEMPLE_Trap; - "You start to push the statue north, and hear a strange \ - click. Suddenly, two enormous stone rolling pins slide \ - down from the east and west sides of the room! \ - Desperately, you topple the statue and hide behind it. \ - You hear a huge crash!^^\ - You open your eyes, surprised to find yourself not \ - squashed into pancake. The statue has wedged itself \ - neatly between the two giant rollers, effectively \ - blocking them!"; - } - "You can't push the statue that way."; - Take: - "The statue rocks back and forth a bit, but is \ -far too heavy to take."; - Push: - print "The statue "; - if (self hasnt general) - "rocks back and forth a bit."; - else "seems to be stuck."; - ], - has static; - -Object TEMPLE_Trap "Strange Chamber" - with description "This is an odd long hallway running north and south. \ -The stone floor is noticeably concave, sloping upwards to \ -the east and west. It's like being in a long stone \ -channel.", - name "slope" "channel", - s_to TEMPLE_Ent, - e_to "The floor gets too steep, and you slide back down.", - w_to "The floor gets too steep, and you slide back down.", - n_to [; - if (TEMPLE_Statue hasnt general) { - deadflag = 1; - "You head north, and hear a strange click. Suddenly, \ - two huge stone rolling pins roll down from the east \ - and west sides of the room! Desperately, you try to \ - escape, but the hall is too long, and the stone \ - rollers too fast. You are crushed to jelly."; - } - else { - print "You step over and around the jammed rollers and \ - the statue and head north.^"; - return TEMPLE_1; - } - ], -; - -Object rollers "stone rollers" - with name "roller" "rollers" "stone", - initial "There are two stone rollers pinned against the statue.", - description "Massive stone rolling pins.", - before [; -Push, Pull, Attack, Turn, Shake, Squeeze: -"The rollers are huge and stuck fast."; - ], - has static; - -Object TEMPLE_1 "Bare Chamber" - with description "You are in a bare stone chamber with passages leading \ -north, east, south and west. A stone ladder also heads upwards through a \ -dark hole in the ceiling.", - name "ladder" "hole", - s_to TEMPLE_Trap, - n_to TEMPLE_1N, - e_to TEMPLE_1E, - w_to TEMPLE_1W, - u_to TEMPLE_2, -; - -Object TEMPLE_1W "Small Chamber" - with description "You're in a small bare chamber. On one of the walls, \ - you notice an engraving, almost worn away with age. It seems to be a \ - picture of a jungle village, and you recognize the pyramid you are currently in. \ - An exit lies east.", - e_to TEMPLE_1, -; - -Object TEMPLE_1N "Small Chamber" - with description "You're in a rather bare chamber. On one of the walls, \ - you see a worn engraving depicting a group of robed figures standing in \ - some chamber. They are carrying several long reeds. An exit lies south.", - s_to TEMPLE_1, -; - -Object TEMPLE_1E "Small Chamber" - with description "You're in a small stone chamber. In the center of the \ - floor is a strange funnel-like depression, which starts as a large \ - circular opening, and narrows into a very small tunnel below, \ - probably no wider than your hand. You also see a small round hole \ - in the ceiling above. An exit heads west.", - w_to TEMPLE_1, - d_to "You'd never fit down that opening.", - u_to "You can't reach the hole, and besides, you'd never fit through \ -it if you could.", -; - -Object TEMPLE_1_HOLEU "hole" TEMPLE_1E - with name "hole", - description "You see a dark small hole in the center of the \ -ceiling.", - before [; -Rub, Push, Pull, Touch, Receive, LetGo, Search: -"The hole is far above your head."; - ], - has scenery; - -Object TEMPLE_1_Opening "opening" TEMPLE_1E - with name "opening" "funnel" "depression" "tunnel", - description "A smooth funnel in the stone in the floor, that descends \ - into darkness as it narrows.", - describe [ x; - print "^The opening "; - if (children(self) == 0) - "appears to be empty."; - else { - print "contains:^"; - x = children(self); - x = FULLINV_BIT + INDENT_BIT + NEWLINE_BIT + RECURSE_BIT; - WriteListFrom (child(self), x, 1); - rtrue; - } - ], - before [; - Receive: - if (noun ~= TEMPLE_Artifact) { - print "That doesn't quite fit -- "; - if (noun.size > TEMPLE_Artifact.size) - "the funnel becomes too narrow too quickly."; - else "strangely..."; - } - LetGo: - "You stick your hand down the small hole, but it must be \ - quite deep, and you can't quite reach."; - ], - capacity 1, - size 10, - has static container open; - -Object TEMPLE_2 "Bare Chamber" - with description "You are in a bare stone chamber with passages leading \ -north, east, south and west. A stone ladder leads upwards and downwards \ -into dark holes.", - name "ladder" "hole", - s_to TEMPLE_2S, - n_to TEMPLE_2N, - e_to TEMPLE_2E, - w_to TEMPLE_2W, - u_to TEMPLE_3, - d_to TEMPLE_1, -; - -Object TEMPLE_2N "Small Chamber" - with description "You're in a small bare chamber. Engravings on the \ - wall show several robed figures in a low domed chamber. Some of \ - the figures are pushing what appears to be reeds down a small hole \ - in the ground, while others stand by and seem to be praying or \ - engaged in some ceremony. In a separate scene, similar robed \ - figures can be seen throwing some poor bound individual off the \ - top of the pyramid, apparently in some sort of ritualistic \ - sacrifice. An exit heads south.", - s_to TEMPLE_2, -; - -Object TEMPLE_2W "Small Chamber" - with description "You're in a small bare chamber. Engravings on \ - the wall depict several robed figures in a room mostly filled \ - with water. The figures are watching reeds that seem to fall \ - from the sky and land in the water. Several reeds are floating \ - towards an apparent drain in the water, where a few reeds that are thin \ - enough fall through with the flow of the water. An exit lies east.", - e_to TEMPLE_2, -; - -Object TEMPLE_2S "Small Chamber" - with description "You're in a rather small chamber. Engravings on \ - the walls depict several robed figures in a strange room with a \ - circular depression in the ground, filled with water. Water also \ - flows into the pool in a thin stream from some undrawn source above. \ - With the stream of water, a few reeds appear to be falling. A single \ - figure is collecting the reeds as they fall and placing them in \ - a long thin vase or container. The significance of \ - this is uncertain. An exit lies north.", - n_to TEMPLE_2, -; - -Object TEMPLE_engravings "engravings" - with name "engravings" "engraving", - description [; ; ], - found_in TEMPLE_1W TEMPLE_1N TEMPLE_2N TEMPLE_2W TEMPLE_2S, - has scenery; - -Object TEMPLE_2E "Small Chamber" - with description [; - print "You're in a bare stone chamber which is partially \ -filled with a sunken pool of dirty blackish water. Near the south wall \ -is a depression in the floor that was probably a drain for the pool, given the \ -apparent water stains; however the level of the pool is below \ -the point where it would overflow into the drain. Near the center \ -of the ceiling is a small round hole, right above the pool. An \ -exit lies west"; - if ((self hasnt general) && (TEMPLE_3 hasnt general) && - (amulet has worn)) { - give self general; - ".^^Your amulet suddenly gives off a bright purple flash!"; - } - else "."; - ], - name "stains", - before [; - Fill: -"The blackish water seems like something you really don't want."; - ], - w_to TEMPLE_2, -; - -Object TEMPLE_2_HOLEU "hole" TEMPLE_2E - with name "hole", - description "You see a dark small hole in the center of the \ -ceiling.", - before [; -Rub, Push, Pull, Touch, Receive, LetGo, Search: -"The hole is far above your head."; - ], - has scenery; - -Object TEMPLE_2_Opening "opening" TEMPLE_2E - with name "opening" "drain" "depression", - description "A smooth drain opening in the stone in the floor, \ - that descends into darkness.", - before [; - Receive: - if ((noun ~= TEMPLE_Artifact) && (noun hasnt is_rod)) ! TODO ADD? - "Oddly, that doesn't fit through the small round drain."; - else { - if (children(TEMPLE_1_Opening) == 0) - move noun to TEMPLE_1_Opening; - if (TEMPLE_Artifact in TEMPLE_1_Opening && - children(TEMPLE_Artifact) == 0) - move noun to TEMPLE_Artifact; - else move noun to TEMPLE_1E; - CDefArt(noun); " drops into the drain and disappears \ - out of sight. Moments later you hear a thump from \ - somewhere below."; - } - ], - capacity 1, - size 10, - has scenery container open; - -Object TEMPLE_Pool "pool" TEMPLE_2E - with name "pool" "water", - describe [; -print "^The black pool is disturbingly calm"; -if (umbrella in self) - ". Floating on the surface is a black open umbrella."; -else "."; - ], - description [; - print "Murky black water that seems disturbingly calm"; - if (umbrella notin self) - "."; - else - ". Floating on the surface is a black open umbrella."; - ], - before [; - Cast: - if (the_spell_was == frotz_spell) - "There's a strange gurgling noise as you finish the \ - chant, and the black water starts to glow! But, \ - to your horror, the inky water seems to absorb the \ - light and return to its original blackness! The \ - chant fails."; - - Enter: - deadflag = 1; - "You notice the water seems unusually cold as you enter \ - the pool. Without warning, something grabs your legs and \ - pulls you under! In pitch black liquid that seems to \ - absorb all light, you can't defend yourself, or even \ - see your adversary, who devours you shortly."; - Search: - "You can't see a thing, the water is blacker than night."; - Receive: - if (noun == toy_volcano) { - remove noun; - "You drop the toy volcano into the black pool and \ -watch it sink. Moments later, a large large bubble rises, and \ -pops at the surface, followed by a strange, belch-like noise!"; - } - if ((noun ~= umbrella) || (umbrella hasnt open)) { - remove noun; - CDefArt(noun); -print " falls into the pool and slowly sinks into the black water. \ -Suddenly, ", (the) noun, " seems to get pulled into the pool, \ -and is soon gone! Something dwells in that pool, apparently, \ -hidden well in a cover of"; " blackness!"; - } - else { - move umbrella to TEMPLE_Pool; - give umbrella ~light; ! a 'special-effect'? - "The open umbrella sits in the pool, floating on the \ - surface like a cloth dome."; - } - ], - size 25, - has static container open; - - -Object TEMPLE_3 "Collapsed Chamber" - with description [; - print "You are in a stone chamber that has broken and \ - eroded walls in several places. Broken stones and dirt are everywhere. \ - It appears there was once an open archway east, however the heavy stones \ - that framed it have collapsed. A tiny hole remains, \ - but it would be an exceptionally tight squeeze. \ - A stone ladder leads downwards into a dark hole"; - if ((self hasnt general) && (TEMPLE_2E hasnt general) && - (amulet has worn)) { - give self general; - ".^^Your amulet suddenly gives off a bright purple flash!"; - } - else "."; - ], - name "stones" "dirt" "archway" "ladder" "hole", - e_to [; - if (children(player) ~= 0) - "You try to squeeze through the hole, to \ - no avail. You're carrying too much to fit."; - else return TEMPLE_3E; - ], - d_to TEMPLE_2, -; - -Object TEMPLE_3E "Low Chamber" - with description "You're in a tiny low room, dimly lit by strange \ - glowing lichens and mosses. A tiny exit lies west between some \ - collapsed rock -- it looks like a very tight squeeze. The room is \ - otherwise filled with broken rock and the like. A tiny round hole \ - is in the very center of the floor.", - name "lichens" "mosses" "rock", - w_to [; - if (children(player) ~= 0) - "You try to squeeze through the hole, to \ - no avail. You're carrying too much to fit."; - else return TEMPLE_3; - ], - d_to "You can barely fit your hand in the hole.", -has light; - -Nearby TEMPLE_3_Opening "opening" - with name "opening" "hole" "tiny" "round", - description "A smooth round hole in the stone in the floor \ - that descends into darkness.", - before [; - Receive: - if (noun hasnt is_rod) - "Oddly, that doesn't quite fit."; - else { - print "The rod slips through with ease. \ -Moments later you"; - if (umbrella notin TEMPLE_Pool) { - remove noun; - " hear a splash from somewhere below."; - } - else { - if (children(TEMPLE_1_Opening) == 0) - move noun to TEMPLE_1_Opening; - else { - if (TEMPLE_Artifact in TEMPLE_1_Opening && - children(TEMPLE_Artifact) == 0) - move noun to TEMPLE_Artifact; - else move noun to TEMPLE_1E; - Achieved(22); - } - ! if (TEMPLE_Artifact notin TEMPLE_1_Opening) - ! move noun to TEMPLE_1_Opening; - ! else - ! move noun to TEMPLE_Artifact; - " hear a thump from below, followed by a rattling noise, \ - and finally another thump, much fainter."; - } - } - ], - capacity 1, - size 10, - has scenery container open; - - -! (Super Zmart) (REMOVED) - -Object stuffed_toy "stuffed toy" MIZNIA_Park - with name "toy" "stuffed" "alligator", - initial "A stuffed toy has been left unattended on someone's lawn.", - description "A cute little stuffed toy alligator.", - !weight 5, - size 15, -; - - - -Object FROBAR_Ent "In Front of Swank House" - with description "You're in front of a rather swank looking house to the \ - northeast. To the southwest is the rest of Mizniaport.", - name "house", - sw_to MIZNIA_GUSStop, - ne_to [; - if (Frobar in Delbins) - "You walk up to the front door, only to find it locked."; - else return FROBAR_Foyer; - ], - in_to [; - if (Frobar in Delbins) - "You walk up to the front door, only to find it locked."; - else return FROBAR_Foyer; - ], - has light; - -Nearby Frobar_mailbox "mailbox" - with name "mailbox" "box", - description "A mailbox stands in front of the house. The letter \ - ~F~ is on one side.", - capacity 5, - size 15, - ! block a receive here? - has static container openable; - -Object Ench_mag "copy of ~Enchanter Monthly~" Frobar_mailbox - with name "magazine" "monthly" "enchanter" "copy", - description "~Enchanter Monthly~ has been somewhat lacking in \ - quality content these days (The absence of magic probably \ - being a large factor behind this). For filler, the editors have \ - been turning in mostly tabloid drivel articles about ~What ever \ - happened to so-and-so?~. This month's cover story \ - suggests that Barsap the magician was actually turned into a tortoise \ - during the Great Cataclysm, and underwent a slow mutation into a \ - newt.", - !weight 5, - size 15, -; - - - - -! ********** -! critters/people -! ********** - -Object Shaman "jungle shaman" - with name "shaman" "tribesman" "native", - description [; -print "A jungle native with a rather elaborate costume \ - make of bird feathers and animal hides. He seems old, but wise"; -if (self hasnt general) - ". Unlike the rest of the natives, this one is not wearing a \ - fancy feather-and-fur headdress."; -else "."; - ], - life [; - Order: - if ((action==##Give) && (noun==Jungle_Map) && (Jungle_Map in self)) - "You try to convey your desire for the map with \ - gestures. The shaman seems to understand. He \ - points to the map, then you. Then, he raises his \ - hand in a 'stop' gesture. Then, he points to his \ - bare head."; - "The shaman does not seem to understand."; - Give: - if (noun==headdress) { - move Jungle_Map to player; - move headdress to Shaman; - give self general; - "The shaman takes the headdress and places it on his \ - head. He smiles, and gives you a strange map in return."; - } - "The shaman smiles and shakes his head."; - Attack, ThrowAt: - deadflag = 1; - "As you make a threatening move, several of the natives \ - step forward and pierce your body with stout spears. \ - It appears they've had bad dealings with outsiders \ - before."; - Show: - if (noun == headdress) - "The shaman nods and points to the headdress, then \ - himself."; - "The shaman says something in a language you've never \ - heard before."; - default: "You can't seem to communicate with him; their \ - language is completely foreign to you."; - ], - before [; - Cast: - if (the_spell_was == foblub_spell or espnis_spell) - "You begin the sermon, but the shaman and natives \ - seem very puzzled by your speech, and clearly \ - can't understand a word you're saying. The chant \ - fails."; - ], - has animate; ! transparent? - -Object Jungle_Map "jungle map" Shaman - with name "map" "jungle", - description [; - print "The map is somewhat crudely drawn:^^"; - font off; - spaces 23; print "xxxx^"; - spaces 23; print "xxxx^"; - spaces 23; print "XXXX^"; - spaces 22; print "/^"; - spaces 18; print "XXXX^"; - spaces 18; print "XXXX^"; - spaces 18; print "XXXX^"; - spaces 20; print "I^"; - spaces 18; print "oooo^"; - spaces 12; print "<#>---oooo^"; - spaces 18; print "oooo^"; - spaces 20; print "I^"; - spaces 18; print "XXXX^"; - spaces 18; print "XXXX^"; - spaces 18; print "XXXX^"; - font on; - ], - ! weight 10, - size 10, -; - -Object earth_spirit "earth spirit" TEMPLE_3 ! TEMPLE_3E - with name "spirit", - description "It looks like a large moving mass of mud and earth, \ - in a somewhat man-like shape.", - 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; - "^Some of the dirt and mud in one corner stirs! A form \ - made of mud and earth suddenly rises to attack!"; - } - i = random(5); - if (i == 1) { - deadflag = 1; - "^The earth creature moves quickly, and blinds you with \ - a spray of dirt! You clear your eyes, only to see the \ - brown mass move forward and bury you! You struggle, but \ - suffocate in short time."; - } - 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 earth spirit was too much for \ - you, I'm afraid to say. The spirit slowly sludges \ - towards you for the final blow..."; - } - print "^The earth spirit "; - if (i==2) - "clubs you with a heavy pseudopod \ - made of animated soil and rock. Ouch!"; - if (i==3) { - print "throws some loose soil and sand in \ - your face! The attack knocks you back, and \ - you fall into the chamber below!"; - PlayerTo(TEMPLE_2); - rtrue; - } - "sends a spray of sharp rocks \ - your way, and you just dodge in time!"; - ], - before [; - Cast: - if (the_spell_was == swanko_spell) { - remove self; - "As you speak the chant, the earth spirit falls back \ - in fear! You finish the chant, and the earth spirit \ - collapses into a heap of dirt and mud, banished!"; - } - print "The creature makes a banshee-howl as you chant.^"; - ], - life [ ; - Attack: - print "You "; - if (random(20) >= 8) - "strike the earth creature, but your attack passes \ - harmlessly through it! You hear a strange noise from \ - the creature -- akin to mad laughter from someone \ - trapped underground in a coffin."; - "attack the earth spirit, but miss!"; - default: "It's too busy trying to kill you."; - ], - has animate concealed; - -! ********** -! spells/scrolls -! ********** - -! TODO (Dan, why is this declared _here_?) -Object white_scroll "white scroll" - class scroll_class, - with name "white", -; - -Object huncho_spell "send object to higher plane" white_scroll - class spell_class, - with name "huncho", - magic [; - if (second == 0) -"You see a brief flash of light, but nothing happens."; - if (second == player) { - print "You finish the chant"; -! if ((location == ATRII_8) && (ATRII_8 hasnt general) && -! (white_rod_piece in player) && (black_rod_piece in player) && -! (smoke_rod_piece in player) && (gray_rod_piece in player)) { - if ((location == ATRII_8) && (ATRII_8 hasnt general)) { - give ATRII_8 general; - spell_block = 1; - print " and notice the \ -white streaks of light above widen, as though a rift was \ -being torn in the sky! You feel a force pulling you \ -upwards, into the unknown!^"; - StartTimer(Imp_Liv,10); - PlayerTo(Imp_Liv); - rtrue; - } - else - ", and see a short-lived flash -of light above, but nothing else."; - } - if (second has animate) { - "You feel a slight rumbling overhead, but nothing else \ -happens."; - } - else { - if ((second hasnt static) && (second hasnt scenery) && - (in_atrii == 0)) { - if (second has clothing) give second ~worn; - move second to ATRII_8; - print "There is a flash of light, and "; DefArt(second); - " suddenly vanishes!"; - } - "Your chant goes unanswered."; - } - ], -; - -Object muddy_scroll "muddy scroll" Deep_Jungle - class scroll_class, - with name "muddy", - initial "Partially buried in the mud is a scroll.", -; - -Object throck_spell "grow plant" muddy_scroll - class spell_class, - with name "throck", - magic [; - "Your chant goes unanswered. It's intended for plants only."; - ], -; - -! ********** -! misc objs -! ********** - - -! 'earth' rod piece -- BLACK -Object black_rod_piece "black rod piece" TEMPLE_3E - class rod_class, - with name "black", - initial "In the center of the room is a short black rod.", - description "It's a short section of a rod made of some \ -undeterminable hard substance, \ -colored an inky black. A piece of the Rod of \ -the Ancients, I'd warrant!", -; diff --git a/src/SPECIAL.INF b/src/SPECIAL.INF deleted file mode 100644 index 1d22b5c..0000000 --- a/src/SPECIAL.INF +++ /dev/null @@ -1,1736 +0,0 @@ -! ********************************************************************* -! SPECIAL.INF -- Add-on for SPIRITWRAK -! Contains: 'specials' that I wanted to keep separate from -! the other 'city-based' .INF files (Atrii, NPC homes) -! ********************************************************************* - -! ----------------- (Frobar's home) ------------------------- - -Object FROBAR_Foyer "Entrance Foyer" - with description "You are in the Entrance Foyer of a \ -small but tasteful home. The exit is to the southwest. \ -The general area is tastefully done in maroon carpeting \ -and brass fixtures. Another room lies to the north.", - name "maroon" "carpeting" "brass" "fixtures", - sw_to FROBAR_Ent, - out_to FROBAR_Ent, - n_to FROBAR_Parlor, - has light; - -Object FROBAR_Parlor "Parlor" - with description "You are in a very decorative parlor. \ -Various furnishings of high quality are arranged around \ -an enormous rug with intricate golden symbols in the weave \ -design. Open doorways lead south, north, east and west.", - name "rug" "doorways" "furnishings" "symbols", - s_to FROBAR_Foyer, - n_to FROBAR_Bedroom, - e_to FROBAR_Study, - w_to FROBAR_Lounge, - has light; - -Object frobar_plant "large potted plant" FROBAR_Parlor - with name "plant" "large" "potted", - initial "A large potted plant sits in one corner.", - description "A well-tended house-plant.", - before [; - Cast: - if (the_spell_was == throck_spell) { - "The plant seems even healthier now."; -! if (Frobar in FROBAR_Bedroom) -! (couldn't think of a proper reaction...:) - } - ], - has static; - -Object FROBAR_Lounge "Lounge" - with description "A large room here apparently serves as a lounge \ -for entertaining. The walls and furniture all have interesting \ -design work that gives an impression of dignified age. A doorway \ -heads east.", - name "furniture" "doorway", - e_to FROBAR_Parlor, - has light; - -Object FROBAR_Study "Study" - with description "This is a study room with fancy wood paneling and \ -plush carpeting. There is an exit to the west.", - name "wood" "paneling" "carpeting", - w_to FROBAR_Parlor, - has light; - -Nearby FROBAR_shelves "large bookshelf" - with name "shelves" "shelf" "bookshelf", - initial "A large bookshelf takes up most of the north wall.", - description "It's filled with odds and ends, mostly uninteresting.", - capacity 30, - has static supporter; - -Object FROBAR_Journal "plain journal" FROBAR_shelves - with name "journal" "plain", - ! weight 15, - size 15, - description "This is a short journal of notes that \ -Frobar was keeping. The contents are quite dull, mostly \ -consisting of entries like ~Remember to water plant~ and \ -so forth. In fact, the only non-trivial entry follows:^^\ -~Perhaps today I will go visit Barsap's latest creation. \ -Then again, maybe I won't. This so-called 'Gambit' of his \ -is supposed to be some silly diversion where people can \ -hop around floating platforms trying to reach the southeast \ -corner \ -platform on the bottom level, just so they can get \ -teleported back to the top, and start all over again! \ -Can this be a monetarily beneficial thing? I doubt it.~"; - -! (twisted -- four ancient ones) -Object p5 "twisted parchment" FROBAR_shelves - class parchment_class, - with name "twisted", -description "~...understand. I, like many of the Order, \ -have understood that the greatest Saints of our Order were \ -the Three, those Three that we know as the Ancient Ones. \ -Why then, do I find in ancient cairns, in hidden temples, \ -and in versions of the Scriptures found in unsettled lands, \ -that _four_ beings that called themselves the Ancient Ones \ -did do battle with evil and were defeated? This surely is \ -not to be believed, but I...~"; - -Object FROBAR_Desk "large wood desk" FROBAR_Study - with name "desk", - description "A massive wood desk carved from a single block of wood.", - capacity 20, - has static supporter; - -Object FROBAR_Bedroom "Bedroom" - with description "A nice cozy bedroom. The exit is south.", - s_to FROBAR_Parlor, - has light; - -Object FROBAR_bed "large bed" FROBAR_Bedroom - with name "bed", - description "A large comfortable-looking bed.", - before [; - LookUnder: "Sorry, no monsters here."; - ], - has static enterable supporter; - -!Object FROBAR_Painting "large painting" FROBAR_Bedroom -! with name "painting", -! initial "There is a large painting hanging on the wall.", -! description [; -! if (self hasnt general) -! "It appears to be an oil painting of a \ -! scroll on a table. A small note on the frame says, \ -! ~Still-life with Scroll, -FF, 791~"; -! else -! "It appears to be an oil painting of a \ -! table. A small note on the frame says, \ -! ~Still-life, -FF, 791~"; -! ], -! before [; -! Touch, Rub, Push: -! if (self hasnt general) { -! give self general; -! move painted_scroll to player; -! Achieved(23); -! print "As you touch the painting, your hands \ -!run across the scroll, and the oil takes on a three-dimensional \ -!quality! You ignore the strange sensations as you reach \ -!into the painting, and withdraw the scroll"; -! if (Frobar in FROBAR_Bedroom) -! "! Frobar watches the events over your \ -!shoulder, and seems puzzled. ~Now, why didn't I ever think to try \ -!that,~ he muses."; -! else "!"; -! } -! else -! "The painting seems to be nothing more than \ -!an oil painting now."; -! ], -! has static; - -! ----------------- (Thief's home) ------------------------- - -Object THIEF_Bottom_of_staircase "Wondrous Stairway" - with description "An enormous spiral staircase seems to wind miles \ -above your head in this curious column-like chamber. Strange \ -points of light brighten the chamber from above. \ -To the west is a small exit.", - name "points" "light" "staircase" "stairway" "stairs", -! TODO -- fix this weirdness... - u_to THIEF_Ent, - w_to "You can't go that way.", ! but later... - before [; - Go: - if (noun == u_obj) - print "^You begin the long trek upwards. Strangely, \ - the stair seems to twist and move as you step on it, \ - turning like a corkscrew, until you are \ - graciously deposited at the top, far above your \ - previous location.^"; - ], - has light; - - -Object THIEF_Ent "Fancy Hall" - with description "This must be an apartment or penthouse in the \ -skyscraper. You are in a very high hall, with black slate stone \ -walls that seem to reflect shadows everywhere. There is a room \ -to the north. The southern edge of this room drops off into the \ -darkness, followed by a long spiral staircase. The ceiling overhead \ -seems to have tiny points of light like a night sky.", - name "slate" "shadows" "staircase" "points" "light", - d_to THIEF_Bottom_of_staircase, - n_to THIEF_Foyer, - has light; - -Object THIEF_Foyer "Magnificent Foyer" - with description "This is an exceptionally grand entrance foyer, \ -with sweeping arched ceilings and sparkling chandeliers. The \ -room is dimly lit. Open hallways lead south and west.", - name "chandeliers", - s_to THIEF_Ent, - w_to THIEF_Lounge, - has light; - -Object THIEF_Lounge "Fancy Lounge" - with description "A tastefully overdone lounge with tapestries \ -and gold enamel finished walls. The room is dimly lit, although \ -you see no windows or other sources of light. Open hallways lead \ -east and west.", - name "tapestries" "enamel", - e_to THIEF_Foyer, - w_to THIEF_Storeroom, - has light; - -Object THIEF_Journal "short journal" THIEF_Lounge - with name "journal", - initial "There's an open journal sitting here.", - ! weight 15, - size 15, - description "This appears to be a short collection of notes:^^\ - ~TIPS ON CRACKING THE NEW FROBOZZCO 3-DIAL COMBO LOCKS: ^\ - Remember, there's a slight flaw in the design. For every \ - correct number in the correct dial, pressing the opening button \ - with cause a small click. Dials with the correct number in the \ - wrong dial place will cause a small thunk. The lock mechanism \ - scans for correct numbers in correct places first, and then \ - for correct numbers in the wrong place in the 'remaining dials'. \ - Simple! But don't forget, closing the locks will automatically \ - lock and reset the dials!^^\ - NEW FLATHEAD PAINTING: ^\ - I've completed making the copy of the new Leonardo Flathead painting, \ - received courtesy of the Royal Museum. Glad to say my skills in \ - art forgery are undiminished -- I can barely tell the difference \ - between the two myself! I'll soon replace the original with the \ - copy, and no one will be the wiser!~"; - - -Object THIEF_Storeroom "Workroom" - with description [; - print "A sight to inspire even the most avaricious, this \ - storeroom is filled with all sorts of rare and precious treasures. \ - A hallway leads east"; - if (self hasnt general) - print ". You notice that the west wall appears to be made of \ -solid granite"; - "."; - ], - name "hallway", - e_to THIEF_Lounge, - before [; - Examine: - if ((noun == w_obj) && (self hasnt general)) - "The west wall is a solid piece of granite, which \ -seems very odd, considering the other walls are clearly made of \ -slate."; - Cast: - if ((the_spell_was==ledak_spell) && (Painting_FAKE in self)) { - if (Painting_REAL in self) - print "One of the paintings"; - else print "The painting"; - remove Painting_FAKE; - " is surrounded by a yellow glow! It crumbles into \ -dust!"; - } - ], - has light; - -Nearby THIEF_treasure "precious treasures" - with name "treasure" "jewels" "gemstones" "artifacts", - description "Piles of rare gemstones, precious jewelry, \ - priceless artifacts, and other treasures line the walls \ - here.", - before [; - Take: - "Fortunately, your high moral standing allows you \ - the benefit of having no need for such materials of excess."; - ], - has scenery; - -Object pasta "pile of fettucini carbonari" - with name "pile" "fettucini" "carbonari" "pasta", - description "A large pile of fettucini dripping in \ -carbonari sauce.", - before [; - Eat: - if (self hasnt general) { - give self general; - "You manage to stuff yourself with pasta, \ -but there's still quite a lot left."; - } - else - "You've already had enough of this stuff \ -to last a lifetime. Just the thought of eating more is enough to \ -make you queasy."; - ], - size 16, - has edible; - -Object c50 "coin" class coin_class; - -Object Painting_FAKE "priceless painting" THIEF_Storeroom - with name "painting", - plural "priceless paintings", - short_name "priceless painting", - description "It's a beautiful oil painting of a dark stormy \ -scene. On the horizon, you can see the edges of mountaintops. Near \ -the top of the painting, two winged figures are carrying a lone \ -individual towards a break in the clouds, where a bright white light \ -seems to emanate.", - ! weight 25, - size 25, - before [; - Drop: - if (location == Museum_north) { ! player returned fake painting to museum! - remove self; - "A museum curator appears and takes the \ -painting. With an expert eye, he looks closely at it. ~This is \ -a fake! I warn you sir, art forgery is a dangerous game.~ He \ -leaves, much disgusted."; - } - Take: - if (Painting_REAL in parent(self)) - "They both look so genuine! You can't decide!"; - Cast: - if (the_spell_was == ledak_spell) { - remove self; - "One of the paintings is surrounded by a bright \ -yellow glow, and disintegrates!"; - } - Search: - if (Painting_REAL in parent(self)) - "Search which one? Goodness, you can't decide!"; - ], - ; - - -! -------------ETHEREAL PLANE OF ATRII ------------ - -Object ATRII_1 "Ethereal Plane of Atrii" - with description "Standing on a featureless gray plane that \ - stretches to the infinite horizon against a gray sky, you \ - can only conclude one thing -- you're on the Ethereal Plane \ - of Atrii. Well, at least it fits the description Brother \ - Palemon gave you. It seems like you could go in any \ - direction from here.", - cant_go "An invisible force blocks your way!", - name "plane" "horizon" "sky", - sw_to ATRII_2, - se_to ATRII_3, - has light; - -Object ATRII_2 "Ethereal Plane of Atrii" - with description "Flat, featureless gray is in every direction \ - you look. Stranger still is the upright rectangular hole in the \ - fabric of space that stands in the center of this area. \ - Otherwise, you could wander this gray dimension in any direction, \ - it seems.", - cant_go "An invisible force blocks your way!", - ne_to ATRII_1, - sw_to ATRII_4, - e_to ATRII_3, - s_to ATRII_6, - has light; - -Nearby ATRII_2_hole "rectangular hole" - with name "hole" "rectangle" "opening", - description "Surely you are in a place where the very laws of \ - nature and the Gods work by different rules! Here stands a \ - rectangular hole, seemingly torn out of the very space you \ - stand in. You see some curious metal chamber through the \ - opening, but there is nothing behind the opening.", - before [; - Enter: - print "^You step through and feel your stomach twist. \ - You stumble past a set of open metal doors into...^"; - in_atrii = 0; - PlayerTo(Skyscraper); - return 2; ! allow, but print nothing... - ], - has scenery enterable; - -Object ATRII_3 "Ethereal Plane of Atrii" - with description "Flat, featureless gray is in every direction \ - you look. Stranger still is the flat, glass-like square in the \ - center of the 'floor' of this area. \ - Otherwise, you could wander this gray dimension in any direction, \ - it seems.", - cant_go "An invisible force blocks your way!", - nw_to ATRII_1, - w_to ATRII_2, - se_to ATRII_5, - s_to ATRII_7, - has light; - -Nearby ATRII_3_ice "square of ice" - with name "square" "ice" "glass-like", - description "It looks and feels like a perfect square of ice, \ - flush with the featureless gray surface you stand on.", - before [; - Enter: - print "You step onto the square, and before you know it, your \ -surroundings shift and start to fade! You feel a \ -sudden chilling wind. The ice seems to lengthen and stretch. The \ -gray plane slowly turns white and bumpy.^"; - in_atrii = 0; - PlayerTo(Frozen_river2); - return 2; - ], - has scenery enterable; - -Object ATRII_4 "Ethereal Plane of Atrii" - with description "Flat, featureless gray is in every direction \ -you look. Stranger still is the large black hole to the south. \ -Otherwise, you could wander this gray dimension in any direction, \ -it seems.", - cant_go "An invisible force blocks your way!", - ne_to ATRII_2, - se_to ATRII_6, - s_to [; <>; ], - has light; - -Nearby ATRII_4_hole "black hole" - with name "hole" "black", - description "It looks like a large hole, probably twice your \ - height. It's completely black and featureless.", - before [; - Enter: - print "^You step into the black hole. You stumble \ - forward, surrounded by blacker-than-night darkness.^"; - in_atrii = 0; - PlayerTo(Subway_Tunnel); - return 2; - ], - has scenery enterable; - -! (secret subway tunnel) -Object Subway_Tunnel "Dark Tunnel" - with description "You're in a large dark tunnel that seems \ - to run north and south. To the south you see light. There \ - seem to be two metal tracks running along the ground.", - s_to GURTH_GUSPlatform, - n_to "You walk north, and run into a invisible force!", - before [; - Go: - if (noun==s_obj) { - Achieved(25); - print "^You step out into an underground chamber. \ - A burly uniformed figure sees you exit the tunnel and yells, \ - ~Hey, no playing in the tunnels, pal!~^"; - } - ], - each_turn [ i ; - i = random(40); - if (i > 35) - "^You hear a rumbling noise echoed from somewhere, and \ - the entire tunnel seems to shake! Then, all is quiet."; - if (i == 17 or 18) { - deadflag = 1; - "^Suddenly, without warning, a huge train car appears \ - heading south! It plows straight into you!"; - } - if (i==6 or 7) - "^Suddenly, a huge train car appears heading north! \ - You barely avoid getting pulverized! Strangely, \ - you watch as the train continues north, and \ - seems disappear into blackness nearby. It's as \ - though the train was simply removed from the tunnel \ - somehow."; - ], -; - -Nearby ST_tracks "tracks" - with name "tracks" "tracks" "metal", - description "Two long metal tracks, running north and south. \ - There's something oddly familiar about them.", - has scenery; - -Object ATRII_5 "Ethereal Plane of Atrii" - with description "Flat, featureless gray is in every direction \ - you look. It seems like you could go in any \ - direction from here.", - cant_go "An invisible force blocks your way!", - nw_to ATRII_3, - sw_to ATRII_7 - has light; - -Object p9 "ripped parchment" ATRII_5 - class parchment_class, - with name "ripped", -description "~...now know that the Rod we believe is \ -the Rod of the Ancients, sequestered in our Monastery, is \ -an artifact of evil! Imprisoned inside, \ -true to the scriptures (at least this much is, what \ -isn't, I can nowadays say is much) we know, is Anabais. \ -What is worse, is that this very Rod is an artifact of \ -evil power created by Anabais, in the image of the True \ -Rod of the Ancients, which he planned to use to aid \ -him in his evil gains! \ -Were that evil one free again, and had about him both \ -his brothers and his Rod of Evil, we would witness a \ -reckoning \ -greater than Quendor has ever known! I take relief in \ -the knowledge that he will never be freed, and he will \ -never regain his implement of evil; only an innocent \ -being can break the false rod and \ -free him from his prison, and subsequently, \ -the false rod cannot be regained by Anabais through his \ -own will, or another evil being. \ -In fact, only a being of good again can gather \ -the resulting pieces, and only through this being \ -can Anabais regain his evil artifact, for...~"; - - -Object ATRII_6 "Ethereal Plane of Atrii" - with description "Flat, featureless gray is in every direction \ - you look. It seems like you could go in any \ - direction from here.", - cant_go "An invisible force blocks your way!", - nw_to ATRII_4, - e_to ATRII_7, - n_to ATRII_2, - se_to ATRII_8, - has light; - -Object ATRII_7 "Ethereal Plane of Atrii" - with description "Flat, featureless gray is in every direction \ - you look. Stranger still is the odd-shaped depression in the gray \ - plane here. \ - Otherwise, you could wander this gray dimension in any direction, \ - it seems.", - cant_go "An invisible force blocks your way!", - ne_to ATRII_5, - w_to ATRII_6, - sw_to ATRII_8, - n_to ATRII_3, - has light; - -Nearby ATRII_7_depression "depression" - with name "depression" "cavity", - description "It's a large elongated depression in the gray 'floor'. \ - The cavity has a flat bottom, and somewhat cigar-like shape.", - before [; - Enter: - print "^You step into the depression. Your very \ - surroundings start to fade, replaced by sunlight that \ - makes you squint! The gray plane undulates and \ - buckles and turns into a great body of water \ - before your very eyes.^"; - in_atrii = 0; - PlayerTo(sailboat); ! useful if the player 'lost' the boat at sea. - return 2; - ], - has scenery enterable; - -Object ATRII_8 "Ethereal Plane of Atrii" - with description "Flat, featureless gray is in every direction \ - you look. Directly overhead, you notice odd streaks of \ - light. From here, you could wander this gray dimension in any direction, \ - it seems.", - name "streaks", - cant_go "An invisible force blocks your way!", - nw_to ATRII_6, - ne_to ATRII_7, - has light; - -! ----------- Special Implementor's Residence ----------- - -Object Imp_Liv "Strange Room" - with description [; - print "You "; - if (player in Imp_Curtains) - "can't see much behind these curtains."; - else "feel a great sense of dread! Surely, given the way \ -you got here, this must be the domicile of a dreaded Implementor! \ -The entire place feels strange and \ -alien and, well, ~modern~. There's some sort of kitchen to the \ -east. Long curtains cover what must be a window to the south."; - ], - number 1, - e_to Imp_Kitchen, - w_to Imp_door, - s_to [; <>; ], - each_turn [ ; - if (Imp in Imp_Bedroom) { - if (Imp_Liv.number == 3) { - StartDaemon(Imp); - Imp_Liv.number = 4; - } - else "^You hear some faint noises to the west."; - } - ! create some noises if player in curtains - if (player in Imp_Curtains) { - if (Imp in Imp_Liv) - "^You hear some faint noises nearby."; - if (Imp in Imp_Kitchen) - "^You hear some faint noises to the east."; - } - ], - time_left 0, - time_out [; - ! if player hasn't 'listened' twice to start Imp, - ! start him anyway (otherwise, in truth, player - ! would be permanently stuck in (my) apartment. - if (Imp_Liv.number < 4) { - StartDaemon(Imp); - Imp_Liv.number = 4; - } - ], - before [; - ! if player actually listens, better noises... - Listen: - if (Imp in Imp_Bedroom) { - if (Imp hasnt general) { ! i.e. -- awake - if (Imp_Liv.number == 1) { - Imp_Liv.number = 2; - "It sounds like someone is talking to himself to \ -the west. You hear: ~Now, wait just a second here, the player object \ -is gone! How did that happen?~"; - } - if (Imp_Liv.number == 2) { - Imp_Liv.number = 3; - "It sounds like someone is talking to himself to \ -the west. You hear: ~That can't be right. I must be getting tired. \ -Think I'll make myself a nice hot cup of coffee.~"; -! on next turn via Imp_Liv.each_turn, Imp daemon will be started... - } - ! otherwise, Imp has already made his rounds and - ! returned to bedroom, _not_ falling asleep - "You hear someone whistling a merry tune to the west."; - } - else - "You hear someone snoring loudly to the west."; - } - if (Imp in Imp_Liv) { - if (Imp.number == 1) - "You hear someone walking nearby. The footsteps \ -soon fade to the east."; - if (Imp.number == 4) - "You hear someone walking nearby. The footsteps \ -soon fade to the west."; - } - if (Imp in Imp_Kitchen) { - ! This assumes the daemon will run before the player turn. - if (Imp.number == 2) { - switch (Imp.weight) { - 118: print "You hear an irritated voice say, \ -~What happened to my coffee maker?~ Slightly softer, you \ -hear ~Well, I guess I'll have that iced tea.~"; - 119, 122: print "You hear a voice to the east say, \ -~Looks like I've got coffee, thank goodness.~"; - 121: print "You hear a voice to the east say, \ -~Great, I'm all out of coffee. Good thing I still have some \ -iced tea.~"; - } - " Shortly after this, you hear sounds of someone to \ -the east starting some kitchen activity."; - } - else "You hear some brief busy noises from the west, \ -followed by what sounds like someone drinking something. Shortly \ -thereafter, you hear the sounds of someone walking into the area \ -from the east."; - } - ], - has light; - -Nearby Imp_Curtains "set of curtains" - with name "curtain" "curtains", - description "Some heavy-cloth curtains along the south wall.", - before [; - Open: "You draw back the curtains and see a sight that \ -beggars the mind! Through the windows, the night sky falls across \ -some unknown landscape, dotted with strange bright points of light. \ -Tall buildings seem to be everywhere. Whatever world you've stumbled \ -onto, it certainly is not your own! You hastily close \ -the curtains."; - Enter: print "In an attempt to hide, you part the curtains. "; - ], - has static enterable; - -Object Imp_Kitchen "Strange Kitchen" - with description "A room that could be a kitchen, \ -if it didn't seem completely strange. Harsh bright lights seem to \ -be coming from some unknown source. Strange-looking white countertops and \ -cabinets fill the area, along with a curious white closet-like object. \ -A room lies to the west.", - name "cabinet" "cabinets" "closet" "refrigerator" "countertops", - w_to Imp_Liv, - has light; - -Object Coffee_maker "curious machine" Imp_Kitchen - with name "machine" "curious", - description "A white plastic device that seems to \ -encase a glass pitcher or kettle of some sort. Most odd.", - ! weight 15, - size 15, -; - -Object regular_coffee_can "can of regular coffee" Imp_Kitchen - with name "can" "coffee" "regular", - description [; - "The can reads: ~Brand-X coffee crystals~^^\ - ~Rich, mountain-grown flavor.~"; - ], - before [; - Open: - "You'd need a good can-opener for that."; - ], - ! weight 15, - size 15, -; - - -Object Imp_Bedroom "Strange Bedroom" - with description "A very curious small bedroom. \ - A white desk sits here amongst other odd furnishings.", - name "furnishings" "bed" "chair", - e_to Imp_door, - has light; - -!Nearby Imp_Bed "furnishings" -! with name "furnishings" "bed" "chair", -! description "Some weird bedroom furniture.", -! has scenery; - -Object Imp_Desk "desk" Imp_Bedroom - with name "desk", - description "A white desk, with a strange, modern look.", - capacity 6, - has scenery supporter; - -Object Imp_Computer "strange machine" Imp_Desk - with name "machine" "computer", - description - [ ; - print "It's a strange metal box. On top, perhaps connected in some \ -way, is another metal box with a glass plate on the front. Strange wires \ -seem to be attached to the boxes somehow. \ -In front of the boxes is an odd plastic \ -flat object with rows and rows of plastic buttons labeled every letter in \ -the alphabet"; - if (self hasnt general) { - give self general; - print ".^^Looking closer, you notice curious glowing \ -letters on the glass plate. You read the letters, and \ -feel drawn to respond...^^\ -SPIRITWRAK DEVELOPMENT SYSTEM:^\ -(AUTOMATIC OBJECT GARBAGE-COLLECTION)^\ -REMOVE OBJECT IMPENETRABLE_STEEL_WALL? (Y/N) "; -if (YesOrNo() == 0) "You press a button labeled ~N~. The strange box \ -emits a tiny beep, and the glass plate is covered with fantastic colorful \ -designs."; -else { - ! set-up the secret room - remove steel_wall; - give cave_intersection general; - Achieved(18); -"You press a button labeled ~Y~. The strange box \ -emits a tiny beep, and the glass plate is covered with fantastic colorful \ -designs."; - } - } - else ". The glass plate currently has strange glowing colorful \ -patterns displayed on it."; - ], - has static; - -[ ImpSendBack ; - print "~I'm afraid you'll have to go back.~ The Implementor \ -snaps his fingers, and suddenly, you're back in...^"; - spell_block = 0; - StopDaemon(Imp); - StopTimer(Imp_Liv); - PlayerTo(ATRII_8); -]; - -Nearby Imp_door "door" - with name "door", - when_closed [; - if (self in Imp_Liv) { - if (player notin Imp_Curtains) - "There's a closed door to the west."; - else rtrue; - } - else "There's a closed door to the east."; - ], - when_open [; - if (self in Imp_Liv) { - if (player notin Imp_Curtains) - "There's an open door to the west."; - else rtrue; - } - else "There's an open door to the east."; - ], - description "A plain-looking door. A note \ -attached to it says ~DO NOT DISTURB, IMPLEMENTOR AT WORK~.", - door_dir [; - if (self in Imp_Liv) return w_to; - else return e_to; - ], - door_to [; - if (self in Imp_Liv) return Imp_Bedroom; - else return Imp_Liv; - ], - found_in Imp_Liv Imp_Bedroom, - before [; - Open: - if ((Imp in Imp_Bedroom) && (Imp hasnt general)) { - print "You open the door, revealing a small room with \ -what must be an Implementor sitting behind a desk. The Implementor looks \ -up, startled. ~You're here?~ he says, observantly. "; - ImpSendBack(); - return 1; - } - ], - has static door openable; - - -! *************** And, for my final trick, the endgame ************** - -Object Mystical_Cave "Mystical Cave" - with description "You've entered a wondrous natural cave, lit \ -everywhere by reflected light from some sort of purple crystalline substance \ -in the walls. A tunnel exits to the northwest.", - name "reflected" "crystal" "crystalline" "substance", - number 0, - nw_to [; - if (Mystical_Cave.number ~= 4) - "The purple light in the chamber seems to pulse with energy, \ -and find your way blocked by an invisible force!"; - else { - spell_block = 0; - ! fill with things, if necc. - print "As you leave, a sudden tremor shakes the \ -cave! You just narrowly avoid a sudden cave-in behind you!^"; - give cave_intersection ~general; - return cave_intersection; - } - ], - has light; - -Nearby purple_sphere "purple sphere" - with name "sphere" "purple", - initial "There's a purple crystal sphere partially embedded \ -in the rock floor here.", - description "A large purple sphere that seems to pulse with \ -strange energy.", - before [; - Push, Touch, Rub: - ! various endgame trickery... - if (silver_rod_piece in player) { - while (child(player)~=0) { - give child(player) ~worn; - move child(player) to Mystical_Cave; - } - move silver_rod_piece to player; - spell_block = 1; - print "The sphere pulses with angry energy! It seems to \ -be fighting the silver rod piece you hold! With a sudden burst, you \ -feel your mind reel and your very surroundings change!^"; - give stone_marker general; -! give snowy_intersection general ~visited; - give snowy_intersection general; - StartTimer(White_Dragon,3); - PlayerTo(Dragon_Cave); - rtrue; - } - if (green_rod_piece in player) { - while (child(player)~=0) { - give child(player) ~worn; - move child(player) to Mystical_Cave; - } - move green_rod_piece to player; - spell_block = 1; - print "The sphere pulses with angry energy! It seems to \ -be fighting the green rod piece you hold! With a sudden burst, you \ -feel your mind reel and your very surroundings change!^"; - StartTimer(captain,3); - PlayerTo(On_Boat); - rtrue; - } - if (red_rod_piece in player) { - while (child(player)~=0) { - give child(player) ~worn; - move child(player) to Mystical_Cave; - } - move red_rod_piece to player; - spell_block = 1; - print "The sphere pulses with angry energy! It seems to \ -be fighting the red rod piece you hold! With a sudden burst, you \ -feel your mind reel and your very surroundings change!^"; -! give Stadium_entrance general ~visited; -! remove stadium_sign; -! remove stadium_statue; -! move statue_base to Stadium_entrance; - StartTimer(statue_base,2); - PlayerTo(Stadium_entrance2); - rtrue; - } - if (brown_rod_piece in player) { - while (child(player)~=0) { - give child(player) ~worn; - move child(player) to Mystical_Cave; - } - move brown_rod_piece to player; - spell_block = 1; - print "The sphere pulses with angry energy! It seems to \ -be fighting the brown rod piece you hold! With a sudden burst, you \ -feel your mind reel and your very surroundings change!^"; -! give GURTH_House general ~visited; -! move bad_brick to GURTH_House; - StartTimer(bad_brick,7); - PlayerTo(GURTH_House2); - rtrue; - } - ! default... - "A purple blast of force throws you back!"; - ], - has static; - -Object skeleton "skeleton" Mystical_Cave - with name "skeleton" "bones", - initial "Lying in one corner of the room is a skeleton.", - description "Just some bones, not much else, is all.", - before [; - Pull, Push, Turn, ThrownAt, Touch, Attack, Rub, -Cut, Shake, Squeeze, Kiss: - remove self; - "The skeleton crumbles into dust, as though \ -many years of time had suddenly caught up with it in one \ -moment."; - ], -has static; - -! (black -- final parchment of Palemon's final words) -Object p8 "blackened parchment" Mystical_Cave - class parchment_class, - with name "blackened", -description "~I write these final words not in the hope \ -that others will find and heed them, for this is too great \ -a hope in my moment of death, but rather, to try and maintain my mind and soul \ -in the face of the terror I now know is the truth.^^\ -For how can a man survive, knowing that his entire life, \ -his entire belief, has been a ruse, a dupe, from the \ -early beginning? That he has merely been a pawn in a \ -working of evil that cannot be stopped?^^\ -I have fought all manner of terrors, and recovered that which \ -I know is the _true_ Rod of the Ancients, broken and scattered \ -eons ago in the face of great evil. I sought also those \ -ancient spheres that the Four Ancients never had the chance to \ -use against the evil four elemental demons, but alas, I could \ -not find them all, and sequestered those which I did with \ -good people that the elemental evil could not touch.^^\ -Alas, my quest has ended here. I lie trapped here, \ -with the pieces of the true Rod in hand, unable to go forward, trapped by the \ -elemental mystic locks on the rod that prevent it from leaving this \ -very room, yet unable to go back, to leave the rod here and \ -deny the very real danger of the defeat of the Ancients, of \ -the power that the evil elementals hold.^^\ -What is a faith destroyed? Who can help me to believe, in my moment \ -of disbelief?^^\ ---P--~"; - - - - -Object Dragon_Cave "Giant Cavern" - with description "You find yourself in a huge cavern. To the west \ -is a large exit that looks out into a void of snow-covered mountains.", - name "mountains", - w_to "You hesitate. The cave seems to just \ -exit off the side of a mountain, and all you can see below is whiteness. \ -It could be a long way down.", - d_to [; <>; ], - out_to [; <>; ], - before [; - Jump: - print "You close your eyes and leap out of the cave! \ -You plummet through silent white winds. \ -Moments later, you fall right into an enormous snowbank, and \ -roll downwards, into...^"; - PlayerTo(snowy_intersection2); - rtrue; - ], - has light; - -Object On_Boat "On strange boat" - with description "You are on a long open boat, riding the waves of \ -some great sea. The boat seems to be filled with sailors from \ -some militia.", - name "waves" "sea" "mast" "floorboards" "ship" "boat", - before [; - Drop: - if (captain has general) { - if (noun==green_rod_piece) { - remove green_rod_piece; ! it'll be back - give shipwreck general; - Mystical_Cave.number = Mystical_Cave.number + 1; - StopTimer(captain); - StopTimer(militia); - print "You drop the green rod and watch it roll near \ -a mast and get stuck in the floorboards.^^\ -There's a load crack! The ship is breaking apart! Sailors \ -scramble in vain for safety! You hang onto the side of the \ -boat, but the vessel rocks wildly, and you fall into the waters. \ -^^As you sink, you notice the waters seem to change to a purplish \ -hue, and you find yourself back in...^"; - PlayerTo(Mystical_Cave); - rtrue; - } - } - else - "The sailors are holding you fast, so you \ -can't do this at the moment."; - ], - has light; - -Nearby militia "sailors" - with name "sailors" "militia" "navy", - description "A bunch of dour-looking navy sailors.", - time_left 0, - time_out [; - deadflag = 1; - "The ship breaks asunder! Sailors scramble madly \ -and fall into the violent waves! You hear \ -the captain scream ~Blast! I can't swim!~ before the \ -waters cover you completely."; - ], - has scenery; - -Object ENDGAME_ROOM "Nothingness" - with description "Nothingness surrounds you. Yet, you feel like \ -your conscious being extends into worlds and dimensions never \ -imagined. You float in a void of total being.", - number 0, ! number of elementals banished - each_turn [; - switch (ENDGAME_timer.number) { - 0: ENDGAME_timer.number = 1; - if (black_elemental in ENDGAME_ROOM) - "^Echoing in your mind, you hear a voice, that you \ -somehow know is from the black sphere. ~Give me the rod priest, \ -and you shall be immortalized as a symbol to an entire civilization!~"; - 1: ENDGAME_timer.number = 2; - if (smoke_elemental in ENDGAME_ROOM) - "^Echoing in your mind, you hear a voice, that you \ -somehow know is from the smoke-colored sphere. ~Give me the rod priest, \ -and I shall let you be witness to a feat of great magic, never \ -before witnessed!~"; - 2: ENDGAME_timer.number = 3; - if (gray_elemental in ENDGAME_ROOM) - "^Echoing in your mind, you hear a voice, that you \ -somehow know is from the gray-colored sphere. ~Give me the rod priest, \ -and I will grant you power over all who surround you!~"; - 3: ENDGAME_timer.number = 4; - if (white_elemental in ENDGAME_ROOM) - "^Echoing in your mind, you hear a voice, that you \ -somehow know is from the white sphere. ~Give me the rod priest, \ -and you will gain the attention of one of the more powerful \ -figures of your time!~"; - } - ], -has light; - -Object ENDGAME_timer "void" ENDGAME_ROOM - with name "void" "nothingness", - description "The absence of anything. Yet, at the same \ -time, the sense that everything possible is near.", - number 0, - time_left 0, - time_out [; - deadflag = 1; - if (ENDGAME_ROOM.number < 3) - print "The spheres nearby suddenly converge"; - else print "The sphere nearby suddenly converges"; - " towards you! In your mind, you hear \ -~Hesitation, foolish priest, was the downfall of the Ancient \ -Ones~ before you feel the full force of the void."; - ], - has scenery; - -! *** fake room/encounter for bad ending #x -Object badend1 "On Giant Cube" - with description "You stand on a single giant floating white \ -cube, in the middle of some dimly lit cavern. \ -^^A small newt floats nearby, concentrating on something.^^\ -The newt suddenly opens its eyes! ~What?~ it croaks in \ -surprise. ~Who are you? You've broken my concentration on \ -the spell, you fool!~ the newt croaks. You feel the cube \ -shift, then stop floating! You plummet into the lava you \ -feared was below..." - has light; - -Object badend2 "Top of Pyramid" - with description "You are on top of a pyramid in some \ -ancient city. You see dense jungle to the horizon. \ -An ancient civilization spreads before you, in all its \ -mysterious glory.^^Several robed figures surround you.^^\ -Suddenly, you realize you are tightly bound! One of the \ -figures points towards the horizon and makes a complicated \ -gesture. In a language you do not understand, he seems \ -to make a prayer to some nameless god! Fearing the \ -inevitable, you struggle mightily, but to no avail. \ -In moments, the group of robed figures hurls you off the \ -pyramid to your death!" - has light; - -! ************* -! Creatures -! ************* - -Object Imp "Implementor" Imp_Bedroom - with name "Implementor", - article "an", - description [; - print "Some Implementor. Looks more like a oddly-dressed \ -young man badly in need of a haircut"; - if (self has general) - ". He's also sound asleep!"; - else "."; - ], - describe [; - print "^Someone you assume must be an Implementor \ -is here"; - if (self has general) - ", sound asleep."; - else "."; - ], - number 0, - weight 120, ! about right - life [; - ! if asleep, which is usually the case - if (self has general) { - if (action==##WakeOther or ##Attack) { - print "You manage to rouse the Implementor from his \ -slumber. He stares at you, bewildered. ~What are you doing here?~ \ -he asks. "; -ImpSendBack(); rtrue; - } - else - "He appears to be sound asleep right now, and isn't very \ -responsive."; - } -! else { -! (I suppose this is unnecessary. -- i.e. the player shouldn't be able to -! interact with the implementor unless the implementor is asleep) -! print "Well, that got his attention. The Implementor \ -!looks completely startled. ~What are you doing here?~ he says. "; -!ImpSendBack(); rtrue; -! } - ], - daemon [; - ! ASSUMPTION -- daemon started by start event - StopTimer(Imp_Liv); - if (Imp.number == 0) { - give Imp_door open; - if ((player in Imp_Liv) && (player notin Imp_Curtains)) { - print "^The door to the west suddenly flies open! \ -A somewhat bedraggled Implementor steps out! He spots you and his \ -jaw drops. ~You, here?~ he says. "; -ImpSendBack(); rtrue; - } - else - print "^You hear a door open to the west.^"; - Imp.number = 1; - move Imp to Imp_Liv; - } - else { - ! first a little 'lazy' clause that kicks the player - ! out if the Imp is moving around and the player isn't - ! in the curtains - if ((Imp.number < 5) && (player notin Imp_Curtains)) { - if (Imp in location) print "^The Implementor "; - else print "^From nearby, an Implementor rushes up and \ -"; - print " grabs you by the shoulder! \ -~What are you doing here?~ he \ -says. "; ImpSendBack(); return 1; - } - ! now, otherwise, we move the Imp and set his - ! number accordingly. Room descs and 'Listen' - ! traps in Imp_Liv will need to use this info - switch (Imp.number) { - ! [step 1, moving to Kitchen] - 1: move Imp to Imp_Kitchen; - Imp.number = 2; - if (Coffee_maker notin Imp_Kitchen) Imp.weight = 118; - else { - if (regular_coffee_can in Imp_Kitchen) { - Imp.weight = 119; - remove regular_coffee_can; - } - else { - if (decaf_coffee_can in Imp_Kitchen) { - Imp.weight = 122; - remove decaf_coffee_can; - } - else { - ! no coffee, gosh darn it - Imp.weight = 121; - } - } - } - return 0; - ! [step 2, making/drinking the beverage] - 2: Imp.number = 3; - ! [step 3, leaving kitchen, back to living room] - 3: Imp.number = 4; - move Imp to Imp_Liv; - ! [step 4, goes back into bedroom] - 4: Imp.number = 5; - give Imp_door ~open; - if (player in Imp_Curtains) - print "^You hear a door close to the west.^"; - move Imp to Imp_Bedroom; -! move coffee_cup to Imp_Bedroom; - if (Imp.weight == 122) - give Imp general; ! asleep - StopDaemon(Imp); - } - } - ], -has animate; - -!Object coffee_cup "large cup" -! with name "cup" "large", -! description "A large mug, with the residue of some brown liquid \ -!left in it.", - ! weight 5, -! size 4, -! has container open; - -! MOVEPRINTNPC routine, from Gareth Rees' 'THIEF.INF' -! (TODO -- you really don't need this, since only Frobar moves in this fashion) -[ MovePrintNPC n dest dir; - if (n in location) { - print "^", (The) n, " walks off"; - if (dir ~= in_obj or out_obj or u_obj && dir ~= d_obj) - print " to the ", (DirectionName) dir.door_dir; - print ".^"; - } - if (dest == 0) remove n; ! This seems odd - if dest bogus, 'unlink' NPC? - else move n to dest; - if (n in location) - print "^", (The) n, " walks in.^"; -]; - -Object White_Dragon "White Dragon" Dragon_Cave - with name "dragon" "white" "giant", - describe [; - print "There is a gigantic white dragon here"; - if (self has general) - " sleeping peacefully."; - "!"; - ], - description "A giant white dragon, the size of a small house.", - time_left 0, - time_out [; - give self ~general; - if (location == Dragon_Cave) { - deadflag = 1; - "^The dragon suddenly snorts and wakes! It sees you \ -and attacks! In moments, you are no more..."; - } - else { - remove self; - give stone_marker ~general; - move stone_marker_top to snowy_intersection2; - "^You hear a roar from the east! From out of the \ -sky, a giant white dragon descends! It draws near, spots you, \ -and bellows in rage! You shrink back, and pray for a quick but \ -painless end.^^There is a loud crack! The dragon, in trying to \ -land, almost impales itself on the obelisk marker! Part of the \ -marker breaks off, and the dragon flies off, whimpering in pain!"; - } - ], - life [; - Attack, ThrowAt, WakeOther: -deadflag = 1; -"You disturb the sleeping dragon, who promptly makes you wish \ -you hadn't."; - default: "Best not to disturb the dragon, I'd guess."; - ], - has animate; - -Object captain "sea captain" On_Boat - with name "captain", - description "A rough-looking navy captain.", - number 0, - each_turn [; - if (self hasnt general) { - if (captain.number == 0) { - captain.number = 1; - "^You suddenly realize that you are being \ -held fast by two navy sailors! The captain walks forward and \ -points his cutlass near your ear.^^\ -~What we have here, lads, is a stowaway!~ Some sailor cries out \ -~Overboard with the stowaway!~ The captain smiles. \ -~Now, we was planning on feeding you to the groupers, \ -but we could use a scullion in the hold. One things for sure, \ -ye ain't finding passage on this ship if ye ain't aligned with \ -the Antharian Navy cause!~ Some sailor cries out \ -(unnecessarily) ~The Antharian Navy cause!~. ~So, tell us lad, \ -are ye with us? If ye are true, you'll tell me the Antharian \ -Navy patron saint! So speak quickly, lad, if ye wish to stay \ -dry!~"; - } - else "^~Speak up fellow! We havn't got all day!~"; - } - ], - time_left 0, - time_out [; - deadflag = 1; - "The captain sighs. ~Into the water with ye, then,~ \ -he says, and the two sailors push you roughly overboard. \ -You land in the sea with a splash, and struggle to stay afloat. \ -The ship sails off, but oddly, moments later, it seems to \ -stall and start to sink! Before you get a chance to reflect on \ -this, a large grouper swallows you whole."; - ], - life [; - if (self has general) - "The captain's a bit too busy trying to save \ -a sinking ship."; - Answer: - if (noun=='minirva') { - give self general; - StopTimer(self); - StartTimer(militia,2); - "~Aye, that's right. Escort the new scullion \ -down to the hold where --~^^\ -The captain's orders are cut short by a sudden grinding noise, \ -and the boat rocks violently! ~Reef, captain!~ you hear someone \ -cry. ~Blast!~ the captain says, ~quickly men, we've got to --~ \ -But it's too late. The boat starts to tip and sway, and \ -the two sailors release you and hastily try to help raise the \ -rigging!"; - } - else { - if (noun=='duncanthrax') { - deadflag = 1; - "The sailors suddenly pale at the mention of \ -Lord Duncanthrax. ~A traitor in our midst, eh?~ the captain \ -shouts and beheads you with one stroke."; - } - if (noun=='ulysses' or 'odysseus') - "~Nay lad, me thinks that \ -was a sailor.~"; - else "~Nay lad, that doesn't sound right.~"; - } - Attack, ThrowAt, Kiss, Show, Give: - "Given that you are in the grips of several \ -strong navy sailors, this is impossible."; - ], - has animate; - -! ***** THE EVIL ELEMENTALS -Object black_elemental "black sphere" ENDGAME_ROOM - with name "anabais" "black" "sphere" "earth", - description "A black sphere of energy.", - life [; - ThrowAt: - if (noun==brown_sphere) { - remove self; remove brown_sphere; - ENDGAME_ROOM.number = ENDGAME_ROOM.number + 1; - if (ENDGAME_ROOM.number == 4) { - GameWinner(); rtrue; } - "The black sphere howls in rage and is no more!"; - } - Give: - if (noun==TRUEROD) { - remove TRUEROD; - print "You feel a strange foreboding feeling as \ -the black sphere seems to engulf the rod, then you! Your \ -surroundings change once again!^"; - deadflag = 1; - PlayerTo(badend2); - rtrue; - } - default: "The black sphere is unresponsive."; - ], - has animate; - -Object smoke_elemental "smoke-colored sphere" ENDGAME_ROOM - with name "smoke" "sphere" "fire", ! TODO new name... - description "A smoke-filled sphere of energy.", - life [; - ThrowAt: - if (noun==red_sphere) { - remove self; remove red_sphere; - ENDGAME_ROOM.number = ENDGAME_ROOM.number + 1; - if (ENDGAME_ROOM.number == 4) { - GameWinner(); rtrue; } - "The smoke-filled sphere howls in rage and is no more!"; - } - Give: - if (noun==TRUEROD) { - remove TRUEROD; - print "You feel a strange foreboding feeling as \ -the smoke-filled sphere seems to engulf the rod, then you! Your \ -surroundings change once again!^"; - deadflag = 1; - PlayerTo(badend1); - rtrue; - } - default: "The smoke-filled sphere is unresponsive."; - ], - has animate; - -Object gray_elemental "gray sphere" ENDGAME_ROOM - with name "gray" "sphere" "water", ! TODO new name - description "A gray sphere of energy.", - life [; - ThrowAt: - if (noun==green_sphere) { - remove self; remove green_sphere; - ENDGAME_ROOM.number = ENDGAME_ROOM.number + 1; - if (ENDGAME_ROOM.number == 4) { - GameWinner(); rtrue; } - "The gray sphere howls in rage and is no more!"; - } - Give: - if (noun==TRUEROD) { - remove TRUEROD; - print "You feel a strange foreboding feeling as \ -the gray sphere seems to engulf the rod, then you! Your \ -surroundings change once again!^"; - PlayerTo(FUBLIO_Cave); - StartTimer(mad_hermit,3); - rtrue; - } - default: "The gray sphere is unresponsive."; - ], - has animate; - -Object white_elemental "white sphere" ENDGAME_ROOM - with name "white" "sphere" "air", ! TODO new name - description "A white sphere of energy.", - life [; - ThrowAt: - if (noun==silver_sphere) { - remove self; remove silver_sphere; - ENDGAME_ROOM.number = ENDGAME_ROOM.number + 1; - if (ENDGAME_ROOM.number == 4) { - GameWinner(); rtrue; } - "The white sphere howls in rage and is no more!"; - } - Give: - if (noun==TRUEROD) { - remove TRUEROD; - print "You feel a strange foreboding feeling as \ -the white sphere seems to engulf the rod, then you! Your \ -surroundings change once again!^"; - PlayerTo(TROPHY_SECRET); - rtrue; - } - default: "The white sphere is unresponsive."; - ], - has animate; - - -! ****************** -! scrolls/spells -! ****************** - -Object fancy_scroll "fancy scroll" - class scroll_class, - with name "fancy", -; - -Object wigro_spell "turn undead" fancy_scroll - class spell_class, - with name "wigro", - magic [; - "You speak the chant. Nothing seems to happen."; - ], -; - -Object briefcase "briefcase" Subway_Tunnel - with name "briefcase" "case", - description "A somewhat battered brown-leather briefcase.", - capacity 5, - ! weight 20, - size 15, - has container openable; - -Object red_scroll "red scroll" briefcase - class scroll_class, - with name "red", -; - -Object luncho_spell "send object to lower plane" red_scroll - class spell_class, - with name "luncho", - magic [; - if (second == 0) -"You see a brief flash of smoke, but nothing happens."; - if (second has animate) - "You feel a slight rumbling beneath your feet, but nothing else \ -happens."; - else { - if ((second hasnt static) && (second hasnt scenery)) { - if (second has clothing) give second ~worn; - if (in_atrii == 1) { - move second to MON_Chapel2; - } - else - move second to Hades_5; - print "There is a sudden puff of smoke, and "; DefArt(second); - " suddenly vanishes!"; - } - "Your chant goes unanswered."; - } - ], -; - -! ****************** -! special obs -! ****************** - -Object Atrii_gate "strange contraption" GUE_Labs_SECRET - with name "contraption" "plate" "disc" "strange", - description "It looks like a large, slightly convex round disc \ - made of some silvery material.", - before [; - Enter: - print "As you step onto the silvery disc, you feel a \ - strange jolt run through your body. A bright white \ - flash blinds you momentarily!^^You blink, trying to \ - register your surroundings.^"; - in_atrii = 1; - PlayerTo(ATRII_1); - return 2; - Receive: - move noun to ATRII_1; - CDefArt(noun); " suddenly disappears in a bright \ - flash of light as you place it on the silver disc!"; - Push, Pull, Touch, Take: - "As you reach for the strange contraption, you notice \ - white sparks of something arc from the silver surface \ - to your fingers! You hastily draw back."; - ], - has static supporter enterable; - -! *** the true rod pieces, and the golden rod (after joined) -Object silver_rod_piece "silver rod piece" Mystical_Cave - class rod_class, - with name "silver", - description "A strange short section of rod colored \ -silver.", - before [; - Join: - if (location ~= Mystical_Cave) { - if (second == TRUEROD) - <>; - if ((second == brown_rod_piece) || - (second == red_rod_piece) || - (second == green_rod_piece)) { - if (TRUEROD.number == 0) { - TRUEROD.number = 1; - move TRUEROD to parent(self); - remove self; remove second; - "There is a dazzling golden light as \ -you join the two rod pieces! What remains is a new, strange \ -rod piece!"; - } - else "There is a dazzling burst of \ -golden light. However, the pieces will not join, and seem \ -to be seeking out something else..."; - } - } - else "Some strange purple flash of force \ -blocks your efforts."; - ], -; -Object red_rod_piece "red rod piece" Mystical_Cave - class rod_class, - with name "red", - description "A strange short section of rod colored \ -red.", - before [; - Join: - if (location ~= Mystical_Cave) { - if (second == TRUEROD) - <>; - if ((second == silver_rod_piece) || - (second == brown_rod_piece) || - (second == green_rod_piece)) { - if (TRUEROD.number == 0) { - TRUEROD.number = 1; - move TRUEROD to parent(self); - remove self; remove second; - "There is a dazzling golden light as \ -you join the two rod pieces! What remains is a new, strange \ -rod piece!"; - } - else "There is a dazzling burst of \ -golden light. However, the pieces will not join, and seem \ -to be seeking out something else..."; - } - } - else "Some strange purple flash of force \ -blocks your efforts."; - ], -; -Object green_rod_piece "green rod piece" Mystical_Cave - class rod_class, - with name "green", - description "A strange short section of rod colored \ -green.", - before [; - Join: - if (location ~= Mystical_Cave) { - if (second == TRUEROD) - <>; - if ((second == silver_rod_piece) || - (second == red_rod_piece) || - (second == brown_rod_piece)) { - if (TRUEROD.number == 0) { - TRUEROD.number = 1; - move TRUEROD to parent(self); - remove self; remove second; - "There is a dazzling golden light as \ -you join the two rod pieces! What remains is a new, strange \ -rod piece!"; - } - else "There is a dazzling burst of \ -golden light. However, the pieces will not join, and seem \ -to be seeking out something else..."; - } - } - else "Some strange purple flash of force \ -blocks your efforts."; - ], -; -Object brown_rod_piece "brown rod piece" Mystical_Cave - class rod_class, - with name "brown", - description "A strange short section of rod colored \ -brown.", - before [; - Join: - if (location ~= Mystical_Cave) { - if (second == TRUEROD) - <>; - if ((second == silver_rod_piece) || - (second == red_rod_piece) || - (second == green_rod_piece)) { - if (TRUEROD.number == 0) { - TRUEROD.number = 1; - move TRUEROD to parent(self); - remove self; remove second; - "There is a dazzling golden light as \ -you join the two rod pieces! What remains is a new, strange \ -rod piece!"; - } - else "There is a dazzling burst of \ -golden light. However, the pieces will not join, and seem \ -to be seeking out something else..."; - } - } - else "Some strange purple flash of force \ -blocks your efforts."; - ], -; -Object TRUEROD "golden rod" - class rod_class, - with name "golden", - number 0, - description [; - print "A wondrous, shimmering golden rod"; - if (TRUEROD.number < 3) - " that seems slightly short."; - else "."; - ], - before [; - Wave: - if (TRUEROD.number == 3) { - deadflag = 1; -! TODO -- this is essentially another 'win', but not a good one - "You wave the rod, and feel a sudden blast of force! \ -The spheres howl in terror and \ -suddenly explode! The jolt of power from the rod sends you \ -hurtling through space, and you are lost in an endless \ -tumble through the void..."; - } - Join: - if ((second == silver_rod_piece) || - (second == red_rod_piece) || - (second == green_rod_piece) || - (second == brown_rod_piece)) { - remove second; - TRUEROD.number = TRUEROD.number + 1; - print "You feel a strange surge of \ -mystic energy as you join the rod pieces. ", (The) second, " \ -joins with the golden rod"; - if (TRUEROD.number == 3) { - Achieved(19); - print "!^^Time and space seem to grind to \ -a halt.^^\ -Your surroundings and the very ground you stand on shatter like \ -planes of glass, revealing a strange, new dimension...^"; - spell_block = 1; - PlayerTo(ENDGAME_ROOM); - StartTimer(ENDGAME_timer,12); - rtrue; - } - else "!"; - } - ], -; - -! *** The results of winning the game *** -[ GameWinner ; - Achieved(26); - print "The last sphere howls in rage and disappears!"; - deadflag = 2; - " You scream in agony as the void that surrounds you \ -seems to implode! You feel yourself dissipating into the \ -surrounding nothingness. ~Is this my reward?~ you scream, \ -~Is this, then, the end?~^^\ -A white light makes you open your eyes.^^\ -You are lying on a beach. The Great Sea laps at your \ -tattered garments. Slowly, you rise to your knees.^^\ -The sun, like a bloated, radiant bird, is sinking below the \ -wave on the horizon. Another day is coming to an end.^^\ -A voice startles you. ~Tis a fine spot for watching \ -sunsets.~ You turn to see Morgan the Ranger, Frobar and \ -the Thief nearby. The Thief helps you to your feet, and Frobar \ -glances your way. ~I sensed a great upheaval in the \ -fabric of time and space not long ago. I gather you \ -have quite a story to tell,~ he says. ~We \ -probably can relate to much of what you have seen, \ -although your unwavering faith is something we \ -desire to understand.~ Morgan explains, ~Belief in the \ -face of the unbelievable is an enviable strength.~ \ -The Thief chuckles quietly. \ -~Perhaps you will join us at Delbins, where we will \ -partake in a belief of fine cuisine while you tell all?~ he says. \ -He notices your weary expression and \ -adds with surprising seriousness, ~Not that I \ -prepose to offer advice from one as myself, \ -but humbly, I admit, that many a time, a belief in myself \ -was often sufficient.~ He pauses. \ -~Gods or no, now, you make your own destiny.~"; -]; diff --git a/src/SPIRIT.INF b/src/SPIRIT.INF deleted file mode 100644 index a458e6d..0000000 --- a/src/SPIRIT.INF +++ /dev/null @@ -1,3075 +0,0 @@ -! ***************************************************************** -! SPIRITWRAK -- An exercise in copyright infringement :) -! -! Release 1, 12/95 -- 3/96 -! Release 2, 3/96 -- -! Release 3, 4/96 -- -! Copyright (C) 1996, D. S. Yu -! -! This program is free software; you can redistribute it and/or modify -! it under the terms of the GNU General Public License as published by -! the Free Software Foundation; either version 3 of the License, or -! (at your option) any later version. -! -! This program is distributed in the hope that it will be useful, -! but WITHOUT ANY WARRANTY; without even the implied warranty of -! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -! GNU General Public License for more details. -! -! You should have received a copy of the GNU General Public License -! along with this program; if not, write to the Free Software -! Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -! -! To contact the author (Dan Yu), send email to dsyu@holonet.net. -! -! ***************************************************************** - -! SPECIAL THANKS: -! Mr. Blank, Lebling, Meretzky, Moriarty for the Zork universe. -! Graham Nelson for Inform, and for various code I've shamelessly cribbed. - -! NUTRITION NOTE: No Microsoft(tm) products were used in the -! construction of this game - -! ** inform compile switches here ** -Switches exv5b; - -! ** abbreviations -Include "spirita.inf"; - -! ** Story Constants ** -Constant Story "SPIRITWRAK"; -Constant Headline "^An Interactive Fantasy Adventure^\ - Copyright (C) 1996, by D.S. Yu.^\ -Portions copyright Graham Nelson.^^\ -'SPIRITWRAK' comes with ABSOLUTELY NO WARRANTY ^\ -This is free software, and you are welcome to redistribute it \ -under conditions as described in the GNU General Public License as published by \ -the Free Software Foundation; either version 3 of the License, or \ -(at your option) any later version.^^"; - -Release 3; - -! ** Scoring System -Constant MAX_SCORE 250; -Constant NUMBER_TASKS 27; -Constant TASKS_PROVIDED; -Constant OBJECT_SCORE 2; -! Constant ROOM_SCORE 1; -! Global task_scores initial t1 t2 t3..... -Array task_scores -> 2 5 5 5 10 15 5 5 5 5 5 5 10 10 10 5 5 5 10 10 5 5 10 5 5 5 10; - -! ** Player inventory and weight system -Constant MAX_CARRIED 15; ! Max of 15 items carried at start - ! This can be changed on the fly by adjusting player.capacity -Property weight; -! Entire weight system removed 3/16/96, however certain puzzles -! inadvertently depend on this, so... -Property size; - -global Player_HP_MAX = 20; ! number of hp MAX (should be 20 + score) -global Player_HP_CUR = 20; ! number of hp left (< MAX) -global Player_Lives_Left = 3; ! number of resurrects left -global in_hades = 0; ! Is the player in Hades? (we certainly hope not) -global in_atrii = 0; ! Is the player in Atrii? -! global all_my_spells data 32; array for spells in spell book -Array all_my_spells -> 64; ! array for spells in spell book -global has_resist_gravity = 0; ! is player resisting gravity?(see feeyuk spell) -global spell_block = 0; ! block spell-related stuff (end-game) - -! Any actions that are replaced get mentioned here -Replace PraySub; -Replace StrongSub; -Replace InsertSub; ! for relative sizes - -! *** Include Parser and VerbLib -Include "Parser"; -Include "VerbLib"; - -! -- two global location ptrs for Barsap's Gambit -global WN_TO; -global ES_TO; - -! ******************* CLASS DEFS ***************** - -! ** rod (part) class and attribute -Attribute is_rod; - -Class rod_class - with name "rod", - description "A thin rod made from some undeterminable material.", - !weight 10, - size 10, - before [; - Cast: - "You complete the chant, but the rod lies unaffected! \ - Perhaps it is protected from magic somehow?"; - Join: - if (second has is_rod) - "You try to bring the rods together, but a \ -sudden blast of energy prevents you, and stings your hands!"; -! (note that true rod pieces have their own Join befores, which -! should, in theory, get called instead of this one). - ], - has is_rod scored; - -Class parchment_class - with name "parchment", - description "A piece of blank parchment.", - !weight 10, - size 15, -; - -Attribute is_sphere; - -Class sphere_class - with name "sphere", - description "A small hard sphere made from some undeterminable material.", - !weight 5, - size 3, - before [; - Cast: - "You complete the chant, but the sphere lies unaffected! \ - Perhaps it is protected from magic somehow?"; - ], - has is_sphere scored; - -Attribute is_flag; - -Class flag_class - with name "flag" "cloth", - plural "flags", - description "A short square piece of colored cloth.", - !weight 10, - size 15, - has is_flag; - -Class trophy_dep_class - with name "depression" "niche" "hole" "keyhole", - initial [; -print "There is a circular depression in the center of the floor"; -if (trophy in self) - ". Sitting in the depression is a trophy."; -else "."; - ], - description [; -print "A small circular depression in the center \ - of the stone floor"; -if (trophy in self) - ". At the moment, the depression holds a trophy."; -else ". There seem to be three small concave \ - marks in the otherwise flat stone of the depression."; - ], - size 8, - capacity 1, -has static container open; - -Attribute is_niche; -Property counter_niche; -Property niche_dir; ! assoc with the dir a niche is facing. - -Class niche_class - with name "niche", - capacity 1, - niche_dir 1, ! default north - description "It looks like a chiseled-out niche in the floor.", - initial [; - switch (self.niche_dir) { - 1: print "There's a square niche in the northern edge of the floor here"; - 2: print "There's a square niche in the western edge of the floor here"; - 3: print "There's a square niche in the southern edge of the floor here"; - 4: print "There's a square niche in the eastern edge of the floor here"; - } - if (children(self) ~= 0) { - print ". Resting in the niche is "; - InDefArt(child(self)); - print " that extends into the darkness"; -! weird -- There is no "CInDefArt(), equiv to (A) obj, which -! is probably pretty simple... - } - "."; - ], - before - [ j ; - Receive: - if (noun hasnt is_wood_beam) - "That's not going to stay in the niche."; - else { - ! (odd capacity check, seems like I'm stepping in front...) - if (children(self) ~= 0) - "The niche space is currently full."; - ! place both pieces in niches - j = child(noun); ! child piece (whichever) - move j to self.counter_niche; - move noun to self; - "You carefully place one end of the beam in the niche and \ - extend the other end into the darkness. You feel something \ - solid support the far end!"; - } - LetGo: - ! (reconstruct wood beam) Assumption is that noun must have - ! wood_beam attrib. - move child(self.counter_niche) to child(self); - move child(self) to player; - "Taken."; - ], - has static container open is_niche; - -! ** multiple coins, cribbed from "Balances" -Attribute is_coin; - -Class coin_class - with name "coin", - description "A round metal disc, with ~1zm~ stamped on both sides.", - !weight 1, - size 1, - parse_name - [ i j w; - if (parser_action==##TheSame) - { if ((parser_one.&name)-->0 == (parser_two.&name)-->0) return -1; - return -2; - } - w=(self.&name)-->0; - for (::i++) - { j=NextWord(); - if (j=='coins') parser_action=##PluralFound; - else if (j~='coin' or w) return i; - } - ], - plural "coins", - has is_coin; - -! ** Spell-casting system, again cribbed from Graham's "Balances", -! except stuffy priests call them 'chants'... -! ---------------------------------------------------------------------------- -! Now the whole spell-casting system -! ---------------------------------------------------------------------------- - -Attribute is_spell; -Attribute known_about; -Attribute is_scroll; -Attribute is_spell_book; -Property magic; -Fake_Action SayName; - -[ SpellName obj; print (address) (obj.&name)-->0; ]; - -Class spell_class - with name "spell" "spells" "chant" "chants", article "the", number 0, - short_name - [; SpellName(self); print " chant"; give self known_about; rtrue; - ], - before - [; - ! SayName: SpellName(self); print " chant: ", object self; - SayName: SpellName(self); print " chant: ", self; - give self known_about; rtrue; - Examine: ; "."; - ], - size 0, - has is_spell; - -Object memory "memory" - with capacity 5, ! will change periodically, given God-granted powers... - number 1, - size 0, - before - [ i j k; - Examine: - if (spell_block == 1) - "Currently, your mystic powers don't seem to be working."; - objectloop (i in self) if (i.number==100) j++; - if (j>0) - { print "The "; - objectloop (i in self) - if (i.number==100) - { k++; SpellName(i); - if (k==j-1) print " and "; - if (k0) - { print "the "; - objectloop (i in self) - if (i.number<100) - { k++; - PrintShortName(i); - if (i.number==2) print " (twice)"; - if (i.number==3) print " (thrice)"; - if (i.number==4) print " (four times)"; - if (i.number>=5) print " (many times)"; - if (k==j-1) print " and "; - if (k3) print " yet another time."; - if (self.number <= self.capacity) { new_line; rtrue; } - i=youngest(self); ; - "^A voice booms out ~Do not try to exceed your powers, mortal!~"; - Remove: - if (second notin self || second.number==100) rtrue; - if (self.number>0) self.number=self.number-1; - second.number=second.number-1; - if (second.number==0) remove second; - rtrue; - ]; - -Object gnusto_spell "copy a chant into your prayer book" memory - class spell_class - with name "gnusto", - number 100, - magic - [ i a_book; - if (spell_block==1) - "Currently, your mystic powers don't seem to be working."; - if (amulet hasnt worn) - "You speak the chant, and absolutely nothing happens!"; - if (second has is_spell_book) - "Unlike scrolls, prayer books are magically guarded against \ - the 'theft' of their lore."; - if (second==0 || second hasnt is_scroll) - "Your chant goes unanswered."; - if (second notin player) - "A gnusto chant would require close scrutiny of the scroll \ - it is to copy, which you do not seem to be holding."; - objectloop (i in player) - if (i has is_spell_book) a_book=i; - if (a_book==0) - "Your chant fails, as you have no prayer book."; - i=child(second); - if (i==0 || i hasnt is_spell) - { print "Your chant fails, as "; DefArt(second); - " is illegible."; - } - ; remove second; - print "Your prayer book begins to shake! Slowly, ornately, \ - the words of "; DefArt(i); " are inscribed, \ - into the book with a violet glow. \ - The book's brightness fades, but the chant remains! \ - However, the scroll on which it was written vanishes as \ - the last word is copied."; - ]; - -Class spell_book_class - with magic 0, - capacity 20, - size 15, - before - [ p i; Open, Close: - CDefArt(self); " will always open to the desired page thanks \ - to the powers of the Gods, may they never forget us."; - Attack: - print "When you are done, "; DefArt(self); " remains unmarred."; - Learn: - if (self.magic==0) "(This prayer book has no pages.)"; - p = self.magic; - for (i=0:ii)~=0:i++) ; - if (i==self.capacity) rtrue; - p-->i = second; - rtrue; - ], - after - [ p i j; Examine: - if (self.magic==0) "(This prayer book has no pages.)"; - p = self.magic; - for (i=0:ii)~=0:i++) - { j=p-->i; ; - } - rtrue; - ], - has is_spell_book; - -Class scroll_class - with parse_name - [ i j k; j=-1; - if (self has general) - { if (child(self)~=0 && child(self) has is_spell) - j=(child(self).&name)-->0; else j='illegible'; - } - for (::) { - k = NextWord(); - if (k=='scrolls') parser_action = ##PluralFound; - if ((k=='scrolls' or 'scroll' or j) || (k==(self.&name)-->0)) - i++; - else return i; - } - ! while (NextWord()==j or 'scroll' or (self.&name)-->0) i++; - ! return i; - ], - before - [ i; Examine: - i=child(self); - give self general; - if (i==0 || i hasnt is_spell) - "The scroll has faded, and you cannot read it."; - print "The scroll reads ~"; ; "~."; - ], - invent - [; if (inventory_stage==2 && self has general) - { if (child(self)==0 || child(self) hasnt is_spell) - print " (which is illegible)"; - else - { print " (of "; DefArt(child(self)); print ")"; } - } - ], - size 10, - has scored is_scroll; - -! NOTE: This routine has a slight bug (as cribbed from GN's -! Balances, rel2) in that Examine, if the routine reaches -! scope_stage 3, prints a rather confusing msg. However, -! the appropriate msg is printed for, say, Learn, if the -! spell is unknown/out-of-scope. Oddly, action can't -! be checked at stage 3, so I copied a second version of -! the routine for Examine only. -DY -! 3/19 update: Checking Graham's release 3 of Balances, -! I stumble across the "action_to_be" var. Most useful. -[ ReadableSpell i j k; - if (scope_stage==1) return 1; - if (scope_stage==2) - { objectloop (i in player) - if (i has is_spell_book) - { for (k=0:kk~=0:k++) - { j=(i.magic)-->k; PlaceInScope(j); - } - } - rtrue; - } - if (action_to_be == ##Examine) - "You can't see any such thing."; - !"You have never seen or heard of such a chant."; - "You can't see such a chant, if that is indeed a chant."; -]; - -[ SpellsSub; ; ]; ! for our case, 'chants' will work also - -[ LearnSub; if (location==thedark) - print "(The magic purple glow of the chants casts enough light \ - that you can read them.)^"; - ; -]; - -global the_spell_was = gnusto_spell; - -[ CastOneSub; ; ]; - -! Property long unmagic; - - -! (wood beams and niches -- for Barsap's Gambit) -! (put after 'the_spell_was' global defined) - -Attribute is_wood_beam; - -Class wood_beam_class - with name "wood" "beam", - plural "beams", - description "A long thin wooden beam.", - !weight 10, - size 50, - number 0, ! number is the 'strength left' qualifier - before [; - Cast: - if (the_spell_was == egdelp_spell) - "The wood beam is covered in a waxy film! Thinking \ -better of this, you hastily wipe off the offending build-up."; - if ((the_spell_was == luncho_spell or huncho_spell) && - (parent(self) has is_niche)) { - ! reconstruct beam before teleporting - ! due to problem below, I'm denying this... -"Your chant goes unanswered."; - ! move child(parent(self).counter_niche) to self; - ! <>; - ! NOTE NOTE This may recursively explode... - } - ], - has is_wood_beam; - -Class balsa_beam_class - class wood_beam_class, - with name "balsa", - plural "balsa wood beams", - description "A long thin balsa wood beam.", - number 0; ! always breaks - -Class pine_beam_class - class wood_beam_class, - with name "pine", - plural "pine wood beams", - description "A long thin pine wood beam.", - number 1; - -Class ebony_beam_class - class wood_beam_class, - with name "ebony", - article "an", - plural "ebony wood beams", - description "A long thin ebony wood beam.", - number 2; - -[ CastSub k; - the_spell_was = noun; ; - -! if (noun has general) -! { give noun ~general; -! if (RunRoutines(noun,unmagic)~=0) rfalse; -! "Nothing happens."; -! } - - if (amulet hasnt worn) - "You speak the chant, and absolutely nothing happens!"; - if (spell_block==1) - "Currently, your mystic powers don't seem to be working."; - if (in_hades == 1) - "Your Gods can't save you now..."; - if (second~=0) - { ResetVagueWords(second); ! Set "it", "him", "her" - if (RunRoutines(second,before)~=0) rfalse; ! Run before routine(s) - } - k = random(10); - if (k<=3) { - if (k==1) - "You speak the chant, but the Gods are not kind this time, as nothing happens!"; - if (k==2 or 3) - "You speak the chant, but something sounds wrong. Nothing happens \ -this time."; - } - if (RunRoutines(noun,magic)~=0) rfalse; - "Nothing happens."; -]; - -[ InScope i; - if (verb_word=='c,cast' or 'cast') - objectloop (i in memory) PlaceInScope(i); - rfalse; -]; - -[ ParserError x i flag vb; - if (etype==VERB_PE or ASKSCOPE_PE) - { if (etype==ASKSCOPE_PE) - { if (verb_word=='cast') vb=1; - if (verb_word=='learn' or 'memorise' or 'memorize') vb=2; - if (verb_word=='copy') vb=3; - if (vb==0) { etype=CANTSEE_PE; rfalse; } - } - wn=verb_wordnum; if (vb~=0) wn++; - x=NextWordStopped(); - for (i=player+1:i<=top_object:i++) - if (i has is_spell && Refers(i,x)==1 - && i has known_about) flag=1; - if (flag==1) - { if (vb==0 or 1) - "You haven't got that chant prepared. [Type ~spells~ \ - or ~chants~ to see what you do have prepared.]"; - if (vb==2) - "Your training is such that you can only prepare such a chant \ - with the aid of a prayer book containing it."; - if (vb==3) - "You have no text of that chant to copy."; - } - if (vb==1) - "You haven't prepared that chant, if indeed it is a chant."; - if (vb==2 or 3) - "You haven't access to that chant, if indeed it is a chant."; - } - rfalse; -]; - -! Random attempt to code a ChooseObjects for the -! coin choosing problem often seen in the Bank of Zork -[ ChooseObjects obj code; - if (code < 2) rfalse; - if ((action_to_be == ##Remove or ##Insert) && - (obj has is_coin) && (obj in player)) return 9; - return 0; -]; - -[ UnknownVerb word i; - objectloop (i in memory) - if (word==(i.&name)-->0) { the_spell_was = i; return 'c,cast'; } - rfalse; -]; - -[ PrintVerb v; - if (v=='c,cast') { print "cast a chant at"; rtrue; } - rfalse; -]; - -! ---------------------------------------------------------------------------- -! The player's spell book, and initial spells (to go with gnusto): -! ---------------------------------------------------------------------------- - -Object prayer_book "prayer book" - class spell_book_class, - with name "prayer" "book" "my" "spellbook", - description "Mystical Chants^"; - -Object frotz_spell "cause an object to give off light" - class spell_class, - with name "frotz", - magic - [; if (second==0) "There is a brief, blinding flash of light."; - if (second has animate) - "The chant, not designed for living creatures, is denied."; - if (parent(second)==compass) - "The chant fails."; - give second light; - print "There is an almost blinding flash of light as "; DefArt(second); - print " begins to glow! It slowly fades to a less painful level, but "; - DefArt(second); " is now quite usable as a light source."; - ], -; - -! ** Start of locations (and other objs) ** - -! *********************************************************************** -! ** -! ** LOCATIONS INSIDE MONESTARY (Mostly) -! ** -! *********************************************************************** - -Object MON_Chapel1 "Monastery Chapel" - with description "You are standing in a monastery chapel. \ -All around you, fellow Brothers of the Order are standing, chanting. \ -The eerie droning voices seem to reverberate into the air. At the \ -front of the chapel, Brother Joseph stands in deep concentration, \ -holding the Rod of the Ancients.", - name "brothers", - number 0, - each_turn [ ; - MON_Chapel1.number = MON_Chapel1.number + 1; - Startup1(MON_Chapel1.number); - ], - before [ ; - if (action==##Listen) "You hear heavy chanting"; - if (action==##look) rfalse; - if (action==##Wait) rfalse; - "You are caught up in the collective chanting, and cannot break \ - your concentration to do much of anything else."; - ], - has light; - -! A fake obj to handle 'look at Joseph' -Object MON_FAKE "the Order" MON_Chapel1 - with name "Joseph" "rod" "brothers", - description [; <>;], -has scenery; - -! A somewhat bulky routine to set our stage. -[ Startup1 currturn; - if (currturn <= 1) { - print "^Brother Joseph now speaks directly to the entire Order.^^\ - ~Fellow Brothers, the year, as you know, is 976 GUE. \ - A difficult time indeed. Ten years have passed since the Cataclysm \ - brought forth by the Circle of Enchanters changed our world forever. \ - The outside world as we know it is in turmoil. A period of great \ - change is upon all of us.~^"; - rtrue; - } - if (currturn == 2) { - print "^Brother Joseph continues speaking.^^\ - ~Our order has always maintained the strictest secrecy. Few \ - outside of our order know of our existence. \ - We are the keepers of the mystic balance \ - that which embodies pure magic that can keep our world \ - safe. It has always been thus -- we watch over all \ - of Quendor, never interfering in the affairs of others, yet \ - striving to maintain harmony.~^"; - rtrue; - } - if (currturn == 3) { - print "^Brother Joseph continues speaking.^^\ - ~But we can no longer depend on enchantments to keep \ - outsiders at bay. Magic as we know it is dying. The dreaded \ - Age of Science is already upon us, and in short time, our \ - order will be discovered, and the balance will be no more. Many of \ - our order have gone out into the world in secret, in attempts \ - to repair what has been broken, but alas, this appears to be \ - impossible.~^"; - rtrue; - } - if (currturn == 4) { - print "^Brother Joseph continues.^^\ - ~I have brought you all forth today to say that although we \ - cannot protect the future of Quendor, we can protect ourselves!~ \ - He holds the Rod of the Ancients high. ~This holy Rod, which \ - the Ancient Ones used to defeat the demon Anabais, \ - has the power to protect our order. I have discovered a lost mystic \ - cube!~ He holds a white, featureless cube high in his other hand. \ - ~This cube, when joined with the Rod of the Ancients, will \ - preserve our order forever, sequestering all of us in another time, \ - another place!~^"; - rtrue; - } - if (currturn >= 5) { - print "^There is a momentous pause. ^^\ - Brother Joseph looks at the entire Order. \ - ~May the Gods smile down upon us on this day! We go now, \ - into the unknown!~ He triumphantly joins the white cube to \ - the end of the Rod of the Ancients.^^\ - There is a sudden, blinding white flash! The chanting is instantly \ - broken by a tremendous thunderclap! Brother Joseph is suddenly \ - thrown back by a great force, and to your horror, the Rod of the \ - Ancients breaks apart! Four pieces now float serenely above the \ - altar, above a strange black globe that seems to crackle with energy.^^\ - ~AT LAST!~^^\ - The voice comes from nowhere and everywhere. The black sphere \ - pulsates with lightning.^^\ - ~ANABAIS IS FREE AGAIN!~ The voice pauses. \ - ~I see you found my fake mystic cube \ - Joseph. I knew that someday, someone would find it, and free \ - me from my prison!~ The voice pauses again. ~To show my gratitude, I'm \ - scattering this broken symbol to the corners of the world!~ \ - The pieces of the rod suddenly disappear!^^\ - ~Watch out!~ someone cries. \ - The black sphere suddenly expands with alarming speed. \ - Seconds later, a violent explosion seems to jar the very \ - ground you stand on, and a black void covers all.^^\ - You awaken in your room in a cold sweat. Was it all a terrible \ - dream? The day beckons...^"; - PlayerTo(MON_your_quarters); - ! remove MON_Chapel1; clean up memory (NOTE: This is futile) - rfalse; - } -]; - - -Object MON_your_quarters "Your Quarters" - with name "furnishing" "furnishings", - description "You are in your room in the Monastery. It is \ -sparsely furnished, but certainly feels like home. The exit \ -is north.", - n_to MON_f1hall1, - has light; - -Object note "note" MON_your_quarters -with name "note", - description "The note, in a hastily written scrawl, reads:^\ - ~Please stop by the chapel as soon as you can.^\ - -- Joseph~", - !weight 1, - size 5, -; - -!Object staff "staff" MON_your_quarters -! with name "staff" "walking" "trusty" "stick", -! initial "Your trusty walking staff is right where you left it.", -! description "A stout piece of pine you found while on a nature \ -! walk, this staff has served you well on many journeys.", - !weight 20, -! size 20, -!; - -Object sleeppallet "sleeping pallet" MON_your_quarters - with name "pallet" "sleeping" "roll", - description "This is your sleeping pallet, a short portable sleeping roll \ - made of straw. It's softer than it looks.", - size 25, - react_before [; - Go: if (player in self) "You'll have to get off the sleeping \ -pallet first."; - ], - has supporter enterable; - -Object MON_f1hall1 "Hallway (near your quarters)" - with description "You are in a hallway running west and east. The \ -vaulted ceilings are a nice touch. Your \ -quarters are to the south.", - name "vaulted" "ceiling", - s_to MON_your_quarters, - w_to MON_f1hall2, - e_to MON_f1hall3, - has light; - -Object MON_f1hall3 "Hallway (near quarters of Palemon and TuffBerry)" - with description "You are in a hallway running west and east. \ -Brother TuffBerry's quarters lie to the south. Brother Palemon's \ -quarters are to the north.", - w_to MON_f1hall1, - e_to MON_f1hall4, - n_to MON_Palemon_quarters, - s_to MON_Tuffberry_quarters, - has light; - -Object MON_f1hall4 "Hallway (east end)" - with description "You are at the east end of an east-west hallway. \ -Brother Joseph's quarters lie to the north, and Brother Toolbox's \ -quarters lie to the south.", -! The acolyte chambers lie to the east.", - w_to MON_f1hall3, - ! n_to MON_Joseph_quarters, - n_to "It doesn't look like Joseph is in. Perhaps you can find \ -him elsewhere.", - s_to MON_Toolbox_quarters, -! e_to MON_acolyte_chambers, - has light; - -! Object MON_acolyte_chambers "Acolyte Chambers" -! with description "You are in a long chamber that serves as the home \ -! for the many devoted acolytes of the Order. The room is currently \ -! empty.", -! w_to MON_f1hall4, -! has light; - -Object MON_f1hall2 "Hallway (west end)" - with description "You are at the west end of an east-west hallway. \ -There are stairs up and down here, and an exit to the west.", - name "stairs", - e_to MON_f1hall1, - u_to MON_f2hall1, - d_to MON_f0hall1, - w_to MON_garden, - has light; - -Object MON_garden "Monastery Gardens" - with description "You are in the Monastery gardens, where various \ -shrubs and conifers are covered in a light blanket of snow. \ -An open cloister lies to the west, while \ -a doorway heads east.", - name "cloister" "doorway" "shrubs" "conifers", - w_to MON_cloister, - e_to MON_f1hall2, - has light; - -!Nearby shrubs "snow-covered shrubs" -! with name "shrubs" "shrub" "snow-covered" "conifers" "conifer" "plants", -! description "Good thing they're evergreen.", -! has scenery; - -Object sand "sand" MON_garden - with name "sand", - initial "A small area in the snow has been cleared for late winter \ -planting, and some sand has been sprinkled here and there.", - description "A handful of sand, nothing more, nothing less.", - !weight 5, - size 5, - article "some", -; - -Object MON_cloister "Cloister Walkway" - with description "You are in an open cloister, that runs along the \ -Monastery gardens to the east. To the north is the main wing of the \ -Monastery. To the south is the entrance hall.", - name "cloister", - e_to MON_garden, - n_to MON_Main_hall, - s_to MON_Entrance_hall, - has light; - -Object MON_Entrance_hall "Entrance Hall" - with description "This is the large entrance hall to the Monastery. \ -Many a devoted visitor has passed through this place. \ -There is an exit to the outside world to the \ -south, and the rest of the Monastery lies to the north.", - s_to Cliff_face, out_to Cliff_face, - n_to MON_cloister, - before [; - Go: - if ((noun==s_obj) || (noun==out_obj)) - print "You are surprised by a cold blast of wind as you leave the Monastery!^"; - ], - after [; - Go: - if ((noun==in_obj) || (noun==n_obj)) - print "You are greeted by relatively warm and cozy air.^"; - ], - has light; - -Object MON_Main_hall "Main Hall" - with description "This is the main hall of worship in the Monastery. \ -A large domed ceiling hides some sort of lighting that create a warm yet \ -serene atmosphere. A covered walk to the rest of the Monastery lies to \ -the south. To the north is the Monastery chapel. A brazier sits in \ -the center of the room.", - name "dome" "ceiling" "lighting" "atmosphere", - s_to MON_cloister, - n_to MON_Chapel2, - has light; - -Nearby brazier "brazier" - with name "brazier", - description "This is a silver incense brazier, somewhat similar to \ -an ornamental bowl on a tripod. Brother Palemon supposedly \ -found it on one of his many journeys.", - before [; - Take: - "That's been in the Monastery for years. People would \ - be upset if you took it."; - Receive: - ! if (noun~=incense) - if (noun has is_sphere) { - print "As you place the sphere in the brazier, \ -you feel a strange sensation. Suddenly, the brazier is filled \ -with "; - if (noun == brown_sphere) - print "earthworms!"; - if (noun == green_sphere) - print "seawater!"; - if (noun == red_sphere) - print "burning embers!"; - if (noun == silver_sphere) - print "white vapors!"; - " No, wait, it's empty again. You hastily \ -withdraw the sphere, and try to clear your mind."; - } - else "That doesn't seem quite appropriate."; - ], - size 9, - has scenery container open; - -Object MON_Chapel2 "Monastery Chapel" - with description "You are in the Monastery Chapel, the site of the \ -recent appearance of the legendary Anabais. Signs of the \ -recent visit include the slightly scorched walls, and the \ -reek of brimstone. Wood pews are arranged in a circle \ -around the central altar. The exit is south.", - name "pews" "scorched", - s_to MON_Main_hall, - before [; - Smell: - "You detect the faint odor of brimstone."; -! Yell: -! if ((parent(Joseph)==MON_Chapel2) && (Joseph hasnt general)) -! "Shhh. You don't want to abruptly disturb Joseph like that."; -! Go: -! if (noun==s_obj) { -! if ((parent(Joseph)==MON_Chapel2) && (Joseph has general) && -! (WeightOf(Joseph) > 140)) { -! if (WeightOf(Joseph) == 149) { -! Joseph.weight = 139; -! print "^As you leave, Brother Joseph calls out \ -! ~Oh, and take something for that cold!~^"; -! rfalse; -! } -! if (WeightOf(Joseph) == 148) { -! Joseph.weight = 139; -! print "^As you leave, Brother Joseph calls out \ -! ~Oh, and remember -- reading the scriptures \ -! is one sure way of maintaining an active mind!~^"; -! rfalse; -! } -! if (WeightOf(Joseph) == 147) { -! Joseph.weight = 139; -! print "^As you leave, Brother Joseph calls out \ -! ~Oh, and remember -- mirth is wonderful for the soul, \ -! in moderation, of course.~^"; -! rfalse; -! } - ! add in any others here... -! } -! } -! Sneeze: -! if (Joseph hasnt general) { -! give Joseph general; -! Joseph.weight = 149; -! JosephWakeAction(); -! rtrue; -! } -! Yawn: -! if (Joseph hasnt general) { -! give Joseph general; -! Joseph.weight = 148; -! JosephWakeAction(); -! rtrue; -! } -! Laugh: -! if (Joseph hasnt general) { -! give Joseph general; -! Joseph.weight = 147; -! JosephWakeAction(); -! rtrue; -! } -! Drop: -! if (Joseph hasnt general) { -! give Joseph general; -! Joseph.weight = 146; -! JosephWakeAction(); -! move (inp1) to MON_Chapel2; -! rtrue; -! } - ], - has light; - -! And now, the incredible shrinking Brother Joseph... -! Modified 3/16 -- this puzzle seems to be unpopular... -Object Joseph "Joseph" MON_Chapel2 - with name "Brother" "Joseph", - description "Brother Joseph is a pale man, with gray eyes, a fine \ - beard, and a finer disposition.", -! weight 150, - number 0, ! used to hold count of (fake) rod pieces received - describe [; -! if (self hasnt general) -! "Brother Joseph is kneeling in front of the remains of the altar, \ -! his eyes closed, deep in meditation."; -! else - "Brother Joseph is here, standing by the altar."; - ], - life [; -! if ((WeightOf(Joseph) == 150) && ((action ~= ##Attack) || -! (action ~= ##WakeOther))) -! "Perhaps it's best not to bother him, he seems very \ -! deep in meditation."; -! WakeOther: -! if (WeightOf(Joseph) == 150) -! "Joseph isn't asleep, just meditating. You may need to \ -!do something subtle to rouse him."; - Attack, ThrowAt: - deadflag = 1; - Player_Lives_Left = 0; -"Your blow sends Brother Joseph staggering back.^^\ -Brother Joseph gets up and brushes himself off, and glares \ -at you. Ro-roo, I think you made him mad. \ -You remember, of course, that Brother Joseph is a renowned \ -full-contact martial artist?^^\ -~Impudent wretch! I'll show you how we deal with non-believers here!~\ -^^Suddenly, Brother Joseph produces a gigantic mallet from \ -beneath his robes and clobbers you into a pulp."; - Ask: - if (second=='amulet') - "~Don't leave the Monastery without it!~"; - if (second=='joseph') - "Joseph smiles. ~I believe we've been introduced.~"; - if (second=='rod') - "~We must recover the Rod before it is too late!~"; - if (second=='anabais') - "~Beware the demon! He is most cunning and dangerous!~"; - if (second=='scriptures') - "~Study the holy scriptures, and you will be rewarded.~"; - if (second=='palemon' or 'tuffberry' or 'toolbox') - "~I fear I know not where his feet now tread.~"; - "~I don't know anything about that. Perhaps you should \ - consult our library upstairs?~"; - - Tell: - "~Do tell.~"; - - Show: - if (noun has is_rod) - "~Have you succeeded in retrieving the Rod? If so, \ -do what you feel is right.~"; - - Give: - if (noun has is_rod) { - if ((noun==black_rod_piece) || (noun==white_rod_piece) || - (noun==smoke_rod_piece) || (noun==gray_rod_piece)) { - Joseph.number = Joseph.number + 1; - remove noun; - print "Joseph takes the rod piece. "; - if (Joseph.number==4) { - ! trouble -- got the whole fake rod to Joseph... - deadflag = 1; - Player_Lives_Left = 0; - "~The Order will \ -remember your acts of bravery forever,~ Joseph says, as he brings out \ -all four rod pieces and tries to join them together. A sudden burst \ -of light blinds you!^^\ -When you can see again, a large black sphere of malevolent energy \ -floats nearby! Joseph, either dead or stunned, lies in one corner \ -of the room. The four rod pieces are floating above the sphere.^^\ -~Foolish little priest,~ a evil voice says in you mind. ~You \ -have only brought upon yourself your own undoing. With my rod returned \ -by an innocent, the pact is complete. Come forth, my brothers, \ -for our time of power is at hand!~^^\ -The last thing you hear is mocking laughter, before the world \ -as you know it comes to a close."; - } - else - "~Well done, brave Priest!~ he says."; - } - else -"Joseph looks at the rod piece and seems puzzled. ~This isn't any part \ -of the Rod of the Ancients that I've ever seen. And yet, it seems similar.~ \ -He hands it back to you. ~In this, my teachings can help you no \ -further.~"; - } - else "Joseph waves off your offering. ~You may \ -need that in your quest.~"; - Answer, Order: - if (special_word=='hello' or 'hi') - "Joseph smiles. ~Hello.~"; - default: - "At the moment, Joseph seems to be \ -preoccupied with spiritual matters."; - ], - before [; - Cast: - "Brother Joseph stops you in mid-chant. ~That won't be necessary~"; - ], - each_turn [; - if (self hasnt general) { - give self general; - move Amulet to player; - "^Joseph smiles as you enter. \ -~I'm glad you found me. As you know, thanks to the old \ -fool standing before you, the demon Anabais is loose upon \ -the world once more. He has broken the Rod of the Ancients \ -which was keeping our house and Order protected from outsiders. \ -It is a sorry day for us all.~ Joseph pauses for a moment. \ -~You are our final hope in a time of chaos. Brothers \ -Palemon, TuffBerry and Toolbox have left the Order, and only \ -you remain. I must now ask you to serve the Order which you \ -have so faithfully served in the past. No short order this, for \ -our continued existence depends on it, but you must go out into \ -a world gone mad alone, and retrieve the four broken pieces of \ -the Rod of the Ancients, and return them here to me, so that we \ -can rid the world of the evil we have loosed!~^^Brother Joseph \ -pauses and searches his robes.^^~Here, you will need this,~ he \ -says, giving you a strange amulet. ~Without this amulet, the \ -Ancient Ones cannot give you the mystic aid that you will most \ -certainly need. But I waste much time. Go now, and may the \ -Gods smile upon us all.~"; - } - ], - has animate proper; - -Object Amulet "holy amulet" - with name "amulet" "holy", - description "This small golden amulet and chain seem to \ -shimmer with a strange mystic saffron energy. The \ -pendant portion of the amulet is in the shape of a small \ -golden cube.", - ! weight 10, - size 7, - before [; - Wear: - if (self hasnt worn) { give self worn; - "As you place the amulet around your neck, \ - you feel a strange sense of mystic power."; - } - else "You're already wearing that."; - ], - has clothing scored; - -! [ JosephWakeAction; -! print "^You make a subtle noise^^\ -! Brother Joseph opens his eyes, breathes deeply, and smiles.^^\ -! ~I'm glad you found me. As you know, thanks to the old \ -! fool standing before you, the demon Anabais is loose upon \ -! the world once more. He has broken the Rod of the Ancients \ -! which was keeping our house and Order protected from outsiders. \ -! It is a sorry day for us all.~ Joseph pauses for a moment. \ -! ~You are our final hope in a time of chaos. Brothers \ -! Palemon, TuffBerry and Toolbox have left the Order, and only \ -! you remain. I must now ask you to serve the Order which you \ -! have so faithfully served in the past. No short order this, for \ -! our continued existence depends on it, but you must go out into \ -! a world gone mad alone, and retrieve the four broken pieces of \ -! the Rod of the Ancients, and return them here to me, so that we \ -! can rid the world of the evil we have loosed!~^^Brother Joseph \ -! pauses and searches his robes.^^~Here, you will need this,~ he \ -! says, giving you a strange amulet. ~Without this amulet, the \ -! Ancient Ones cannot give you the mystic aid that you will most \ -! certainly need. But I waste much time. Go now, and may the \ -! Gods smile upon us all.~"; -! move Amulet to player; -! rtrue; -!]; - -Object altar "altar" - with name "altar" "damaged" "cube", - description "The altar is roughly the shape of a five foot \ - white cube. The top edges appear to be singed black and there \ - are cracks and chips all over.", - found_in MON_Chapel1 MON_Chapel2, - before [; - Search: - if (self hasnt general) { - give self general; - move holywater to player; - "You uncover a vial of holy water."; - } - ], - has scenery supporter; - -Object holywater "vial of holy water" - with name "holy" "water" "vial", - description "A small glass vial of holy water.", - before [; - Eat: "You might want to try drinking it instead."; - Drink: remove self; - Player_HP_CUR = Player_HP_MAX; - "You quaff the holy water with a simple ceremony. \ -You feel physically and spiritually refreshed."; - ], - size 5, -; - -Object MON_Palemon_quarters "Brother Palemon's Quarters" - with description [; - print "You are in Brother Palemon's quarters, which \ - have been left unattended ever since Brother Palemon's \ - unexplained disappearance many years ago"; - if (self has general) - print ". To the west, a small secret door in the wall leads \ - into darkness"; - ". The exit is south."; - ], - s_to MON_f1hall3, - w_to [; - if (self hasnt general) - "You can't go that way."; - else return MON_Hidden_sanctum; - ], - before [; - Push: - if (noun == w_obj) { - if (self hasnt general) { - give self general; - "Pushing the west wall reveals a hidden secret door! \ -You've been in these quarters before, but certainly never noticed \ -anything like this!"; - } - else "Nothing happens."; - } - Touch, Rub: - if ((noun == w_obj) && (self hasnt general)) - "Oddly, a section of the west wall feels slightly thin."; - ], - has light; - -Object journal "thin journal" MON_Palemon_quarters - with name "journal" "thin", - description "This journal is very strange indeed. Brother \ - Palemon seems to have been very preoccupied up to the point \ - of his disappearance with strange accursed places that he \ - claims are located all over Quendor. He also makes several \ - references to evil 'spirits' found in these places. You also \ - notice that several pages of parchment near the back of \ - the journal have been torn out.", - !weight 20, - size 15, -; - -Object MON_Hidden_sanctum "Hidden Sanctum" - with description "You are standing in a small chamber that obviously hasn't \ -been used in quite some time -- the cobwebs and dust are several \ -layers thick. There is a short crawl east.", - name "cobwebs" "dust", - e_to MON_Palemon_quarters, -; - - -Object dusty_scroll "dusty scroll" MON_Hidden_sanctum - class scroll_class, - with name "dusty", -; - -Object foblub_spell "deliver magnificent sermon (glue audience to seats)" dusty_scroll - class spell_class, - with name "foblub", - magic [; - if (second hasnt animate) - "Your sermon goes unheard."; - if (second == player) - "Well, I know you like listening to yourself, but \ -isn't this a bit much?"; - "You give a wonderful sermon about how one's future \ - affects one's past, but no one seems to be listening."; - ], -; - - -Object MON_TuffBerry_quarters "Brother TuffBerry's Quarters" - with description "You are in Brother TuffBerry's quarters, vacant \ -since he undertook his quest for Joseph not long ago. The \ -exit is north.", - n_to MON_f1hall3, - has light; - -Object page "torn page" MON_TuffBerry_quarters - with name "torn" "page", - !weight 5, - size 5, - description "This page was apparently \ -torn from a larger document of some sort. All that is left \ -now reads:^^\ - ~...fear. Just today I heard again something below \ - me when I was meditating upstairs. \ - It sounded like a person, or something alive at least \ - was just below, trying to quietly move around unnoticed. \ - Clearly this is \ - impossible, and yet I cannot doubt what I heard. \ - Palemon tells me I'm hearing spirits, but little does \ - he know that I once heard the same noises in his \ - very chambers! He was not around at the time, but \ - to the west, behind the wall, I...~", -; - - -!Object MON_Joseph_quarters "Brother Joseph's Quarters" -! with description "You are in Brother Joseph's quarters. The hallway lies \ -! to the south.", -! s_to MON_f1hall4, -! has light; - -Object MON_Toolbox_quarters "Brother Toolbox's Quarters" - with description "You are in Brother Toolbox's quarters, vacant \ -ever since he left the order due to differences many years \ -ago. The exit is north.", - n_to MON_f1hall4, - has light; - -Object tb_diary "diary" MON_Toolbox_quarters - with name "diary" "toolbox", - description "\ - ~-- <944 GUE> Today Brother Joseph tried to explain the \ - essence of how we channel magic energy through our \ - amulets. To me, this seems to pale in comparison with \ - the seemingly innate abilities of those who call \ - themselves Enchanters. Joseph did show me a nice \ - trick, however. He brought the Rod of the Ancients near \ - my amulet, and the amulet gave off a sudden purple flash of light! \ - I'll have to try that one on the Acolytes tomorrow.~^^\ - (there isn't much else of interest until the \ - very last entry, which is not dated)^^\ - ~-- So long diary. I'm now off to seek greater spiritual \ - guidance in Thriff. I hear the summers there are very nice \ - too.~", - !weight 12, - size 12, -; - -Object folded_scroll "folded scroll" MON_Toolbox_quarters - class scroll_class, - with name "folded", -; - -Object espnis_spell "deliver dull sermon (cause sleep)" folded_scroll - class spell_class, - with name "espnis", - magic [; - if (second hasnt animate) - "Your sermon goes unheard."; - if (second == player) - "A preacher boring himself to sleep with his \ -own sermon? This doesn't seem prudent."; - CDefArt(second); - " listens as you begin your sermon about the general \ - religious practices of the royal families of the past, but \ - only stifles a yawn when you finish."; - ], -; - - -Object MON_f2hall1 "Hallway (second floor, west)" - with description "You are in a hallway on the second floor \ - of the Monastery. The hallway continues east, while \ - stairs lead downwards.", - name "stairs", - d_to MON_f1hall2, - e_to MON_f2hall2, - has light; - -Object MON_f2hall2 "Hallway (second floor, east)" - with description "You are in a hallway on the second floor \ - of the Monastery that runs east-to-west. To the \ - north is the private meditation room. To the east \ - is the Monastery library. To the northeast is an \ - entrance to the steeple room.", - w_to MON_f2hall1, - n_to MON_priv_med_room, - e_to MON_Library, - ne_to MON_Steeple_room, - has light; - -Object MON_priv_med_room "Private Meditation Room" - with description "You are in a small bare chamber that is \ - used for private meditation and worship. The only \ - exit lies to the south.", - s_to MON_f2hall2, - has light; - -Object MON_Library "Monastery Library" - with description "You are in the Monastery library, a cozy, \ - almost cramped room with shelves of various books. \ - The exit is to the west.", - w_to MON_f2hall2, - has light; - -Object lib_shelves "shelves" MON_Library - with name "shelves" "bookshelves", - description "Just some bookshelves.", - has scenery supporter; - -! *** LIBRARY BOOKS - -! Scriptures: -! -- Of course, this is a ruse created from the deviations of -! Anabais. Grounded in some fact though. Each section has a -! lie, which may not initially be obvious. Truthful sections -! are scattered over Quendor. -Object HolyScriptures1 "a copy of the Holy Scriptures" lib_shelves - with name "holy" "scriptures" "copy", - description "This sacred tome details the teachings and \ -beliefs of the Order, of which it's certainly always good \ -practice to re-familiarize yourself with. The scriptures are \ -divided into several sections. Sections that \ -can be consulted in greater detail include:^^\ -~Doctrines~^\ -~Demons~^\ -~Spirits~^\ -~(Book of the) Mystical~^\ -~(Book of the) Planes~^\ -~(Book of the) Ancients~^\ -~Legend of the Rod~", - before [ w1; Consult: - if (consult_words > 1) - "You'll have to consult the sacred book by \ -individual section."; - wn = consult_from; w1 = NextWord(); - switch (w1) { - 'doctrines', 'doctrine', 'canon': -"~THE SACRED DOCTRINES OF THE ORDER OF BALANCE:^^\ -Thou shalt strive to achieve balance in a world filled with unbalance.^\ -Thou shalt pray to the Deities in moments of inner reflection.^\ -Thou shalt not harm innocents nor aid them -- this is the way of balance.~"; -! TODO add add - 'demons', 'demon', 'anabais': -"~Fear not, mortal men^\ -though your world be filled with demons^\ -and the wicked.^^\ -Thou alone can prevail^\ -as The Ancient Ones^\ -against Anabais, the trickster^\ -were victorious.~"; -! LIE - The ancient ones lost to Anabais and the other demons - 'spirits', 'spirit': -"~Before the dawn of time, know that our world was \ -filled with evil spirits of the elements, \ -until mankind came upon the land and vanquished them \ -forever.~"; -! LIE - spirits still exist. - 'mystic', 'mystical', 'magic', 'chant': -"~If one is true of doubts, then a believer in the \ -great Harmony can draw upon the powers of the Ancients \ -and perform feats of mystic power anywhere. Remember that in \ -so doing, thou must act only as the channel of mystical \ -power for the Ancient Ones.~"; -! LIE - powers don't work everywhere, and not always. - 'planes', 'plane', 'atrii', 'hades': -"~Let not the ways of the mortal life \ -dissuade the knowledge of higher and lower planes \ -of existence.^^\ -For, beyond mortal reach are places where those who \ -have truly served the Order and those who have truly \ -forsaken the Harmony of Balance will find themselves \ -in death. These are the Ethereal Plane of Atrii and \ -the plane of the damned -- Hades.~"; -! LIE - don't have to die to reach Atrii. - 'ancients', 'ancient': -"~Trust in The Ancient Ones, those Three who showed mankind the \ -way of Balance and Harmony.~"; -! LIE - Four ancient ones existed. - 'rod', 'legend': -"~Anabais foresaw his own demise when he dared to \ -challenge the Ancient Ones. From powers of light and \ -darkness, the Ancient Ones constructed that holy Rod that \ -we know only as the Rod of the Ancients, and did smite \ -the demon Anabais so grievously, that they did imprison \ -him in that very Rod, where he could do no harm. This \ -very Rod was made of pieces of ancient elemental energy, \ -once separated. Only the powers of the Ancients could \ -bring them together.~"; -! LIE - Anabais never imprisoned, etc. - default: "There doesn't seem to be a section \ -about that."; - } - Cast: - if (the_spell_was == ledak_spell) { - remove self; - "The scriptures are surrounded by a \ -yellow glow. To your horror, the tome evaporates into nothing!"; - } - ], - !weight 20, - size 15, -has proper; - -! *** parchments -! (Several scraps of -! Palemon's journal are scattered around Quendor, -! contradicting the ancient scriptures) - -! (faded -- spirits exist) -Object p2 "faded parchment" MON_Hidden_sanctum - class parchment_class, - with name "faded", -description "~...are real! I have seen much evidence in the \ -jungles of Miznia, marshes of Fublio Valley, the ruins \ -of old Egreth and in Aragain itself! I believe that \ -they are associated with certain basic elements in the \ -surrounding area. But they dare not show themselves now, \ -not while magic is strong! Woe unto us, should the powers \ -of magic cease, as there would be nothing to stop their \ -terror...~", -; - -Object MON_Steeple_room "Steeple Room" - with description "You are in a round room with colored-glass \ - windows. Wood beams line the walls and rise to form \ - a short point in the peaked ceiling above. A small \ - walkway returns to the southwest. A long wood table \ - sits in the center of the room.", - name "windows" "glass" "beams" "walkway" "handle" "latch", - sw_to MON_f2hall2, - !out_to MON_Steeple_roof, - out_to steeple_window, - before [; - Go: - if ((noun == out_obj) && (steeple_window has open)) { - if (random(10) < 3) { - print "^You climb out the open window and somehow manage \ - not to fall.^"; - } - else { - deadflag = 1; -print "^You climb out the open window, but slip on the icy sill"; -if (has_resist_gravity == 0) ", and plummet to the ground!"; -else -"! As you float slowly downwards, you can't help but notice the \ -hungry-looking winter dire wolf below, waiting for you to land..."; - } - } - ], - has light; - -Object MON_Steeple_roof "Steeple Roof" - with description "You are on a very narrow ledge outside \ - the Monastery steeple. The snow and wind are doing \ - their best to send you to a ungracious death below. The \ - steeple roof is quite sharply slanted.", - in_to steeple_window, - name "roof" "ledge" "wind", - cant_go "It's hard enough staying on the ledge.", - before [; - Jump: - deadflag = 1; - if (has_resist_gravity==0) - "Well, if you insist. The ground breaks most of the \ - bones in your body, including the important ones."; - else - "You float downwards gracefully, into the waiting \ -jaws of a winter dire wolf."; ! - ], - has light; - -Object steeple_window "steeple window" - with name "window" "rose" "steeple", - found_in MON_Steeple_room MON_Steeple_roof, - description [; - print "A large rose-colored glass window"; - if (location==MON_Steeple_room) - ", with a handle and latch"; - "."; - ], - describe [; - if (location==MON_Steeple_room) { - if (self has open) - "Someone has left a rose-colored window open and some \ -snow drifts in."; - "A large rose-colored window lets some light in."; - } - if (location==MON_Steeple_roof) { - if (self has open) - "A window opens into the steeple proper."; - "A large rose-colored window is partially covered with snow here."; - } - ], - door_dir [; - if (location==MON_Steeple_room) return out_to; - return in_to; - ], - door_to [; - if (location==MON_Steeple_room) return MON_Steeple_roof; - return MON_Steeple_room; - ], - before [; - Enter: - if (location==MON_Steeple_room) <>; - else <>; - Open: - if ((self hasnt open) && (location==MON_Steeple_roof)) - "Unfortunately, the window opens inward, and the latch \ - and handle are on the inside."; - if ((self hasnt open) && (location==MON_Steeple_room)) { - give self open; - "You turn and yank the window handle and pull. \ - A rush of wind and snow greets you as you open \ - the window."; - } - Close: - if ((self has open) && (location==MON_Steeple_roof)) - "It doesn't seem to want to stay shut. You can't \ -quite reach the window latch from out here."; - Attack: - "The window glass remains unmarred. It's probably made of \ - that especially thick lead-glass that the Monastery got \ - because Brother Toolbox kept complaining about drafts."; - Push: - if (self hasnt open) - "It doesn't budge."; - Search: - "The window looks out into a winter wonderland."; - ], - has static door openable; - -Object steeple_table "long table" MON_Steeple_room - with name "table" "long" "steeple", - description "This long wood table has been used for various \ - private meetings and impromptu get-togethers between \ - members of the Order in the past.", - has scenery supporter; - -Object MON_f0hall1 "Hallway (basement)" - with description "You are in a hallway in the Monastery basement. \ - The hallway continues to the east, and stairs lead upwards.", - name "stairs", - u_to MON_f1hall2, - e_to MON_Refectory, - has light; - -Object MON_Refectory "Refectory" - with description "You are in the Refectory, the general dining \ -area for members of the Order. You grimace at the lingering scent of \ -Brother Pufpistery's favorite dish -- Borphbelly stew. \ -Several large oak tables and benches adorn this otherwise \ -bare room. An exit lies to the west, the kitchen is to \ -the north, and another exit lies to the east.", - name "oak" "tables" "benches", - w_to MON_f0hall1, - n_to MON_Kitchen, - e_to MON_Storeroom, - before [; - Smell: "Even the faintest lingering scent of Borphbelly stew \ -is enough to make you feel like fasting."; - ], - has light; - -Object MON_Kitchen "Monastery Kitchen" - with description "You are in Brother Pufpistery's domain -- the \ -dreaded acolyte kitchen. A huge soup \ -cauldron sits unused nearby. The refectory is \ -south.", - s_to MON_Refectory, - before [; - Smell: "The lingering scent of Borphbelly stew \ -is stronger here, unfortunately."; - ], - has light; - -Object cauldrons "cauldron" MON_Kitchen - with name "cauldron" "vat", - description "This large iron soup cauldron has the \ - unmistakable odor of Borphbelly stew. Ugg.", - size 25, - capacity 10, - before [; - Cast: - if (the_spell_was == bekdab_spell) - "The soup cauldron rusts a bit."; - ], - has scenery container open; - -Object preparing_table "preparing table" MON_Kitchen - with name "table" "preparing", - description "A heavy wood table with a well-used look.", - before [; - Cast: - if (the_spell_was == egdelp_spell) - "The table is now covered in a waxy film. \ -All things considered, it actually looks cleaner now."; - ], - has static supporter; - -Object recipe_paper "scrap of paper" preparing_table - with name "scrap" "recipe" "paper", - description "It's a recipe torn from an issue of \ - ~Better Homes and Caverns~:^^\ - GUILDMASTER SNEFFLE'S PRIZE WINNING BIRTHDAY CAKE \ - ^^\ - Ingredients:^^\ - -- 1 small sack of flour^\ - -- 1 large sugar cube^\ - -- 1 packet of baking powder^\ - -- 1 stick butter^\ - -- 1 large corbie egg^\ - -- Dornberries, to taste^^\ - Mix the ingredients together. Fold the resulting \ - mixture the correct number of times (a single gloth \ - spell should do the trick). Bake in a GUE \ - Automatic oven on the ~cake~ setting.^^\ - Guildmaster Sneffle claims that ~the dornberries are \ - the secret to making a cake even the King would be \ - impressed with.~ He also notes that ~improper folding \ - of the dough will produce very poor results.~", - !weight 1, - size 5, -; - -Object MON_Storeroom "Storeroom" - with description "You are in a small cramped storeroom, stocked \ -with various crates and barrels of foodstuffs. \ -The refectory is west.", - name "crate" "crates" "foodstuffs", - w_to MON_Refectory, - d_to secret_trapdoor, - each_turn [; - if ((random(20) == 1) && (secret_trapdoor notin MON_Storeroom)) - print "^A tiny mouse scurries into view, then disappears \ - under a barrel.^"; - ], - before [; - Go: - if (noun==d_obj) - if (secret_trapdoor hasnt general) - "You can't go that way."; - ], - has light; - -Object crate1 "large barrel" MON_Storeroom - with name "barrel", - description "A large wooden barrel labeled ~DRIED PRUNES~.", - before [; - Cast: - if (the_spell_was==egdelp_spell) - "The barrel is covered with a light \ -waxy film."; - Take, Remove: - "The barrel is far too bulky to take."; - Open: - "You'd probably need a hacksaw to do that. Besides, \ - look what it says it contains."; - Push, Pull: - if (secret_trapdoor hasnt general) { - give secret_trapdoor general; - move secret_trapdoor to MON_Storeroom; - "Well whaddya know, a trapdoor..."; - } - ], - has supporter; - -Object flour "sack of flour" crate1 - with name "flour" "sack", - short_name "sack of flour", - description "A small sack of flour, all-purpose.", - !weight 15, - size 14, - has edible; - -Object MON_Caverns "Caverns" - with description "You are in an low underground cavern, made of roughly \ -worked stone. An even lower tunnel travels east.", - name "stone" "worked" "tunnel", - u_to secret_trapdoor2, - e_to cave_intersection, -; - -! A two-way initially hidden trapdoor, which affects rooms. -! To my great chagrin, I couldn't code this in one obj (sigh). -! I admit it, this is my first Inform project. -Object secret_trapdoor "trapdoor" - with name "trapdoor" "trap" "door", - description "A wooden trapdoor in the floor.", - door_to MON_Caverns, - door_dir d_to, - describe [; - if (self has open) - "A trapdoor opens into darkness below."; - "There is a closed trapdoor in the floor here."; - ], - before [; - Enter: <>; - Open: - give MON_Caverns light; - give secret_trapdoor2 open; - rfalse; - Close: - give MON_Caverns ~light; - give secret_trapdoor2 ~open; - rfalse; - ], - has static door openable; - -Object secret_trapdoor2 "trapdoor" MON_Caverns - with name "trapdoor" "trap" "door", - description "A wooden trapdoor in the ceiling.", - door_to MON_Storeroom, - door_dir u_to, - describe [; - if (self has open) - "Light gleams in from an open trapdoor above."; - "You notice a closed trapdoor in the ceiling."; - ], - before [; - Enter: <>; - Open: - give MON_Caverns light; - give secret_trapdoor open; - rfalse; - Close: - give MON_Caverns ~light; - give secret_trapdoor ~open; - rfalse; - ], - has static door openable; - -Object cave_intersection "Cave Intersection" - with description [; - print "You are in a large open cavern. The rough \ - limestone here was probably eroded by underground springs \ - to form the somewhat circular chamber you now stand in. \ - Oddly, there seems to have been a recent cave-in, as \ - piles of rubble line the walls. A tunnel \ - snakes off to the west"; - if (self has general) - ". To the southeast, there is a wide square hole!"; - else "."; - ], - name "limestone" "rubble" "tunnel", - ! cant_go "There's too much rubble", - w_to MON_Caverns, - se_to [; - if (self hasnt general) rfalse; - if (self has general) return Mystical_Cave; - ], - before [; - Go: - if ((noun == se_obj) && (self has general)) { - if ((white_rod_piece in player) && - (black_rod_piece in player) && - (gray_rod_piece in player) && - (smoke_rod_piece in player)) { - remove white_rod_piece; - remove black_rod_piece; - remove gray_rod_piece; - remove smoke_rod_piece; - Player_Lives_Left = 0; ! hope you saved... - spell_block = 1; ! going into the endgame... - print "^As you enter the tunnel, a strange \ -light surrounds you! The four rod pieces you were \ -carrying crumble into dust!^"; - } - else - "Well, the hole to the southeast seems obvious \ -enough. But, some mysterious force blocks the way! \ -Try as you might, you can't seem to enter it!"; - } - ], -; - -Object steel_wall "steel wall" cave_intersection - with name "steel" "wall", - description "A ten-by-ten slab of solid steel, this wall \ - must be at least a foot thick, and is accented by \ - large steel rivets that bolt it to the surrounding \ - rock.", - initial "To the southeast, a huge steel wall demonstrates \ - a marked contrast to the otherwise drab surroundings.", - before [; - Open: "I presume you have a blow-torch handy?"; - Push, Pull, Turn: "Not surprisingly, it doesn't move an inch."; - LookUnder: "It's flush with the rock floor."; - Cast: "The wall seems to absorb and nullify all magic!"; - ], - has static; - - -! *********************************************************************** -! ** -! ** GRAY MOUNTAINS AREA NEARBY MONESTARY -! ** -! *********************************************************************** - -Object Cliff_face "Cliff Face" - with description "You are standing near the top of a snowy mountain peak. \ -The wind is quite cold and is making your teeth chatter. \ -The general vicinity is mostly snow and rock; however, the \ -entrance into the Monastery is to the north, all but hidden from view \ -by the enormous slabs of snow-covered rock that make up the \ -cliff face. There is a rough but obvious trail leading down \ -the mountain to the south. There is also another trail that \ -winds even further up the mountain peak almost hidden in the \ -snow to the east.", - name "peak" "wind" "rock" "structure" "slabs" "trail", - n_to MON_Entrance_hall, in_to MON_Entrance_hall, - s_to rocky_trail, d_to rocky_trail, - e_to Covered_trail, u_to Covered_trail, - has light; - -Object Covered_trail "Covered Trail" - with description "You are climbing up a small trail that gets periodically \ -lost in great bluffs of snow. The swirling snow makes seeing \ -an unusual effort. The trail leads downwards to a cliff face \ -to the west, and rises towards the mountain top to the north.", - name "bluffs" "trail", - w_to Cliff_face, d_to Cliff_face, - n_to Mountain_peak, u_to Mountain_peak, - has light; - -Object Mountain_peak "Mountain Peak" - with description [; - print "You are standing on the top of a peak of the Gray \ -Mountains. A cold wind blows snow everywhere, obscuring what \ -would otherwise surely be a wonderful view of the surrounding \ -countryside. You can just make out some buildings to the far \ -south in Frostham. A snowy bluff marks the way back down"; - if (self hasnt general) -", or to the west, there appears to be a snowy outcropping. It seems to \ -hang precariously over the edge of the mountain, however."; - else "."; - ], - name "wind" "peak" "mountains" "countryside" "buildings" "bluff", - d_to Covered_trail, - w_to [; - if (self has general) - "Looks like the outcropping completely collapsed!"; - return Snowy_outcropping; - ], - before [; - Go: - if ((noun==w_obj) && (self hasnt general) && (player notin sleeppallet)) { -! if (WeightOf(player) > 25) { - if (children(player) > 0) { - print "As you start to tread out to the outcropping, you feel \ - the snow beneath your feet shifting under your sudden \ - weight! You "; - if (random(10) > 6) { - deadflag = 1; - "start to turn back, but the entire \ - outcropping suddenly tilts under your weight, sending \ - you hurtling off the edge into oblivion!"; - } - else { - "beat a hasty retreat back to the peak."; - } - } - print "You carefully make your way onto the outcropping.^"; - } - Jump: - "Not advisable, it's probably a long way down..."; - ], - has light; - -Object Snowy_outcropping "Snowy Outcropping" - with description - "You are standing on a snow-covered outcropping. \ - You are almost waist-deep in snow, and the blisteringly cold \ - winds aren't helping. The outcropping juts out alarmingly \ - over the western edge of the mountain. In fact, you can see the \ - Monastery steeple below this ledge. \ - The main portion of the mountain peak lies to the east.", - name "winds" "steeple" "peak", - e_to Mountain_peak, - each_turn [; - if (random(5)<=3) - "^There is an ominous creaking noise somewhere underfoot."; - "^Some snow falls off the outermost edge of the outcropping."; - ], - before [; - Go: - if (noun==e_obj) - print "You cautiously make your way back to the mountain top^"; - if (noun==d_obj) - "That's not a very sound idea."; - Jump: - "Let's not be suicidal."; - Yell: - Outcrop_break(1); rtrue; - Sneeze: - Outcrop_break(2); rtrue; - Drop: - deadflag = 1; - "You must have disturbed something! The entire outcropping \ - breaks away in an avalanche, and you plummet to your death!"; - Take, Touch, Push, Pull: - if (noun==dirty_scroll) { - if (random(10) > 5) { - deadflag = 1; - give Mountain_peak general; - remove Snowy_Outcropping; - move dirty_scroll to MON_Steeple_roof; ! it's still obtainable... - "As you reach for the scroll, the entire outcropping lurches \ - alarmingly! Without warning, it \ - breaks away in an avalanche, and you plummet to your death!"; - } - "As you reach for the scroll, you hear a disturbing rumbling \ - from somewhere underfoot, and you step back hastily."; - } - Answer: - if (inp2==player) { - Outcrop_break(1); rtrue; - } - "To who/whom, exactly?"; - ], - has light; - -[ Outcrop_break type; - if (type == 1) - print "You give the best bellow you can muster, given the current \ - weather conditions."; - if (type == 2) - print "Understandable, given the weather conditions."; - print " Unfortunately, you seem to have disturbed \ - something, as the entire outcropping gives way in a brief but \ - powerful avalanche! You tumble through the air, followed by \ - a large quantity of snow! But suddenly, you see the \ - Monastery steeple rushing up to meet you!^^THUMP!^^\ - You lie dazed for a moment. Miraculously, the dirty scroll \ - lands next to you!^"; - give Mountain_peak general; - move dirty_scroll to MON_Steeple_roof; - remove Snowy_Outcropping; - PlayerTo(MON_Steeple_roof); - rfalse; -]; - -Object dirty_scroll "dirty scroll" Snowy_outcropping - class scroll_class, - with name "dirty", - initial [; - if (location==Snowy_outcropping) - "There is a dirty scroll here, practically buried in the snow!"; - "There is a dirty scroll here."; - ], -; - -Object swanko_spell "banish spirit" dirty_scroll - class spell_class, - with name "swanko", - magic - [; - if (second==0) -"The chant, looking for a locus of spiritual energy, fails."; - "The general vicinity seems pretty free of spirits now."; - ], -; - -Object rocky_trail "Rocky Mountain Trail" - with description "You are on a rocky mountain trail \ - that winds up and down a mountain. Patches of \ - snow can be found here and there. The trail \ - continues down the mountain to the south, or \ - up to the north.", - name "trail", - d_to snowy_intersection, - s_to snowy_intersection, - u_to cliff_face, - n_to cliff_face, - has light; - -Object snowy_intersection "Snowy Intersection" - with description "You are at a snow-filled crossroads \ - in a mountain trail. Paths lead north towards \ - the top of the mountain, east, west, and south \ - towards the base of the mountain.", - name "trail" "mountain", - n_to rocky_trail, - s_to North_of_river, - e_to "The path east is blocked after a short distance by a huge snow drift.", - w_to Top_of_drop, - has light; - -Object stone_marker "stone marker" - with initial "There is a large stone marker here, in \ - the center of the intersection.", - name "stone" "marker" "obelisk", - description [; - print "This odd stone structure, partially \ - covered in snow, looks quite old and mysterious. \ - It's about seven feet tall, and is shaped like \ - an obelisk"; - if (self hasnt general) - ", with the top partially broken off."; - else "."; - ], - found_in snowy_intersection snowy_intersection2, - has static; - -! (second snowy intersection -- in the "past") -Object snowy_intersection2 "Snowy Intersection" - with description "You are at a snow-filled crossroads \ - in a mountain trail. Paths lead north towards \ - the top of the mountain, east, west, and south \ - towards the base of the mountain.^^Something \ - seems familiar, yet different, about this place.", - name "trail" "mountain", -n_to "The path north ends after a short distance.", -s_to "The path north ends after a short distance.", -w_to "The path north ends after a short distance.", -e_to "The path east is blocked after a short distance by a huge snow drift.", - has light; - - -Object stone_marker_top "broken stone top" - with name "top" "stone" "pinnacle" "broken", - capacity 1, - size 10, - description "The top pinnacle from the stone marker. \ -You notice that it's partially hollow inside.", - before [; - Receive: - if ((noun==silver_rod_piece) && - (snowy_intersection has general)) { - move silver_rod_piece to self; - give snowy_intersection ~general; - remove self; - give snow general; - print "As you place the rod piece in the \ -broken stone piece, you sense a force from above pull you \ -skywards! In moments, you are high above the snow covered \ -mountains, nearing the sky, which you notice is strangely \ -purple!^"; - PlayerTo(Mystical_Cave); - ! spell_block = 0; - Mystical_Cave.number = Mystical_Cave.number + 1; - rtrue; - } - ], - has container static open; - -Object Top_of_drop "Top of Snowy Slope" - with description "You're at the top of a short downwards slope into \ - a snowy area below. A path leads east. You could also \ - slide down the slope. A lone tree stands here, overlooking \ - the slope.", - name "slope", - e_to snowy_intersection, - d_to Bottom_of_drop, - w_to Bottom_of_drop, - u_to [; - if (tree1 has general) <>; - ], - has light; - -Object tree1 "tree" Top_of_drop - with name "tree", - description "A leafless, bare tree, with what might be a bird's \ -nest in it.", - before [; - Climb: - if (self hasnt general) give self general; - print "You clamber up the tree.^"; - PlayerTo(Top_of_tree); rtrue; - ], - has scenery; - -Object nest1 "nest" Top_of_drop - with name "nest", - description "Even from down here, it's a pretty big nest. \ - Thankfully, no big birds seem to be present.", - before [; - Search: "You can't see into it from down here."; - ThrownAt: - move noun to Top_of_drop; - "You take aim, but miss."; - Receive, LetGo, Rub, Turn, Take, Push, Pull, Touch, Attack, Shake: "You can't reach it."; - Search, LookUnder: "From down here, it's hard to see anything \ -but the bottom of the nest."; - ], - has scenery; - -Object Bottom_of_drop "Bottom of Snowy Slope" - with description "You've made your way down to a small snow-covered \ - clearing, ringed by pine trees. The only exit is back up the \ - slope.", - name "clearing" "pine" "trees" "slope", - u_to Top_of_drop, - e_to Top_of_drop, - has light; - -Object boulder "large boulder" Bottom_of_drop - with name "boulder" "rock", - initial "There's a large boulder here, sitting squat in the \ - middle of the clearing.", - description "A big, snow-covered rock.", - before [; - Push, Pull, Turn: "It must weight a ton."; - Receive: - if (noun==sleeppallet) { - move sleeppallet to boulder; - "You drape the pallet over the boulder."; - } - ], - has static supporter; - -Object egg_shards "egg shards" - with name "shards", - initial "There's some broken eggshell shards here, scattered all \ - over. Some gooey egg stuff too.", - description "Some large pieces of shell is all.", - !weight 5, - size 5, -; - -Object Top_of_tree "Top of tree" - with description "You're on top of the tree, on some lower branches \ - that seem pretty stable.", - d_to Top_of_drop, - has light; - -Object tree2 "tree" Top_of_tree - with name "tree", - description "Overall, there's nothing terribly special about this tree.", - has scenery; - -Object nest2 "nest" Top_of_tree - with name "nest", - initial [; - print "There's a large bird's nest a bit farther out on a \ - nearby branch"; - if (corbie_egg in self) - print ". There appears to be an egg in it"; - "."; - ], - description "Given the size and Brother Joseph's lessons \ - in ornithology, you'd guess that it's a corbie's nest. \ - It looks abandoned.", - before [; - ThrownAt: - move noun to Top_of_drop; - print "Your throw goes a little wide, and "; - DefArt(noun); print " lands "; - ! if (WeightOf(noun) > 10) - ! "with a thump below."; - ! else "below."; - "below."; - Take: "It's way out on a thinner branch that probably \ - won't support your weight."; - Receive: "You can't quite reach it to put anything in it."; - Push, Pull, Rub, Touch, Attack, Shake: "You can't reach it."; - LookUnder: "It seems to be sitting on some branches."; - ], - size 10, - has static container open transparent; - -Object corbie_egg "corbie egg" nest2 - with name "egg", - short_name "corbie egg", - description "A large speckled corbie egg.", - !weight 8, - size 5, - before [; - Take, Rub, Push, Pull, Touch, Squeeze, Turn, Shake: - if (parent(self) == nest2) - "You can't reach it."; - LookUnder: - if (parent(self) == nest2) - "It seems to be in a nest."; - ThrownAt: - if (parent(self) == nest2) { - move egg_shards to Top_of_drop; - move noun to Top_of_drop; - remove self; - "Good toss! A bit too strong though. With a dull \ - crack, your throw breaks the egg, and pieces of \ - shell and egg goop fall to the ground below."; - } - Attack: - move egg_shards to parent(player); - remove self; - "The egg breaks easily, covering you with egg goop. \ -What a mess."; - ], -has edible scored; - -Object branch "branch" Top_of_tree - with name "branch" "branches", - description "Some leafless thin tree branches.", - before [; - Push, Pull, Turn, Shake: - if (corbie_egg in nest2) { - print "You give the branches a good shake. The egg pops \ - free and tumbles to the ground below! You see the egg \ - land in a soft patch of snow, and roll down the slope! \ - Moments later, you hear a dull "; - if (sleeppallet in boulder) { - move corbie_egg to Bottom_of_drop; - "thump from below."; - } - else { - remove corbie_egg; - move egg_shards to Bottom_of_drop; - "crack from below."; - } - } - "You give the branches a good yank. A bit of snow falls."; - ], - has scenery; - - -! Some scenery 'fluff' -Object snow "snow" - with name "snow", - description "Cold, white and not in short supply.", - found_in Mountain_peak Covered_trail Cliff_face Snowy_outcropping MON_garden - snowy_intersection rocky_trail Top_of_drop Bottom_of_drop, - before [; - Take: "It melts into nothing soon after."; - Touch: "It's crisply cold."; - Search: - if ((self has general) && (location == snowy_intersection)) { - give self ~general; - Achieved(16); - move stone_marker_top to snowy_intersection; - "Remembering where the stone marker top fell, you brush \ -aside some snow. Sure enough, there it is!"; - } - ], - has scenery; - - - -Object North_of_river "North of Frozen River" - with description "You are standing just north of a frozen river \ -(probably a tributary of Lake Dinge). You can just see \ -the south bank from here, where the trail seems to \ -continue. There doesn't seem to be a bridge, however. \ -A trail also continues north.", - name "river" "lake" "bank" "trail", - s_to Frozen_river, - n_to snowy_intersection, - has light; - - -Object Frozen_river "On Frozen River" - with description "You are standing on a wide smooth river of ice. \ -The river 'runs' east to west, and there are banks to the \ -north and south.", - name "bank" "banks", - n_to North_of_river, - s_to South_of_river, - e_to "You slide eastwards, and lose your footing, going nowhere.", - w_to "You slide westwards, and slip, going nowhere.", - before [; - Drop: - if (noun==sand) { - move sand to Frozen_river; - Achieved(0); - "You scatter the sand onto the ice."; - } - Go: - if (noun==s_obj) { - if (player notin sleeppallet) { - if (sand notin Frozen_river) - "You slide and flounder helplessly on the ice!"; - else - print "You tread lightly on the sand covered portion of \ - the ice, and scramble to the south bank.^"; - } - } - Jump: - deadflag = 1; - "You bravely jump, but without warning, the ice cracks in many \ - places, and you fall into the freezing river, becoming a human \ - popsicle in a short amount of time."; - ], - has light; - -! (special -- accessible only from Atrii -- put useful item here) -Object Frozen_river2 "On Frozen River" - with description "You are standing on a wide smooth river of ice. \ -The river 'runs' east to west. To the north and south \ -are huge snow bluffs that obscure most of the surrounding \ -countryside.", - e_to "You step eastwards but lose your footing, going nowhere.", - w_to Frozen_river, - before [; - Go: - if (noun==w_obj) - print "^As you step west, a slight downwards slope \ -in the ice sends you sliding uncontrollably.^"; - Jump: - deadflag = 1; - "You bravely jump, but without warning, the ice cracks in many \ - places, and you fall into the freezing river, becoming a human \ - popsicle in a short amount of time."; - ], - has light; - -! (scrawled -- clue to using spheres) -Object p7 "scrawled parchment" Frozen_river2 - class parchment_class, - with name "scrawled", -description "~Red beats smoke,^\ -Silver bests clouds,^\ -Green defeats depths,^\ -Brown stops earth.~"; - -Object river_ice "river ice" - with name "ice" "river", - description "The ice is thick and quite smooth.", - found_in Frozen_river Frozen_river2, - before [; -! just trap all receives as drops - Receive: - <>; - ], - has scenery supporter; - -Object South_of_river "South of Frozen River" - with description "You are standing just south of a frozen river. \ -You can just see the north bank from here, where the trail seems to \ -continue. The only way to get there is across the river. \ -A trail heads south into a valley.", - name "river" "bank" "trail", - n_to Frozen_river, - s_to Valley_trail, - has light; - -Object Valley_trail "Valley Trail" - with description "You are walking along a valley trail, just \ - below a portion of the Gray Mountain ranges. You can \ - see the beginnings of a city to the south, while the \ - trail winds further into the mountain ranges to the \ - north.", - name "trail" "ranges" "mountain" "city", - n_to South_of_river, - s_to FROSTHAM_Outskirts, - has light; - -! (An interesting object, with possible uses...) -!Object bathroom_scale "bathroom scale" -! with name "scale" "bathroom", -! description [; -! if (player in bathroom_scale) -! "This is an odd small flat white device, with a tiny \ -! glass window at one end that you can see a numbered dial \ -! through. The dial currently reads -- wait, that \ -! can't be right. The thing must be broken."; -! print "This is an odd small flat white device, with a tiny \ -! glass window at one end that you can see a numbered dial \ -! through. The dial currently reads: <", -! (WeightOf(self) - 10), " Ughs>.^"; rtrue; -! ], -! weight 10, -! has supporter enterable; - - -! *********************************************************************** -! ** (at this point, for clarity and my sanity, I'm going to build -! ** the remaining locations & objects in separate files, included -! ** here. Hopefully, the files will be somewhat organized based on -! ** general location/town/situation, etc. -! *********************************************************************** - -Include "frostham.inf"; -Include "aragain.inf"; -Include "anthar.inf"; -Include "fublio.inf"; -Include "borphee.inf"; -Include "miznia.inf"; -Include "gurth.inf"; -Include "subway.inf"; -Include "special.inf"; - -! *********************************************************************** -! ** -! ** HADES, in a newer format -! ** -! *********************************************************************** - -Class Hades_Room_Class - with description "You are floating in an empty space. Surrounding you \ - on all sides is a great wall of flame. It would almost seem \ - like you are trapped inside a ball of fire.", - name "fire" "ball" "space" "flame", - before [; - if ((action~=##Go) && (action~=##Look) && (action~=##Wait)) - "You currently lack the means to do that."; ! can't do much in Hades... - Go: - give self ~visited; ! cheat, easier than routines for each dir... - print "^You find yourself floating through the flaming wall! \ - As you pass through you feel a gut-wrenching sensation. \ - Well, perhaps you would if you currently had a gut, or \ - sensations for that matter. Let's just say you feel \ - something akin to a gut-wrenching sensation, and leave \ - it at that.^"; - ], - has light; - -Object Hades_1 "Hades" - class Hades_Room_Class - with u_to Hades_1, - d_to Hades_1, - n_to Hades_1, - s_to Hades_1, - e_to Hades_1, - w_to Hades_1, - in_to Hades_1, - out_to Hades_1, - ne_to Hades_2, - nw_to Hades_1, - se_to Hades_1, - sw_to Hades_1, - each_turn [; - if (random(10) == 1) - "^A wisp of smoke appears to the northeast, then fades."; - ], -; - -Object Hades_2 "Hades" - class Hades_Room_Class - with u_to Hades_1, - d_to Hades_1, - n_to Hades_2, - s_to Hades_3, - e_to Hades_1, - w_to Hades_2, - in_to Hades_1, - out_to Hades_1, - ne_to Hades_2, - nw_to Hades_1, - se_to Hades_2, - sw_to Hades_2, - each_turn [; - if (random(10) == 1) - "^A wisp of smoke appears to the south, then fades."; - ], -; - -Object Hades_3 "Hades" - class Hades_Room_Class - with u_to Hades_4, - d_to Hades_3, - n_to Hades_2, - s_to Hades_1, - e_to Hades_1, - w_to Hades_2, - in_to Hades_3, - out_to Hades_1, - ne_to Hades_2, - nw_to Hades_1, - se_to Hades_3, - sw_to Hades_3, - each_turn [; - if (random(10) == 1) - "^A wisp of smoke appears above, then fades."; - ], -; - -Object Hades_4 "Hades" - class Hades_Room_Class - with u_to Hades_3, - d_to Hades_3, - n_to Hades_5, - s_to Hades_2, - e_to Hades_1, - w_to Hades_4, - in_to Hades_4, - out_to Hades_1, - ne_to Hades_1, - nw_to Hades_3, - se_to Hades_3, - sw_to Hades_1, - each_turn [; - if (random(10) == 1) - "^A wisp of smoke appears to the north, then fades."; - ], -; - -Object Hades_5 "Hades" - with description "You are floating in an empty space. Surrounding you \ - on all sides is a great wall of flame. It would almost seem \ - like you are trapped inside a ball of fire.", - name "fire" "space", - u_to Hades_1, - d_to Hades_3, - n_to Hades_2, - s_to Hades_4, - e_to Hades_4, - w_to Hades_5, -! in_to Hades_1, - out_to Hades_1, - ne_to Hades_1, - nw_to Hades_3, - se_to Hades_3, - sw_to Hades_2, - before [; - if ((action~=##Go) && (action~=##Look) && - (action~=##Wait) && (action~=##Enter) && - (action~=##Take) && (action~=##Examine)) - "You currently lack the means to do that."; - Go: - if (noun==in_obj) { - Revive_Player1(); - rtrue; - } - give self ~visited; - print "^You find yourself floating through the flaming wall! \ - As you pass through you feel a gut-wrenching sensation. \ - Well, perhaps you would if you currently had a gut, or \ - sensations for that matter. Let's just say you feel \ - something akin to a gut-wrenching sensation, and leave \ - it at that.^"; - ], - has light; - -Object Hades_flameball "Ball of flame" Hades_5 - with name "ball" "sphere" "flame", - initial [; - print "In the center of the room is a "; - if (Player_Lives_Left >= 3) - "large flaming sphere."; - if (Player_Lives_Left == 2) - "medium-sized flaming sphere."; - "small flaming sphere."; - ], - description "It's rather hypnotic -- a perfect sphere made entirely of orange-red fire.", - before [; - Enter: - Revive_Player1(); - rtrue; - ], - has enterable static open; - -[ Revive_Player1 ; - print "You find yourself drawn into flaming sphere. The \ - ball of flame engulfs you completely, and you feel \ - nothing as inky blackness surrounds you.^^\ - ~You have revived him!~ you hear a voice say.^^\ - You open your eyes. You are lying on a long wooden \ - table in the Monastery Steeple room. Several members \ - of the Order are gathered around you, and Brother \ - Joseph helps you to your feet.^^\ - ~We were able to bring you back to the world of the \ - living,~ Joseph says, ~but I fear our powers are waning, \ - and we may not succeed if we try again. Your quest \ - continues!~^^\ - The group files out, leaving you alone in the room.^"; - in_hades = 0; - Player_Lives_Left--; - Player_HP_CUR = Player_HP_MAX; ! Healed up - give steeple_window ~open; ! one of the acolytes was too cold... - PlayerTo(MON_Steeple_room); -]; - - -! *********************************************************************** -! ** -! ** INITIALIZE AND OTHER STARTUP, place player, place objs, etc -! ** -! *********************************************************************** - -[ Initialise; - - thedark.description = - "It is pitch black. You are likely to be eaten by a grue."; - - prayer_book.magic = all_my_spells; - ; - ; - move prayer_book to player; - location=MON_Chapel1; - -! (FOR TESTING ONLY) -!move amulet to player; -!; -!; -!; -!; -!; -!move TEMPLE_Artifact to player; -!move umbrella to player; -!move sack to player; -!move c1 to player; -!move magic_door to player; -!location = ANTHAR_GUSStation; -!location=Skyscraper; -!spell_block = 1; -!; -!; -!; -!move decaf_coffee_can to player; -!location=ATRII_1; -]; - - -! *********************************************************************** -! ** -! ** Some special routines, which should be after Initialise -! ** -! *********************************************************************** - -! The Afterlife -- or, a fine time in Hades -[ AfterLife i; - if (Player_Lives_Left <= 0) { - print "^^A blackness surrounds you, replaced by more blackness...^^"; - rfalse; - } - else { - deadflag = 0; ! not dead yet - ! move inventory to place of death - i=parent(player); - while (child(player)~=0) { - give child(player) ~worn; - move child(player) to i; - } - spell_block = 0; - in_atrii = 0; - in_hades = 1; - print "^^A blackness surrounds you, only to be replaced by...^^"; - i = random(4); - if (i==2) { PlayerTo(Hades_2); rtrue; } - if (i==3) { PlayerTo(Hades_3); rtrue; } - else { PlayerTo(Hades_1); rtrue; } - } -]; - - -[ DarkToDark i; - i = random(10); - if (i < 4) { - print "^Hmm, perhaps the Grues really are migrating with the \ - Great Change.^"; - rtrue; - } - if (i >= 4) { - deadflag = 1; - "^Well, don't say I didn't warn you. Something horrible \ -with slavering fangs lurks up and devours you!"; - rtrue; - } -]; - - -! [ WeightOf obj t i; -! t = obj.weight; -! objectloop (i in obj) t=t+WeightOf(i); -! return t; -! ]; -! Now, rules for capacity still hold (slightly unrealistic), but we -! can now check WeightOf(player) in those situations that need it. - -[ PrintRank; - print ", earning you the rank of "; - if (score < 0) "Wanna-be Altar-boy"; -! if (score >= 500) "Truly Enlightened One"; -! if (score >= 495) "Benevolent One"; -! if (score >= 490) "Faithful One"; -! if (score >= 395) "Simple Man"; -! fill fill - if (score >= 250) "Enlightened One"; - if (score >= 225) "Patriarch"; - if (score >= 200) "Cardinal"; - if (score >= 150) "Lama"; - if (score >= 125) "Cleric"; - if (score >= 100) "High Priest"; - if (score >= 90) "Priest"; - if (score >= 75) "Monk"; - if (score >= 50) "Brother"; - if (score >= 30) "Acolyte"; - if (score >= 20) "Aspirant"; - if (score >= 10) "Devoted"; - if (score >= 5) "Believer"; - "Non-believer"; -]; - -[ PrintTaskName ach; - switch (ach) { - 0: "using sand to get across the river"; - 1: "triplicating the cereal box"; - 2: "setting the alarm clock"; - 3: "getting the waxy scroll from the skier"; - 4: "giving the palace guard a good cake"; - 5: "solving Barsap's Gambit"; - 6: "fixing the sailboat"; - 7: "finding the rod in the shipwreck"; - 8: "triplicating the ale"; - 9: "finding the rod under the statue"; - 10: "pruning the Christmas Tree Monster"; - 11: "getting past the burly sports fan"; - 12: "winning the three Golem bouts"; - 13: "ending the kobold war"; - 14: "unlocking Duncanthrax's Trophy chamber"; - 15: "unlocking the Lab door"; - 16: "finding the rod in the top of the marker"; - 17: "finding the rod in the house foundation"; - 18: "removing the impenetrable steel wall"; - 19: "joining the True Rod"; - 20: "getting past the broken subway gate"; - 21: "finding the hidden path to the temple"; - 22: "getting the rod through the temple"; -! 23: "finding the scroll in Frobar's painting"; - 23: "getting the scroll from the boutique"; - 24: "getting the scroll from Frobar"; - 25: "getting into the subway tunnel"; - 26: "banishing the four evil elementals"; -! add, if desired - } -]; - -! *** NEW ACTION ROUTINES - -[ PraySub i; - if ((in_hades == 1) || (in_atrii == 1) || (spell_block==1)) - "You make a prayer and feel no spiritual response! \ - Have the Deities forsaken you? Or have you found a \ - place where even the Gods cannot provide guidance?"; - else { - i = random(100); - if (Player_HP_MAX ~= (20 + score)) - Player_HP_MAX = (20 + score); - ! consider increasing memory/spell capacity here - if (i==97) { - Player_HP_CUR = Player_HP_MAX; ! Healed - "You make a quick but respectful prayer to the \ - Deities above, asking for Divine Guidance in your \ - quest. A saffron glow surrounds you and you feel \ - spiritually and physically renewed!"; - } - "You make a quick but respectful prayer to the \ - Deities above, asking for Divine Guidance in your \ - quest. You finish and feel spiritually renewed."; - } -]; - -[ DiagnoseSub i; - if (Player_HP_CUR > Player_HP_MAX) ! (This should never happen) - "You feel superhuman!"; - if (Player_HP_CUR == Player_HP_MAX) - "You are in good health."; - if (Player_HP_CUR == 1) - "You are near death's door."; - if (Player_HP_CUR < 5) - "You feel extremely weak."; - if (Player_HP_CUR < 10) - "You feel weak."; - i = (Player_HP_MAX / Player_HP_CUR); - if (i >= 4) - "You feel slightly weak"; - if (i >= 2) - "You've been better, but you'll be okay."; - "You feel okay."; -]; - -[ StrongSub i; - i = random(20); - if (i > 15) { - deadflag = 1; - "Such language from a priest such as yourself! \ - The ground rumbles, and a bolt of blue wrath from the \ - Deities strikes you dead!"; - } - "Such language from a priest such as yourself! \ - The ground rumbles suddenly!"; -]; - -! [ LiftSub ; -! if (noun has static) -! "That's fixed in place."; -! if (noun has scenery) -! "You're unable to."; -! if (noun has animate) -! "That would be less than courteous."; -! print "You lift "; DefArt(noun); " and put it back in \ -! it's original position. Nothing obvious happens."; -! ]; - -[ ShakeSub ; - if (noun has animate) - "Get a hold of yourself. No need to go around shaking living \ -things like that."; - "Nothing happens."; -]; - -! (new insert routine, which is the same as old, except that -! we also check relative sizes of objects) -[ InsertSub; - receive_action = ##Insert; - if (second==d_obj ) <>; - if (parent(noun)~=player) return L__M(##Insert,1); - - if (second>1) - { action=##Receive; - if (RunRoutines(second,before)~=0) { action=##Insert; rtrue; } - action=##Insert; - } - if (second hasnt container) return L__M(##Insert,2); - if (second hasnt open) return L__M(##Insert,3); - if (IndirectlyContains(noun,second)==1) return L__M(##Insert,5); - if (noun has worn) - { L__M(##Insert,6); - ; if (noun has worn) rtrue; - } - - if (children(second)>=ValueOrRun(second,capacity)) - return L__M(##Insert,7,second); - - if (noun.size > second.size) { - CDefArt(noun); print " appears to be too large to put in "; - DefArt(second); "."; - } - move noun to second; - - if (AfterRoutines()==1) rtrue; - - if (second>1) - { action=##Receive; - if (RunRoutines(second,after)~=0) { action=##Insert; rtrue; } - action=##Insert; - } - if (keep_silent==1) rtrue; - if (multiflag==1) return L__M(##Insert,8); - L__M(##Insert,9,noun); -]; - -[ FoldSub ; - "I fail to see what you're trying to accomplish by doing this."; -]; - -[ MixSub; - "I fail to see what you're trying to accomplish by doing this."; -]; - -![ SpecialDialSub; -! if (noun hasnt numberdial) -! "You can't seem to do that."; -! if ((second > 9) || (second < 0)) -! print "It appears that the valid range for ",noun; " is 0 to 9"; -! noun.number = second; -! if (noun.number > 9) noun.number = 0; -! a special restriction in this case -! print "You set ",noun," to ",second; "."; -!]; - -[ JoinSub; - "This doesn't seem terribly productive."; -]; - -[ MeditateSub; - "You close your eyes and focus your mind inwards. \ -Mere moments of time seem to pass like eons. You \ -open your eyes."; -]; - -[ YellSub; - "ARRGH!"; -]; -[ SneezeSub; - "You make a rather sickly noise."; -]; -[ YawnSub; - if (Frobar in location) - "~Stop that!~ Frobar says, ~It's contagious.~"; - else "Tired?"; -]; -[ XyzzySub; - "A hollow voice says, ~Cool!~"; -]; -[ BegSub; - "Please, no begging."; -]; -[ LaughSub; - "Was it that funny?"; -]; - -[ HelpSub; - "Hello Player!^^\ -SPIRITWRAK, An Interactive Fantasy Adventure^\ -If you're new to interactive fiction games, I lack the \ -space here to give an adequate description, but in short, \ -you're a character in a story, able to interact with \ -objects, places and other things (using regular english \ -sentences) in order to reach your goal, which is to \ -figure out how to ~solve~ the story. For a real \ -description, you might want to check out documents \ -located at ftp.gmd.de.^^\ -For those more experienced players, if you're looking \ -for on-line clues, etc., sadly, you won't find them \ -(the Z5 code is getting rather obscenely large as I \ -write this). A short verb list is contained in the \ -README file that you should have received with this \ -game (or should be able to find at the same place you \ -found this game). Beyond that, if you're truly \ -desperate, you can post a note on the rec.arts.int-fiction \ -usenet newsgroup, or send me email.^^\ -Thanks for playing! ^^\ --- D. S. Yu [dsyu@@64holonet.net]"; -]; - -Include "Grammar"; ! (Include grammar _after_ action defs, if we replace any) - -! **** Extensions -!Extend "turn" first -! * noun "to" number -> SpecialDial; -Extend "examine" first - * scope=ReadableSpell -> Examine; - - - -! **** Action defs - -Verb "diagnose" "health" "status" - * -> Diagnose; - -Verb "spells" "memory" "chants" - * -> Spells; -Verb "learn" "memorise" "memorize" "prepare" - * scope=ReadableSpell -> Learn; -Verb "c,cast" - * -> CastOne - * noun -> CastOne; -Verb "cast" "chant" - * is_spell -> Cast - * is_spell "at" noun -> Cast - * is_spell "on" noun -> Cast; -Verb "yell" "scream" "bellow" - * -> Yell; -Verb "sneeze" "cough" - * -> Sneeze; -Verb "yawn" - * -> Yawn; -Verb "laugh" "chuckle" - * -> Laugh; -Verb "play" - * held -> Blow; -Verb "clip" "trim" - * noun -> Cut; -! Verb "lift" "raise" -! * noun -> Lift; -Verb "shake" "yank" - * noun -> Shake; -Verb "fold" - * noun -> Fold; -Verb "mix" "stir" - * noun -> Mix; -Verb "join" "connect" - * noun "to" noun -> Join - * noun "with" noun -> Join; -Verb meta "help" "hint" - * -> Help; - -! ** (nonsense verbs below, can be removed without affecting game) -Verb "xyzzy" "plugh" "treasure" "plover" "yoho" - * -> Xyzzy; -Verb "beg" - * -> Beg; -Verb "meditate" - * -> Meditate; - -end; -! fin. - diff --git a/src/SPIRITA.INF b/src/SPIRITA.INF deleted file mode 100644 index 5a93ebc..0000000 --- a/src/SPIRITA.INF +++ /dev/null @@ -1,75 +0,0 @@ -! ****************** -! Abbreviations, as produced by using '-u' option for -! optimal abbreviations under Inform 5.5 -! ****************** -! LOG -! -- 2/11/96 -- first created -! -- 3/16/96 -- hacked by hand - -!Abbreviate ". "; -Abbreviate ". "; -Abbreviate ", "; -Abbreviate " the "; -Abbreviate "The"; -Abbreviate "You"; -Abbreviate "ing"; -Abbreviate "'s an odd metal gate that only comes up to about your waist"; -Abbreviate "and"; -Abbreviate "On Giant White Cube"; -Abbreviate "s you"; -Abbreviate " st"; -Abbreviate " you"; -! Abbreviate " that"; -Abbreviate " that "; -Abbreviate " to"; -Abbreviate " through"; -Abbreviate " no"; -Abbreviate " of"; -Abbreviate " do"; -Abbreviate " train"; -Abbreviate " he"; -Abbreviate " in"; -Abbreviate " li"; -Abbreviate " lo"; -Abbreviate " on"; -Abbreviate " some"; -Abbreviate "'s a"; -Abbreviate " le"; -Abbreviate " for"; -Abbreviate " ch"; -Abbreviate " mo"; -Abbreviate " ou"; -Abbreviate " thi"; -Abbreviate " see"; -Abbreviate " gr"; -Abbreviate " ma"; -Abbreviate " clo"; -Abbreviate " ro"; -! Abbreviate " en"; -Abbreviate " an"; -Abbreviate " with"; -Abbreviate " nich"; -Abbreviate " sa"; -Abbreviate "south"; -Abbreviate " flo"; -Abbreviate " la"; -Abbreviate " sh"; -Abbreviate " ne"; -Abbreviate " br"; -Abbreviate " ca"; -Abbreviate " pa"; -Abbreviate " su"; -Abbreviate " fi"; -Abbreviate " ba"; -Abbreviate " be"; -Abbreviate " from"; -Abbreviate " wal"; -Abbreviate " sp"; -Abbreviate "Brother Joseph"; -Abbreviate "the"; -Abbreviate "round"; -Abbreviate "all"; -Abbreviate " se"; -Abbreviate "you"; -Abbreviate "rang"; -Abbreviate " are"; diff --git a/src/SUBWAY.INF b/src/SUBWAY.INF deleted file mode 100644 index 4994d04..0000000 --- a/src/SUBWAY.INF +++ /dev/null @@ -1,2033 +0,0 @@ - -! ****************************************************************** -! subway.inf -! ---------- -! Add-on file for SPIRITWRAK -! -- Contains Great Underground Subway system (trains and tunnels -! and various denizens) -! ****************************************************************** - -! First, some globals (sigh) -! Two for each train line -- one indicates 'direction' of train, -! the second indicates the current 'location' of train. -global PURPLELINE_dir = 0; ! 0 North, 1 South -global PURPLELINE_loc = 1; ! 1-10, frostham to fublio -global ORANGELINE_dir = 0; ! 0 West, 1 East -global ORANGELINE_loc = 1; ! 1-10, Aragain to Gurth -global GREENLINE_dir = 0; ! 0 North, 1 South -global GREENLINE_loc = 1; ! 1-10, New Borphee to Miznia - -! (Subway stops in each city are named as part of the city in -! caps, concat'd with "_GUSStation". All are (of course) -! underground. - -Object FROSTHAM_GUSStation "Frostham GUS Station" - with description [; - print "You are standing "; - if (self hasnt general) { - give self general; - "in a dimly lit underground \ - chamber. There seems \ - to be a much larger room to the southeast, which is \ - unfortunately almost completely blocked by a long metal \ - barricade and gate. Stairs lead up to the outside."; - } - "at the entrance to the Frostham \ - Great Underground Subway (GUS) station. The train \ - platform lies past the gate to the southeast, or \ - stairs lead up into the city."; - ], - name "stairs" "platform", - u_to FROSTHAM_GUSStop, - se_to FG_Gate, - before [; - Go: - if (noun==se_obj) { - if (FG_Gate_slot hasnt general) - "A strange buzzing noise sounds as you try \ - to pass through the gate, and an invisible \ - force blocks your way!"; - else { - give FG_Gate_slot ~general; - print "You saunter through the apparently open gate.^"; - } - } - ], - has light; - - -Object ARAGAIN_GUSStation "Aragain GUS Station" - with description "You are standing at the entrance to the Aragain \ -Great Underground Subway (GUS) station. The train \ -platform lies past the gate to the southeast, or \ -stairs lead up into the city. Some lettering on the \ -wall reads ~TRANSFER STATION~.", - name "stairs" "platform", - u_to ARAGAIN_GUSStop, - se_to AG_Gate, - before [; - Go: - if (noun==se_obj) { - if (AG_Gate_slot hasnt general) - "A strange buzzing noise sounds as you try \ - to pass through the gate, and an invisible \ - force blocks your way!"; - else { - give AG_Gate_slot ~general; - print "You saunter through the apparently open gate.^"; - } - } - ], - has light; - -Object FUBLIO_GUSStation "Fublio Valley GUS Station" - with description "You are standing at the entrance to the \ -South Fublio Valley \ -Great Underground Subway (GUS) station. The train \ -platform lies past the gate to the southeast, or \ -stairs lead up into the city.", - name "stairs" "platform", - u_to FUBLIO_GUSStop, - se_to FublioG_Gate, - before [; - Go: - if (noun==se_obj) { - if (FublioG_Gate_slot hasnt general) - "A strange buzzing noise sounds as you try \ - to pass through the gate, and an invisible \ - force blocks your way!"; - else { - give FublioG_Gate_slot ~general; - print "You saunter through the apparently open gate.^"; - } - } - ], - has light; - -! (Orange stations - one) -Object ANTHAR_GUSStation "Greater Anthar GUS Station" - with description "You are standing at the entrance to the Greater Anthar \ -Great Underground Subway (GUS) station. The train \ -platform lies past the gate to the south, or \ -stairs lead up into the city.", - name "stairs" "platform", - u_to ANTHAR_GUSStop, - s_to AntharG_Gate, - before [; - Go: - if (noun==s_obj) { - if (AntharG_Gate_slot hasnt general) - "A strange buzzing noise sounds as you try \ - to pass through the gate, and an invisible \ - force blocks your way!"; - else { - give AntharG_Gate_slot ~general; - print "You saunter through the apparently open gate.^"; - } - } - ], - has light; - -! (Green stations - three) -Object GURTH_GUSStation "Gurth City GUS Station" - with description "You are standing at the entrance to the Gurth City \ -Great Underground Subway (GUS) station. The train \ -platform lies past the gate to the southwest, or \ -stairs lead up into the city. Some lettering on the \ -wall reads ~TRANSFER STATION~.", - name "stairs" "platform", - u_to GURTH_GUSStop, - sw_to GurthG_Gate, - before [; - Go: - if (noun==u_obj) - print "You are greeted by a light rain as you leave the \ -station.^"; - if (noun==sw_obj) { - if (GurthG_Gate hasnt general) ! note diff - "A strange buzzing noise sounds as you try \ - to pass through the gate, and an invisible \ - force blocks your way!"; - else { - give GurthG_Gate ~general; - print "You saunter through the apparently open gate.^"; - } - } - ], - has light; - -Object BORPHEE_GUSStation "New Borphee GUS Station" - with description "You are standing at the entrance to the New Borphee \ -Great Underground Subway (GUS) station. The train \ -platform lies past the gate to the southwest, or \ -stairs lead up into the city.", - name "stairs" "platform", - u_to BORPHEE_GUSStop, - sw_to BorpheeG_Gate, - before [; - Go: - if (noun==u_obj) - print "You enter the city and are nearly \ - flattened by crowds rushing past.^"; - if (noun==sw_obj) { - if (BorpheeG_Gate_slot hasnt general) - "A strange buzzing noise sounds as you try \ - to pass through the gate, and an invisible \ - force blocks your way!"; - else { - give BorpheeG_Gate_slot ~general; - print "You saunter through the apparently open gate.^"; - } - } - ], - has light; - -Object MIZNIA_GUSStation "Miznia GUS Station" - with description "You are standing at the entrance to the Miznia \ -Great Underground Subway (GUS) station. The train \ -platform lies past the gate to the southwest, or \ -stairs lead up into the city.", - name "stairs" "platform", - u_to MIZNIA_GUSStop, - sw_to MizniaG_Gate, - before [; - Go: - if (noun==sw_obj) { - if (MizniaG_Gate_slot hasnt general) - "A strange buzzing noise sounds as you try \ - to pass through the gate, and an invisible \ - force blocks your way!"; - else { - give MizniaG_Gate_slot ~general; - print "You saunter through the apparently open gate.^"; - } - } - ], - has light; - -Object FROSTHAM_GUSPlatform "Frostham Train Platform" - with description [; - print "You are standing in a long underground \ - chamber. The east side of the room contains a \ - lowered set of what appear to be train tracks. \ - The tracks run south into a dark tunnel. \ - Along one wall painted lettering \ - reads ~FROSTHAM STATION~. \ - A short walkway leads northwest, to a metal fence"; - if (self has general) - ". There is a large train car sitting on the tracks \ - to the east."; - else "."; - ], - name "tunnel", - nw_to FG_Gate, - s_to "A helpful subway worker says ~Hey pal, get outa there!~", - e_to PURPLELINE_car, - in_to PURPLELINE_car, - before [; - Go: -! if (noun == nw_obj) -! print "You saunter through the apparently open gate.^"; - if ((self hasnt general) && - (noun == e_obj or in_obj)) - "You'd fall onto the tracks if you went that way."; - ], - each_turn [ i ; - if (self hasnt general) { - i = random(10); - if (i==1 or 2 or 3) { - give self general; - PURPLELINE_loc = 1; - PURPLELINE_dir = 1; ! will be heading south - "^Suddenly, from the south, a train emerges from \ - the tunnel! It pulls to a screeching halt, the \ - doors open, and several people rush out and exit \ - the station."; - } - if (i==10) - "^You hear a distant rumbling noise from the south."; - } - else { - if (self has general) { - if (PURPLELINE_loc == 2) { - give self ~general; - "^The train doors close, and the train rolls off \ - to the south."; - } - else { - PURPLELINE_loc = 2; - "^A few exit the train, and hurry out \ - of the station. You hear a voice from inside the \ - train say, ~Doors will be closing, please stand \ - clear.~"; - } - } - } - ], - has light; - - -! (Classes for gates and slots) -Class GUS_Gate_Class - with name "gate" "metal", - initial "A metal gate bisects the fence.", - door_dir nw_to, - door_to FROSTHAM_GUSPlatform, - before [; - Climb, JumpOver: "A subway worker yells ~Hey pal, no fare-jumpers!"; - Open: "It looks like it's already open."; - Close: "There doesn't seem to be anything to close."; - Enter: "You'll have to walk in the appropriate direction to go through it."; - ], - description "It's an odd metal gate that only comes up to about \ -your waist. Odder still is the fact that there's \ -no door on the gate, just two metal sides", - has static door transparent open; -Class GUS_Gate_Slot_Class - with name "slot" "metal" "thin" "small", - description "You see a rather small, thin slot that seems to be \ -almost cut into one of the metal sides of the gate.", - before [; - LetGo: "There's no way to get anything out of that tiny, \ -thin slot."; - Receive: - if (noun has is_coin) { - give self general; - remove noun; ! collection - "The coin slides into the slot with a satisfying thunk."; - } - "It doesn't look like that's going to fit into the slot."; - ], - size 1, - has scenery container open; - - -Object FG_Gate "platform gate" - class GUS_Gate_Class, - with initial [; - if (location==FROSTHAM_GUSStation) - "A metal gate bisects the fence to the southeast."; - "A metal gate bisects the fence to the northwest."; - ], - door_dir [; - if (location==FROSTHAM_GUSStation) - return se_to; - return nw_to; - ], - door_to [; - if (location==FROSTHAM_GUSStation) - return FROSTHAM_GUSPlatform; - return FROSTHAM_GUSStation; - ], - before [; - Enter: - if (location==FROSTHAM_GUSStation) <>; - else <>; - ], - description [; - print "It's an odd metal gate that only comes up to about \ - your waist. Odder still is the fact that there's \ - no door on the gate, just two metal sides"; - if (location == FROSTHAM_GUSStation) - ". There's a thin slot on one of the sides."; - else "."; - ], - found_in FROSTHAM_GUSStation FROSTHAM_GUSPlatform, -; - - - -Object FG_Gate_slot "metal slot" FG_Gate - class GUS_Gate_Slot_Class - with description [; - if (location == FROSTHAM_GUSPlatform) - "You can't see any such thing."; - if (location == FROSTHAM_GUSStation) - "You see a rather small, thin slot that seems to be \ -almost cut into one of the metal sides of the gate."; - ], - before [; - if (location == FROSTHAM_GUSPlatform) - "You can't see any such thing."; - ], -; - - -Object AG_Gate "platform gate" - class GUS_Gate_Class - with initial [; - if (location==ARAGAIN_GUSStation) - "A metal gate bisects the fence to the southeast."; - "A metal gate bisects the fence to the northwest."; - ], - door_dir [; - if (location==ARAGAIN_GUSStation) - return se_to; - return nw_to; - ], - door_to [; - if (location==ARAGAIN_GUSStation) - return ARAGAIN_GUSPlatform; - return ARAGAIN_GUSStation; - ], - before [; - Enter: - if (location==FROSTHAM_GUSStation) <>; - else <>; - ], - description [; - print "It's an odd metal gate that only comes up to about \ - your waist. Odder still is the fact that there's \ - no door on the gate, just two metal sides"; - if (location == ARAGAIN_GUSStation) - ". There's a thin slot on one of the sides."; - else "."; - ], - found_in ARAGAIN_GUSStation ARAGAIN_GUSPlatform, -; - -Object AG_Gate_slot "metal slot" AG_Gate - class GUS_Gate_Slot_Class - with description [; - if (location == ARAGAIN_GUSPlatform) - "You can't see any such thing."; - if (location == ARAGAIN_GUSStation) - "You see a rather small, thin slot that seems to be \ -almost cut into one of the metal sides of the gate."; - ], - before [; - if (location == ARAGAIN_GUSPlatform) - "You can't see any such thing."; - ], -; - - -Object FublioG_Gate "platform gate" - class GUS_Gate_Class - with initial [; - if (location==FUBLIO_GUSStation) - "A metal gate bisects the fence to the southeast."; - "A metal gate bisects the fence to the northwest."; - ], - door_dir [; - if (location==FUBLIO_GUSStation) - return se_to; - return nw_to; - ], - door_to [; - if (location==FUBLIO_GUSStation) - return FUBLIO_GUSPlatform; - return FUBLIO_GUSStation; - ], - before [; - Enter: - if (location==FUBLIO_GUSStation) <>; - else <>; - ], - description [; - print "It's an odd metal gate that only comes up to about \ - your waist. Odder still is the fact that there's \ - no door on the gate, just two metal sides"; - if (location == FUBLIO_GUSStation) - ". There's a thin slot on one of the sides."; - else "."; - ], - found_in FUBLIO_GUSStation FUBLIO_GUSPlatform, -; - -Object FublioG_Gate_slot "metal slot" FublioG_Gate - class GUS_Gate_Slot_Class - with description [; - if (location == FUBLIO_GUSStation) - "You see a rather small, thin slot that seems to be \ - almost cut into one of the metal sides of the gate."; -!! See if this works instead... - "You can't see any such thing."; - ], - before [; - if (location == FUBLIO_GUSPlatform) - "You can't see any such thing."; - ], -; - -! (Orange gates (1)) -Object AntharG_Gate "platform gate" - class GUS_Gate_Class - with initial [; - if (location==ANTHAR_GUSStation) - "A metal gate bisects the fence to the south."; - "A metal gate bisects the fence to the north."; - ], - door_dir [; - if (location==ANTHAR_GUSStation) - return s_to; - return n_to; - ], - door_to [; - if (location==ANTHAR_GUSStation) - return ANTHAR_GUSPlatform; - return ANTHAR_GUSStation; - ], - before [; - Enter: - if (location==ANTHAR_GUSStation) <>; - else <>; - ], - description [; - print "It's an odd metal gate that only comes up to about \ - your waist. Odder still is the fact that there's \ - no door on the gate, just two metal sides"; - if (location == ANTHAR_GUSStation) - ". There's a thin slot on one of the sides."; - else "."; - ], - found_in ANTHAR_GUSStation ANTHAR_GUSPlatform, -; - -Object AntharG_Gate_slot "metal slot" AntharG_Gate - class GUS_Gate_Slot_Class - with description [; - if (location == ANTHAR_GUSStation) - "You see a rather small, thin slot that seems to be \ - almost cut into one of the metal sides of the gate."; - "You can't see any such thing."; - ], - before [; - if (location == ANTHAR_GUSPlatform) - "You can't see any such thing."; - ], -; - - -! (Green gates (3)) -Object BorpheeG_Gate "platform gate" - class GUS_Gate_Class - with initial [; - if (location==BORPHEE_GUSStation) - "A metal gate bisects the fence to the southwest."; - "A metal gate bisects the fence to the northeast."; - ], - door_dir [; - if (location==BORPHEE_GUSStation) - return sw_to; - return ne_to; - ], - door_to [; - if (location==BORPHEE_GUSStation) - return BORPHEE_GUSPlatform; - return BORPHEE_GUSStation; - ], - before [; - Enter: - if (location == BORPHEE_GUSStation) <>; - else <>; - ], - description [; - print "It's an odd metal gate that only comes up to about \ - your waist. Odder still is the fact that there's \ - no door on the gate, just two metal sides"; - if (location == BORPHEE_GUSStation) - ". There's a thin slot on one of the sides."; - else "."; - ], - found_in BORPHEE_GUSStation BORPHEE_GUSPlatform, -; - -Object BorpheeG_Gate_slot "metal slot" BorpheeG_Gate - class GUS_Gate_Slot_Class - with description [; - if (location == BORPHEE_GUSStation) - "You see a rather small, thin slot that seems to be \ - almost cut into one of the metal sides of the gate."; - "You can't see any such thing."; - ], - before [; - if (location == BORPHEE_GUSPlatform) - "You can't see any such thing."; - ], -; - -! (NOTE: Gurth is different, read: broken) -Object GurthG_Gate "platform gate" - class GUS_Gate_Class - with initial [; - if (location==GURTH_GUSStation) - "A metal gate bisects the fence to the southwest."; - "A metal gate bisects the fence to the northeast."; - ], - door_dir [; - if (location==GURTH_GUSStation) - return sw_to; - return ne_to; - ], - door_to [; - if (location==GURTH_GUSStation) - return GURTH_GUSPlatform; - return GURTH_GUSStation; - ], - before [; - Enter: if (location == GURTH_GUSStation) <>; - else <>; - ], - description [; - print "It's an odd metal gate that only comes up to about \ - your waist. Odder still is the fact that there's \ - no door on the gate, just two metal sides"; - if (location == GURTH_GUSStation) - ". There's a thin slot on one of the sides that looks \ - slightly dented."; - else "."; - ], - found_in GURTH_GUSStation GURTH_GUSPlatform, -; - -Object GurthG_Gate_slot "metal slot" GurthG_Gate - class GUS_Gate_Slot_Class - with name "dented", - description [; - if (location == GURTH_GUSStation) - "You see a rather small, thin slot that seems to be \ - almost cut into one of the metal sides of the gate. \ - It looks slightly dented."; - "You can't see any such thing."; - ], - before [; - if (location == GURTH_GUSPlatform) - "You can't see any such thing."; - Receive: - if (noun has is_coin) { - give self general; - remove noun; - "The coin slides into the slot, but you hear a strange click \ - almost immediately.^^\ - A subway nymph suddenly appears. She looks at the gate \ - disapprovingly. ~Broken again? I thought they \ - just fixed it. Well, fine.~ She seems rather annoyed. \ - ~We'll get someone to look at it, eventually. Bye!~ She \ - disappears."; - } - if (noun==wire) { - if (self hasnt general) - "You poke the wire in the slot for a bit, but nothing \ - happens."; - if (self has general) { - give self ~general; - Achieved(20); - give GurthG_Gate general; - "You poke around in the slot, and manage to free something! \ - There is a solid thunk-like noise."; - } - } - "It doesn't look like that's going to fit into the slot."; - ], -; - -Object MizniaG_Gate "platform gate" - class GUS_Gate_Class - with initial [; - if (location==MIZNIA_GUSStation) - "A metal gate bisects the fence to the southwest."; - "A metal gate bisects the fence to the northeast."; - ], - door_dir [; - if (location==MIZNIA_GUSStation) - return sw_to; - return ne_to; - ], - door_to [; - if (location==MIZNIA_GUSStation) - return MIZNIA_GUSPlatform; - return MIZNIA_GUSStation; - ], - before [; - Enter: if (location==MIZNIA_GUSStation) <>; - else <>; - ], - description [; - print "It's an odd metal gate that only comes up to about \ - your waist. Odder still is the fact that there's \ - no door on the gate, just two metal sides"; - if (location == MIZNIA_GUSStation) - ". There's a thin slot on one of the sides."; - else "."; - ], - found_in MIZNIA_GUSStation MIZNIA_GUSPlatform, -; - -Object MizniaG_Gate_slot "metal slot" MizniaG_Gate - class GUS_Gate_Slot_Class - with description [; - if (location == MIZNIA_GUSStation) - "You see a rather small, thin slot that seems to be \ - almost cut into one of the metal sides of the gate."; - "You can't see any such thing."; - ], - before [; - if (location==MIZNIA_GUSPlatform) - "You can't see any such thing."; - ], -; - - - -!Object FS_Platform_sign2 "laminated paper" FROSTHAM_GUSPlatform -! with name "paper" "laminated" "safety", -! initial "A small stiff-looking piece of paper is attached to the west wall.", -! description "The paper reads: ^^\ -! GREAT UNDERGROUND SUBWAY STATION RULES:^ -! 1) No going onto tracks.^ -! 2) No going into tunnels on foot unless authorized.", -! has static; - -Object train_tracks "train tracks" - with name "tracks" "train", - description "A pair of large metal train tracks.", - found_in FROSTHAM_GUSPlatform ARAGAIN_GUSPlatform FUBLIO_GUSPlatform - ARAGAIN_GUSPlatform2, - has scenery; - - -Object ARAGAIN_GUSPlatform "Aragain Train Platform" - with description [; - print "You are standing in a long underground \ - chamber. The east side of the room contains a \ - lowered set of what appear to be train tracks. \ - The tracks run north and south into dark tunnels. \ - Along one wall painted lettering \ - reads ~ARAGAIN STATION~. \ - A short walkway leads northwest, to a metal fence. \ - There is also a stairway down here"; - if (self has general) - ". In addition, there is a large train car sitting on the tracks \ - to the east."; - else "."; - ], - name "tunnel" "tunnels" "stairway", - nw_to AG_Gate, - s_to "A helpful subway worker says ~Hey pal, get outa there!~", - n_to "A helpful subway worker says ~Hey pal, get outa there!~", - e_to PURPLELINE_car, - d_to ARAGAIN_GUSPlatform2, - in_to PURPLELINE_car, - before [; - Go: -! if (noun == nw_obj) -! print "You saunter through the apparently open gate.^"; - if ((self hasnt general) && - (noun == e_obj or in_obj)) - "You'd fall onto the tracks if you went that way."; - ], - each_turn [ i ; - if (self hasnt general) { - i = random(10); - if (i==1 or 3 or 5) { - give self general; - PURPLELINE_loc = 5; - PURPLELINE_dir = 1; ! will be heading south - "^Suddenly, from the north, a train emerges from \ - the tunnel! It pulls to a screeching halt, the \ - doors open, and several people rush out and exit \ - the station."; - } - if (i==2 or 4 or 6) { - give self general; - PURPLELINE_loc = 5; - PURPLELINE_dir = 0; ! will be heading north - "^Suddenly, from the south, a train emerges from \ - the tunnel! It pulls to a screeching halt, the \ - doors open, and several people rush out and exit \ - the station."; - } - if (i==9) - "^You hear a distant rumbling noise from the north."; - if (i==10) - "^You hear a distant rumbling noise from the south."; - } - else { - if (self has general) { - if (PURPLELINE_loc == 6) { - give self ~general; - "^The train doors close, and the train rolls off."; - } - else { - PURPLELINE_loc = 6; - "^A few exit the train, and hurry out \ - of the station. You hear a voice from inside the \ - train say, ~Doors will be closing, please stand \ - clear.~"; - } - } - } - ], - has light; - -Object ARAGAIN_GUSPlatform2 "Aragain Train Platform (lower)" - with description [; - print "You are standing in a long underground \ - chamber. The south side of the room contains a \ - lowered set of what appear to be train tracks. \ - The tracks run west into a dark tunnel. \ - Along one wall painted lettering \ - reads ~ARAGAIN STATION~. \ - A set of stairs leads up out of the gloom"; - if (self has general) - ". There is a large train car sitting on the tracks \ - to the south."; - else "."; - ], - name "tunnel" "stairs", - w_to "A helpful subway worker says ~Hey pal, get outa there!~", - s_to ORANGELINE_car, - in_to ORANGELINE_car, - u_to ARAGAIN_GUSPlatform, - before [; - Go: - if ((self hasnt general) && - (noun == s_obj or in_obj)) - "You'd fall onto the tracks if you went that way."; - ], - each_turn [ i ; - if (self hasnt general) { - i = random(10); - if (i==1 or 3 or 5) { - give self general; - ORANGELINE_loc = 9; - ORANGELINE_dir = 0; ! will be heading west - "^Suddenly, from the west, a train emerges from \ - the tunnel! It pulls to a screeching halt, the \ - doors open, and several people rush out and up \ - the stairs."; - } - if (i==10) - "^You hear a distant rumbling noise from the west."; - } - else { - if (self has general) { - if (ORANGELINE_loc == 10) { - give self ~general; - "^The train doors close, and the train heads off \ - to the west."; - } - else { - ORANGELINE_loc = 10; - "^A few people exit the train, and hurry up the stairs. \ - You hear a voice from inside the \ - train say, ~Doors will be closing, please stand \ - clear.~"; - } - } - } - ], - has light; - - -Object FUBLIO_GUSPlatform "Fublio Valley Train Platform" - with description [; - print "You are standing in a long underground \ - chamber. The east side of the room contains a \ - lowered set of what appear to be train tracks. \ - The tracks run north into a dark tunnel. \ - Along one wall painted lettering \ - reads ~FUBLIO VALLEY STATION~. \ - A short walkway leads northwest, to a metal fence"; - if (self has general) - ". There is a large train car sitting on the tracks \ - to the east."; - else "."; - ], - name "tunnel", - nw_to FublioG_Gate, - n_to "A helpful subway worker says ~Hey pal, get outa there!~", - e_to PURPLELINE_car, - in_to PURPLELINE_car, - before [; - Go: -! if (noun == nw_obj) -! print "You saunter through the apparently open gate.^"; - if ((self hasnt general) && - (noun == e_obj or in_obj)) - "You'd fall onto the tracks if you went that way."; - ], - each_turn [ i ; - if (self hasnt general) { - i = random(10); - if (i==1 or 3 or 4) { - give self general; - PURPLELINE_loc = 10; - PURPLELINE_dir = 0; ! will be heading north - "^Suddenly, from the north, a train emerges from \ - the tunnel! It pulls to a screeching halt, the \ - doors open, and several people rush out and exit \ - the station."; - } - if (i==10) - "^You hear a distant rumbling noise from the north."; - } - else { - if (self has general) { - if (PURPLELINE_loc == 9) { - give self ~general; - "^The train doors close, and the train rolls off \ - to the north."; - } - else { - PURPLELINE_loc = 9; - "^A few people exit the train, and hurry out \ - of the station. You hear a voice from inside the \ - train say, ~Doors will be closing, please stand \ - clear.~"; - } - } - } - ], - has light; - - -! *** Orange line platforms - - -Object GURTH_GUSPlatform2 "Gurth City Train Platform (lower)" - with description [; - print "You are standing in a long underground \ - chamber. The south side of the room contains a \ - lowered set of what appear to be train tracks. \ - The tracks run east into a dark tunnel. \ - Along one wall painted lettering \ - reads ~GURTH CITY STATION~. \ - A set of stairs leads up out of the gloom"; - if (self has general) - ". There is a large train car sitting on the tracks \ - to the south."; - else "."; - ], - name "tunnel" "stairs", - e_to "A helpful subway worker says ~Hey pal, get outa there!~", - s_to ORANGELINE_car, - in_to ORANGELINE_car, - u_to GURTH_GUSPlatform, - before [; - Go: - if ((self hasnt general) && - (noun == s_obj or in_obj)) - "You'd fall onto the tracks if you went that way."; - ], - each_turn [ i ; - if (self hasnt general) { - i = random(10); - if (i==1 or 2 or 4) { - give self general; - ORANGELINE_loc = 1; - ORANGELINE_dir = 1; ! will be heading east - "^Suddenly, from the east, a train emerges from \ - the tunnel! It pulls to a screeching halt, the \ - doors open, and several people rush out and up \ - the stairs."; - } - if (i==10) - "^You hear a distant rumbling noise from the east."; - } - else { - if (self has general) { - if (ORANGELINE_loc == 2) { - give self ~general; - "^The train doors close, and the train heads off \ - to the east."; - } - else { - ORANGELINE_loc = 2; - "^A few people exit the train, and hurry up the stairs. \ - You hear a voice from inside the \ - train say, ~Doors will be closing, please stand \ - clear.~"; - } - } - } - ], - has light; - -Object ANTHAR_GUSPlatform "Greater Anthar Train Platform" - with description [; - print "You are standing in a long underground \ - chamber. The south side of the room contains a \ - lowered set of what appear to be train tracks. \ - The tracks run east and west into dark tunnels. \ - Along one wall painted lettering \ - reads ~ANTHAR STATION~. \ - A short walkway leads north, to a metal fence"; - if (self has general) - ". There is a large train car sitting on the tracks \ - to the south."; - else "."; - ], - name "tunnel" "tunnels" "walkway", - n_to AntharG_Gate, - e_to "A helpful subway worker says ~Hey pal, get outa there!~", - w_to "A helpful subway worker says ~Hey pal, get outa there!~", - s_to ORANGELINE_car, - in_to ORANGELINE_car, - before [; - Go: -! if (noun == n_obj) -! print "You saunter through the apparently open gate.^"; - if ((self hasnt general) && - (noun == s_obj or in_obj)) - "You'd fall onto the tracks if you went that way."; - ], - each_turn [ i ; - if (self hasnt general) { - i = random(10); - if (i==1 or 4 or 5) { - give self general; - ORANGELINE_loc = 5; - ORANGELINE_dir = 1; ! will be heading east - "^Suddenly, from the west, a train emerges from \ - the tunnel! It pulls to a screeching halt, the \ - doors open, and several people rush out and exit \ - the station."; - } - if (i==2 or 3 or 6) { - give self general; - ORANGELINE_loc = 5; - ORANGELINE_dir = 0; ! will be heading west - "^Suddenly, from the east, a train emerges from \ - the tunnel! It pulls to a screeching halt, the \ - doors open, and several people rush out and exit \ - the station."; - } - if (i==9) - "^You hear a distant rumbling noise from the east."; - if (i==10) - "^You hear a distant rumbling noise from the west."; - } - else { - if (self has general) { - if (ORANGELINE_loc == 6) { - give self ~general; - "^The train doors close, and the train rolls off."; - } - else { - ORANGELINE_loc = 6; - "^A few people exit the train, and hurry out \ - of the station. You hear a voice from inside the \ - train say, ~Doors will be closing, please stand \ - clear.~"; - } - } - } - ], - has light; - - -! *** Green line platforms - -Object BORPHEE_GUSPlatform "New Borphee Train Platform" - with description [; - print "You are standing in a long underground \ - chamber. The west side of the room contains a \ - lowered set of what appear to be train tracks. \ - The tracks run south into a dark tunnel. \ - Along one wall painted lettering \ - reads ~NEW BORPHEE STATION~. \ - A short walkway leads northeast, to a metal fence"; - if (self has general) - ". There is a large train car sitting on the tracks \ - to the west."; - else "."; - ], - name "tunnel" "walkway", - ne_to BorpheeG_Gate, - s_to "A helpful subway worker says ~Hey pal, get outa there!~", - w_to GREENLINE_car, - in_to GREENLINE_car, - before [; - Go: -! if (noun == ne_obj) -! print "You saunter through the apparently open gate.^"; - if ((self hasnt general) && - (noun == w_obj or in_obj)) - "You'd fall onto the tracks if you went that way."; - ], - each_turn [ i ; - if (self hasnt general) { - i = random(10); - if (i==1 or 2 or 3) { - give self general; - GREENLINE_loc = 1; - GREENLINE_dir = 1; ! will be heading south - "^Suddenly, from the south, a train emerges from \ - the tunnel! It pulls to a screeching halt, the \ - doors open, and several people rush out and exit \ - the station."; - } - if (i==10) - "^You hear a distant rumbling noise from the south."; - } - else { - if (self has general) { - if (GREENLINE_loc == 2) { - give self ~general; - "^The train doors close, and the train rolls off \ - to the south."; - } - else { - GREENLINE_loc = 2; - "^A few people exit the train, and hurry out \ - of the station. You hear a voice from inside the \ - train say, ~Doors will be closing, please stand \ - clear.~"; - } - } - } - ], - has light; - -Object MIZNIA_GUSPlatform "Miznia Train Platform" - with description [; - print "You are standing in a long underground \ - chamber. The west side of the room contains a \ - lowered set of what appear to be train tracks. \ - The tracks run north into a dark tunnel. \ - Along one wall painted lettering \ - reads ~MIZNIA STATION~. \ - A short walkway leads northeast, to a metal fence"; - if (self has general) - ". There is a large train car sitting on the tracks \ - to the west."; - else "."; - ], - name "tunnel" "walkway", - ne_to MizniaG_Gate, - n_to "A helpful subway worker says ~Hey pal, get outa there!~", - w_to GREENLINE_car, - in_to GREENLINE_car, - before [; - Go: -! if (noun == ne_obj) -! print "You saunter through the apparently open gate.^"; - if ((self hasnt general) && - (noun == w_obj or in_obj)) - "You'd fall onto the tracks if you went that way."; - ], - each_turn [ i ; - if (self hasnt general) { - i = random(10); - if (i==1 or 2 or 3) { - give self general; - GREENLINE_loc = 9; - GREENLINE_dir = 0; ! will be heading south - "^Suddenly, from the north, a train emerges from \ - the tunnel! It pulls to a screeching halt, the \ - doors open, and several people rush out and exit \ - the station."; - } - if (i==10) - "^You hear a distant rumbling noise from the north."; - } - else { - if (self has general) { - if (GREENLINE_loc == 10) { - give self ~general; - "^The train doors close, and the train rolls off \ - to the north."; - } - else { - GREENLINE_loc = 10; - "^A few people exit the train, and hurry out \ - of the station. You hear a voice from inside the \ - train say, ~Doors will be closing, please stand \ - clear.~"; - } - } - } - ], - has light; - -Object GURTH_GUSPlatform "Gurth City Train Platform" - with description [; - print "You are standing in a long underground \ - chamber. The west side of the room contains a \ - lowered set of what appear to be train tracks. \ - The tracks run north and south into dark tunnels. \ - Along one wall painted lettering \ - reads ~GURTH CITY STATION~. \ - A short walkway leads northeast, to a metal fence. \ - There is also a stairway down here"; - if (self has general) - ". There is a large train car sitting on the tracks \ - to the west."; - else "."; - ], - name "tunnel" "tunnels" "walkway" "stairway", - ne_to GurthG_Gate, - s_to "A helpful subway worker says ~Hey pal, get outa there!~", - n_to "A helpful subway worker says ~Hey pal, get outa there!~", - w_to GREENLINE_car, - d_to GURTH_GUSPlatform2, - in_to GREENLINE_car, - before [; - Go: -! if (noun == ne_obj) -! print "You saunter through the apparently open gate.^"; - if ((self hasnt general) && - (noun == w_obj or in_obj)) - "You'd fall onto the tracks if you went that way."; - ], - each_turn [ i ; - if (self hasnt general) { - i = random(10); - if (i==1 or 3) { - give self general; - GREENLINE_loc = 5; - GREENLINE_dir = 1; ! will be heading south - "^Suddenly, from the north, a train emerges from \ - the tunnel! It pulls to a screeching halt, the \ - doors open, and several people rush out and exit \ - the station."; - } - if (i==2 or 4) { - give self general; - GREENLINE_loc = 5; - GREENLINE_dir = 0; ! will be heading north - "^Suddenly, from the south, a train emerges from \ - the tunnel! It pulls to a screeching halt, the \ - doors open, and several people rush out and exit \ - the station."; - } - if (i==9) - "^You hear a distant rumbling noise from the north."; - if (i==10) - "^You hear a distant rumbling noise from the south."; - } - else { - if (self has general) { - if (GREENLINE_loc == 6) { - give self ~general; - "^The train doors close, and the train rolls off."; - } - else { - GREENLINE_loc = 6; - "^A few people exit the train, and hurry out \ - of the station. You hear a voice from inside the \ - train say, ~Doors will be closing, please stand \ - clear.~"; - } - } - } - ], - has light; - -! ************************** -! TRAINS -! Some notes: -! While it may seem more logical to implement the trains with -! an 'enterable' property, I decided to implement them as -! 'rooms' instead. Mainly, I did this because: -! 1) I wanted total control of the "movement" of the train. -! 2) I wanted to fill the cars with various people/things. -! 3) I wanted seats on the train :) -! Again, this is all probably possible with 'vehicles', I -! just saw things slightly differently. -! Be warned, the logic in moving the train is probably one -! of the more unfathomable things I've ever coded. -! ************************** - -! *** The purple line (Eastlands) - -Object PURPLELINE_car "Subway car" - with description "You are in an underground train car. Various \ - people fill the train, some in uncomfortable-looking seats.", - name "car" "people", - w_to FROSTHAM_GUSPlatform, ! we adjust this, see below - out_to FROSTHAM_GUSPlatform, - after [; - Go: - if (noun == e_obj or in_obj) { - ! determine boarding location, direction train was - ! traveling - give self general; ! we're off and moving... - print "^You enter the train car. The doors slam shut behind you.^"; - if (PURPLELINE_loc == 1 or 2) { - ! Frostham, south - give FROSTHAM_GUSPlatform ~general; - PURPLELINE_loc = 3; ! leaving - } - if (PURPLELINE_loc == 5 or 6) { - ! Aragain - ! give ARAGAIN_GUSPlatform ~general; - if (PURPLELINE_dir == 1) { - ! South - PURPLELINE_loc = 7; - } - else { - ! North - PURPLELINE_loc = 4; - } - } - if (PURPLELINE_loc == 9 or 10) { - ! Fublio, north - ! give FUBLIO_GUSPlatform ~general; - PURPLELINE_loc = 8; - } - } - ], - before [; - Go: - if (noun == w_obj or out_obj) { - if (self has general) - "The train is moving right now. Better wait til \ - it stops to get off."; - if (thug in self) - "As you try to get off, the thug gets in your way. \ - ~Going somewhere, Padre?~."; - } - ], - each_turn [; - ! check location of train, print appropriate msg, - ! and increment location of train, given direction - if (PURPLELINE_loc == 1) { - ! reached Frostham, dir = S, not moving - give self ~general; - give FROSTHAM_GUSPlatform general; - PURPLELINE_dir = 1; - PURPLELINE_loc = 2; - PURPLELINE_car.w_to = FROSTHAM_GUSPlatform; - PURPLELINE_car.out_to = FROSTHAM_GUSPlatform; - "^The train suddenly lurches to a stop! A voice from \ - somewhere overhead says ~Frostham station, watch your \ - step please.~"; - } - if (PURPLELINE_loc == 2) { - ! still in Frostham, not moving - PURPLELINE_loc = 3; - "^A voice overhead says ~Doors will be closing, please \ - stand clear.~"; - } - if (PURPLELINE_loc == 3) { - if (PURPLELINE_dir == 1) { - ! moving away from Frostham - give self general; - give FROSTHAM_GUSPlatform ~general; - PURPLELINE_loc = 4; - "^The train starts to move, quickly exiting the station \ - going south."; - } - if (PURPLELINE_dir == 0) { - ! moving towards Frostham - PURPLELINE_loc = 1; ! We will 'arrive' in Frostham next - "^The train rumbles as it moves."; - } - } - if (PURPLELINE_loc == 4) { - if (PURPLELINE_dir == 0) { - ! We're leaving Aragain - PURPLELINE_loc = 3; - give self general; - give ARAGAIN_GUSPlatform ~general; - "^The train starts to move, quickly exiting the station \ - going north."; - } - if (PURPLELINE_dir == 1) { - PURPLELINE_loc = 5; - "^The train rumbles as it moves."; - } - } - if (PURPLELINE_loc == 5) { - ! reached Aragain, stop the train - give self ~general; - give ARAGAIN_GUSPlatform general; - PURPLELINE_loc = 6; ! we'll be stopping for 1 turn - PURPLELINE_car.w_to = ARAGAIN_GUSPlatform; - PURPLELINE_car.out_to = ARAGAIN_GUSPlatform; - "^The train suddenly lurches to a stop! A voice from \ - somewhere overhead says ~Aragain station, watch your \ - step please.~"; - } - if (PURPLELINE_loc == 6) { - ! about to leave Aragain station - if (PURPLELINE_dir == 0) - PURPLELINE_loc = 4; - else - PURPLELINE_loc = 7; - "^A voice overhead says ~Doors will be closing, please \ - stand clear.~"; - } - if (PURPLELINE_loc == 7) { - if (PURPLELINE_dir == 1) { - ! We're leaving Aragain - PURPLELINE_loc = 8; - give self general; - give ARAGAIN_GUSPlatform ~general; - "^The train starts to move, quickly exiting the station \ - going south."; - } - if (PURPLELINE_dir == 0) { - PURPLELINE_loc = 5; ! we will arrive in Aragain shortly... - "^The train rumbles as it moves."; - } - } - if (PURPLELINE_loc == 8) { - if (PURPLELINE_dir == 0) { - ! we're leaving Fublio - PURPLELINE_loc = 7; - give self general; - give FUBLIO_GUSPlatform ~general; - "^The train starts to move, quickly exiting the station \ - going north."; - } - if (PURPLELINE_dir == 1) { - PURPLELINE_loc = 10; ! will arrive in Fublio (BACKWARDS!!) - "^The train rumbles as it moves."; - } - } - if (PURPLELINE_loc == 9) { - ! still waiting in Fublio - PURPLELINE_loc = 8; - "^A voice overhead says ~Doors will be closing, please \ - stand clear.~"; - } - if (PURPLELINE_loc == 10) { - ! arriving in Fublio - PURPLELINE_loc = 9; - PURPLELINE_dir = 0; ! north - give self ~general; - give FUBLIO_GUSPlatform general; - PURPLELINE_car.w_to = FUBLIO_GUSPlatform; - PURPLELINE_car.out_to = FUBLIO_GUSPlatform; - "^The train suddenly lurches to a stop! A voice from \ - somewhere overhead says ~Fublio station, watch your \ - step please.~"; - } - ], - has light; - -Class Train_Car_Seat_Class - with name "seat" "seats", - description "There seem to be a few seats that haven't been taken.", - before [; - Enter: - if (random(10) < 3) - "As you attempt to grab an open seat, someone rudely \ - beats you to it."; - ], -has scenery enterable; - - -Object PURPLELINE_car_seats "subway seat" PURPLELINE_car - class Train_Car_Seat_Class - with before [; - Search: - if (self hasnt general) { - give self general; - move c9 to player; - "Good fortune is your friend! You notice a \ -forgotten coin stuck in a seat crack, and fend off two \ -passengers to grab it."; - } - ], -; - - -! *** ORANGE LINE CAR (Gurth to Aragain) - - -Object ORANGELINE_car "Subway car" - with description "You are in an underground train car. Various \ - people fill the train, some in uncomfortable-looking seats.", - name "car" "people", - n_to ANTHAR_GUSPlatform, ! we adjust this, see below - out_to ANTHAR_GUSPlatform, - after [; - Go: - if (noun == s_obj or in_obj) { - ! determine boarding location, direction train was - ! traveling - give self general; ! we're off and moving... - print "^You squeeze onto the train car. The doors close behind you.^"; - if (ORANGELINE_loc == 1 or 2) { - ! Gurth, east - give GURTH_GUSPlatform2 ~general; - ORANGELINE_loc = 3; ! leaving - } - if (ORANGELINE_loc == 5 or 6) { - ! Anthar - give ANTHAR_GUSPlatform ~general; - if (ORANGELINE_dir == 1) { - ! east - ORANGELINE_loc = 7; - } - else { - ! west - ORANGELINE_loc = 4; - } - } - if (ORANGELINE_loc == 9 or 10) { - ! Aragain, west - give ARAGAIN_GUSPlatform2 ~general; - ORANGELINE_loc = 8; - } - } - ], - before [; - Go: - if (noun == n_obj or out_obj) { - if (self has general) - "The train is moving right now. Better wait til \ - it stops to get off."; - } - ], - each_turn [; - ! check location of train, print appropriate msg, - ! and increment location of train, given direction - if (ORANGELINE_loc == 1) { - ! reached Gurth, dir = S, not moving - give self ~general; - give GURTH_GUSPlatform2 general; - ORANGELINE_dir = 1; - ORANGELINE_loc = 2; - ORANGELINE_car.n_to = GURTH_GUSPlatform2; - ORANGELINE_car.out_to = GURTH_GUSPlatform2; - "^The train suddenly lurches to a stop! A voice from \ - somewhere overhead says ~Gurth City station, watch your \ - step please.~"; - } - if (ORANGELINE_loc == 2) { - ! still in Gurth, not moving - ORANGELINE_loc = 3; - "^A voice overhead says ~Doors will be closing, please \ - stand clear.~"; - } - if (ORANGELINE_loc == 3) { - if (ORANGELINE_dir == 1) { - ! moving away from Gurth - give self general; - give GURTH_GUSPlatform2 ~general; - ORANGELINE_loc = 4; - "^The train starts to move, quickly exiting the station \ - going east."; - } - if (ORANGELINE_dir == 0) { - ! moving towards Gurth - ORANGELINE_loc = 1; ! We will 'arrive' in Gurth next - "^The train rumbles as it moves."; - } - } - if (ORANGELINE_loc == 4) { - if (ORANGELINE_dir == 0) { - ! We're leaving Anthar - ORANGELINE_loc = 3; - give self general; - give ANTHAR_GUSPlatform ~general; - "^The train starts to move, quickly exiting the station \ - going west."; - } - if (ORANGELINE_dir == 1) { - ORANGELINE_loc = 5; - "^The train rumbles as it moves."; - } - } - if (ORANGELINE_loc == 5) { - ! reached Anthar, stop the train - give self ~general; - give ANTHAR_GUSPlatform general; - ORANGELINE_loc = 6; ! we'll be stopping for 1 turn - ORANGELINE_car.n_to = ANTHAR_GUSPlatform; - ORANGELINE_car.out_to = ANTHAR_GUSPlatform; - "^The train suddenly lurches to a stop! A voice from \ - somewhere overhead says ~Greater Anthar station, watch your \ - step please.~"; - } - if (ORANGELINE_loc == 6) { - ! about to leave Anthar station - if (ORANGELINE_dir == 0) - ORANGELINE_loc = 4; - else - ORANGELINE_loc = 7; - "^A voice overhead says ~Doors will be closing, please \ - stand clear.~"; - } - if (ORANGELINE_loc == 7) { - if (ORANGELINE_dir == 1) { - ! We're leaving Anthar - ORANGELINE_loc = 8; - give self general; - give ANTHAR_GUSPlatform ~general; - "^The train starts to move, quickly exiting the station \ - going east."; - } - if (ORANGELINE_dir == 0) { - ORANGELINE_loc = 5; ! we will arrive in anthar shortly... - "^The train rumbles as it moves."; - } - } - if (ORANGELINE_loc == 8) { - if (ORANGELINE_dir == 0) { - ! we're leaving Aragain - ORANGELINE_loc = 7; - give self general; - give ARAGAIN_GUSPlatform2 ~general; - "^The train starts to move, quickly exiting the station \ - going west."; - } - if (ORANGELINE_dir == 1) { - ORANGELINE_loc = 9; ! will arrive in Aragain - "^The train rumbles as it moves."; - } - } - if (ORANGELINE_loc == 10) { - ! still waiting in Aragain - ORANGELINE_loc = 8; - "^A voice overhead says ~Doors will be closing, please \ - stand clear.~"; - } - if (ORANGELINE_loc == 9) { - ! arriving in Aragain - ORANGELINE_loc = 10; - ORANGELINE_dir = 0; ! west - give self ~general; - give ARAGAIN_GUSPlatform2 general; - ORANGELINE_car.n_to = ARAGAIN_GUSPlatform2; - ORANGELINE_car.out_to = ARAGAIN_GUSPlatform2; - "^The train suddenly lurches to a stop! A voice from \ - somewhere overhead says ~Aragain station, watch your \ - step please.~"; - } - ], - has light; - -Object ORANGELINE_car_seats "subway seat" ORANGELINE_car - class Train_Car_Seat_Class - with before [; - Search: - if (self hasnt general) { - give self general; - move c10 to player; - "Good fortune is your friend! You notice a \ -forgotten coin stuck in a seat crack, and fend off two \ -passengers to grab it."; - } - ], -; - - -! *** GREEN LINE (Borphee to Miznia) - -Object GREENLINE_car "Subway car" - with description "You are in an underground train car. Various \ - people fill the train, some in uncomfortable-looking seats.", - name "car" "people", - e_to BORPHEE_GUSPlatform, ! we adjust this, see below - out_to BORPHEE_GUSPlatform, - after [; - Go: - if (noun == w_obj or in_obj) { - ! determine boarding location, direction train was - ! traveling - give self general; ! we're off and moving - print "^You shove your way onto train car. The doors close behind you.^"; - if (GREENLINE_loc == 1 or 2) { - ! Borphee, south - give BORPHEE_GUSPlatform ~general; - GREENLINE_loc = 3; ! leaving - } - if (GREENLINE_loc == 5 or 6) { - ! Gurth - give GURTH_GUSPlatform ~general; - if (GREENLINE_dir == 1) { - ! South - GREENLINE_loc = 7; - } - else { - ! North - GREENLINE_loc = 4; - } - } - if (GREENLINE_loc == 9 or 10) { - ! Miznia, north - give MIZNIA_GUSPlatform ~general; - GREENLINE_loc = 8; - } - } - ], - before [; - Go: - if (noun == e_obj or out_obj) { - if (self has general) - "The train is moving right now. Better wait til \ - it stops to get off."; - if (yupple in self) - "As you try to get off, the yupple jumps up and gets in your \ - way. ~Wait, wait, we have so much to talk about!~."; - } - ], - each_turn [; - ! check location of train, print appropriate msg, - ! and increment location of train, given direction - if (GREENLINE_loc == 1) { - ! reached Borphee, dir = S, not moving - give self ~general; - give BORPHEE_GUSPlatform general; - GREENLINE_dir = 1; - GREENLINE_loc = 2; - GREENLINE_car.e_to = BORPHEE_GUSPlatform; - GREENLINE_car.out_to = BORPHEE_GUSPlatform; - "^The train suddenly lurches to a stop! A voice from \ - somewhere overhead says ~New Borphee station, watch your \ - step please.~"; - } - if (GREENLINE_loc == 2) { - ! still in Borphee, not moving - GREENLINE_loc = 3; - "^A voice overhead says ~Doors will be closing, please \ - stand clear.~"; - } - if (GREENLINE_loc == 3) { - if (GREENLINE_dir == 1) { - ! moving away from Borphee - give self general; - give BORPHEE_GUSPlatform ~general; - GREENLINE_loc = 4; - "^The train starts to move, quickly exiting the station \ - going south."; - } - if (GREENLINE_dir == 0) { - ! moving towards BORPHEE - GREENLINE_loc = 1; - "^The train rumbles as it moves."; - } - } - if (GREENLINE_loc == 4) { - if (GREENLINE_dir == 0) { - ! We're leaving gurth - GREENLINE_loc = 3; - give self general; - give GURTH_GUSPlatform ~general; - "^The train starts to move, quickly exiting the station \ - going north."; - } - if (GREENLINE_dir == 1) { - GREENLINE_loc = 5; - "^The train rumbles as it moves."; - } - } - if (GREENLINE_loc == 5) { - ! reached Gurth, stop the train - give self ~general; - give GURTH_GUSPlatform general; - GREENLINE_loc = 6; ! we'll be stopping for 1 turn - GREENLINE_car.e_to = GURTH_GUSPlatform; - GREENLINE_car.out_to = GURTH_GUSPlatform; - "^The train suddenly lurches to a stop! A voice from \ - somewhere overhead says ~Gurth City station, watch your \ - step please.~"; - } - if (GREENLINE_loc == 6) { - ! about to leave gurth station - if (GREENLINE_dir == 0) - GREENLINE_loc = 4; - else - GREENLINE_loc = 7; - "^A voice overhead says ~Doors will be closing, please \ - stand clear.~"; - } - if (GREENLINE_loc == 7) { - if (GREENLINE_dir == 1) { - ! We're leaving gurth - GREENLINE_loc = 8; - give self general; - give GURTH_GUSPlatform ~general; - "^The train starts to move, quickly exiting the station \ - going south."; - } - if (GREENLINE_dir == 0) { - GREENLINE_loc = 5; ! we will arrive in gurth shortly... - "^The train rumbles as it moves."; - } - } - if (GREENLINE_loc == 8) { - if (GREENLINE_dir == 0) { - ! we're leaving Miznia - GREENLINE_loc = 7; - give self general; - give MIZNIA_GUSPlatform ~general; - "^The train starts to move, quickly exiting the station \ - going north."; - } - if (GREENLINE_dir == 1) { - GREENLINE_loc = 9; - "^The train rumbles as it moves."; - } - } - if (GREENLINE_loc == 10) { - ! still waiting in Miznia - GREENLINE_loc = 8; - "^A voice overhead says ~Doors will be closing, please \ - stand clear.~"; - } - if (GREENLINE_loc == 9) { - ! arriving in Miznia - GREENLINE_loc = 10; - GREENLINE_dir = 0; ! north - give self ~general; - give MIZNIA_GUSPlatform general; - GREENLINE_car.e_to = MIZNIA_GUSPlatform; - GREENLINE_car.out_to = MIZNIA_GUSPlatform; - "^The train suddenly lurches to a stop! A voice from \ - somewhere overhead says ~Miznia station, watch your \ - step please.~"; - } - ], - has light; - -Object GREENLINE_car_seats "subway seat" GREENLINE_car - class Train_Car_Seat_Class - with before [; - Search: - if (self hasnt general) { - give self general; - move c11 to player; - "Good fortune is your friend! You notice a \ -forgotten coin stuck in a seat crack, and fend off two \ -passengers to grab it."; - } - ], -; - - -! *** A fake scenery item, to describe the subway cars from outside *** -Object subway_car_fake "subway car" - with name "car" "train", - description [; - print "It's a rather large, sleek-looking train car, oddly colored "; - if (((location==FROSTHAM_GUSPlatform) && (FROSTHAM_GUSPlatform has general)) || - ((location==ARAGAIN_GUSPlatform) && (ARAGAIN_GUSPlatform has general)) || - ((location==FUBLIO_GUSPlatform) && (FUBLIO_GUSPlatform has general))) - "purple."; - if (((location==ANTHAR_GUSPlatform) && (ANTHAR_GUSPlatform has general)) || - ((location==ARAGAIN_GUSPlatform2) && (ARAGAIN_GUSPlatform2 has general)) || - ((location==GURTH_GUSPlatform2) && (GURTH_GUSPlatform2 has general))) - "orange."; - if (((location==BORPHEE_GUSPlatform) && (BORPHEE_GUSPlatform has general)) || - ((location==GURTH_GUSPlatform) && (GURTH_GUSPlatform has general)) || - ((location==MIZNIA_GUSPlatform) && (MIZNIA_GUSPlatform has general))) - "green."; - "You can't see any such thing."; - ], - found_in FROSTHAM_GUSPlatform ARAGAIN_GUSPlatform FUBLIO_GUSPlatform - ANTHAR_GUSPlatform ARAGAIN_GUSPlatform2 GURTH_GUSPlatform2 - BORPHEE_GUSPlatform GURTH_GUSPlatform MIZNIA_GUSPlatform, - before [; - Enter: - "A subway nymph suddenly appears. ~Remember passengers, to \ - board the subway cars, you just have to go 'in', or in the \ - appropriate direction of the car. Bye!~"; - ], - has scenery; - -Object metal_fence "metal fence" - with name "fence" "barricade", - description "It looks like a smooth metal fence.", - before [; - Climb, JumpOver: - "A subway worker yells ~Hey pal, no fare-jumpers!"; - ], - found_in FROSTHAM_GUSPlatform ARAGAIN_GUSPlatform FUBLIO_GUSPlatform - FROSTHAM_GUSStation ARAGAIN_GUSStation FUBLIO_GUSStation - ANTHAR_GUSPlatform BORPHEE_GUSPlatform GURTH_GUSPlatform MIZNIA_GUSPlatform - ANTHAR_GUSStation BORPHEE_GUSStation GURTH_GUSStation MIZNIA_GUSStation, - has scenery; - - -! ************************** -! People/denizens/creatures -! ************************** - -! Thug, on PURPLE LINE -Object thug "sinister-looking thug" PURPLELINE_car - with name "thug" "hoodlum" "Davey", - description "A thug, clearly. Some scrapper with an attitude, \ - and the desire to use it.", - each_turn [ i ; - if (self hasnt general) { - give self general; - "^The sinister-looking thug notices you from the back \ - of the car, and approaches. ~Well, well, well,~ he \ - says, ~what do we have here?~."; - } - i = random(4); - if (i==1) - "^The thug pokes you in the ribs."; - if (i==2) - "^The thug snarls at you. ~Hey, I'm talking to you, \ - Preacher-man.~"; - if (i==3) - "^The thug tries to act friendly, and fails."; - if (i==4) - "^The thug scowls. ~You gonna tell me the error of \ - my ways, Padre?~"; - ], - life [; - Attack: - "As you move to show the rake a lesson, you notice \ - several more thugs in the background, eyeing your every \ - move. The thug smiles as you back-off, cautiously."; - default: "The thug is too busy being sinister."; - ], - before [; - Cast: - if (the_spell_was == espnis_spell) { - remove thug; - "You begin to extol the virtues of bedtime prayers, \ - and the thug starts to yawn. Soon, his eyes blink \ - slowly, and before long, he nods off to sleep! Two \ - subway police officers, hiding until now, get up the \ - nerve to capture the snoring thug, and drag him \ - off, disappearing into the throng of people."; - } - if (the_spell_was == foblub_spell) { - "You give the thug a timely sermon on the \ -folly of crime in a moral society. He seems momentarily \ -fascinated. Too bad he wasn't actually sitting in anything."; - } - ], - has animate; - -! Annoying Yupple, on GREEN LINE (kinda a cross between a yuppie and a yipple) -Object yupple "annoying yupple" GREENLINE_car - with name "yupple" "annoying", - description "A young yupple, immaculately dressed in a pinstripe \ - three-piece suit and tie.", - article "an", - each_turn [ i ; - if (self hasnt general) { - give self general; - "^The annoying-looking yupple notices you from the back \ - of the car, and approaches. ~A priest,~ he \ - says, ~Just the person I was looking for.~ He \ - squeezes into a seat near you."; - } - i = random(4); - if (i==1) - "^The yupple talks unceasingly about rainfall in some \ - place called ~the Amazon basin~."; - if (i==2) - "^The yupple smiles brightly. ~There's so much I have to \ - talk about!~"; - if (i==3) - "^The yupple drones on about the science behind large \ - corporate takeovers."; - if (i==4) - "^The yupple laughs -- a sound somewhat like a snoring \ - bloodworm. ~So the guy says, 'I thought you meant my _wife_.' \ - Get it? Wife?~"; - ], - life [; - Attack: - "Much as you'd like to, that's just something the \ - Order would probably frown upon."; - ], - before [; - Cast: - if (the_spell_was == espnis_spell) { - "You give a sermon on the dangers of \ -improper bathtub caulking, but the yupple seems quite \ -fascinated. ~That reminds me of...~ You cringe."; - } - if (the_spell_was == foblub_spell) { - remove self; - "You draw a stunning parallel between corporate \ -morality and monarchy ruling. The yupple's jaw drops. ~I've got \ -to tell my boss that,~ he says, and tries to leave his seat, \ -but finds himself stuck fast. Several passengers nearby \ -take the opportunity to remove the yupple (seat included) to \ -a different part of the train."; - } - ], - has animate; - - -! ************************** -! misc objects -! ************************** - -Object c9 "coin" class coin_class; -Object c10 "coin" class coin_class; -Object c11 "coin" class coin_class; - -! (Some common objects associated with GUS) -Object GUS_sign "Sign" - with name "sign" "circular" "pole" "GUS", - initial "Standing on a tall pole next to the stairs is \ - a circular sign.", - description "The sign reads ~GUS~, and has an arrow \ - pointing down.", - found_in FROSTHAM_GUSStop ARAGAIN_GUSStop ANTHAR_GUSStop - FUBLIO_GUSStop BORPHEE_GUSStop MIZNIA_GUSStop - GURTH_GUSStop, - has static; - - -Object GUS_brochure "subway brochure" FROSTHAM_Governer1 - with name "brochure" "subway" "GUS", - description "\ - ~The Great Underground Subway~^^ - Adventurers who really need to get where they're going \ - in a hurry are going to love GUS! The new underground \ - high-speed rail system can be your personal ride to the \ - major travel points in Quendor, for just one mere zorkmid! \ - For Eastland travel to Frostham, Aragain and Fublio Valley, \ - the Purple line is at your service! For Westland travel \ - to New Borphee, Gurth City and Miznia, just jump on board \ - the Green line! And for you folks who need to get across \ - the Great Sea in a hurry, don't forget the Orange line, \ - stopping off at Aragain, Anthar and Gurth City! Remember, \ - there's no costs for transferring between lines either. \ - So don't delay, take the GUS today!", - ! weight 5, - size 10, -; - -Object newspaper "newspaper" PURPLELINE_car - with name "newspaper" "paper", - initial "There's a discarded newspaper in a seat nearby.", - description "A copy of ~The Fublio Tribune~, with \ - news, sports and feature sections to read about.", - before - [ w1; Consult: - if (consult_words > 1) - "Try reading about 'news', 'sports' or 'features'."; - wn = consult_from; w1 = NextWord(); - switch (w1) { - 'news', 'headline', 'headlines': - "The news section has three major stories. \ -The headliner is the continued failure to resolve peace in the \ -Kobold war in southern Egreth. Recently, various troops have \ -been cut-off from the main camps by clever kobold raiding groups. \ -^^A second story details the shocking death of a GUE Tech student \ -found in the subway tunnels in Gurth City Station, the apparent \ -victim of a GUS train. ~Don't know how he got in there.~ a \ -subway worker is quoted as saying.^^\ -Finally, a sad local news story about a nice couple in Fublio \ -valley who recently were victims of the kidnaping of their son. No \ -leads as of yet."; - 'sports': - "Apparently, the golem brothers at Flathead \ -Stadium have amassed an amazing 322-0 win streak."; - 'features', 'feature': - "The paper points out that culture seekers \ -should check out the newly discovered Leonardo Flathead \ -painting on exhibit at the Royal Museum."; - 'ads', 'classified': - "~FOR SALE: A new IF game -- 'SPIRITWRAK'. \ - Price: $0.00~"; - 'comics', 'funnies': - "No comics section. Bummer."; - default: "You can't find anything in the paper about that."; - } - ], - ! weight 15, - size 15, -; - -! ************************** -! spells & scrolls -! ************************** diff --git a/src/anthar.inf b/src/anthar.inf new file mode 100644 index 0000000..564deca --- /dev/null +++ b/src/anthar.inf @@ -0,0 +1,2034 @@ + +! **************************************************************** +! ANTHAR.INF +! -- Add-on for SPIRITWRAK +! (Do not use alone!) +! **************************************************************** + +Object ANTHAR_GUSStop "Entrance to Greater Anthar" + with description "You're just west of Greater Anthar on the \ +island nation of Antharia. The bright sunlight \ +seems to make the city streets east of here glitter. \ +A stairway leads down.", + name "sunlight" "streets" "glitter" "stairway", + d_to ANTHAR_GUSStation, + e_to ANTHAR_West, + has light; + +Object ANTHAR_West "Anthar West" + with description "You are standing in a busy section of \ +West Greater Anthar City. The city seems to thin \ +out to the west. A roadway heads east, \ +the ever-popular Flathead \ +Stadium lies to the northeast, and a pub lies to the \ +south.", + name "roadway" "stadium" "pub", + w_to ANTHAR_GUSStop, + e_to ANTHAR_East, + s_to Delbins, + in_to Delbins, + ne_to Stadium_entrance, + cant_go "You walk around the area, take in the local scene, and \ + find yourself back here.", + before [; + Smell: "You can smell scents of local cooking coming \ + from the south."; + ], + has light; + +Object ANTHAR_East "Anthar East" + with description "You are standing in a busy section of \ +East Greater Anthar City. The city continues to \ +the west. There is a large odd structure to the \ +east, made mostly of glass. The ever-popular Flathead \ +Stadium lies to the northwest. A short walk down \ +to a waterfront area is to the south.", + name "structure" "glass" "stadium" "waterfront", + w_to ANTHAR_West, + e_to Conservatory_entrance, + s_to ANTHAR_Waterfront, + nw_to Stadium_entrance, + cant_go "You walk around the area, take in the local scene, and \ + find yourself back here.", + before [; + Smell: "You smell rather nice floral scents coming \ + from the east."; + ], + has light; + + +Object ANTHAR_Waterfront "Swank Waterfront" + with description "A pleasant waterfront walk is your current \ +location. You can see the Great Sea stretching out \ +before you to the south, a breath-taking sight. \ +A rail runs along the south end, preventing \ +an untimely fall into the rock shore below. The \ +city is back to the north.", + name "waterfront" "sea" "great" "railing" "rail" "rock" "shore", + n_to ANTHAR_East, + has light; + +Object telescope "viewing telescope" ANTHAR_Waterfront + with name "telescope" "viewing" "scope", + capacity 1, + when_closed "There's a viewing telescope here, attached to the railing.", + when_open [ x ; + print "There's a viewing telescope here, attached to the \ +railing. One of the lenses seems loose"; + if (children(self) == 0) "."; + else { + print ". Inside you see:^"; + x = FULLINV_BIT + INDENT_BIT + NEWLINE_BIT + RECURSE_BIT; + WriteListFrom (child(telescope), x, 1); rtrue; + } + ], + description "A nice tourist toy. Perfect for getting a good view.", + before [; + Open: print "You pry loose a lens. "; + Close: print "You push the lens back in place. "; + Search: + if (self hasnt open) { + print "You take a peak through the telescope"; + if (children(self) ~= 0) + " but oddly, there's something blocking your \ + view."; + else { + if (random(40)==1) + " and see a ship in the distance! Wait, perhaps not. \ +It's gone."; + " and see a nice expanse of the Great Sea."; + } + } + ], + size 10, + has static container openable; + +! (Conservatory gardens) + +Object Conservatory_entrance "Conservatory Entrance" + with description "You stand before the entrance to a large public \ +conservatory. You can enter the greenhouses to the northeast \ +and southeast, or walk back to Anthar to the \ +west.", + name "greenhouse" "greenhouses", + w_to ANTHAR_East, + ne_to Con_Desert_garden, + se_to Con_Flower_garden, + before [; + Smell: "You can smell floral scents from the southeast."; + ], + has light; + +Object Con_Desert_garden "Desert Garden" + with description "A nicely arranged collection of desert plants \ +is here in the ~Desert Garden~. Bright sunlight \ +and a sandy ground enhance the overall effect. \ +The conservatory entrance is to the southwest, or \ +more gardens lie to the south and east.", + name "sunlight" "plants" "sand" "gardens", + sw_to Conservatory_entrance, + e_to Con_Forest_garden, + s_to Con_Decor_garden, + has light; + + +Object Con_Flower_garden "Flower Garden" + with description "A rather lovely flower garden lies before you. \ +The multi-colored flowers are turning the air into \ +perfume. The conservatory entrance is northwest, \ +or more greenhouse gardens lie to the north and \ +east. A tiny trail leads south past the flower \ +beds.", + name "perfume" "entrance" "trail" "greenhouse", + nw_to Conservatory_entrance, + e_to Con_Jungle_garden, + n_to Con_Decor_garden, + s_to Con_storehouse, + before [; + Smell: "The bouquet of flowers is quite intoxicating."; + ], + has light; + +Nearby flowers "flowers" + with name "flowers" "flower" "garden", + description "A lovely assortment of flowers.", + before [; + Take: "Don't pick the flowers."; + Cast: + if (the_spell_was == throck_spell) + "Suddenly, a few more flowers spring out of the \ + ground!"; + ], + has scenery; + +Object Con_storehouse "Gardener's Storehouse" + with description "This must be a storehouse for the conservatory \ +gardeners. There are soil stains and plant debris all over. \ +The only exit is north.", + name "soil" "stains" "debris" "plant", + n_to Con_Flower_garden, + has light; + +Nearby toolshed "toolshed" + with name "toolshed" "shed", + description "A plain toolshed.", + with_key shed_key, + capacity 10, + size 20, + when_closed "A toolshed stands closed against the wall.", + when_open [ x; + print "The toolshed is open. "; + x = children(self); + if (x == 0) "It is empty."; + print "Inside "; + if (x == 1) print "is: "; else print "are: ^"; + x = FULLINV_BIT + INDENT_BIT + NEWLINE_BIT + RECURSE_BIT; + WriteListFrom (child(self), x, 1); + rtrue; + ], + has static container openable lockable locked; + +! (contents of shed) +Object gardeners_cap "cap" toolshed + with name "cap", + description "A cap with an odd green emblem stitched on \ +the front that looks like a clover.", + size 10, + has clothing; +Object hedge_clipper "hedge clipper" toolshed + with name "clipper" "clippers", + description "Basically a long pair of scissors.", + size 15, +; +Object rubber_gloves "rubber gloves" toolshed + with name "gloves" "pair" "rubber", + article "a pair of", + description "A pair of yellow rubber gloves, slightly \ +worn. Good for gardening, or washing dishes, I suppose.", + size 10, +has clothing; + +! (cracked -- magic has questionable source, doesn't always work) +Object p3 "cracked parchment" toolshed + class parchment_class, + with name "cracked", +description "~...is true that those who go by the title of \ +'Enchanters' need not wear any holy symbol through which \ +to draw magical power. Indeed, it seems as though the very \ +amulets we must wear are our only link to magical powers \ +at all. Worse yet, the powers are indeed granted from \ +powers above, but the Ancient Ones? I think not. For indeed, \ +I have found places where magic powers will not work, with or \ +without the amulet. Likewise, I have found places where \ +magic works, but praying to the Ancient Ones goes unanswered! \ +What this all...~"; + +Object Con_Decor_garden "Decorative Plants Garden" + with description "\ +You are standing in a small well-kept garden. The plots surrounding the \ +paths are filled with a variety of general ground-cover plants, all \ +appropriate for most discerning homeowners. Exits lie north and south.", + name "ground-cover" "plots" "flamingo" "tinsel" "ornament", + n_to Con_Desert_garden, + s_to Con_Flower_Garden, + has light; + +Object Con_Forest_garden "Forest Garden" + with description "A garden path winds through this narrow \ +greenhouse, which is stocked with various forest plants. \ +The path winds back to the west and south.", + name "path", + w_to Con_Desert_garden, + s_to Con_Fountain, + has light; + +Nearby plants1 "plants" + with name "plants" "plant" "tree" "forest", + description "You are reminded of a hiking trip you took once.", + before [; + Cast: + if (the_spell_was == throck_spell) + "The forest seems a bit livelier now."; + ], + has scenery; + +Object Con_Jungle_garden "Jungle Garden" + with description "A garden path winds through this \ +long greenhouse, which is filled with plants native to \ +jungle settings. The environment is somewhat \ +humid. The path heads west and north from here.", + name "path" "humid", + w_to Con_Flower_garden, + n_to Con_Fountain, + e_to [; + if (waterfall hasnt general) + "You can't go that way."; + else return Con_Nursery; + ], + before [; + Smell: "You smell flowers to the west."; + ], + has light; + +Nearby plants2 "plants" + with name "plants" "plant" "tree" "jungle", + description "Reminds you of a picture you once saw of \ +the Miznia jungles.", + before [; + Cast: + if (the_spell_was == throck_spell) + "The jungle seems a bit livelier now."; + ], + has scenery; + +Object waterfall "small waterfall" Con_Jungle_garden + with name "waterfall" "fall" "falls", + initial [; + if (self hasnt general) + print "A nice little waterfall enhances the jungle \ +setting"; + else + print "A fake waterfall hides a passage"; + " to the east."; + ], + description [; + print "A small"; + if (self has general) print " fake"; + " waterfall drops out of a mock-stucco \ +wall to the east."; + ], + before [; + Pull, Push, Touch, Search, Rub: + give self general; + "You reach out, expecting to get your hands wet, but \ + to your surprise, you feel a cloth-like substance. \ + On closer examination, you realize that the waterfall \ + is a clever realistic-looking fake, made of cloth \ + and wood. Stepping around some low plants, you also \ + notice the waterfall covers a passage east!"; + ThrownAt: + move noun to Con_Jungle_garden; + CDefArt(noun); ", to your surprise, literally \ + bounces off the waterfall, and lands with a thump \ + nearby."; + ], + has static; + +Object Con_Nursery "Nursery" + with description "This small back room is apparently the \ +conservatory nursery. Bits of soil and plant \ +debris are everywhere, along with immature \ +seedling plants. A exit lies west, partially \ +covered by some cloth.", + name "soil" "plant" "debris" "seedling" "cloth", + w_to Con_Jungle_garden, + has light; + +Object smallpot "small flower pot" Con_Nursery + with name "pot", + description "A small red-ceramic flower pot, \ +ideal for small plants, I suppose.", + before [; + Push, Take: + if ((location == Con_Nursery) && (self hasnt general)) { + give self general; + move shed_key to Con_Nursery; + print "Moving the pot uncovers a small key hidden \ +underneath it.^"; + if (action==##Push) rtrue; else rfalse; + } + LookUnder: + if ((location == Con_Nursery) && (self hasnt general)) { + "The pot does appear to be sitting crooked. But \ + you can't see whatever is under it."; + } + Cast: + if ((the_spell_was == huncho_spell or luncho_spell) && + (self hasnt general)) { + give self general; + move shed_key to Con_Nursery; + rfalse; + } + ], + size 15, + has container open transparent; + + +Object Con_Fountain "Fountain" + with description "A tasteful fountain intercepts a north-south \ +garden trail here.", + name "trail", + n_to Con_Forest_garden, + s_to Con_Jungle_garden, + each_turn [; + if (random(20) == 1) + "^You hear someone whistling nearby, but there doesn't \ +seem to be anyone around."; + ], + has light; + +Nearby fountain "fountain" + with name "fountain", + description "A stone basin with a central fountain spout \ +shaped like a fish. There's no water running currently.", + before + [ x; + Search: + if (self hasnt general) { + give self general; + move c3 to self; + "You fish in the fountain for a bit and find a coin!"; + } + else { + print "Mostly wet plant debris"; + x = children(self); + if (x == 0) + ", nothing interesting."; + print ". You also notice:^"; + x = FULLINV_BIT + INDENT_BIT + NEWLINE_BIT + RECURSE_BIT; + WriteListFrom (child(self), x, 1); rtrue; + } + Receive: + if (noun has is_coin) + print "Hoping for a little luck, I presume?"; + ], + capacity 10, + size 25, + has scenery container open; + +Object glasses "pair of glasses" Con_Fountain + with name "glasses", + initial "It looks like someone left their glasses here.", + description "Thick lenses and a heavy frame.", + before [; + Wear: "You put the glasses on for a moment, and it's like \ + looking through a fishtank. Deciding \ + against continuing your quest without adequate \ + vision, you take them off."; + ], + size 5, + has clothing; + +Object c3 "coin" class coin_class; + +Object shed_key "small key" + with name "key" "small", + description "A small metal key.", + size 4, +; + + +! (Delbin's Pub) + +Object Delbins "Delbin's Pub" + with description [; + print "Delbin's Pub has been a popular food and drink spot in \ + South Anthar for quite a while. "; + if (self hasnt general) + print "Usually, you need to \ + fight off barbarians to find a place to sit. At the moment, \ + however, the place is unusually quiet. A group of \ + barbarians seem paralyzed with fear near the back wall, \ + glancing nervously at the front of the bar."; + else print "A group of barbarians \ + are making a lot of noise nearby."; + " The exit is to the north."; + ], + name "back" "front", + number 0, + before [; + Listen: + if (self has general) + "The barbarians are a rather noisy bunch."; + Go: + if ((noun == n_obj) || (noun==out_obj)) +print "Delbin calls out ~Visit us again!~ as you leave.^"; + ], + n_to ANTHAR_West, + out_to ANTHAR_West, + each_turn [ i ; + if (Morgan in Delbins) { + i = random(3); + if ((i==1) && (Delbins.number == 0)) { + Delbins.number = 1; + "^The man in black makes a lightning fast move for the \ +glass of ale, but is countered by an equally fast move by the warrior. \ +~Lose something, thief?~ the woman says. ~No need to get violent, Morgan,~ \ +the thief says."; + } + if ((i==1) && (Delbins.number == 1)) { + Delbins.number = 2; + "^The wizard looks at his companions. ~Say, did I ever \ +show any of you my famous disappearing glass trick?~ He starts to take \ +off his wizard's hat, but the gentleman and ranger stop him. ~Don't \ +even try it, Frobar.~ the woman warrior says."; + } + if ((i==1) && (Delbins.number == 2)) { + Delbins.number = 3; + "^The female ranger fixates on the glass of ale. \ +~Look you two, some of us have better things to do, like fight wars.~ \ +The wizard scowls. ~Oh save it, Morgan.~ he says."; + } + } + ], + has light; + +Nearby barbarians "barbarians" + with name "barbarians" "group", + description "A group of dirty barbarians. One of them \ + sees you staring at them, and gives you a dirty look.", + life [; + default: + if (Morgan in Delbins) + "The barbarians are somewhat paralyzed with fear at the moment."; + else + "The barbarians are far too busy telling rude jokes \ +at the moment."; + ], + has animate concealed; + +Object headdress "headdress" Delbins + with name "headdress", + initial "A gaudy headdress of some kind is \ +hanging on a nearby wall.", + description "A large headdress made of animal fur and colorful \ +bird feathers.", + size 15, + has clothing; + +Object bar "bar" Delbins + with name "bar", + description "A long flat wood bar that could probably use a \ +washing.", + before [; + Cast: + if (the_spell_was == egdelp_spell) { + print "The bar is covered with a waxy film. \ +Delbin notices this and shrugs."; + } + LetGo: + if (noun==ale_glass) { + ; rtrue; } + ], + has scenery supporter; + +Object ale_glass "glass of ale" bar + with name "glass" "ale", + description "A small glass filled with an amber liquid.", + before [; + Take: + "You receive cold stares from the three individuals \ + at the bar. ~Get your own,~ the Ranger says and \ + pushes you back."; + Drink: + "You receive cold stares from the three individuals \ + at the bar. ~Get your own,~ the Thief says and \ + takes the glass from you before you can bring it \ + to your lips."; + Turn, Push, Pull, Shake: + "You receive cold stares from the three individuals \ + at the bar. ~Get your own,~ the Wizard says and \ + prevents you."; + ThrownAt: + deadflag = 1; + CDefArt(noun); " hits the glass and nearly topples it! \ + A voice from the back of the room says ~Garn! He \ + nearly ruined a perfectly good glass of ale, he did.~ \ + The three individuals at the bar turn to you with \ + angry stares, but before you can respond, some \ + barbarians pummel you to death for poor bar manners."; + Cast: + if (the_spell_was == zemdor_spell) { + give Delbins general; + remove self; + Achieved(8); + ! set up three NPCs + ! -- Morgan, fairly easy + move Morgan to Ravine_pass; + ! -- Frobar, a little tougher + move Frobar to FROBAR_Study; + if (Ench_mag in Frobar_mailbox) + move Ench_mag to Frobar; + StartDaemon(Frobar); + ! -- Thief, trickiest + remove Thief; ! he'll be back + if ((Painting_REAL in Museum_north) && + (glass_wall notin Museum_north)) + move Painting_REAL to THIEF_Storeroom; + ! Thief steals painting (no door left behind!) + "You quickly make the zemdor chant and watch the glass \ +of ale start to shimmer! In short time, there are three glasses filled \ +with ale on the bar!^^\ +Morgan the Ranger looks suspiciously at Frobar the Enchanter. \ +~Is this your doing, wizard?~ Frobar shakes his head. ~Surely not, \ +you know I can't do magic anymore.~ He glances briefly in your \ +direction. ~No matter,~ the thief says, and raises a glass. \ +~To the spirit of adventure!~ The three down their glasses quickly. \ +Morgan smiles. ~Now, that's good ale.~ She adjusts her broadsword. \ +~I'm off to the Egreth front. Want to help end a war, Frobar?~ \ +Frobar chuckles. ~Thank you, no. I've got, err, something to do \ +at home,~ he says and quickly leaves. ~Well, then, what about you, \ +thief?~ Morgan asks, and notices that the thief has already slipped \ +away. She shrugs and leaves the bar as well. ~Good hunting!~ Delbin \ +calls after her."; + } + if (the_spell_was == huncho_spell or luncho_spell) +"You begin the chant, but something about it gets the \ +Enchanter's attention. ~If you have something to say, \ +why don't you share it?~ With a subtle gesture, the Enchanter \ +dispels the chant."; + ], +; + +Object rag "dirty rag" bar + with name "rag" "dirty", + description "A slightly dirty cleaning rag.", + !weight 5, +; + + +! (Flathead stadium) + +Object Stadium_entrance "Entrance to Flathead Stadium" + with description "Here stands the entrance into the still \ + popular Flathead Stadium, home to esoteric \ + sports activities you never fully understood. \ + Walkways lie southeast and southwest from here, or \ + you can enter the stadium to the north.", + name "stadium" "walkways" "entrance", + sw_to ANTHAR_West, + se_to ANTHAR_East, + n_to Stadium_top, + in_to Stadium_top, + before [; + Listen: + "You can hear the roars of a good crowd from \ + inside the stadium. Must be playoff season."; + Go: + if ((noun==n_obj) || (noun==in_obj)) + print "You walk right into the stadium. The ticket-takers \ + must be on strike or something.^"; + ], + has light; + +! (fake stadium entrance, for "past") + +Object Stadium_entrance2 "Entrance to Flathead Stadium" + with description "You appear to be in front of Flathead Stadium once \ +again, however something seems different. Even the stadium itself seems \ +dissimilar, newer. Walkways lie southeast and southwest from here, or \ +you can enter the stadium to the north.", + name "stadium" "walkways" "entrance", + sw_to "A strange feeling compels you to stay.", + se_to "A strange feeling compels you to stay.", + n_to [; + deadflag = 1; + "As you head towards the entrance, a mob of crazed fans \ +rushes out of the stadium (~Isn't that Babe Flathead?~ you hear someone \ +scream) and tramples you to death."; + ], + before [; + Listen: + "The place is surprisingly quiet."; + ], + has light; + + +Object stadium_sign "stadium sign" Stadium_entrance + with name "sign", + initial "A stadium event sign is pasted to one of the stadium walls here.", + description + "~Today's event:^\ + GOLEM FIGHTS!!!^^\ + ALL CHALLENGERS WELCOME!!!^\ + THREE ROUNDS, THREE BOUTS!^\ + BIG CASH FOR THE WINNER!^^\ + (All Golems have undefeated records, so^\ + only trained golem-wrestlers need apply!)~", + has static; + +Object stadium_statue "stadium statue" Stadium_entrance + with name "statue", + initial "A statue depicting the legendary Babe \ +Flathead greets all visitors in front of the stadium.", + description + "According to the inscription, this statue honors the legendary Babe Flathead.", + before [; + LookUnder: + if (self has general) + "Oddly, the statue seems to sit slightly tilted."; + Push: + if (self has general) { + remove self; + move statue_base to Stadium_entrance; + Achieved(9); + "You give the statue a shove, and it wobbles and falls, \ +breaking into useless dust! A passing sportsfan notices your act \ +of vandalism, and says to a friend, ~Look at that. The guy wins one \ +bout of Golem wrestling, and he thinks he's better than Babe \ +Flathead.~"; + } + else "The statue seems to be firmly fixed in place."; + ], + has static; + +Object statue_base "square hole" Stadium_entrance2 + with name "hole" "square", + describe "In front of the stadium is a square hole.", + description "There's a large square hole in the ground near \ +the front of the stadium.", + time_left 0, + time_out [; +! move stadium_sign to Stadium_entrance; +! move stadium_statue to Stadium_entrance; + print "^You hear voices behind you, and suddenly, a \ +small crowd of people pass by, pushing a statue.^^\ +~Right there,~ someone shouts, and a few people position the \ +statue into the square hole."; + if (children(self) == 0) { + print " It fits neatly in place."; + remove red_rod_piece; + } + else { + give stadium_statue general; + print " It fits, but seems just slightly \ +tilted."; + } +! remove statue_base; +! give Stadium_entrance ~general; + Mystical_Cave.number = Mystical_Cave.number + 1; + print "^^~That's perfect,~ you hear a voice say, and \ +the crowd murmurs in agreement. Why, it's Babe Flathead himself! \ +He saunters up towards the statue, which is indeed a good \ +likeness, and starts handing out cigars. ~We'll get to \ +autographs later,~ he says while lighting your cigar as you \ +try to protest. Seconds later, the cigar explodes! You see \ +sparkling stars, which seem to change to purple flashes. You \ +blink.^"; + PlayerTo(Mystical_Cave); + ], + capacity 1, + size 15, +has static container open; + +Object Stadium_top "In Flathead Stadium, upper seats" + with description "\ +You are near the top cheap seats of Flathead Stadium. \ +The crowd is busy cheering whatever is going on down on the \ +field. Looking at the field, you see two small dots. The Stadium exit \ +is back south, or you can walk down to the front seats to \ +the north.", + name "seats" "crowd" "field" "dots" "fans", + s_to Stadium_entrance, + n_to Stadium_bottom, + d_to Stadium_bottom, + e_to "You try to push your way through the fans, but fail.", + w_to "You climb over a few seats, but the crowd blocks any \ + further progress west.", + before [; + Listen: "The crowd is deafening."; + ], +has light; + + +Object Stadium_bottom "In Flathead Stadium, lower seats" + with description "\ +You are near the good seats in Flathead Stadium. \ +The crowd is busy cheering for the current event on the \ +field. Looking at the field, you see two large dots. The \ +seats continue up and south, or you can walk down to the \ +field below.", + name "seats" "crowd" "field" "dots" "fans", + s_to Stadium_top, + u_to Stadium_top, + d_to [; + if (burly_man hasnt general) +"The burly man jumps out of his seat as you try to pass. \ +~Hey buddy, I'm saving those seats.~ He points to an entire \ +row of seats below you. ~I've been waiting all season, and \ +I don't want an obstructed view, so look for somewhere else to \ +sit.~ He sits back in his seat."; + else return Near_locker_room; + ], + n_to [; + if (burly_man hasnt general) +"The burly man jumps out of his seat as you try to pass. \ +~Hey buddy, I'm saving those seats.~ He points to an entire \ +row of seats below you. ~I've been waiting all season, and \ +I don't want an obstructed view, so look for somewhere else to \ +sit.~ He sits back in his seat."; + else return Near_locker_room; + ], + w_to "You try to push past a couple fans, but the angry looks make you stop.", + e_to "You try to push past a couple fans, but the rude looks make you stop.", + before [; + Listen: "The crowd is deafening."; + ], +has light; + +Object Near_locker_room "Near Locker Room" + with description "\ +You are near a locker room under Flathead field. \ +You can enter the locker room to the north, or start the climb back into \ +the roaring crowd to the south.", + name "crowd" "field" "fans", + s_to Stadium_bottom, + u_to Stadium_bottom, + n_to Locker_room, + each_turn [; + if (self hasnt general) { + give self general; + move pale_scroll to Near_locker_room; + "^A couple front row fans are getting a bit boisterous. \ +Several of them throw garbage and paper debris towards the field. \ +You notice something flutter down by your feet."; + } + ], + before [; + Listen: "The crowd is deafening."; + ], + has light; + +Object Locker_room "Locker Room" + with description "\ +You are inside a locker room under Flathead field. You can hear the \ +crowds outside. The room is empty. There is an exit \ +to the south, and the entrance to the field is to the north.", + name "field" "locker" "lockers", + n_to Flathead_field, + s_to Near_locker_room, + before [; + Listen: "You can hear the crowd outside."; + ], + has light; + +Object Flathead_field "Flathead Field" + with description "You're on Flathead field, in front of millions of zany \ +fans, a lifetime dream. Or not. Well, anyway, \ +there's a locker room to the south.", + name "field" "fans", + s_to [; + if (self has general) +"You head for the showers, but the coach springs out and blocks \ +your way. ~Come on kid, keep your head in the game.~"; + else return Locker_room; + ], + each_turn [ i; + if (self has general) { + i = random(20); + if (i == 1) + "^Someone in the crowd yells out, ~Get him a body bag!~ \ + We assume he was referring to the golem, not you."; + if (i == 5) + "^The crowd does 'the wave'."; + if (i == 7) + "^The crowd waves some strange colorful objects. \ +Rather distracting."; + if (i == 10) + "^Someone in the crowd screams ~Flathead that golem!~"; + } + ], + before [; + Listen: "The crowd is deafening."; + ], + has light; + + + + +! **************** +! People/creatures +! **************** + +Object Christmas_tree_monster "Christmas tree monster" Con_Decor_garden + with name "tree" "monster" "Christmas", + initial "A Christmas Tree stands in one plot, swaying back and forth.", + description "\ +The Christmas Tree monster has obviously seen some good years. It towers \ +above you, wrapped with tinsel that sparkles marvelously. The \ +plastic flamingo ornaments are a rather gaudy touch. Surprisingly, it seems to \ +have taken root in the soil.", + each_turn [ i ; + i = random(10); + if (i==1) +"^The Christmas Tree Monster belts out a few bars of 'I'm dreaming \ +of a Black Cavern' arranged by Bing Frozby."; + if (i==2) +"^The Christmas Tree Monster sings a few measures from Berknip's own \ +rendition of 'Silent Night', a rather morbid version."; + if (i==3) +"^The Christmas Tree Monster hums a few notes from 'Dornbeasts \ +Roasting on an Open Pyre'."; + if (i==4) +"^The Christmas Tree Monster whistles a part of 'Frosty the Snow Wight'."; + if (i==6) +"^The Christmas Tree Monster sways in time to 'Let it snow, let it snow, \ +let it snow'."; + if (i==8) +"^The Christmas Tree Monster treats you to an abridged version of \ +Handel's 'Messiah'."; + "^The Christmas Tree Monster hums to itself."; + ], + before [; + Cut: + if (hedge_clipper notin player) + "You'll need a gardening implement to do that."; + if (self has general) + "The gardener said he'd make you dig for slugs, and \ + that doesn't sound too exciting, so let's leave the tree \ + alone."; + if (self hasnt general) { +print "You being to clip a few of the lower branches of the Christmas Tree \ +Monster, who bellows in pain!^^\ +Out of nowhere, a short old man appears, wearing full gardener \ +regalia. He drags your hand away from the tree.^^\ +~What are ya trying to do there, kill the thing?~ he says. "; + if ((glasses hasnt moved) || (glasses in Con_Fountain)) { + remove glasses; + remove hedge_clipper; +"He pulls \ +out a pair of glasses and puts it on. ~Say, I don't know you,~ \ +he says. ~If you want to practice introductory horticulture, do \ +it in someone else's garden!~ He grabs the clippers from your hands \ +and stalks off."; + } + else { +print "He seems \ +to be squinting at you. ~Who are you sonny?~ he asks. He starts +searching his pockets. ~Confound it, lost my glasses again.~ "; + if (gardeners_cap hasnt worn) { + remove hedge_clipper; +"He squints again, and says, ~Well, whoever you are, the gardens are \ +for looking at, not practicing landscape design!~ He grabs the \ +clippers out of your hands and stalks off."; + } + if (gardeners_cap has worn) { + give self general; + Achieved(10); +"He looks at you again, and notices your cap. ~You must be one of the \ +new boys. Here, look, I'm not going to show you twice.~ He takes \ +the clippers and delicately clips away several lower branches, all \ +the while singing ~It's beginning to look a lot like Christmas~. \ +He finishes trimming the tree, leaving a nice opening exposing the \ +shrub next to it, and stops singing. ~I'm starting to hate \ +that tune,~ he says under his breath. He hands the clippers back \ +to you and says, ~Now if I catch you doing this wrong again, I'm \ +going to make you dig for slugs, understand?~ He disappears as \ +quickly as he appeared."; + } + } + } + Cast: + "You start chanting, but the tree starts singing \ + ~Plover the river and frotz the woods~ and you \ + can't help joining in, ruining your chant."; + ], + react_before [; + Sing: + "You song is drowned out by a boisterous chorus \ + by the tree."; + ], + life [; + Show: + if (noun==toy_volcano) + "The tree abruptly stops singing, and seems \ +a trifle flustered for some reason. Moments later, it \ +resumes its chorus."; + default: "The tree just keeps on singing."; + ], + has animate; + +! (ok, the bush isn't defined as alive. But it is...) +Object dornberry_bush "Dornberry bush" Con_Decor_garden + with name "shrub" "bush", + initial [; + print "A small shrub sits near and under the Christmas Tree"; + if (Christmas_tree_monster hasnt general) + ", almost covered by it."; + else + "."; + ], + description [; + if (self hasnt general) +"The small shrub looks rather poorly tended. Just a few green leaves \ +distinguish it from the surrounding soil."; + else +"The small shrub looks quite healthy. A cluster of green leaves and \ +branches make a nice plant. It's still smaller than the tree, though."; + ], + capacity 1, + before [; + Cast: + if (the_spell_was == throck_spell) { + if (Christmas_tree_monster hasnt general) +"The shrub seems to shake suddenly! A new leaf grows, searchs for the \ +sunlight, fails, and withers."; + if ((Christmas_tree_monster has general) && + (self hasnt general)) { + give self general; + move dornberries to self; +"The shrub seems to shake suddenly! A new leaf grows, searchs for the \ +sunlight, and finds it! Another leaf follows, and soon the shrub is \ +sprouting new branches. In the sunlight, flowers appear, and a cycle \ +of missed-out seasons is made-up for in minutes! The shrub is now \ +quite a thriving plant, covered with tiny red fruit."; + } + if (self has general) + "The shrub shakes a bit, but the plant remains the \ + same. For a Dornberry bush, it's already probably \ + the healthiest one you've ever seen."; + } + Receive: + if (noun ~= dornberries) + "I don't think the shrub can support that."; + ], + has static supporter; + +Object dornberries "bunch of dornberries" + with name "dornberries" "berries", + description "A bunch of tasty-looking red berries.", + !weight 5, + size 5, + has edible scored; + +! (moved here so that it shows up 'last' in room descr) +Object plaque "plaque" Con_Decor_garden + with name "plaque", + initial "A small plaque sticks out of the soil near the two plants.", + description [; + print "The plaque reads:^^"; + font off; +print "~CHRISTMAS TREE MONSTER DORNBERRY BUSH^"; +print " ~^"; + font on; + ], +! ~CHRISTMAS TREE MONSTER DORNBERRY BUSH^\ +! ~", + has static; + + +! (Characters in Flathead Stadium) + + +Object burly_man "burly man" Stadium_bottom + with name "man" "burly", + description "A big man who's apparently into sports.", + before [; + Cast: + if ((the_spell_was == foblub_spell) && (self hasnt general)) { + give self general; + Achieved(11); +"You begin your sermon. The man starts to tell you to knock \ +it off, but starts to listen with awe. As you finish, the man \ +tries to get up to shake your hand, but realizes he is stuck \ +fast. ~They gotta start cleaning these seats,~ he says."; + } + if (the_spell_was == espnis_spell) + "You begin a description of the 1700 different kinds of \ + holy water, but the man seems so enthralled with the \ + game below, he just isn't paying attention."; + ], + life [; + Show: + if (noun==trophy) + "~You were amazing pal. Ever think of going pro?~"; + Ask: + if (second=='fight' or 'game' or 'fights') + "~It's the three-golem special. One contestant \ + versus three golems, one after the other. Great \ + stuff.~"; + default: + "~Give it a rest pal, I'm watching the game.~"; + ], + has animate; + +Object coach "tough-looking coach" Locker_room + with name "coach", + description [; +print "An old fellow with bushy eyebrows and \ +a gruff demeanor. He's dressed like a sports coach"; +if (trophy in self) +". You also notice he's holding some sort of trophy."; +else "."; + ], + number 1, + each_turn [; + if (self hasnt general) { + if (Flathead_field hasnt general) { + give Flathead_field general; +print "^The coach looks up and notices you. ~Oh, you must be the \ +replacement,~ he says. He drags you over to the field entrance. \ +~Well, I hoped you're warmed up, cuz you're up.~ He shoves you \ +north. ~Remember, these guys are tough, so give 'em your \ +best stuff.~^"; + PlayerTo(Flathead_field); + } + else { + print "^The coach looks up and notices you. \ +~Where have you been? The ref was about to default \ +it to the golems!~ He shoves you north. ~Now get in there and \ +make me proud.~^"; + PlayerTo(Flathead_field); + } + } + if ((self has general) && (coach.number == 1)) { + move win_bag to player; + coach.number = 2; + "^The coach gives you a slap on the back that \ +knocks the wind out of you. ~You did it! I didn't think \ +you had it in you!~ He hands you a small bag. ~Here's the \ +winnings. I went ahead and took out my cut, of course.~^"; + } + ], + life [; + ! essentially, the only chances to do 'life' things + ! will occur when the coach is lingering around + ! the lockerroom after the match. + Attack: + "~You want a couple rounds with the old man \ +too? Well, I'm ready.~ For an old coach, he still looks \ +like he's in pretty good shape. You decide against violent \ +action."; + Answer: + "The coach merely nods."; + Ask: + if (second == 'trophy') + "~It's a beauty all right.~"; + if (second == 'winnings' or 'cut') + "~It's all there, count it if you want.~"; + if (second == 'life' or 'game' or 'sport') + "The coach looks momentarily reflective. \ +~Life is all about getting into the game,~ he says. \ +~Remember that, it's not about winning or losing, but \ +giving it your best shot.~"; + Show: + if (noun == cereal1 || + noun == cereal2 || + noun == cereal3 || + noun == cerealbox1 || + noun == cerealbox2 || + noun == cerealbox3) + "~A bowlful of that each morning is bound to make a \ +champion out of you.~"; + Order: +! *** note2: this seems to contradict documentation, +! i.e. 'ask coach for trophy' results in noun==trophy and +! second==(?)coach or player, not the other way +! around. + if ((action==##Give) && (noun==trophy) && + (trophy in self)) { + move trophy to player; + remove self; +"The coach looks lovingly at the trophy, and then at you. \ +~Fair enough kid, you earned it.~ he says, and gives it \ +to you. ~I've seen a lot of golem-wrestlers in my time, \ +but I gotta say, you're the best golem-wrestler I've ever \ +seen.~ He leaves the locker room to greet his fans."; + } + default: "At the moment, it looks like the coach is too busy \ + writing a Hall of Fame acceptance speech to \ + pay you much attention."; + ], + react_before [; + Cast: + "~What's that you're saying? Speak up, I'm your \ +coach, I'm hear to listen.~"; + ], + has animate transparent; + +Object referee "referee" Flathead_field + with name "referee" "ref", + description "A stout looking man in a funny striped shirt.", + each_turn [; + if (self hasnt general) { + give self general; +"^The ref blows his whistle and says ~Round 1~. The golem, not \ +needing any encouragement, jumps into the fray."; + } + ], + life [; + Attack: + "Your opponent is the golem, not the referee."; + Ask: + if (second == 'time' or 'timeout') + "~Sorry, no timeouts!~ the ref says."; + if (second == 'foul') + "~It looked good to me.~"; + if (second == 'round') { + if (wood_golem in Flathead_field) + "~You're in round 1.~"; + if (stone_golem in Flathead_field) + "~You're in round 2.~"; + if (iron_golem in Flathead_field) + "~You're in round 3, the final round.~"; + } + default: "The ref makes some completely \ +bewildering hand signal, that could be an insult, for \ +all you know about wrestling. In any event, nothing happens."; + ], + before [; + Cast: +if (the_spell_was == espnis_spell) { + deadflag = 1; + "You start to relate the advantages of Bingo over Double \ +Fanucci to the ref, and sooner that you can say ~Zounds~, the \ +ref is fast asleep! Unfortunately, the golem takes advantage of \ +this opportunity and breathes poison gas at you! You reflect \ +on this display of poor sportsmanship as you slowly lose \ +consciousness."; +} + ], + has animate; + +! -- the golems... +! In general: To be fair, the golems only have a 1 in 30 chance +! of actually hitting. When they do hit, however, it's pretty +! painful. They also tend to have high HP, although I guess +! theoretically, they could be beaten without spells. +! (note: I've tried this with the iron golem and never +! succeeded. The odds are definitely not in the players favor) +Object wood_golem "dangerous-looking wood golem" Flathead_field + with name "golem" "wood", + number 20, + description "\ +The wood golem stands at about twice your height, an animated statue \ +made completely of wood. He may move like an old cabinet, but \ +watch those hands!", + each_turn [ i ; + i = random(13); + if (i == 13) + Player_HP_CUR = Player_HP_CUR - 15; + if (Player_HP_CUR <= 0) { + deadflag = 1; + "^The wood golem jumps forward and flattens you, \ + which feels similar to getting hit by a falling \ + redwood tree."; + } + if (i == 13) + "^The golem staggers you with a punch that sends you \ + reeling!"; + if (i == 20) +"^The wood golem tries to move in for a clinch, and you dance \ +away."; + if (i == 10) +"^The wood golem makes a lumbering swing at your head, and misses!"; +"^The wood golem makes a swipe for you, and misses."; + ], + before [; + Cast: + if (the_spell_was == egdelp_spell) { + remove self; + move stone_golem to Flathead_field; +"The wood golem is suddenly covered with a waxy buildup! \ +Greatly embarrassed, he turns to call foul, and slips! \ +With a great thud, the golem hits the turf, and knocks \ +himself out cold!^^\ +The ref says ~Knockout!~. The crowd cheers in approval.^^\ +Several dwarves appear and cart the wood golem off. \ +Unfortunately, a stone golem soon walks into view!^^\ +The coach yells from the doorway ~You're doing great kid, \ +just hang in there.~^^\ +The ref says ~Round 2!~"; + } + ], + life [ i ; + Attack: + i = random(20); + if (i > 10) { + wood_golem.number = wood_golem.number - 1; + if (wood_golem.number <= 0) { + remove self; + move stone_golem to Flathead_field; +"With a thundering blow, you smash the golem into \ +kindling!^^\ +The ref says ~Knockout!~. The crowd cheers in approval.^^\ +Several dwarves appear and cart the wood golem off. \ +Unfortunately, a stone golem soon walks into view!^^\ +The coach yells from the doorway ~You're doing great kid, \ +just hang in there.~^^\ +The ref says ~Round 2!~"; + } + else { + print "Good shot! You whack the golem, and splinters fly"; + if (wood_golem.number > 10) + ". It didn't seem to slow him down, though."; + else "."; + } + } + "You swing, but miss."; + ], + has animate; + +Object stone_golem "fierce-looking stone golem" + with name "golem" "stone", + number 40, + description "\ +The stone golem is quite a towering piece of work. He looks like a crude \ +statue made of animated granite. He probably has all the \ +finesse of a giant boulder, so don't let him pin ya!", + each_turn [ i ; + i = random(13); + if (i == 13) + Player_HP_CUR = Player_HP_CUR - 20; + if (Player_HP_CUR <= 0) { + deadflag = 1; + "^The stone golem jumps forward and flattens you, \ + which feels similar to getting crushed by a giant \ + boulder."; + } + if (i == 13) + "^The golem hits you with a punch that sends you \ + reeling!"; + if (i == 20) + "^The golem jabs with his left, and misses!"; + "^The golem tries to close, and misses."; + ], + before [; + Cast: + if (the_spell_was == tossio_spell) { + remove self; + move iron_golem to Flathead_field; +"The golem is suddenly replaced with a pile of steaming \ +linguini alfredo!^^\ +The ref yells ~Takeout!~ The crowd goes wild! \ +Several dwarves appear and serve the pasta to the crowd \ +on platters. Unfortunately, an iron golem soon \ +walks into view! ^^\ +The coach yells out from the safety of the locker room ~Okay kid, drop \ +this golem, and we can celebrate.~^^\ +The ref yells ~Round 3!~"; + } + ], + life [ i ; + Attack: + i = random(20); + if (i > 10) { + stone_golem.number = stone_golem.number - 1; + if (stone_golem.number <= 0) { + remove self; + move iron_golem to Flathead_field; +"With a thundering blow, you smash the golem into \ +gravel!^^\ +The ref says ~Knockout!~. The crowd cheers in approval.^^\ +Several dwarves appear and cart the stone golem off. \ +Unfortunately, an iron golem soon walks into view!^^\ +The coach yells out from the safety of the locker room ~Okay kid, drop \ +this golem, and we can celebrate.~^^\ +The ref yells ~Round 3!~"; + } + else { + print "Solid blow! Stone chips fly."; + if (stone_golem.number > 10) + ". It didn't seem to slow him down, though."; + else "."; + } + } + "You swing, but miss."; + ], + has animate; + +Object iron_golem "deadly-looking iron golem" + with name "golem" "iron", + number 50, + description "\ +The iron golem resembles a huge nightmare made out of iron. \ +Towering at least 30 feet high, this animated iron statue isn't \ +something you'd want to meet in a dark alley, much less \ +in an arena filled with screaming fans.", + each_turn [ i ; + i = random(13); + if (i == 13) + Player_HP_CUR = Player_HP_CUR - 30; + if (Player_HP_CUR <= 0) { + deadflag = 1; + "^The iron golem jumps forward and flattens you, \ + which feels similar to getting mashed by a giant \ + block of iron. Oww."; + } + if (i == 13) + "^The golem staggers you with a punch that sends you \ + reeling! That felt quite painful."; + if (i == 20) + "^The golem tries to flatten you, and you evade just in time!"; + "^The golem tries to step on you, and you dodge."; + ], + before [; + Cast: + if (the_spell_was == bekdab_spell) { + remove self; + remove referee; + give Flathead_field ~general; + give coach general; + move trophy to coach; + Achieved(12); +"The golem suddenly develops many unsightly patches of rust. \ +Mortified, the golem calls for his oil trainer, but to no \ +avail! It soon falls apart into several rusty metal pieces!^^\ +The ref calls out ~The winner!~ and holds your hand aloft. \ +The crowd is on its feet! They'd probably be chanting your \ +name, if they knew it.^^\ +Several dwarves appear and drag off the rusty metal plates. \ +The ref explains that the prize money and a championship \ +trophy will be awarded in the \ +locker room, and exits."; + } + ], + life [ i ; + Attack: + i = random(20); + if (i > 10) { + iron_golem.number = iron_golem.number - 1; + if (iron_golem.number <= 0) { + remove self; + remove referee; + give Flathead_field ~general; + give coach general; + move trophy to coach; + Achieved(12); +"With a thundering blow, you smash the golem into \ +ball-bearings.^^\ +The ref calls out ~The winner!~ and holds your hand aloft. \ +The crowd is on its feet! They'd probably be chanting your \ +name, if they knew it.^^\ +Several dwarves appear and collect the ball-bearings. \ +The ref explains that the trophy will be awarded in the \ +locker room, and exits."; + } + else { + print "Solid blow! You make a small dent."; + if (iron_golem.number > 10) + ". It didn't seem to slow him down, though."; + else "."; + } + } + "You swing, but miss."; + ], + has animate; + +! (Three important NPCs) + +Object Morgan "Morgan the Ranger" Delbins + with name "ranger" "warrior" "Morgan" "captain" "maiden", + number 1, + initial [; + if (self in Delbins) + "There's a warrior-maiden sitting at the bar, her \ +eyes riveted to the glass of ale."; + else + "Morgan the Ranger is here."; + ], + description "She's nearly twice your height, and \ +probably twice your strength too. She's armed and armored in \ +typical military Ranger gear. She gives you the impression of \ +being the type who'd hunt dragons as a hobby -- assuming there were \ +any dragons left to hunt, of course.", + each_turn [; + if ((self in Ravine_pass) && (Morgan.number == 1)) { + Morgan.number = 2; + "^The Ranger sees you approach and recognizes you. \ + ~Well met again, Priest. I have need of your \ + assistance to end the kobold border war that has been going \ + on far too long.~ She pauses. ~To the \ + west and east are two of my lieutenants and their \ + soldiers, cut off from the rest of us by previous kobold \ + raids. I have the power to end this war and call a truce, \ + but to do so, I need \ + to inform both of my lieutenants to \ + stop fighting via \ + windcat message carriers.~ She points to the two windcats \ + in the wicker cage and the pile of colored flags. \ + ~The 'red' flags indicate 'attack', the \ + 'blue', truce. When my lieutenants receive the instructions, \ + they will verify my commands by sending additional messengers \ + with 'attack' or 'truce' instructions to each other. \ + Based on the two \ + received messages, each lieutenant will act accordingly.~ \ + She slaps you on the back, jolting you to attention. \ + ~Herein lies my problem, Priest. I know for a fact, that \ + one of my lieutenants is a traitor, who will \ + disobey my orders. Any instruction I send to the traitor, \ + the opposite will be sent by the traitor to my remaining \ + good lieutenant. The traitor will also take the two orders \ + he receives and do the opposite, if there is a majority, or \ + attack outright, if there are messages of 'truce' and 'attack'. \ + Thankfully, my good lieutenant will faithfully copy my \ + instructions to the other lieutenant, and will follow orders \ + received, if there is a majority, or follow a 'truce' if \ + there are mixed messages. My greatest problem, Priest, is that \ + I do not know which lieutenant is the traitor! If you \ + can bring peace once and for all to Southern Egreth, many \ + will remember your good deeds.~"; + } + ], + life [; + Answer: + if (special_word == 'hello') { + print "~Hello"; + if (Morgan.number == 2) + print " again"; + ", priest.~"; + } + Attack, ThrowAt: + "She's well-armed and probably dangerous."; + Give, Show: + "A gracious gesture, perhaps, but she isn't \ +interested."; + Kiss: + "She nearly splits your skull with the flat of \ +a huge broadsword before you even get close. ~For a man of \ +the cloth, you've got a lot of nerve,~ she says."; + Ask: + if (((second == 'cat') || (second=='cats') || + (second == 'windcat') || (second=='windcats')) && + (Morgan.number == 2)) + "~Right, the windcats. \ + The speckled cat will find the lieutenant to the east. \ + The spotted cat will find the lieutenant to the west."; + if (second == 'frobar' or 'wizard' or 'enchanter') { + print "She laughs. ~You've never heard of \ +Frobar, the dullest Enchanter? The Enchanter who was so dull \ +that his fellow wizards forgot to invite him to the last \ +great meeting? This saved him from becoming an amphibian, so \ +perhaps dullness has its virtues"; + if (self in Delbins) + ".~ The wizard looks rather insulted. \ +~Oh hush up, Morgan.~ the wizard says."; + else ".~"; + } + if (second == 'thief' or 'gentleman') { + print "She smiles. ~I can't say as I know \ +much about "; + if (self in Delbins) + "this fellow over here,~ she says and \ +gives the gentleman a whack on the back that nearly knocks his \ +teeth out. ~But I hear he's something of a thief.~ ~Nothing \ +of the sort!~ the gentleman protests."; + else + "that thief fellow. I've been told \ +he has a hideout somewhere, nearly impossible to find.~"; + } + if (second=='kobold' or 'war') +"~The war wages on, priest, even though the battle was lost \ +long ago, and there were no winners, kobold or man.~"; + if (second=='dragon' or 'dragons') +"Morgan becomes momentarily thoughtful. ~Some of the best \ +dragon-hunting I ever did was up in Frostham long ago. \ +Those white frost dragons are quite a vicious lot. Best not \ +to wake a sleeping white dragon unless you have a weapon handy \ +and know how to use it!~"; + else "~Sorry, I'm not sure about that.~"; + default: "Morgan the Ranger appears to be \ +thinking important thoughts at the moment."; + ], + before [; + Cast: + "~What's that you're mumbling there priest?~"; + ], + has animate female proper; + +Object Frobar "Frobar" Delbins + with name "Frobar" "wizard" "sorcerer" "enchanter", + initial [; + if (self in Delbins) + "There's an old wizard sitting at the bar, his \ +eyes riveted to the glass of ale."; + else "Frobar the Enchanter is here."; + ], + description "A wizardly old figure of a man.", + life [; + Attack, ThrowAt: + "You make a threatening move. The wizard practically yawns! \ +~Just what the world needs, another violent Priest.~ You stop, \ +somewhat embarrassed."; + Answer: + if (special_word=='hello') + "The wizard nods. ~Hello, hello, and all that rubbish.~"; + Ask: + if (self in Delbins) + "The wizard is somewhat occupied at the moment."; + else { + if (second=='magic' or 'mystic') { + print "Frobar scowls. ~Magic? We've seen the last \ +of magic, let me tell you. Does anyone remember what it did \ +for us? Does anyone mention the Enchanters that saved Quendor \ +from certain ruin many a time? Of course not. A bunch of \ +ingrates"; +if (term_paper notin self) +". I just hope they're teaching the kids at Tech what magic \ +was all about, before we got all this 'new science' stuff everyone's \ +blabbering about.~"; +else ".~"; + } + if (second=='golem' or 'golems') +"Frobar sighs. ~Golems used to be useful, you know. But now, \ +without magic to control them, they go off and get into all \ +sorts of mischief.~"; + if (second == 'thief' or 'gentleman') + "~Some fellow I've had some dealings with \ +in the past. Not a bad chap, but he does like to \ +supplement his income, if you know what I mean. Far \ +too risky a profession for my taste.~"; + if (second == 'morgan' or 'ranger' or 'warrior') + "~Morgan Grueslayer, top military Ranger \ +in her graduating class, I hear. If she asks you to join \ +her on one of her campaigns, just walk away. All that \ +fighting -- too stressful if you ask me.~"; + if (second == 'barsap' or 'snaboz') +!"~I don't even want to talk about it.~"; +"~Don't even get me started.~"; + } + Show: + if (self in Delbins) + "The wizard is somewhat occupied at the moment."; + if (noun == Ench_mag) { + move Ench_mag to Frobar; + "Frobar snatches the magazine out of your hands. \ + ~What are you doing with my mail?~ he says, irritated."; + } + if (noun has is_scroll) + "~A magic scroll, eh? Doesn't do me a lot of good \ +these days.~"; + if ((noun has is_rod) || (noun has is_sphere)) { + print "Frobar looks at ", (the) noun; + " for a moment. ~Something \ +more than meets the eye here. Couldn't tell you what, though.~"; + } + if (noun==wood_book) + "~So, you're a carpenter too?~ Frobar says, somewhat \ + sarcasticly."; + if ((noun==term_paper) && (glossy_scroll in self)) + { + FrobarGetsPaper(); + } + "~Hmm. Not very interesting.~"; + + Give: + if ((noun==term_paper) && (glossy_scroll in self)) + { + if (self notin Delbins) + FrobarGetsPaper(); + else "The wizard pushes your offering aside. \ +~I'm somewhat busy at the moment,~ he says, his eyes glued to \ +the glass of ale."; + } + if (noun == Ench_mag) { + move Ench_mag to Frobar; + "Frobar grabs the magazine. \ + ~What are you doing with my mail?~ he says, irritated."; + } + "~No, thank you.~"; + + default: "~I'm rather busy at the moment.~"; + ], + each_turn [ i ; + ! Handle Frobar's actions here...ALWAYS CHECK PARENT AND LOCATION + + if ((self in location) && (player in FROBAR_Bed)) { + print "Frobar seems annoyed. ~Get out of my bed!~ he says, \ + and drags you to your feet. "; + <>; + } + + ! Misc housekeeping actions... + if (random(3) < 3) { + if ((frobar_plant in parent(self)) && (self in location)) + print "^Frobar tends to the plant.^"; + if (FROBAR_Bed in parent(self) && self in location) + print "^Frobar arranges some quilts on the bed.^"; + if (FROBAR_shelves in parent(self) && self in location) + print "^Frobar pulls a book off the shelves, glances through it, and puts it back.^"; + if (parent(self) == FROBAR_Lounge && self in location) + print "^Frobar dusts the furniture a bit.^"; + } + + ! Random self mutterings... + i = random(5); + if (self in location && self notin Delbins) { + switch(i) { + 1 : "^Frobar mutters to himself, ~They didn't even invite \ + me to the Last Enchanter's Guild Meeting.~"; + 2 : "^Frobar mutters to himself, ~Good old dependable Frobar. Bah!~"; + 3 : if (Ench_mag in self) + "^Frobar leafs through a magazine he holds. ~What happened to \ + Barsap? Hah! Did they ask me? No, of course not.~"; + else + "^Frobar checks his pockets. ~What did I do with this \ + month's 'Enchanter Monthly'?~ he muses outloud."; + default: rtrue; + } + } + ], + daemon [ i j k Mdest Mdir; + ! This daemon will only deal with NPC movement... + ! (no doors either) + if (random(3) ~= 1) rfalse; ! doesn't always immed. move + + ! Count the available exits quickly + objectloop(i in Compass) + if (ZRegion(parent(self).(i.door_dir)) == 1) + k ++; + if (k == 0) rtrue; ! no exits... + + ! Pick a place to move to. + ! In Frobar's case, most of the time he only has one exit. + ! Also, we can block the sw exit of home here. + if (parent(self) == FROBAR_Foyer) { + Mdir = n_obj; + Mdest = FROBAR_Parlor; + MovePrintNPC(Frobar,Mdest,Mdir); + rtrue; + } + + ! Pick an exit at random and attempt to travel that way + j = random(k); k = 0; + objectloop(i in Compass) { + if (ZRegion(parent(self).(i.door_dir)) == 1) { + k ++; + if (k == j) { + Mdir = i; + Mdest = parent(self).(i.door_dir); + MovePrintNPC(Frobar,Mdest,Mdir); + rtrue; + } + } + } + ], + has animate proper; + +[ FrobarGetsPaper ; + Achieved(24); + move term_paper to self; + move glossy_scroll to player; + "Frobar glances over the term paper and his eyes widen. \ +~Wilbur -- why, that's my great nephew!~ He takes the paper and \ +reads. ~So true, so true,~ he mumbles and smiles. ~A fine boy, \ +perhaps he'll become a great man someday, if he stops skipping class. \ +He reminds me of my days at Tech -- all filled with dreams and hopes.~ \ +He pauses, and searches his pockets. ~I even perfected a spell, did \ +you know? Good old loyal, boring Frobar perfected a spell, and, \ +if it hadn't been for that Snaboz show-off who had to go and perfect the \ +izyuk spell, I might have even tried to publish mine.~ He finds a \ +scroll amongst his robes and hands it to you. ~You don't believe me? Here, \ +see for yourself.~"; +]; + +Object Thief "thief" Delbins + with name "thief" "character" "gentleman", + number 1, + initial [; + if (self in Delbins) + "There's a gentleman dressed in black sitting at the \ +bar, his eyes riveted to the glass of ale."; + ], + description "A lean crafty-looking individual, dressed mostly \ +in black. He seems a bit too scruffy to be a nobleman, but also \ +a bit too distinguished to be a common thug. Probably a thief, I'd \ +guess.", + life [; + Attack, ThrowAt: + "You make a threatening move, but the thief seems to \ +move twice as fast! You find yourself looking at the sharp end \ +of a stiletto. ~I'm too much of a gentleman to harm a Priest,~ \ +the thief says, ~so don't force me to make an exception.~"; + Answer: + if (special_word == 'hello') + "The gentleman gives a sharp nod in your direction."; + Ask: + if (second == 'magistrate') +"The thief gives you a knowing nod. ~The Aragain magistrate? \ +A honorless cur, if I ever saw one.~"; + if (second == 'painting') +"The thief shrugs. ~I hear there's a nice new painting on \ +exhibit at the royal museum. You might want to check it out.~"; + if (second == 'lock' or 'locks') +"The thief shrugs. ~Do I look like a locksmith?~"; + + Give: + if (noun has is_coin || noun==trophy) { + move noun to Thief; + "Confused, the thief pockets your offering. \ +~Quite generous of you, sir.~ he says."; + } + + default: "The gentleman glances at you with \ +dark suspicious eyes."; + ], + before [; + Cast: + "You speak the chant perfectly, but nothing \ +seems to happen! The gentleman smiles and pats his dark cloak, \ +which seems to glow briefly with mystic energy, then fade!"; + ], + has animate; + +Object thief_cloak "dark cloak" Thief + with name "dark" "cloak", + description "A coal-black cloak, which blends into \ +the surrounding shadows.", +before [; + Cast: + "You speak the chant perfectly, but nothing \ +seems to happen! The gentleman smiles and pats his dark cloak, \ +which seems to glow briefly with mystic energy, then fade!"; + ], +has clothing; + +Object Delbin "Delbin" Delbins + with name "Delbin" "bartender" "owner", + number 1, + initial "Delbin himself is standing behind the bar.", + description "Delbin is a stout bald fellow with laughing eyes and \ +a heavy beard. He somehow seems both young and old at the same \ +time.", + each_turn [ ; + if (random(20) == 1) + "^Delbin cleans some glasses behind the bar."; + ], + react_after [; + Take: + if (noun == headdress) + "~You're welcome to that unsightly thing, sir. \ +Been trying to get rid of it for sometime.~"; + if (noun == rag) + "Delbin give you a curious look, \ +but says nothing."; + ], + life + [ i ; + Attack, Kiss, ThrowAt: "Leave good old Delbin alone."; + Answer: + if (special_word == 'hello') + "~Welcome to Delbin's, good sir.~"; + Give: + if (noun has is_coin) { + print "Delbin refuses your offering. \ +~Keep your change, sir. If you're looking for a good tip, \ +I can tell you what I hear.~^^"; + <>; + } + if (noun == rag) { +move rag to bar; +"Delbin takes the rag and cleans a spot on the bar, leaving \ +it in a familiar place."; + } + "Delbin politely refuses."; + Show: + if (noun == headdress) +"~There's a good story behind that ugly thing. Maybe if you \ +keep reminding me, I'll remember it.~"; + print "~A nice ", (name) noun; + " you've got yourself there.~"; + Ask: + if (second == 'ale' or 'situation') { + if (Morgan in Delbins) + "~Quite a situation we've got sir. Those three at \ +the front of the bar all ordered a glass of Special Borphee Ale. Well, \ +with the shutdown of the Brewers Guild in Borphee since the Great \ +Change, I can't keep that particular beverage in stock, but I've got \ +that one left there. Seems none of them's leaving until they decide \ +who gets the ale -- and let me tell you, those three are folks who \ +don't like to be disappointed!~"; + "Delbin smiles. ~All out of ale sir. But I suppose \ +ye already knew that?~"; + } + if (second == 'rod') + "Delbin shrugs. ~Sounds vaguely familiar sir, \ +maybe I heard a rumor about it once. Can't really say, though.~"; + if (second == 'headdress') +"~There's a good story behind that ugly thing. Maybe if you \ +keep reminding me, I'll remember it.~"; + if (second == 'rag') +"~Not much more than a rag, sir.~"; + if (second == 'minirva') + "~I think that's the name of some old \ +Antharian Sea Goddess. Like a patron saint to sailors, in \ +the old days.~"; + if (second == 'morgan' or 'warrior' or 'ranger') + "~Morgan Grueslayer's a skilled ranger.~"; + if (second == 'frobar' or 'wizard' or 'enchanter') + "~Frobar's probably one of the last \ +enchanters around. He's a regular here.~"; + if (second == 'thief' or 'gentleman') + "~Don't really know that fellow's name. \ +He tips well, though.~"; + if (second == 'rumor' or 'rumors' or 'story') { + i = random(7); + print "Delbin scratches his ear and says, \ +~Yes, now, what did I hear...~^^"; + if (i==1) + "~People tell me this new Flathead king is \ +a fake, plain and simple. Hasn't stopped people from trying to \ +get on his good side, though. Now, I haven't seen the fellow \ +myself, but if you ask me, somebody somewhere is up to no good.~"; + if (i==2) + "~They say the kobold war up north is gonna \ +end real soon. I'll believe that when it happens.~"; + if (i==3) { + print "~Oh, this one's a good one."; + if (headdress in Delbins) + print " You see that headdress over there? \ +Well, this explorer fellow left it here, along with quite a story. \ +He"; +else print " Some explorer fellow"; +" claimed he found some lost ancient city in the Miznia \ +jungles. Said he made a map to the place, but lost it when bargaining \ +for his life with some jungle natives. I just nodded and let \ +the poor man talk.~"; + } + if (i==4) + "~This crazy-looking old fellow stops in \ +the other day. Said that he was a professor, at GUE Tech, but \ +that he was giving that all up! Something about his \ +research going bad, on something he called 'an ethereal gate'. \ +What all of that means, I can't say.~"; + if (i==5) + "~Say, you sorta remind me of this other Priest \ +fellow who stopped by here a long long time ago. Delbin \ +never forgets, you know? This fellow, who didn't give a name, \ +told me he was on an important \ +quest for something called -- now what was it -- 'The \ +Rod of the Ancients', or something like that. That \ +mean anything to you?~"; + if (i==6) { + print "~An artist friend of mine tells me that \ +this new Leonardo Flathead painting they've recently discovered \ +on display at the Royal Museum has a special secret. They \ +say that Leonardo painted over something else under the canvas, but no one's \ +saying what. They're keeping a watchful eye on it too, just \ +in case curiosity gets the better of some folk. In fact, \ +I hear they've already had a few people trying to steal the \ +thing"; + if (Thief in Delbins) + "!~ The thief suddenly starts to cough, and controls himself."; + else "!~"; + } + ! Add further rumors here... + "Delbin shrugs. ~Guess I'm getting old, \ +nothing comes to mind at the moment. Maybe if you \ +give me a moment, I'll think of something.~"; + } + ], + before [; + Cast: +if (the_spell_was == foblub_spell) + "You relate a fine sermon to Delbin about spirits -- \ +both the liquid kind and the not-so-liquid kind. Were \ +Delbin sitting rather than standing behind the bar, \ +he might even be glued to his seat by now. ~A fine \ +speech there, reverend.~"; +if (the_spell_was == espnis_spell) + "You relate a dull sermon to Delbin about the various \ +types of wood casks used in brewing Mithicus beer. \ +Delbin, being a bartender, is a good listener, and \ +manages to stay awake."; + ], + has animate proper; + +! **************** +! spells/scrolls +! **************** + +Object musty_scroll "musty scroll" telescope + class scroll_class, + with name "musty", +; + +Object fiznav_spell "make boat sea-worthy" musty_scroll + class spell_class, + with name "fiznav", + magic [; + if (second has animate) + "Your chant goes unanswered. It's not intended for \ + living creatures."; + else + "Your chant goes unanswered. It's intended for boats apparently."; + ], +; + +Object pale_scroll "pale scroll" + class scroll_class, + with name "pale", +; + +Object shazok_spell "call lightning from storm" pale_scroll + class spell_class, + with name "shazok", + magic [; + if (second==0 && location==GURTH_Forest) { + <>; + } + "Your chant goes unanswered. You need a genuine \ +natural storm, I suppose."; + ], +; + +Object glossy_scroll "glossy scroll" Frobar + class scroll_class, + with name "glossy" +; + +Object feeyuk_spell "allow creature to resist gravity" glossy_scroll + class spell_class + with name "feeyuk", + magic [; + if ((second == 0) || (second hasnt animate)) + "The chant backfires, and your feet feel numb!"; + if (second == player) { + has_resist_gravity = 1; + StartTimer(self,75); + "You speak the chant in clear tones. Initially, you \ +feel no different. And then, strangely, your back feels better \ +than it has in years, and your step seems lighter!"; + } + CDefArt(second); + " is no doubt thankful for the power to resist gravity."; + ], + time_left 0, + time_out [; + has_resist_gravity = 0; + "You feet feel heavy again."; + ], +; + +! ********** +! Misc objects +! ********** + +Object trophy "trophy" + with name "trophy", + description "A lovely gold and platinum grail-like trophy that looks \ + very antique. The letter ~D~ is inscribed on the side. \ + You notice three odd bumps on the bottom of the circular base.", + !weight 20, + size 8, +! capacity 1, +! before [; +! Receive: +! if (noun hasnt is_sphere) +! "That doesn't seem to fit."; +! ! else fancy light tricks +! ], + has scored; +! container open transparent; + +Object win_bag "bag" + with name "bag", + description "A small cloth bag.", + capacity 50, + !weight 10, + size 15, + has container open; + +Object c20 "coin" win_bag class coin_class; +Object c21 "coin" win_bag class coin_class; +Object c22 "coin" win_bag class coin_class; +Object c23 "coin" win_bag class coin_class; +Object c24 "coin" win_bag class coin_class; +Object c25 "coin" win_bag class coin_class; +Object c26 "coin" win_bag class coin_class; +Object c27 "coin" win_bag class coin_class; +Object c28 "coin" win_bag class coin_class; +Object c29 "coin" win_bag class coin_class; +!Object c30 "coin" win_bag class coin_class; + + diff --git a/src/aragain.inf b/src/aragain.inf new file mode 100644 index 0000000..9c80e1a --- /dev/null +++ b/src/aragain.inf @@ -0,0 +1,1642 @@ + +! ******************************************************************* +! ARAGIN.INF +! -- Add-on for SPIRITWRAK (don't use alone!) +! for Aragain city, royal grounds, possibly Barsap's Gambit +! ******************************************************************* + + +Object ARAGAIN_GUSStop "Aragain North" + with description "You are just north of the newly \ +built Aragain City. The general vicinity \ +is busy with important-looking people. \ +A stairway goes down here, \ +while a large walkway heads south into Aragain.", + name "people" "stairway" "walkway", + d_to ARAGAIN_GUSStation, + s_to ARAGAIN_Entrance, + has light; + +Object ARAGAIN_Entrance "Aragain Entrance" + with description "Before you is a truly astounding sight. \ +A huge metal gate to the south blocks the entrance into the newly \ +built Aragain Royal Grounds. Worse yet, a seemingly \ +endless line of people stands before the gate. \ +They look like dignitaries, diplomats, or \ +just plain politicians. A walkway heads north.", + name "walkway" "pastries", + n_to ARAGAIN_GUSStop, + s_to ARAGAIN_Entrance_gate, + cant_go "The only interesting place seems to be past \ + that gate.", + has light; + +Nearby line1 "line" + with name "line" "people" "dignitaries" "diplomats" "politicians", + description "A god-awful line of well-dressed people. You \ + notice that many of them are holding what appear \ + to be round pastries of some sort.", + life [; +default: "No one in the line seems to be paying you any attention."; + ], + before [; + Cast: + if (the_spell_was == espnis_spell) +"A few people doze off as you canvass the line. They are \ +quickly replaced by others."; + ], + has animate concealed; + +Object gate_sign "large sign" ARAGAIN_Entrance + with initial "There is a large sign bolted to the gate.", + name "sign" "large", + description [; + print "The sign reads:^^\ +~WELCOME TO ARAGAIN!^^\ +As today (and everyday henceforth) has been decreed \ +his royal lordship's birthday, we request that all \ +visitors respect good king Sydney Flathead's wishes \ +and present a cake appropriate for the occasion before \ +entering."; + if (self hasnt general) { + give self general; +"~^^Well, that's odd. If memory and Brother \ +TuffBerry's Quendor History lessons serve, the \ +Flathead family died off more than a hundred years \ +ago."; + } + else "~"; + ], + has static; + + +Object ARAGAIN_Entrance_gate "huge entrance gate" ARAGAIN_Entrance + with name "gate" "entrance", + description "A solid steel gate, probably 40 feet tall, \ +complete with spikes at the top and close-set bars.", + door_dir [; + if (self in ARAGAIN_Entrance) + return s_to; + else return n_to; + ], + door_to [; + if (self in ARAGAIN_Entrance) + return ARAGAIN_Courtyard; + else return ARAGAIN_Entrance; + ], + found_in ARAGAIN_Entrance ARAGAIN_Courtyard, + when_open "The massive gate is open.", + when_closed "The massive gate is closed.", + before [; + Open, Push, Pull: + if (Entrance_guardian hasnt general) + "The guard shoves you away as you approach the gate. \ + He points at the sign. ~No cake, no castle.~"; + Close: + "It must weigh a ton, you can't seem to move it."; + ], + has static door openable locked; + +Object ARAGAIN_Courtyard "Courtyard" + with description "You're standing in a lovely courtyard with \ +magnificent topiary designs and real marble walkways. A large \ +gate stands to the north. To the east is a red stone building \ +with spires and columns. To the west is a large flat stone \ +building. To the south is a huge entranceway into what must \ +be the new Royal Palace, which appears to be carved out of the \ +face of a massive mountain.", + name "marble" "walkway" "red" "spires" "columns" "flat" +"entranceway" "mountain" "Palace", + n_to ARAGAIN_Entrance_gate, + e_to ARAGAIN_Museum, + w_to ARAGAIN_Gambit, + s_to ARAGAIN_Palace, +has light; + +Nearby topiary "topiary" + with name "topiary", + description "Cleverly abused shrubs in the shape of giant \ +crowns.", + has scenery; + +! -- The (rather empty) Royal Museum + +Object ARAGAIN_Museum "Royal Museum" + with description "You're in the entrance to a museum. The \ +lighting is rather dim, throwing light shadows all over the \ +walls. There are exhibit rooms to the north and south, or \ +an exit west.", + name "lighting" "shadows", + w_to ARAGAIN_Courtyard, + n_to Museum_north, + s_to Museum_south, + has light; + +Object Museum_north "North Exhibit Room" + with description "You are in a small exhibit room designed with \ +dark wood floors and plaster-on-stucco walls. The room is dimly lit by \ +hidden lamps or torches behind recessed wall niches. \ +The exit is south.", + name "wood" "plaster" "stucco" "lamps" "torches" "niches", + s_to ARAGAIN_Museum, + each_turn [; + if ((glass_wall in self) && (Thief notin Delbins)) { + if (random(10) == 2 or 7) + "^You get the odd feeling that there's someone behind \ +you, but when you turn around, you see no one!"; + } + ], + before [; + Cast: +if (the_spell_was == huncho_spell or luncho_spell) +"From nearby, a museum curator walks up and abruptly \ +stops your chant. ~Please don't disturb the other patrons,~ \ +he says and walks off. There doesn't seem to be anyone else \ +around, however."; + Blow: + if ((noun == whistle) && (glass_wall in self)) { + remove glass_wall; + print "You produce an extremely high-pitched noise. \ +Suddenly, to the north, a near-invisible wall of glass shatters \ +into a million little shards"; + if (Thief notin Delbins) { + move Painting_REAL to THIEF_Storeroom; + Painting_REAL.initial = nothing; + move magic_door to Museum_north; + "!^^From out of the shadows, a man dressed \ +in black appears! He performs a half-bow in your direction \ +before deftly prying the painting off the wall! ~I'm a great \ +appreciator of the arts, you understand,~ he says, as with a quick \ +twist of his cape, he melds into the shadows and disappears \ +with the painting!^^As you reflect on the thief's actions, \ +you can't help but notice that he apparently dropped something \ +while making his dramatic exit."; + } + else "!"; +! -- guards always come and move player to jail room ? +! -- if thief still in delbins, attempt to get painting is \ +! trapped below, player CANT TAKE IT (as a priest) + } + ], + has light; + +Nearby glass_wall "glass wall" + with name "wall" "glass", + description "Yes, there's a glass wall covering the \ +north wall, all right. It's exceptionally smooth and transparent.", + before [; + Attack: + "Your blows have no effect, it must be quite thick."; + ], + has static concealed; + +Object Painting_REAL "priceless painting" Museum_north + with name "painting", + short_name "priceless painting", + plural "priceless paintings", + initial "There is a priceless painting hanging on the north wall.", + description "It's a beautiful oil painting of a dark stormy \ +scene. On the horizon, you can see the edges of mountaintops. Near \ +the top of the painting, two winged figures are carrying a lone \ +individual towards a break in the clouds, where a bright white light \ +seems to emanate.", + size 25, + before [; + Take, Pull, Push, Turn, Attack, Rub, Cut, Touch, Search: + if (self in Museum_north) { + if (glass_wall in Museum_north) + "As you get close to the painting, you find yourself stopped by a \ +nearly-invisible glass wall!"; + else { + if (action == ##Search) + "You notice a slightly loose part \ +of the canvas in one corner, but the painting is apparently \ +bonded to the wall, which limits your investigation."; + if (action ~= ##Touch) + "You can't seem to move the painting at all. \ +It's somehow bonded to the museum wall!"; + } + } + else { + if ((action == ##Take) && (self in THIEF_Storeroom) && + (Painting_FAKE in THIEF_Storeroom)) + "They both look so genuine! You can't decide!"; + if (action == ##Search) { + if ((self in THIEF_Storeroom) && + (Painting_FAKE in THIEF_Storeroom)) + "Search which one? Goodness, you can't decide!"; + if (self hasnt general) { + give self general; + move white_scroll to player; + "You notice a slightly loose part \ +of the canvas in one corner. You carefully peel back a part of the \ +canvas from the back and reveal a hidden scroll!"; + } + } + } + Drop: + if (location == Museum_north) { + ! player returned painting to museum, give him a reward + move c4 to player; + move self to Museum_north; + "A museum curator appears and graciously takes the \ +painting. ~Thank you for recovering this priceless work.~ He \ +gives you a coin. ~The reward. We've been a little short on funds \ +lately.~ The curator somehow attaches the painting to the north wall, \ +and leaves."; + } + ], +; + +Object c4 "coin" class coin_class; + +Object Painting_plaque "plaque" Museum_north + with name "plaque", + initial [; +print "A metal plaque is attached to the wall"; +if (Painting_REAL in Museum_north) + " next to the painting."; +else "."; + ], + description "~ASCENDENCY~ Leonardo Flathead, 777 GUE", + before [; + Take, Pull, Push, Turn, Attack, Rub, Cut, Touch: + if ((self in Museum_north) && (glass_wall in Museum_north)) + "As you get close to the painting, you find yourself stopped by a \ +nearly-invisible glass wall!"; + ], + has static; + +Object Museum_south "South Exhibit Room" + with description "You are in a square exhibit room with \ +wood flooring and plain plaster walls. In the center of the \ +room is an exhibit platform made from a large slab of marble. \ +The room is lit brightly by hidden torches. The exit is north.", + name "wood" "plaster" "torches", + n_to ARAGAIN_Museum + has light; + +Nearby museum_dais "platform" + with name "platform" "slab" "marble", + description "It's a large flat slab of marble, polished \ +smooth, in the center of the floor.", + capacity 20, + has scenery supporter; + +Object TEMPLE_Artifact "flower vase" museum_dais + with name "artifact" "vase", + initial "There's an ancient wood vase sitting on the marble platform.", + description "An extremely narrow short wood vase, possibly for \ +holding long-stemmed flowers. It's clearly of ancient origin, well \ +preserved, with strange carvings and designs \ +of robed figures all over.", + capacity 1, + before [; + Receive: + if (noun hasnt is_rod) + "Strangely, it doesn't quite fit."; + LetGo: + if (self in TEMPLE_1_Opening) + "You can't reach the vase, much less the contents of the vase."; + ], + size 10, + has container open; + +! -- Okay maze-lovers, you asked for it -- Barsap's Gambit + +Object ARAGAIN_Gambit "Warm Room" + with description "You are in a long stone room, which is strangely \ +warm. In the very center of the room is a hole, with a ladder \ +down. An outdoor courtyard lies to the east.", + name "hole" "courtyard" "ladder", + e_to ARAGAIN_Courtyard, + d_to GAMBIT_11, + has light; + +Nearby Gambit_sign "large sign" + with initial "There is a large sign posted near the doorway.", + name "sign", + description "~Welcome to Barsap's Royal Gambit, a \ +delight to entertain all guests to the Aragain Royal Grounds. \ +Please consult your tourbook for rules and regulations regarding \ +this area. His highness, Sydney Flathead, and those in his \ +employ, cannot be held responsible for any accidents or minor +spills at this location.~", + has static; + +! (room names -- GAMBIT_XY, where X=level (1,2,3), Y=room #) + + +! ----------------------------------------------------- +! The all-important "CheckGambit" routine. Called by a +! room when a player attempts to move onto a beam. +! Various important things need to be passed... +! RETNS: 0 if cant go, 1 if player fell, 2 if can go +[ CheckGambit + i ! niche associated with dir player moving in + j ! niche directly below (if player falls) [0 if lev 3] + k ! 'level' currently on (1, 2 or 3) + m ! (local var) + ; + ! ** Step one -- check if there's even a beam there at all + if (children(i) == 0) + return 0; + ! ** Step two -- check if the beam is strong enough + m = child(i); + if (m.number == 99) ! (we have the 'wrong half') + m = child(i.counter_niche); + if (m.number <= 0) { + ! -- nope, beam breaks, we're about to fall + ! -- remove broken beam + remove child(i); remove child(i.counter_niche); + print "As you step onto the wood beam, it breaks with a \ +shuddering crack! "; + if (has_resist_gravity == 0) { + deadflag = 1; + print "You plummet quickly through the air, "; + switch (k) { + 1: print "pass by two levels of floating cubes and beams, "; + 2: print "pass by one level of floating cubes and beams, "; + } + print "and find the bottom of the chamber is filled with \ + red-hot lava..."; + return 1; + } + else { + ! -- player will float, but see if there's anything to float to... + print "Amazingly, you float downwards like a \ +feather, instead of falling to your death! "; + if (k==3) { ! (j==0) { on the bottom level + deadflag = 1; + print "Unfortunately, you float slowly down to \ +the bottom of the chamber, which is filled with red-hot lava."; + return 1; + } + print "You float down towards another network of floating \ +cubes and beams. "; + if (children(j) == 0) { ! no wood beam waiting + deadflag = 1; + print "You pass between two giant floating cubes, \ +similar to the ones you just left. Sadly, no wood beam seems \ +to connect these particular cubes, and you float downwards "; + if (k==1) + print "past yet another level of floating cubes and beams, "; + print "to a pit of hot lava."; + return 1; + } + print "You float to another wood beam and your feet \ +land on it, perfectly balanced! "; + m = child(j); + if (m.number == 99) ! (we have the 'wrong half') + m = child(j.counter_niche); + if (m.number <= 0) { + ! -- beam breaks (again!), player dies + ! -- remove broken beam + remove child(j); remove child(j.counter_niche); + print "Sadly, this wood beam also breaks! You \ +continue to float downwards "; + if (k==1) + print "past yet another level of floating cubes and beams "; + print "into a pit of hot lava."; + deadflag = 1; + return 1; + } + else { + print "^"; + ! -- beam is ok, decrement strength counter + m.number = m.number - 1; + ! -- MOVE PLAYER TO NEW BEAM + ! set-up new WN_TO and ES_TO + if (j.niche_dir == 3 or 4) { + WN_TO = parent(j); + ES_TO = parent(j.counter_niche); + } + else { + ES_TO = parent(j); + WN_TO = parent(j.counter_niche); + } + ! move to appropriate 'on beam' room + ! TODO update beam description.... + if (j.niche_dir == 2 or 4) { + if (k==1) + PlayerTo(GAMBIT_W21); + else + PlayerTo(GAMBIT_W31); + } + else { + if (k==1) + PlayerTo(GAMBIT_W22); + else + PlayerTo(GAMBIT_W32); + } + return 1; + } + } + } + else { + ! -- beam is ok, decrement strength counter + m.number = m.number - 1; + print "You step gingerly onto the wood beam...^"; + if (i.niche_dir == 3 or 4) { + WN_TO = parent(i); + ES_TO = parent(i.counter_niche); + } + else { + ES_TO = parent(i); + WN_TO = parent(i.counter_niche); + } + return 2; + } +]; +! ----------------------------------------------------- + + +Class Gambit_Room_Lev1_Class + with description "You are standing on a large floating white \ +stone cube in a very large underground chamber. The entire place is \ +dimly lit red from somewhere below.", + name "white" "stone" "cube" "chamber", + has light; + + +Object GAMBIT_11 "On Giant White Cube" + with description "As far as you can tell, you are standing on a \ +large white stone cube that somehow floats without visible supports in \ +a terrifyingly large underground chamber. The entire place is \ +dimly lit red from somewhere below. There is a ladder up to a hole \ +high in the ceiling here.", + name "white" "stone" "cube" "chamber" "ladder" "hole", + u_to ARAGAIN_Gambit, + w_to + [ i ; + i = CheckGambit(n112,n212,1); + if (i ~= 2) return i; + else return GAMBIT_W1; + ], + s_to + [ i ; + i = CheckGambit(n113,n213,1); + if (i ~= 2) return i; + else return GAMBIT_W2; + ], + has light; + +Object GAMBIT_12 "On Giant White Cube" + class Gambit_Room_Lev1_Class + with e_to + [ i ; + i = CheckGambit(n124,n224,1); + if (i ~= 2) return i; + else return GAMBIT_W1; + ], + w_to + [ i ; + i = CheckGambit(n122,n222,1); + if (i ~= 2) return i; + else return GAMBIT_W1; + ], + s_to + [ i ; + i = CheckGambit(n123,n223,1); + if (i ~= 2) return i; + else return GAMBIT_W2; + ], +; + +Object GAMBIT_13 "On Giant White Cube" + class Gambit_Room_Lev1_Class + with e_to + [ i ; + i = CheckGambit(n134,n234,1); + if (i ~= 2) return i; + else return GAMBIT_W1; + ], + s_to + [ i ; + i = CheckGambit(n133,n233,1); + if (i ~= 2) return i; + else return GAMBIT_W2; + ], +; + +Object GAMBIT_14 "On Giant White Cube" + class Gambit_Room_Lev1_Class + with w_to + [ i ; + i = CheckGambit(n142,n242,1); + if (i ~= 2) return i; + else return GAMBIT_W1; + ], + n_to + [ i ; + i = CheckGambit(n141,n241,1); + if (i ~= 2) return i; + else return GAMBIT_W2; + ], + s_to + [ i ; + i = CheckGambit(n143,n243,1); + if (i ~= 2) return i; + else return GAMBIT_W2; + ], +; + +Object GAMBIT_15 "On Giant White Cube" + class Gambit_Room_Lev1_Class + with e_to + [ i ; + i = CheckGambit(n154,n254,1); + if (i ~= 2) return i; + else return GAMBIT_W1; + ], + w_to + [ i ; + i = CheckGambit(n152,n252,1); + if (i ~= 2) return i; + else return GAMBIT_W1; + ], + n_to + [ i ; + i = CheckGambit(n151,n251,1); + if (i ~= 2) return i; + else return GAMBIT_W2; + ], + s_to + [ i ; + i = CheckGambit(n153,n253,1); + if (i ~= 2) return i; + else return GAMBIT_W2; + ], +; + +Object GAMBIT_16 "On Giant White Cube" + class Gambit_Room_Lev1_Class + with e_to + [ i ; + i = CheckGambit(n164,n264,1); + if (i ~= 2) return i; + else return GAMBIT_W1; + ], + n_to + [ i ; + i = CheckGambit(n161,n261,1); + if (i ~= 2) return i; + else return GAMBIT_W2; + ], + s_to + [ i ; + i = CheckGambit(n163,n263,1); + if (i ~= 2) return i; + else return GAMBIT_W2; + ], +; + +Object GAMBIT_17 "On Giant White Cube" + class Gambit_Room_Lev1_Class + with w_to + [ i ; + i = CheckGambit(n172,n272,1); + if (i ~= 2) return i; + else return GAMBIT_W1; + ], + n_to + [ i ; + i = CheckGambit(n171,n271,1); + if (i ~= 2) return i; + else return GAMBIT_W2; + ], +; + +Object GAMBIT_18 "On Giant White Cube" + class Gambit_Room_Lev1_Class + with w_to + [ i ; + i = CheckGambit(n182,n282,1); + if (i ~= 2) return i; + else return GAMBIT_W1; + ], + n_to + [ i ; + i = CheckGambit(n181,n281,1); + if (i ~= 2) return i; + else return GAMBIT_W2; + ], + e_to + [ i ; + i = CheckGambit(n184,n284,1); + if (i ~= 2) return i; + else return GAMBIT_W1; + ], +; + +Object GAMBIT_19 "On Giant White Cube" + class Gambit_Room_Lev1_Class + with e_to + [ i ; + i = CheckGambit(n194,n294,1); + if (i ~= 2) return i; + else return GAMBIT_W1; + ], + n_to + [ i ; + i = CheckGambit(n191,n291,1); + if (i ~= 2) return i; + else return GAMBIT_W2; + ], +; + + +! (level 1 niches) + +Object n112 "western niche" GAMBIT_11 + class niche_class + with name "western", + counter_niche n124, + niche_dir 2, ! 2 = on western edge of floor + ; +Object n113 "southern niche" GAMBIT_11 + class niche_class + with name "southern", + counter_niche n141, + niche_dir 3; + +Object n124 "eastern niche" GAMBIT_12 + class niche_class + with name "eastern", + counter_niche n112, + niche_dir 4; +Object n123 "southern niche" GAMBIT_12 + class niche_class + with name "southern", + counter_niche n151, + niche_dir 3; +Object n122 "western niche" GAMBIT_12 + class niche_class + with name "western", + counter_niche n134, + niche_dir 2; + +Object n134 "eastern niche" GAMBIT_13 + class niche_class + with name "eastern", + counter_niche n122, + niche_dir 4; +Object n133 "southern niche" GAMBIT_13 + class niche_class + with name "southern", + counter_niche n161, + niche_dir 3; + +Object n141 "northern niche" GAMBIT_14 + class niche_class + with name "northern", + counter_niche n113, + niche_dir 1; +Object n142 "western niche" GAMBIT_14 + class niche_class + with name "western", + counter_niche n154, + niche_dir 2; +Object n143 "southern niche" GAMBIT_14 + class niche_class + with name "southern", + counter_niche n171, + niche_dir 3; + +Object n151 "northern niche" GAMBIT_15 + class niche_class + with name "northern", + counter_niche n123, + niche_dir 1; +Object n154 "eastern niche" GAMBIT_15 + class niche_class + with name "eastern", + counter_niche n142, + niche_dir 4; +Object n152 "western niche" GAMBIT_15 + class niche_class + with name "western", + counter_niche n164, + niche_dir 2; +Object n153 "southern niche" GAMBIT_15 + class niche_class + with name "southern", + counter_niche n181, + niche_dir 3; + +Object n164 "eastern niche" GAMBIT_16 + class niche_class + with name "eastern", + counter_niche n152, + niche_dir 4; +Object n161 "northern niche" GAMBIT_16 + class niche_class + with name "northern", + counter_niche n133, + niche_dir 1; +Object n163 "southern niche" GAMBIT_16 + class niche_class + with name "southern", + counter_niche n191, + niche_dir 3; + +Object n171 "northern niche" GAMBIT_17 + class niche_class + with name "northern", + counter_niche n143, + niche_dir 1; +Object n172 "western niche" GAMBIT_17 + class niche_class + with name "western", + counter_niche n184, + niche_dir 2; + +Object n181 "northern niche" GAMBIT_18 + class niche_class + with name "northern", + counter_niche n153, + niche_dir 1; +Object n182 "western niche" GAMBIT_18 + class niche_class + with name "western", + counter_niche n194, + niche_dir 2; +Object n184 "eastern niche" GAMBIT_18 + class niche_class + with name "eastern", + counter_niche n172, + niche_dir 4; + +Object n191 "northern niche" GAMBIT_19 + class niche_class + with name "northern", + counter_niche n163, + niche_dir 1; +Object n194 "eastern niche" GAMBIT_19 + class niche_class + with name "eastern", + counter_niche n182, + niche_dir 4; + +! (level 1 initial wood beam layout) +! wood beam, as two 'halves' +! (the 'trick' here, is to devise a method of testing for the +! correct '.number', without having to constantly update +! both halves (which, when separated in niches, is impossible) +! Thus, one half will always have number=99, which indicates +! 'wrong half to test'. The other half, which is gained by +! checking child(self.counter_niche), has the useful .number + +! Object e11 "ebony beam" n112 class ebony_beam_class; +! Object e111 "ebony beam" n124 class ebony_beam_class with number 99; +Object e12 "ebony beam" n113 class ebony_beam_class; +Object e121 "ebony beam" n141 class ebony_beam_class with number 99; +Object e13 "ebony beam" n153 class ebony_beam_class; +Object e131 "ebony beam" n181 class ebony_beam_class with number 99; + +Object p11 "pine beam" n123 class pine_beam_class; +Object p111 "pine beam" n151 class pine_beam_class with number 99; +Object p12 "pine beam" n122 class pine_beam_class; +Object p121 "pine beam" n134 class pine_beam_class with number 99; +Object p13 "pine beam" n133 class pine_beam_class; +Object p131 "pine beam" n161 class pine_beam_class with number 99; +Object p14 "pine beam" n194 class pine_beam_class; +Object p141 "pine beam" n182 class pine_beam_class with number 99; +Object p15 "pine beam" n112 class pine_beam_class; +Object p151 "pine beam" n124 class pine_beam_class with number 99; + +! (side note: with balsa beams, 2nd side need not be 99, since +! it will always break on the first try, and the default number is 0 +Object b11 "balsa beam" n152 class balsa_beam_class; +Object b111 "balsa beam" n164 class balsa_beam_class; +Object b12 "balsa beam" n143 class balsa_beam_class; +Object b121 "balsa beam" n171 class balsa_beam_class; +Object b13 "balsa beam" n163 class balsa_beam_class; +Object b131 "balsa beam" n191 class balsa_beam_class; +Object b14 "balsa beam" n142 class balsa_beam_class; +Object b141 "balsa beam" n154 class balsa_beam_class; +Object b15 "balsa beam" n172 class balsa_beam_class; +Object b151 "balsa beam" n184 class balsa_beam_class; + + +! (remaining 2 levels in sep. files) +Include "gambit2.inf"; +Include "gambit3.inf"; + + +! tricky 'on beam' rooms -- only two for each level +! change description of fake_beam as appropriate +Object GAMBIT_W1 "On wood beam" + with description "You're walking along a very narrow wood beam that runs \ +east to west into darkness. Below, you can see the dark \ +silhouette of a network of beams and floating cubes. Much \ +farther below you can see a dull red glow.", + name "darkness" "network" "silhouette" "cubes" "glow", + w_to [; give self ~visited; return WN_TO; ], + e_to [; give self ~visited; return ES_TO; ], + before [; + Jump: + "There's barely enough room to walk, much less jump."; + Drop: + print "Dropping "; DefArt(noun); + print " will result in your losing both "; + DefArt(noun); + " and probably your balance."; + ], + has light; + +Object GAMBIT_W2 "On wood beam" + with description "You're walking along a very narrow wood beam that runs \ +north to south into darkness. Below, you can see the dark \ +silhouette of a network of beams and floating cubes. Much \ +farther below you can see a dull red glow.", + name "darkness" "network" "silhouette" "cubes" "glow", + n_to [; give self ~visited; return WN_TO; ], + s_to [; give self ~visited; return ES_TO; ], + before [; + Jump: + "There's barely enough room to walk, much less jump."; + Drop: + print "Dropping "; DefArt(noun); + print " will result in your losing both "; + DefArt(noun); + " and probably your balance."; + ], + has light; + +Object GAMBIT_W21 "On wood beam" + with description "You're walking along a very narrow wood beam that runs \ +east to west into darkness. Both above and below, you can see the dark \ +silhouette of a network of beams and floating cubes. \ +Farther below you can see a dull red glow.", + name "darkness" "network" "silhouette" "cubes" "glow", + w_to [; give self ~visited; return WN_TO; ], + e_to [; give self ~visited; return ES_TO; ], + before [; + Jump: + "There's barely enough room to walk, much less jump."; + Drop: + print "Dropping "; DefArt(noun); + print " will result in your losing both "; + DefArt(noun); + " and probably your balance."; + ], + has light; + +Object GAMBIT_W22 "On wood beam" + with description "You're walking along a very narrow wood beam that runs \ +north to south into darkness. Both above and below, you can see the dark \ +silhouette of a network of beams and floating cubes. \ +Farther below you can see a dull red glow.", + name "darkness" "network" "silhouette" "cubes" "glow", + n_to [; give self ~visited; return WN_TO; ], + s_to [; give self ~visited; return ES_TO; ], + before [; + Jump: + "There's barely enough room to walk, much less jump."; + Drop: + print "Dropping "; DefArt(noun); + print " will result in your losing both "; + DefArt(noun); + " and probably your balance."; + ], + has light; + +Object GAMBIT_W31 "On wood beam" + with description [; + print "You're walking along a very narrow wood beam that runs \ +east to west into darkness. Above you can see a network of floating beams \ +and cubes. Below you can see a red glow"; + if ((self hasnt general) && (GAMBIT_W32 hasnt general) && + (amulet has worn) && (ES_TO == GAMBIT_37)) { + give self general; + ".^^Your amulet suddenly gives off a bright flash, then fades!"; + } + else "."; +], + name "darkness" "network" "cubes" "glow", + w_to [; give self ~visited; return WN_TO; ], + e_to [; give self ~visited; return ES_TO; ], + before [; + Jump: + "There's barely enough room to walk, much less jump."; + Drop: + print "Dropping "; DefArt(noun); + print " will result in your losing both "; + DefArt(noun); + " and probably your balance."; + ], + has light; + +Object GAMBIT_W32 "On wood beam" + with description [; + print "You're walking along a very narrow wood beam that runs \ +north to south into darkness. Above you can see a network of floating beams \ +and cubes. Below you can see a red glow."; + if ((self hasnt general) && (GAMBIT_W31 hasnt general) && + (amulet has worn) && (ES_TO == GAMBIT_37)) { + give self general; + ".^^Your amulet suddenly gives off a bright flash, then fades!"; + } + else "."; + ], + name "darkness" "network" "cubes" "glow", + n_to [; give self ~visited; return WN_TO; ], + s_to [; give self ~visited; return ES_TO; ], + before [; + Jump: + "There's barely enough room to walk, much less jump."; + Drop: + print "Dropping "; DefArt(noun); + print " will result in your losing both "; + DefArt(noun); + " and probably your balance."; + ], + has light; + +Object fake_beam "wood beam" + with name "wood" "beam", + description "A long thin wood beam, barely wide enough for \ + both of your feet.", ! change as appropriate + before [; + Turn, Search, Rub, LookUnder, Attack, Take, Push, Pull: + "You'll have to show me how you intend to do \ +this, since you're standing on the wood beam."; + ], + found_in GAMBIT_W1 GAMBIT_W2 GAMBIT_W21 GAMBIT_W22 + GAMBIT_W31 GAMBIT_W32, + has scenery; + + + +! -- The Royal Palace, and its strange secret + +Object ARAGAIN_Palace "Palace Entrance Hall" + with description "A vast hall runs north and south \ +in this massive palace. Royal trappings decorate the walls \ +and ceiling, and red carpet lines the floor. \ +A tremendous open archway exits to the north into some \ +courtyard, while two open solid brass doors mark the \ +entrance south into some audience chamber. Two smaller \ +exits head east and west towards stairways up and down \ +respectively.", + name "trappings" "carpet" "archway" "courtyard" +"brass" "doors", + n_to ARAGAIN_Courtyard, + s_to Palace_Audience, + e_to Palace_office, + w_to Palace_Westwing, + u_to Palace_office, + d_to Palace_Westwing, + has light; + +Object Palace_Audience "Audience Hall" + with description "This is a giant audience hall, equivalent to \ +a large auditorium with a throne on the stage. The hall is \ +filled with luxurious decorations -- red carpeting, expensive \ +chandeliers, sweeping gold-edged drapery. The hall is also \ +currently filled with a large number of dignitaries and \ +important-looking people taking up all the seats. Open brass \ +doors lie to the north.", + name "carpeting" "chandeliers" "drapery" "seats" "brass" "doors", + n_to ARAGAIN_Palace, + has light; + +Nearby audience_people "people" + with name "people" "dignitaries" "diplomats", + description "Just your average throng of official-looking \ +people. Interestingly, many of them seem to be smeared \ +with flour.", + life [; + default: "The audience seems to be too busy waiting \ +for something interesting to happen."; + ], + before [; +Cast: + if (the_spell_was == foblub_spell) + "You give a marvelous sermon on patience. The audience \ +seems glued to their seats, which changes little."; + if (the_spell_was == espnis_spell) + "You give a rather overdone sermon on patience. A few \ +people in the back rows drop off to sleep."; + ], + has animate concealed; + +Object throne "throne" + with name "throne", + description "A large throne.", + before [; + Enter: "This is no time to be playing king."; + ], + has scenery enterable; + +Object Palace_office "Royal Bedroom" + with description "This might have once been a lavish bedroom \ +for royalty. At the moment, it seems like someone has converted \ +it into a private lounge of some sort. A stairway heads down.", + name "stairway", + d_to ARAGAIN_Palace, + has light; + +Object cab_key "shiny key" Gov_desk2 + with name "key" "shiny", + !weight 5, + size 5, + description "A shiny key.", +; + +Object Palace_cabinet "cabinet" Palace_office + with name "cabinet", + with_key cab_key, + description [; + print "A rather new-looking wooden cabinet"; + if (self has general) + ", with a bit of waxy build-up all over it."; + else "."; + ], + when_closed "A wooden cabinet stands against one wall, \ +clearly a new addition to the room.", + when_open [ x; + print "The wooden cabinet has been opened. "; + x = children(self); + if (x == 0) "It seems to be empty."; + print "It contains:^"; + ! if (x == 1) print "is "; else print "are:^"; + x = FULLINV_BIT + INDENT_BIT + NEWLINE_BIT + RECURSE_BIT; + WriteListFrom (child(self), x, 1); + rtrue; + ], + before [; + Cast: + if (the_spell_was == egdelp_spell) { + give self general; + "The cabinet is covered in waxy build-up."; + } + Open: + if ((self hasnt locked) && (self hasnt open)) { + print "You give the cabinet a good tug"; + if (self hasnt general) + ", but the \ +cabinet doors barely budge. The new-looking wood seems \ +to be rather tightly fitted."; + else { + give self open; + ". The wax makes the doors open with ease."; + } + } + ], + size 25, + capacity 20, + has static container openable lockable locked; + + +! (warped -- true story of the great battle) +Object p6 "warped parchment" Palace_cabinet + class parchment_class, + with name "warped", +description "~...truth. In fact, the truth too terrible to \ +believe, but believe it I must, for all the evidence I \ +have found indicates that the Ancient Ones went up against \ +the evil elementals and lost! With the Rod in hand, they \ +were defeated by trickery! The Rod was broken and \ +scattered into the world, but can be regained and rejoined \ +by any whose heart and spirit are pure! Did the \ +Ancient Ones forsake the spheres of...~"; + + +Object Palace_Westwing "Palace Dungeons" + with description "Dark and spooky, the palace dungeons seem \ +empty at the moment. The north portion of the room is sectioned-off \ +by iron bars that form a makeshift cell.", + n_to [; <>; ], + u_to ARAGAIN_Palace, + has light; + +Nearby prison_cell "prison cell" + with name "cell" "bars" "iron", + when_open [ x; + print "The cell stands open."; + x = children(self); + if (x == 0) { new_line; rtrue; } + print " Inside you notice:^"; + x = FULLINV_BIT + INDENT_BIT + NEWLINE_BIT + RECURSE_BIT; + WriteListFrom (child(self), x, 1); + rtrue; + ], + when_closed [ x; + print "The cell is closed."; + x = children(self); + if (x == 0) { new_line; rtrue; } + print " Inside you notice:^"; + x = FULLINV_BIT + INDENT_BIT + NEWLINE_BIT + RECURSE_BIT; + WriteListFrom (child(self), x, 1); + rtrue; + ], + description "A cramped space with a wall of iron bars.", + before [; + Cast: + if (the_spell_was == bekdab_spell) { + print "The bars seem to rust a bit"; + if (self has locked) { + give self ~locked; + ". You hear a lock mechanism in the cell door break!"; + } + else "."; + } + Go: + if ((noun == s_obj) && (player in prison_cell)) { + ; return 2; } + ], + size 50, + has static container openable transparent enterable; + + +! ***************** +! Creatures/people +! ***************** + +Object Entrance_guardian "Tough-looking Palace guard" ARAGAIN_Entrance + with name "guardian" "guard", + initial "A tough-looking palace guard is standing by the gate.", + description "Typical guard -- big, armed to the teeth, and a \ +sour disposition.", + before [; + Cast: + "The guard stops you in mid-chant by blowing a rather \ +shrill whistle. ~None of that priest mumbo-jumbo on \ +my watch!.~"; + ], + react_before [; + Blow: + if (noun==whistle) +"The guard stops you as you are about to blow the whistle. \ +~I blow the whistles around here.~"; + ], + life + [ i ; + Attack, ThrowAt: + "I'd advise against this. He's probably knows 101 \ +ways to dismember an opponent. \ +Also, he's armed and encased in plate mail."; + Ask: + if ((noun == 'cake' or 'gate') && (self hasnt general)) + "~It's pretty simple. Give me a cake, and you get in. \ +That's the rules.~"; + Show: + if ((noun == Baking_Pan) && (cake in Baking_Pan)) + "~Well, hand it over already.~"; + Give: + ! Now for the fun... + if ((noun == Baking_Pan) && (cake notin Baking_Pan)) + "The guard looks at the pan, and hands it back. \ +~I don't see any cake. What are you, a wise guy or something?~"; + if ((noun == Baking_Pan) && (cake in Baking_Pan)) { + move Baking_Pan to Entrance_guardian; + print "The guard grabs the pan, and, to your \ +annoyance, cuts himself a massive slice of cake with his broadsword. \ +The guard takes a bite"; + ! 1st, check for strange foreign objects + objectloop (i in dough) { + if ((i ~= flour) && + (i ~= sugar_cube) && + (i ~= baking_powder) && + (i ~= corbie_egg) && + (i ~= dornberries) && + (i ~= butter)) { + if (i hasnt edible) { + print " and you hear a strange \ +'crunch'. He removes ", (a) i; " from his teeth. ~What's this?~ the \ +guard says, clearly angry. ~I oughta report you to the 'Better \ +Bakers Bureau'.~"; ! hopefully, this will break out of objectloop + } + else { + print ", and chews for a bit. \ +His eyes widen, and he spits the cake out. ~Hey pal, I taste ", (name) i; +" in this so-called cake of yours! Grues could've done a better job \ +than this!~"; + } + } + } + ! 2nd, check overall quality of cake + if (cake.number ~= 0) { + print ", and chews for a bit. \ +He frowns. ~Sorry pal, this doesn't pass inspection. "; + if (cake.number == 1) + "It could stand some more cooking.~"; + if (cake.number == 2) + "Did ya burn it or something?~"; + if (cake.number == 3) + "It'd make an okay pancake, though.~"; + if (cake.number == 4) + "It's hard as a rock!~"; + } + ! finally, check that all proper ingredients are there. + if ((butter in dough) && + (sugar_cube in dough) && + (corbie_egg in dough) && + (baking_powder in dough) && + (dornberries in dough) && + (flour in dough)) { + ! good cake + give self general; + give ARAGAIN_Entrance_gate open ~locked; + Achieved(4); + ", and smacks \ +his lips. ~Finally, someone who can bake an acceptable cake.~ \ +He unlocks and opens the gate. ~You can pass.~"; + } + else + ", and chews for a bit. He seems displeased. \ +~I don't know where you learned to bake, but there's definitely \ +something missing here.~"; + } + default: + "The guard is amazingly good at ignoring distractions."; + ], + each_turn [ i; + i = random(25); + if (i == 1) + "^A couple of dignitaries from Gurth push their way to the \ +front and present a flat object to the guard. The guard frowns. \ +~A fish cake? I don't think so.~ The dignitaries return to the line."; + if (i==3) + "^The guard paces back and forth."; + if (i==5) + "^A representative from Borphee steps up and presents \ +a pile of baked dough-bits on a plate to the guard. ~Frobolli cake, eh? \ +Well, this may be popular where you come from, but it ain't popular \ +here.~ The representative walks off."; + if (i==7) + "^The guard practices his menacing stares."; + if (i==8) + "^The guard blows his whistle at some people in line."; + if (i==9) + "^An official presents a nice morgia root pie to the \ +guard. ~A pie?~ the guard says, clearly exasperated. He points at \ +the sign as the official leaves. ~Cakes folks, we're taking C-A-K-E-S.~"; + if (i==11) + "^The guard polishes a spot on his armor."; + if (i==13) + "^Some dignitary presents the guard with a strange \ +green cake with the words ~EAT ME~ written in frosting. The guard smiles, \ +cuts himself a piece, and suddenly stuffs it into the dignitary's mouth! \ +~You boys are going to have to do better than that,~ he says to the +now tiny dignitary, who stalks off."; + if (i==15) + "^The guard hums a military dirge to himself."; + ], +has animate; + +! -- The evil magistrate +Object Magistrate "magistrate" Palace_Audience + with name "magistrate", + initial "There is a royal magistrate here.", + description "A rather nasty-looking thin tall fellow with an \ +evil grin.", + number 1, + life [; + Attack, ThrowAt: + magroutine1(1); rtrue; + Show: + if (noun==Gov_ledger && Sydney notin Palace_Audience) { + move Sydney to Palace_Audience; + remove Gov_ledger; + "The Magistrate grabs the ledger and \ +frowns as he reads it. ~Fine, you want a presentation?~ He grabs a \ +young boy who was hiding behind \ +the throne and shoves him forward. ~Presenting his royal \ +Highness, King Sydney Flathead, lost heir to the Flathead monarchy!~ \ +The crowd reaction is somewhat mixed. ~Well, his head does look \ +flat,~ you hear one person say."; + } + if (noun==cab_key) { + move cab_key to self; + "The magistrate moves with surprising speed and \ +takes the key. ~I was looking for that!~ he says."; + } + else "~Oh, very interesting.~ he says with heavy \ +sarcasm."; + Give: + if (noun==Gov_ledger && Sydney notin Palace_Audience) { + <>; + } + if (noun==cab_key) { + move cab_key to self; + "The magistrate takes the key. \ +~I was looking for that!~ he says."; + } + else "~I have no need for that!~ he says with a sneer."; + default: "The magistrate pays you absolutely no attention."; + ], + react_before [; + Cast: + if (the_spell_was ~= ledak_spell) { + magroutine1(2); rtrue; + } + ], + each_turn [ i ; + i = random(20); + if (Sydney in Palace_Audience) { + if (i==1) + "^A diplomat approaches the little boy with a \ + document. The Magistrate steps forward and \ + stops him. ~Sydney is much too busy to bother \ + with that.~ the Magistrate says."; + } + else { + if (i==5) + "^An impatient diplomat shouts out, \ + ~Bring out the King!~ The Magistrate smiles \ + and says, ~Did anyone make a petition for \ + a royal presentation?~ The crowd is silent. \ + ~I didn't think so.~"; + } + ], + has animate; + +! (a short code-space saving routine) +[ magroutine1 + w + ; + + ! remove player's possessions + while (child(player) ~= 0) { + give child(player) ~worn; + move child(player) to Palace_office; + } + if (w == 1) + print "You move quickly, but from nowhere, two royal palace \ +guards appear and wrestle you to the ground. ~Lock this \ +fanatic up!~ "; + if (w == 2) + print "You start to chant, but the magistrate has sharp \ +ears, and recognizes your magic! With a quick signal, \ +two royal palace guards appear and wrestle you to the ground. \ +~Lock this babbler up!~ "; +print "the Magistrate says with a sneer. The guards \ +strip you of your possessions and drag you down to the royal \ +dungeons.^"; + PlayerTo(prison_cell); + give prison_cell ~open locked; + rtrue; +]; + + + +Object Sydney "young child" + with name "child" "boy" "sydney", + ! describe "There is a young boy here", + description [; + print "A little boy dressed in uncomfortable-looking frilly clothes"; + if (flat_hat in self) + ". He's wearing a small red hat."; + else "."; + ], + before [; + Cast: + if (the_spell_was == foblub_spell or espnis_spell) +"The boy seems to miss the subtle nuances of your sermon. All \ +that happens is that now he seems even more nervous than before."; + ], + life + [; + Ask, Tell: + if (self has general) + "Young Sydney Flathead only tucks his head lower and whimpers."; + else + "Young Sydney Flathead only shrugs."; + Answer: + if (special_word=='hello' or 'hi') { + if (self hasnt general) + "Young Sydney Flathead doesn't respond -- he seems \ +to find you a bit frightening."; + else + "~Hello,~ the young lad says, somewhat shyly."; + } + "Young Sydney Flathead only stares at you."; + Attack, ThrowAt: + give self ~general; + deadflag = 1; + "The young boy screams in terror as you move to threaten him \ + (shame on you!). Several guards appear out of nowhere, and club \ + you to death for attempting regicide."; + Give: + if (noun==stuffed_toy) { + give self general; + move stuffed_toy to self; + "Tentatively, the boy takes the stuffed toy. You \ +catch the glimpse of a sad smile as he holds it tightly."; + } + "Young Sydney cowers and shakes his head."; + Order: + if (action==##Give) { + if (noun==flat_hat) { + if (self has general) { + remove Magistrate; + remove self; + move flat_hat to player; + move brown_sphere to player; + "Little Sydney smiles and removes the hat and \ +hands it to you. You notice his head is actually round, and the hat \ +was cleverly hiding this.^^\ +~He's no Flathead!~ someone in the audience hall yells out. A distinct \ +murmur of discontent rises from the crowd. The Magistrate slowly \ +backs away. ~Wait! I can explain!~ the Magistrate \ +starts, but soon runs screaming out of the hall, with several angry diplomats \ +hot on his heels!^^\ +~Thank you, kind sir,~ someone behind you says. You turn around. \ +Little Sydney is happily in the arms of a kindly-looking couple. The woman \ +continues. ~Our son was kidnaped, a little while ago. We've \ +been waiting here, hoping to get him back. You did a very brave thing.~ \ +The man steps forward holding some small object. \ +~A priest fellow, such as yourself, told me a long time \ +ago that one day, someone would help us in our time of need, and that \ +I should give him this.~ He gives you a strange round object. \ +~It's the least we can do.~ he says. The couple leaves the hall, \ +with the little boy laughing in their arms."; + } + else "Little Sydney shrinks back and holds on to his \ +hat. He stares at you fearfully."; + } + "Little Sydney shrinks back and stares at you fearfully."; + } + "Sydney shakes his head fretfully."; + ], + has animate transparent; + + + +! ***************** +! scrolls/spells +! ***************** + +Object crumpled_scroll "crumpled scroll" Palace_cabinet + class scroll_class, + with name "crumpled", +; + +Object ledak_spell "detect forgery" crumpled_scroll + class spell_class, + with name "ledak", + magic [; + if ((location==Palace_Audience) && + (Sydney in Palace_Audience) && + ((second == 0) || (second == Sydney))) { +"You notice a soft yellow glow around the young boy. \ +The glow fades."; + } + if (second==0) + "The place appears to be free of forgeries, at the \ +moment."; + else { + if (second==player) "You appear to be the geniune thing."; + CDefArt(second); + " appears to be the genuine thing."; + } + ], +; + +! **************** +! Misc objects +! **************** + +Object flat_hat "red hat" Sydney + with name "hat" "red", + description "A little red hat with no brim. It's unusually \ +flat at the top.", + before [; + Wear: + "It's too small for your head."; + ], + size 10, + has clothing; + +Object brown_sphere "brown sphere" + class sphere_class, + with name "brown", + description "A tiny perfect brown sphere, made of some strange \ +unknown metal.", +; + +! THIEF'S magic door +! Contains an unusual amount of properties... +Object magic_door "strange door" + with name "door" "strange", + !weight 20, + size 30, + description [; + print "A small door labeled ~STAIRS~, of all \ +things"; + if (self hasnt static) + ". Oddest of all is the fact that it isn't \ +attached to anything!"; + else "."; + ], + door_dir [; + if (self has static) { + if (location == Skyscraper) return e_to; + else return w_to; + } + ], + door_to [; + if (self has static) { + if (location == Skyscraper) return THIEF_Bottom_of_staircase; + else return Skyscraper; + } + ], + found_in [; + if (self has static) { + if (location == Skyscraper or THIEF_Bottom_of_staircase) + rtrue; + else rfalse; + } + ! else rtrue???? + ], + describe [; + ! we force a describe routine here, rather than use + ! when_open/closed due to the results that happen + ! after an obj has been moved (which the door will be). + if (self hasnt static) + "^There's an unattached door lying on the ground here."; + else { + if (self has open) { + print "^There's an open door to the"; + if (location == Skyscraper) + " east."; + else + " west."; + } + else { + print "^There's a closed door"; + if (location == Skyscraper) + " in the eastern wall."; + else + " to the west."; + } + } + ], + time_left 0, + time_out [; + ! after timeout -- Thief locks the door + give self ~open locked; + if ((location == THIEF_Bottom_of_staircase) || + (location == THIEF_Ent) || + (location == THIEF_Foyer) || + (location == THIEF_Lounge) || + (location == THIEF_Storeroom)) { + print "^Suddenly, out of the shadows springs a \ +gentleman dressed in black! ~How did you get in here!~ he \ +cries. Quicker than lightning, he envelopes you in his dark \ +cape, which seems to fade into shadows, leaving you in...^"; + PlayerTo(Skyscraper); + rtrue; + } + if (location == Skyscraper) + "^Out of the shadows, a gentleman dressed in \ +black appears! He sees the door to the east and seems \ +somewhat annoyed. ~Much too busy for unexpected guests,~ \ +you hear him say as he slips through the door and closes \ +it behind him. Moments later you hear the sound of a lock \ +closing on the other side.^"; + ], + before [; + Enter: + if (self has static) { + if (location == Skyscraper) <>; + else <>; + } + else + "Since the door doesn't currently lead anywhere, \ +entering it seems pointless."; + Open: + if (self hasnt static) + "The door opens onto...thin air. Without a \ +doorway to attach to, it's not terribly useful, it appears."; + if ((self has static) && (self hasnt open) && + (self hasnt general)) { + give self general; + give self open; + StartTimer(magic_door,15); + "The door opens. There's a dark chamber \ +on the other side, which seems all but impossible, given \ +that the wall previously appeared solid!"; + } + Close: + if (self hasnt static) + "You close the door, which at this moment \ +means you turn the movable door to a new angle. Without a \ +doorway to attach to, it's not terribly useful, it seems."; + Drop: + if (location == Skyscraper) { + move self to Skyscraper; + give self static; + Skyscraper.e_to = magic_door; + THIEF_Bottom_of_staircase.w_to = magic_door; + "As you drop the door, it leaps off the ground \ +and flies towards the eastern wall! Amazingly, it seems to \ +attach itself to the eastern wall!"; + } + ], + has door openable; + + 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.", +; diff --git a/src/frostham.inf b/src/frostham.inf new file mode 100644 index 0000000..691db7e --- /dev/null +++ b/src/frostham.inf @@ -0,0 +1,1162 @@ + +! ************************************************************** +! frostham.inf +! ------------ +! Frostham locations in SPIRITWRAK, included in spirit.inf +! (Do not compile and/or use separately!) +! ************************************************************** + +Object FROSTHAM_Outskirts "Frostham Outskirts" + with description [; + print "You are at the northern outskirts of Frostham. \ +The city proper is to the south. A few \ +snow covered residences are nearby. \ +A trail leads into a valley to the north"; + if (self hasnt general) { + give self general; + ".^^The last time you saw Frostham was before you \ +entered the Monastery -- many years ago at least. \ +Oddly, it seemed bigger and less desolate then."; + } + else "."; + ], + name "city" "snow" "residences" "trail" "valley", + n_to Valley_trail, + s_to FROSTHAM_2, + cant_go "You walk around the local area a bit, finding \ + nothing of interest.", + has light; + +Object FROSTHAM_2 "Frostham" + with description "You are in Frostham City, the famous winter-\ +lover's haven. The once booming ski vacation spot seems \ +to be a bit more run-down than in times past. \ +The city thins out towards the north, while \ +another section of town is to the south. To the west is \ +a large wood structure. To the southwest is a small \ +building. To the southeast is another small building, possibly a \ +store.", + name "wood" "structure" "building" "store", + n_to FROSTHAM_Outskirts, + w_to FROSTHAM_Resort, + sw_to FROSTHAM_Governer1, + s_to FROSTHAM_GUSStop, + se_to FROSTHAM_Store, + cant_go "You walk around the local streets a bit, finding \ + nothing of interest.", + each_turn [ i ; + if (GROC_hall1 has general) + i = CheckHall(); +! Why check the grocery hallway here? +! Conceptually, if the player dies in the hallway (rather +! difficult, but possible by swearing, for example), +! the hallway should 'adjust' itself to the new weight. +! I simply check this here, because the player must go +! this way to reach the hallway for a second time. + ], + has light; + +Object FROSTHAM_Store "General Store" + with description [; +print "This appears to be a small grocery store, \ +strangely abandoned at the moment. Shelves line the walls, \ +although, since no one is minding \ +the store, the current stock seems to be a bit depleted. \ +You notice an exit south marked ~EMPLOYEES ONLY~ that \ +appears to lead to "; +if (GROC_hall1.number == 1) +print "some hallway."; +else +print "a dark hole."; +" The way back out is to the northwest."; +], + name "stock" "shelves", + nw_to FROSTHAM_2, + s_to [; +if (GROC_hall1.number == 1) return GROC_hall1; +else + "You pull back before falling into what appears to be a deep \ +pit of some sort beyond the south exit."; +], + after [ i ; + Go: + if (noun == n_obj) { + i = CheckHall(); + if (i == 1) + print "You hear a grinding noise from behind \ +you.^"; + } + ], + has light; + +Class Barrel_class + with name "crate", + before [; + Take, Pull, Turn: "It's rather heavy."; + Push: "It's heavy, but you manage to make it slide \ +along the floor a bit."; + PushDir: +if (location == FROSTHAM_Store && second == nw_obj) + "A portion of the door seal blocks the crate from going outside."; +if (location == GROC_hall1 && second == s_obj) { + print "^You give the crate a good shove.^"; + move self to GROC_hall2; + <>; +} +if (location == GROC_hall1 && second == n_obj) { + print "^You give the crate a good shove.^"; + move self to FROSTHAM_Store; + <>; +} +if (location == GROC_hall2 && second == n_obj) { + print "^You give the crate a good shove.^"; + move self to GROC_hall1; + <>; +} +if (location == FROSTHAM_Store && second == s_obj && GROC_hall1.number == 1) { + print "^You give the crate a good shove.^"; + move self to GROC_hall1; + <>; +} +! (we do our own version to allow the CheckHall() to +! work properly) +AllowPushDir(); rtrue; + ], + has static; + +Object BARREL1 "dusty crate" FROSTHAM_Store + class Barrel_class, + with name "dusty", + description "A dust-covered crate.", +; +Object BARREL2 "moldy crate" FROSTHAM_Store + class Barrel_class, + with name "moldy", + description "A mold-covered crate.", +; +Object BARREL3 "filthy crate" FROSTHAM_Store + class Barrel_class, + with name "filthy", + description "A filth-covered crate.", +; + +Object GROC_hall1 "North end of Hallway" + with name "end" "hallway", + number 1, + description [; + print "You're at the north end of a short N-S hall. \ +The hallway"; + switch (GROC_hall1.number) { + 1: print " slopes sharply upwards to the south. \ +You notice two dark doorways above you along the northern wall, \ +one above the other, \ +but no obvious means of getting to them"; + 2: print " travels evenly to the south. \ +You notice a dark doorway above you along the northern wall, \ +but no obvious means of getting to it"; + 3: print " slopes sharply downwards to the south"; + } + ". To the north is an exit."; +], + each_turn [; + if (self hasnt general) { + give self general; + "^The hallway suddenly creaks underfoot! The floor \ +shakes briefly and dust seems to rise from cracks near the \ +walls. Apparently, your unexpected presence has jarred \ +some old mechanisms back to life!"; + } + ], + n_to [; +switch (GROC_hall1.number) { + 1: return FROSTHAM_Store; + 2: return GROC_stockroom; + 3: return GROC_attic; +} + ], + after [ i ; + Go: + if (noun == n_obj or s_obj) { + i = CheckHall(); + if (i == 2) +print "^You hear a low grinding noise. \ +The hallway underfoot suddenly shifts and drops!^"; + } + ], + s_to GROC_hall2, + before [; + Jump: "You jump for a bit. The floor feels strangely \ +unsteady."; + ], + has light; + + +Object GROC_hall2 "South end of Hallway" + with name "end" "hallway", + number 3, + description [; + print "You're at the south end of a short N-S hall \ +that seems to lead nowhere. The hallway"; + switch (GROC_hall2.number) { + 1: " slopes sharply upwards to the north."; + 2: " travels evenly to the north."; + 3: " slopes sharply downwards to the north."; + } + ], + after [ i ; + Go: + if (noun == s_obj) { + i = CheckHall(); + if (i == 1) +print "^You hear a low grinding noise. \ +The hallway underfoot suddenly shifts and drops!^"; + } + ], + before [; + Jump: "You jump for a bit. The floor feels strangely \ +unsteady."; + ], + n_to GROC_hall1, + has light; + +! (Routine for checking 'weights' of two sides of hallway) +! (assumes called from room's _after_ routine, thus all +! barrels and players are in their after_turn places) +! RETURNS: 0 if no change +! 1 if NORTH END now higher than before +! 2 if NORTH END now lower than before +[ CheckHall + i ! local total of weight points for north end + j ! local total of weight points for south end + k ! local -- orig setting of north end (.number) + ; + i = 0; j = 0; + k = GROC_hall1.number; + if (player in GROC_hall1) + i = i + 2; + if (player in GROC_hall2) + j = j + 2; + if (BARREL1 in GROC_hall1) i = i + 1; + if (BARREL1 in GROC_hall2) j = j + 1; + if (BARREL2 in GROC_hall1) i = i + 1; + if (BARREL2 in GROC_hall2) j = j + 1; + if (BARREL3 in GROC_hall1) i = i + 1; + if (BARREL3 in GROC_hall2) j = j + 1; + if (i == j) { + GROC_hall1.number = 2; + GROC_hall2.number = 2; + } + if (i > j) { + GROC_hall1.number = 1; + GROC_hall2.number = 3; + } + if (i < j) { + GROC_hall1.number = 3; + GROC_hall2.number = 1; + } + if (GROC_hall1.number == k) + return 0; + if (GROC_hall1.number > k) + return 1; + if (GROC_hall1.number < k) + return 2; +]; + + +Object GROC_stockroom "Stockroom" + with description [; +print "This is a tiny poorly lit room, that \ +is covered in dust. An exit south leads to a"; +if (GROC_hall1.number == 2) print " short hallway"; +else print " dark hole"; +if (GROC_attic has general) + print ". Above, a hole has been exposed in the ceiling structure"; +"."; + ], + name "dust", + u_to [; if (GROC_attic hasnt general) +"You can't go that way."; + else return GROC_attic; + ], + s_to [; +if (GROC_hall1.number == 2) return GROC_hall1; +else + "You pull back before falling into what appears to be a deep \ +pit of some sort beyond the south exit."; + ], + after [ i ; + Go: + if (noun == n_obj) { + i = CheckHall(); + if (i == 2 or 1) + print "You hear a low grinding noise behind you.^"; + } + ], + has light; + +Object GROC_attic "Attic" + with description [; +print "This is an exceptionally cramped attic, obviously \ +unused for some time. The floorboards are starting to crack."; +if (self has general) + print " One section of the floor is particularly poor, and has \ +a gaping hole leading downwards into darkness."; +" An exit heads south."; + ], + name "sag" "crack" "hole", + d_to [; + if (GROC_attic hasnt general) +"You can't go that way."; + else return GROC_stockroom; + ], + s_to [; +if (GROC_hall1.number == 3) return GROC_hall1; +else + "You pull back at the edge of the exit. The floor, it \ +appears, is too far below you!"; + ], + after [ i ; + Go: + if (noun == n_obj) { + i = CheckHall(); + if (i == 2) + print "You hear a low grinding noise behind you.^"; + } + ], + has light; + +Object attic_floorboards "floorboards" GROC_attic + with name "boards" "floorboards", + description [; +print "Some badly rotting floorboards"; +if (GROC_attic has general) + " with a noticeable hole in one section."; +else { + if (self has general) + " with a noticeable sag in one section."; + else "."; +} + ], + before [; + Take: "They're nailed into the floor."; + Push, Pull, Attack, Shake: +if (self has general) + "The floor shakes a bit, but nothing else happens."; +else { + move loose_board to GROC_stockroom; + give self general; + "The floor shakes under your abuse, and suddenly, a \ +portion in the middle sags considerably! But nothing else \ +happens."; +} + ], + has scenery; + +Object loose_board "loose board" + with name "loose" "board", + initial "You notice a loose board, partially \ +broken, hanging from the ceiling structure.", + description "A portion of the ceiling boards \ +has apparently broken loose.", + before [; + Pull, Attack, Shake: +give GROC_attic general; +remove self; +"You give the board a good couple of yanks. The board \ +soon breaks off, taking a small portion of the ceiling \ +with it! After the dust settles, you notice the rather \ +poor remodeling job you've done to the ceiling."; + ], +has static; + + +! (the coffee was moved to the cafe in Borphee) +Object decaf_coffee_can "can of decaf coffee" + with name "can" "coffee" "decaf", + description "The can reads: ~Frobozz coffee crystals~^^\ + ~Rich, mountain-grown flavor.~^^DECAFFEINATED.", + before [; + Open: + "You'd need a good can-opener for that."; + ], + size 15, +; + +Object icebox_key "square key" GROC_attic + with name "key" "square", + size 5, +; + + +Object icebox "icebox" GROC_stockroom + with name "icebox" "box", + description "A rather old-looking icebox.", + capacity 10, + size 20, + with_key icebox_key, + when_closed "A dust-covered icebox stands closed against \ +the northern wall.", + when_open [ x; + print "The icebox is open. "; + x = children(self); + if (x == 0) "It is also empty."; + print "Inside "; + if (x == 1) print "is: "; else print "are: ^"; + x = FULLINV_BIT + INDENT_BIT + NEWLINE_BIT + RECURSE_BIT; + WriteListFrom (child(self), x, 1); + rtrue; + ], + has static container openable lockable locked; + +Object cerealbox1 "blue cereal box" icebox + with name "box" "blue" "Crunchies", + description "A blue paper box with lettering that reads:^^\ + ~Grueslayer Crunchies!^^\ + (It's not just for adventurers anymore!)^^\ + [Free bonus scroll surprise inside!]~^^\ + Writing on the box reads ~50zm~.", + size 10, capacity 5, + before [; + Receive: + if (noun == cerealbox2 or cerealbox3) { + "That doesn't quite fit."; + } + Cast: + if (the_spell_was == zemdor_spell) { + if (self hasnt general) { + give self general; + move cerealbox2 to parent(cerealbox1); + move cerealbox3 to parent(cerealbox1); + Achieved(1); + "The box of cereal suddenly seems to dance with magic! \ + Before your very eyes, the box suddenly splits into \ + three boxes! The magic fades, but the boxes remain."; + } + else + "The magic fights against the cereal box, but fails. \ + I guess you can only triplicate once."; + } + ], + has container openable; + +Object cerealbox2 "navy-blue cereal box" + with name "box" "navy-blue" "Sugarglobs", + description "A navy-blue paper box with lettering that reads:^^\ + ~Frobozz Super Sugar Globs!^^\ + (Seventeen times the sugar of any other cereal!)^^\ + [Free bonus Frobozz toy inside!]~^^\ + Writing on the box reads ~50zm~.", + !weight 10, + size 10, capacity 5, + before [; + Receive: + if (noun == cerealbox1 or cerealbox3) { + "That doesn't quite fit."; + } + ], + has container openable; + +Object cerealbox3 "royal-blue cereal box" + with name "box" "royal-blue" "Dornflakes", + description "A royal-blue paper box with lettering that reads:^^\ + ~Dornflakes^^\ + (Just like Grandma Dimwit used to make!)^^\ + [Free bonus Frobozz toy inside!]~^^\ + Writing on the box reads ~50zm~.", + !weight 10, + size 10, capacity 5, + before [; + Receive: + if (noun == cerealbox1 or cerealbox2) { + "That doesn't quite fit."; + } + ], + has container openable; + +! A Breakfast cereal class -- what a concept +Class cereal_class + with name "cereal", + description "A quantity of overly-sweetened breakfast cereal.", + !weight 5, + size 8, + before [; + Eat: + remove self; + "You consume the cereal. The sugar rush occurs five seconds \ + later and ends just as quickly."; + ], + has edible; + +Object cereal1 "crunchy cereal" cerealbox1 + class cereal_class + with name "crunchy"; +Object cereal2 "sugary cereal" cerealbox2 + class cereal_class + with name "sugary"; +Object cereal3 "flaky cereal" cerealbox3 + class cereal_class + with name "flaky"; + +Object baking_powder "packet of baking powder" icebox + with name "powder" "baking" "packet", + short_name "packet of baking powder", + description "A single-use packet of baking powder from \ +~Port Foozle Bakers Guild~ products.", + !weight 5, + size 5, + before [; + Eat: + remove self; + "You eat the baking powder. Yuck."; + ], + has edible; + +Object butter "stick of butter" icebox + with name "butter" "stick" "fat", + description "A good-sized stick of butter.", + !weight 5, + size 5, + before [; + Eat: + remove self; + print "You eat the entire stick of butter."; + if (random(20) < 15) +" Your heart will no doubt thank you for that someday."; + deadflag = 1; + " The sudden \ +intake of concentrated fat is too much of a shock to your \ +system, and an important artery somewhere bursts."; + ], + has edible; + +Object FROSTHAM_Resort "Ski Resort" + with description "You are inside a large ski resort. Perhaps \ + it's not ski-season, as the entire place is \ + basically empty. Frostham city lies to the \ + east.", + name "resort" "city" "ski" "skis" "earmuff" "earmuffs", + e_to FROSTHAM_2, + out_to FROSTHAM_2, + w_to "You don't have a lift-ticket. Also, you don't have \ + skis. Most importantly, however, the slopes look \ + pretty lousy.", + has light; + +Object FROSTHAM_Governer1 "Governor's House, Waiting Room" + with description "You are in a waiting room in the house of the Frostham \ + Governor. The carpet is surprisingly plush. \ + The walls have been painted a rather bland \ + peach-like color. The furnishings \ + are also colored peach, which complements the \ + walls without being too nouveau. The way out \ + is to the northeast.", + name "carpet" "furnishings", + ne_to FROSTHAM_2, + out_to FROSTHAM_2, + s_to Gov_door, + after [; + Go: + if (noun==n_obj) { + give Gov_door ~open locked; + print "You hear the door slam and lock behind you.^"; + } + ], + has light; + +Object Gov_couch "couch" FROSTHAM_Governer1 + with name "couch" "peach", + initial "A comfortable-looking peach-colored couch is here.", + description "It looks pretty comfy, but the color wouldn't \ +have been your first choice.", + before [; + Search: + if (self hasnt general) { + give self general; + move c1 to FROSTHAM_Governer1; + "You rummage through the cushions and a coin falls out!"; + } + "You find nothing of interest."; + ], + has static enterable supporter; + +Object travel_posters "travel brochure" FROSTHAM_Governer1 + with name "brochure" "travel", + description "The brochure has pictures of various cheerful-looking \ + people in rather cheerful-looking places. \ + Bold lettering reads ~FEEL BETTER IN MIZNIA~, \ + ~IT'S ARAGAIN, AGAIN~, \ + and ~NEW BORPHEE, EVERYONE'S FAVORITE CITY~", + size 10, + ; + +Object c1 "coin" class coin_class; + +Object Gov_desk1 "desk" FROSTHAM_Governer1 + with name "desk" "waiting" "room", + description "A fairly plain-looking desk", + has scenery supporter; + +Object Gov_ledger "ledger" Gov_desk1 + with name "ledger", + description [; + if (receptionist in FROSTHAM_Governer1) + "The receptionist seems to be using it at the moment."; + "The ledger reads:^^\ + ~ -- New signed petition for presentation and coronation of \ +new King delivered to Aragain Magistrate, awaiting word of \ +event schedule.~^^That's all. I guess the governor hasn't been \ +very busy as of late."; + ], + !weight 20, + size 15, + before [; + Take: + if (receptionist in FROSTHAM_Governer1) + "The receptionist gives you a rather menacing look."; + ], +; + + +Object alarm_clock "alarm clock" Gov_desk1 + with name "clock" "alarm", + description [; +print "A small round desk-clock, with a set of bells \ +on the top, and a small pull-knob on the back. \ +Strangely, the clock seems to be stopped. Two hands, black and golden, \ +are sitting at ",alarm_clock.number," and ", +alarm_clock_dial.number; + " respectively."; + ], + article "an", + number 9, ! setting of the clock hand + time_left 0, + time_out [ x ; + alarm_clock.number = alarm_clock.number + 1; + if (alarm_clock.number > 12) alarm_clock.number = 1; + x = TestScope(alarm_clock,player); + if (x==1) print "^The alarm clock suddenly makes an \ +awful grinding noise"; + if (alarm_clock.number == alarm_clock_dial.number) { + ! alarm goes off + if (x==1) print ", followed by a ear-splitting clang!^"; + ! certain events follow: + ! if receptionist still in office and self in office, + ! receptionist leaves (if player in office, he'll + ! see this, or see it outside the office) + if ((receptionist in FROSTHAM_Governer1) && + (((self in FROSTHAM_Governer1) || (self in Gov_desk1)) || + ((self in player) && (player in FROSTHAM_Governer1))) ) { + remove receptionist; ! a long lunch hour, apparently... + ! give alarm_clock general; + Achieved(2); + if (player in FROSTHAM_Governer1) + "^The receptionist suddenly jumps from her \ +seat and rushes out of the room, screaming ~Lunchtime!~"; + if (player in FROSTHAM_2) + "^You see a woman rush out of the building \ +to the southwest, and quickly vanish."; + rtrue; + } + ! future: boutique in Miznia -- brings salesman to front + if (((self in MIZNIA_Boutique) || (self in player)) && + (player in MIZNIA_Boutique)) { + print "^From somewhere in the back of the \ +store, a tailor rushes out and"; + if (MIZNIA_Boutique hasnt general) { + give MIZNIA_Boutique general; + move fancy_scroll to player; + Achieved(23); +" sees you. ~We've got a rather \ +busy schedule,~ he explains, ~but let me see what I can do.~ \ +He gives you a somewhat unapproving look. ~The ascetic-monk \ +look is out, you know. Here.~ He pins a rolled paper object \ +to your clothes. ~The latest craze -- wearing magic scrolls. \ +Beats using them nowadays, I hear. Now, like I said, we're \ +very busy.~ He goes off to the back of the store."; + } + else +" recognizes you. \ +~I've done all I can for you right now,~ he explains as \ +goes off to the back of the store."; + } + rtrue; + } + else if (x==1) "!"; + ], + size 5, + add_to_scope alarm_clock_dial alarm_clock_bells alarm_clock_hands, + has transparent; + +Object alarm_clock_dial "knob" + with name "pull" "knob", + description "A small, pullable knob on the back of the clock.", + number 12, + before [; + Push: + print "The knob "; + if (self has general) { + give self ~general; + "pushes in a short bit."; + } + else "is as far in as it can go."; + Pull: + print "The knob "; + if (self hasnt general) { + give self general; + "pulls out a short bit."; + } + else "is as far out as it can go."; + Turn: + if (self hasnt general) { + ! wind clock + StartTimer(alarm_clock,1); + "The knob turns -- barely. You \ +hear a small clicking noise as well."; + } + else { + ! set alarm hand + alarm_clock_dial.number = alarm_clock_dial.number + 1; + if (alarm_clock_dial.number > 12) + alarm_clock_dial.number = 1; + print "The knob turns easily. You notice the \ +golden hand on the front sweep to ",alarm_clock_dial.number; + "."; + } + ! if (alarm_clock hasnt general) { + ! } + ! "It doesn't turn anymore. I guess the receptionist \ + ! broke the clock (not that it was in good shape to \ + ! begin with)."; + ], + has static; + +Object alarm_clock_hands "hands" + with name "hand" "hands" + has static; + +Object alarm_clock_bells "bells" + with name "bell" "bells" + has static; + +Object FROSTHAM_Governer2 "Governor's Office" + with description "You are in a rather spacious office. The \ +carpeting is quite plush, and all the furnishings seem \ +excessively lavish.", + name "carpeting" "furnishings", + n_to Gov_door, + has light; + +Object Gov_desk2 "desk" FROSTHAM_Governer2 + with name "desk" "office", + description "A fairly impressive looking desk, made from \ + a massive lacquered piece of black oak wood.", + before [; + Cast: + if (the_spell_was == egdelp_spell) + "The desk is covered with a ugly waxy film. \ +The governor looks extremely annoyed and wipes the desk clean with \ +a stack of papers."; + Push, Pull, Rub, Attack, Search: + "~Do you mind?~ the governor says."; + ], + has scenery supporter; + +Object Gov_door "door" + with name "door" "office", + when_closed [; + print "There's a closed door to the "; + if (self in FROSTHAM_Governer1) + "south."; + else "north."; + ], + when_open [; + print "There's an open door to the "; + if (self in FROSTHAM_Governer1) + "south."; + else "north."; + ], + description "It's just a thick door.", + door_dir [ ; if (location==FROSTHAM_Governer1) return s_to; + return n_to; + ], + door_to [ ; if (location==FROSTHAM_Governer1) + return FROSTHAM_Governer2; + return FROSTHAM_Governer1; + ], + before [ ; + Open: + if ((location==FROSTHAM_Governer1) && + (receptionist in FROSTHAM_Governer1)) + "The receptionist puts a hand in your way and says, \ + ~The governor is currently busy.~"; + Close: + if (location==FROSTHAM_Governer2) + "~Close it on your way _out_~, the governor snarls."; + ], + found_in FROSTHAM_Governer1 FROSTHAM_Governer2, + has static door openable lockable; + +Object FROSTHAM_GUSStop "Subway Entrance" + with description "You're near the southern end of the city. \ + The rest of the city lies to the north. \ + There's also a rather conspicuous \ + stairway down here.", + name "stairway", + n_to FROSTHAM_2, + u_to "You can't go that way.", + d_to FROSTHAM_GUSStation, + cant_go "You walk around the local streets a bit, finding \ + nothing of interest.", + has light; + + +! ****************************************************************** +! People/Creatures +! ****************************************************************** + +Object ski_instructor "ski instructor" FROSTHAM_Resort + with name "instructor" "dude" "skier" "guy" "tall" "lanky", + initial [; + print "A tall lanky guy is here, holding two colorful \ +skis. He seems to be "; + if (waxy_scroll in self) + "waxing them with a scroll."; + "concentrating greatly on waxing \ + his skis."; + ], + description "A tall lanky guy, like I said. He's \ + decked out in fancy bright winter clothes.", + life [; + Attack, ThrowAt: + "~Dude, you must chill.~"; + Answer, Tell: + if (special_word == 'hello' or 'hi') + "The skier gives you the 'thumbs-up' sign. \ +~Hey, dude.~"; + else "~Uh, whatever, dude.~"; + Show: + if (noun==rag) + "~Hey dude, can I borrow that?~"; + "~Uh, whatever, dude.~"; + Order: + if (action==##Give) { + if (noun=='skis') + "~No way, dude.~"; + if (((noun==waxy_scroll) && (self hasnt general)) || + ((noun==rag) && (self has general))) + "~I'm using it, dude.~"; + } + "~Dude, I have no idea what you're talking about.~"; + Ask: + if (second=='rag') + "~A rag makes an excellent ski-maintenance accessory, dude.~"; + if ((second=='scroll' or 'waxy') && (self hasnt general)) + "~Something I found at the top of a run. \ + Doesn't work too well, but hey, I gotta wax.~"; + if (second=='skis') + "~My rad Grayslopes Slaloms. If you don't wax 'em \ + every 30 seconds, they lose their speed.~"; + if ((second=='slopes') || (second=='slope') || + (second=='powder') || (second=='runs') || + (second=='skiing')) + "The skier takes you aside. ~Listen dude, \ + between you and me, the slopes here rot. They \ + used to be way better. But you know, I hear there \ + are some _killer_ drops up north.~"; + "~Dude, I have no idea what you're talking about.~"; + Give: + if (noun==rag) { + move waxy_scroll to FROSTHAM_Resort; + move rag to self; + give self general; + Achieved(3); + "The skier gladly takes the rag and starts \ + polishing immediately. He lets the scroll \ + fall to the ground. ~Excellent man, thanks!~"; + } + "~No thanks, dude.~"; + default: "At the moment, the skier is too busy waxing."; + ], + each_turn [; + if (waxy_scroll notin self && self hasnt general) { + Achieved(3); + remove self; + "^~Dude, like, that scroll thing just \ +vanished! What a cosmic experience!~ On that note, \ +the skier opts to head for the slopes, and leaves to the west."; + } + if (random(20) < 5) + "^The skier polishes a spot on his skis."; + ], + before [; + Cast: + if (the_spell_was == foblub_spell or espnis_spell) + "A pair of fluffy earmuffs the skier is wearing \ +prevents him from hearing the full impact of your sermon."; + ], + has animate transparent; + +Object receptionist "receptionist" FROSTHAM_Governer1 + with name "receptionist", + initial "A receptionist sits behind a desk, engrossed in \ + the ledger.", + description "A gruff-looking lady who apparently is far \ + more interested in her work than you.", + each_turn [; + if (receptionist hasnt general) { + give receptionist general; + "^Without even looking up, the receptionist says, \ + ~The governor is busy right now.~"; + } + if (random(10) == 1) + "^The receptionist turns a page in the ledger."; + ], + life [; + Answer, Order: + print "The receptionist"; + if (special_word=='hello') + ", without looking up, says \ + ~Can I help you?~."; + " seems to be ignoring you."; + Ask: + print "The receptionist"; + if (second=='governor') + ", without looking up, says \ + ~He's very busy right now.~."; + " shrugs."; + default: + "The receptionist seems to be ignoring you."; + ], + react_before [; + Cast: +"The receptionist, in a rather shrill voice says, \ +~If you're gonna wait, do it quietly,~ disrupting your chant."; + Blow: +if (noun==whistle) +"You make an unusually high-pitched noise. The receptionist, \ +in a rather shrill voice says, \ +~If you're gonna wait, do it quietly.~"; + Sneeze: +"~If you want to spread germs, do it outside.~"; + Yell: +"~If you're gonna wait, do it quietly.~"; + Sing: +"~We're not holding auditions, you know.~"; + ], + has animate female; + +Object governor "governor" FROSTHAM_Governer2 + with name "governor" "gov", + initial "The governor of Frostham is sitting behind a \ + desk here, trying to look busy.", + description "A sour-looking man who tries his best not \ + to notice you.", + each_turn [ i ; + if (governor hasnt general) { + give governor general; + move c2 to player; + "^The governor scowls as you enter. ~What do you want?~ \ + he says, and doesn't wait for a response. ~Oh, I know. \ + More complaints about the snow, I suppose? Well \ + look, I didn't ask for this job. Do you want it? I \ + didn't think so.~ He shoves something into your hand. \ + ~Here, buy yourself a cup of coffee, and stop \ + bothering me.~"; + } + i = random(4); + print "^The governor "; + if (i == 1) + "thumbs through some papers."; + if (i==2) + "balances a pencil on his nose."; + if (i==3) + "scribbles something meaningless."; + if (i==4) + "looks up and notices you. ~Don't you \ + have anything else to do?~ he says."; + ], + life [; + Ask: + if (second=='key' or 'shiny') { + print "~Some key an important visitor \ +forgot while visiting. Probably useless now"; + if (parent(cab_key) == player) + print ". You can keep it, for all I care"; + ".~"; + } + if (second=='receptionist') + "~I think she's out to lunch,~ he says, \ +with obvious annoyance."; + if (second=='magistrate' or 'king' or 'sydney') + "He looks at you suspiciously. \ +~Never heard of him,~ he says."; + if (second=='ledger') + "~I think my receptionist has it.~"; + if (second=='pencil') + "~Please! I'm a very busy man!~"; + "~Sorry, that's not my problem. Now run along.~"; + Kiss: + "The governor brushes you off. ~Are you \ +planning on running for office or something?~"; + Attack, ThrowAt: + deadflag = 1; + "As you make a threatening move, the governor \ +presses some unseen switch behind his desk. Before you \ +know it, a hidden trapdoor opens in the floor and you \ +plunge to your death. A good politician is always \ +prepared, it seems..."; + Tell: + "~Sure, sure. Scram, will you?~"; + Answer, Order: + if (special_word=='hello') + "~Yeah, sure. So what's your problem?~"; + "The governor is busy trying to look busy."; + Give: + "Bribing a politician, eh?"; + Show: + if (noun==Gov_ledger) + "~Hey, return that to the receptionist!~"; + "~Please! I'm a very busy man!~"; + ], + react_after [; + Take: + if (noun == cab_key) + "~Oh sure, just go ahead and take things \ +from my office. See if I care.~"; + ], + before [; + Cast: + if (the_spell_was == foblub_spell) + "Actually, the governor seems pretty glued to his \ +seat already. In any event, nothing seems to happen."; + if (the_spell_was == espnis_spell) + "The governor seems to nod off, but only for \ +a second."; + ], + has animate transparent; + + +! *************** +! More objects... +! *************** + +Object pencil "pencil" governor + with name "pencil"; + +Object c2 "coin" class coin_class; + +! (cereal box prizes) +Object whistle "whistle" cerealbox2 + with name "whistle", + description "A tiny plastic whistle.", + !weight 1, + size 1, + before [; + Blow: + "You make an unusually high-pitched noise."; + ], +; +! (a fancier packaged prize :) +Object plastic_wrapper "plastic wrapper" cerealbox3 + with name "wrapper" "plastic", + description "A small plastic see-through package.", + before [; + Open: + while (child(self)~=0) move child(self) to parent(self); + remove plastic_wrapper; + "The wrapper rips open with ease, and disintegrates, \ + leaving the contents behind."; + ], + !weight 0, + size 5, + has container openable transparent; + +Object toy_volcano "toy volcano" plastic_wrapper + with name "toy" "volcano", + description "A strange thing indeed -- a miniature \ + ceramic toy, that has been painted and shaped \ + in painstaking detail to look like a volcano.", + !weight 5, + size 5, +; + +Object volcano_note "instruction notice" plastic_wrapper + with name "notice" "instruction", + article "an", + description "~Frobozz Instant Volcano~^^\ + (parental supervision recommended)^^\ + To use: Just add a good quantity of water! We suggest \ + a very large safety radius.~", + size 5, +; + + + +! ****************** +! Scrolls and spells +! ****************** + +Object waxy_scroll "waxy scroll" ski_instructor + class scroll_class, + with name "waxy", +; + +Object egdelp_spell "create waxy build-up on wood" waxy_scroll + class spell_class, + with name "egdelp", + magic [; + if (second ~= 0 && second ~= player) { + CDefArt(second); " looks pretty polished as is."; } + else { "The chant, seeking wood to polish, fails."; } + ], +; + +Object sugar_scroll "sugar-coated scroll" cerealbox1 + class scroll_class, + with name "sugar-coated" "coated", +; + +Object zemdor_spell "triplicate object" sugar_scroll + class spell_class, + with name "zemdor", + number 0, + magic [; + if (second == 0) + "The chant, seeking a locus for \ +triplication, fails."; + if (second has animate) + "The chant, not designed for living creatures, fails."; + if (second has is_spell) +"This violates certain unwritten laws of magic."; + if (second has is_coin) { + ! new twist for zemdor, as sugg. by player + print "The coin shimmers suddenly! You blink in \ + disbelief as the coin seems to split \ + into three copies of itself! "; + if (self hasnt general) { + give self general; + move c12 to parent(second); + move c13 to parent(second); + "You notice there are now three coins where \ +there was once but one!"; + } + "Suddenly, a financial nymph appears! She gives \ +you a denunciatory look. ~Line 7234-6 of the Pierpont \ +tax laws clearly states that repeated unauthorized \ +triplication of monetary \ +items is strictly forbidden,~ she says, and takes the \ +the two newly created coins before disappearing."; + } + print (The) second, " shimmers suddenly! You blink in \ + disbelief as ", (the) second, " seems to split \ + into three copies of itself! "; + "But, as you finish the chant, \ + the mystic energy seems to fade, and the copies \ + coalesce back into one unchanged object. The \ +chant fails."; + ], +; + +Object c12 "coin" class coin_class; +Object c13 "coin" class coin_class; + diff --git a/src/fublio.inf b/src/fublio.inf new file mode 100644 index 0000000..f121240 --- /dev/null +++ b/src/fublio.inf @@ -0,0 +1,1043 @@ + +! ****************************************************************** +! FUBLIO.INF +! ---------- +! Add-on file for SPIRITWRAK +! -- Contains South Fublio Valley locations, items and creatures +! ****************************************************************** + +Object FUBLIO_GUSStop "Southern Fublio Valley" + with description "You are in a southern region of Fublio \ +Valley, where someone apparently decided to start \ +a city. So far, a couple huts and farmhouses are the \ +result. A rather run-down farmhouse lies to the \ +southwest, a trail runs through grasslands to \ +the south and a smaller trail runs along the hills to the \ +southeast. To the north, you see a decrepit old \ +building. There is also a stairway into the ground here.", + name "huts" "farmhouses" "farmhouse" "trail" "grasslands" +"hills" "stairway", + d_to FUBLIO_GUSStation, + sw_to Farm, + s_to Grasslands, + se_to Fublio_forest, + n_to Fublio_bank, + cant_go "You amble around the local area a bit, and return here.", + has light; + +Object Fublio_bank "Abandoned Bank" + with description "You're inside what must have once been a \ +small branch office of the once indestructible Bank of Zork. \ +However, the place has clearly been abandoned, and age has not \ +been kind. Even the required portrait of J. Pierpont Flathead \ +has been pilfered. An exit lies south.", + s_to [; +! first case, r & (!p & !q & !s) + if ((children(r_vault) == 20) && + (children(p_vault) == 0) && + (children(q_vault) == 0) && + (children(s_vault) == 0)) return FUBLIO_GUSStop; +! second case, (p & s) & (q & !r) + if (((children(s_vault) > 0) && + (children(p_vault) == children(s_vault))) && + ((children(q_vault) == (children(p_vault) + 5)) && + (children(r_vault) ~= 20))) + return FUBLIO_GUSStop; + "A buzzer sounds, and some mysterious force \ +prevents you from leaving!"; + ], + has light; + +Class vault_class + with name "vault", + description "Basically a hollow rectangular hole cut \ +into the wall.", + before [; + Receive: +if (noun hasnt is_coin) + "A strange force pushes your hand away."; + ], + capacity 100, + size 10, +has static container open transparent; + +Object p_vault "interest vault" Fublio_bank + class vault_class, + with name "interest", + initial [; + print "An vault labeled ~INTEREST PAID~ is \ +open in the wall"; +if (children(self) > 0) { + print ". Inside"; + WriteListFrom(child(self), FULLINV_BIT + ENGLISH_BIT + ISARE_BIT); +} +"."; + ], +; +Object q_vault "overhead vault" Fublio_bank + class vault_class, + with name "overhead", + initial [; +print "An vault labeled ~OVERHEAD~ is \ +open in the wall"; +if (children(self) > 0) { + print ". Inside"; + WriteListFrom(child(self), FULLINV_BIT + ENGLISH_BIT + ISARE_BIT); +} +"."; + ], +; +Object r_vault "basis vault" Fublio_bank + class vault_class, + with name "basis", + initial [; +print "An vault labeled ~BASIS~ is \ +open in the wall"; +if (children(self) > 0) { + print ". Inside"; + WriteListFrom(child(self), FULLINV_BIT + ENGLISH_BIT + ISARE_BIT); +} +"."; + ], +; +Object s_vault "loans vault" Fublio_bank + class vault_class, + with name "loans", + initial [; +print "An vault labeled ~LOANS~ is \ +open in the wall"; +if (children(self) > 0) { + print ". Inside"; + WriteListFrom(child(self), FULLINV_BIT + ENGLISH_BIT + ISARE_BIT); +} +"."; + ], +; + + +Object bank_memo "bank memo" Fublio_bank + with name "memo", +description "BANK WORKER GUIDELINES^^\ +If at any point, account activity has been suspended \ +(i.e. all regular account vaults have no funds) then \ +it must be ensured that 20 zorkmids remain in basis, \ +for potential loan requests.^^\ +Otherwise, vaults must be maintained as follows:^^\ +For interest waiting to be paid, the amount must \ +equal the amount held in the loan payments vault. \ +If this amount goes over the loan payments, talk \ +to your local gnome manager to see about getting \ +some outstanding loans paid back.^^\ +Overhead should be kept at the amount in interest, +plus five.^^\ +Loan payments should be kept at a positive amount.^^\ +Make sure that both the loan and interest vaults \ +are maintained properly, and at the same time, the \ +overhead vault is maintained while the basis vault \ +is kept at a non-suspended bank amount. If this \ +is not the case, you may need to put some overtime \ +in to straighten out the bank funds.", + size 15; + +Object c30 "coin" r_vault class coin_class; +Object c31 "coin" r_vault class coin_class; +Object c32 "coin" r_vault class coin_class; +Object c33 "coin" r_vault class coin_class; +Object c34 "coin" r_vault class coin_class; +Object c35 "coin" r_vault class coin_class; +Object c36 "coin" r_vault class coin_class; +Object c37 "coin" r_vault class coin_class; +Object c38 "coin" r_vault class coin_class; +Object c39 "coin" r_vault class coin_class; +Object c40 "coin" r_vault class coin_class; +Object c41 "coin" r_vault class coin_class; +Object c42 "coin" r_vault class coin_class; +Object c43 "coin" r_vault class coin_class; +Object c44 "coin" r_vault class coin_class; +Object c45 "coin" r_vault class coin_class; +Object c46 "coin" r_vault class coin_class; +Object c47 "coin" r_vault class coin_class; +Object c48 "coin" r_vault class coin_class; +Object c49 "coin" r_vault class coin_class; + +Object Farm "Farm" + with description "You're standing in front of a small farmhouse. \ +A trail leads northeast, a sand bar lies to the southwest, \ +and another trail heads east.", + name "trail", + ne_to FUBLIO_GUSStop, + sw_to Veg_fields, + e_to Grasslands, + has light; + +Nearby farmhouse "farmhouse" + with name "farmhouse" "house", + description "A small farmhouse, barely a shack.", + before [; + Enter: "The farmhouse is run-down enough already without you \ + stomping around in it."; + ], + has scenery; + +Object Veg_fields "Oyster Farm" + with description [; + print "A coastline sand bar curves west a short distance \ +here, ending in a shoal of large rocks. Nearby, \ +someone has dug some shallow holes in the \ +sand, probably farming for live Rotund Oysters, a popular \ +Eastland delicacy."; + if (self hasnt general) +"Unfortunately, the oyster \ +beds are too far inland, and they appear to be \ +empty. A bit to the west you can see a small \ +shoreline cave in the rocks."; + else +"The oyster \ +beds are filled with water (similar to a good portion \ +of the shoal) and look well stocked!"; + ], + name "sand" "bar" "shoal" "rocks" "cave", + before [; +Fill: "Seawater is hardly a rare commodity these days."; + ], + ne_to Farm, + w_to [; + if (self hasnt general) { + print "You try to head towards the cave, but \ +the unstable rocks and sea waves make it "; + if (FUBLIO_Cave hasnt general) { + give FUBLIO_Cave general; + print "difficult \ +to get there from here. Suddenly, a rock slips from underfoot! \ +You fall...^"; + return FUBLIO_Cave; + } + else + print "impossible \ +to get there from here.^"; return 1; + } + else + "Any remainder of the sand bar west is \ +now submerged by a high tide or rise in the sea."; + ], + has light; + +Nearby oyster_beds "oyster beds" + with name "beds" "holes" "hole", + description [; + print "Some shallow"; + if (Veg_fields hasnt general) + ", mostly empty holes in the sand."; + " holes in the sand, filled with sea water."; + ], + before [; + Search: + if (Veg_fields has general) + "You find a couple immature oysters, and throw \ +them back."; + Receive: + "Someone is obviously trying to use these holes \ +for oyster farming. Best to leave them as you found them."; + ], + has scenery; + +Object FUBLIO_Cave "Dark Damp Cave" + with description [; + print "You seem to be in some underground cave. "; + if (FUBLIO_Cave.number == 1) +"There are no visible exits. You feel rather claustrophobic. \ +You also hear some unexpected noises."; + else +"There is a small dark tunnel leading south. \ +You hear the sounds of rushing water from somewhere nearby."; + ], + number 1, + name "tunnel", + s_to [; + if (FUBLIO_Cave.number == 1) + "You can't go that way."; + if (FUBLIO_Cave.number == 3) + "The dark tunnel becomes blocked after a short distance \ +by a great tidal swell! The sea has risen above the entrance!"; + else { + print "^You crawl through the dark tunnel, which \ +seems to snake back and forth. After what seems like an \ +eternity, you see daylight, and stumble forward. You find \ +yourself on the sand bar again! Looking back, you can't \ +locate the tunnel you just left at all!^"; + FUBLIO_Cave.number = 3; + return Veg_fields; + } + ], + before [; + Listen: "You hear the sounds of the sea all around you."; + Smell: "You smell the musty odor of the sea."; + ], +; + + + +Object Grasslands "Grassland Beach" + with description [; + if (self hasnt general) + print "A nice beach with lots of tall grasses hides \ +behind a short dune here. The Great Sea stretches out \ +to the south."; + else + print "A deep marsh hides behind a short dune here. The Great Sea \ + is making some inroads here, apparently. That volcano in \ + the water to the south may have had something to do with it."; + " From here, you can go north, west or east. \ + You can just glimpse some sort of tower-like structure \ + far across the bay in the east."; + ], + name "beach" "grasses" "dune" "marsh" "sea" "tower", + w_to [; + if (player in sailboat) + "You'll have to get out of the sailboat first."; + else return Farm; + ], + e_to [; + if (player in sailboat) + "You'll have to get out of the sailboat first."; + else return Fublio_forest; + ], + n_to [; + if (player in sailboat) + "You'll have to get out of the sailboat first."; + else return FUBLIO_GUSStop; + ], + s_to [; + if (player in sailboat) return On_Fublio_bay; + else + "The tides here make swimming unadvisable."; + ], + before [; + Swim: + "The tides here make swimming unadvisable."; + ], + has light; + +Nearby sailboat "small sailboat" + with name "sailboat" "boat", + description [; + if (self hasnt general) + "A nice little sailboat that looks pretty sea-worthy. \ +The word ~MINIRVA~ is painted on one side."; + "A badly damaged sailboat. Several places bear deep \ +cracks, as though the boat had been tossed in a violent storm."; + ], + before [; + Go: + if (self has general) { + print "In it's current condition, this boat is lucky to \ + be floating.^"; + return 2; ! disallow movement but say nothing + } + else rtrue; + Cast: + if (the_spell_was == fiznav_spell) { + print "You perform a nice liturgy to the Sea Gods,"; + if (self has general) { + give self ~general; + Achieved(6); + " and before your very eyes, the sailboat repairs itself!"; + } + else " however the boat seems unchanged."; + } + Take: + "That's too cumbersome to carry."; + ], + capacity 15, + size 30, + has enterable static container open; + +! Object c6 "coin" sailboat class coin_class; + +Object On_Fublio_bay "On Fublio Bay" + with description [; + print "You are sailing on Fublio Bay. A shoreline lies \ +to the north. You could probably sail out of the bay \ +to the south, but I'd advise against it, \ +the winds aren't very strong. To the northeast \ +you can see "; + if (self hasnt general) + "the tip \ + of a peninsula where a lighthouse tower is standing."; + else + "a partially submerged lighthouse tower. \ + Also, to the southeast is a small volcanic island where \ + you could probably land."; + ], + name "shoreline" "bay" "peninsula" "tower" "lighthouse" +"island", + n_to Grasslands, + s_to Lost_at_sea, + ne_to [; + if (self hasnt general) + "The winds blow the wrong way, and you end up back here."; + else return Lighthouse2; + ], + se_to [; + if (self hasnt general) + "You can't go that way."; + else return Volcano_island; + ], + before [; + Go: + if (noun==s_obj) + print "^A sudden gust of wind sends your small craft \ + skimming out of control!^"; + Swim, Exit: + if (player in sailboat) + "The water's pretty deep here. I'd stay in the boat."; + Fill: "Seawater is hardly a rare commodity these days."; + ], + each_turn [; + if (seawater.number == 5) { + seawater.number = 10; + "^Many large bubbles are coming from somewhere deep in the \ + seawater near you, as though the water was boiling! Also, \ + you see some dark shape in the depths below rising!"; + } + if (seawater.number == 4) { + seawater.number = 5; + "^There appears to be a steady stream of bubbles coming from \ + somewhere deep in the water near you! Also, you see something \ + dark rising from the depths below you!"; + } + if (seawater.number == 3) { + seawater.number = 4; + "^You notice a few small bubbles rise to the surface of the sea."; + } + if (seawater.number == 2) + seawater.number = 3; + ], + + has light; + +Object Lost_at_sea "Lost at Sea" + with description [; + print "You're lost at sea. The winds are completely dead. \ +They managed to take you quite a ways out before they died, \ +however, and it's currently hard to tell which way land was \ +from here"; + if (self has general) + ". Oddly, there's a volcano far out to the south, \ + still smoldering from a recent eruption."; + else "."; + ], + name "sea" "winds" "land", + cant_go "The winds are dead, and you're not going anywhere.", + before [; + Swim, Exit: + if (player in sailboat) + "The water's pretty deep here. I'd stay in the boat."; + Fill: "Seawater is hardly a rare commodity these days."; + ], + each_turn [; + if (seawater.number == 9) { + seawater.number = 11; + "^Many large bubbles are coming from somewhere deep in the \ + seawater near you, as though the water was boiling! Also, \ + you see some dark shape in the depths below rising!"; + } + if (seawater.number == 8) { + seawater.number = 9; + "^There appears to be a steady stream of bubbles coming from \ + somewhere deep in the water near you."; + } + if (seawater.number == 7) { + seawater.number = 8; + "^You notice a small bubble rise to the surface of the sea."; + } + if (seawater.number == 6) + seawater.number = 7; + ], + has light; + +Object Fublio_forest "On Peninsula" + with description [; + print "You stand "; + if (self hasnt general) + "in a clearing on a grassland peninsula. A \ + trail leads northwest from here, and another leads west. \ + Off to the \ + southeast, there's an entrance into what looks like an old \ + abandoned lighthouse, just at the tip of the peninsula."; + if (self has general) + "on the southeast tip of a grassland peninsula. A \ + trail leads northwest from here, and another leads west. Off to the \ + southeast, you can see the top of what looks like a \ + lighthouse, partially submerged in the Great Sea."; + ], + name "clearing" "grassland" "peninsula" "trail" +"tower" "lighthouse" "sea", + nw_to FUBLIO_GUSStop, + w_to Grasslands, + se_to [; + if (self has general) + "Looks like you'd need a boat to get out to that \ + lighthouse now."; + else return Lighthouse1; + ], + has light; + +Object Lighthouse1 "Bottom of Lighthouse" + with description [; + print "You're inside an ancient lighthouse. The place \ + must have been deserted quite a long time ago, and \ + is now a mess of broken stone, cobwebs and seabird \ + droppings. The rest of the peninsula is back \ + northwest. You can see a hole above where a stairway \ + probably entered an upper floor of the place, but \ + the stairway itself crumbled into dust long ago"; + if ((self hasnt general) && (amulet has worn)) { + give self general; + ".^^Your amulet suddenly gives off a bright purple flash, then \ + returns to normal!"; + } + else "."; + ], + name "stone" "cobwebs" "droppings" "hole", + nw_to Fublio_forest, + u_to "The hole is too far above you.", + has light; + +! more scenery stuff. This one's key though +! (Sidenote: Here's an example of a situation where one would probably +! want an object that could be both a supporter and a container -- +! i.e. objects that float or sink could be handled easily.) +Object seawater "water" + with name "water" "sea" "ocean", + description "Salty blue-green water surrounds you.", + time_left 0, + number 1, + weight 0, + size 100, + before [; + ThrownAt, Receive: + if (noun == toy_volcano) { + if (location == On_Fublio_bay) { + seawater.number = 2; + seawater.weight = 1; + } + else { + seawater.number = 6; + seawater.weight = 2; + } + StartTimer(self,3); + remove toy_volcano; + "The toy volcano drops into the water and sinks like a stone."; + } + else { + remove noun; + if (noun == umbrella && umbrella has open) + "The umbrella seems to float on the water like a \ +cloth dome for a short bit, but eventually sinks into the water."; + CDefArt(noun); " sinks into the water and is soon out of sight."; + } + Push, Pull, Turn, Take, Attack, Rub, Squeeze: "The sea water runs through your fingers."; + Taste, Drink: "It's just salty sea water."; + Search, LookUnder: + if (seawater.weight > 0 && seawater.number < 12) + "There's something down there all right!"; + else { + if (random(10) < 2) + "You glimpse a large grouper swimming under the \ +water, and watch it swim away."; + else + "The water seems choppy and deep. You notice \ +nothing beneath the waves at the moment."; + } + ], + found_in On_Fublio_bay Lost_at_sea, + time_out [ ; + ! a fairly simple event here, but nonetheless dramatic... + ! -- 1st, if we dropped the volcano in the bay (correct) + ! set water descriptions so that player won't see bubbles + seawater.number = 12; + ! set CAVE number for endgame + FUBLIO_Cave.number = 3; + if (seawater.weight == 1) { + ! first, set up all room generals so that descriptions are + ! changed. + give Grasslands general; + give Veg_fields general; + give Fublio_forest general; + give farmer general; ! he'll give player sphere next encounter + give sailboat general; ! damages sailboat, regardless of where it is + move sailboat to Grasslands; + ! Modify On_Fublio_bay paths, new one to island, new one to tower. + give On_Fublio_bay general; + ! Now, check location. Certain areas will kill player in + ! tidalwave. Certain areas will cause an audible explosion. + ! Remainder do nothing (but shouldn't happen) + if (location == Veg_fields or Grasslands or Lighthouse1) { + deadflag = 1; + "^There's a massive explosion from the south! You turn \ + and rub your eyes in disbelief. There's a \ + volcano rising out of the sea! Unfortunately, \ + there's also a large tidalwave headed your way \ + (caused by volcanic eruption at sea, no doubt) which \ + engulfs you as you try to scramble for higher ground! \ + You struggle valiantly, but drown in deep water."; + } + if (location == FUBLIO_GUSStop or Farm or Fublio_forest) { + "^You hear a massive explosion from the south! \ + It sounded pretty far off, but whatever it was, it \ + was loud."; + } + if (location == On_Fublio_bay) { + deadflag = 1; + "^Suddenly, the water around you literally lifts you into \ + the sky in an enormous explosion! The last thing you \ + see is the emerging mouth of an active and hungry volcano!"; + } + if (location == Lost_at_sea) { + deadflag = 1; + "^You hear a large explosion off to the north! \ +A massive tidal swell rushes by and tosses your small craft violently, \ +knocking you into the water. As you watch the waves carry the boat +away, a giant grouper swims up and swallows you."; + } + } + ! -- else, we dropped it in the sea (bummer) + ! (this implies that 1) only the sea descrp will change, + ! 2) the player is still stuck at sea, and will be killed + ! for his trouble. + else { + give sailboat general; ! just keeping with the story... + give Lost_at_sea general; + move sailboat to Grasslands; ! made it back to shore somehow... + deadflag = 1; + "^Suddenly, the water around you literally lifts you into \ + the sky in an enormous explosion! The last thing you \ + see is the emerging mouth of an active and hungry volcano!"; + } + ], + has scenery container open; + + +Object Lighthouse2 "Near Submerged Lighthouse" + with description [; + print "You're on the outside of what looks like the upper \ + part of a lighthouse, sticking straight out of the sea. \ + The lighthouse is broken in many places, and several areas \ + provide ledge-space to stand on. In fact, you could probably \ + climb into the lighthouse through one of many large \ + cracks in the walls to the east. The rest of Fublio bay \ + is back southwest"; + if ((self has general) || (Lighthouse1 has general) || + (amulet hasnt worn)) + "."; + else { + give self general; + ".^^Your amulet suddenly gives off a bright purple flash, then \ + returns to normal!"; + } + ], + name "lighthouse" "cracks", + e_to [; + if (player in sailboat) + "You'll need to get out of the boat first."; + else return In_lighthouse; + ], + ! in_to [; + ! if (player in sailboat) + ! "You'll need to get out of the boat first."; + ! else return In_lighthouse; + ! ], + sw_to [; + if (player notin sailboat) + "The water looks pretty choppy. I'd suggest you use a \ + sea-going vessel of some sort."; + else return On_Fublio_bay; + ], + has light; + + +Object Volcano_island "Volcanic Island" + with description "You're on the north shore of a small volcanic \ + island in the middle of Fublio bay. A little more \ + shore lies to the south. The bay spreads out before \ + you to the northwest.", + name "bay", + nw_to [; + if (player notin sailboat) + "The water looks pretty choppy. I'd suggest you use a \ + sea-going vessel of some sort."; + else return On_Fublio_bay; + ], + s_to [; + if (player in sailboat) + "You'll need to get out of the boat first."; + else return Island2; + ], + before [; + Swim: "Near a still-active volcano? Not wise."; + ], + has light; + +Object Island2 "South Part of Island" + with description "You're on a southern section of a small \ + volcanic island in the middle of Fublio bay. Most \ + of the area here is lava-rock, still warm. You can \ + see a more open shore to the north.", + name "bay" "rock" "lava" "shore", + n_to Volcano_island, + before [; + Swim: "Near a still-active volcano? Not wise."; + ], + has light; + +Nearby shipwreck "old shipwreck" + with name "shipwreck" "wreck" "ship", + initial "An old shipwreck is almost embedded in the lava \ + here.", + description "It looks like an old navy vessel, \ + stuck fast in the surrounding rock. Its obviously \ + been underwater for some time, as it is covered in \ + barnacles and seaweed. The hull has partially rotted apart \ + in many places.", + before [; + Enter: + "You find that anything left to enter in the wreck \ + has pretty much decayed away."; + Cast: + if (the_spell_was == fiznav_spell) + "You perform a nice ritual to the Sea Gods, and \ + before your very eyes, the ship attempts to repair \ + itself! But there's too much damage, and not \ + even the aid of the Sea Gods can fix this craft. \ + The chant fails."; + Search: + if (self has general) { + move green_rod_piece to parent(self); + give self ~general; + Achieved(7); + "Something about the old boat rings a familiar tune. \ +You check near something that might have once been a mast, and \ +uncover a familiar green rod!"; + } + ], + has static; + +Object In_lighthouse "Lighthouse, upper level" + with description "You're inside an abandoned lighthouse, on what \ + must be an upper floor. The whole interior is lifeless and \ + barren. There's a large broken crack in the western wall. \ + You also notice a hole in the floor nearby, which might \ + have been an exitway a long, long time ago.", + name "crack" "hole", + w_to [; + if (water_spirit in self) + "The water spirit buffets you with water and \ + prevents you from leaving."; + else return Lighthouse2; + ], + d_to [; + deadflag = 1; + "You drop through the hole, and land in cold dark water! \ + Trapped in an enclosed pool of seawater, with the hole \ + too far above you, you drown shortly afterwards."; + ], + before [; + Listen: "You hear some sloshing noises from below the floor."; + ], +has light; + + + +! ************ +! creatures +! ************ + +Object farmer "farmer" Farm + with name "farmer", + initial "There's a tired-looking farmer here.", + description "It looks like he's been working pretty hard \ + in the sun.", + each_turn [; + if (self hasnt general) { + if (random(10) == 1) + "^~'Forget zucchini,' they told me, 'Go into oyster \ + farming. You'll make a fortune.' Ha!~"; + } + else { + remove farmer; + move silver_sphere to player; + "^The farmer sees you approach and rushes to \ + greet you. ~I saw what you did, sir, yes indeed. \ + A mighty crazy thing to do, calling a volcano outa \ + the water like that. But you did it! And \ + my oyster beds thank you kindly! I'd like to \ + repay the favor, but I'm only a poor farmer.~ He \ + pauses, then searches his pockets. ~Here,~ he says, \ + putting something in your hand. ~Found it digging in \ + the sand. Don't know what it is, but I'll bet you \ + can use it.~ He smiles and disappears into the \ + farmhouse."; + } + ], + life [; + Attack, ThrowAt: + "Something about attacking a down-on-his-luck \ +farmer just doesn't seem right, so you stop."; + Answer: + if (special_word == 'hello') + "The farmer nods in your direction. \ +~How do, stranger?~"; + Ask: + if (second == 'oyster' or 'farm' or 'oysters') + "~Did a foolish thing, sir, tried my luck with \ + oyster farming this year. The place is too far \ + from the sea, and I can't get any oysters in my \ + beds, 'cause there's no water to grow 'em in.~"; + Show: + if (noun has is_sphere) + "~Hey, I seen something like that once.~"; + Give, Tell: + "The farmer smiles, but shakes his head."; + default: "The farmer is preoccupied with something as \ +he squints into the sun."; + ], + before [; + Cast: + if (the_spell_was == foblub_spell or espnis_spell) +"~I'm just a simple farmer, sir. I'm afraid you're losing me \ +with your fancy words.~"; + ], + has animate; + +Object water_spirit "water spirit" In_Lighthouse + with name "spirit", + description "It looks like a large moving mass of seawater, \ + in a somewhat man-like shape.", + 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; + "^Suddenly, water seeps in from the west, and forms \ + into a large vaguely-humanoid shape before your very \ + eyes!"; + } + i = random(5); + if (i == 1) { + deadflag = 1; + "^The water creature moves quickly, and smothers you \ + in water! You try to escape, but the creature has \ + amazing strength and weight! The spirit soon \ + envelopes your head, and you drown..."; + } + 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 water spirit was too much for \ + you, I'm afraid to say. You sink to the ground, to \ + weak to defend yourself, as the spirit slowly oozes \ + towards you for the final blow..."; + } + print "^The water spirit "; + if (i==2) + "blasts you with a jet of seawater! \ + It feels like a battering ram just used you for a \ + practice drawbridge!"; + if (i==3) + "buffets you with small jets of water! \ + You feel exposed areas of skin getting rubbed raw by \ + the force of the water!"; + "forms into a small wave and tries to \ + crush you, but you evade just in time!"; + ], + before [; + Cast: + if (the_spell_was == swanko_spell) { + remove self; + "As you speak the chant, the water spirit falls back \ + in fear! You finish the chant, and the water spirit \ + makes one last attempt to smother you, but dissipates \ + with a splash!"; + } + print "The creature makes a banshee-howl as you chant.^"; + ], + life [ ; + Attack: + print "You "; + if (random(20) >= 8) + "strike the water creature, but your attack passes \ + harmlessly through it! You hear a strange noise from \ + the creature -- akin to a drowning man laughing."; + "attack the water spirit, but miss!"; + default: "It's too busy trying to kill you."; + ], + has animate concealed; + +Object mad_hermit "mad hermit" FUBLIO_Cave + with name "hermit" "madman" "mad", + description "He looks quite crazed -- his wild eyes \ +are almost unbearable to watch. His clothes are complete \ +tatters, and he looks rather emaciated.", + each_turn [ i ; + i = random(10); + switch(i) { + 1: "^The hermit stares at you and screams. \ +~Demon, trickster -- you'll not fool me again!~"; + 2: "^The hermit smiles at you. ~Come to pay \ +your respects to an old man, Humboz? I know it's you.~"; + 3: "^The hermit shrinks into a corner and weeps. ~No more, no more. I \ +can help you no more.~"; + 4: "^The hermit hums a little tune."; + 5: "^The hermit talks to someone or thing unseen. \ +~Closer, closer, nary a sound betray...~"; + 6: "^The hermit grabs your shoulder. ~I am hampered,~ \ +he pleads with you, ~by the lack of an algebraic solution! \ +That was where I went wrong!~"; + 7: "^The hermit babbles something about a shining \ +tower on a hill."; + 8: "^The hermit pauses. ~Listen, do you hear them? \ +The voices -- everywhere!~"; + default: "^The hermit giggles for no reason."; + } + ], + life [; + Answer: + if (special_word=='hello') + "~We meet again, do we not?~"; + Ask: + switch (second) { + 'exit', 'outside': "The hermit laughs. \ +~You want to leave already? Very well, you'll find \ +the exit where you came in.~"; + 'entrance': + print "The hermit chuckles. ~Forgotten where \ +you came in? It hasn't gone anywhere."; + if (FUBLIO_Cave.number == 1) { + FUBLIO_Cave.number = 2; + "~ He points at a space in the south wall, which \ +you realize is actually a well-hidden tunnel."; + } + else "~"; + ! 'sack': "~A fine pet, mine and mine forever.~"; + 'food', 'fish': "~My friends of the deep, they \ +sacrifice themselves for me, as I will some day for them.~"; + default: "~Many are the secrets you keep.~"; + } + Give: + if (noun has edible) { + print "The hermit greedily takes ", (the) noun, " and \ +gobbles it quickly"; + remove noun; + if (p1 in self) { + move p1 to player; + print ". ~Good, yes. \ +I have something for you -- something you will treasure as I have.~ He \ +gives you a piece of parchment."; + } + "."; + } + "~No, no, I already have many of those.~"; + Attack, ThrowAt, Order: + "The hermit cowers in one corner of \ +the cave, screaming. You stop, and reconsider."; + Kiss: + "Tears run down the hermit's cheek."; + Show, Tell: + if (noun has edible) + "The hermit visibly salivates."; + "The hermit gibbers maniacally."; + ], + before [; + Cast: + "The hermit joins in with your chanting, and \ +twists the meaning of the words! You quickly stop."; + ], + time_left 0, + time_out [; + deadflag = 1; + "^The hermit seems to recognize you through his madness! \ +~You have returned! The Big Man! Biggest of them all! \ +Returned to deliver me from my prison. I had never forsaken \ +you!~^^\ +~Wait,~ you protest, ~stop this madness!~^^\ +But the crazed hermit continues. He prostrates in front \ +of you and babbles incoherently. ~I put all my faith \ +in you -- I have to leave here, before I go insane! \ +The others, they abandoned hope. But not me. No! \ +You have always had our best interests in mind.~^^\ +He begins an eerie, frenetic song that jars your very soul. \ +You watch the water level start to rise near the southern \ +entrance, and wait for the end."; + ], + has animate transparent; + + + +! ************ +! spells/scrolls +! ************ + +Object spotted_scroll "spotted scroll" FUBLIO_Cave + class scroll_class, + with name "spotted", +; + +Object bekdab_spell "turn iron to rust" spotted_scroll + class spell_class, + with name "bekdab", + magic [; + "Your chant goes unanswered. I guess you need pure iron."; + ], +; + +! ************ +! Misc objects +! ************ + + +Object sack "fur sack" sailboat + with name "sack" "fur", + description "A fairly large sack made of furs and animal \ +hides.", + ! weight 20, + size 24, + ! capacity 20, + has container openable; + +! (wet -- Anabais is one of four evil elemental powers) +Object p1 "wet parchment" mad_hermit + class parchment_class, + with name "wet", +description "~...evidence that there are more demons like \ +the evil Anabais! In fact, I suspect that four demons, not \ +one, faced the Ancient Ones in spiritual battle at the \ +dawn of time! To suspect this is...~"; + + +! 1st rod piece -- GRAY +Object gray_rod_piece "gray rod piece" In_Lighthouse + class rod_class, + with name "gray", + initial "In the center of the room is a short gray rod.", + description "It's a short section of a rod made of some \ +undeterminable hard substance, \ +colored gray like murky water. A piece of the Rod of \ +the Ancients, no doubt!", +; + +! 1st sphere - SILVER +Object silver_sphere "silver sphere" + class sphere_class, + with name "silver", + description "A tiny perfect silver sphere, made of some strange \ + unknown metal.", +; + diff --git a/src/gambit2.inf b/src/gambit2.inf new file mode 100644 index 0000000..05f4037 --- /dev/null +++ b/src/gambit2.inf @@ -0,0 +1,353 @@ + +! (level 2) + +Class Gambit_Room_Lev2_Class + with description "You are on the surface of a floating stone \ +cube. You can barely see another cube floating far above you in the \ +dim red light that illuminates the entire area.", + name "stone" "cube" "light", +has light; + +Object GAMBIT_21 "On Giant White Cube" + class Gambit_Room_Lev2_Class + with w_to + [ i ; + i = CheckGambit(n212,n312,2); + if (i ~= 2) return i; + else return GAMBIT_W21; + ], + s_to + [ i ; + i = CheckGambit(n213,n313,2); + if (i ~= 2) return i; + else return GAMBIT_W22; + ], +; + +Object GAMBIT_22 "On Giant White Cube" + class Gambit_Room_Lev2_Class + with e_to + [ i ; + i = CheckGambit(n224,n324,2); + if (i ~= 2) return i; + else return GAMBIT_W21; + ], + w_to + [ i ; + i = CheckGambit(n222,n322,2); + if (i ~= 2) return i; + else return GAMBIT_W21; + ], + s_to + [ i ; + i = CheckGambit(n223,n323,2); + if (i ~= 2) return i; + else return GAMBIT_W22; + ], +; + +Object GAMBIT_23 "On Giant White Cube" + class Gambit_Room_Lev2_Class + with e_to + [ i ; + i = CheckGambit(n234,n334,2); + if (i ~= 2) return i; + else return GAMBIT_W21; + ], + s_to + [ i ; + i = CheckGambit(n233,n333,2); + if (i ~= 2) return i; + else return GAMBIT_W22; + ], +; + +Object GAMBIT_24 "On Giant White Cube" + class Gambit_Room_Lev2_Class + with w_to + [ i ; + i = CheckGambit(n242,n342,2); + if (i ~= 2) return i; + else return GAMBIT_W21; + ], + n_to + [ i ; + i = CheckGambit(n241,n341,2); + if (i ~= 2) return i; + else return GAMBIT_W22; + ], + s_to + [ i ; + i = CheckGambit(n243,n343,2); + if (i ~= 2) return i; + else return GAMBIT_W22; + ], +; + +Object GAMBIT_25 "On Giant White Cube" + class Gambit_Room_Lev2_Class + with e_to + [ i ; + i = CheckGambit(n254,n354,2); + if (i ~= 2) return i; + else return GAMBIT_W21; + ], + w_to + [ i ; + i = CheckGambit(n252,n352,2); + if (i ~= 2) return i; + else return GAMBIT_W21; + ], + n_to + [ i ; + i = CheckGambit(n251,n351,2); + if (i ~= 2) return i; + else return GAMBIT_W22; + ], + s_to + [ i ; + i = CheckGambit(n253,n353,2); + if (i ~= 2) return i; + else return GAMBIT_W22; + ], +; + +Object GAMBIT_26 "On Giant White Cube" + class Gambit_Room_Lev2_Class + with e_to + [ i ; + i = CheckGambit(n264,n364,2); + if (i ~= 2) return i; + else return GAMBIT_W21; + ], + n_to + [ i ; + i = CheckGambit(n261,n361,2); + if (i ~= 2) return i; + else return GAMBIT_W22; + ], + s_to + [ i ; + i = CheckGambit(n263,n363,2); + if (i ~= 2) return i; + else return GAMBIT_W22; + ], +; + +Object GAMBIT_27 "On Giant White Cube" + class Gambit_Room_Lev2_Class + with w_to + [ i ; + i = CheckGambit(n272,n372,2); + if (i ~= 2) return i; + else return GAMBIT_W21; + ], + n_to + [ i ; + i = CheckGambit(n271,n371,2); + if (i ~= 2) return i; + else return GAMBIT_W22; + ], +; + +Object GAMBIT_28 "On Giant White Cube" + class Gambit_Room_Lev2_Class + with w_to + [ i ; + i = CheckGambit(n282,n382,2); + if (i ~= 2) return i; + else return GAMBIT_W21; + ], + n_to + [ i ; + i = CheckGambit(n281,n381,2); + if (i ~= 2) return i; + else return GAMBIT_W22; + ], + e_to + [ i ; + i = CheckGambit(n284,n384,2); + if (i ~= 2) return i; + else return GAMBIT_W21; + ], +; + +Object GAMBIT_29 "On Giant White Cube" + class Gambit_Room_Lev2_Class + with e_to + [ i ; + i = CheckGambit(n294,n394,2); + if (i ~= 2) return i; + else return GAMBIT_W21; + ], + n_to + [ i ; + i = CheckGambit(n281,n381,2); + if (i ~= 2) return i; + else return GAMBIT_W22; + ], +; + + +! (level 2 niches) + +Object n213 "southern niche" GAMBIT_21 + class niche_class + with name "southern", + counter_niche n241, + niche_dir 3; +Object n212 "western niche" GAMBIT_21 + class niche_class + with name "western", + counter_niche n224, + niche_dir 2; + +Object n224 "eastern niche" GAMBIT_22 + class niche_class + with name "eastern", + counter_niche n212, + niche_dir 4; +Object n223 "southern niche" GAMBIT_22 + class niche_class + with name "southern", + counter_niche n251, + niche_dir 3; +Object n222 "western niche" GAMBIT_22 + class niche_class + with name "western", + counter_niche n234, + niche_dir 2; + +Object n234 "eastern niche" GAMBIT_23 + class niche_class + with name "eastern", + counter_niche n222, + niche_dir 4; +Object n233 "southern niche" GAMBIT_23 + class niche_class + with name "southern", + counter_niche n261, + niche_dir 3; + +Object n241 "northern niche" GAMBIT_24 + class niche_class + with name "northern", + counter_niche n213, + niche_dir 1; +Object n242 "western niche" GAMBIT_24 + class niche_class + with name "western", + counter_niche n254, + niche_dir 2; +Object n243 "southern niche" GAMBIT_24 + class niche_class + with name "southern", + counter_niche n271, + niche_dir 3; + +Object n251 "northern niche" GAMBIT_25 + class niche_class + with name "northern", + counter_niche n223, + niche_dir 1; +Object n254 "eastern niche" GAMBIT_25 + class niche_class + with name "eastern", + counter_niche n242, + niche_dir 4; +Object n252 "western niche" GAMBIT_25 + class niche_class + with name "western", + counter_niche n264, + niche_dir 2; +Object n253 "southern niche" GAMBIT_25 + class niche_class + with name "southern", + counter_niche n281, + niche_dir 3; + +Object n264 "eastern niche" GAMBIT_26 + class niche_class + with name "eastern", + counter_niche n252, + niche_dir 4; +Object n261 "northern niche" GAMBIT_26 + class niche_class + with name "northern", + counter_niche n233, + niche_dir 1; +Object n263 "southern niche" GAMBIT_26 + class niche_class + with name "southern", + counter_niche n291, + niche_dir 3; + +Object n271 "northern niche" GAMBIT_27 + class niche_class + with name "northern", + counter_niche n243, + niche_dir 1; +Object n272 "western niche" GAMBIT_27 + class niche_class + with name "western", + counter_niche n284, + niche_dir 2; + +Object n281 "northern niche" GAMBIT_28 + class niche_class + with name "northern", + counter_niche n253, + niche_dir 1; +Object n282 "western niche" GAMBIT_28 + class niche_class + with name "western", + counter_niche n294, + niche_dir 2; +Object n284 "eastern niche" GAMBIT_28 + class niche_class + with name "eastern", + counter_niche n272, + niche_dir 4; + +Object n291 "northern niche" GAMBIT_29 + class niche_class + with name "northern", + counter_niche n263, + niche_dir 1; +Object n294 "eastern niche" GAMBIT_29 + class niche_class + with name "eastern", + counter_niche n282, + niche_dir 4; + +! (level 2 initial wood beam layout) + +Object e21 "ebony beam" n282 class ebony_beam_class; +Object e211 "ebony beam" n294 class ebony_beam_class with number 99; + +Object p21 "pine beam" n213 class pine_beam_class; +Object p211 "pine beam" n241 class pine_beam_class with number 99; +Object p22 "pine beam" n243 class pine_beam_class; +Object p221 "pine beam" n271 class pine_beam_class with number 99; +Object p23 "pine beam" n242 class pine_beam_class; +Object p231 "pine beam" n254 class pine_beam_class with number 99; +Object p24 "pine beam" n252 class pine_beam_class; +Object p241 "pine beam" n264 class pine_beam_class with number 99; + +! (side note: with balsa beams, 2nd side need not be 99, since +! it will always break on the first try, and the default number is 0 +Object b21 "balsa beam" n212 class balsa_beam_class; +Object b211 "balsa beam" n224 class balsa_beam_class; +Object b22 "balsa beam" n222 class balsa_beam_class; +Object b221 "balsa beam" n234 class balsa_beam_class; +Object b23 "balsa beam" n223 class balsa_beam_class; +Object b231 "balsa beam" n251 class balsa_beam_class; +Object b24 "balsa beam" n233 class balsa_beam_class; +Object b241 "balsa beam" n261 class balsa_beam_class; +Object b25 "balsa beam" n253 class balsa_beam_class; +Object b251 "balsa beam" n281 class balsa_beam_class; +Object b26 "balsa beam" n263 class balsa_beam_class; +Object b261 "balsa beam" n291 class balsa_beam_class; +Object b27 "balsa beam" n272 class balsa_beam_class; +Object b271 "balsa beam" n284 class balsa_beam_class; + diff --git a/src/gambit3.inf b/src/gambit3.inf new file mode 100644 index 0000000..a8a534b --- /dev/null +++ b/src/gambit3.inf @@ -0,0 +1,463 @@ + +! (level 3) + +Class Gambit_Room_Lev3_Class + with description "You are on the surface of a floating stone \ +cube. The red light from below seems a bit brighter here.", + name "stone" "cube" "light", +has light; + +Object GAMBIT_31 "On Giant White Cube" + class Gambit_Room_Lev3_Class + with w_to + [ i ; + i = CheckGambit(n312,0,3); + if (i ~= 2) return i; + else return GAMBIT_W31; + ], + s_to + [ i ; + i = CheckGambit(n313,0,3); + if (i ~= 2) return i; + else return GAMBIT_W32; + ], +; + +Object GAMBIT_32 "On Giant White Cube" + class Gambit_Room_Lev3_Class + with e_to + [ i ; + i = CheckGambit(n324,0,3); + if (i ~= 2) return i; + else return GAMBIT_W31; + ], + w_to + [ i ; + i = CheckGambit(n322,0,3); + if (i ~= 2) return i; + else return GAMBIT_W31; + ], + s_to + [ i ; + i = CheckGambit(n323,0,3); + if (i ~= 2) return i; + else return GAMBIT_W32; + ], +; + +Object GAMBIT_33 "On Giant White Cube" + class Gambit_Room_Lev3_Class + with e_to + [ i ; + i = CheckGambit(n334,0,3); + if (i ~= 2) return i; + else return GAMBIT_W31; + ], + s_to + [ i ; + i = CheckGambit(n333,0,3); + if (i ~= 2) return i; + else return GAMBIT_W32; + ], +; + +Object GAMBIT_34 "On Giant White Cube" + class Gambit_Room_Lev3_Class + with w_to + [ i ; + i = CheckGambit(n342,0,3); + if (i ~= 2) return i; + else return GAMBIT_W31; + ], + n_to + [ i ; + i = CheckGambit(n341,0,3); + if (i ~= 2) return i; + else return GAMBIT_W32; + ], + s_to + [ i ; + i = CheckGambit(n343,0,3); + if (i ~= 2) return i; + else return GAMBIT_W32; + ], +; + +Object GAMBIT_35 "On Giant White Cube" + class Gambit_Room_Lev3_Class + with e_to + [ i ; + i = CheckGambit(n354,0,3); + if (i ~= 2) return i; + else return GAMBIT_W31; + ], + w_to + [ i ; + i = CheckGambit(n352,0,3); + if (i ~= 2) return i; + else return GAMBIT_W31; + ], + n_to + [ i ; + i = CheckGambit(n351,0,3); + if (i ~= 2) return i; + else return GAMBIT_W32; + ], + s_to + [ i ; + i = CheckGambit(n353,0,3); + if (i ~= 2) return i; + else return GAMBIT_W32; + ], +; + +Object GAMBIT_36 "On Giant White Cube" + class Gambit_Room_Lev3_Class + with e_to + [ i ; + i = CheckGambit(n364,0,3); + if (i ~= 2) return i; + else return GAMBIT_W31; + ], + n_to + [ i ; + i = CheckGambit(n361,0,3); + if (i ~= 2) return i; + else return GAMBIT_W32; + ], + s_to + [ i ; + i = CheckGambit(n363,0,3); + if (i ~= 2) return i; + else return GAMBIT_W32; + ], +; + +Object GAMBIT_37 "On Giant White Cube" + class Gambit_Room_Lev3_Class + with w_to + [ i ; + i = CheckGambit(n372,0,3); + if (i ~= 2) return i; + else return GAMBIT_W31; + ], + n_to + [ i ; + i = CheckGambit(n371,0,3); + if (i ~= 2) return i; + else return GAMBIT_W32; + ], +; + +Object GAMBIT_38 "On Giant White Cube" + class Gambit_Room_Lev3_Class + with w_to + [ i ; + i = CheckGambit(n382,0,3); + if (i ~= 2) return i; + else return GAMBIT_W31; + ], + n_to + [ i ; + i = CheckGambit(n381,0,3); + if (i ~= 2) return i; + else return GAMBIT_W32; + ], + e_to + [ i ; + i = CheckGambit(n384,0,3); + if (i ~= 2) return i; + else return GAMBIT_W31; + ], +; + +Object GAMBIT_39 "On Giant White Cube" + class Gambit_Room_Lev3_Class + with e_to + [ i ; + i = CheckGambit(n394,0,3); + if (i ~= 2) return i; + else return GAMBIT_W31; + ], + n_to + [ i ; + i = CheckGambit(n381,0,3); + if (i ~= 2) return i; + else return GAMBIT_W32; + ], +; + + +! (level 3 niches) + +Object n313 "southern niche" GAMBIT_31 + class niche_class + with name "southern", + counter_niche n341, + niche_dir 3; +Object n312 "western niche" GAMBIT_31 + class niche_class + with name "western", + counter_niche n324, + niche_dir 2; + +Object n324 "eastern niche" GAMBIT_32 + class niche_class + with name "eastern", + counter_niche n312, + niche_dir 4; +Object n323 "southern niche" GAMBIT_32 + class niche_class + with name "southern", + counter_niche n351, + niche_dir 3; +Object n322 "western niche" GAMBIT_32 + class niche_class + with name "western", + counter_niche n334, + niche_dir 2; + +Object n334 "eastern niche" GAMBIT_33 + class niche_class + with name "eastern", + counter_niche n322, + niche_dir 4; +Object n333 "southern niche" GAMBIT_33 + class niche_class + with name "southern", + counter_niche n361, + niche_dir 3; + +Object n341 "northern niche" GAMBIT_34 + class niche_class + with name "northern", + counter_niche n313, + niche_dir 1; +Object n342 "western niche" GAMBIT_34 + class niche_class + with name "western", + counter_niche n354, + niche_dir 2; +Object n343 "southern niche" GAMBIT_34 + class niche_class + with name "southern", + counter_niche n371, + niche_dir 3; + +Object n351 "northern niche" GAMBIT_35 + class niche_class + with name "northern", + counter_niche n323, + niche_dir 1; +Object n354 "eastern niche" GAMBIT_35 + class niche_class + with name "eastern", + counter_niche n342, + niche_dir 4; +Object n352 "western niche" GAMBIT_35 + class niche_class + with name "western", + counter_niche n364, + niche_dir 2; +Object n353 "southern niche" GAMBIT_35 + class niche_class + with name "southern", + counter_niche n381, + niche_dir 3; + +Object n364 "eastern niche" GAMBIT_36 + class niche_class + with name "eastern", + counter_niche n352, + niche_dir 4; +Object n361 "northern niche" GAMBIT_36 + class niche_class + with name "northern", + counter_niche n333, + niche_dir 1; +Object n363 "southern niche" GAMBIT_36 + class niche_class + with name "southern", + counter_niche n391, + niche_dir 3; + +Object n371 "northern niche" GAMBIT_37 + class niche_class + with name "northern", + counter_niche n343, + niche_dir 1; +Object n372 "western niche" GAMBIT_37 + class niche_class + with name "western", + counter_niche n384, + niche_dir 2; + +Object n381 "northern niche" GAMBIT_38 + class niche_class + with name "northern", + counter_niche n353, + niche_dir 1; +Object n382 "western niche" GAMBIT_38 + class niche_class + with name "western", + counter_niche n394, + niche_dir 2; +Object n384 "eastern niche" GAMBIT_38 + class niche_class + with name "eastern", + counter_niche n372, + niche_dir 4; + +Object n391 "northern niche" GAMBIT_39 + class niche_class + with name "northern", + counter_niche n363, + niche_dir 1; +Object n394 "eastern niche" GAMBIT_39 + class niche_class + with name "eastern", + counter_niche n382, + niche_dir 4; + +! (level 3 initial wood beam layout) +! wood beam, as two 'halves' + +Object p31 "pine beam" n322 class pine_beam_class; +Object p311 "pine beam" n334 class pine_beam_class with number 99; + +! (side note: with balsa beams, 2nd side need not be 99, since +! it will always break on the first try, and the default number is 0 +Object b31 "balsa beam" n312 class balsa_beam_class; +Object b311 "balsa beam" n324 class balsa_beam_class; +Object b32 "balsa beam" n313 class balsa_beam_class; +Object b321 "balsa beam" n341 class balsa_beam_class; +Object b33 "balsa beam" n323 class balsa_beam_class; +Object b331 "balsa beam" n351 class balsa_beam_class; +Object b34 "balsa beam" n333 class balsa_beam_class; +Object b341 "balsa beam" n361 class balsa_beam_class; +Object b35 "balsa beam" n342 class balsa_beam_class; +Object b351 "balsa beam" n354 class balsa_beam_class; +Object b36 "balsa beam" n352 class balsa_beam_class; +Object b361 "balsa beam" n364 class balsa_beam_class; +Object b37 "balsa beam" n343 class balsa_beam_class; +Object b371 "balsa beam" n371 class balsa_beam_class; +Object b38 "balsa beam" n353 class balsa_beam_class; +Object b381 "balsa beam" n381 class balsa_beam_class; +Object b39 "balsa beam" n363 class balsa_beam_class; +Object b391 "balsa beam" n391 class balsa_beam_class; +Object b3a "balsa beam" n372 class balsa_beam_class; +Object b3a1 "balsa beam" n384 class balsa_beam_class; +Object b3b "balsa beam" n382 class balsa_beam_class; +Object b3b1 "balsa beam" n394 class balsa_beam_class; + + +! extra goodies... + +Object Gambit_hole "large round hole" GAMBIT_37 + with name "hole" "round", + initial "In the center of the room is a large round \ +hole, going straight down through the floating cube.", + description "A large round hole cut straight through the \ +giant cube you stand on. All you need is a huge square peg.", + size 30, + before [; + Enter: + if (fire_spirit in GAMBIT_37) + "The towering fire spirit blocks your way!"; + print "^You close your eyes and jump straight \ +into the hole! There is a bright flash of light...^"; + Achieved(5); + PlayerTo(GAMBIT_11); + return 2; + Receive: + if (fire_spirit in GAMBIT_37) + "The towering fire spirit is in your way!"; + move noun to GAMBIT_11; + print "You drop "; DefArt(noun); + " into the hole. There is a bright flash of light, and \ +the object disappears!"; + Rub, Push, Pull, Touch, Squeeze, Turn, Shake: +"I don't know how to do that to a giant hole."; + ], + after [; + Search: + if (fire_spirit in GAMBIT_37) + "The towering fire spirit fills the hole currently!"; +else "Looking through the hole, you can see a reddish haze \ +far below."; + ], + has static container open enterable; + +! rod piece -- SMOKE +Object smoke_rod_piece "smoke rod piece" GAMBIT_37 + class rod_class, + with name "smoke", + initial "Sitting on the floor is a short smoke-colored rod.", + description "It's a short section of a rod made of some \ +undeterminable hard substance, \ +colored smoke. A piece of the Rod of \ +the Ancients, no doubt!", +; + + +Object fire_spirit "fire spirit" GAMBIT_37 + with name "spirit", + description "It looks like a tower of animated flame.", + 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; + "^Suddenly, a flash of flame bursts through the hole \ +in the center of the cube! A living tower of flame attacks!"; + } + i = random(5); + if (i == 1) { + deadflag = 1; + "^The fire creature engulfs you in a deadly inferno! \ +You are burned to a crisp."; + } + 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 fire spirit was too much for \ +you, I'm afraid to say. The spirit senses your \ +weakness and engulfs you in flame."; + } + print "^The fir spirit "; + if (i==2) + "singes you with a jet of fire!"; + if (i==3) { + "sends a small ball of \ +flame your way! You get slightly burned!"; + } + "tries to torch you in a sheet of \ +flame, but you evade just in time!"; + ], + before [; + Cast: + if (the_spell_was == swanko_spell) { + remove self; + "As you speak the chant, the fire spirit falls back \ +in fear! You finish the chant, and the fire spirit \ +dissipates into harmless smoke, banished!"; + } + print "Crackling flame drowns out your chant.^"; + ], + life [ ; + Attack: + if (random(20) >= 8) + "You strike the fire creature, but your attack passes \ + harmlessly through it! You hear a crackling noise \ +that could pass for laughter."; + "You attack the fire spirit, but miss!"; + default: "It's too busy trying to kill you."; + ], + has animate concealed; diff --git a/src/gurth.inf b/src/gurth.inf new file mode 100644 index 0000000..8d420a0 --- /dev/null +++ b/src/gurth.inf @@ -0,0 +1,925 @@ + +! ************************************************************** +! GURTH.INF -- Add-on for SPIRITWRAK +! (all rights reserved, copyright 1996, D. Yu +! ************************************************************** + +! (author note to self -- Gurth currently isn't going to be too +! exciting -- I'm running out of .z5 code space. The main +! planned features are: +! 1) The abandoned house with the oven for baking the cake +! 2) A deep forest area somewhat north of the city where +! a sphere piece will be hidden + +! The string array for labels on the GUE Oven dial (may be changed) +Array OVEN_settings table [; + "Warm Soup"; + "Hot Chocolate"; + "Pizza"; + "Cake"; + "Fish"; + "Roast Chicken"; + "Baked Potato"; + "Rib Roast"; + "Thermo-nuclear Flash"; +]; + +Object GURTH_GUSStop "Gurth City Streets" + with description "A foggy sky covers the ever-busy city of \ +Gurth. A road heads southeast into a larger \ +portion of the city, and stairs lead down here.", + name "fog" "sky" "road" "stairs", + d_to GURTH_GUSStation, + se_to GURTH_NDistrict, + has light; + +Object umbrella "umbrella" GURTH_GUSStop + with name "umbrella", + description [; + if (self has open) + print "An open"; + else print "A closed"; + " black-cloth umbrella."; + ], + !weight 25, + size 16, + article "an", + before [; + Open: + if (parent(self) == player) { + give self open; + umbrella.size = 20; + "You snap the umbrella open."; + } + else "You need to be holding the umbrella to do that."; + Close: + if (parent(self) == player) { + give self ~open; + umbrella.size = 16; + "You snap the umbrella closed."; + } + else "You need to be holding the umbrella to do that."; + ], + has openable; + +Object GURTH_NDistrict "North District" + with description "Probably the safest district in Gurth, the \ +North District is mostly cobblestone roads and barricaded \ +buildings. A main road heads south, or forks northwest and \ +northeast.", + name "cobblestone" "buildings" "road", + nw_to GURTH_GUSStop, + s_to GURTH_MDistrict, + ne_to GURTH_Forest, + has light; + +Object GURTH_Forest "Forest Edge" + with description "Dark forest meets dark city outskirts here. \ +The only exit is along an old path to the southwest -- \ +the forest is too thick for travel otherwise. \ +Rain falls periodically from a dark stormy sky.", + name "forest" "path" "rain", + sw_to GURTH_NDistrict, + each_turn [; + if (random(10) < 4) { + "^A rumble of thunder booms overhead."; + } + ], + before [; + Listen: + if (Treant in GURTH_Forest) + "You hear muffled cries for help from \ +somewhere inside the log cabin!"; + ], + has light; + +Object storm1 "storm" GURTH_Forest + with name "storm" "clouds" "sky" "dark", + description "It does look a bit stormy overhead.", + before [; + Cast: + if (the_spell_was == shazok_spell) { + print "A bolt of lightning rips down from the \ +clouds overhead as you finish your chant! It strikes "; + if (Treant in GURTH_Forest) { + print "the angry treant! \ +A portion of its top branches catch fire! Howling in pain, \ +the creature runs off into the woods and disappears!"; + SaveWoodsman(); + rtrue; + } + else { + deadflag = 1; + "you, frying you to a crisp!"; + } + } + ], + has scenery; + +Object Treant "angry treant" GURTH_Forest + with name "treant" "angry" "blighted", + description "Treants are basically animated trees. They \ +are considered mythical creatures, usually solitary and quite \ +rare. This particular treant looks similar to a great elm tree. \ +You notice that it seems covered with spots of some sort of \ +blight.", + article "an", + each_turn [ i ; + i = random(20); + print "^The treant "; + if (i > 10) { + if (WOOD_House.number == 3) { + WOOD_House.number = 4; + remove self; + "pounds the cabin, and it collapses into \ +splinters! The treant grabs a hapless woodsman from the \ +wreckage and stalks off into the forest with his victim!"; + } + else { + WOOD_House.number = WOOD_House.number + 1; + "hammers on the house and you hear a \ +crack! The cabin sustains some damage!"; + } + } + else "angrily attacks the wood cabin, which shakes \ +with the continued blows."; + ], + before [; + Cast: + if (the_spell_was == egdelp_spell) { + deadflag = 1; + "The treant is covered with a waxy buildup, which \ +washes off in the rain. The treant, already \ +rather incensed, turns his attentions to you and mauls you \ +with two giant branches/arms."; + } + if (the_spell_was == throck_spell) { + deadflag = 1; + "The treant grows a bit bigger. His current bad \ +mood seems to increase proportionately! He turns his attentions \ +to you and pounds you with two huge branches/arms."; + } + if (the_spell_was == taclor_spell) { + print "The treant seems to turn a shade of deep \ +green, and the patches of blight disappear! The ancient tree \ +creature pauses, regards you solemnly, and then walks \ +off into the forest."; + SaveWoodsman(); + rtrue; + } + ], + has animate; + +Object WOOD_House "log cabin" GURTH_Forest + with name "cabin" "log" "house", + description [; + print "A small house built of logs"; + switch (self.number) { + 0: print "."; + 1: print ". It looks slightly damaged."; + 2: print ". It looks partially damaged, the roof logs \ +are broken in several places."; + 3: print ". It looks very damaged. One wall is \ +nearly broken through."; + default: print " that has collapsed into little more \ +than a pile of broken logs."; + } + if (self has general) + " You notice some area of wood have spots of wax \ +on them."; + new_line; + rtrue; + ], + before [; + Enter: + if (Treant in GURTH_Forest) + "The angry treant seems to be in the way."; + "It's just a tiny log cabin that probably \ +has nothing interesting inside."; + Cast: + if (the_spell_was == egdelp_spell) { + give self general; + "The outside of the cabin is now covered \ +with spots of waxy buildup."; + } + ], + number 0, + has static; + +[ SaveWoodsman ; + remove Treant; + move red_sphere to player; + "^^Moments later, a woodsman appears from the battered log \ +cabin. ~Much thanks, sir,~ he says. ~Appears I mistook that \ +treant for a dead tree and tried to cut it down. Can't say \ +he took it too well.~ he says sheepishly. ~Say, you don't \ +look like you're from around these parts. Kinda like this \ +funny thing I found in the woods the other day.~ He hands \ +you a strange round object. ~Maybe you know what to do with \ +it?~ He hefts a small hatchet over his shoulder. ~Well, \ +back to do a little logging,~ he says, as he walks off into the \ +deep forest, whistling."; +]; + +Object GURTH_MDistrict "Market District" + with description "The famous Gurth Market District is as noisy, \ +crowded, and dangerous as it ever was. A cobblestone road heads \ +north and south here.", + name "cobblestone" "road", + n_to GURTH_NDistrict, + s_to GURTH_SDistrict, + e_to "~Get out 'o me way!~ some rude fellow says as you \ +try to pass.", + w_to "~No push'n, no shov'n!~ some old hag screams at you, \ +and promptly shoves you back.", + each_turn [; + if ((random(10) < 5) && (self hasnt general)) { + give self general; + move c7 to self; + "^A clumsy hawker stumbles into you as he \ +crosses the street, hustling off without so much as an \ +apology. You notice he dropped something in his hurry."; + } + ], + has light; + +Object c7 "coin" class coin_class; + +Object GURTH_SDistrict "South District" + with description "The general gloomy atmosphere is more noticeable \ +than ever here, in the extremely dangerous South District. The \ +general area is filled with boarded-up houses, and a few shifty-eyed \ +characters are the only people milling about here. A road leads \ +north. To the east is an abandoned flat, probably in better shape \ +than the rest.", + name "houses" "characters" "people" "road" "flat", + n_to GURTH_MDistrict, + s_to [; + print "You wander down "; + if (random(20) == 5) { + deadflag = 1; + "a back alleyway, and are immediately \ +assaulted by a group of vicious thugs, who batter you senseless."; + } + else "an alleyway, find a dead-end, and return \ +here."; + ], + w_to [; + print "You wander down "; + if (random(20) == 5) { + deadflag = 1; + "a sidestreet, and are immediately \ +assaulted by a group of vicious thugs. One of them seems to \ +recognize you. ~That's the Preacher-man who got Davey arrested! \ +Let's show 'em what we think'o that!~ They proceed to beat you senseless."; + } + else "a sidestreet, find a dead-end, and return \ +here."; + ], + e_to GURTH_House, + has light; + +Object GURTH_House "Front of House" + with description "You're standing at the rotting front steps of \ +a small flat. The front door to the east has been battered down and \ +you could probably walk right in, or return to the street to \ +the west.", + name "street" "steps" "flat", + w_to GURTH_SDistrict, + e_to House_Ent, + in_to House_Ent, + has light; + +Object GURTH_House2 "Front of House" + with description "You're standing near a small construction site. \ +A city street lies west, and a construction ditch is east.", + name "street" "ditch", + w_to [; + deadflag = 1; + "You step into the street, and several locals \ +give you strange looks. The surrounding neighborhood seems \ +new and busy -- various construction sites mark the \ +work of enterprising shop-keepers of the area.^^\ +~Watch out there!~ someone cries. A sudden \ +pile of bricks falls from a nearby scaffolding, and \ +crushes you."; + ], + e_to Construction_site, + has light; + + +Object bad_brick "dusty brick" GURTH_House2 + with name "brick" "dusty" "old", + initial "An old discarded brick lies nearby.", + description "An old brick, slightly cracked in several places.", + size 15, + time_left 0, + time_out [; + ! Construction Worker appears + if ((good_brick in Construction_site) || + ((good_brick notin Construction_site) && + (bad_brick notin Construction_site))) { + remove good_brick; + foundation_wall.number = 1; + } + else { + remove bad_brick; + foundation_wall.number = 2; + } + if (location == Construction_site) { + print "^From behind some scaffolding, a construction \ +worker appears. He walks to a part of the ditch and starts to \ +make some finishing touches on part of a low wall. \ +He finds a brick nearby and applies it to the wall with \ +a good patch of mortar."; + if (foundation_wall.number == 1) +" Brushing himself off, he walks off \ +and is soon out of sight."; + else +" He looks at the patch somewhat \ +unsatisfied, but shrugs, and walks off, soon out of sight."; + } + else + "^You hear some brief noises from the east."; + ], +; + +Object Construction_site "Construction Site" +with description "This is a long square ditch that is \ +likely to be the starting point for some building. It is \ +framed by wood slats and short brick walls. The only way \ +out is to the west.", + name "ditch" "slats" "wood", + w_to GURTH_House2, + has light; + +Object good_brick "thick brick" Construction_site + with name "brick" "thick", + !weight 30, + size 15, + initial "A thick brick lies nearby.", + description "A thick brick, solid as a rock.", +; + +Object foundation_wall "portion of wall" Construction_site + with name "wall" "foundation" "portion" "hole" "recess", + initial "You notice a foundation side wall \ +in the ditch.", + number 0, + size 15, + description [; + switch (self.number) { + 0: "It looks somewhat unfinished. Part of it \ +is open into a dark recess in the side of the ditch."; + 1: "The wall is a finished work of brick and \ +mortar. It looks quite strong."; + 2: "The wall is a finished work of brick and \ +mortar. You see a spot where the brickwork seems a bit \ +lower in quality."; + } + ], + before [; + Receive: + if (self.number > 0) + "The wall is currently sealed shut."; + else { + move noun to self; + print "You put ", (the) noun, " into the "; + "small hole in the wall."; + } + Search, LetGo: + if (self.number > 0) + "The wall is currently sealed shut."; + Attack: + if (self.number == 0) { + deadflag = 1; + "You kick at the wall. Unfortunately, it wasn't \ +all that stable, and the wall falls apart, burying you under a \ +pile of loose bricks."; + } + if (self.number == 1) { + remove foundation; + print "You try to break the wall, but only end up \ +hurting your hand. "; + } + else { + give foundation general; + print "You knock on the weak portion of the \ +wall, and produce a slight crack, that no doubt will \ +cause the homeowners some worry in the future. "; + } +! give GURTH_House ~general; + while (child(player) ~= 0) remove child(player); +! while (child(GURTH_House) ~= 0) remove child(GURTH_House); +print "The wall seems to start to glow a purple color, and you \ +step back, to find your surroundings replaced by cold natural \ +cave walls.^"; + Mystical_Cave.number = Mystical_Cave.number + 1; + PlayerTo(Mystical_Cave); + rtrue; + ], + has static container open; + +Object House_Ent "Entrance Room" + with description "A bare room, with peeling paint and rotting, \ +water-stained walls. There's a room to the east, and a rickety \ +stairway down. The outdoors lie west.", + name "paint" "stairway" "outdoors", + e_to House_Kitchen, + d_to House_Basement, + w_to GURTH_House, + out_to GURTH_House, + has light; + +Object House_Basement "Basement" + with description "A musty, smelly basement. Stairs head up.", + name "stairs", + u_to House_Ent, + before [; + Smell: "It's smells musty down here, as though \ +the place has been unused for quite some time."; + ], +; + +Object House_switchbox "dusty metal box" House_Basement + with name "dusty" "metal" "box", + when_closed "There's a dusty metal box attached to the wall here.", + when_open [ x; + print "There's an open metal box attached to the wall here. "; + x = children(self); + if (x == 0) "It seems to be empty."; + print "It contains:^"; + x = FULLINV_BIT + INDENT_BIT + NEWLINE_BIT + RECURSE_BIT; + WriteListFrom (child(self), x, 1); + rtrue; + ], + capacity 3, + size 10, + description "A dusty metal box, attached to the wall.", + before [; + Open, Push, Pull, Turn, Touch: + if (GHOST in House_Basement) + "Slowly, but quite deliberately, the zombie \ +prevents you from getting near the box."; + ], + has static container openable; + + +Object wire "thin wire" House_switchbox + with name "wire" "thin", + ! initial "Inside the box is a loose wire.", + description "A thin stiff string of metal.", + !weight 2, + size 1, ! must fit in subway gate slot... + before [; + Cast: +if ((the_spell_was == huncho_spell or luncho_spell) && + (self hasnt general)) +"Your chant goes unanswered."; + Take, Push, Pull, Touch, Rub, Squeeze: + if (self hasnt general) { + if (rubber_gloves has worn) { + if (action==##Take) give self general; + print "As you touch the wire, you notice a \ +bright spark! Good thing you were wearing rubber gloves! "; + } + else { + print "As your fingers get near the wire, \ +a bright spark of electricity "; + if (random(10) < 4) { + deadflag = 1; + move GHOST to House_Basement; +"arcs into your hand! The results are quite shocking, I'm afraid."; + } + else +"flashes near your fingers! You pull back just in time."; + } + } + ], +; + +Object foundation "foundation" House_Basement + with name "foundation" "break" "hole", + initial "A large break in the wall exposes a good portion of \ + the house's foundation.", + description "Water damage, or simply age, has exposed a large \ + hole in one of the walls, through which you can see exposed \ + wood and brick, part of the foundation of the house.", + before [; + Receive: + "No need to put things in the foundation like that."; + Search: + if (self hasnt general) + "You briefly search the decaying foundation, but find nothing."; + else { + print "You dig around in a familiar spot in the hole "; + give self ~general; + if (children(foundation_wall) == 0) + "but find nothing."; + Achieved(17); + while (child(foundation_wall) ~= 0) + move child(foundation_wall) to House_Basement; + "and find something!"; + } + ], + has static; + +Object House_Kitchen "Kitchen" + with description "You're in the kitchen, by the looks of things. \ +Some broken cabinets are on the wall. Light from partially boarded-up \ +windows lets you see the rotting wood floors. Rooms lie to the \ +north and west.", + name "cabinets" "windows" "wood", + w_to House_Ent, + n_to House_Pantry, + has light; + +! (An oven, a typical inform object) +Object OVEN "GUE-Automatic oven" House_Kitchen + with name "oven" "GUE-Automatic", + when_closed "Strangely untouched and undamaged, a GUE-Automatic oven is \ +sitting closed in a corner of the room.", + capacity 1, + when_open [ x; + print "Strangely untouched and undamaged, a GUE-Automatic oven is \ +sitting open in a corner of the room."; + x = children(self); + if (x == 0) " It seems to be empty."; + print " It contains:^"; + x = FULLINV_BIT + INDENT_BIT + NEWLINE_BIT + RECURSE_BIT; + WriteListFrom (child(self), x, 1); + rtrue; + ], + size 15, + description "A FrobozzCo best-seller -- this small green oven is \ +perfect for those adventurers who want a home-cooked meal, but are short \ +on time and space. There's a dial and a button \ +on the top.", + before + [ x ; + Open: + if (self hasnt open) { + give self open; + print "You open the oven, "; + x = children(self); + if (x==0) "which is empty."; + print "revealing:^"; + x = FULLINV_BIT + INDENT_BIT + NEWLINE_BIT + RECURSE_BIT; + WriteListFrom (child(self), x, 1); + rtrue; } + ], + add_to_scope oven_dial oven_button, + has static container openable; + +Object oven_dial "oven dial" + with name "dial", + number 5, + description [; + print "A round dial with small printed words. A line on the \ +oventop marks which dial setting is currently active, which at the \ +moment is ~", (string) OVEN_settings-->(oven_dial.number); "~."; + ], + before [; + Turn: + oven_dial.number = oven_dial.number + 1; + if (oven_dial.number > 9) oven_dial.number = 1; + print "The line is now pointing to ~", (string) OVEN_settings-->(oven_dial.number); + "~ on the dial."; + SetTo: + "The dial has somewhat unusual \ +settings. You'll need to turn to the one you want."; + ], + has static; + +Object oven_button "oven button" + with name "button" "black", + number 0, + description "A small round black button on the top of the oven.", + before [; + Push: + if (OVEN has open) + "There is an irritated buzz."; + else { + print "You press the button and hear a low spinning noise. \ +Suddenly, the oven makes a "; + if (oven_dial.number == 9) { + ! Ye old nuclear flash setting + if (children(OVEN) ~= 0) + remove child(OVEN); +"tremendous 'bang', and nearly springs off \ +the floor! A bright flash of light seems to originate from somewhere \ +inside the oven! Then, just as suddenly, everything is quiet again."; + } + ! check object in oven + ! if obj exists, check for edible + ! or cake, mutate appropriately. + if (children(OVEN) ~= 0) { + if ((Baking_Pan in oven) && (cake in Baking_Pan)) { + ! we're no doubt cooking the cake again. + ! as a nice feature of the GUE auto, if the cake + ! was undone, and the oven setting == 4, give + ! the cake the 'done' result + if ((cake.number == 1) && (oven_dial.number == 4)) + cake.number = 0; + ! otherwise, nothing changes + } + if ((Baking_Pan in oven) && (dough in Baking_Pan)) { + ! first, check oven setting (too cold or too hot) + ! if setting ok, check number of times folded + ! (too few, too many). Move 'cake' to pan, make + ! dough child of cake, and set the 'result' number + ! of cake accordingly (0, ok, 1 underdone, 2 + ! overdone, 3 underfolded, 4 overfolded) + ! (assumption is that dough will be only thing + ! in pan [add's are trapped by dough] + move dough to cake; ! Zen cooking... + move cake to Baking_Pan; + if (oven_dial.number == 4) { + if (dough.number < 83) + cake.number = 3; + if (dough.number > 83) + cake.number = 4; + else cake.number = 0; ! well done baker + } + else { + if (oven_dial.number < 4) + cake.number = 1; + if (oven_dial.number > 4) + cake.number = 2; + } + } + } +"a loud 'pop' and nearly springs off \ +the floor! Then, just as suddenly, everything is quiet again."; + } + ], + has static; + +Object House_Pantry "Pantry" + with description "This was once probably a pantry of some \ +sort. It's now a bare closet-sized room. The exit is south.", + s_to House_Kitchen, + has light; + +Object Baking_Pan "baking pan" House_Pantry + with name "pan" "baking", + description "It's a nice round flat-bottomed ceramic pan.", + capacity 20, + !weight 10, + size 14, + before + [ i ; + Mix: + if (children(Baking_Pan) == 0) + "There doesn't seem to be anything in the pan to mix."; + else { + if (cake in Baking_Pan) + "You can't mix anything with the already baked cake in the pan."; + ! if the dough is already in the pan, add the + ! 'new children', if any + if (dough in Baking_Pan) { + i = 0; + move dough to OVEN; ! Temp + while (child(Baking_Pan) ~= 0) { + i = i + 1; + move child(Baking_Pan) to dough; + } + move dough to Baking_Pan; + if (i == 0) + "You need to add something to the pan if you \ +want to mix something new into the dough."; + "You mix in the new ingredients into the dough."; + } + ! Minimally, if the flour, butter and egg are in the + ! pan, 'dough' will be produced + if ((flour notin Baking_Pan) || + (corbie_egg notin Baking_Pan) || + (butter notin Baking_Pan)) + "You mix the contents of the pan around a bit, but \ +some things don't quite coagulate, and the contents remain unmixed."; + else { + while (child(Baking_Pan) ~= 0) { + move child(Baking_Pan) to dough; + } + move dough to Baking_Pan; + "You start mixing. Like magic, in short time you \ +have a doughy mixture in the pan."; + } + } + LetGo: + if (noun == dough or cake) { + CDefArt(noun); " is stuck fast in the pan and \ + you can't get it out."; + } + else { + ! we've modified certain ingredient objs that we want \ + ! to 'preserve' in the pan. + if ((noun == flour) || (noun == sugar_cube) || + (noun == baking_powder) || (noun == butter) || + (noun == corbie_egg) || (noun==dornberries)) + "It's somewhat scattered about in the pan right \ +now, and you can't quite remove it cleanly."; + } + Receive: + if (cake in self) + "The cake takes up the entire space in the pan."; + ! -- trap and nicely parse putting + ! ingredients in pan, will require modifying + ! 'short_name's of various ingredients. + if (noun == flour) { + flour.short_name = "pile of flour"; + move flour to Baking_Pan; + flour.description = "A heap of white flour."; + "You break open the bag and add the flour to the pan."; + } + if (noun == sugar_cube) { + sugar_cube.short_name = "quantity of sugar"; + move sugar_cube to Baking_Pan; + sugar_cube.description = "Some sugar scattered about."; + "You crumble the sugar cube into the pan."; + } + if (noun == baking_powder) { + baking_powder.short_name = "small sprinkling of baking powder"; + move baking_powder to Baking_Pan; + baking_powder.description = "A small pile of very fine white powder."; + "You open the packet and add the powder to the pan."; + } + if (noun == corbie_egg) { + corbie_egg.short_name = "bit of raw egg"; + move corbie_egg to Baking_Pan; + corbie_egg.description = "The yolk and the white parts from an egg."; + "You crack the egg and drop the gooey contents into the \ + pan, discarding the shell."; + } + ], + has container open; + +Object pan_sticker "sticker" Baking_Pan + with name "sticker", + initial "There's a sticker stuck to the bottom of the pan.", + description "\ +Frobozz Magic Baking Pan^^\ +HELLO, BAKER!^^\ +To mix ingredients placed in pan, simply say 'MIX PAN'. \ +Baked goods should be removed with a Frobozz Magic \ +Spatula.", + !weight 1, + size 5, +; + +Object dough "lump of dough" + with name "dough", + number 0, ! equals the number of times folded + !weight 10, + size 14, + description "It looks like a nice beige lump of uncooked dough.", + before [; + Eat, Taste: + if (action==##Eat) remove self; + "Ugg. Raw dough."; + Cast: + if (the_spell_was == gloth_spell) { + dough.number = dough.number + 83; + if (dough.number > 500) dough.number = 500; + "As you speak the chant, the dough seems to \ +twinkle! With a sudden puff of flour, the dough spins and \ +neatly kneads itself many times!"; + } + Fold: + dough.number = dough.number + 1; + print "You roll up your sleeves and start kneading. \ +The dough "; + if (dough.number > 500) dough.number = 500; + if (dough.number < 50) + "folds easily."; + if (dough.number > 200) + "has the consistency of a soft rock."; + "is pliable."; + ], + has edible; + +Object cake "cake" + with name "cake", + number 0, +! number = condition: +! 0 ok, 1 undercooked, 2 overck, 3 underfld, 4 overfld + description [; + print "It's a "; + switch (cake.number) { + 1: "somewhat raw-looking cake."; + 2: "nice-looking cake, except that it \ +looks a little burned."; + default: "nice-looking cake."; + ! The player will have to taste the cake to check the + ! 'fold quality'. + } + ], + before [; + Eat: + remove self; + "Not bad. Unfortunately, it looks like you can't have \ +your cake and eat it too."; + Taste: + print "You taste a tiny bit of the cake. "; + switch (cake.number) { + 1: "It tastes a bit underdone."; + 2: "It tastes a little burned."; + 3: "It's a little too soft."; + 4: "It's a bit tough."; + default: "It tastes great!"; + } + ], + !weight 10, + size 14, + has edible; + + + +! *************** +! animated beings +! *************** + +Object GHOST "frightening zombie" House_Basement + with name "zombie" "frightening", + description "A frightening gaunt member of the \ +living dead, with pale skin, and even paler eyes.", + before [; + Cast: + if (the_spell_was == wigro_spell) { + remove self; + "The zombie crumbles into dust, turned."; + } + ], + life [; + ThrowAt: + if (noun==holywater) { + remove holywater; remove self; + "The vial breaks into shards, scattering \ +holy water all over the zombie. The zombie shrieks, and \ +crumbles into dust."; + } + Attack: "Your attack knocks it back, but it \ +seems completely unharmed, somehow!"; + Give: +if (noun==rubber_gloves) { + move wire to House_Basement; + move rubber_gloves to House_Basement; + give rubber_gloves ~worn; + give wire general; + give House_switchbox open; + remove self; + "The zombie seems to regard the gloves, and slowly puts \ +them on. It proceeds to open the metal box and remove a \ +loose wire, producing a few sparks in the process. Finally, \ +it places the loose wire on the floor, satisfied. It \ +slowly crumbles into dust, but you just manage to hear, \ +~Thanks, I've been trying to get rid of that wire for ages,~ \ +in the faintest of whispers."; +} + default: "Zombies are usually not very responsive to \ +those among the living. This one is no exception."; + ], + has animate; + +! *************** +! spells/scrolls +! *************** + +Object gray_scroll "gray scroll" House_Basement + class scroll_class, + with name "gray", +; + +Object tossio_spell "turn granite to pasta" gray_scroll + class spell_class, + with name "tossio", + magic [; + if ((location == THIEF_Storeroom) && + (second == w_obj) && (THIEF_Storeroom hasnt general)) { + give THIEF_Storeroom general; + move pasta to THIEF_Storeroom; + move c50 to THIEF_Storeroom; + "As you finish the chant, the granite wall is replaced \ +by a large mass of pasta. A hidden section of the room is revealed, \ +along with the mass of gold coins it was holding! The coins spill \ +out, and nearly flood the room.^^In a flash, a large group of \ +financial nymphs appear on the scene. ~It looks like we found the \ +missing GUS earnings,~ one nymph says to another. Producing large \ +sacks, they quickly collect the mass of coins and disappear with a \ +twinkle.^^Moments later, a single coin falls out of a crack in the \ +previously hidden alcove, rolling to a stop near your feet."; + } + "Your chant goes unanswered. I guess you need pure granite."; + ], +; + +! *************** +! misc items +! *************** + +Object red_sphere "red sphere" + class sphere_class + with name "red", + description "A tiny perfect red sphere, made of some strange \ + unknown metal.", +; diff --git a/src/makespir b/src/makespir new file mode 100644 index 0000000..ff19015 --- /dev/null +++ b/src/makespir @@ -0,0 +1,6 @@ +./inform '$huge' '$MAX_OBJECTS=850' '$MAX_SYMBOLS=8150' '$MAX_CLASSES=25' '$MAX_DICT_ENTRIES=1500' '$MAX_ZCODE_SIZE=200000' '$MAX_BANK_SIZE=5000' spirit +#./inform '$huge' '$MAX_OBJECTS=800' spirit + +# The below cmd version should only be used for creating +# abbreviations (this will take a while too) +#./inform -u '$huge' '$MAX_OBJECTS=800' '$MAX_TRANSCRIPT_SIZE=300000' '$MAX_SYMBOLS=8000' '$MAX_CLASSES=20' '$MAX_DICT_ENTRIES=1500' '$MAX_ZCODE_SIZE=200000' spirit diff --git a/src/miznia.inf b/src/miznia.inf new file mode 100644 index 0000000..6a18b50 --- /dev/null +++ b/src/miznia.inf @@ -0,0 +1,892 @@ +! ******************************************************************* +! MIZNIA -- add-on for SPIRITWRAK +! ******************************************************************* + + +Object MIZNIA_GUSStop "Mizniaport" + with description "The Great Change certainly hasn't changed the \ +ultra-swank city of Mizniaport. The entire place is filled with \ +splashy color and a disturbing sense of moderness. There's a \ +stairway down here, while side walkways head west and \ +northeast.", + name "color" "moderness" "stairway" "walkway" "walkways", + d_to MIZNIA_GUSStation, + w_to MIZNIA_Park, + ne_to FROBAR_Ent, + has light; + +Object MIZNIA_Park "Miznia Suburbs" + with description "Overly cozy-looking homes sprout up all over \ +the place here. Ridiculously \ +well-trimmed front lawns remind you that you're still in Miznia. \ +A nice pebble path heads east and west. You see the entrance to \ +a swank-looking boutique to the south.", + name "homes" "lawns" "pebble" "path", + e_to MIZNIA_GUSStop, + w_to MIZNIA_Outskirts, + s_to MIZNIA_Boutique, + in_to MIZNIA_Boutique, + has light; + +Object MIZNIA_Boutique "Swank Boutique" + with description "A ultra-swank accessory store, filled with \ +flashy items for the fashion-unconscious shopper. \ +An exit lies north.", + name "items" "accessory", + out_to MIZNIA_Park, + n_to MIZNIA_Park, + has light; + +Object boutique_sign "small sign" MIZNIA_Boutique + with description "The sign reads ~PLEASE RING BELL FOR SERVICE~", + name "small" "sign", + has static; + +Object MIZNIA_Outskirts "City Limits" + with description "The city stops here abruptly. The Miznia jungle \ +makes its presence known for real here, forming a natural barrier. A \ +path leads east, while an almost overgrown path leads into the jungle \ +to the southwest.", + name "path" "jungle" "barrier", + e_to MIZNIA_Park, + sw_to Jungle_Edge, + has light; + +Object c8 "coin" MIZNIA_Boutique class coin_class; + +Object Jungle_Edge "Edge of Jungle" + with description "Wild birds and wilder vegetation distract you from \ +a faint trail through the jungle here. The path leads northeast and \ +southwest.", + name "birds" "vegetation" "trail", + ne_to MIZNIA_Outskirts, + sw_to Deep_Jungle, + has light; + +Object Deep_Jungle "Deep Jungle" + with description "You're in very deep jungle, just on the verge of \ +getting lost. Your surroundings are green and untamed. A path \ +leads northeast, while a muddy path heads south.", + name "mud" "path", + ne_to Jungle_Edge, + s_to Swamp, + has light; + +Object Swamp "Swamp" + with description [; + print "You're knee-deep in a murky swamp. Huge swamp grasses \ +wall you in"; + if (self has general) + print ", except for a section to the west"; + ". Drier land is north or south."; + ], + name "swamp" "land", + n_to Deep_Jungle, + s_to Jungle_Clearing, + w_to [; + if (self hasnt general) + "You can't go that way."; + else return Jungle_Ruins; + ], + has light; + +Nearby grasses "grasses" + with name "grass" "grasses", + description "Tall, thick swampgrass.", + before [; + Push, Pull, Cut, Attack: + "The grass is extremely hardy."; + Search: + if ((Jungle_Map notin player)) + "You hunt around in the grasses for a while and find nothing."; + else { + give Swamp general; + Achieved(21); + "You check the jungle map. Sure enough, there's a loose \ +patch of grass that you could duck under to the west."; + } + Cast: + if (the_spell_was == throck_spell) + "Grasses don't grow much more than this."; + ], + has scenery; + + +Object Jungle_Clearing "Jungle Clearing" + with description "The Jungle clears out a bit here, so you can actually \ +see patches of sky and walk ten paces without running into a tree. There's \ +a path into the jungle undergrowth to the north. \ +You notice a group of jungle natives gathered here.", + name "sky" "path", + number 1, + n_to Swamp, + each_turn [ ; + if (Jungle_Clearing.number == 2) { + move Shaman to Jungle_Clearing; + Jungle_Clearing.number = 5; + "^A single native tribesman breaks away from the group and \ +approaches you."; + } + if (Jungle_Clearing.number == 1) + Jungle_Clearing.number = 2; + ], + has light; + +Nearby natives "natives" + with name "natives" "group", + description "A group of jungle natives in elaborate feather and \ + fur clothing. They appear to be armed with large spears.", + life [; +default: "The group of natives looks at you with distrusting stares."; + ], + before [; +Cast: + if (the_spell_was == espnis_spell or foblub_spell) +"They can't understand your language, thus the meaning of \ +the sermon is lost on them."; + ], + has animate concealed; + + + +Object Jungle_Ruins "Hidden Ruins" + with description "Hidden here in some extremely deep jungle \ + are the ruins of some ancient civilization. Broken sandstone \ + structures are nearly covered with jungle vines and mosses. \ + There is a partially intact structure to the north. \ + It seems to be a short pyramid-like building, with a single \ + dark entrance hidden amongst vines. Definitely a find to \ + write the Monastery about, or at least your local \ + Archeology Guild.", + name "sandstone" "structures" "structure" "vines" +"pyramid" "entrance" "mosses", + e_to Swamp, + n_to TEMPLE_Ent, + has light; + +! (The ancient temple, unlit, of course) +Object TEMPLE_Ent "Pyramid Entrance" + with description "A damp, dark, unmarked stone room. You can hear \ + the sounds of the jungle from the exit to the south. There \ + are dark passages north and east.", + s_to Jungle_Ruins, + e_to TEMPLE_Statue_room, + n_to TEMPLE_Trap, + before [; + Listen: "You hear noises of the jungle from the south."; + ], +; + +Object TEMPLE_Statue_room "Statue Room" + with description "A tiny dark chamber, with a passage west.", + w_to TEMPLE_Ent, +; + +Nearby TEMPLE_Statue "large statue" + with name "statue", + description "A stone statue of some ancient \ + warrior, probably intended to frighten off visitors.", + before [; + ! manual dealing with PushDir (only 3 possible locs anyway) + PushDir: + if (self has general) + "The statue is stuck fast and doesn't budge."; + if ((self in TEMPLE_Statue_room) && (second == w_obj)) { + print "^There's a grinding noise as you push the statue west.^"; + AllowPushDir(); rtrue; + } + if ((self in TEMPLE_Ent) && (second == s_obj)) + "^The statue doesn't appear to fit through the \ + entranceway."; + if ((self in TEMPLE_Ent) && + ((second == n_obj) || (second == e_obj))) { + print "^There's a grinding noise as you push the statue.^"; + AllowPushDir(); rtrue; + } + if ((self in TEMPLE_Trap) && (second == s_obj)) { + print "^There's a grinding noise as you push the statue south.^"; + AllowPushDir(); rtrue; + } + if ((self in TEMPLE_Trap) && (second == n_obj)) { + give self general; + move rollers to TEMPLE_Trap; + "You start to push the statue north, and hear a strange \ + click. Suddenly, two enormous stone rolling pins slide \ + down from the east and west sides of the room! \ + Desperately, you topple the statue and hide behind it. \ + You hear a huge crash!^^\ + You open your eyes, surprised to find yourself not \ + squashed into pancake. The statue has wedged itself \ + neatly between the two giant rollers, effectively \ + blocking them!"; + } + "You can't push the statue that way."; + Take: + "The statue rocks back and forth a bit, but is \ +far too heavy to take."; + Push: + print "The statue "; + if (self hasnt general) + "rocks back and forth a bit."; + else "seems to be stuck."; + ], + has static; + +Object TEMPLE_Trap "Strange Chamber" + with description "This is an odd long hallway running north and south. \ +The stone floor is noticeably concave, sloping upwards to \ +the east and west. It's like being in a long stone \ +channel.", + name "slope" "channel", + s_to TEMPLE_Ent, + e_to "The floor gets too steep, and you slide back down.", + w_to "The floor gets too steep, and you slide back down.", + n_to [; + if (TEMPLE_Statue hasnt general) { + deadflag = 1; + "You head north, and hear a strange click. Suddenly, \ + two huge stone rolling pins roll down from the east \ + and west sides of the room! Desperately, you try to \ + escape, but the hall is too long, and the stone \ + rollers too fast. You are crushed to jelly."; + } + else { + print "You step over and around the jammed rollers and \ + the statue and head north.^"; + return TEMPLE_1; + } + ], +; + +Object rollers "stone rollers" + with name "roller" "rollers" "stone", + initial "There are two stone rollers pinned against the statue.", + description "Massive stone rolling pins.", + before [; +Push, Pull, Attack, Turn, Shake, Squeeze: +"The rollers are huge and stuck fast."; + ], + has static; + +Object TEMPLE_1 "Bare Chamber" + with description "You are in a bare stone chamber with passages leading \ +north, east, south and west. A stone ladder also heads upwards through a \ +dark hole in the ceiling.", + name "ladder" "hole", + s_to TEMPLE_Trap, + n_to TEMPLE_1N, + e_to TEMPLE_1E, + w_to TEMPLE_1W, + u_to TEMPLE_2, +; + +Object TEMPLE_1W "Small Chamber" + with description "You're in a small bare chamber. On one of the walls, \ + you notice an engraving, almost worn away with age. It seems to be a \ + picture of a jungle village, and you recognize the pyramid you are currently in. \ + An exit lies east.", + e_to TEMPLE_1, +; + +Object TEMPLE_1N "Small Chamber" + with description "You're in a rather bare chamber. On one of the walls, \ + you see a worn engraving depicting a group of robed figures standing in \ + some chamber. They are carrying several long reeds. An exit lies south.", + s_to TEMPLE_1, +; + +Object TEMPLE_1E "Small Chamber" + with description "You're in a small stone chamber. In the center of the \ + floor is a strange funnel-like depression, which starts as a large \ + circular opening, and narrows into a very small tunnel below, \ + probably no wider than your hand. You also see a small round hole \ + in the ceiling above. An exit heads west.", + w_to TEMPLE_1, + d_to "You'd never fit down that opening.", + u_to "You can't reach the hole, and besides, you'd never fit through \ +it if you could.", +; + +Object TEMPLE_1_HOLEU "hole" TEMPLE_1E + with name "hole", + description "You see a dark small hole in the center of the \ +ceiling.", + before [; +Rub, Push, Pull, Touch, Receive, LetGo, Search: +"The hole is far above your head."; + ], + has scenery; + +Object TEMPLE_1_Opening "opening" TEMPLE_1E + with name "opening" "funnel" "depression" "tunnel", + description "A smooth funnel in the stone in the floor, that descends \ + into darkness as it narrows.", + describe [ x; + print "^The opening "; + if (children(self) == 0) + "appears to be empty."; + else { + print "contains:^"; + x = children(self); + x = FULLINV_BIT + INDENT_BIT + NEWLINE_BIT + RECURSE_BIT; + WriteListFrom (child(self), x, 1); + rtrue; + } + ], + before [; + Receive: + if (noun ~= TEMPLE_Artifact) { + print "That doesn't quite fit -- "; + if (noun.size > TEMPLE_Artifact.size) + "the funnel becomes too narrow too quickly."; + else "strangely..."; + } + LetGo: + "You stick your hand down the small hole, but it must be \ + quite deep, and you can't quite reach."; + ], + capacity 1, + size 10, + has static container open; + +Object TEMPLE_2 "Bare Chamber" + with description "You are in a bare stone chamber with passages leading \ +north, east, south and west. A stone ladder leads upwards and downwards \ +into dark holes.", + name "ladder" "hole", + s_to TEMPLE_2S, + n_to TEMPLE_2N, + e_to TEMPLE_2E, + w_to TEMPLE_2W, + u_to TEMPLE_3, + d_to TEMPLE_1, +; + +Object TEMPLE_2N "Small Chamber" + with description "You're in a small bare chamber. Engravings on the \ + wall show several robed figures in a low domed chamber. Some of \ + the figures are pushing what appears to be reeds down a small hole \ + in the ground, while others stand by and seem to be praying or \ + engaged in some ceremony. In a separate scene, similar robed \ + figures can be seen throwing some poor bound individual off the \ + top of the pyramid, apparently in some sort of ritualistic \ + sacrifice. An exit heads south.", + s_to TEMPLE_2, +; + +Object TEMPLE_2W "Small Chamber" + with description "You're in a small bare chamber. Engravings on \ + the wall depict several robed figures in a room mostly filled \ + with water. The figures are watching reeds that seem to fall \ + from the sky and land in the water. Several reeds are floating \ + towards an apparent drain in the water, where a few reeds that are thin \ + enough fall through with the flow of the water. An exit lies east.", + e_to TEMPLE_2, +; + +Object TEMPLE_2S "Small Chamber" + with description "You're in a rather small chamber. Engravings on \ + the walls depict several robed figures in a strange room with a \ + circular depression in the ground, filled with water. Water also \ + flows into the pool in a thin stream from some undrawn source above. \ + With the stream of water, a few reeds appear to be falling. A single \ + figure is collecting the reeds as they fall and placing them in \ + a long thin vase or container. The significance of \ + this is uncertain. An exit lies north.", + n_to TEMPLE_2, +; + +Object TEMPLE_engravings "engravings" + with name "engravings" "engraving", + description [; ; ], + found_in TEMPLE_1W TEMPLE_1N TEMPLE_2N TEMPLE_2W TEMPLE_2S, + has scenery; + +Object TEMPLE_2E "Small Chamber" + with description [; + print "You're in a bare stone chamber which is partially \ +filled with a sunken pool of dirty blackish water. Near the south wall \ +is a depression in the floor that was probably a drain for the pool, given the \ +apparent water stains; however the level of the pool is below \ +the point where it would overflow into the drain. Near the center \ +of the ceiling is a small round hole, right above the pool. An \ +exit lies west"; + if ((self hasnt general) && (TEMPLE_3 hasnt general) && + (amulet has worn)) { + give self general; + ".^^Your amulet suddenly gives off a bright purple flash!"; + } + else "."; + ], + name "stains", + before [; + Fill: +"The blackish water seems like something you really don't want."; + ], + w_to TEMPLE_2, +; + +Object TEMPLE_2_HOLEU "hole" TEMPLE_2E + with name "hole", + description "You see a dark small hole in the center of the \ +ceiling.", + before [; +Rub, Push, Pull, Touch, Receive, LetGo, Search: +"The hole is far above your head."; + ], + has scenery; + +Object TEMPLE_2_Opening "opening" TEMPLE_2E + with name "opening" "drain" "depression", + description "A smooth drain opening in the stone in the floor, \ + that descends into darkness.", + before [; + Receive: + if ((noun ~= TEMPLE_Artifact) && (noun hasnt is_rod)) ! TODO ADD? + "Oddly, that doesn't fit through the small round drain."; + else { + if (children(TEMPLE_1_Opening) == 0) + move noun to TEMPLE_1_Opening; + if (TEMPLE_Artifact in TEMPLE_1_Opening && + children(TEMPLE_Artifact) == 0) + move noun to TEMPLE_Artifact; + else move noun to TEMPLE_1E; + CDefArt(noun); " drops into the drain and disappears \ + out of sight. Moments later you hear a thump from \ + somewhere below."; + } + ], + capacity 1, + size 10, + has scenery container open; + +Object TEMPLE_Pool "pool" TEMPLE_2E + with name "pool" "water", + describe [; +print "^The black pool is disturbingly calm"; +if (umbrella in self) + ". Floating on the surface is a black open umbrella."; +else "."; + ], + description [; + print "Murky black water that seems disturbingly calm"; + if (umbrella notin self) + "."; + else + ". Floating on the surface is a black open umbrella."; + ], + before [; + Cast: + if (the_spell_was == frotz_spell) + "There's a strange gurgling noise as you finish the \ + chant, and the black water starts to glow! But, \ + to your horror, the inky water seems to absorb the \ + light and return to its original blackness! The \ + chant fails."; + + Enter: + deadflag = 1; + "You notice the water seems unusually cold as you enter \ + the pool. Without warning, something grabs your legs and \ + pulls you under! In pitch black liquid that seems to \ + absorb all light, you can't defend yourself, or even \ + see your adversary, who devours you shortly."; + Search: + "You can't see a thing, the water is blacker than night."; + Receive: + if (noun == toy_volcano) { + remove noun; + "You drop the toy volcano into the black pool and \ +watch it sink. Moments later, a large large bubble rises, and \ +pops at the surface, followed by a strange, belch-like noise!"; + } + if ((noun ~= umbrella) || (umbrella hasnt open)) { + remove noun; + CDefArt(noun); +print " falls into the pool and slowly sinks into the black water. \ +Suddenly, ", (the) noun, " seems to get pulled into the pool, \ +and is soon gone! Something dwells in that pool, apparently, \ +hidden well in a cover of"; " blackness!"; + } + else { + move umbrella to TEMPLE_Pool; + give umbrella ~light; ! a 'special-effect'? + "The open umbrella sits in the pool, floating on the \ + surface like a cloth dome."; + } + ], + size 25, + has static container open; + + +Object TEMPLE_3 "Collapsed Chamber" + with description [; + print "You are in a stone chamber that has broken and \ + eroded walls in several places. Broken stones and dirt are everywhere. \ + It appears there was once an open archway east, however the heavy stones \ + that framed it have collapsed. A tiny hole remains, \ + but it would be an exceptionally tight squeeze. \ + A stone ladder leads downwards into a dark hole"; + if ((self hasnt general) && (TEMPLE_2E hasnt general) && + (amulet has worn)) { + give self general; + ".^^Your amulet suddenly gives off a bright purple flash!"; + } + else "."; + ], + name "stones" "dirt" "archway" "ladder" "hole", + e_to [; + if (children(player) ~= 0) + "You try to squeeze through the hole, to \ + no avail. You're carrying too much to fit."; + else return TEMPLE_3E; + ], + d_to TEMPLE_2, +; + +Object TEMPLE_3E "Low Chamber" + with description "You're in a tiny low room, dimly lit by strange \ + glowing lichens and mosses. A tiny exit lies west between some \ + collapsed rock -- it looks like a very tight squeeze. The room is \ + otherwise filled with broken rock and the like. A tiny round hole \ + is in the very center of the floor.", + name "lichens" "mosses" "rock", + w_to [; + if (children(player) ~= 0) + "You try to squeeze through the hole, to \ + no avail. You're carrying too much to fit."; + else return TEMPLE_3; + ], + d_to "You can barely fit your hand in the hole.", +has light; + +Nearby TEMPLE_3_Opening "opening" + with name "opening" "hole" "tiny" "round", + description "A smooth round hole in the stone in the floor \ + that descends into darkness.", + before [; + Receive: + if (noun hasnt is_rod) + "Oddly, that doesn't quite fit."; + else { + print "The rod slips through with ease. \ +Moments later you"; + if (umbrella notin TEMPLE_Pool) { + remove noun; + " hear a splash from somewhere below."; + } + else { + if (children(TEMPLE_1_Opening) == 0) + move noun to TEMPLE_1_Opening; + else { + if (TEMPLE_Artifact in TEMPLE_1_Opening && + children(TEMPLE_Artifact) == 0) + move noun to TEMPLE_Artifact; + else move noun to TEMPLE_1E; + Achieved(22); + } + ! if (TEMPLE_Artifact notin TEMPLE_1_Opening) + ! move noun to TEMPLE_1_Opening; + ! else + ! move noun to TEMPLE_Artifact; + " hear a thump from below, followed by a rattling noise, \ + and finally another thump, much fainter."; + } + } + ], + capacity 1, + size 10, + has scenery container open; + + +! (Super Zmart) (REMOVED) + +Object stuffed_toy "stuffed toy" MIZNIA_Park + with name "toy" "stuffed" "alligator", + initial "A stuffed toy has been left unattended on someone's lawn.", + description "A cute little stuffed toy alligator.", + !weight 5, + size 15, +; + + + +Object FROBAR_Ent "In Front of Swank House" + with description "You're in front of a rather swank looking house to the \ + northeast. To the southwest is the rest of Mizniaport.", + name "house", + sw_to MIZNIA_GUSStop, + ne_to [; + if (Frobar in Delbins) + "You walk up to the front door, only to find it locked."; + else return FROBAR_Foyer; + ], + in_to [; + if (Frobar in Delbins) + "You walk up to the front door, only to find it locked."; + else return FROBAR_Foyer; + ], + has light; + +Nearby Frobar_mailbox "mailbox" + with name "mailbox" "box", + description "A mailbox stands in front of the house. The letter \ + ~F~ is on one side.", + capacity 5, + size 15, + ! block a receive here? + has static container openable; + +Object Ench_mag "copy of ~Enchanter Monthly~" Frobar_mailbox + with name "magazine" "monthly" "enchanter" "copy", + description "~Enchanter Monthly~ has been somewhat lacking in \ + quality content these days (The absence of magic probably \ + being a large factor behind this). For filler, the editors have \ + been turning in mostly tabloid drivel articles about ~What ever \ + happened to so-and-so?~. This month's cover story \ + suggests that Barsap the magician was actually turned into a tortoise \ + during the Great Cataclysm, and underwent a slow mutation into a \ + newt.", + !weight 5, + size 15, +; + + + + +! ********** +! critters/people +! ********** + +Object Shaman "jungle shaman" + with name "shaman" "tribesman" "native", + description [; +print "A jungle native with a rather elaborate costume \ + make of bird feathers and animal hides. He seems old, but wise"; +if (self hasnt general) + ". Unlike the rest of the natives, this one is not wearing a \ + fancy feather-and-fur headdress."; +else "."; + ], + life [; + Order: + if ((action==##Give) && (noun==Jungle_Map) && (Jungle_Map in self)) + "You try to convey your desire for the map with \ + gestures. The shaman seems to understand. He \ + points to the map, then you. Then, he raises his \ + hand in a 'stop' gesture. Then, he points to his \ + bare head."; + "The shaman does not seem to understand."; + Give: + if (noun==headdress) { + move Jungle_Map to player; + move headdress to Shaman; + give self general; + "The shaman takes the headdress and places it on his \ + head. He smiles, and gives you a strange map in return."; + } + "The shaman smiles and shakes his head."; + Attack, ThrowAt: + deadflag = 1; + "As you make a threatening move, several of the natives \ + step forward and pierce your body with stout spears. \ + It appears they've had bad dealings with outsiders \ + before."; + Show: + if (noun == headdress) + "The shaman nods and points to the headdress, then \ + himself."; + "The shaman says something in a language you've never \ + heard before."; + default: "You can't seem to communicate with him; their \ + language is completely foreign to you."; + ], + before [; + Cast: + if (the_spell_was == foblub_spell or espnis_spell) + "You begin the sermon, but the shaman and natives \ + seem very puzzled by your speech, and clearly \ + can't understand a word you're saying. The chant \ + fails."; + ], + has animate; ! transparent? + +Object Jungle_Map "jungle map" Shaman + with name "map" "jungle", + description [; + print "The map is somewhat crudely drawn:^^"; + font off; + spaces 23; print "xxxx^"; + spaces 23; print "xxxx^"; + spaces 23; print "XXXX^"; + spaces 22; print "/^"; + spaces 18; print "XXXX^"; + spaces 18; print "XXXX^"; + spaces 18; print "XXXX^"; + spaces 20; print "I^"; + spaces 18; print "oooo^"; + spaces 12; print "<#>---oooo^"; + spaces 18; print "oooo^"; + spaces 20; print "I^"; + spaces 18; print "XXXX^"; + spaces 18; print "XXXX^"; + spaces 18; print "XXXX^"; + font on; + ], + ! weight 10, + size 10, +; + +Object earth_spirit "earth spirit" TEMPLE_3 ! TEMPLE_3E + with name "spirit", + description "It looks like a large moving mass of mud and earth, \ + in a somewhat man-like shape.", + 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; + "^Some of the dirt and mud in one corner stirs! A form \ + made of mud and earth suddenly rises to attack!"; + } + i = random(5); + if (i == 1) { + deadflag = 1; + "^The earth creature moves quickly, and blinds you with \ + a spray of dirt! You clear your eyes, only to see the \ + brown mass move forward and bury you! You struggle, but \ + suffocate in short time."; + } + 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 earth spirit was too much for \ + you, I'm afraid to say. The spirit slowly sludges \ + towards you for the final blow..."; + } + print "^The earth spirit "; + if (i==2) + "clubs you with a heavy pseudopod \ + made of animated soil and rock. Ouch!"; + if (i==3) { + print "throws some loose soil and sand in \ + your face! The attack knocks you back, and \ + you fall into the chamber below!"; + PlayerTo(TEMPLE_2); + rtrue; + } + "sends a spray of sharp rocks \ + your way, and you just dodge in time!"; + ], + before [; + Cast: + if (the_spell_was == swanko_spell) { + remove self; + "As you speak the chant, the earth spirit falls back \ + in fear! You finish the chant, and the earth spirit \ + collapses into a heap of dirt and mud, banished!"; + } + print "The creature makes a banshee-howl as you chant.^"; + ], + life [ ; + Attack: + print "You "; + if (random(20) >= 8) + "strike the earth creature, but your attack passes \ + harmlessly through it! You hear a strange noise from \ + the creature -- akin to mad laughter from someone \ + trapped underground in a coffin."; + "attack the earth spirit, but miss!"; + default: "It's too busy trying to kill you."; + ], + has animate concealed; + +! ********** +! spells/scrolls +! ********** + +! TODO (Dan, why is this declared _here_?) +Object white_scroll "white scroll" + class scroll_class, + with name "white", +; + +Object huncho_spell "send object to higher plane" white_scroll + class spell_class, + with name "huncho", + magic [; + if (second == 0) +"You see a brief flash of light, but nothing happens."; + if (second == player) { + print "You finish the chant"; +! if ((location == ATRII_8) && (ATRII_8 hasnt general) && +! (white_rod_piece in player) && (black_rod_piece in player) && +! (smoke_rod_piece in player) && (gray_rod_piece in player)) { + if ((location == ATRII_8) && (ATRII_8 hasnt general)) { + give ATRII_8 general; + spell_block = 1; + print " and notice the \ +white streaks of light above widen, as though a rift was \ +being torn in the sky! You feel a force pulling you \ +upwards, into the unknown!^"; + StartTimer(Imp_Liv,10); + PlayerTo(Imp_Liv); + rtrue; + } + else + ", and see a short-lived flash +of light above, but nothing else."; + } + if (second has animate) { + "You feel a slight rumbling overhead, but nothing else \ +happens."; + } + else { + if ((second hasnt static) && (second hasnt scenery) && + (in_atrii == 0)) { + if (second has clothing) give second ~worn; + move second to ATRII_8; + print "There is a flash of light, and "; DefArt(second); + " suddenly vanishes!"; + } + "Your chant goes unanswered."; + } + ], +; + +Object muddy_scroll "muddy scroll" Deep_Jungle + class scroll_class, + with name "muddy", + initial "Partially buried in the mud is a scroll.", +; + +Object throck_spell "grow plant" muddy_scroll + class spell_class, + with name "throck", + magic [; + "Your chant goes unanswered. It's intended for plants only."; + ], +; + +! ********** +! misc objs +! ********** + + +! 'earth' rod piece -- BLACK +Object black_rod_piece "black rod piece" TEMPLE_3E + class rod_class, + with name "black", + initial "In the center of the room is a short black rod.", + description "It's a short section of a rod made of some \ +undeterminable hard substance, \ +colored an inky black. A piece of the Rod of \ +the Ancients, I'd warrant!", +; diff --git a/src/special.inf b/src/special.inf new file mode 100644 index 0000000..1d22b5c --- /dev/null +++ b/src/special.inf @@ -0,0 +1,1736 @@ +! ********************************************************************* +! SPECIAL.INF -- Add-on for SPIRITWRAK +! Contains: 'specials' that I wanted to keep separate from +! the other 'city-based' .INF files (Atrii, NPC homes) +! ********************************************************************* + +! ----------------- (Frobar's home) ------------------------- + +Object FROBAR_Foyer "Entrance Foyer" + with description "You are in the Entrance Foyer of a \ +small but tasteful home. The exit is to the southwest. \ +The general area is tastefully done in maroon carpeting \ +and brass fixtures. Another room lies to the north.", + name "maroon" "carpeting" "brass" "fixtures", + sw_to FROBAR_Ent, + out_to FROBAR_Ent, + n_to FROBAR_Parlor, + has light; + +Object FROBAR_Parlor "Parlor" + with description "You are in a very decorative parlor. \ +Various furnishings of high quality are arranged around \ +an enormous rug with intricate golden symbols in the weave \ +design. Open doorways lead south, north, east and west.", + name "rug" "doorways" "furnishings" "symbols", + s_to FROBAR_Foyer, + n_to FROBAR_Bedroom, + e_to FROBAR_Study, + w_to FROBAR_Lounge, + has light; + +Object frobar_plant "large potted plant" FROBAR_Parlor + with name "plant" "large" "potted", + initial "A large potted plant sits in one corner.", + description "A well-tended house-plant.", + before [; + Cast: + if (the_spell_was == throck_spell) { + "The plant seems even healthier now."; +! if (Frobar in FROBAR_Bedroom) +! (couldn't think of a proper reaction...:) + } + ], + has static; + +Object FROBAR_Lounge "Lounge" + with description "A large room here apparently serves as a lounge \ +for entertaining. The walls and furniture all have interesting \ +design work that gives an impression of dignified age. A doorway \ +heads east.", + name "furniture" "doorway", + e_to FROBAR_Parlor, + has light; + +Object FROBAR_Study "Study" + with description "This is a study room with fancy wood paneling and \ +plush carpeting. There is an exit to the west.", + name "wood" "paneling" "carpeting", + w_to FROBAR_Parlor, + has light; + +Nearby FROBAR_shelves "large bookshelf" + with name "shelves" "shelf" "bookshelf", + initial "A large bookshelf takes up most of the north wall.", + description "It's filled with odds and ends, mostly uninteresting.", + capacity 30, + has static supporter; + +Object FROBAR_Journal "plain journal" FROBAR_shelves + with name "journal" "plain", + ! weight 15, + size 15, + description "This is a short journal of notes that \ +Frobar was keeping. The contents are quite dull, mostly \ +consisting of entries like ~Remember to water plant~ and \ +so forth. In fact, the only non-trivial entry follows:^^\ +~Perhaps today I will go visit Barsap's latest creation. \ +Then again, maybe I won't. This so-called 'Gambit' of his \ +is supposed to be some silly diversion where people can \ +hop around floating platforms trying to reach the southeast \ +corner \ +platform on the bottom level, just so they can get \ +teleported back to the top, and start all over again! \ +Can this be a monetarily beneficial thing? I doubt it.~"; + +! (twisted -- four ancient ones) +Object p5 "twisted parchment" FROBAR_shelves + class parchment_class, + with name "twisted", +description "~...understand. I, like many of the Order, \ +have understood that the greatest Saints of our Order were \ +the Three, those Three that we know as the Ancient Ones. \ +Why then, do I find in ancient cairns, in hidden temples, \ +and in versions of the Scriptures found in unsettled lands, \ +that _four_ beings that called themselves the Ancient Ones \ +did do battle with evil and were defeated? This surely is \ +not to be believed, but I...~"; + +Object FROBAR_Desk "large wood desk" FROBAR_Study + with name "desk", + description "A massive wood desk carved from a single block of wood.", + capacity 20, + has static supporter; + +Object FROBAR_Bedroom "Bedroom" + with description "A nice cozy bedroom. The exit is south.", + s_to FROBAR_Parlor, + has light; + +Object FROBAR_bed "large bed" FROBAR_Bedroom + with name "bed", + description "A large comfortable-looking bed.", + before [; + LookUnder: "Sorry, no monsters here."; + ], + has static enterable supporter; + +!Object FROBAR_Painting "large painting" FROBAR_Bedroom +! with name "painting", +! initial "There is a large painting hanging on the wall.", +! description [; +! if (self hasnt general) +! "It appears to be an oil painting of a \ +! scroll on a table. A small note on the frame says, \ +! ~Still-life with Scroll, -FF, 791~"; +! else +! "It appears to be an oil painting of a \ +! table. A small note on the frame says, \ +! ~Still-life, -FF, 791~"; +! ], +! before [; +! Touch, Rub, Push: +! if (self hasnt general) { +! give self general; +! move painted_scroll to player; +! Achieved(23); +! print "As you touch the painting, your hands \ +!run across the scroll, and the oil takes on a three-dimensional \ +!quality! You ignore the strange sensations as you reach \ +!into the painting, and withdraw the scroll"; +! if (Frobar in FROBAR_Bedroom) +! "! Frobar watches the events over your \ +!shoulder, and seems puzzled. ~Now, why didn't I ever think to try \ +!that,~ he muses."; +! else "!"; +! } +! else +! "The painting seems to be nothing more than \ +!an oil painting now."; +! ], +! has static; + +! ----------------- (Thief's home) ------------------------- + +Object THIEF_Bottom_of_staircase "Wondrous Stairway" + with description "An enormous spiral staircase seems to wind miles \ +above your head in this curious column-like chamber. Strange \ +points of light brighten the chamber from above. \ +To the west is a small exit.", + name "points" "light" "staircase" "stairway" "stairs", +! TODO -- fix this weirdness... + u_to THIEF_Ent, + w_to "You can't go that way.", ! but later... + before [; + Go: + if (noun == u_obj) + print "^You begin the long trek upwards. Strangely, \ + the stair seems to twist and move as you step on it, \ + turning like a corkscrew, until you are \ + graciously deposited at the top, far above your \ + previous location.^"; + ], + has light; + + +Object THIEF_Ent "Fancy Hall" + with description "This must be an apartment or penthouse in the \ +skyscraper. You are in a very high hall, with black slate stone \ +walls that seem to reflect shadows everywhere. There is a room \ +to the north. The southern edge of this room drops off into the \ +darkness, followed by a long spiral staircase. The ceiling overhead \ +seems to have tiny points of light like a night sky.", + name "slate" "shadows" "staircase" "points" "light", + d_to THIEF_Bottom_of_staircase, + n_to THIEF_Foyer, + has light; + +Object THIEF_Foyer "Magnificent Foyer" + with description "This is an exceptionally grand entrance foyer, \ +with sweeping arched ceilings and sparkling chandeliers. The \ +room is dimly lit. Open hallways lead south and west.", + name "chandeliers", + s_to THIEF_Ent, + w_to THIEF_Lounge, + has light; + +Object THIEF_Lounge "Fancy Lounge" + with description "A tastefully overdone lounge with tapestries \ +and gold enamel finished walls. The room is dimly lit, although \ +you see no windows or other sources of light. Open hallways lead \ +east and west.", + name "tapestries" "enamel", + e_to THIEF_Foyer, + w_to THIEF_Storeroom, + has light; + +Object THIEF_Journal "short journal" THIEF_Lounge + with name "journal", + initial "There's an open journal sitting here.", + ! weight 15, + size 15, + description "This appears to be a short collection of notes:^^\ + ~TIPS ON CRACKING THE NEW FROBOZZCO 3-DIAL COMBO LOCKS: ^\ + Remember, there's a slight flaw in the design. For every \ + correct number in the correct dial, pressing the opening button \ + with cause a small click. Dials with the correct number in the \ + wrong dial place will cause a small thunk. The lock mechanism \ + scans for correct numbers in correct places first, and then \ + for correct numbers in the wrong place in the 'remaining dials'. \ + Simple! But don't forget, closing the locks will automatically \ + lock and reset the dials!^^\ + NEW FLATHEAD PAINTING: ^\ + I've completed making the copy of the new Leonardo Flathead painting, \ + received courtesy of the Royal Museum. Glad to say my skills in \ + art forgery are undiminished -- I can barely tell the difference \ + between the two myself! I'll soon replace the original with the \ + copy, and no one will be the wiser!~"; + + +Object THIEF_Storeroom "Workroom" + with description [; + print "A sight to inspire even the most avaricious, this \ + storeroom is filled with all sorts of rare and precious treasures. \ + A hallway leads east"; + if (self hasnt general) + print ". You notice that the west wall appears to be made of \ +solid granite"; + "."; + ], + name "hallway", + e_to THIEF_Lounge, + before [; + Examine: + if ((noun == w_obj) && (self hasnt general)) + "The west wall is a solid piece of granite, which \ +seems very odd, considering the other walls are clearly made of \ +slate."; + Cast: + if ((the_spell_was==ledak_spell) && (Painting_FAKE in self)) { + if (Painting_REAL in self) + print "One of the paintings"; + else print "The painting"; + remove Painting_FAKE; + " is surrounded by a yellow glow! It crumbles into \ +dust!"; + } + ], + has light; + +Nearby THIEF_treasure "precious treasures" + with name "treasure" "jewels" "gemstones" "artifacts", + description "Piles of rare gemstones, precious jewelry, \ + priceless artifacts, and other treasures line the walls \ + here.", + before [; + Take: + "Fortunately, your high moral standing allows you \ + the benefit of having no need for such materials of excess."; + ], + has scenery; + +Object pasta "pile of fettucini carbonari" + with name "pile" "fettucini" "carbonari" "pasta", + description "A large pile of fettucini dripping in \ +carbonari sauce.", + before [; + Eat: + if (self hasnt general) { + give self general; + "You manage to stuff yourself with pasta, \ +but there's still quite a lot left."; + } + else + "You've already had enough of this stuff \ +to last a lifetime. Just the thought of eating more is enough to \ +make you queasy."; + ], + size 16, + has edible; + +Object c50 "coin" class coin_class; + +Object Painting_FAKE "priceless painting" THIEF_Storeroom + with name "painting", + plural "priceless paintings", + short_name "priceless painting", + description "It's a beautiful oil painting of a dark stormy \ +scene. On the horizon, you can see the edges of mountaintops. Near \ +the top of the painting, two winged figures are carrying a lone \ +individual towards a break in the clouds, where a bright white light \ +seems to emanate.", + ! weight 25, + size 25, + before [; + Drop: + if (location == Museum_north) { ! player returned fake painting to museum! + remove self; + "A museum curator appears and takes the \ +painting. With an expert eye, he looks closely at it. ~This is \ +a fake! I warn you sir, art forgery is a dangerous game.~ He \ +leaves, much disgusted."; + } + Take: + if (Painting_REAL in parent(self)) + "They both look so genuine! You can't decide!"; + Cast: + if (the_spell_was == ledak_spell) { + remove self; + "One of the paintings is surrounded by a bright \ +yellow glow, and disintegrates!"; + } + Search: + if (Painting_REAL in parent(self)) + "Search which one? Goodness, you can't decide!"; + ], + ; + + +! -------------ETHEREAL PLANE OF ATRII ------------ + +Object ATRII_1 "Ethereal Plane of Atrii" + with description "Standing on a featureless gray plane that \ + stretches to the infinite horizon against a gray sky, you \ + can only conclude one thing -- you're on the Ethereal Plane \ + of Atrii. Well, at least it fits the description Brother \ + Palemon gave you. It seems like you could go in any \ + direction from here.", + cant_go "An invisible force blocks your way!", + name "plane" "horizon" "sky", + sw_to ATRII_2, + se_to ATRII_3, + has light; + +Object ATRII_2 "Ethereal Plane of Atrii" + with description "Flat, featureless gray is in every direction \ + you look. Stranger still is the upright rectangular hole in the \ + fabric of space that stands in the center of this area. \ + Otherwise, you could wander this gray dimension in any direction, \ + it seems.", + cant_go "An invisible force blocks your way!", + ne_to ATRII_1, + sw_to ATRII_4, + e_to ATRII_3, + s_to ATRII_6, + has light; + +Nearby ATRII_2_hole "rectangular hole" + with name "hole" "rectangle" "opening", + description "Surely you are in a place where the very laws of \ + nature and the Gods work by different rules! Here stands a \ + rectangular hole, seemingly torn out of the very space you \ + stand in. You see some curious metal chamber through the \ + opening, but there is nothing behind the opening.", + before [; + Enter: + print "^You step through and feel your stomach twist. \ + You stumble past a set of open metal doors into...^"; + in_atrii = 0; + PlayerTo(Skyscraper); + return 2; ! allow, but print nothing... + ], + has scenery enterable; + +Object ATRII_3 "Ethereal Plane of Atrii" + with description "Flat, featureless gray is in every direction \ + you look. Stranger still is the flat, glass-like square in the \ + center of the 'floor' of this area. \ + Otherwise, you could wander this gray dimension in any direction, \ + it seems.", + cant_go "An invisible force blocks your way!", + nw_to ATRII_1, + w_to ATRII_2, + se_to ATRII_5, + s_to ATRII_7, + has light; + +Nearby ATRII_3_ice "square of ice" + with name "square" "ice" "glass-like", + description "It looks and feels like a perfect square of ice, \ + flush with the featureless gray surface you stand on.", + before [; + Enter: + print "You step onto the square, and before you know it, your \ +surroundings shift and start to fade! You feel a \ +sudden chilling wind. The ice seems to lengthen and stretch. The \ +gray plane slowly turns white and bumpy.^"; + in_atrii = 0; + PlayerTo(Frozen_river2); + return 2; + ], + has scenery enterable; + +Object ATRII_4 "Ethereal Plane of Atrii" + with description "Flat, featureless gray is in every direction \ +you look. Stranger still is the large black hole to the south. \ +Otherwise, you could wander this gray dimension in any direction, \ +it seems.", + cant_go "An invisible force blocks your way!", + ne_to ATRII_2, + se_to ATRII_6, + s_to [; <>; ], + has light; + +Nearby ATRII_4_hole "black hole" + with name "hole" "black", + description "It looks like a large hole, probably twice your \ + height. It's completely black and featureless.", + before [; + Enter: + print "^You step into the black hole. You stumble \ + forward, surrounded by blacker-than-night darkness.^"; + in_atrii = 0; + PlayerTo(Subway_Tunnel); + return 2; + ], + has scenery enterable; + +! (secret subway tunnel) +Object Subway_Tunnel "Dark Tunnel" + with description "You're in a large dark tunnel that seems \ + to run north and south. To the south you see light. There \ + seem to be two metal tracks running along the ground.", + s_to GURTH_GUSPlatform, + n_to "You walk north, and run into a invisible force!", + before [; + Go: + if (noun==s_obj) { + Achieved(25); + print "^You step out into an underground chamber. \ + A burly uniformed figure sees you exit the tunnel and yells, \ + ~Hey, no playing in the tunnels, pal!~^"; + } + ], + each_turn [ i ; + i = random(40); + if (i > 35) + "^You hear a rumbling noise echoed from somewhere, and \ + the entire tunnel seems to shake! Then, all is quiet."; + if (i == 17 or 18) { + deadflag = 1; + "^Suddenly, without warning, a huge train car appears \ + heading south! It plows straight into you!"; + } + if (i==6 or 7) + "^Suddenly, a huge train car appears heading north! \ + You barely avoid getting pulverized! Strangely, \ + you watch as the train continues north, and \ + seems disappear into blackness nearby. It's as \ + though the train was simply removed from the tunnel \ + somehow."; + ], +; + +Nearby ST_tracks "tracks" + with name "tracks" "tracks" "metal", + description "Two long metal tracks, running north and south. \ + There's something oddly familiar about them.", + has scenery; + +Object ATRII_5 "Ethereal Plane of Atrii" + with description "Flat, featureless gray is in every direction \ + you look. It seems like you could go in any \ + direction from here.", + cant_go "An invisible force blocks your way!", + nw_to ATRII_3, + sw_to ATRII_7 + has light; + +Object p9 "ripped parchment" ATRII_5 + class parchment_class, + with name "ripped", +description "~...now know that the Rod we believe is \ +the Rod of the Ancients, sequestered in our Monastery, is \ +an artifact of evil! Imprisoned inside, \ +true to the scriptures (at least this much is, what \ +isn't, I can nowadays say is much) we know, is Anabais. \ +What is worse, is that this very Rod is an artifact of \ +evil power created by Anabais, in the image of the True \ +Rod of the Ancients, which he planned to use to aid \ +him in his evil gains! \ +Were that evil one free again, and had about him both \ +his brothers and his Rod of Evil, we would witness a \ +reckoning \ +greater than Quendor has ever known! I take relief in \ +the knowledge that he will never be freed, and he will \ +never regain his implement of evil; only an innocent \ +being can break the false rod and \ +free him from his prison, and subsequently, \ +the false rod cannot be regained by Anabais through his \ +own will, or another evil being. \ +In fact, only a being of good again can gather \ +the resulting pieces, and only through this being \ +can Anabais regain his evil artifact, for...~"; + + +Object ATRII_6 "Ethereal Plane of Atrii" + with description "Flat, featureless gray is in every direction \ + you look. It seems like you could go in any \ + direction from here.", + cant_go "An invisible force blocks your way!", + nw_to ATRII_4, + e_to ATRII_7, + n_to ATRII_2, + se_to ATRII_8, + has light; + +Object ATRII_7 "Ethereal Plane of Atrii" + with description "Flat, featureless gray is in every direction \ + you look. Stranger still is the odd-shaped depression in the gray \ + plane here. \ + Otherwise, you could wander this gray dimension in any direction, \ + it seems.", + cant_go "An invisible force blocks your way!", + ne_to ATRII_5, + w_to ATRII_6, + sw_to ATRII_8, + n_to ATRII_3, + has light; + +Nearby ATRII_7_depression "depression" + with name "depression" "cavity", + description "It's a large elongated depression in the gray 'floor'. \ + The cavity has a flat bottom, and somewhat cigar-like shape.", + before [; + Enter: + print "^You step into the depression. Your very \ + surroundings start to fade, replaced by sunlight that \ + makes you squint! The gray plane undulates and \ + buckles and turns into a great body of water \ + before your very eyes.^"; + in_atrii = 0; + PlayerTo(sailboat); ! useful if the player 'lost' the boat at sea. + return 2; + ], + has scenery enterable; + +Object ATRII_8 "Ethereal Plane of Atrii" + with description "Flat, featureless gray is in every direction \ + you look. Directly overhead, you notice odd streaks of \ + light. From here, you could wander this gray dimension in any direction, \ + it seems.", + name "streaks", + cant_go "An invisible force blocks your way!", + nw_to ATRII_6, + ne_to ATRII_7, + has light; + +! ----------- Special Implementor's Residence ----------- + +Object Imp_Liv "Strange Room" + with description [; + print "You "; + if (player in Imp_Curtains) + "can't see much behind these curtains."; + else "feel a great sense of dread! Surely, given the way \ +you got here, this must be the domicile of a dreaded Implementor! \ +The entire place feels strange and \ +alien and, well, ~modern~. There's some sort of kitchen to the \ +east. Long curtains cover what must be a window to the south."; + ], + number 1, + e_to Imp_Kitchen, + w_to Imp_door, + s_to [; <>; ], + each_turn [ ; + if (Imp in Imp_Bedroom) { + if (Imp_Liv.number == 3) { + StartDaemon(Imp); + Imp_Liv.number = 4; + } + else "^You hear some faint noises to the west."; + } + ! create some noises if player in curtains + if (player in Imp_Curtains) { + if (Imp in Imp_Liv) + "^You hear some faint noises nearby."; + if (Imp in Imp_Kitchen) + "^You hear some faint noises to the east."; + } + ], + time_left 0, + time_out [; + ! if player hasn't 'listened' twice to start Imp, + ! start him anyway (otherwise, in truth, player + ! would be permanently stuck in (my) apartment. + if (Imp_Liv.number < 4) { + StartDaemon(Imp); + Imp_Liv.number = 4; + } + ], + before [; + ! if player actually listens, better noises... + Listen: + if (Imp in Imp_Bedroom) { + if (Imp hasnt general) { ! i.e. -- awake + if (Imp_Liv.number == 1) { + Imp_Liv.number = 2; + "It sounds like someone is talking to himself to \ +the west. You hear: ~Now, wait just a second here, the player object \ +is gone! How did that happen?~"; + } + if (Imp_Liv.number == 2) { + Imp_Liv.number = 3; + "It sounds like someone is talking to himself to \ +the west. You hear: ~That can't be right. I must be getting tired. \ +Think I'll make myself a nice hot cup of coffee.~"; +! on next turn via Imp_Liv.each_turn, Imp daemon will be started... + } + ! otherwise, Imp has already made his rounds and + ! returned to bedroom, _not_ falling asleep + "You hear someone whistling a merry tune to the west."; + } + else + "You hear someone snoring loudly to the west."; + } + if (Imp in Imp_Liv) { + if (Imp.number == 1) + "You hear someone walking nearby. The footsteps \ +soon fade to the east."; + if (Imp.number == 4) + "You hear someone walking nearby. The footsteps \ +soon fade to the west."; + } + if (Imp in Imp_Kitchen) { + ! This assumes the daemon will run before the player turn. + if (Imp.number == 2) { + switch (Imp.weight) { + 118: print "You hear an irritated voice say, \ +~What happened to my coffee maker?~ Slightly softer, you \ +hear ~Well, I guess I'll have that iced tea.~"; + 119, 122: print "You hear a voice to the east say, \ +~Looks like I've got coffee, thank goodness.~"; + 121: print "You hear a voice to the east say, \ +~Great, I'm all out of coffee. Good thing I still have some \ +iced tea.~"; + } + " Shortly after this, you hear sounds of someone to \ +the east starting some kitchen activity."; + } + else "You hear some brief busy noises from the west, \ +followed by what sounds like someone drinking something. Shortly \ +thereafter, you hear the sounds of someone walking into the area \ +from the east."; + } + ], + has light; + +Nearby Imp_Curtains "set of curtains" + with name "curtain" "curtains", + description "Some heavy-cloth curtains along the south wall.", + before [; + Open: "You draw back the curtains and see a sight that \ +beggars the mind! Through the windows, the night sky falls across \ +some unknown landscape, dotted with strange bright points of light. \ +Tall buildings seem to be everywhere. Whatever world you've stumbled \ +onto, it certainly is not your own! You hastily close \ +the curtains."; + Enter: print "In an attempt to hide, you part the curtains. "; + ], + has static enterable; + +Object Imp_Kitchen "Strange Kitchen" + with description "A room that could be a kitchen, \ +if it didn't seem completely strange. Harsh bright lights seem to \ +be coming from some unknown source. Strange-looking white countertops and \ +cabinets fill the area, along with a curious white closet-like object. \ +A room lies to the west.", + name "cabinet" "cabinets" "closet" "refrigerator" "countertops", + w_to Imp_Liv, + has light; + +Object Coffee_maker "curious machine" Imp_Kitchen + with name "machine" "curious", + description "A white plastic device that seems to \ +encase a glass pitcher or kettle of some sort. Most odd.", + ! weight 15, + size 15, +; + +Object regular_coffee_can "can of regular coffee" Imp_Kitchen + with name "can" "coffee" "regular", + description [; + "The can reads: ~Brand-X coffee crystals~^^\ + ~Rich, mountain-grown flavor.~"; + ], + before [; + Open: + "You'd need a good can-opener for that."; + ], + ! weight 15, + size 15, +; + + +Object Imp_Bedroom "Strange Bedroom" + with description "A very curious small bedroom. \ + A white desk sits here amongst other odd furnishings.", + name "furnishings" "bed" "chair", + e_to Imp_door, + has light; + +!Nearby Imp_Bed "furnishings" +! with name "furnishings" "bed" "chair", +! description "Some weird bedroom furniture.", +! has scenery; + +Object Imp_Desk "desk" Imp_Bedroom + with name "desk", + description "A white desk, with a strange, modern look.", + capacity 6, + has scenery supporter; + +Object Imp_Computer "strange machine" Imp_Desk + with name "machine" "computer", + description + [ ; + print "It's a strange metal box. On top, perhaps connected in some \ +way, is another metal box with a glass plate on the front. Strange wires \ +seem to be attached to the boxes somehow. \ +In front of the boxes is an odd plastic \ +flat object with rows and rows of plastic buttons labeled every letter in \ +the alphabet"; + if (self hasnt general) { + give self general; + print ".^^Looking closer, you notice curious glowing \ +letters on the glass plate. You read the letters, and \ +feel drawn to respond...^^\ +SPIRITWRAK DEVELOPMENT SYSTEM:^\ +(AUTOMATIC OBJECT GARBAGE-COLLECTION)^\ +REMOVE OBJECT IMPENETRABLE_STEEL_WALL? (Y/N) "; +if (YesOrNo() == 0) "You press a button labeled ~N~. The strange box \ +emits a tiny beep, and the glass plate is covered with fantastic colorful \ +designs."; +else { + ! set-up the secret room + remove steel_wall; + give cave_intersection general; + Achieved(18); +"You press a button labeled ~Y~. The strange box \ +emits a tiny beep, and the glass plate is covered with fantastic colorful \ +designs."; + } + } + else ". The glass plate currently has strange glowing colorful \ +patterns displayed on it."; + ], + has static; + +[ ImpSendBack ; + print "~I'm afraid you'll have to go back.~ The Implementor \ +snaps his fingers, and suddenly, you're back in...^"; + spell_block = 0; + StopDaemon(Imp); + StopTimer(Imp_Liv); + PlayerTo(ATRII_8); +]; + +Nearby Imp_door "door" + with name "door", + when_closed [; + if (self in Imp_Liv) { + if (player notin Imp_Curtains) + "There's a closed door to the west."; + else rtrue; + } + else "There's a closed door to the east."; + ], + when_open [; + if (self in Imp_Liv) { + if (player notin Imp_Curtains) + "There's an open door to the west."; + else rtrue; + } + else "There's an open door to the east."; + ], + description "A plain-looking door. A note \ +attached to it says ~DO NOT DISTURB, IMPLEMENTOR AT WORK~.", + door_dir [; + if (self in Imp_Liv) return w_to; + else return e_to; + ], + door_to [; + if (self in Imp_Liv) return Imp_Bedroom; + else return Imp_Liv; + ], + found_in Imp_Liv Imp_Bedroom, + before [; + Open: + if ((Imp in Imp_Bedroom) && (Imp hasnt general)) { + print "You open the door, revealing a small room with \ +what must be an Implementor sitting behind a desk. The Implementor looks \ +up, startled. ~You're here?~ he says, observantly. "; + ImpSendBack(); + return 1; + } + ], + has static door openable; + + +! *************** And, for my final trick, the endgame ************** + +Object Mystical_Cave "Mystical Cave" + with description "You've entered a wondrous natural cave, lit \ +everywhere by reflected light from some sort of purple crystalline substance \ +in the walls. A tunnel exits to the northwest.", + name "reflected" "crystal" "crystalline" "substance", + number 0, + nw_to [; + if (Mystical_Cave.number ~= 4) + "The purple light in the chamber seems to pulse with energy, \ +and find your way blocked by an invisible force!"; + else { + spell_block = 0; + ! fill with things, if necc. + print "As you leave, a sudden tremor shakes the \ +cave! You just narrowly avoid a sudden cave-in behind you!^"; + give cave_intersection ~general; + return cave_intersection; + } + ], + has light; + +Nearby purple_sphere "purple sphere" + with name "sphere" "purple", + initial "There's a purple crystal sphere partially embedded \ +in the rock floor here.", + description "A large purple sphere that seems to pulse with \ +strange energy.", + before [; + Push, Touch, Rub: + ! various endgame trickery... + if (silver_rod_piece in player) { + while (child(player)~=0) { + give child(player) ~worn; + move child(player) to Mystical_Cave; + } + move silver_rod_piece to player; + spell_block = 1; + print "The sphere pulses with angry energy! It seems to \ +be fighting the silver rod piece you hold! With a sudden burst, you \ +feel your mind reel and your very surroundings change!^"; + give stone_marker general; +! give snowy_intersection general ~visited; + give snowy_intersection general; + StartTimer(White_Dragon,3); + PlayerTo(Dragon_Cave); + rtrue; + } + if (green_rod_piece in player) { + while (child(player)~=0) { + give child(player) ~worn; + move child(player) to Mystical_Cave; + } + move green_rod_piece to player; + spell_block = 1; + print "The sphere pulses with angry energy! It seems to \ +be fighting the green rod piece you hold! With a sudden burst, you \ +feel your mind reel and your very surroundings change!^"; + StartTimer(captain,3); + PlayerTo(On_Boat); + rtrue; + } + if (red_rod_piece in player) { + while (child(player)~=0) { + give child(player) ~worn; + move child(player) to Mystical_Cave; + } + move red_rod_piece to player; + spell_block = 1; + print "The sphere pulses with angry energy! It seems to \ +be fighting the red rod piece you hold! With a sudden burst, you \ +feel your mind reel and your very surroundings change!^"; +! give Stadium_entrance general ~visited; +! remove stadium_sign; +! remove stadium_statue; +! move statue_base to Stadium_entrance; + StartTimer(statue_base,2); + PlayerTo(Stadium_entrance2); + rtrue; + } + if (brown_rod_piece in player) { + while (child(player)~=0) { + give child(player) ~worn; + move child(player) to Mystical_Cave; + } + move brown_rod_piece to player; + spell_block = 1; + print "The sphere pulses with angry energy! It seems to \ +be fighting the brown rod piece you hold! With a sudden burst, you \ +feel your mind reel and your very surroundings change!^"; +! give GURTH_House general ~visited; +! move bad_brick to GURTH_House; + StartTimer(bad_brick,7); + PlayerTo(GURTH_House2); + rtrue; + } + ! default... + "A purple blast of force throws you back!"; + ], + has static; + +Object skeleton "skeleton" Mystical_Cave + with name "skeleton" "bones", + initial "Lying in one corner of the room is a skeleton.", + description "Just some bones, not much else, is all.", + before [; + Pull, Push, Turn, ThrownAt, Touch, Attack, Rub, +Cut, Shake, Squeeze, Kiss: + remove self; + "The skeleton crumbles into dust, as though \ +many years of time had suddenly caught up with it in one \ +moment."; + ], +has static; + +! (black -- final parchment of Palemon's final words) +Object p8 "blackened parchment" Mystical_Cave + class parchment_class, + with name "blackened", +description "~I write these final words not in the hope \ +that others will find and heed them, for this is too great \ +a hope in my moment of death, but rather, to try and maintain my mind and soul \ +in the face of the terror I now know is the truth.^^\ +For how can a man survive, knowing that his entire life, \ +his entire belief, has been a ruse, a dupe, from the \ +early beginning? That he has merely been a pawn in a \ +working of evil that cannot be stopped?^^\ +I have fought all manner of terrors, and recovered that which \ +I know is the _true_ Rod of the Ancients, broken and scattered \ +eons ago in the face of great evil. I sought also those \ +ancient spheres that the Four Ancients never had the chance to \ +use against the evil four elemental demons, but alas, I could \ +not find them all, and sequestered those which I did with \ +good people that the elemental evil could not touch.^^\ +Alas, my quest has ended here. I lie trapped here, \ +with the pieces of the true Rod in hand, unable to go forward, trapped by the \ +elemental mystic locks on the rod that prevent it from leaving this \ +very room, yet unable to go back, to leave the rod here and \ +deny the very real danger of the defeat of the Ancients, of \ +the power that the evil elementals hold.^^\ +What is a faith destroyed? Who can help me to believe, in my moment \ +of disbelief?^^\ +--P--~"; + + + + +Object Dragon_Cave "Giant Cavern" + with description "You find yourself in a huge cavern. To the west \ +is a large exit that looks out into a void of snow-covered mountains.", + name "mountains", + w_to "You hesitate. The cave seems to just \ +exit off the side of a mountain, and all you can see below is whiteness. \ +It could be a long way down.", + d_to [; <>; ], + out_to [; <>; ], + before [; + Jump: + print "You close your eyes and leap out of the cave! \ +You plummet through silent white winds. \ +Moments later, you fall right into an enormous snowbank, and \ +roll downwards, into...^"; + PlayerTo(snowy_intersection2); + rtrue; + ], + has light; + +Object On_Boat "On strange boat" + with description "You are on a long open boat, riding the waves of \ +some great sea. The boat seems to be filled with sailors from \ +some militia.", + name "waves" "sea" "mast" "floorboards" "ship" "boat", + before [; + Drop: + if (captain has general) { + if (noun==green_rod_piece) { + remove green_rod_piece; ! it'll be back + give shipwreck general; + Mystical_Cave.number = Mystical_Cave.number + 1; + StopTimer(captain); + StopTimer(militia); + print "You drop the green rod and watch it roll near \ +a mast and get stuck in the floorboards.^^\ +There's a load crack! The ship is breaking apart! Sailors \ +scramble in vain for safety! You hang onto the side of the \ +boat, but the vessel rocks wildly, and you fall into the waters. \ +^^As you sink, you notice the waters seem to change to a purplish \ +hue, and you find yourself back in...^"; + PlayerTo(Mystical_Cave); + rtrue; + } + } + else + "The sailors are holding you fast, so you \ +can't do this at the moment."; + ], + has light; + +Nearby militia "sailors" + with name "sailors" "militia" "navy", + description "A bunch of dour-looking navy sailors.", + time_left 0, + time_out [; + deadflag = 1; + "The ship breaks asunder! Sailors scramble madly \ +and fall into the violent waves! You hear \ +the captain scream ~Blast! I can't swim!~ before the \ +waters cover you completely."; + ], + has scenery; + +Object ENDGAME_ROOM "Nothingness" + with description "Nothingness surrounds you. Yet, you feel like \ +your conscious being extends into worlds and dimensions never \ +imagined. You float in a void of total being.", + number 0, ! number of elementals banished + each_turn [; + switch (ENDGAME_timer.number) { + 0: ENDGAME_timer.number = 1; + if (black_elemental in ENDGAME_ROOM) + "^Echoing in your mind, you hear a voice, that you \ +somehow know is from the black sphere. ~Give me the rod priest, \ +and you shall be immortalized as a symbol to an entire civilization!~"; + 1: ENDGAME_timer.number = 2; + if (smoke_elemental in ENDGAME_ROOM) + "^Echoing in your mind, you hear a voice, that you \ +somehow know is from the smoke-colored sphere. ~Give me the rod priest, \ +and I shall let you be witness to a feat of great magic, never \ +before witnessed!~"; + 2: ENDGAME_timer.number = 3; + if (gray_elemental in ENDGAME_ROOM) + "^Echoing in your mind, you hear a voice, that you \ +somehow know is from the gray-colored sphere. ~Give me the rod priest, \ +and I will grant you power over all who surround you!~"; + 3: ENDGAME_timer.number = 4; + if (white_elemental in ENDGAME_ROOM) + "^Echoing in your mind, you hear a voice, that you \ +somehow know is from the white sphere. ~Give me the rod priest, \ +and you will gain the attention of one of the more powerful \ +figures of your time!~"; + } + ], +has light; + +Object ENDGAME_timer "void" ENDGAME_ROOM + with name "void" "nothingness", + description "The absence of anything. Yet, at the same \ +time, the sense that everything possible is near.", + number 0, + time_left 0, + time_out [; + deadflag = 1; + if (ENDGAME_ROOM.number < 3) + print "The spheres nearby suddenly converge"; + else print "The sphere nearby suddenly converges"; + " towards you! In your mind, you hear \ +~Hesitation, foolish priest, was the downfall of the Ancient \ +Ones~ before you feel the full force of the void."; + ], + has scenery; + +! *** fake room/encounter for bad ending #x +Object badend1 "On Giant Cube" + with description "You stand on a single giant floating white \ +cube, in the middle of some dimly lit cavern. \ +^^A small newt floats nearby, concentrating on something.^^\ +The newt suddenly opens its eyes! ~What?~ it croaks in \ +surprise. ~Who are you? You've broken my concentration on \ +the spell, you fool!~ the newt croaks. You feel the cube \ +shift, then stop floating! You plummet into the lava you \ +feared was below..." + has light; + +Object badend2 "Top of Pyramid" + with description "You are on top of a pyramid in some \ +ancient city. You see dense jungle to the horizon. \ +An ancient civilization spreads before you, in all its \ +mysterious glory.^^Several robed figures surround you.^^\ +Suddenly, you realize you are tightly bound! One of the \ +figures points towards the horizon and makes a complicated \ +gesture. In a language you do not understand, he seems \ +to make a prayer to some nameless god! Fearing the \ +inevitable, you struggle mightily, but to no avail. \ +In moments, the group of robed figures hurls you off the \ +pyramid to your death!" + has light; + +! ************* +! Creatures +! ************* + +Object Imp "Implementor" Imp_Bedroom + with name "Implementor", + article "an", + description [; + print "Some Implementor. Looks more like a oddly-dressed \ +young man badly in need of a haircut"; + if (self has general) + ". He's also sound asleep!"; + else "."; + ], + describe [; + print "^Someone you assume must be an Implementor \ +is here"; + if (self has general) + ", sound asleep."; + else "."; + ], + number 0, + weight 120, ! about right + life [; + ! if asleep, which is usually the case + if (self has general) { + if (action==##WakeOther or ##Attack) { + print "You manage to rouse the Implementor from his \ +slumber. He stares at you, bewildered. ~What are you doing here?~ \ +he asks. "; +ImpSendBack(); rtrue; + } + else + "He appears to be sound asleep right now, and isn't very \ +responsive."; + } +! else { +! (I suppose this is unnecessary. -- i.e. the player shouldn't be able to +! interact with the implementor unless the implementor is asleep) +! print "Well, that got his attention. The Implementor \ +!looks completely startled. ~What are you doing here?~ he says. "; +!ImpSendBack(); rtrue; +! } + ], + daemon [; + ! ASSUMPTION -- daemon started by start event + StopTimer(Imp_Liv); + if (Imp.number == 0) { + give Imp_door open; + if ((player in Imp_Liv) && (player notin Imp_Curtains)) { + print "^The door to the west suddenly flies open! \ +A somewhat bedraggled Implementor steps out! He spots you and his \ +jaw drops. ~You, here?~ he says. "; +ImpSendBack(); rtrue; + } + else + print "^You hear a door open to the west.^"; + Imp.number = 1; + move Imp to Imp_Liv; + } + else { + ! first a little 'lazy' clause that kicks the player + ! out if the Imp is moving around and the player isn't + ! in the curtains + if ((Imp.number < 5) && (player notin Imp_Curtains)) { + if (Imp in location) print "^The Implementor "; + else print "^From nearby, an Implementor rushes up and \ +"; + print " grabs you by the shoulder! \ +~What are you doing here?~ he \ +says. "; ImpSendBack(); return 1; + } + ! now, otherwise, we move the Imp and set his + ! number accordingly. Room descs and 'Listen' + ! traps in Imp_Liv will need to use this info + switch (Imp.number) { + ! [step 1, moving to Kitchen] + 1: move Imp to Imp_Kitchen; + Imp.number = 2; + if (Coffee_maker notin Imp_Kitchen) Imp.weight = 118; + else { + if (regular_coffee_can in Imp_Kitchen) { + Imp.weight = 119; + remove regular_coffee_can; + } + else { + if (decaf_coffee_can in Imp_Kitchen) { + Imp.weight = 122; + remove decaf_coffee_can; + } + else { + ! no coffee, gosh darn it + Imp.weight = 121; + } + } + } + return 0; + ! [step 2, making/drinking the beverage] + 2: Imp.number = 3; + ! [step 3, leaving kitchen, back to living room] + 3: Imp.number = 4; + move Imp to Imp_Liv; + ! [step 4, goes back into bedroom] + 4: Imp.number = 5; + give Imp_door ~open; + if (player in Imp_Curtains) + print "^You hear a door close to the west.^"; + move Imp to Imp_Bedroom; +! move coffee_cup to Imp_Bedroom; + if (Imp.weight == 122) + give Imp general; ! asleep + StopDaemon(Imp); + } + } + ], +has animate; + +!Object coffee_cup "large cup" +! with name "cup" "large", +! description "A large mug, with the residue of some brown liquid \ +!left in it.", + ! weight 5, +! size 4, +! has container open; + +! MOVEPRINTNPC routine, from Gareth Rees' 'THIEF.INF' +! (TODO -- you really don't need this, since only Frobar moves in this fashion) +[ MovePrintNPC n dest dir; + if (n in location) { + print "^", (The) n, " walks off"; + if (dir ~= in_obj or out_obj or u_obj && dir ~= d_obj) + print " to the ", (DirectionName) dir.door_dir; + print ".^"; + } + if (dest == 0) remove n; ! This seems odd - if dest bogus, 'unlink' NPC? + else move n to dest; + if (n in location) + print "^", (The) n, " walks in.^"; +]; + +Object White_Dragon "White Dragon" Dragon_Cave + with name "dragon" "white" "giant", + describe [; + print "There is a gigantic white dragon here"; + if (self has general) + " sleeping peacefully."; + "!"; + ], + description "A giant white dragon, the size of a small house.", + time_left 0, + time_out [; + give self ~general; + if (location == Dragon_Cave) { + deadflag = 1; + "^The dragon suddenly snorts and wakes! It sees you \ +and attacks! In moments, you are no more..."; + } + else { + remove self; + give stone_marker ~general; + move stone_marker_top to snowy_intersection2; + "^You hear a roar from the east! From out of the \ +sky, a giant white dragon descends! It draws near, spots you, \ +and bellows in rage! You shrink back, and pray for a quick but \ +painless end.^^There is a loud crack! The dragon, in trying to \ +land, almost impales itself on the obelisk marker! Part of the \ +marker breaks off, and the dragon flies off, whimpering in pain!"; + } + ], + life [; + Attack, ThrowAt, WakeOther: +deadflag = 1; +"You disturb the sleeping dragon, who promptly makes you wish \ +you hadn't."; + default: "Best not to disturb the dragon, I'd guess."; + ], + has animate; + +Object captain "sea captain" On_Boat + with name "captain", + description "A rough-looking navy captain.", + number 0, + each_turn [; + if (self hasnt general) { + if (captain.number == 0) { + captain.number = 1; + "^You suddenly realize that you are being \ +held fast by two navy sailors! The captain walks forward and \ +points his cutlass near your ear.^^\ +~What we have here, lads, is a stowaway!~ Some sailor cries out \ +~Overboard with the stowaway!~ The captain smiles. \ +~Now, we was planning on feeding you to the groupers, \ +but we could use a scullion in the hold. One things for sure, \ +ye ain't finding passage on this ship if ye ain't aligned with \ +the Antharian Navy cause!~ Some sailor cries out \ +(unnecessarily) ~The Antharian Navy cause!~. ~So, tell us lad, \ +are ye with us? If ye are true, you'll tell me the Antharian \ +Navy patron saint! So speak quickly, lad, if ye wish to stay \ +dry!~"; + } + else "^~Speak up fellow! We havn't got all day!~"; + } + ], + time_left 0, + time_out [; + deadflag = 1; + "The captain sighs. ~Into the water with ye, then,~ \ +he says, and the two sailors push you roughly overboard. \ +You land in the sea with a splash, and struggle to stay afloat. \ +The ship sails off, but oddly, moments later, it seems to \ +stall and start to sink! Before you get a chance to reflect on \ +this, a large grouper swallows you whole."; + ], + life [; + if (self has general) + "The captain's a bit too busy trying to save \ +a sinking ship."; + Answer: + if (noun=='minirva') { + give self general; + StopTimer(self); + StartTimer(militia,2); + "~Aye, that's right. Escort the new scullion \ +down to the hold where --~^^\ +The captain's orders are cut short by a sudden grinding noise, \ +and the boat rocks violently! ~Reef, captain!~ you hear someone \ +cry. ~Blast!~ the captain says, ~quickly men, we've got to --~ \ +But it's too late. The boat starts to tip and sway, and \ +the two sailors release you and hastily try to help raise the \ +rigging!"; + } + else { + if (noun=='duncanthrax') { + deadflag = 1; + "The sailors suddenly pale at the mention of \ +Lord Duncanthrax. ~A traitor in our midst, eh?~ the captain \ +shouts and beheads you with one stroke."; + } + if (noun=='ulysses' or 'odysseus') + "~Nay lad, me thinks that \ +was a sailor.~"; + else "~Nay lad, that doesn't sound right.~"; + } + Attack, ThrowAt, Kiss, Show, Give: + "Given that you are in the grips of several \ +strong navy sailors, this is impossible."; + ], + has animate; + +! ***** THE EVIL ELEMENTALS +Object black_elemental "black sphere" ENDGAME_ROOM + with name "anabais" "black" "sphere" "earth", + description "A black sphere of energy.", + life [; + ThrowAt: + if (noun==brown_sphere) { + remove self; remove brown_sphere; + ENDGAME_ROOM.number = ENDGAME_ROOM.number + 1; + if (ENDGAME_ROOM.number == 4) { + GameWinner(); rtrue; } + "The black sphere howls in rage and is no more!"; + } + Give: + if (noun==TRUEROD) { + remove TRUEROD; + print "You feel a strange foreboding feeling as \ +the black sphere seems to engulf the rod, then you! Your \ +surroundings change once again!^"; + deadflag = 1; + PlayerTo(badend2); + rtrue; + } + default: "The black sphere is unresponsive."; + ], + has animate; + +Object smoke_elemental "smoke-colored sphere" ENDGAME_ROOM + with name "smoke" "sphere" "fire", ! TODO new name... + description "A smoke-filled sphere of energy.", + life [; + ThrowAt: + if (noun==red_sphere) { + remove self; remove red_sphere; + ENDGAME_ROOM.number = ENDGAME_ROOM.number + 1; + if (ENDGAME_ROOM.number == 4) { + GameWinner(); rtrue; } + "The smoke-filled sphere howls in rage and is no more!"; + } + Give: + if (noun==TRUEROD) { + remove TRUEROD; + print "You feel a strange foreboding feeling as \ +the smoke-filled sphere seems to engulf the rod, then you! Your \ +surroundings change once again!^"; + deadflag = 1; + PlayerTo(badend1); + rtrue; + } + default: "The smoke-filled sphere is unresponsive."; + ], + has animate; + +Object gray_elemental "gray sphere" ENDGAME_ROOM + with name "gray" "sphere" "water", ! TODO new name + description "A gray sphere of energy.", + life [; + ThrowAt: + if (noun==green_sphere) { + remove self; remove green_sphere; + ENDGAME_ROOM.number = ENDGAME_ROOM.number + 1; + if (ENDGAME_ROOM.number == 4) { + GameWinner(); rtrue; } + "The gray sphere howls in rage and is no more!"; + } + Give: + if (noun==TRUEROD) { + remove TRUEROD; + print "You feel a strange foreboding feeling as \ +the gray sphere seems to engulf the rod, then you! Your \ +surroundings change once again!^"; + PlayerTo(FUBLIO_Cave); + StartTimer(mad_hermit,3); + rtrue; + } + default: "The gray sphere is unresponsive."; + ], + has animate; + +Object white_elemental "white sphere" ENDGAME_ROOM + with name "white" "sphere" "air", ! TODO new name + description "A white sphere of energy.", + life [; + ThrowAt: + if (noun==silver_sphere) { + remove self; remove silver_sphere; + ENDGAME_ROOM.number = ENDGAME_ROOM.number + 1; + if (ENDGAME_ROOM.number == 4) { + GameWinner(); rtrue; } + "The white sphere howls in rage and is no more!"; + } + Give: + if (noun==TRUEROD) { + remove TRUEROD; + print "You feel a strange foreboding feeling as \ +the white sphere seems to engulf the rod, then you! Your \ +surroundings change once again!^"; + PlayerTo(TROPHY_SECRET); + rtrue; + } + default: "The white sphere is unresponsive."; + ], + has animate; + + +! ****************** +! scrolls/spells +! ****************** + +Object fancy_scroll "fancy scroll" + class scroll_class, + with name "fancy", +; + +Object wigro_spell "turn undead" fancy_scroll + class spell_class, + with name "wigro", + magic [; + "You speak the chant. Nothing seems to happen."; + ], +; + +Object briefcase "briefcase" Subway_Tunnel + with name "briefcase" "case", + description "A somewhat battered brown-leather briefcase.", + capacity 5, + ! weight 20, + size 15, + has container openable; + +Object red_scroll "red scroll" briefcase + class scroll_class, + with name "red", +; + +Object luncho_spell "send object to lower plane" red_scroll + class spell_class, + with name "luncho", + magic [; + if (second == 0) +"You see a brief flash of smoke, but nothing happens."; + if (second has animate) + "You feel a slight rumbling beneath your feet, but nothing else \ +happens."; + else { + if ((second hasnt static) && (second hasnt scenery)) { + if (second has clothing) give second ~worn; + if (in_atrii == 1) { + move second to MON_Chapel2; + } + else + move second to Hades_5; + print "There is a sudden puff of smoke, and "; DefArt(second); + " suddenly vanishes!"; + } + "Your chant goes unanswered."; + } + ], +; + +! ****************** +! special obs +! ****************** + +Object Atrii_gate "strange contraption" GUE_Labs_SECRET + with name "contraption" "plate" "disc" "strange", + description "It looks like a large, slightly convex round disc \ + made of some silvery material.", + before [; + Enter: + print "As you step onto the silvery disc, you feel a \ + strange jolt run through your body. A bright white \ + flash blinds you momentarily!^^You blink, trying to \ + register your surroundings.^"; + in_atrii = 1; + PlayerTo(ATRII_1); + return 2; + Receive: + move noun to ATRII_1; + CDefArt(noun); " suddenly disappears in a bright \ + flash of light as you place it on the silver disc!"; + Push, Pull, Touch, Take: + "As you reach for the strange contraption, you notice \ + white sparks of something arc from the silver surface \ + to your fingers! You hastily draw back."; + ], + has static supporter enterable; + +! *** the true rod pieces, and the golden rod (after joined) +Object silver_rod_piece "silver rod piece" Mystical_Cave + class rod_class, + with name "silver", + description "A strange short section of rod colored \ +silver.", + before [; + Join: + if (location ~= Mystical_Cave) { + if (second == TRUEROD) + <>; + if ((second == brown_rod_piece) || + (second == red_rod_piece) || + (second == green_rod_piece)) { + if (TRUEROD.number == 0) { + TRUEROD.number = 1; + move TRUEROD to parent(self); + remove self; remove second; + "There is a dazzling golden light as \ +you join the two rod pieces! What remains is a new, strange \ +rod piece!"; + } + else "There is a dazzling burst of \ +golden light. However, the pieces will not join, and seem \ +to be seeking out something else..."; + } + } + else "Some strange purple flash of force \ +blocks your efforts."; + ], +; +Object red_rod_piece "red rod piece" Mystical_Cave + class rod_class, + with name "red", + description "A strange short section of rod colored \ +red.", + before [; + Join: + if (location ~= Mystical_Cave) { + if (second == TRUEROD) + <>; + if ((second == silver_rod_piece) || + (second == brown_rod_piece) || + (second == green_rod_piece)) { + if (TRUEROD.number == 0) { + TRUEROD.number = 1; + move TRUEROD to parent(self); + remove self; remove second; + "There is a dazzling golden light as \ +you join the two rod pieces! What remains is a new, strange \ +rod piece!"; + } + else "There is a dazzling burst of \ +golden light. However, the pieces will not join, and seem \ +to be seeking out something else..."; + } + } + else "Some strange purple flash of force \ +blocks your efforts."; + ], +; +Object green_rod_piece "green rod piece" Mystical_Cave + class rod_class, + with name "green", + description "A strange short section of rod colored \ +green.", + before [; + Join: + if (location ~= Mystical_Cave) { + if (second == TRUEROD) + <>; + if ((second == silver_rod_piece) || + (second == red_rod_piece) || + (second == brown_rod_piece)) { + if (TRUEROD.number == 0) { + TRUEROD.number = 1; + move TRUEROD to parent(self); + remove self; remove second; + "There is a dazzling golden light as \ +you join the two rod pieces! What remains is a new, strange \ +rod piece!"; + } + else "There is a dazzling burst of \ +golden light. However, the pieces will not join, and seem \ +to be seeking out something else..."; + } + } + else "Some strange purple flash of force \ +blocks your efforts."; + ], +; +Object brown_rod_piece "brown rod piece" Mystical_Cave + class rod_class, + with name "brown", + description "A strange short section of rod colored \ +brown.", + before [; + Join: + if (location ~= Mystical_Cave) { + if (second == TRUEROD) + <>; + if ((second == silver_rod_piece) || + (second == red_rod_piece) || + (second == green_rod_piece)) { + if (TRUEROD.number == 0) { + TRUEROD.number = 1; + move TRUEROD to parent(self); + remove self; remove second; + "There is a dazzling golden light as \ +you join the two rod pieces! What remains is a new, strange \ +rod piece!"; + } + else "There is a dazzling burst of \ +golden light. However, the pieces will not join, and seem \ +to be seeking out something else..."; + } + } + else "Some strange purple flash of force \ +blocks your efforts."; + ], +; +Object TRUEROD "golden rod" + class rod_class, + with name "golden", + number 0, + description [; + print "A wondrous, shimmering golden rod"; + if (TRUEROD.number < 3) + " that seems slightly short."; + else "."; + ], + before [; + Wave: + if (TRUEROD.number == 3) { + deadflag = 1; +! TODO -- this is essentially another 'win', but not a good one + "You wave the rod, and feel a sudden blast of force! \ +The spheres howl in terror and \ +suddenly explode! The jolt of power from the rod sends you \ +hurtling through space, and you are lost in an endless \ +tumble through the void..."; + } + Join: + if ((second == silver_rod_piece) || + (second == red_rod_piece) || + (second == green_rod_piece) || + (second == brown_rod_piece)) { + remove second; + TRUEROD.number = TRUEROD.number + 1; + print "You feel a strange surge of \ +mystic energy as you join the rod pieces. ", (The) second, " \ +joins with the golden rod"; + if (TRUEROD.number == 3) { + Achieved(19); + print "!^^Time and space seem to grind to \ +a halt.^^\ +Your surroundings and the very ground you stand on shatter like \ +planes of glass, revealing a strange, new dimension...^"; + spell_block = 1; + PlayerTo(ENDGAME_ROOM); + StartTimer(ENDGAME_timer,12); + rtrue; + } + else "!"; + } + ], +; + +! *** The results of winning the game *** +[ GameWinner ; + Achieved(26); + print "The last sphere howls in rage and disappears!"; + deadflag = 2; + " You scream in agony as the void that surrounds you \ +seems to implode! You feel yourself dissipating into the \ +surrounding nothingness. ~Is this my reward?~ you scream, \ +~Is this, then, the end?~^^\ +A white light makes you open your eyes.^^\ +You are lying on a beach. The Great Sea laps at your \ +tattered garments. Slowly, you rise to your knees.^^\ +The sun, like a bloated, radiant bird, is sinking below the \ +wave on the horizon. Another day is coming to an end.^^\ +A voice startles you. ~Tis a fine spot for watching \ +sunsets.~ You turn to see Morgan the Ranger, Frobar and \ +the Thief nearby. The Thief helps you to your feet, and Frobar \ +glances your way. ~I sensed a great upheaval in the \ +fabric of time and space not long ago. I gather you \ +have quite a story to tell,~ he says. ~We \ +probably can relate to much of what you have seen, \ +although your unwavering faith is something we \ +desire to understand.~ Morgan explains, ~Belief in the \ +face of the unbelievable is an enviable strength.~ \ +The Thief chuckles quietly. \ +~Perhaps you will join us at Delbins, where we will \ +partake in a belief of fine cuisine while you tell all?~ he says. \ +He notices your weary expression and \ +adds with surprising seriousness, ~Not that I \ +prepose to offer advice from one as myself, \ +but humbly, I admit, that many a time, a belief in myself \ +was often sufficient.~ He pauses. \ +~Gods or no, now, you make your own destiny.~"; +]; diff --git a/src/spirit.inf b/src/spirit.inf new file mode 100644 index 0000000..a458e6d --- /dev/null +++ b/src/spirit.inf @@ -0,0 +1,3075 @@ +! ***************************************************************** +! SPIRITWRAK -- An exercise in copyright infringement :) +! +! Release 1, 12/95 -- 3/96 +! Release 2, 3/96 -- +! Release 3, 4/96 -- +! Copyright (C) 1996, D. S. Yu +! +! This program is free software; you can redistribute it and/or modify +! it under the terms of the GNU General Public License as published by +! the Free Software Foundation; either version 3 of the License, or +! (at your option) any later version. +! +! This program is distributed in the hope that it will be useful, +! but WITHOUT ANY WARRANTY; without even the implied warranty of +! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +! GNU General Public License for more details. +! +! You should have received a copy of the GNU General Public License +! along with this program; if not, write to the Free Software +! Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +! +! To contact the author (Dan Yu), send email to dsyu@holonet.net. +! +! ***************************************************************** + +! SPECIAL THANKS: +! Mr. Blank, Lebling, Meretzky, Moriarty for the Zork universe. +! Graham Nelson for Inform, and for various code I've shamelessly cribbed. + +! NUTRITION NOTE: No Microsoft(tm) products were used in the +! construction of this game + +! ** inform compile switches here ** +Switches exv5b; + +! ** abbreviations +Include "spirita.inf"; + +! ** Story Constants ** +Constant Story "SPIRITWRAK"; +Constant Headline "^An Interactive Fantasy Adventure^\ + Copyright (C) 1996, by D.S. Yu.^\ +Portions copyright Graham Nelson.^^\ +'SPIRITWRAK' comes with ABSOLUTELY NO WARRANTY ^\ +This is free software, and you are welcome to redistribute it \ +under conditions as described in the GNU General Public License as published by \ +the Free Software Foundation; either version 3 of the License, or \ +(at your option) any later version.^^"; + +Release 3; + +! ** Scoring System +Constant MAX_SCORE 250; +Constant NUMBER_TASKS 27; +Constant TASKS_PROVIDED; +Constant OBJECT_SCORE 2; +! Constant ROOM_SCORE 1; +! Global task_scores initial t1 t2 t3..... +Array task_scores -> 2 5 5 5 10 15 5 5 5 5 5 5 10 10 10 5 5 5 10 10 5 5 10 5 5 5 10; + +! ** Player inventory and weight system +Constant MAX_CARRIED 15; ! Max of 15 items carried at start + ! This can be changed on the fly by adjusting player.capacity +Property weight; +! Entire weight system removed 3/16/96, however certain puzzles +! inadvertently depend on this, so... +Property size; + +global Player_HP_MAX = 20; ! number of hp MAX (should be 20 + score) +global Player_HP_CUR = 20; ! number of hp left (< MAX) +global Player_Lives_Left = 3; ! number of resurrects left +global in_hades = 0; ! Is the player in Hades? (we certainly hope not) +global in_atrii = 0; ! Is the player in Atrii? +! global all_my_spells data 32; array for spells in spell book +Array all_my_spells -> 64; ! array for spells in spell book +global has_resist_gravity = 0; ! is player resisting gravity?(see feeyuk spell) +global spell_block = 0; ! block spell-related stuff (end-game) + +! Any actions that are replaced get mentioned here +Replace PraySub; +Replace StrongSub; +Replace InsertSub; ! for relative sizes + +! *** Include Parser and VerbLib +Include "Parser"; +Include "VerbLib"; + +! -- two global location ptrs for Barsap's Gambit +global WN_TO; +global ES_TO; + +! ******************* CLASS DEFS ***************** + +! ** rod (part) class and attribute +Attribute is_rod; + +Class rod_class + with name "rod", + description "A thin rod made from some undeterminable material.", + !weight 10, + size 10, + before [; + Cast: + "You complete the chant, but the rod lies unaffected! \ + Perhaps it is protected from magic somehow?"; + Join: + if (second has is_rod) + "You try to bring the rods together, but a \ +sudden blast of energy prevents you, and stings your hands!"; +! (note that true rod pieces have their own Join befores, which +! should, in theory, get called instead of this one). + ], + has is_rod scored; + +Class parchment_class + with name "parchment", + description "A piece of blank parchment.", + !weight 10, + size 15, +; + +Attribute is_sphere; + +Class sphere_class + with name "sphere", + description "A small hard sphere made from some undeterminable material.", + !weight 5, + size 3, + before [; + Cast: + "You complete the chant, but the sphere lies unaffected! \ + Perhaps it is protected from magic somehow?"; + ], + has is_sphere scored; + +Attribute is_flag; + +Class flag_class + with name "flag" "cloth", + plural "flags", + description "A short square piece of colored cloth.", + !weight 10, + size 15, + has is_flag; + +Class trophy_dep_class + with name "depression" "niche" "hole" "keyhole", + initial [; +print "There is a circular depression in the center of the floor"; +if (trophy in self) + ". Sitting in the depression is a trophy."; +else "."; + ], + description [; +print "A small circular depression in the center \ + of the stone floor"; +if (trophy in self) + ". At the moment, the depression holds a trophy."; +else ". There seem to be three small concave \ + marks in the otherwise flat stone of the depression."; + ], + size 8, + capacity 1, +has static container open; + +Attribute is_niche; +Property counter_niche; +Property niche_dir; ! assoc with the dir a niche is facing. + +Class niche_class + with name "niche", + capacity 1, + niche_dir 1, ! default north + description "It looks like a chiseled-out niche in the floor.", + initial [; + switch (self.niche_dir) { + 1: print "There's a square niche in the northern edge of the floor here"; + 2: print "There's a square niche in the western edge of the floor here"; + 3: print "There's a square niche in the southern edge of the floor here"; + 4: print "There's a square niche in the eastern edge of the floor here"; + } + if (children(self) ~= 0) { + print ". Resting in the niche is "; + InDefArt(child(self)); + print " that extends into the darkness"; +! weird -- There is no "CInDefArt(), equiv to (A) obj, which +! is probably pretty simple... + } + "."; + ], + before + [ j ; + Receive: + if (noun hasnt is_wood_beam) + "That's not going to stay in the niche."; + else { + ! (odd capacity check, seems like I'm stepping in front...) + if (children(self) ~= 0) + "The niche space is currently full."; + ! place both pieces in niches + j = child(noun); ! child piece (whichever) + move j to self.counter_niche; + move noun to self; + "You carefully place one end of the beam in the niche and \ + extend the other end into the darkness. You feel something \ + solid support the far end!"; + } + LetGo: + ! (reconstruct wood beam) Assumption is that noun must have + ! wood_beam attrib. + move child(self.counter_niche) to child(self); + move child(self) to player; + "Taken."; + ], + has static container open is_niche; + +! ** multiple coins, cribbed from "Balances" +Attribute is_coin; + +Class coin_class + with name "coin", + description "A round metal disc, with ~1zm~ stamped on both sides.", + !weight 1, + size 1, + parse_name + [ i j w; + if (parser_action==##TheSame) + { if ((parser_one.&name)-->0 == (parser_two.&name)-->0) return -1; + return -2; + } + w=(self.&name)-->0; + for (::i++) + { j=NextWord(); + if (j=='coins') parser_action=##PluralFound; + else if (j~='coin' or w) return i; + } + ], + plural "coins", + has is_coin; + +! ** Spell-casting system, again cribbed from Graham's "Balances", +! except stuffy priests call them 'chants'... +! ---------------------------------------------------------------------------- +! Now the whole spell-casting system +! ---------------------------------------------------------------------------- + +Attribute is_spell; +Attribute known_about; +Attribute is_scroll; +Attribute is_spell_book; +Property magic; +Fake_Action SayName; + +[ SpellName obj; print (address) (obj.&name)-->0; ]; + +Class spell_class + with name "spell" "spells" "chant" "chants", article "the", number 0, + short_name + [; SpellName(self); print " chant"; give self known_about; rtrue; + ], + before + [; + ! SayName: SpellName(self); print " chant: ", object self; + SayName: SpellName(self); print " chant: ", self; + give self known_about; rtrue; + Examine: ; "."; + ], + size 0, + has is_spell; + +Object memory "memory" + with capacity 5, ! will change periodically, given God-granted powers... + number 1, + size 0, + before + [ i j k; + Examine: + if (spell_block == 1) + "Currently, your mystic powers don't seem to be working."; + objectloop (i in self) if (i.number==100) j++; + if (j>0) + { print "The "; + objectloop (i in self) + if (i.number==100) + { k++; SpellName(i); + if (k==j-1) print " and "; + if (k0) + { print "the "; + objectloop (i in self) + if (i.number<100) + { k++; + PrintShortName(i); + if (i.number==2) print " (twice)"; + if (i.number==3) print " (thrice)"; + if (i.number==4) print " (four times)"; + if (i.number>=5) print " (many times)"; + if (k==j-1) print " and "; + if (k3) print " yet another time."; + if (self.number <= self.capacity) { new_line; rtrue; } + i=youngest(self); ; + "^A voice booms out ~Do not try to exceed your powers, mortal!~"; + Remove: + if (second notin self || second.number==100) rtrue; + if (self.number>0) self.number=self.number-1; + second.number=second.number-1; + if (second.number==0) remove second; + rtrue; + ]; + +Object gnusto_spell "copy a chant into your prayer book" memory + class spell_class + with name "gnusto", + number 100, + magic + [ i a_book; + if (spell_block==1) + "Currently, your mystic powers don't seem to be working."; + if (amulet hasnt worn) + "You speak the chant, and absolutely nothing happens!"; + if (second has is_spell_book) + "Unlike scrolls, prayer books are magically guarded against \ + the 'theft' of their lore."; + if (second==0 || second hasnt is_scroll) + "Your chant goes unanswered."; + if (second notin player) + "A gnusto chant would require close scrutiny of the scroll \ + it is to copy, which you do not seem to be holding."; + objectloop (i in player) + if (i has is_spell_book) a_book=i; + if (a_book==0) + "Your chant fails, as you have no prayer book."; + i=child(second); + if (i==0 || i hasnt is_spell) + { print "Your chant fails, as "; DefArt(second); + " is illegible."; + } + ; remove second; + print "Your prayer book begins to shake! Slowly, ornately, \ + the words of "; DefArt(i); " are inscribed, \ + into the book with a violet glow. \ + The book's brightness fades, but the chant remains! \ + However, the scroll on which it was written vanishes as \ + the last word is copied."; + ]; + +Class spell_book_class + with magic 0, + capacity 20, + size 15, + before + [ p i; Open, Close: + CDefArt(self); " will always open to the desired page thanks \ + to the powers of the Gods, may they never forget us."; + Attack: + print "When you are done, "; DefArt(self); " remains unmarred."; + Learn: + if (self.magic==0) "(This prayer book has no pages.)"; + p = self.magic; + for (i=0:ii)~=0:i++) ; + if (i==self.capacity) rtrue; + p-->i = second; + rtrue; + ], + after + [ p i j; Examine: + if (self.magic==0) "(This prayer book has no pages.)"; + p = self.magic; + for (i=0:ii)~=0:i++) + { j=p-->i; ; + } + rtrue; + ], + has is_spell_book; + +Class scroll_class + with parse_name + [ i j k; j=-1; + if (self has general) + { if (child(self)~=0 && child(self) has is_spell) + j=(child(self).&name)-->0; else j='illegible'; + } + for (::) { + k = NextWord(); + if (k=='scrolls') parser_action = ##PluralFound; + if ((k=='scrolls' or 'scroll' or j) || (k==(self.&name)-->0)) + i++; + else return i; + } + ! while (NextWord()==j or 'scroll' or (self.&name)-->0) i++; + ! return i; + ], + before + [ i; Examine: + i=child(self); + give self general; + if (i==0 || i hasnt is_spell) + "The scroll has faded, and you cannot read it."; + print "The scroll reads ~"; ; "~."; + ], + invent + [; if (inventory_stage==2 && self has general) + { if (child(self)==0 || child(self) hasnt is_spell) + print " (which is illegible)"; + else + { print " (of "; DefArt(child(self)); print ")"; } + } + ], + size 10, + has scored is_scroll; + +! NOTE: This routine has a slight bug (as cribbed from GN's +! Balances, rel2) in that Examine, if the routine reaches +! scope_stage 3, prints a rather confusing msg. However, +! the appropriate msg is printed for, say, Learn, if the +! spell is unknown/out-of-scope. Oddly, action can't +! be checked at stage 3, so I copied a second version of +! the routine for Examine only. -DY +! 3/19 update: Checking Graham's release 3 of Balances, +! I stumble across the "action_to_be" var. Most useful. +[ ReadableSpell i j k; + if (scope_stage==1) return 1; + if (scope_stage==2) + { objectloop (i in player) + if (i has is_spell_book) + { for (k=0:kk~=0:k++) + { j=(i.magic)-->k; PlaceInScope(j); + } + } + rtrue; + } + if (action_to_be == ##Examine) + "You can't see any such thing."; + !"You have never seen or heard of such a chant."; + "You can't see such a chant, if that is indeed a chant."; +]; + +[ SpellsSub; ; ]; ! for our case, 'chants' will work also + +[ LearnSub; if (location==thedark) + print "(The magic purple glow of the chants casts enough light \ + that you can read them.)^"; + ; +]; + +global the_spell_was = gnusto_spell; + +[ CastOneSub; ; ]; + +! Property long unmagic; + + +! (wood beams and niches -- for Barsap's Gambit) +! (put after 'the_spell_was' global defined) + +Attribute is_wood_beam; + +Class wood_beam_class + with name "wood" "beam", + plural "beams", + description "A long thin wooden beam.", + !weight 10, + size 50, + number 0, ! number is the 'strength left' qualifier + before [; + Cast: + if (the_spell_was == egdelp_spell) + "The wood beam is covered in a waxy film! Thinking \ +better of this, you hastily wipe off the offending build-up."; + if ((the_spell_was == luncho_spell or huncho_spell) && + (parent(self) has is_niche)) { + ! reconstruct beam before teleporting + ! due to problem below, I'm denying this... +"Your chant goes unanswered."; + ! move child(parent(self).counter_niche) to self; + ! <>; + ! NOTE NOTE This may recursively explode... + } + ], + has is_wood_beam; + +Class balsa_beam_class + class wood_beam_class, + with name "balsa", + plural "balsa wood beams", + description "A long thin balsa wood beam.", + number 0; ! always breaks + +Class pine_beam_class + class wood_beam_class, + with name "pine", + plural "pine wood beams", + description "A long thin pine wood beam.", + number 1; + +Class ebony_beam_class + class wood_beam_class, + with name "ebony", + article "an", + plural "ebony wood beams", + description "A long thin ebony wood beam.", + number 2; + +[ CastSub k; + the_spell_was = noun; ; + +! if (noun has general) +! { give noun ~general; +! if (RunRoutines(noun,unmagic)~=0) rfalse; +! "Nothing happens."; +! } + + if (amulet hasnt worn) + "You speak the chant, and absolutely nothing happens!"; + if (spell_block==1) + "Currently, your mystic powers don't seem to be working."; + if (in_hades == 1) + "Your Gods can't save you now..."; + if (second~=0) + { ResetVagueWords(second); ! Set "it", "him", "her" + if (RunRoutines(second,before)~=0) rfalse; ! Run before routine(s) + } + k = random(10); + if (k<=3) { + if (k==1) + "You speak the chant, but the Gods are not kind this time, as nothing happens!"; + if (k==2 or 3) + "You speak the chant, but something sounds wrong. Nothing happens \ +this time."; + } + if (RunRoutines(noun,magic)~=0) rfalse; + "Nothing happens."; +]; + +[ InScope i; + if (verb_word=='c,cast' or 'cast') + objectloop (i in memory) PlaceInScope(i); + rfalse; +]; + +[ ParserError x i flag vb; + if (etype==VERB_PE or ASKSCOPE_PE) + { if (etype==ASKSCOPE_PE) + { if (verb_word=='cast') vb=1; + if (verb_word=='learn' or 'memorise' or 'memorize') vb=2; + if (verb_word=='copy') vb=3; + if (vb==0) { etype=CANTSEE_PE; rfalse; } + } + wn=verb_wordnum; if (vb~=0) wn++; + x=NextWordStopped(); + for (i=player+1:i<=top_object:i++) + if (i has is_spell && Refers(i,x)==1 + && i has known_about) flag=1; + if (flag==1) + { if (vb==0 or 1) + "You haven't got that chant prepared. [Type ~spells~ \ + or ~chants~ to see what you do have prepared.]"; + if (vb==2) + "Your training is such that you can only prepare such a chant \ + with the aid of a prayer book containing it."; + if (vb==3) + "You have no text of that chant to copy."; + } + if (vb==1) + "You haven't prepared that chant, if indeed it is a chant."; + if (vb==2 or 3) + "You haven't access to that chant, if indeed it is a chant."; + } + rfalse; +]; + +! Random attempt to code a ChooseObjects for the +! coin choosing problem often seen in the Bank of Zork +[ ChooseObjects obj code; + if (code < 2) rfalse; + if ((action_to_be == ##Remove or ##Insert) && + (obj has is_coin) && (obj in player)) return 9; + return 0; +]; + +[ UnknownVerb word i; + objectloop (i in memory) + if (word==(i.&name)-->0) { the_spell_was = i; return 'c,cast'; } + rfalse; +]; + +[ PrintVerb v; + if (v=='c,cast') { print "cast a chant at"; rtrue; } + rfalse; +]; + +! ---------------------------------------------------------------------------- +! The player's spell book, and initial spells (to go with gnusto): +! ---------------------------------------------------------------------------- + +Object prayer_book "prayer book" + class spell_book_class, + with name "prayer" "book" "my" "spellbook", + description "Mystical Chants^"; + +Object frotz_spell "cause an object to give off light" + class spell_class, + with name "frotz", + magic + [; if (second==0) "There is a brief, blinding flash of light."; + if (second has animate) + "The chant, not designed for living creatures, is denied."; + if (parent(second)==compass) + "The chant fails."; + give second light; + print "There is an almost blinding flash of light as "; DefArt(second); + print " begins to glow! It slowly fades to a less painful level, but "; + DefArt(second); " is now quite usable as a light source."; + ], +; + +! ** Start of locations (and other objs) ** + +! *********************************************************************** +! ** +! ** LOCATIONS INSIDE MONESTARY (Mostly) +! ** +! *********************************************************************** + +Object MON_Chapel1 "Monastery Chapel" + with description "You are standing in a monastery chapel. \ +All around you, fellow Brothers of the Order are standing, chanting. \ +The eerie droning voices seem to reverberate into the air. At the \ +front of the chapel, Brother Joseph stands in deep concentration, \ +holding the Rod of the Ancients.", + name "brothers", + number 0, + each_turn [ ; + MON_Chapel1.number = MON_Chapel1.number + 1; + Startup1(MON_Chapel1.number); + ], + before [ ; + if (action==##Listen) "You hear heavy chanting"; + if (action==##look) rfalse; + if (action==##Wait) rfalse; + "You are caught up in the collective chanting, and cannot break \ + your concentration to do much of anything else."; + ], + has light; + +! A fake obj to handle 'look at Joseph' +Object MON_FAKE "the Order" MON_Chapel1 + with name "Joseph" "rod" "brothers", + description [; <>;], +has scenery; + +! A somewhat bulky routine to set our stage. +[ Startup1 currturn; + if (currturn <= 1) { + print "^Brother Joseph now speaks directly to the entire Order.^^\ + ~Fellow Brothers, the year, as you know, is 976 GUE. \ + A difficult time indeed. Ten years have passed since the Cataclysm \ + brought forth by the Circle of Enchanters changed our world forever. \ + The outside world as we know it is in turmoil. A period of great \ + change is upon all of us.~^"; + rtrue; + } + if (currturn == 2) { + print "^Brother Joseph continues speaking.^^\ + ~Our order has always maintained the strictest secrecy. Few \ + outside of our order know of our existence. \ + We are the keepers of the mystic balance \ + that which embodies pure magic that can keep our world \ + safe. It has always been thus -- we watch over all \ + of Quendor, never interfering in the affairs of others, yet \ + striving to maintain harmony.~^"; + rtrue; + } + if (currturn == 3) { + print "^Brother Joseph continues speaking.^^\ + ~But we can no longer depend on enchantments to keep \ + outsiders at bay. Magic as we know it is dying. The dreaded \ + Age of Science is already upon us, and in short time, our \ + order will be discovered, and the balance will be no more. Many of \ + our order have gone out into the world in secret, in attempts \ + to repair what has been broken, but alas, this appears to be \ + impossible.~^"; + rtrue; + } + if (currturn == 4) { + print "^Brother Joseph continues.^^\ + ~I have brought you all forth today to say that although we \ + cannot protect the future of Quendor, we can protect ourselves!~ \ + He holds the Rod of the Ancients high. ~This holy Rod, which \ + the Ancient Ones used to defeat the demon Anabais, \ + has the power to protect our order. I have discovered a lost mystic \ + cube!~ He holds a white, featureless cube high in his other hand. \ + ~This cube, when joined with the Rod of the Ancients, will \ + preserve our order forever, sequestering all of us in another time, \ + another place!~^"; + rtrue; + } + if (currturn >= 5) { + print "^There is a momentous pause. ^^\ + Brother Joseph looks at the entire Order. \ + ~May the Gods smile down upon us on this day! We go now, \ + into the unknown!~ He triumphantly joins the white cube to \ + the end of the Rod of the Ancients.^^\ + There is a sudden, blinding white flash! The chanting is instantly \ + broken by a tremendous thunderclap! Brother Joseph is suddenly \ + thrown back by a great force, and to your horror, the Rod of the \ + Ancients breaks apart! Four pieces now float serenely above the \ + altar, above a strange black globe that seems to crackle with energy.^^\ + ~AT LAST!~^^\ + The voice comes from nowhere and everywhere. The black sphere \ + pulsates with lightning.^^\ + ~ANABAIS IS FREE AGAIN!~ The voice pauses. \ + ~I see you found my fake mystic cube \ + Joseph. I knew that someday, someone would find it, and free \ + me from my prison!~ The voice pauses again. ~To show my gratitude, I'm \ + scattering this broken symbol to the corners of the world!~ \ + The pieces of the rod suddenly disappear!^^\ + ~Watch out!~ someone cries. \ + The black sphere suddenly expands with alarming speed. \ + Seconds later, a violent explosion seems to jar the very \ + ground you stand on, and a black void covers all.^^\ + You awaken in your room in a cold sweat. Was it all a terrible \ + dream? The day beckons...^"; + PlayerTo(MON_your_quarters); + ! remove MON_Chapel1; clean up memory (NOTE: This is futile) + rfalse; + } +]; + + +Object MON_your_quarters "Your Quarters" + with name "furnishing" "furnishings", + description "You are in your room in the Monastery. It is \ +sparsely furnished, but certainly feels like home. The exit \ +is north.", + n_to MON_f1hall1, + has light; + +Object note "note" MON_your_quarters +with name "note", + description "The note, in a hastily written scrawl, reads:^\ + ~Please stop by the chapel as soon as you can.^\ + -- Joseph~", + !weight 1, + size 5, +; + +!Object staff "staff" MON_your_quarters +! with name "staff" "walking" "trusty" "stick", +! initial "Your trusty walking staff is right where you left it.", +! description "A stout piece of pine you found while on a nature \ +! walk, this staff has served you well on many journeys.", + !weight 20, +! size 20, +!; + +Object sleeppallet "sleeping pallet" MON_your_quarters + with name "pallet" "sleeping" "roll", + description "This is your sleeping pallet, a short portable sleeping roll \ + made of straw. It's softer than it looks.", + size 25, + react_before [; + Go: if (player in self) "You'll have to get off the sleeping \ +pallet first."; + ], + has supporter enterable; + +Object MON_f1hall1 "Hallway (near your quarters)" + with description "You are in a hallway running west and east. The \ +vaulted ceilings are a nice touch. Your \ +quarters are to the south.", + name "vaulted" "ceiling", + s_to MON_your_quarters, + w_to MON_f1hall2, + e_to MON_f1hall3, + has light; + +Object MON_f1hall3 "Hallway (near quarters of Palemon and TuffBerry)" + with description "You are in a hallway running west and east. \ +Brother TuffBerry's quarters lie to the south. Brother Palemon's \ +quarters are to the north.", + w_to MON_f1hall1, + e_to MON_f1hall4, + n_to MON_Palemon_quarters, + s_to MON_Tuffberry_quarters, + has light; + +Object MON_f1hall4 "Hallway (east end)" + with description "You are at the east end of an east-west hallway. \ +Brother Joseph's quarters lie to the north, and Brother Toolbox's \ +quarters lie to the south.", +! The acolyte chambers lie to the east.", + w_to MON_f1hall3, + ! n_to MON_Joseph_quarters, + n_to "It doesn't look like Joseph is in. Perhaps you can find \ +him elsewhere.", + s_to MON_Toolbox_quarters, +! e_to MON_acolyte_chambers, + has light; + +! Object MON_acolyte_chambers "Acolyte Chambers" +! with description "You are in a long chamber that serves as the home \ +! for the many devoted acolytes of the Order. The room is currently \ +! empty.", +! w_to MON_f1hall4, +! has light; + +Object MON_f1hall2 "Hallway (west end)" + with description "You are at the west end of an east-west hallway. \ +There are stairs up and down here, and an exit to the west.", + name "stairs", + e_to MON_f1hall1, + u_to MON_f2hall1, + d_to MON_f0hall1, + w_to MON_garden, + has light; + +Object MON_garden "Monastery Gardens" + with description "You are in the Monastery gardens, where various \ +shrubs and conifers are covered in a light blanket of snow. \ +An open cloister lies to the west, while \ +a doorway heads east.", + name "cloister" "doorway" "shrubs" "conifers", + w_to MON_cloister, + e_to MON_f1hall2, + has light; + +!Nearby shrubs "snow-covered shrubs" +! with name "shrubs" "shrub" "snow-covered" "conifers" "conifer" "plants", +! description "Good thing they're evergreen.", +! has scenery; + +Object sand "sand" MON_garden + with name "sand", + initial "A small area in the snow has been cleared for late winter \ +planting, and some sand has been sprinkled here and there.", + description "A handful of sand, nothing more, nothing less.", + !weight 5, + size 5, + article "some", +; + +Object MON_cloister "Cloister Walkway" + with description "You are in an open cloister, that runs along the \ +Monastery gardens to the east. To the north is the main wing of the \ +Monastery. To the south is the entrance hall.", + name "cloister", + e_to MON_garden, + n_to MON_Main_hall, + s_to MON_Entrance_hall, + has light; + +Object MON_Entrance_hall "Entrance Hall" + with description "This is the large entrance hall to the Monastery. \ +Many a devoted visitor has passed through this place. \ +There is an exit to the outside world to the \ +south, and the rest of the Monastery lies to the north.", + s_to Cliff_face, out_to Cliff_face, + n_to MON_cloister, + before [; + Go: + if ((noun==s_obj) || (noun==out_obj)) + print "You are surprised by a cold blast of wind as you leave the Monastery!^"; + ], + after [; + Go: + if ((noun==in_obj) || (noun==n_obj)) + print "You are greeted by relatively warm and cozy air.^"; + ], + has light; + +Object MON_Main_hall "Main Hall" + with description "This is the main hall of worship in the Monastery. \ +A large domed ceiling hides some sort of lighting that create a warm yet \ +serene atmosphere. A covered walk to the rest of the Monastery lies to \ +the south. To the north is the Monastery chapel. A brazier sits in \ +the center of the room.", + name "dome" "ceiling" "lighting" "atmosphere", + s_to MON_cloister, + n_to MON_Chapel2, + has light; + +Nearby brazier "brazier" + with name "brazier", + description "This is a silver incense brazier, somewhat similar to \ +an ornamental bowl on a tripod. Brother Palemon supposedly \ +found it on one of his many journeys.", + before [; + Take: + "That's been in the Monastery for years. People would \ + be upset if you took it."; + Receive: + ! if (noun~=incense) + if (noun has is_sphere) { + print "As you place the sphere in the brazier, \ +you feel a strange sensation. Suddenly, the brazier is filled \ +with "; + if (noun == brown_sphere) + print "earthworms!"; + if (noun == green_sphere) + print "seawater!"; + if (noun == red_sphere) + print "burning embers!"; + if (noun == silver_sphere) + print "white vapors!"; + " No, wait, it's empty again. You hastily \ +withdraw the sphere, and try to clear your mind."; + } + else "That doesn't seem quite appropriate."; + ], + size 9, + has scenery container open; + +Object MON_Chapel2 "Monastery Chapel" + with description "You are in the Monastery Chapel, the site of the \ +recent appearance of the legendary Anabais. Signs of the \ +recent visit include the slightly scorched walls, and the \ +reek of brimstone. Wood pews are arranged in a circle \ +around the central altar. The exit is south.", + name "pews" "scorched", + s_to MON_Main_hall, + before [; + Smell: + "You detect the faint odor of brimstone."; +! Yell: +! if ((parent(Joseph)==MON_Chapel2) && (Joseph hasnt general)) +! "Shhh. You don't want to abruptly disturb Joseph like that."; +! Go: +! if (noun==s_obj) { +! if ((parent(Joseph)==MON_Chapel2) && (Joseph has general) && +! (WeightOf(Joseph) > 140)) { +! if (WeightOf(Joseph) == 149) { +! Joseph.weight = 139; +! print "^As you leave, Brother Joseph calls out \ +! ~Oh, and take something for that cold!~^"; +! rfalse; +! } +! if (WeightOf(Joseph) == 148) { +! Joseph.weight = 139; +! print "^As you leave, Brother Joseph calls out \ +! ~Oh, and remember -- reading the scriptures \ +! is one sure way of maintaining an active mind!~^"; +! rfalse; +! } +! if (WeightOf(Joseph) == 147) { +! Joseph.weight = 139; +! print "^As you leave, Brother Joseph calls out \ +! ~Oh, and remember -- mirth is wonderful for the soul, \ +! in moderation, of course.~^"; +! rfalse; +! } + ! add in any others here... +! } +! } +! Sneeze: +! if (Joseph hasnt general) { +! give Joseph general; +! Joseph.weight = 149; +! JosephWakeAction(); +! rtrue; +! } +! Yawn: +! if (Joseph hasnt general) { +! give Joseph general; +! Joseph.weight = 148; +! JosephWakeAction(); +! rtrue; +! } +! Laugh: +! if (Joseph hasnt general) { +! give Joseph general; +! Joseph.weight = 147; +! JosephWakeAction(); +! rtrue; +! } +! Drop: +! if (Joseph hasnt general) { +! give Joseph general; +! Joseph.weight = 146; +! JosephWakeAction(); +! move (inp1) to MON_Chapel2; +! rtrue; +! } + ], + has light; + +! And now, the incredible shrinking Brother Joseph... +! Modified 3/16 -- this puzzle seems to be unpopular... +Object Joseph "Joseph" MON_Chapel2 + with name "Brother" "Joseph", + description "Brother Joseph is a pale man, with gray eyes, a fine \ + beard, and a finer disposition.", +! weight 150, + number 0, ! used to hold count of (fake) rod pieces received + describe [; +! if (self hasnt general) +! "Brother Joseph is kneeling in front of the remains of the altar, \ +! his eyes closed, deep in meditation."; +! else + "Brother Joseph is here, standing by the altar."; + ], + life [; +! if ((WeightOf(Joseph) == 150) && ((action ~= ##Attack) || +! (action ~= ##WakeOther))) +! "Perhaps it's best not to bother him, he seems very \ +! deep in meditation."; +! WakeOther: +! if (WeightOf(Joseph) == 150) +! "Joseph isn't asleep, just meditating. You may need to \ +!do something subtle to rouse him."; + Attack, ThrowAt: + deadflag = 1; + Player_Lives_Left = 0; +"Your blow sends Brother Joseph staggering back.^^\ +Brother Joseph gets up and brushes himself off, and glares \ +at you. Ro-roo, I think you made him mad. \ +You remember, of course, that Brother Joseph is a renowned \ +full-contact martial artist?^^\ +~Impudent wretch! I'll show you how we deal with non-believers here!~\ +^^Suddenly, Brother Joseph produces a gigantic mallet from \ +beneath his robes and clobbers you into a pulp."; + Ask: + if (second=='amulet') + "~Don't leave the Monastery without it!~"; + if (second=='joseph') + "Joseph smiles. ~I believe we've been introduced.~"; + if (second=='rod') + "~We must recover the Rod before it is too late!~"; + if (second=='anabais') + "~Beware the demon! He is most cunning and dangerous!~"; + if (second=='scriptures') + "~Study the holy scriptures, and you will be rewarded.~"; + if (second=='palemon' or 'tuffberry' or 'toolbox') + "~I fear I know not where his feet now tread.~"; + "~I don't know anything about that. Perhaps you should \ + consult our library upstairs?~"; + + Tell: + "~Do tell.~"; + + Show: + if (noun has is_rod) + "~Have you succeeded in retrieving the Rod? If so, \ +do what you feel is right.~"; + + Give: + if (noun has is_rod) { + if ((noun==black_rod_piece) || (noun==white_rod_piece) || + (noun==smoke_rod_piece) || (noun==gray_rod_piece)) { + Joseph.number = Joseph.number + 1; + remove noun; + print "Joseph takes the rod piece. "; + if (Joseph.number==4) { + ! trouble -- got the whole fake rod to Joseph... + deadflag = 1; + Player_Lives_Left = 0; + "~The Order will \ +remember your acts of bravery forever,~ Joseph says, as he brings out \ +all four rod pieces and tries to join them together. A sudden burst \ +of light blinds you!^^\ +When you can see again, a large black sphere of malevolent energy \ +floats nearby! Joseph, either dead or stunned, lies in one corner \ +of the room. The four rod pieces are floating above the sphere.^^\ +~Foolish little priest,~ a evil voice says in you mind. ~You \ +have only brought upon yourself your own undoing. With my rod returned \ +by an innocent, the pact is complete. Come forth, my brothers, \ +for our time of power is at hand!~^^\ +The last thing you hear is mocking laughter, before the world \ +as you know it comes to a close."; + } + else + "~Well done, brave Priest!~ he says."; + } + else +"Joseph looks at the rod piece and seems puzzled. ~This isn't any part \ +of the Rod of the Ancients that I've ever seen. And yet, it seems similar.~ \ +He hands it back to you. ~In this, my teachings can help you no \ +further.~"; + } + else "Joseph waves off your offering. ~You may \ +need that in your quest.~"; + Answer, Order: + if (special_word=='hello' or 'hi') + "Joseph smiles. ~Hello.~"; + default: + "At the moment, Joseph seems to be \ +preoccupied with spiritual matters."; + ], + before [; + Cast: + "Brother Joseph stops you in mid-chant. ~That won't be necessary~"; + ], + each_turn [; + if (self hasnt general) { + give self general; + move Amulet to player; + "^Joseph smiles as you enter. \ +~I'm glad you found me. As you know, thanks to the old \ +fool standing before you, the demon Anabais is loose upon \ +the world once more. He has broken the Rod of the Ancients \ +which was keeping our house and Order protected from outsiders. \ +It is a sorry day for us all.~ Joseph pauses for a moment. \ +~You are our final hope in a time of chaos. Brothers \ +Palemon, TuffBerry and Toolbox have left the Order, and only \ +you remain. I must now ask you to serve the Order which you \ +have so faithfully served in the past. No short order this, for \ +our continued existence depends on it, but you must go out into \ +a world gone mad alone, and retrieve the four broken pieces of \ +the Rod of the Ancients, and return them here to me, so that we \ +can rid the world of the evil we have loosed!~^^Brother Joseph \ +pauses and searches his robes.^^~Here, you will need this,~ he \ +says, giving you a strange amulet. ~Without this amulet, the \ +Ancient Ones cannot give you the mystic aid that you will most \ +certainly need. But I waste much time. Go now, and may the \ +Gods smile upon us all.~"; + } + ], + has animate proper; + +Object Amulet "holy amulet" + with name "amulet" "holy", + description "This small golden amulet and chain seem to \ +shimmer with a strange mystic saffron energy. The \ +pendant portion of the amulet is in the shape of a small \ +golden cube.", + ! weight 10, + size 7, + before [; + Wear: + if (self hasnt worn) { give self worn; + "As you place the amulet around your neck, \ + you feel a strange sense of mystic power."; + } + else "You're already wearing that."; + ], + has clothing scored; + +! [ JosephWakeAction; +! print "^You make a subtle noise^^\ +! Brother Joseph opens his eyes, breathes deeply, and smiles.^^\ +! ~I'm glad you found me. As you know, thanks to the old \ +! fool standing before you, the demon Anabais is loose upon \ +! the world once more. He has broken the Rod of the Ancients \ +! which was keeping our house and Order protected from outsiders. \ +! It is a sorry day for us all.~ Joseph pauses for a moment. \ +! ~You are our final hope in a time of chaos. Brothers \ +! Palemon, TuffBerry and Toolbox have left the Order, and only \ +! you remain. I must now ask you to serve the Order which you \ +! have so faithfully served in the past. No short order this, for \ +! our continued existence depends on it, but you must go out into \ +! a world gone mad alone, and retrieve the four broken pieces of \ +! the Rod of the Ancients, and return them here to me, so that we \ +! can rid the world of the evil we have loosed!~^^Brother Joseph \ +! pauses and searches his robes.^^~Here, you will need this,~ he \ +! says, giving you a strange amulet. ~Without this amulet, the \ +! Ancient Ones cannot give you the mystic aid that you will most \ +! certainly need. But I waste much time. Go now, and may the \ +! Gods smile upon us all.~"; +! move Amulet to player; +! rtrue; +!]; + +Object altar "altar" + with name "altar" "damaged" "cube", + description "The altar is roughly the shape of a five foot \ + white cube. The top edges appear to be singed black and there \ + are cracks and chips all over.", + found_in MON_Chapel1 MON_Chapel2, + before [; + Search: + if (self hasnt general) { + give self general; + move holywater to player; + "You uncover a vial of holy water."; + } + ], + has scenery supporter; + +Object holywater "vial of holy water" + with name "holy" "water" "vial", + description "A small glass vial of holy water.", + before [; + Eat: "You might want to try drinking it instead."; + Drink: remove self; + Player_HP_CUR = Player_HP_MAX; + "You quaff the holy water with a simple ceremony. \ +You feel physically and spiritually refreshed."; + ], + size 5, +; + +Object MON_Palemon_quarters "Brother Palemon's Quarters" + with description [; + print "You are in Brother Palemon's quarters, which \ + have been left unattended ever since Brother Palemon's \ + unexplained disappearance many years ago"; + if (self has general) + print ". To the west, a small secret door in the wall leads \ + into darkness"; + ". The exit is south."; + ], + s_to MON_f1hall3, + w_to [; + if (self hasnt general) + "You can't go that way."; + else return MON_Hidden_sanctum; + ], + before [; + Push: + if (noun == w_obj) { + if (self hasnt general) { + give self general; + "Pushing the west wall reveals a hidden secret door! \ +You've been in these quarters before, but certainly never noticed \ +anything like this!"; + } + else "Nothing happens."; + } + Touch, Rub: + if ((noun == w_obj) && (self hasnt general)) + "Oddly, a section of the west wall feels slightly thin."; + ], + has light; + +Object journal "thin journal" MON_Palemon_quarters + with name "journal" "thin", + description "This journal is very strange indeed. Brother \ + Palemon seems to have been very preoccupied up to the point \ + of his disappearance with strange accursed places that he \ + claims are located all over Quendor. He also makes several \ + references to evil 'spirits' found in these places. You also \ + notice that several pages of parchment near the back of \ + the journal have been torn out.", + !weight 20, + size 15, +; + +Object MON_Hidden_sanctum "Hidden Sanctum" + with description "You are standing in a small chamber that obviously hasn't \ +been used in quite some time -- the cobwebs and dust are several \ +layers thick. There is a short crawl east.", + name "cobwebs" "dust", + e_to MON_Palemon_quarters, +; + + +Object dusty_scroll "dusty scroll" MON_Hidden_sanctum + class scroll_class, + with name "dusty", +; + +Object foblub_spell "deliver magnificent sermon (glue audience to seats)" dusty_scroll + class spell_class, + with name "foblub", + magic [; + if (second hasnt animate) + "Your sermon goes unheard."; + if (second == player) + "Well, I know you like listening to yourself, but \ +isn't this a bit much?"; + "You give a wonderful sermon about how one's future \ + affects one's past, but no one seems to be listening."; + ], +; + + +Object MON_TuffBerry_quarters "Brother TuffBerry's Quarters" + with description "You are in Brother TuffBerry's quarters, vacant \ +since he undertook his quest for Joseph not long ago. The \ +exit is north.", + n_to MON_f1hall3, + has light; + +Object page "torn page" MON_TuffBerry_quarters + with name "torn" "page", + !weight 5, + size 5, + description "This page was apparently \ +torn from a larger document of some sort. All that is left \ +now reads:^^\ + ~...fear. Just today I heard again something below \ + me when I was meditating upstairs. \ + It sounded like a person, or something alive at least \ + was just below, trying to quietly move around unnoticed. \ + Clearly this is \ + impossible, and yet I cannot doubt what I heard. \ + Palemon tells me I'm hearing spirits, but little does \ + he know that I once heard the same noises in his \ + very chambers! He was not around at the time, but \ + to the west, behind the wall, I...~", +; + + +!Object MON_Joseph_quarters "Brother Joseph's Quarters" +! with description "You are in Brother Joseph's quarters. The hallway lies \ +! to the south.", +! s_to MON_f1hall4, +! has light; + +Object MON_Toolbox_quarters "Brother Toolbox's Quarters" + with description "You are in Brother Toolbox's quarters, vacant \ +ever since he left the order due to differences many years \ +ago. The exit is north.", + n_to MON_f1hall4, + has light; + +Object tb_diary "diary" MON_Toolbox_quarters + with name "diary" "toolbox", + description "\ + ~-- <944 GUE> Today Brother Joseph tried to explain the \ + essence of how we channel magic energy through our \ + amulets. To me, this seems to pale in comparison with \ + the seemingly innate abilities of those who call \ + themselves Enchanters. Joseph did show me a nice \ + trick, however. He brought the Rod of the Ancients near \ + my amulet, and the amulet gave off a sudden purple flash of light! \ + I'll have to try that one on the Acolytes tomorrow.~^^\ + (there isn't much else of interest until the \ + very last entry, which is not dated)^^\ + ~-- So long diary. I'm now off to seek greater spiritual \ + guidance in Thriff. I hear the summers there are very nice \ + too.~", + !weight 12, + size 12, +; + +Object folded_scroll "folded scroll" MON_Toolbox_quarters + class scroll_class, + with name "folded", +; + +Object espnis_spell "deliver dull sermon (cause sleep)" folded_scroll + class spell_class, + with name "espnis", + magic [; + if (second hasnt animate) + "Your sermon goes unheard."; + if (second == player) + "A preacher boring himself to sleep with his \ +own sermon? This doesn't seem prudent."; + CDefArt(second); + " listens as you begin your sermon about the general \ + religious practices of the royal families of the past, but \ + only stifles a yawn when you finish."; + ], +; + + +Object MON_f2hall1 "Hallway (second floor, west)" + with description "You are in a hallway on the second floor \ + of the Monastery. The hallway continues east, while \ + stairs lead downwards.", + name "stairs", + d_to MON_f1hall2, + e_to MON_f2hall2, + has light; + +Object MON_f2hall2 "Hallway (second floor, east)" + with description "You are in a hallway on the second floor \ + of the Monastery that runs east-to-west. To the \ + north is the private meditation room. To the east \ + is the Monastery library. To the northeast is an \ + entrance to the steeple room.", + w_to MON_f2hall1, + n_to MON_priv_med_room, + e_to MON_Library, + ne_to MON_Steeple_room, + has light; + +Object MON_priv_med_room "Private Meditation Room" + with description "You are in a small bare chamber that is \ + used for private meditation and worship. The only \ + exit lies to the south.", + s_to MON_f2hall2, + has light; + +Object MON_Library "Monastery Library" + with description "You are in the Monastery library, a cozy, \ + almost cramped room with shelves of various books. \ + The exit is to the west.", + w_to MON_f2hall2, + has light; + +Object lib_shelves "shelves" MON_Library + with name "shelves" "bookshelves", + description "Just some bookshelves.", + has scenery supporter; + +! *** LIBRARY BOOKS + +! Scriptures: +! -- Of course, this is a ruse created from the deviations of +! Anabais. Grounded in some fact though. Each section has a +! lie, which may not initially be obvious. Truthful sections +! are scattered over Quendor. +Object HolyScriptures1 "a copy of the Holy Scriptures" lib_shelves + with name "holy" "scriptures" "copy", + description "This sacred tome details the teachings and \ +beliefs of the Order, of which it's certainly always good \ +practice to re-familiarize yourself with. The scriptures are \ +divided into several sections. Sections that \ +can be consulted in greater detail include:^^\ +~Doctrines~^\ +~Demons~^\ +~Spirits~^\ +~(Book of the) Mystical~^\ +~(Book of the) Planes~^\ +~(Book of the) Ancients~^\ +~Legend of the Rod~", + before [ w1; Consult: + if (consult_words > 1) + "You'll have to consult the sacred book by \ +individual section."; + wn = consult_from; w1 = NextWord(); + switch (w1) { + 'doctrines', 'doctrine', 'canon': +"~THE SACRED DOCTRINES OF THE ORDER OF BALANCE:^^\ +Thou shalt strive to achieve balance in a world filled with unbalance.^\ +Thou shalt pray to the Deities in moments of inner reflection.^\ +Thou shalt not harm innocents nor aid them -- this is the way of balance.~"; +! TODO add add + 'demons', 'demon', 'anabais': +"~Fear not, mortal men^\ +though your world be filled with demons^\ +and the wicked.^^\ +Thou alone can prevail^\ +as The Ancient Ones^\ +against Anabais, the trickster^\ +were victorious.~"; +! LIE - The ancient ones lost to Anabais and the other demons + 'spirits', 'spirit': +"~Before the dawn of time, know that our world was \ +filled with evil spirits of the elements, \ +until mankind came upon the land and vanquished them \ +forever.~"; +! LIE - spirits still exist. + 'mystic', 'mystical', 'magic', 'chant': +"~If one is true of doubts, then a believer in the \ +great Harmony can draw upon the powers of the Ancients \ +and perform feats of mystic power anywhere. Remember that in \ +so doing, thou must act only as the channel of mystical \ +power for the Ancient Ones.~"; +! LIE - powers don't work everywhere, and not always. + 'planes', 'plane', 'atrii', 'hades': +"~Let not the ways of the mortal life \ +dissuade the knowledge of higher and lower planes \ +of existence.^^\ +For, beyond mortal reach are places where those who \ +have truly served the Order and those who have truly \ +forsaken the Harmony of Balance will find themselves \ +in death. These are the Ethereal Plane of Atrii and \ +the plane of the damned -- Hades.~"; +! LIE - don't have to die to reach Atrii. + 'ancients', 'ancient': +"~Trust in The Ancient Ones, those Three who showed mankind the \ +way of Balance and Harmony.~"; +! LIE - Four ancient ones existed. + 'rod', 'legend': +"~Anabais foresaw his own demise when he dared to \ +challenge the Ancient Ones. From powers of light and \ +darkness, the Ancient Ones constructed that holy Rod that \ +we know only as the Rod of the Ancients, and did smite \ +the demon Anabais so grievously, that they did imprison \ +him in that very Rod, where he could do no harm. This \ +very Rod was made of pieces of ancient elemental energy, \ +once separated. Only the powers of the Ancients could \ +bring them together.~"; +! LIE - Anabais never imprisoned, etc. + default: "There doesn't seem to be a section \ +about that."; + } + Cast: + if (the_spell_was == ledak_spell) { + remove self; + "The scriptures are surrounded by a \ +yellow glow. To your horror, the tome evaporates into nothing!"; + } + ], + !weight 20, + size 15, +has proper; + +! *** parchments +! (Several scraps of +! Palemon's journal are scattered around Quendor, +! contradicting the ancient scriptures) + +! (faded -- spirits exist) +Object p2 "faded parchment" MON_Hidden_sanctum + class parchment_class, + with name "faded", +description "~...are real! I have seen much evidence in the \ +jungles of Miznia, marshes of Fublio Valley, the ruins \ +of old Egreth and in Aragain itself! I believe that \ +they are associated with certain basic elements in the \ +surrounding area. But they dare not show themselves now, \ +not while magic is strong! Woe unto us, should the powers \ +of magic cease, as there would be nothing to stop their \ +terror...~", +; + +Object MON_Steeple_room "Steeple Room" + with description "You are in a round room with colored-glass \ + windows. Wood beams line the walls and rise to form \ + a short point in the peaked ceiling above. A small \ + walkway returns to the southwest. A long wood table \ + sits in the center of the room.", + name "windows" "glass" "beams" "walkway" "handle" "latch", + sw_to MON_f2hall2, + !out_to MON_Steeple_roof, + out_to steeple_window, + before [; + Go: + if ((noun == out_obj) && (steeple_window has open)) { + if (random(10) < 3) { + print "^You climb out the open window and somehow manage \ + not to fall.^"; + } + else { + deadflag = 1; +print "^You climb out the open window, but slip on the icy sill"; +if (has_resist_gravity == 0) ", and plummet to the ground!"; +else +"! As you float slowly downwards, you can't help but notice the \ +hungry-looking winter dire wolf below, waiting for you to land..."; + } + } + ], + has light; + +Object MON_Steeple_roof "Steeple Roof" + with description "You are on a very narrow ledge outside \ + the Monastery steeple. The snow and wind are doing \ + their best to send you to a ungracious death below. The \ + steeple roof is quite sharply slanted.", + in_to steeple_window, + name "roof" "ledge" "wind", + cant_go "It's hard enough staying on the ledge.", + before [; + Jump: + deadflag = 1; + if (has_resist_gravity==0) + "Well, if you insist. The ground breaks most of the \ + bones in your body, including the important ones."; + else + "You float downwards gracefully, into the waiting \ +jaws of a winter dire wolf."; ! + ], + has light; + +Object steeple_window "steeple window" + with name "window" "rose" "steeple", + found_in MON_Steeple_room MON_Steeple_roof, + description [; + print "A large rose-colored glass window"; + if (location==MON_Steeple_room) + ", with a handle and latch"; + "."; + ], + describe [; + if (location==MON_Steeple_room) { + if (self has open) + "Someone has left a rose-colored window open and some \ +snow drifts in."; + "A large rose-colored window lets some light in."; + } + if (location==MON_Steeple_roof) { + if (self has open) + "A window opens into the steeple proper."; + "A large rose-colored window is partially covered with snow here."; + } + ], + door_dir [; + if (location==MON_Steeple_room) return out_to; + return in_to; + ], + door_to [; + if (location==MON_Steeple_room) return MON_Steeple_roof; + return MON_Steeple_room; + ], + before [; + Enter: + if (location==MON_Steeple_room) <>; + else <>; + Open: + if ((self hasnt open) && (location==MON_Steeple_roof)) + "Unfortunately, the window opens inward, and the latch \ + and handle are on the inside."; + if ((self hasnt open) && (location==MON_Steeple_room)) { + give self open; + "You turn and yank the window handle and pull. \ + A rush of wind and snow greets you as you open \ + the window."; + } + Close: + if ((self has open) && (location==MON_Steeple_roof)) + "It doesn't seem to want to stay shut. You can't \ +quite reach the window latch from out here."; + Attack: + "The window glass remains unmarred. It's probably made of \ + that especially thick lead-glass that the Monastery got \ + because Brother Toolbox kept complaining about drafts."; + Push: + if (self hasnt open) + "It doesn't budge."; + Search: + "The window looks out into a winter wonderland."; + ], + has static door openable; + +Object steeple_table "long table" MON_Steeple_room + with name "table" "long" "steeple", + description "This long wood table has been used for various \ + private meetings and impromptu get-togethers between \ + members of the Order in the past.", + has scenery supporter; + +Object MON_f0hall1 "Hallway (basement)" + with description "You are in a hallway in the Monastery basement. \ + The hallway continues to the east, and stairs lead upwards.", + name "stairs", + u_to MON_f1hall2, + e_to MON_Refectory, + has light; + +Object MON_Refectory "Refectory" + with description "You are in the Refectory, the general dining \ +area for members of the Order. You grimace at the lingering scent of \ +Brother Pufpistery's favorite dish -- Borphbelly stew. \ +Several large oak tables and benches adorn this otherwise \ +bare room. An exit lies to the west, the kitchen is to \ +the north, and another exit lies to the east.", + name "oak" "tables" "benches", + w_to MON_f0hall1, + n_to MON_Kitchen, + e_to MON_Storeroom, + before [; + Smell: "Even the faintest lingering scent of Borphbelly stew \ +is enough to make you feel like fasting."; + ], + has light; + +Object MON_Kitchen "Monastery Kitchen" + with description "You are in Brother Pufpistery's domain -- the \ +dreaded acolyte kitchen. A huge soup \ +cauldron sits unused nearby. The refectory is \ +south.", + s_to MON_Refectory, + before [; + Smell: "The lingering scent of Borphbelly stew \ +is stronger here, unfortunately."; + ], + has light; + +Object cauldrons "cauldron" MON_Kitchen + with name "cauldron" "vat", + description "This large iron soup cauldron has the \ + unmistakable odor of Borphbelly stew. Ugg.", + size 25, + capacity 10, + before [; + Cast: + if (the_spell_was == bekdab_spell) + "The soup cauldron rusts a bit."; + ], + has scenery container open; + +Object preparing_table "preparing table" MON_Kitchen + with name "table" "preparing", + description "A heavy wood table with a well-used look.", + before [; + Cast: + if (the_spell_was == egdelp_spell) + "The table is now covered in a waxy film. \ +All things considered, it actually looks cleaner now."; + ], + has static supporter; + +Object recipe_paper "scrap of paper" preparing_table + with name "scrap" "recipe" "paper", + description "It's a recipe torn from an issue of \ + ~Better Homes and Caverns~:^^\ + GUILDMASTER SNEFFLE'S PRIZE WINNING BIRTHDAY CAKE \ + ^^\ + Ingredients:^^\ + -- 1 small sack of flour^\ + -- 1 large sugar cube^\ + -- 1 packet of baking powder^\ + -- 1 stick butter^\ + -- 1 large corbie egg^\ + -- Dornberries, to taste^^\ + Mix the ingredients together. Fold the resulting \ + mixture the correct number of times (a single gloth \ + spell should do the trick). Bake in a GUE \ + Automatic oven on the ~cake~ setting.^^\ + Guildmaster Sneffle claims that ~the dornberries are \ + the secret to making a cake even the King would be \ + impressed with.~ He also notes that ~improper folding \ + of the dough will produce very poor results.~", + !weight 1, + size 5, +; + +Object MON_Storeroom "Storeroom" + with description "You are in a small cramped storeroom, stocked \ +with various crates and barrels of foodstuffs. \ +The refectory is west.", + name "crate" "crates" "foodstuffs", + w_to MON_Refectory, + d_to secret_trapdoor, + each_turn [; + if ((random(20) == 1) && (secret_trapdoor notin MON_Storeroom)) + print "^A tiny mouse scurries into view, then disappears \ + under a barrel.^"; + ], + before [; + Go: + if (noun==d_obj) + if (secret_trapdoor hasnt general) + "You can't go that way."; + ], + has light; + +Object crate1 "large barrel" MON_Storeroom + with name "barrel", + description "A large wooden barrel labeled ~DRIED PRUNES~.", + before [; + Cast: + if (the_spell_was==egdelp_spell) + "The barrel is covered with a light \ +waxy film."; + Take, Remove: + "The barrel is far too bulky to take."; + Open: + "You'd probably need a hacksaw to do that. Besides, \ + look what it says it contains."; + Push, Pull: + if (secret_trapdoor hasnt general) { + give secret_trapdoor general; + move secret_trapdoor to MON_Storeroom; + "Well whaddya know, a trapdoor..."; + } + ], + has supporter; + +Object flour "sack of flour" crate1 + with name "flour" "sack", + short_name "sack of flour", + description "A small sack of flour, all-purpose.", + !weight 15, + size 14, + has edible; + +Object MON_Caverns "Caverns" + with description "You are in an low underground cavern, made of roughly \ +worked stone. An even lower tunnel travels east.", + name "stone" "worked" "tunnel", + u_to secret_trapdoor2, + e_to cave_intersection, +; + +! A two-way initially hidden trapdoor, which affects rooms. +! To my great chagrin, I couldn't code this in one obj (sigh). +! I admit it, this is my first Inform project. +Object secret_trapdoor "trapdoor" + with name "trapdoor" "trap" "door", + description "A wooden trapdoor in the floor.", + door_to MON_Caverns, + door_dir d_to, + describe [; + if (self has open) + "A trapdoor opens into darkness below."; + "There is a closed trapdoor in the floor here."; + ], + before [; + Enter: <>; + Open: + give MON_Caverns light; + give secret_trapdoor2 open; + rfalse; + Close: + give MON_Caverns ~light; + give secret_trapdoor2 ~open; + rfalse; + ], + has static door openable; + +Object secret_trapdoor2 "trapdoor" MON_Caverns + with name "trapdoor" "trap" "door", + description "A wooden trapdoor in the ceiling.", + door_to MON_Storeroom, + door_dir u_to, + describe [; + if (self has open) + "Light gleams in from an open trapdoor above."; + "You notice a closed trapdoor in the ceiling."; + ], + before [; + Enter: <>; + Open: + give MON_Caverns light; + give secret_trapdoor open; + rfalse; + Close: + give MON_Caverns ~light; + give secret_trapdoor ~open; + rfalse; + ], + has static door openable; + +Object cave_intersection "Cave Intersection" + with description [; + print "You are in a large open cavern. The rough \ + limestone here was probably eroded by underground springs \ + to form the somewhat circular chamber you now stand in. \ + Oddly, there seems to have been a recent cave-in, as \ + piles of rubble line the walls. A tunnel \ + snakes off to the west"; + if (self has general) + ". To the southeast, there is a wide square hole!"; + else "."; + ], + name "limestone" "rubble" "tunnel", + ! cant_go "There's too much rubble", + w_to MON_Caverns, + se_to [; + if (self hasnt general) rfalse; + if (self has general) return Mystical_Cave; + ], + before [; + Go: + if ((noun == se_obj) && (self has general)) { + if ((white_rod_piece in player) && + (black_rod_piece in player) && + (gray_rod_piece in player) && + (smoke_rod_piece in player)) { + remove white_rod_piece; + remove black_rod_piece; + remove gray_rod_piece; + remove smoke_rod_piece; + Player_Lives_Left = 0; ! hope you saved... + spell_block = 1; ! going into the endgame... + print "^As you enter the tunnel, a strange \ +light surrounds you! The four rod pieces you were \ +carrying crumble into dust!^"; + } + else + "Well, the hole to the southeast seems obvious \ +enough. But, some mysterious force blocks the way! \ +Try as you might, you can't seem to enter it!"; + } + ], +; + +Object steel_wall "steel wall" cave_intersection + with name "steel" "wall", + description "A ten-by-ten slab of solid steel, this wall \ + must be at least a foot thick, and is accented by \ + large steel rivets that bolt it to the surrounding \ + rock.", + initial "To the southeast, a huge steel wall demonstrates \ + a marked contrast to the otherwise drab surroundings.", + before [; + Open: "I presume you have a blow-torch handy?"; + Push, Pull, Turn: "Not surprisingly, it doesn't move an inch."; + LookUnder: "It's flush with the rock floor."; + Cast: "The wall seems to absorb and nullify all magic!"; + ], + has static; + + +! *********************************************************************** +! ** +! ** GRAY MOUNTAINS AREA NEARBY MONESTARY +! ** +! *********************************************************************** + +Object Cliff_face "Cliff Face" + with description "You are standing near the top of a snowy mountain peak. \ +The wind is quite cold and is making your teeth chatter. \ +The general vicinity is mostly snow and rock; however, the \ +entrance into the Monastery is to the north, all but hidden from view \ +by the enormous slabs of snow-covered rock that make up the \ +cliff face. There is a rough but obvious trail leading down \ +the mountain to the south. There is also another trail that \ +winds even further up the mountain peak almost hidden in the \ +snow to the east.", + name "peak" "wind" "rock" "structure" "slabs" "trail", + n_to MON_Entrance_hall, in_to MON_Entrance_hall, + s_to rocky_trail, d_to rocky_trail, + e_to Covered_trail, u_to Covered_trail, + has light; + +Object Covered_trail "Covered Trail" + with description "You are climbing up a small trail that gets periodically \ +lost in great bluffs of snow. The swirling snow makes seeing \ +an unusual effort. The trail leads downwards to a cliff face \ +to the west, and rises towards the mountain top to the north.", + name "bluffs" "trail", + w_to Cliff_face, d_to Cliff_face, + n_to Mountain_peak, u_to Mountain_peak, + has light; + +Object Mountain_peak "Mountain Peak" + with description [; + print "You are standing on the top of a peak of the Gray \ +Mountains. A cold wind blows snow everywhere, obscuring what \ +would otherwise surely be a wonderful view of the surrounding \ +countryside. You can just make out some buildings to the far \ +south in Frostham. A snowy bluff marks the way back down"; + if (self hasnt general) +", or to the west, there appears to be a snowy outcropping. It seems to \ +hang precariously over the edge of the mountain, however."; + else "."; + ], + name "wind" "peak" "mountains" "countryside" "buildings" "bluff", + d_to Covered_trail, + w_to [; + if (self has general) + "Looks like the outcropping completely collapsed!"; + return Snowy_outcropping; + ], + before [; + Go: + if ((noun==w_obj) && (self hasnt general) && (player notin sleeppallet)) { +! if (WeightOf(player) > 25) { + if (children(player) > 0) { + print "As you start to tread out to the outcropping, you feel \ + the snow beneath your feet shifting under your sudden \ + weight! You "; + if (random(10) > 6) { + deadflag = 1; + "start to turn back, but the entire \ + outcropping suddenly tilts under your weight, sending \ + you hurtling off the edge into oblivion!"; + } + else { + "beat a hasty retreat back to the peak."; + } + } + print "You carefully make your way onto the outcropping.^"; + } + Jump: + "Not advisable, it's probably a long way down..."; + ], + has light; + +Object Snowy_outcropping "Snowy Outcropping" + with description + "You are standing on a snow-covered outcropping. \ + You are almost waist-deep in snow, and the blisteringly cold \ + winds aren't helping. The outcropping juts out alarmingly \ + over the western edge of the mountain. In fact, you can see the \ + Monastery steeple below this ledge. \ + The main portion of the mountain peak lies to the east.", + name "winds" "steeple" "peak", + e_to Mountain_peak, + each_turn [; + if (random(5)<=3) + "^There is an ominous creaking noise somewhere underfoot."; + "^Some snow falls off the outermost edge of the outcropping."; + ], + before [; + Go: + if (noun==e_obj) + print "You cautiously make your way back to the mountain top^"; + if (noun==d_obj) + "That's not a very sound idea."; + Jump: + "Let's not be suicidal."; + Yell: + Outcrop_break(1); rtrue; + Sneeze: + Outcrop_break(2); rtrue; + Drop: + deadflag = 1; + "You must have disturbed something! The entire outcropping \ + breaks away in an avalanche, and you plummet to your death!"; + Take, Touch, Push, Pull: + if (noun==dirty_scroll) { + if (random(10) > 5) { + deadflag = 1; + give Mountain_peak general; + remove Snowy_Outcropping; + move dirty_scroll to MON_Steeple_roof; ! it's still obtainable... + "As you reach for the scroll, the entire outcropping lurches \ + alarmingly! Without warning, it \ + breaks away in an avalanche, and you plummet to your death!"; + } + "As you reach for the scroll, you hear a disturbing rumbling \ + from somewhere underfoot, and you step back hastily."; + } + Answer: + if (inp2==player) { + Outcrop_break(1); rtrue; + } + "To who/whom, exactly?"; + ], + has light; + +[ Outcrop_break type; + if (type == 1) + print "You give the best bellow you can muster, given the current \ + weather conditions."; + if (type == 2) + print "Understandable, given the weather conditions."; + print " Unfortunately, you seem to have disturbed \ + something, as the entire outcropping gives way in a brief but \ + powerful avalanche! You tumble through the air, followed by \ + a large quantity of snow! But suddenly, you see the \ + Monastery steeple rushing up to meet you!^^THUMP!^^\ + You lie dazed for a moment. Miraculously, the dirty scroll \ + lands next to you!^"; + give Mountain_peak general; + move dirty_scroll to MON_Steeple_roof; + remove Snowy_Outcropping; + PlayerTo(MON_Steeple_roof); + rfalse; +]; + +Object dirty_scroll "dirty scroll" Snowy_outcropping + class scroll_class, + with name "dirty", + initial [; + if (location==Snowy_outcropping) + "There is a dirty scroll here, practically buried in the snow!"; + "There is a dirty scroll here."; + ], +; + +Object swanko_spell "banish spirit" dirty_scroll + class spell_class, + with name "swanko", + magic + [; + if (second==0) +"The chant, looking for a locus of spiritual energy, fails."; + "The general vicinity seems pretty free of spirits now."; + ], +; + +Object rocky_trail "Rocky Mountain Trail" + with description "You are on a rocky mountain trail \ + that winds up and down a mountain. Patches of \ + snow can be found here and there. The trail \ + continues down the mountain to the south, or \ + up to the north.", + name "trail", + d_to snowy_intersection, + s_to snowy_intersection, + u_to cliff_face, + n_to cliff_face, + has light; + +Object snowy_intersection "Snowy Intersection" + with description "You are at a snow-filled crossroads \ + in a mountain trail. Paths lead north towards \ + the top of the mountain, east, west, and south \ + towards the base of the mountain.", + name "trail" "mountain", + n_to rocky_trail, + s_to North_of_river, + e_to "The path east is blocked after a short distance by a huge snow drift.", + w_to Top_of_drop, + has light; + +Object stone_marker "stone marker" + with initial "There is a large stone marker here, in \ + the center of the intersection.", + name "stone" "marker" "obelisk", + description [; + print "This odd stone structure, partially \ + covered in snow, looks quite old and mysterious. \ + It's about seven feet tall, and is shaped like \ + an obelisk"; + if (self hasnt general) + ", with the top partially broken off."; + else "."; + ], + found_in snowy_intersection snowy_intersection2, + has static; + +! (second snowy intersection -- in the "past") +Object snowy_intersection2 "Snowy Intersection" + with description "You are at a snow-filled crossroads \ + in a mountain trail. Paths lead north towards \ + the top of the mountain, east, west, and south \ + towards the base of the mountain.^^Something \ + seems familiar, yet different, about this place.", + name "trail" "mountain", +n_to "The path north ends after a short distance.", +s_to "The path north ends after a short distance.", +w_to "The path north ends after a short distance.", +e_to "The path east is blocked after a short distance by a huge snow drift.", + has light; + + +Object stone_marker_top "broken stone top" + with name "top" "stone" "pinnacle" "broken", + capacity 1, + size 10, + description "The top pinnacle from the stone marker. \ +You notice that it's partially hollow inside.", + before [; + Receive: + if ((noun==silver_rod_piece) && + (snowy_intersection has general)) { + move silver_rod_piece to self; + give snowy_intersection ~general; + remove self; + give snow general; + print "As you place the rod piece in the \ +broken stone piece, you sense a force from above pull you \ +skywards! In moments, you are high above the snow covered \ +mountains, nearing the sky, which you notice is strangely \ +purple!^"; + PlayerTo(Mystical_Cave); + ! spell_block = 0; + Mystical_Cave.number = Mystical_Cave.number + 1; + rtrue; + } + ], + has container static open; + +Object Top_of_drop "Top of Snowy Slope" + with description "You're at the top of a short downwards slope into \ + a snowy area below. A path leads east. You could also \ + slide down the slope. A lone tree stands here, overlooking \ + the slope.", + name "slope", + e_to snowy_intersection, + d_to Bottom_of_drop, + w_to Bottom_of_drop, + u_to [; + if (tree1 has general) <>; + ], + has light; + +Object tree1 "tree" Top_of_drop + with name "tree", + description "A leafless, bare tree, with what might be a bird's \ +nest in it.", + before [; + Climb: + if (self hasnt general) give self general; + print "You clamber up the tree.^"; + PlayerTo(Top_of_tree); rtrue; + ], + has scenery; + +Object nest1 "nest" Top_of_drop + with name "nest", + description "Even from down here, it's a pretty big nest. \ + Thankfully, no big birds seem to be present.", + before [; + Search: "You can't see into it from down here."; + ThrownAt: + move noun to Top_of_drop; + "You take aim, but miss."; + Receive, LetGo, Rub, Turn, Take, Push, Pull, Touch, Attack, Shake: "You can't reach it."; + Search, LookUnder: "From down here, it's hard to see anything \ +but the bottom of the nest."; + ], + has scenery; + +Object Bottom_of_drop "Bottom of Snowy Slope" + with description "You've made your way down to a small snow-covered \ + clearing, ringed by pine trees. The only exit is back up the \ + slope.", + name "clearing" "pine" "trees" "slope", + u_to Top_of_drop, + e_to Top_of_drop, + has light; + +Object boulder "large boulder" Bottom_of_drop + with name "boulder" "rock", + initial "There's a large boulder here, sitting squat in the \ + middle of the clearing.", + description "A big, snow-covered rock.", + before [; + Push, Pull, Turn: "It must weight a ton."; + Receive: + if (noun==sleeppallet) { + move sleeppallet to boulder; + "You drape the pallet over the boulder."; + } + ], + has static supporter; + +Object egg_shards "egg shards" + with name "shards", + initial "There's some broken eggshell shards here, scattered all \ + over. Some gooey egg stuff too.", + description "Some large pieces of shell is all.", + !weight 5, + size 5, +; + +Object Top_of_tree "Top of tree" + with description "You're on top of the tree, on some lower branches \ + that seem pretty stable.", + d_to Top_of_drop, + has light; + +Object tree2 "tree" Top_of_tree + with name "tree", + description "Overall, there's nothing terribly special about this tree.", + has scenery; + +Object nest2 "nest" Top_of_tree + with name "nest", + initial [; + print "There's a large bird's nest a bit farther out on a \ + nearby branch"; + if (corbie_egg in self) + print ". There appears to be an egg in it"; + "."; + ], + description "Given the size and Brother Joseph's lessons \ + in ornithology, you'd guess that it's a corbie's nest. \ + It looks abandoned.", + before [; + ThrownAt: + move noun to Top_of_drop; + print "Your throw goes a little wide, and "; + DefArt(noun); print " lands "; + ! if (WeightOf(noun) > 10) + ! "with a thump below."; + ! else "below."; + "below."; + Take: "It's way out on a thinner branch that probably \ + won't support your weight."; + Receive: "You can't quite reach it to put anything in it."; + Push, Pull, Rub, Touch, Attack, Shake: "You can't reach it."; + LookUnder: "It seems to be sitting on some branches."; + ], + size 10, + has static container open transparent; + +Object corbie_egg "corbie egg" nest2 + with name "egg", + short_name "corbie egg", + description "A large speckled corbie egg.", + !weight 8, + size 5, + before [; + Take, Rub, Push, Pull, Touch, Squeeze, Turn, Shake: + if (parent(self) == nest2) + "You can't reach it."; + LookUnder: + if (parent(self) == nest2) + "It seems to be in a nest."; + ThrownAt: + if (parent(self) == nest2) { + move egg_shards to Top_of_drop; + move noun to Top_of_drop; + remove self; + "Good toss! A bit too strong though. With a dull \ + crack, your throw breaks the egg, and pieces of \ + shell and egg goop fall to the ground below."; + } + Attack: + move egg_shards to parent(player); + remove self; + "The egg breaks easily, covering you with egg goop. \ +What a mess."; + ], +has edible scored; + +Object branch "branch" Top_of_tree + with name "branch" "branches", + description "Some leafless thin tree branches.", + before [; + Push, Pull, Turn, Shake: + if (corbie_egg in nest2) { + print "You give the branches a good shake. The egg pops \ + free and tumbles to the ground below! You see the egg \ + land in a soft patch of snow, and roll down the slope! \ + Moments later, you hear a dull "; + if (sleeppallet in boulder) { + move corbie_egg to Bottom_of_drop; + "thump from below."; + } + else { + remove corbie_egg; + move egg_shards to Bottom_of_drop; + "crack from below."; + } + } + "You give the branches a good yank. A bit of snow falls."; + ], + has scenery; + + +! Some scenery 'fluff' +Object snow "snow" + with name "snow", + description "Cold, white and not in short supply.", + found_in Mountain_peak Covered_trail Cliff_face Snowy_outcropping MON_garden + snowy_intersection rocky_trail Top_of_drop Bottom_of_drop, + before [; + Take: "It melts into nothing soon after."; + Touch: "It's crisply cold."; + Search: + if ((self has general) && (location == snowy_intersection)) { + give self ~general; + Achieved(16); + move stone_marker_top to snowy_intersection; + "Remembering where the stone marker top fell, you brush \ +aside some snow. Sure enough, there it is!"; + } + ], + has scenery; + + + +Object North_of_river "North of Frozen River" + with description "You are standing just north of a frozen river \ +(probably a tributary of Lake Dinge). You can just see \ +the south bank from here, where the trail seems to \ +continue. There doesn't seem to be a bridge, however. \ +A trail also continues north.", + name "river" "lake" "bank" "trail", + s_to Frozen_river, + n_to snowy_intersection, + has light; + + +Object Frozen_river "On Frozen River" + with description "You are standing on a wide smooth river of ice. \ +The river 'runs' east to west, and there are banks to the \ +north and south.", + name "bank" "banks", + n_to North_of_river, + s_to South_of_river, + e_to "You slide eastwards, and lose your footing, going nowhere.", + w_to "You slide westwards, and slip, going nowhere.", + before [; + Drop: + if (noun==sand) { + move sand to Frozen_river; + Achieved(0); + "You scatter the sand onto the ice."; + } + Go: + if (noun==s_obj) { + if (player notin sleeppallet) { + if (sand notin Frozen_river) + "You slide and flounder helplessly on the ice!"; + else + print "You tread lightly on the sand covered portion of \ + the ice, and scramble to the south bank.^"; + } + } + Jump: + deadflag = 1; + "You bravely jump, but without warning, the ice cracks in many \ + places, and you fall into the freezing river, becoming a human \ + popsicle in a short amount of time."; + ], + has light; + +! (special -- accessible only from Atrii -- put useful item here) +Object Frozen_river2 "On Frozen River" + with description "You are standing on a wide smooth river of ice. \ +The river 'runs' east to west. To the north and south \ +are huge snow bluffs that obscure most of the surrounding \ +countryside.", + e_to "You step eastwards but lose your footing, going nowhere.", + w_to Frozen_river, + before [; + Go: + if (noun==w_obj) + print "^As you step west, a slight downwards slope \ +in the ice sends you sliding uncontrollably.^"; + Jump: + deadflag = 1; + "You bravely jump, but without warning, the ice cracks in many \ + places, and you fall into the freezing river, becoming a human \ + popsicle in a short amount of time."; + ], + has light; + +! (scrawled -- clue to using spheres) +Object p7 "scrawled parchment" Frozen_river2 + class parchment_class, + with name "scrawled", +description "~Red beats smoke,^\ +Silver bests clouds,^\ +Green defeats depths,^\ +Brown stops earth.~"; + +Object river_ice "river ice" + with name "ice" "river", + description "The ice is thick and quite smooth.", + found_in Frozen_river Frozen_river2, + before [; +! just trap all receives as drops + Receive: + <>; + ], + has scenery supporter; + +Object South_of_river "South of Frozen River" + with description "You are standing just south of a frozen river. \ +You can just see the north bank from here, where the trail seems to \ +continue. The only way to get there is across the river. \ +A trail heads south into a valley.", + name "river" "bank" "trail", + n_to Frozen_river, + s_to Valley_trail, + has light; + +Object Valley_trail "Valley Trail" + with description "You are walking along a valley trail, just \ + below a portion of the Gray Mountain ranges. You can \ + see the beginnings of a city to the south, while the \ + trail winds further into the mountain ranges to the \ + north.", + name "trail" "ranges" "mountain" "city", + n_to South_of_river, + s_to FROSTHAM_Outskirts, + has light; + +! (An interesting object, with possible uses...) +!Object bathroom_scale "bathroom scale" +! with name "scale" "bathroom", +! description [; +! if (player in bathroom_scale) +! "This is an odd small flat white device, with a tiny \ +! glass window at one end that you can see a numbered dial \ +! through. The dial currently reads -- wait, that \ +! can't be right. The thing must be broken."; +! print "This is an odd small flat white device, with a tiny \ +! glass window at one end that you can see a numbered dial \ +! through. The dial currently reads: <", +! (WeightOf(self) - 10), " Ughs>.^"; rtrue; +! ], +! weight 10, +! has supporter enterable; + + +! *********************************************************************** +! ** (at this point, for clarity and my sanity, I'm going to build +! ** the remaining locations & objects in separate files, included +! ** here. Hopefully, the files will be somewhat organized based on +! ** general location/town/situation, etc. +! *********************************************************************** + +Include "frostham.inf"; +Include "aragain.inf"; +Include "anthar.inf"; +Include "fublio.inf"; +Include "borphee.inf"; +Include "miznia.inf"; +Include "gurth.inf"; +Include "subway.inf"; +Include "special.inf"; + +! *********************************************************************** +! ** +! ** HADES, in a newer format +! ** +! *********************************************************************** + +Class Hades_Room_Class + with description "You are floating in an empty space. Surrounding you \ + on all sides is a great wall of flame. It would almost seem \ + like you are trapped inside a ball of fire.", + name "fire" "ball" "space" "flame", + before [; + if ((action~=##Go) && (action~=##Look) && (action~=##Wait)) + "You currently lack the means to do that."; ! can't do much in Hades... + Go: + give self ~visited; ! cheat, easier than routines for each dir... + print "^You find yourself floating through the flaming wall! \ + As you pass through you feel a gut-wrenching sensation. \ + Well, perhaps you would if you currently had a gut, or \ + sensations for that matter. Let's just say you feel \ + something akin to a gut-wrenching sensation, and leave \ + it at that.^"; + ], + has light; + +Object Hades_1 "Hades" + class Hades_Room_Class + with u_to Hades_1, + d_to Hades_1, + n_to Hades_1, + s_to Hades_1, + e_to Hades_1, + w_to Hades_1, + in_to Hades_1, + out_to Hades_1, + ne_to Hades_2, + nw_to Hades_1, + se_to Hades_1, + sw_to Hades_1, + each_turn [; + if (random(10) == 1) + "^A wisp of smoke appears to the northeast, then fades."; + ], +; + +Object Hades_2 "Hades" + class Hades_Room_Class + with u_to Hades_1, + d_to Hades_1, + n_to Hades_2, + s_to Hades_3, + e_to Hades_1, + w_to Hades_2, + in_to Hades_1, + out_to Hades_1, + ne_to Hades_2, + nw_to Hades_1, + se_to Hades_2, + sw_to Hades_2, + each_turn [; + if (random(10) == 1) + "^A wisp of smoke appears to the south, then fades."; + ], +; + +Object Hades_3 "Hades" + class Hades_Room_Class + with u_to Hades_4, + d_to Hades_3, + n_to Hades_2, + s_to Hades_1, + e_to Hades_1, + w_to Hades_2, + in_to Hades_3, + out_to Hades_1, + ne_to Hades_2, + nw_to Hades_1, + se_to Hades_3, + sw_to Hades_3, + each_turn [; + if (random(10) == 1) + "^A wisp of smoke appears above, then fades."; + ], +; + +Object Hades_4 "Hades" + class Hades_Room_Class + with u_to Hades_3, + d_to Hades_3, + n_to Hades_5, + s_to Hades_2, + e_to Hades_1, + w_to Hades_4, + in_to Hades_4, + out_to Hades_1, + ne_to Hades_1, + nw_to Hades_3, + se_to Hades_3, + sw_to Hades_1, + each_turn [; + if (random(10) == 1) + "^A wisp of smoke appears to the north, then fades."; + ], +; + +Object Hades_5 "Hades" + with description "You are floating in an empty space. Surrounding you \ + on all sides is a great wall of flame. It would almost seem \ + like you are trapped inside a ball of fire.", + name "fire" "space", + u_to Hades_1, + d_to Hades_3, + n_to Hades_2, + s_to Hades_4, + e_to Hades_4, + w_to Hades_5, +! in_to Hades_1, + out_to Hades_1, + ne_to Hades_1, + nw_to Hades_3, + se_to Hades_3, + sw_to Hades_2, + before [; + if ((action~=##Go) && (action~=##Look) && + (action~=##Wait) && (action~=##Enter) && + (action~=##Take) && (action~=##Examine)) + "You currently lack the means to do that."; + Go: + if (noun==in_obj) { + Revive_Player1(); + rtrue; + } + give self ~visited; + print "^You find yourself floating through the flaming wall! \ + As you pass through you feel a gut-wrenching sensation. \ + Well, perhaps you would if you currently had a gut, or \ + sensations for that matter. Let's just say you feel \ + something akin to a gut-wrenching sensation, and leave \ + it at that.^"; + ], + has light; + +Object Hades_flameball "Ball of flame" Hades_5 + with name "ball" "sphere" "flame", + initial [; + print "In the center of the room is a "; + if (Player_Lives_Left >= 3) + "large flaming sphere."; + if (Player_Lives_Left == 2) + "medium-sized flaming sphere."; + "small flaming sphere."; + ], + description "It's rather hypnotic -- a perfect sphere made entirely of orange-red fire.", + before [; + Enter: + Revive_Player1(); + rtrue; + ], + has enterable static open; + +[ Revive_Player1 ; + print "You find yourself drawn into flaming sphere. The \ + ball of flame engulfs you completely, and you feel \ + nothing as inky blackness surrounds you.^^\ + ~You have revived him!~ you hear a voice say.^^\ + You open your eyes. You are lying on a long wooden \ + table in the Monastery Steeple room. Several members \ + of the Order are gathered around you, and Brother \ + Joseph helps you to your feet.^^\ + ~We were able to bring you back to the world of the \ + living,~ Joseph says, ~but I fear our powers are waning, \ + and we may not succeed if we try again. Your quest \ + continues!~^^\ + The group files out, leaving you alone in the room.^"; + in_hades = 0; + Player_Lives_Left--; + Player_HP_CUR = Player_HP_MAX; ! Healed up + give steeple_window ~open; ! one of the acolytes was too cold... + PlayerTo(MON_Steeple_room); +]; + + +! *********************************************************************** +! ** +! ** INITIALIZE AND OTHER STARTUP, place player, place objs, etc +! ** +! *********************************************************************** + +[ Initialise; + + thedark.description = + "It is pitch black. You are likely to be eaten by a grue."; + + prayer_book.magic = all_my_spells; + ; + ; + move prayer_book to player; + location=MON_Chapel1; + +! (FOR TESTING ONLY) +!move amulet to player; +!; +!; +!; +!; +!; +!move TEMPLE_Artifact to player; +!move umbrella to player; +!move sack to player; +!move c1 to player; +!move magic_door to player; +!location = ANTHAR_GUSStation; +!location=Skyscraper; +!spell_block = 1; +!; +!; +!; +!move decaf_coffee_can to player; +!location=ATRII_1; +]; + + +! *********************************************************************** +! ** +! ** Some special routines, which should be after Initialise +! ** +! *********************************************************************** + +! The Afterlife -- or, a fine time in Hades +[ AfterLife i; + if (Player_Lives_Left <= 0) { + print "^^A blackness surrounds you, replaced by more blackness...^^"; + rfalse; + } + else { + deadflag = 0; ! not dead yet + ! move inventory to place of death + i=parent(player); + while (child(player)~=0) { + give child(player) ~worn; + move child(player) to i; + } + spell_block = 0; + in_atrii = 0; + in_hades = 1; + print "^^A blackness surrounds you, only to be replaced by...^^"; + i = random(4); + if (i==2) { PlayerTo(Hades_2); rtrue; } + if (i==3) { PlayerTo(Hades_3); rtrue; } + else { PlayerTo(Hades_1); rtrue; } + } +]; + + +[ DarkToDark i; + i = random(10); + if (i < 4) { + print "^Hmm, perhaps the Grues really are migrating with the \ + Great Change.^"; + rtrue; + } + if (i >= 4) { + deadflag = 1; + "^Well, don't say I didn't warn you. Something horrible \ +with slavering fangs lurks up and devours you!"; + rtrue; + } +]; + + +! [ WeightOf obj t i; +! t = obj.weight; +! objectloop (i in obj) t=t+WeightOf(i); +! return t; +! ]; +! Now, rules for capacity still hold (slightly unrealistic), but we +! can now check WeightOf(player) in those situations that need it. + +[ PrintRank; + print ", earning you the rank of "; + if (score < 0) "Wanna-be Altar-boy"; +! if (score >= 500) "Truly Enlightened One"; +! if (score >= 495) "Benevolent One"; +! if (score >= 490) "Faithful One"; +! if (score >= 395) "Simple Man"; +! fill fill + if (score >= 250) "Enlightened One"; + if (score >= 225) "Patriarch"; + if (score >= 200) "Cardinal"; + if (score >= 150) "Lama"; + if (score >= 125) "Cleric"; + if (score >= 100) "High Priest"; + if (score >= 90) "Priest"; + if (score >= 75) "Monk"; + if (score >= 50) "Brother"; + if (score >= 30) "Acolyte"; + if (score >= 20) "Aspirant"; + if (score >= 10) "Devoted"; + if (score >= 5) "Believer"; + "Non-believer"; +]; + +[ PrintTaskName ach; + switch (ach) { + 0: "using sand to get across the river"; + 1: "triplicating the cereal box"; + 2: "setting the alarm clock"; + 3: "getting the waxy scroll from the skier"; + 4: "giving the palace guard a good cake"; + 5: "solving Barsap's Gambit"; + 6: "fixing the sailboat"; + 7: "finding the rod in the shipwreck"; + 8: "triplicating the ale"; + 9: "finding the rod under the statue"; + 10: "pruning the Christmas Tree Monster"; + 11: "getting past the burly sports fan"; + 12: "winning the three Golem bouts"; + 13: "ending the kobold war"; + 14: "unlocking Duncanthrax's Trophy chamber"; + 15: "unlocking the Lab door"; + 16: "finding the rod in the top of the marker"; + 17: "finding the rod in the house foundation"; + 18: "removing the impenetrable steel wall"; + 19: "joining the True Rod"; + 20: "getting past the broken subway gate"; + 21: "finding the hidden path to the temple"; + 22: "getting the rod through the temple"; +! 23: "finding the scroll in Frobar's painting"; + 23: "getting the scroll from the boutique"; + 24: "getting the scroll from Frobar"; + 25: "getting into the subway tunnel"; + 26: "banishing the four evil elementals"; +! add, if desired + } +]; + +! *** NEW ACTION ROUTINES + +[ PraySub i; + if ((in_hades == 1) || (in_atrii == 1) || (spell_block==1)) + "You make a prayer and feel no spiritual response! \ + Have the Deities forsaken you? Or have you found a \ + place where even the Gods cannot provide guidance?"; + else { + i = random(100); + if (Player_HP_MAX ~= (20 + score)) + Player_HP_MAX = (20 + score); + ! consider increasing memory/spell capacity here + if (i==97) { + Player_HP_CUR = Player_HP_MAX; ! Healed + "You make a quick but respectful prayer to the \ + Deities above, asking for Divine Guidance in your \ + quest. A saffron glow surrounds you and you feel \ + spiritually and physically renewed!"; + } + "You make a quick but respectful prayer to the \ + Deities above, asking for Divine Guidance in your \ + quest. You finish and feel spiritually renewed."; + } +]; + +[ DiagnoseSub i; + if (Player_HP_CUR > Player_HP_MAX) ! (This should never happen) + "You feel superhuman!"; + if (Player_HP_CUR == Player_HP_MAX) + "You are in good health."; + if (Player_HP_CUR == 1) + "You are near death's door."; + if (Player_HP_CUR < 5) + "You feel extremely weak."; + if (Player_HP_CUR < 10) + "You feel weak."; + i = (Player_HP_MAX / Player_HP_CUR); + if (i >= 4) + "You feel slightly weak"; + if (i >= 2) + "You've been better, but you'll be okay."; + "You feel okay."; +]; + +[ StrongSub i; + i = random(20); + if (i > 15) { + deadflag = 1; + "Such language from a priest such as yourself! \ + The ground rumbles, and a bolt of blue wrath from the \ + Deities strikes you dead!"; + } + "Such language from a priest such as yourself! \ + The ground rumbles suddenly!"; +]; + +! [ LiftSub ; +! if (noun has static) +! "That's fixed in place."; +! if (noun has scenery) +! "You're unable to."; +! if (noun has animate) +! "That would be less than courteous."; +! print "You lift "; DefArt(noun); " and put it back in \ +! it's original position. Nothing obvious happens."; +! ]; + +[ ShakeSub ; + if (noun has animate) + "Get a hold of yourself. No need to go around shaking living \ +things like that."; + "Nothing happens."; +]; + +! (new insert routine, which is the same as old, except that +! we also check relative sizes of objects) +[ InsertSub; + receive_action = ##Insert; + if (second==d_obj ) <>; + if (parent(noun)~=player) return L__M(##Insert,1); + + if (second>1) + { action=##Receive; + if (RunRoutines(second,before)~=0) { action=##Insert; rtrue; } + action=##Insert; + } + if (second hasnt container) return L__M(##Insert,2); + if (second hasnt open) return L__M(##Insert,3); + if (IndirectlyContains(noun,second)==1) return L__M(##Insert,5); + if (noun has worn) + { L__M(##Insert,6); + ; if (noun has worn) rtrue; + } + + if (children(second)>=ValueOrRun(second,capacity)) + return L__M(##Insert,7,second); + + if (noun.size > second.size) { + CDefArt(noun); print " appears to be too large to put in "; + DefArt(second); "."; + } + move noun to second; + + if (AfterRoutines()==1) rtrue; + + if (second>1) + { action=##Receive; + if (RunRoutines(second,after)~=0) { action=##Insert; rtrue; } + action=##Insert; + } + if (keep_silent==1) rtrue; + if (multiflag==1) return L__M(##Insert,8); + L__M(##Insert,9,noun); +]; + +[ FoldSub ; + "I fail to see what you're trying to accomplish by doing this."; +]; + +[ MixSub; + "I fail to see what you're trying to accomplish by doing this."; +]; + +![ SpecialDialSub; +! if (noun hasnt numberdial) +! "You can't seem to do that."; +! if ((second > 9) || (second < 0)) +! print "It appears that the valid range for ",noun; " is 0 to 9"; +! noun.number = second; +! if (noun.number > 9) noun.number = 0; +! a special restriction in this case +! print "You set ",noun," to ",second; "."; +!]; + +[ JoinSub; + "This doesn't seem terribly productive."; +]; + +[ MeditateSub; + "You close your eyes and focus your mind inwards. \ +Mere moments of time seem to pass like eons. You \ +open your eyes."; +]; + +[ YellSub; + "ARRGH!"; +]; +[ SneezeSub; + "You make a rather sickly noise."; +]; +[ YawnSub; + if (Frobar in location) + "~Stop that!~ Frobar says, ~It's contagious.~"; + else "Tired?"; +]; +[ XyzzySub; + "A hollow voice says, ~Cool!~"; +]; +[ BegSub; + "Please, no begging."; +]; +[ LaughSub; + "Was it that funny?"; +]; + +[ HelpSub; + "Hello Player!^^\ +SPIRITWRAK, An Interactive Fantasy Adventure^\ +If you're new to interactive fiction games, I lack the \ +space here to give an adequate description, but in short, \ +you're a character in a story, able to interact with \ +objects, places and other things (using regular english \ +sentences) in order to reach your goal, which is to \ +figure out how to ~solve~ the story. For a real \ +description, you might want to check out documents \ +located at ftp.gmd.de.^^\ +For those more experienced players, if you're looking \ +for on-line clues, etc., sadly, you won't find them \ +(the Z5 code is getting rather obscenely large as I \ +write this). A short verb list is contained in the \ +README file that you should have received with this \ +game (or should be able to find at the same place you \ +found this game). Beyond that, if you're truly \ +desperate, you can post a note on the rec.arts.int-fiction \ +usenet newsgroup, or send me email.^^\ +Thanks for playing! ^^\ +-- D. S. Yu [dsyu@@64holonet.net]"; +]; + +Include "Grammar"; ! (Include grammar _after_ action defs, if we replace any) + +! **** Extensions +!Extend "turn" first +! * noun "to" number -> SpecialDial; +Extend "examine" first + * scope=ReadableSpell -> Examine; + + + +! **** Action defs + +Verb "diagnose" "health" "status" + * -> Diagnose; + +Verb "spells" "memory" "chants" + * -> Spells; +Verb "learn" "memorise" "memorize" "prepare" + * scope=ReadableSpell -> Learn; +Verb "c,cast" + * -> CastOne + * noun -> CastOne; +Verb "cast" "chant" + * is_spell -> Cast + * is_spell "at" noun -> Cast + * is_spell "on" noun -> Cast; +Verb "yell" "scream" "bellow" + * -> Yell; +Verb "sneeze" "cough" + * -> Sneeze; +Verb "yawn" + * -> Yawn; +Verb "laugh" "chuckle" + * -> Laugh; +Verb "play" + * held -> Blow; +Verb "clip" "trim" + * noun -> Cut; +! Verb "lift" "raise" +! * noun -> Lift; +Verb "shake" "yank" + * noun -> Shake; +Verb "fold" + * noun -> Fold; +Verb "mix" "stir" + * noun -> Mix; +Verb "join" "connect" + * noun "to" noun -> Join + * noun "with" noun -> Join; +Verb meta "help" "hint" + * -> Help; + +! ** (nonsense verbs below, can be removed without affecting game) +Verb "xyzzy" "plugh" "treasure" "plover" "yoho" + * -> Xyzzy; +Verb "beg" + * -> Beg; +Verb "meditate" + * -> Meditate; + +end; +! fin. + diff --git a/src/spirita.inf b/src/spirita.inf new file mode 100644 index 0000000..5a93ebc --- /dev/null +++ b/src/spirita.inf @@ -0,0 +1,75 @@ +! ****************** +! Abbreviations, as produced by using '-u' option for +! optimal abbreviations under Inform 5.5 +! ****************** +! LOG +! -- 2/11/96 -- first created +! -- 3/16/96 -- hacked by hand + +!Abbreviate ". "; +Abbreviate ". "; +Abbreviate ", "; +Abbreviate " the "; +Abbreviate "The"; +Abbreviate "You"; +Abbreviate "ing"; +Abbreviate "'s an odd metal gate that only comes up to about your waist"; +Abbreviate "and"; +Abbreviate "On Giant White Cube"; +Abbreviate "s you"; +Abbreviate " st"; +Abbreviate " you"; +! Abbreviate " that"; +Abbreviate " that "; +Abbreviate " to"; +Abbreviate " through"; +Abbreviate " no"; +Abbreviate " of"; +Abbreviate " do"; +Abbreviate " train"; +Abbreviate " he"; +Abbreviate " in"; +Abbreviate " li"; +Abbreviate " lo"; +Abbreviate " on"; +Abbreviate " some"; +Abbreviate "'s a"; +Abbreviate " le"; +Abbreviate " for"; +Abbreviate " ch"; +Abbreviate " mo"; +Abbreviate " ou"; +Abbreviate " thi"; +Abbreviate " see"; +Abbreviate " gr"; +Abbreviate " ma"; +Abbreviate " clo"; +Abbreviate " ro"; +! Abbreviate " en"; +Abbreviate " an"; +Abbreviate " with"; +Abbreviate " nich"; +Abbreviate " sa"; +Abbreviate "south"; +Abbreviate " flo"; +Abbreviate " la"; +Abbreviate " sh"; +Abbreviate " ne"; +Abbreviate " br"; +Abbreviate " ca"; +Abbreviate " pa"; +Abbreviate " su"; +Abbreviate " fi"; +Abbreviate " ba"; +Abbreviate " be"; +Abbreviate " from"; +Abbreviate " wal"; +Abbreviate " sp"; +Abbreviate "Brother Joseph"; +Abbreviate "the"; +Abbreviate "round"; +Abbreviate "all"; +Abbreviate " se"; +Abbreviate "you"; +Abbreviate "rang"; +Abbreviate " are"; diff --git a/src/subway.inf b/src/subway.inf new file mode 100644 index 0000000..4994d04 --- /dev/null +++ b/src/subway.inf @@ -0,0 +1,2033 @@ + +! ****************************************************************** +! subway.inf +! ---------- +! Add-on file for SPIRITWRAK +! -- Contains Great Underground Subway system (trains and tunnels +! and various denizens) +! ****************************************************************** + +! First, some globals (sigh) +! Two for each train line -- one indicates 'direction' of train, +! the second indicates the current 'location' of train. +global PURPLELINE_dir = 0; ! 0 North, 1 South +global PURPLELINE_loc = 1; ! 1-10, frostham to fublio +global ORANGELINE_dir = 0; ! 0 West, 1 East +global ORANGELINE_loc = 1; ! 1-10, Aragain to Gurth +global GREENLINE_dir = 0; ! 0 North, 1 South +global GREENLINE_loc = 1; ! 1-10, New Borphee to Miznia + +! (Subway stops in each city are named as part of the city in +! caps, concat'd with "_GUSStation". All are (of course) +! underground. + +Object FROSTHAM_GUSStation "Frostham GUS Station" + with description [; + print "You are standing "; + if (self hasnt general) { + give self general; + "in a dimly lit underground \ + chamber. There seems \ + to be a much larger room to the southeast, which is \ + unfortunately almost completely blocked by a long metal \ + barricade and gate. Stairs lead up to the outside."; + } + "at the entrance to the Frostham \ + Great Underground Subway (GUS) station. The train \ + platform lies past the gate to the southeast, or \ + stairs lead up into the city."; + ], + name "stairs" "platform", + u_to FROSTHAM_GUSStop, + se_to FG_Gate, + before [; + Go: + if (noun==se_obj) { + if (FG_Gate_slot hasnt general) + "A strange buzzing noise sounds as you try \ + to pass through the gate, and an invisible \ + force blocks your way!"; + else { + give FG_Gate_slot ~general; + print "You saunter through the apparently open gate.^"; + } + } + ], + has light; + + +Object ARAGAIN_GUSStation "Aragain GUS Station" + with description "You are standing at the entrance to the Aragain \ +Great Underground Subway (GUS) station. The train \ +platform lies past the gate to the southeast, or \ +stairs lead up into the city. Some lettering on the \ +wall reads ~TRANSFER STATION~.", + name "stairs" "platform", + u_to ARAGAIN_GUSStop, + se_to AG_Gate, + before [; + Go: + if (noun==se_obj) { + if (AG_Gate_slot hasnt general) + "A strange buzzing noise sounds as you try \ + to pass through the gate, and an invisible \ + force blocks your way!"; + else { + give AG_Gate_slot ~general; + print "You saunter through the apparently open gate.^"; + } + } + ], + has light; + +Object FUBLIO_GUSStation "Fublio Valley GUS Station" + with description "You are standing at the entrance to the \ +South Fublio Valley \ +Great Underground Subway (GUS) station. The train \ +platform lies past the gate to the southeast, or \ +stairs lead up into the city.", + name "stairs" "platform", + u_to FUBLIO_GUSStop, + se_to FublioG_Gate, + before [; + Go: + if (noun==se_obj) { + if (FublioG_Gate_slot hasnt general) + "A strange buzzing noise sounds as you try \ + to pass through the gate, and an invisible \ + force blocks your way!"; + else { + give FublioG_Gate_slot ~general; + print "You saunter through the apparently open gate.^"; + } + } + ], + has light; + +! (Orange stations - one) +Object ANTHAR_GUSStation "Greater Anthar GUS Station" + with description "You are standing at the entrance to the Greater Anthar \ +Great Underground Subway (GUS) station. The train \ +platform lies past the gate to the south, or \ +stairs lead up into the city.", + name "stairs" "platform", + u_to ANTHAR_GUSStop, + s_to AntharG_Gate, + before [; + Go: + if (noun==s_obj) { + if (AntharG_Gate_slot hasnt general) + "A strange buzzing noise sounds as you try \ + to pass through the gate, and an invisible \ + force blocks your way!"; + else { + give AntharG_Gate_slot ~general; + print "You saunter through the apparently open gate.^"; + } + } + ], + has light; + +! (Green stations - three) +Object GURTH_GUSStation "Gurth City GUS Station" + with description "You are standing at the entrance to the Gurth City \ +Great Underground Subway (GUS) station. The train \ +platform lies past the gate to the southwest, or \ +stairs lead up into the city. Some lettering on the \ +wall reads ~TRANSFER STATION~.", + name "stairs" "platform", + u_to GURTH_GUSStop, + sw_to GurthG_Gate, + before [; + Go: + if (noun==u_obj) + print "You are greeted by a light rain as you leave the \ +station.^"; + if (noun==sw_obj) { + if (GurthG_Gate hasnt general) ! note diff + "A strange buzzing noise sounds as you try \ + to pass through the gate, and an invisible \ + force blocks your way!"; + else { + give GurthG_Gate ~general; + print "You saunter through the apparently open gate.^"; + } + } + ], + has light; + +Object BORPHEE_GUSStation "New Borphee GUS Station" + with description "You are standing at the entrance to the New Borphee \ +Great Underground Subway (GUS) station. The train \ +platform lies past the gate to the southwest, or \ +stairs lead up into the city.", + name "stairs" "platform", + u_to BORPHEE_GUSStop, + sw_to BorpheeG_Gate, + before [; + Go: + if (noun==u_obj) + print "You enter the city and are nearly \ + flattened by crowds rushing past.^"; + if (noun==sw_obj) { + if (BorpheeG_Gate_slot hasnt general) + "A strange buzzing noise sounds as you try \ + to pass through the gate, and an invisible \ + force blocks your way!"; + else { + give BorpheeG_Gate_slot ~general; + print "You saunter through the apparently open gate.^"; + } + } + ], + has light; + +Object MIZNIA_GUSStation "Miznia GUS Station" + with description "You are standing at the entrance to the Miznia \ +Great Underground Subway (GUS) station. The train \ +platform lies past the gate to the southwest, or \ +stairs lead up into the city.", + name "stairs" "platform", + u_to MIZNIA_GUSStop, + sw_to MizniaG_Gate, + before [; + Go: + if (noun==sw_obj) { + if (MizniaG_Gate_slot hasnt general) + "A strange buzzing noise sounds as you try \ + to pass through the gate, and an invisible \ + force blocks your way!"; + else { + give MizniaG_Gate_slot ~general; + print "You saunter through the apparently open gate.^"; + } + } + ], + has light; + +Object FROSTHAM_GUSPlatform "Frostham Train Platform" + with description [; + print "You are standing in a long underground \ + chamber. The east side of the room contains a \ + lowered set of what appear to be train tracks. \ + The tracks run south into a dark tunnel. \ + Along one wall painted lettering \ + reads ~FROSTHAM STATION~. \ + A short walkway leads northwest, to a metal fence"; + if (self has general) + ". There is a large train car sitting on the tracks \ + to the east."; + else "."; + ], + name "tunnel", + nw_to FG_Gate, + s_to "A helpful subway worker says ~Hey pal, get outa there!~", + e_to PURPLELINE_car, + in_to PURPLELINE_car, + before [; + Go: +! if (noun == nw_obj) +! print "You saunter through the apparently open gate.^"; + if ((self hasnt general) && + (noun == e_obj or in_obj)) + "You'd fall onto the tracks if you went that way."; + ], + each_turn [ i ; + if (self hasnt general) { + i = random(10); + if (i==1 or 2 or 3) { + give self general; + PURPLELINE_loc = 1; + PURPLELINE_dir = 1; ! will be heading south + "^Suddenly, from the south, a train emerges from \ + the tunnel! It pulls to a screeching halt, the \ + doors open, and several people rush out and exit \ + the station."; + } + if (i==10) + "^You hear a distant rumbling noise from the south."; + } + else { + if (self has general) { + if (PURPLELINE_loc == 2) { + give self ~general; + "^The train doors close, and the train rolls off \ + to the south."; + } + else { + PURPLELINE_loc = 2; + "^A few exit the train, and hurry out \ + of the station. You hear a voice from inside the \ + train say, ~Doors will be closing, please stand \ + clear.~"; + } + } + } + ], + has light; + + +! (Classes for gates and slots) +Class GUS_Gate_Class + with name "gate" "metal", + initial "A metal gate bisects the fence.", + door_dir nw_to, + door_to FROSTHAM_GUSPlatform, + before [; + Climb, JumpOver: "A subway worker yells ~Hey pal, no fare-jumpers!"; + Open: "It looks like it's already open."; + Close: "There doesn't seem to be anything to close."; + Enter: "You'll have to walk in the appropriate direction to go through it."; + ], + description "It's an odd metal gate that only comes up to about \ +your waist. Odder still is the fact that there's \ +no door on the gate, just two metal sides", + has static door transparent open; +Class GUS_Gate_Slot_Class + with name "slot" "metal" "thin" "small", + description "You see a rather small, thin slot that seems to be \ +almost cut into one of the metal sides of the gate.", + before [; + LetGo: "There's no way to get anything out of that tiny, \ +thin slot."; + Receive: + if (noun has is_coin) { + give self general; + remove noun; ! collection + "The coin slides into the slot with a satisfying thunk."; + } + "It doesn't look like that's going to fit into the slot."; + ], + size 1, + has scenery container open; + + +Object FG_Gate "platform gate" + class GUS_Gate_Class, + with initial [; + if (location==FROSTHAM_GUSStation) + "A metal gate bisects the fence to the southeast."; + "A metal gate bisects the fence to the northwest."; + ], + door_dir [; + if (location==FROSTHAM_GUSStation) + return se_to; + return nw_to; + ], + door_to [; + if (location==FROSTHAM_GUSStation) + return FROSTHAM_GUSPlatform; + return FROSTHAM_GUSStation; + ], + before [; + Enter: + if (location==FROSTHAM_GUSStation) <>; + else <>; + ], + description [; + print "It's an odd metal gate that only comes up to about \ + your waist. Odder still is the fact that there's \ + no door on the gate, just two metal sides"; + if (location == FROSTHAM_GUSStation) + ". There's a thin slot on one of the sides."; + else "."; + ], + found_in FROSTHAM_GUSStation FROSTHAM_GUSPlatform, +; + + + +Object FG_Gate_slot "metal slot" FG_Gate + class GUS_Gate_Slot_Class + with description [; + if (location == FROSTHAM_GUSPlatform) + "You can't see any such thing."; + if (location == FROSTHAM_GUSStation) + "You see a rather small, thin slot that seems to be \ +almost cut into one of the metal sides of the gate."; + ], + before [; + if (location == FROSTHAM_GUSPlatform) + "You can't see any such thing."; + ], +; + + +Object AG_Gate "platform gate" + class GUS_Gate_Class + with initial [; + if (location==ARAGAIN_GUSStation) + "A metal gate bisects the fence to the southeast."; + "A metal gate bisects the fence to the northwest."; + ], + door_dir [; + if (location==ARAGAIN_GUSStation) + return se_to; + return nw_to; + ], + door_to [; + if (location==ARAGAIN_GUSStation) + return ARAGAIN_GUSPlatform; + return ARAGAIN_GUSStation; + ], + before [; + Enter: + if (location==FROSTHAM_GUSStation) <>; + else <>; + ], + description [; + print "It's an odd metal gate that only comes up to about \ + your waist. Odder still is the fact that there's \ + no door on the gate, just two metal sides"; + if (location == ARAGAIN_GUSStation) + ". There's a thin slot on one of the sides."; + else "."; + ], + found_in ARAGAIN_GUSStation ARAGAIN_GUSPlatform, +; + +Object AG_Gate_slot "metal slot" AG_Gate + class GUS_Gate_Slot_Class + with description [; + if (location == ARAGAIN_GUSPlatform) + "You can't see any such thing."; + if (location == ARAGAIN_GUSStation) + "You see a rather small, thin slot that seems to be \ +almost cut into one of the metal sides of the gate."; + ], + before [; + if (location == ARAGAIN_GUSPlatform) + "You can't see any such thing."; + ], +; + + +Object FublioG_Gate "platform gate" + class GUS_Gate_Class + with initial [; + if (location==FUBLIO_GUSStation) + "A metal gate bisects the fence to the southeast."; + "A metal gate bisects the fence to the northwest."; + ], + door_dir [; + if (location==FUBLIO_GUSStation) + return se_to; + return nw_to; + ], + door_to [; + if (location==FUBLIO_GUSStation) + return FUBLIO_GUSPlatform; + return FUBLIO_GUSStation; + ], + before [; + Enter: + if (location==FUBLIO_GUSStation) <>; + else <>; + ], + description [; + print "It's an odd metal gate that only comes up to about \ + your waist. Odder still is the fact that there's \ + no door on the gate, just two metal sides"; + if (location == FUBLIO_GUSStation) + ". There's a thin slot on one of the sides."; + else "."; + ], + found_in FUBLIO_GUSStation FUBLIO_GUSPlatform, +; + +Object FublioG_Gate_slot "metal slot" FublioG_Gate + class GUS_Gate_Slot_Class + with description [; + if (location == FUBLIO_GUSStation) + "You see a rather small, thin slot that seems to be \ + almost cut into one of the metal sides of the gate."; +!! See if this works instead... + "You can't see any such thing."; + ], + before [; + if (location == FUBLIO_GUSPlatform) + "You can't see any such thing."; + ], +; + +! (Orange gates (1)) +Object AntharG_Gate "platform gate" + class GUS_Gate_Class + with initial [; + if (location==ANTHAR_GUSStation) + "A metal gate bisects the fence to the south."; + "A metal gate bisects the fence to the north."; + ], + door_dir [; + if (location==ANTHAR_GUSStation) + return s_to; + return n_to; + ], + door_to [; + if (location==ANTHAR_GUSStation) + return ANTHAR_GUSPlatform; + return ANTHAR_GUSStation; + ], + before [; + Enter: + if (location==ANTHAR_GUSStation) <>; + else <>; + ], + description [; + print "It's an odd metal gate that only comes up to about \ + your waist. Odder still is the fact that there's \ + no door on the gate, just two metal sides"; + if (location == ANTHAR_GUSStation) + ". There's a thin slot on one of the sides."; + else "."; + ], + found_in ANTHAR_GUSStation ANTHAR_GUSPlatform, +; + +Object AntharG_Gate_slot "metal slot" AntharG_Gate + class GUS_Gate_Slot_Class + with description [; + if (location == ANTHAR_GUSStation) + "You see a rather small, thin slot that seems to be \ + almost cut into one of the metal sides of the gate."; + "You can't see any such thing."; + ], + before [; + if (location == ANTHAR_GUSPlatform) + "You can't see any such thing."; + ], +; + + +! (Green gates (3)) +Object BorpheeG_Gate "platform gate" + class GUS_Gate_Class + with initial [; + if (location==BORPHEE_GUSStation) + "A metal gate bisects the fence to the southwest."; + "A metal gate bisects the fence to the northeast."; + ], + door_dir [; + if (location==BORPHEE_GUSStation) + return sw_to; + return ne_to; + ], + door_to [; + if (location==BORPHEE_GUSStation) + return BORPHEE_GUSPlatform; + return BORPHEE_GUSStation; + ], + before [; + Enter: + if (location == BORPHEE_GUSStation) <>; + else <>; + ], + description [; + print "It's an odd metal gate that only comes up to about \ + your waist. Odder still is the fact that there's \ + no door on the gate, just two metal sides"; + if (location == BORPHEE_GUSStation) + ". There's a thin slot on one of the sides."; + else "."; + ], + found_in BORPHEE_GUSStation BORPHEE_GUSPlatform, +; + +Object BorpheeG_Gate_slot "metal slot" BorpheeG_Gate + class GUS_Gate_Slot_Class + with description [; + if (location == BORPHEE_GUSStation) + "You see a rather small, thin slot that seems to be \ + almost cut into one of the metal sides of the gate."; + "You can't see any such thing."; + ], + before [; + if (location == BORPHEE_GUSPlatform) + "You can't see any such thing."; + ], +; + +! (NOTE: Gurth is different, read: broken) +Object GurthG_Gate "platform gate" + class GUS_Gate_Class + with initial [; + if (location==GURTH_GUSStation) + "A metal gate bisects the fence to the southwest."; + "A metal gate bisects the fence to the northeast."; + ], + door_dir [; + if (location==GURTH_GUSStation) + return sw_to; + return ne_to; + ], + door_to [; + if (location==GURTH_GUSStation) + return GURTH_GUSPlatform; + return GURTH_GUSStation; + ], + before [; + Enter: if (location == GURTH_GUSStation) <>; + else <>; + ], + description [; + print "It's an odd metal gate that only comes up to about \ + your waist. Odder still is the fact that there's \ + no door on the gate, just two metal sides"; + if (location == GURTH_GUSStation) + ". There's a thin slot on one of the sides that looks \ + slightly dented."; + else "."; + ], + found_in GURTH_GUSStation GURTH_GUSPlatform, +; + +Object GurthG_Gate_slot "metal slot" GurthG_Gate + class GUS_Gate_Slot_Class + with name "dented", + description [; + if (location == GURTH_GUSStation) + "You see a rather small, thin slot that seems to be \ + almost cut into one of the metal sides of the gate. \ + It looks slightly dented."; + "You can't see any such thing."; + ], + before [; + if (location == GURTH_GUSPlatform) + "You can't see any such thing."; + Receive: + if (noun has is_coin) { + give self general; + remove noun; + "The coin slides into the slot, but you hear a strange click \ + almost immediately.^^\ + A subway nymph suddenly appears. She looks at the gate \ + disapprovingly. ~Broken again? I thought they \ + just fixed it. Well, fine.~ She seems rather annoyed. \ + ~We'll get someone to look at it, eventually. Bye!~ She \ + disappears."; + } + if (noun==wire) { + if (self hasnt general) + "You poke the wire in the slot for a bit, but nothing \ + happens."; + if (self has general) { + give self ~general; + Achieved(20); + give GurthG_Gate general; + "You poke around in the slot, and manage to free something! \ + There is a solid thunk-like noise."; + } + } + "It doesn't look like that's going to fit into the slot."; + ], +; + +Object MizniaG_Gate "platform gate" + class GUS_Gate_Class + with initial [; + if (location==MIZNIA_GUSStation) + "A metal gate bisects the fence to the southwest."; + "A metal gate bisects the fence to the northeast."; + ], + door_dir [; + if (location==MIZNIA_GUSStation) + return sw_to; + return ne_to; + ], + door_to [; + if (location==MIZNIA_GUSStation) + return MIZNIA_GUSPlatform; + return MIZNIA_GUSStation; + ], + before [; + Enter: if (location==MIZNIA_GUSStation) <>; + else <>; + ], + description [; + print "It's an odd metal gate that only comes up to about \ + your waist. Odder still is the fact that there's \ + no door on the gate, just two metal sides"; + if (location == MIZNIA_GUSStation) + ". There's a thin slot on one of the sides."; + else "."; + ], + found_in MIZNIA_GUSStation MIZNIA_GUSPlatform, +; + +Object MizniaG_Gate_slot "metal slot" MizniaG_Gate + class GUS_Gate_Slot_Class + with description [; + if (location == MIZNIA_GUSStation) + "You see a rather small, thin slot that seems to be \ + almost cut into one of the metal sides of the gate."; + "You can't see any such thing."; + ], + before [; + if (location==MIZNIA_GUSPlatform) + "You can't see any such thing."; + ], +; + + + +!Object FS_Platform_sign2 "laminated paper" FROSTHAM_GUSPlatform +! with name "paper" "laminated" "safety", +! initial "A small stiff-looking piece of paper is attached to the west wall.", +! description "The paper reads: ^^\ +! GREAT UNDERGROUND SUBWAY STATION RULES:^ +! 1) No going onto tracks.^ +! 2) No going into tunnels on foot unless authorized.", +! has static; + +Object train_tracks "train tracks" + with name "tracks" "train", + description "A pair of large metal train tracks.", + found_in FROSTHAM_GUSPlatform ARAGAIN_GUSPlatform FUBLIO_GUSPlatform + ARAGAIN_GUSPlatform2, + has scenery; + + +Object ARAGAIN_GUSPlatform "Aragain Train Platform" + with description [; + print "You are standing in a long underground \ + chamber. The east side of the room contains a \ + lowered set of what appear to be train tracks. \ + The tracks run north and south into dark tunnels. \ + Along one wall painted lettering \ + reads ~ARAGAIN STATION~. \ + A short walkway leads northwest, to a metal fence. \ + There is also a stairway down here"; + if (self has general) + ". In addition, there is a large train car sitting on the tracks \ + to the east."; + else "."; + ], + name "tunnel" "tunnels" "stairway", + nw_to AG_Gate, + s_to "A helpful subway worker says ~Hey pal, get outa there!~", + n_to "A helpful subway worker says ~Hey pal, get outa there!~", + e_to PURPLELINE_car, + d_to ARAGAIN_GUSPlatform2, + in_to PURPLELINE_car, + before [; + Go: +! if (noun == nw_obj) +! print "You saunter through the apparently open gate.^"; + if ((self hasnt general) && + (noun == e_obj or in_obj)) + "You'd fall onto the tracks if you went that way."; + ], + each_turn [ i ; + if (self hasnt general) { + i = random(10); + if (i==1 or 3 or 5) { + give self general; + PURPLELINE_loc = 5; + PURPLELINE_dir = 1; ! will be heading south + "^Suddenly, from the north, a train emerges from \ + the tunnel! It pulls to a screeching halt, the \ + doors open, and several people rush out and exit \ + the station."; + } + if (i==2 or 4 or 6) { + give self general; + PURPLELINE_loc = 5; + PURPLELINE_dir = 0; ! will be heading north + "^Suddenly, from the south, a train emerges from \ + the tunnel! It pulls to a screeching halt, the \ + doors open, and several people rush out and exit \ + the station."; + } + if (i==9) + "^You hear a distant rumbling noise from the north."; + if (i==10) + "^You hear a distant rumbling noise from the south."; + } + else { + if (self has general) { + if (PURPLELINE_loc == 6) { + give self ~general; + "^The train doors close, and the train rolls off."; + } + else { + PURPLELINE_loc = 6; + "^A few exit the train, and hurry out \ + of the station. You hear a voice from inside the \ + train say, ~Doors will be closing, please stand \ + clear.~"; + } + } + } + ], + has light; + +Object ARAGAIN_GUSPlatform2 "Aragain Train Platform (lower)" + with description [; + print "You are standing in a long underground \ + chamber. The south side of the room contains a \ + lowered set of what appear to be train tracks. \ + The tracks run west into a dark tunnel. \ + Along one wall painted lettering \ + reads ~ARAGAIN STATION~. \ + A set of stairs leads up out of the gloom"; + if (self has general) + ". There is a large train car sitting on the tracks \ + to the south."; + else "."; + ], + name "tunnel" "stairs", + w_to "A helpful subway worker says ~Hey pal, get outa there!~", + s_to ORANGELINE_car, + in_to ORANGELINE_car, + u_to ARAGAIN_GUSPlatform, + before [; + Go: + if ((self hasnt general) && + (noun == s_obj or in_obj)) + "You'd fall onto the tracks if you went that way."; + ], + each_turn [ i ; + if (self hasnt general) { + i = random(10); + if (i==1 or 3 or 5) { + give self general; + ORANGELINE_loc = 9; + ORANGELINE_dir = 0; ! will be heading west + "^Suddenly, from the west, a train emerges from \ + the tunnel! It pulls to a screeching halt, the \ + doors open, and several people rush out and up \ + the stairs."; + } + if (i==10) + "^You hear a distant rumbling noise from the west."; + } + else { + if (self has general) { + if (ORANGELINE_loc == 10) { + give self ~general; + "^The train doors close, and the train heads off \ + to the west."; + } + else { + ORANGELINE_loc = 10; + "^A few people exit the train, and hurry up the stairs. \ + You hear a voice from inside the \ + train say, ~Doors will be closing, please stand \ + clear.~"; + } + } + } + ], + has light; + + +Object FUBLIO_GUSPlatform "Fublio Valley Train Platform" + with description [; + print "You are standing in a long underground \ + chamber. The east side of the room contains a \ + lowered set of what appear to be train tracks. \ + The tracks run north into a dark tunnel. \ + Along one wall painted lettering \ + reads ~FUBLIO VALLEY STATION~. \ + A short walkway leads northwest, to a metal fence"; + if (self has general) + ". There is a large train car sitting on the tracks \ + to the east."; + else "."; + ], + name "tunnel", + nw_to FublioG_Gate, + n_to "A helpful subway worker says ~Hey pal, get outa there!~", + e_to PURPLELINE_car, + in_to PURPLELINE_car, + before [; + Go: +! if (noun == nw_obj) +! print "You saunter through the apparently open gate.^"; + if ((self hasnt general) && + (noun == e_obj or in_obj)) + "You'd fall onto the tracks if you went that way."; + ], + each_turn [ i ; + if (self hasnt general) { + i = random(10); + if (i==1 or 3 or 4) { + give self general; + PURPLELINE_loc = 10; + PURPLELINE_dir = 0; ! will be heading north + "^Suddenly, from the north, a train emerges from \ + the tunnel! It pulls to a screeching halt, the \ + doors open, and several people rush out and exit \ + the station."; + } + if (i==10) + "^You hear a distant rumbling noise from the north."; + } + else { + if (self has general) { + if (PURPLELINE_loc == 9) { + give self ~general; + "^The train doors close, and the train rolls off \ + to the north."; + } + else { + PURPLELINE_loc = 9; + "^A few people exit the train, and hurry out \ + of the station. You hear a voice from inside the \ + train say, ~Doors will be closing, please stand \ + clear.~"; + } + } + } + ], + has light; + + +! *** Orange line platforms + + +Object GURTH_GUSPlatform2 "Gurth City Train Platform (lower)" + with description [; + print "You are standing in a long underground \ + chamber. The south side of the room contains a \ + lowered set of what appear to be train tracks. \ + The tracks run east into a dark tunnel. \ + Along one wall painted lettering \ + reads ~GURTH CITY STATION~. \ + A set of stairs leads up out of the gloom"; + if (self has general) + ". There is a large train car sitting on the tracks \ + to the south."; + else "."; + ], + name "tunnel" "stairs", + e_to "A helpful subway worker says ~Hey pal, get outa there!~", + s_to ORANGELINE_car, + in_to ORANGELINE_car, + u_to GURTH_GUSPlatform, + before [; + Go: + if ((self hasnt general) && + (noun == s_obj or in_obj)) + "You'd fall onto the tracks if you went that way."; + ], + each_turn [ i ; + if (self hasnt general) { + i = random(10); + if (i==1 or 2 or 4) { + give self general; + ORANGELINE_loc = 1; + ORANGELINE_dir = 1; ! will be heading east + "^Suddenly, from the east, a train emerges from \ + the tunnel! It pulls to a screeching halt, the \ + doors open, and several people rush out and up \ + the stairs."; + } + if (i==10) + "^You hear a distant rumbling noise from the east."; + } + else { + if (self has general) { + if (ORANGELINE_loc == 2) { + give self ~general; + "^The train doors close, and the train heads off \ + to the east."; + } + else { + ORANGELINE_loc = 2; + "^A few people exit the train, and hurry up the stairs. \ + You hear a voice from inside the \ + train say, ~Doors will be closing, please stand \ + clear.~"; + } + } + } + ], + has light; + +Object ANTHAR_GUSPlatform "Greater Anthar Train Platform" + with description [; + print "You are standing in a long underground \ + chamber. The south side of the room contains a \ + lowered set of what appear to be train tracks. \ + The tracks run east and west into dark tunnels. \ + Along one wall painted lettering \ + reads ~ANTHAR STATION~. \ + A short walkway leads north, to a metal fence"; + if (self has general) + ". There is a large train car sitting on the tracks \ + to the south."; + else "."; + ], + name "tunnel" "tunnels" "walkway", + n_to AntharG_Gate, + e_to "A helpful subway worker says ~Hey pal, get outa there!~", + w_to "A helpful subway worker says ~Hey pal, get outa there!~", + s_to ORANGELINE_car, + in_to ORANGELINE_car, + before [; + Go: +! if (noun == n_obj) +! print "You saunter through the apparently open gate.^"; + if ((self hasnt general) && + (noun == s_obj or in_obj)) + "You'd fall onto the tracks if you went that way."; + ], + each_turn [ i ; + if (self hasnt general) { + i = random(10); + if (i==1 or 4 or 5) { + give self general; + ORANGELINE_loc = 5; + ORANGELINE_dir = 1; ! will be heading east + "^Suddenly, from the west, a train emerges from \ + the tunnel! It pulls to a screeching halt, the \ + doors open, and several people rush out and exit \ + the station."; + } + if (i==2 or 3 or 6) { + give self general; + ORANGELINE_loc = 5; + ORANGELINE_dir = 0; ! will be heading west + "^Suddenly, from the east, a train emerges from \ + the tunnel! It pulls to a screeching halt, the \ + doors open, and several people rush out and exit \ + the station."; + } + if (i==9) + "^You hear a distant rumbling noise from the east."; + if (i==10) + "^You hear a distant rumbling noise from the west."; + } + else { + if (self has general) { + if (ORANGELINE_loc == 6) { + give self ~general; + "^The train doors close, and the train rolls off."; + } + else { + ORANGELINE_loc = 6; + "^A few people exit the train, and hurry out \ + of the station. You hear a voice from inside the \ + train say, ~Doors will be closing, please stand \ + clear.~"; + } + } + } + ], + has light; + + +! *** Green line platforms + +Object BORPHEE_GUSPlatform "New Borphee Train Platform" + with description [; + print "You are standing in a long underground \ + chamber. The west side of the room contains a \ + lowered set of what appear to be train tracks. \ + The tracks run south into a dark tunnel. \ + Along one wall painted lettering \ + reads ~NEW BORPHEE STATION~. \ + A short walkway leads northeast, to a metal fence"; + if (self has general) + ". There is a large train car sitting on the tracks \ + to the west."; + else "."; + ], + name "tunnel" "walkway", + ne_to BorpheeG_Gate, + s_to "A helpful subway worker says ~Hey pal, get outa there!~", + w_to GREENLINE_car, + in_to GREENLINE_car, + before [; + Go: +! if (noun == ne_obj) +! print "You saunter through the apparently open gate.^"; + if ((self hasnt general) && + (noun == w_obj or in_obj)) + "You'd fall onto the tracks if you went that way."; + ], + each_turn [ i ; + if (self hasnt general) { + i = random(10); + if (i==1 or 2 or 3) { + give self general; + GREENLINE_loc = 1; + GREENLINE_dir = 1; ! will be heading south + "^Suddenly, from the south, a train emerges from \ + the tunnel! It pulls to a screeching halt, the \ + doors open, and several people rush out and exit \ + the station."; + } + if (i==10) + "^You hear a distant rumbling noise from the south."; + } + else { + if (self has general) { + if (GREENLINE_loc == 2) { + give self ~general; + "^The train doors close, and the train rolls off \ + to the south."; + } + else { + GREENLINE_loc = 2; + "^A few people exit the train, and hurry out \ + of the station. You hear a voice from inside the \ + train say, ~Doors will be closing, please stand \ + clear.~"; + } + } + } + ], + has light; + +Object MIZNIA_GUSPlatform "Miznia Train Platform" + with description [; + print "You are standing in a long underground \ + chamber. The west side of the room contains a \ + lowered set of what appear to be train tracks. \ + The tracks run north into a dark tunnel. \ + Along one wall painted lettering \ + reads ~MIZNIA STATION~. \ + A short walkway leads northeast, to a metal fence"; + if (self has general) + ". There is a large train car sitting on the tracks \ + to the west."; + else "."; + ], + name "tunnel" "walkway", + ne_to MizniaG_Gate, + n_to "A helpful subway worker says ~Hey pal, get outa there!~", + w_to GREENLINE_car, + in_to GREENLINE_car, + before [; + Go: +! if (noun == ne_obj) +! print "You saunter through the apparently open gate.^"; + if ((self hasnt general) && + (noun == w_obj or in_obj)) + "You'd fall onto the tracks if you went that way."; + ], + each_turn [ i ; + if (self hasnt general) { + i = random(10); + if (i==1 or 2 or 3) { + give self general; + GREENLINE_loc = 9; + GREENLINE_dir = 0; ! will be heading south + "^Suddenly, from the north, a train emerges from \ + the tunnel! It pulls to a screeching halt, the \ + doors open, and several people rush out and exit \ + the station."; + } + if (i==10) + "^You hear a distant rumbling noise from the north."; + } + else { + if (self has general) { + if (GREENLINE_loc == 10) { + give self ~general; + "^The train doors close, and the train rolls off \ + to the north."; + } + else { + GREENLINE_loc = 10; + "^A few people exit the train, and hurry out \ + of the station. You hear a voice from inside the \ + train say, ~Doors will be closing, please stand \ + clear.~"; + } + } + } + ], + has light; + +Object GURTH_GUSPlatform "Gurth City Train Platform" + with description [; + print "You are standing in a long underground \ + chamber. The west side of the room contains a \ + lowered set of what appear to be train tracks. \ + The tracks run north and south into dark tunnels. \ + Along one wall painted lettering \ + reads ~GURTH CITY STATION~. \ + A short walkway leads northeast, to a metal fence. \ + There is also a stairway down here"; + if (self has general) + ". There is a large train car sitting on the tracks \ + to the west."; + else "."; + ], + name "tunnel" "tunnels" "walkway" "stairway", + ne_to GurthG_Gate, + s_to "A helpful subway worker says ~Hey pal, get outa there!~", + n_to "A helpful subway worker says ~Hey pal, get outa there!~", + w_to GREENLINE_car, + d_to GURTH_GUSPlatform2, + in_to GREENLINE_car, + before [; + Go: +! if (noun == ne_obj) +! print "You saunter through the apparently open gate.^"; + if ((self hasnt general) && + (noun == w_obj or in_obj)) + "You'd fall onto the tracks if you went that way."; + ], + each_turn [ i ; + if (self hasnt general) { + i = random(10); + if (i==1 or 3) { + give self general; + GREENLINE_loc = 5; + GREENLINE_dir = 1; ! will be heading south + "^Suddenly, from the north, a train emerges from \ + the tunnel! It pulls to a screeching halt, the \ + doors open, and several people rush out and exit \ + the station."; + } + if (i==2 or 4) { + give self general; + GREENLINE_loc = 5; + GREENLINE_dir = 0; ! will be heading north + "^Suddenly, from the south, a train emerges from \ + the tunnel! It pulls to a screeching halt, the \ + doors open, and several people rush out and exit \ + the station."; + } + if (i==9) + "^You hear a distant rumbling noise from the north."; + if (i==10) + "^You hear a distant rumbling noise from the south."; + } + else { + if (self has general) { + if (GREENLINE_loc == 6) { + give self ~general; + "^The train doors close, and the train rolls off."; + } + else { + GREENLINE_loc = 6; + "^A few people exit the train, and hurry out \ + of the station. You hear a voice from inside the \ + train say, ~Doors will be closing, please stand \ + clear.~"; + } + } + } + ], + has light; + +! ************************** +! TRAINS +! Some notes: +! While it may seem more logical to implement the trains with +! an 'enterable' property, I decided to implement them as +! 'rooms' instead. Mainly, I did this because: +! 1) I wanted total control of the "movement" of the train. +! 2) I wanted to fill the cars with various people/things. +! 3) I wanted seats on the train :) +! Again, this is all probably possible with 'vehicles', I +! just saw things slightly differently. +! Be warned, the logic in moving the train is probably one +! of the more unfathomable things I've ever coded. +! ************************** + +! *** The purple line (Eastlands) + +Object PURPLELINE_car "Subway car" + with description "You are in an underground train car. Various \ + people fill the train, some in uncomfortable-looking seats.", + name "car" "people", + w_to FROSTHAM_GUSPlatform, ! we adjust this, see below + out_to FROSTHAM_GUSPlatform, + after [; + Go: + if (noun == e_obj or in_obj) { + ! determine boarding location, direction train was + ! traveling + give self general; ! we're off and moving... + print "^You enter the train car. The doors slam shut behind you.^"; + if (PURPLELINE_loc == 1 or 2) { + ! Frostham, south + give FROSTHAM_GUSPlatform ~general; + PURPLELINE_loc = 3; ! leaving + } + if (PURPLELINE_loc == 5 or 6) { + ! Aragain + ! give ARAGAIN_GUSPlatform ~general; + if (PURPLELINE_dir == 1) { + ! South + PURPLELINE_loc = 7; + } + else { + ! North + PURPLELINE_loc = 4; + } + } + if (PURPLELINE_loc == 9 or 10) { + ! Fublio, north + ! give FUBLIO_GUSPlatform ~general; + PURPLELINE_loc = 8; + } + } + ], + before [; + Go: + if (noun == w_obj or out_obj) { + if (self has general) + "The train is moving right now. Better wait til \ + it stops to get off."; + if (thug in self) + "As you try to get off, the thug gets in your way. \ + ~Going somewhere, Padre?~."; + } + ], + each_turn [; + ! check location of train, print appropriate msg, + ! and increment location of train, given direction + if (PURPLELINE_loc == 1) { + ! reached Frostham, dir = S, not moving + give self ~general; + give FROSTHAM_GUSPlatform general; + PURPLELINE_dir = 1; + PURPLELINE_loc = 2; + PURPLELINE_car.w_to = FROSTHAM_GUSPlatform; + PURPLELINE_car.out_to = FROSTHAM_GUSPlatform; + "^The train suddenly lurches to a stop! A voice from \ + somewhere overhead says ~Frostham station, watch your \ + step please.~"; + } + if (PURPLELINE_loc == 2) { + ! still in Frostham, not moving + PURPLELINE_loc = 3; + "^A voice overhead says ~Doors will be closing, please \ + stand clear.~"; + } + if (PURPLELINE_loc == 3) { + if (PURPLELINE_dir == 1) { + ! moving away from Frostham + give self general; + give FROSTHAM_GUSPlatform ~general; + PURPLELINE_loc = 4; + "^The train starts to move, quickly exiting the station \ + going south."; + } + if (PURPLELINE_dir == 0) { + ! moving towards Frostham + PURPLELINE_loc = 1; ! We will 'arrive' in Frostham next + "^The train rumbles as it moves."; + } + } + if (PURPLELINE_loc == 4) { + if (PURPLELINE_dir == 0) { + ! We're leaving Aragain + PURPLELINE_loc = 3; + give self general; + give ARAGAIN_GUSPlatform ~general; + "^The train starts to move, quickly exiting the station \ + going north."; + } + if (PURPLELINE_dir == 1) { + PURPLELINE_loc = 5; + "^The train rumbles as it moves."; + } + } + if (PURPLELINE_loc == 5) { + ! reached Aragain, stop the train + give self ~general; + give ARAGAIN_GUSPlatform general; + PURPLELINE_loc = 6; ! we'll be stopping for 1 turn + PURPLELINE_car.w_to = ARAGAIN_GUSPlatform; + PURPLELINE_car.out_to = ARAGAIN_GUSPlatform; + "^The train suddenly lurches to a stop! A voice from \ + somewhere overhead says ~Aragain station, watch your \ + step please.~"; + } + if (PURPLELINE_loc == 6) { + ! about to leave Aragain station + if (PURPLELINE_dir == 0) + PURPLELINE_loc = 4; + else + PURPLELINE_loc = 7; + "^A voice overhead says ~Doors will be closing, please \ + stand clear.~"; + } + if (PURPLELINE_loc == 7) { + if (PURPLELINE_dir == 1) { + ! We're leaving Aragain + PURPLELINE_loc = 8; + give self general; + give ARAGAIN_GUSPlatform ~general; + "^The train starts to move, quickly exiting the station \ + going south."; + } + if (PURPLELINE_dir == 0) { + PURPLELINE_loc = 5; ! we will arrive in Aragain shortly... + "^The train rumbles as it moves."; + } + } + if (PURPLELINE_loc == 8) { + if (PURPLELINE_dir == 0) { + ! we're leaving Fublio + PURPLELINE_loc = 7; + give self general; + give FUBLIO_GUSPlatform ~general; + "^The train starts to move, quickly exiting the station \ + going north."; + } + if (PURPLELINE_dir == 1) { + PURPLELINE_loc = 10; ! will arrive in Fublio (BACKWARDS!!) + "^The train rumbles as it moves."; + } + } + if (PURPLELINE_loc == 9) { + ! still waiting in Fublio + PURPLELINE_loc = 8; + "^A voice overhead says ~Doors will be closing, please \ + stand clear.~"; + } + if (PURPLELINE_loc == 10) { + ! arriving in Fublio + PURPLELINE_loc = 9; + PURPLELINE_dir = 0; ! north + give self ~general; + give FUBLIO_GUSPlatform general; + PURPLELINE_car.w_to = FUBLIO_GUSPlatform; + PURPLELINE_car.out_to = FUBLIO_GUSPlatform; + "^The train suddenly lurches to a stop! A voice from \ + somewhere overhead says ~Fublio station, watch your \ + step please.~"; + } + ], + has light; + +Class Train_Car_Seat_Class + with name "seat" "seats", + description "There seem to be a few seats that haven't been taken.", + before [; + Enter: + if (random(10) < 3) + "As you attempt to grab an open seat, someone rudely \ + beats you to it."; + ], +has scenery enterable; + + +Object PURPLELINE_car_seats "subway seat" PURPLELINE_car + class Train_Car_Seat_Class + with before [; + Search: + if (self hasnt general) { + give self general; + move c9 to player; + "Good fortune is your friend! You notice a \ +forgotten coin stuck in a seat crack, and fend off two \ +passengers to grab it."; + } + ], +; + + +! *** ORANGE LINE CAR (Gurth to Aragain) + + +Object ORANGELINE_car "Subway car" + with description "You are in an underground train car. Various \ + people fill the train, some in uncomfortable-looking seats.", + name "car" "people", + n_to ANTHAR_GUSPlatform, ! we adjust this, see below + out_to ANTHAR_GUSPlatform, + after [; + Go: + if (noun == s_obj or in_obj) { + ! determine boarding location, direction train was + ! traveling + give self general; ! we're off and moving... + print "^You squeeze onto the train car. The doors close behind you.^"; + if (ORANGELINE_loc == 1 or 2) { + ! Gurth, east + give GURTH_GUSPlatform2 ~general; + ORANGELINE_loc = 3; ! leaving + } + if (ORANGELINE_loc == 5 or 6) { + ! Anthar + give ANTHAR_GUSPlatform ~general; + if (ORANGELINE_dir == 1) { + ! east + ORANGELINE_loc = 7; + } + else { + ! west + ORANGELINE_loc = 4; + } + } + if (ORANGELINE_loc == 9 or 10) { + ! Aragain, west + give ARAGAIN_GUSPlatform2 ~general; + ORANGELINE_loc = 8; + } + } + ], + before [; + Go: + if (noun == n_obj or out_obj) { + if (self has general) + "The train is moving right now. Better wait til \ + it stops to get off."; + } + ], + each_turn [; + ! check location of train, print appropriate msg, + ! and increment location of train, given direction + if (ORANGELINE_loc == 1) { + ! reached Gurth, dir = S, not moving + give self ~general; + give GURTH_GUSPlatform2 general; + ORANGELINE_dir = 1; + ORANGELINE_loc = 2; + ORANGELINE_car.n_to = GURTH_GUSPlatform2; + ORANGELINE_car.out_to = GURTH_GUSPlatform2; + "^The train suddenly lurches to a stop! A voice from \ + somewhere overhead says ~Gurth City station, watch your \ + step please.~"; + } + if (ORANGELINE_loc == 2) { + ! still in Gurth, not moving + ORANGELINE_loc = 3; + "^A voice overhead says ~Doors will be closing, please \ + stand clear.~"; + } + if (ORANGELINE_loc == 3) { + if (ORANGELINE_dir == 1) { + ! moving away from Gurth + give self general; + give GURTH_GUSPlatform2 ~general; + ORANGELINE_loc = 4; + "^The train starts to move, quickly exiting the station \ + going east."; + } + if (ORANGELINE_dir == 0) { + ! moving towards Gurth + ORANGELINE_loc = 1; ! We will 'arrive' in Gurth next + "^The train rumbles as it moves."; + } + } + if (ORANGELINE_loc == 4) { + if (ORANGELINE_dir == 0) { + ! We're leaving Anthar + ORANGELINE_loc = 3; + give self general; + give ANTHAR_GUSPlatform ~general; + "^The train starts to move, quickly exiting the station \ + going west."; + } + if (ORANGELINE_dir == 1) { + ORANGELINE_loc = 5; + "^The train rumbles as it moves."; + } + } + if (ORANGELINE_loc == 5) { + ! reached Anthar, stop the train + give self ~general; + give ANTHAR_GUSPlatform general; + ORANGELINE_loc = 6; ! we'll be stopping for 1 turn + ORANGELINE_car.n_to = ANTHAR_GUSPlatform; + ORANGELINE_car.out_to = ANTHAR_GUSPlatform; + "^The train suddenly lurches to a stop! A voice from \ + somewhere overhead says ~Greater Anthar station, watch your \ + step please.~"; + } + if (ORANGELINE_loc == 6) { + ! about to leave Anthar station + if (ORANGELINE_dir == 0) + ORANGELINE_loc = 4; + else + ORANGELINE_loc = 7; + "^A voice overhead says ~Doors will be closing, please \ + stand clear.~"; + } + if (ORANGELINE_loc == 7) { + if (ORANGELINE_dir == 1) { + ! We're leaving Anthar + ORANGELINE_loc = 8; + give self general; + give ANTHAR_GUSPlatform ~general; + "^The train starts to move, quickly exiting the station \ + going east."; + } + if (ORANGELINE_dir == 0) { + ORANGELINE_loc = 5; ! we will arrive in anthar shortly... + "^The train rumbles as it moves."; + } + } + if (ORANGELINE_loc == 8) { + if (ORANGELINE_dir == 0) { + ! we're leaving Aragain + ORANGELINE_loc = 7; + give self general; + give ARAGAIN_GUSPlatform2 ~general; + "^The train starts to move, quickly exiting the station \ + going west."; + } + if (ORANGELINE_dir == 1) { + ORANGELINE_loc = 9; ! will arrive in Aragain + "^The train rumbles as it moves."; + } + } + if (ORANGELINE_loc == 10) { + ! still waiting in Aragain + ORANGELINE_loc = 8; + "^A voice overhead says ~Doors will be closing, please \ + stand clear.~"; + } + if (ORANGELINE_loc == 9) { + ! arriving in Aragain + ORANGELINE_loc = 10; + ORANGELINE_dir = 0; ! west + give self ~general; + give ARAGAIN_GUSPlatform2 general; + ORANGELINE_car.n_to = ARAGAIN_GUSPlatform2; + ORANGELINE_car.out_to = ARAGAIN_GUSPlatform2; + "^The train suddenly lurches to a stop! A voice from \ + somewhere overhead says ~Aragain station, watch your \ + step please.~"; + } + ], + has light; + +Object ORANGELINE_car_seats "subway seat" ORANGELINE_car + class Train_Car_Seat_Class + with before [; + Search: + if (self hasnt general) { + give self general; + move c10 to player; + "Good fortune is your friend! You notice a \ +forgotten coin stuck in a seat crack, and fend off two \ +passengers to grab it."; + } + ], +; + + +! *** GREEN LINE (Borphee to Miznia) + +Object GREENLINE_car "Subway car" + with description "You are in an underground train car. Various \ + people fill the train, some in uncomfortable-looking seats.", + name "car" "people", + e_to BORPHEE_GUSPlatform, ! we adjust this, see below + out_to BORPHEE_GUSPlatform, + after [; + Go: + if (noun == w_obj or in_obj) { + ! determine boarding location, direction train was + ! traveling + give self general; ! we're off and moving + print "^You shove your way onto train car. The doors close behind you.^"; + if (GREENLINE_loc == 1 or 2) { + ! Borphee, south + give BORPHEE_GUSPlatform ~general; + GREENLINE_loc = 3; ! leaving + } + if (GREENLINE_loc == 5 or 6) { + ! Gurth + give GURTH_GUSPlatform ~general; + if (GREENLINE_dir == 1) { + ! South + GREENLINE_loc = 7; + } + else { + ! North + GREENLINE_loc = 4; + } + } + if (GREENLINE_loc == 9 or 10) { + ! Miznia, north + give MIZNIA_GUSPlatform ~general; + GREENLINE_loc = 8; + } + } + ], + before [; + Go: + if (noun == e_obj or out_obj) { + if (self has general) + "The train is moving right now. Better wait til \ + it stops to get off."; + if (yupple in self) + "As you try to get off, the yupple jumps up and gets in your \ + way. ~Wait, wait, we have so much to talk about!~."; + } + ], + each_turn [; + ! check location of train, print appropriate msg, + ! and increment location of train, given direction + if (GREENLINE_loc == 1) { + ! reached Borphee, dir = S, not moving + give self ~general; + give BORPHEE_GUSPlatform general; + GREENLINE_dir = 1; + GREENLINE_loc = 2; + GREENLINE_car.e_to = BORPHEE_GUSPlatform; + GREENLINE_car.out_to = BORPHEE_GUSPlatform; + "^The train suddenly lurches to a stop! A voice from \ + somewhere overhead says ~New Borphee station, watch your \ + step please.~"; + } + if (GREENLINE_loc == 2) { + ! still in Borphee, not moving + GREENLINE_loc = 3; + "^A voice overhead says ~Doors will be closing, please \ + stand clear.~"; + } + if (GREENLINE_loc == 3) { + if (GREENLINE_dir == 1) { + ! moving away from Borphee + give self general; + give BORPHEE_GUSPlatform ~general; + GREENLINE_loc = 4; + "^The train starts to move, quickly exiting the station \ + going south."; + } + if (GREENLINE_dir == 0) { + ! moving towards BORPHEE + GREENLINE_loc = 1; + "^The train rumbles as it moves."; + } + } + if (GREENLINE_loc == 4) { + if (GREENLINE_dir == 0) { + ! We're leaving gurth + GREENLINE_loc = 3; + give self general; + give GURTH_GUSPlatform ~general; + "^The train starts to move, quickly exiting the station \ + going north."; + } + if (GREENLINE_dir == 1) { + GREENLINE_loc = 5; + "^The train rumbles as it moves."; + } + } + if (GREENLINE_loc == 5) { + ! reached Gurth, stop the train + give self ~general; + give GURTH_GUSPlatform general; + GREENLINE_loc = 6; ! we'll be stopping for 1 turn + GREENLINE_car.e_to = GURTH_GUSPlatform; + GREENLINE_car.out_to = GURTH_GUSPlatform; + "^The train suddenly lurches to a stop! A voice from \ + somewhere overhead says ~Gurth City station, watch your \ + step please.~"; + } + if (GREENLINE_loc == 6) { + ! about to leave gurth station + if (GREENLINE_dir == 0) + GREENLINE_loc = 4; + else + GREENLINE_loc = 7; + "^A voice overhead says ~Doors will be closing, please \ + stand clear.~"; + } + if (GREENLINE_loc == 7) { + if (GREENLINE_dir == 1) { + ! We're leaving gurth + GREENLINE_loc = 8; + give self general; + give GURTH_GUSPlatform ~general; + "^The train starts to move, quickly exiting the station \ + going south."; + } + if (GREENLINE_dir == 0) { + GREENLINE_loc = 5; ! we will arrive in gurth shortly... + "^The train rumbles as it moves."; + } + } + if (GREENLINE_loc == 8) { + if (GREENLINE_dir == 0) { + ! we're leaving Miznia + GREENLINE_loc = 7; + give self general; + give MIZNIA_GUSPlatform ~general; + "^The train starts to move, quickly exiting the station \ + going north."; + } + if (GREENLINE_dir == 1) { + GREENLINE_loc = 9; + "^The train rumbles as it moves."; + } + } + if (GREENLINE_loc == 10) { + ! still waiting in Miznia + GREENLINE_loc = 8; + "^A voice overhead says ~Doors will be closing, please \ + stand clear.~"; + } + if (GREENLINE_loc == 9) { + ! arriving in Miznia + GREENLINE_loc = 10; + GREENLINE_dir = 0; ! north + give self ~general; + give MIZNIA_GUSPlatform general; + GREENLINE_car.e_to = MIZNIA_GUSPlatform; + GREENLINE_car.out_to = MIZNIA_GUSPlatform; + "^The train suddenly lurches to a stop! A voice from \ + somewhere overhead says ~Miznia station, watch your \ + step please.~"; + } + ], + has light; + +Object GREENLINE_car_seats "subway seat" GREENLINE_car + class Train_Car_Seat_Class + with before [; + Search: + if (self hasnt general) { + give self general; + move c11 to player; + "Good fortune is your friend! You notice a \ +forgotten coin stuck in a seat crack, and fend off two \ +passengers to grab it."; + } + ], +; + + +! *** A fake scenery item, to describe the subway cars from outside *** +Object subway_car_fake "subway car" + with name "car" "train", + description [; + print "It's a rather large, sleek-looking train car, oddly colored "; + if (((location==FROSTHAM_GUSPlatform) && (FROSTHAM_GUSPlatform has general)) || + ((location==ARAGAIN_GUSPlatform) && (ARAGAIN_GUSPlatform has general)) || + ((location==FUBLIO_GUSPlatform) && (FUBLIO_GUSPlatform has general))) + "purple."; + if (((location==ANTHAR_GUSPlatform) && (ANTHAR_GUSPlatform has general)) || + ((location==ARAGAIN_GUSPlatform2) && (ARAGAIN_GUSPlatform2 has general)) || + ((location==GURTH_GUSPlatform2) && (GURTH_GUSPlatform2 has general))) + "orange."; + if (((location==BORPHEE_GUSPlatform) && (BORPHEE_GUSPlatform has general)) || + ((location==GURTH_GUSPlatform) && (GURTH_GUSPlatform has general)) || + ((location==MIZNIA_GUSPlatform) && (MIZNIA_GUSPlatform has general))) + "green."; + "You can't see any such thing."; + ], + found_in FROSTHAM_GUSPlatform ARAGAIN_GUSPlatform FUBLIO_GUSPlatform + ANTHAR_GUSPlatform ARAGAIN_GUSPlatform2 GURTH_GUSPlatform2 + BORPHEE_GUSPlatform GURTH_GUSPlatform MIZNIA_GUSPlatform, + before [; + Enter: + "A subway nymph suddenly appears. ~Remember passengers, to \ + board the subway cars, you just have to go 'in', or in the \ + appropriate direction of the car. Bye!~"; + ], + has scenery; + +Object metal_fence "metal fence" + with name "fence" "barricade", + description "It looks like a smooth metal fence.", + before [; + Climb, JumpOver: + "A subway worker yells ~Hey pal, no fare-jumpers!"; + ], + found_in FROSTHAM_GUSPlatform ARAGAIN_GUSPlatform FUBLIO_GUSPlatform + FROSTHAM_GUSStation ARAGAIN_GUSStation FUBLIO_GUSStation + ANTHAR_GUSPlatform BORPHEE_GUSPlatform GURTH_GUSPlatform MIZNIA_GUSPlatform + ANTHAR_GUSStation BORPHEE_GUSStation GURTH_GUSStation MIZNIA_GUSStation, + has scenery; + + +! ************************** +! People/denizens/creatures +! ************************** + +! Thug, on PURPLE LINE +Object thug "sinister-looking thug" PURPLELINE_car + with name "thug" "hoodlum" "Davey", + description "A thug, clearly. Some scrapper with an attitude, \ + and the desire to use it.", + each_turn [ i ; + if (self hasnt general) { + give self general; + "^The sinister-looking thug notices you from the back \ + of the car, and approaches. ~Well, well, well,~ he \ + says, ~what do we have here?~."; + } + i = random(4); + if (i==1) + "^The thug pokes you in the ribs."; + if (i==2) + "^The thug snarls at you. ~Hey, I'm talking to you, \ + Preacher-man.~"; + if (i==3) + "^The thug tries to act friendly, and fails."; + if (i==4) + "^The thug scowls. ~You gonna tell me the error of \ + my ways, Padre?~"; + ], + life [; + Attack: + "As you move to show the rake a lesson, you notice \ + several more thugs in the background, eyeing your every \ + move. The thug smiles as you back-off, cautiously."; + default: "The thug is too busy being sinister."; + ], + before [; + Cast: + if (the_spell_was == espnis_spell) { + remove thug; + "You begin to extol the virtues of bedtime prayers, \ + and the thug starts to yawn. Soon, his eyes blink \ + slowly, and before long, he nods off to sleep! Two \ + subway police officers, hiding until now, get up the \ + nerve to capture the snoring thug, and drag him \ + off, disappearing into the throng of people."; + } + if (the_spell_was == foblub_spell) { + "You give the thug a timely sermon on the \ +folly of crime in a moral society. He seems momentarily \ +fascinated. Too bad he wasn't actually sitting in anything."; + } + ], + has animate; + +! Annoying Yupple, on GREEN LINE (kinda a cross between a yuppie and a yipple) +Object yupple "annoying yupple" GREENLINE_car + with name "yupple" "annoying", + description "A young yupple, immaculately dressed in a pinstripe \ + three-piece suit and tie.", + article "an", + each_turn [ i ; + if (self hasnt general) { + give self general; + "^The annoying-looking yupple notices you from the back \ + of the car, and approaches. ~A priest,~ he \ + says, ~Just the person I was looking for.~ He \ + squeezes into a seat near you."; + } + i = random(4); + if (i==1) + "^The yupple talks unceasingly about rainfall in some \ + place called ~the Amazon basin~."; + if (i==2) + "^The yupple smiles brightly. ~There's so much I have to \ + talk about!~"; + if (i==3) + "^The yupple drones on about the science behind large \ + corporate takeovers."; + if (i==4) + "^The yupple laughs -- a sound somewhat like a snoring \ + bloodworm. ~So the guy says, 'I thought you meant my _wife_.' \ + Get it? Wife?~"; + ], + life [; + Attack: + "Much as you'd like to, that's just something the \ + Order would probably frown upon."; + ], + before [; + Cast: + if (the_spell_was == espnis_spell) { + "You give a sermon on the dangers of \ +improper bathtub caulking, but the yupple seems quite \ +fascinated. ~That reminds me of...~ You cringe."; + } + if (the_spell_was == foblub_spell) { + remove self; + "You draw a stunning parallel between corporate \ +morality and monarchy ruling. The yupple's jaw drops. ~I've got \ +to tell my boss that,~ he says, and tries to leave his seat, \ +but finds himself stuck fast. Several passengers nearby \ +take the opportunity to remove the yupple (seat included) to \ +a different part of the train."; + } + ], + has animate; + + +! ************************** +! misc objects +! ************************** + +Object c9 "coin" class coin_class; +Object c10 "coin" class coin_class; +Object c11 "coin" class coin_class; + +! (Some common objects associated with GUS) +Object GUS_sign "Sign" + with name "sign" "circular" "pole" "GUS", + initial "Standing on a tall pole next to the stairs is \ + a circular sign.", + description "The sign reads ~GUS~, and has an arrow \ + pointing down.", + found_in FROSTHAM_GUSStop ARAGAIN_GUSStop ANTHAR_GUSStop + FUBLIO_GUSStop BORPHEE_GUSStop MIZNIA_GUSStop + GURTH_GUSStop, + has static; + + +Object GUS_brochure "subway brochure" FROSTHAM_Governer1 + with name "brochure" "subway" "GUS", + description "\ + ~The Great Underground Subway~^^ + Adventurers who really need to get where they're going \ + in a hurry are going to love GUS! The new underground \ + high-speed rail system can be your personal ride to the \ + major travel points in Quendor, for just one mere zorkmid! \ + For Eastland travel to Frostham, Aragain and Fublio Valley, \ + the Purple line is at your service! For Westland travel \ + to New Borphee, Gurth City and Miznia, just jump on board \ + the Green line! And for you folks who need to get across \ + the Great Sea in a hurry, don't forget the Orange line, \ + stopping off at Aragain, Anthar and Gurth City! Remember, \ + there's no costs for transferring between lines either. \ + So don't delay, take the GUS today!", + ! weight 5, + size 10, +; + +Object newspaper "newspaper" PURPLELINE_car + with name "newspaper" "paper", + initial "There's a discarded newspaper in a seat nearby.", + description "A copy of ~The Fublio Tribune~, with \ + news, sports and feature sections to read about.", + before + [ w1; Consult: + if (consult_words > 1) + "Try reading about 'news', 'sports' or 'features'."; + wn = consult_from; w1 = NextWord(); + switch (w1) { + 'news', 'headline', 'headlines': + "The news section has three major stories. \ +The headliner is the continued failure to resolve peace in the \ +Kobold war in southern Egreth. Recently, various troops have \ +been cut-off from the main camps by clever kobold raiding groups. \ +^^A second story details the shocking death of a GUE Tech student \ +found in the subway tunnels in Gurth City Station, the apparent \ +victim of a GUS train. ~Don't know how he got in there.~ a \ +subway worker is quoted as saying.^^\ +Finally, a sad local news story about a nice couple in Fublio \ +valley who recently were victims of the kidnaping of their son. No \ +leads as of yet."; + 'sports': + "Apparently, the golem brothers at Flathead \ +Stadium have amassed an amazing 322-0 win streak."; + 'features', 'feature': + "The paper points out that culture seekers \ +should check out the newly discovered Leonardo Flathead \ +painting on exhibit at the Royal Museum."; + 'ads', 'classified': + "~FOR SALE: A new IF game -- 'SPIRITWRAK'. \ + Price: $0.00~"; + 'comics', 'funnies': + "No comics section. Bummer."; + default: "You can't find anything in the paper about that."; + } + ], + ! weight 15, + size 15, +; + +! ************************** +! spells & scrolls +! **************************