X-Git-Url: https://jxself.org/git/?a=blobdiff_plain;f=examples%2FFate.inf;fp=examples%2FFate.inf;h=71d600a3beb08cc2214fbaaf312db552bcbc7d6e;hb=20e7eefa72ab3605b911912abf122d03f216470f;hp=0000000000000000000000000000000000000000;hpb=7149f9762ee9b58ce18f377e65d3ee9c5098c69b;p=ibg.git diff --git a/examples/Fate.inf b/examples/Fate.inf new file mode 100644 index 0000000..71d600a --- /dev/null +++ b/examples/Fate.inf @@ -0,0 +1,741 @@ +!% -SD + +!============================================================================ +Constant Story "Captain Fate"; +Constant Headline + "^A simple Inform example + ^by Roger Firth and Sonja Kesserich.^"; +!Release 1; Serial "020428"; ! IBG first edition (public beta) +!Release 2; Serial "020827"; ! IBG second edition +Release 3; Serial "040804"; ! for keeping track of public releases + +Constant MANUAL_PRONOUNS; +Constant MAX_SCORE 2; +Constant OBJECT_SCORE 1; +Constant ROOM_SCORE 1; + +Replace MakeMatch; ! required by pname.h +Replace Identical; +Replace NounDomain; +Replace TryGivenObject; + +Include "Parser"; +Include "pname"; ! pname.h is from the Archive + +Object LibraryMessages ! must be defined between Parser and VerbLib + with before [; + Buy: "Petty commerce interests you only on COUNTED occasions."; + Dig: "Your keen senses detect NOTHING underground worth your + immediate attention."; + Pray: "You won't need to bother almighty DIVINITIES to save + the day."; + Sing: "Alas! That is not one of your many superpowers."; + Sleep: "A hero is ALWAYS on the watch."; + Sorry: "Captain FATE prefers ACTION over apologies."; + Strong: "An unlikely vocabulary for a HERO like you."; + Swim: "You quickly turn all your ATTENTION towards locating a + suitable place to EXERCISE your superior strokes, + but alas! you find none."; + Miscellany: + if (lm_n == 19) + if (clothes has worn) + "In your secret identity's outfit, you manage most + efficaciously to look like a two-cent loser, a + good-for-nothing wimp."; + else + "Now that you are wearing your costume, you project + the image of power UNBOUND, of ballooned, + multicoloured MUSCLE, of DASHING yet MODEST chic."; + if (lm_n == 38) + "That's not a verb you need to SUCCESSFULLY save the day."; + if (lm_n == 39) + "That's not something you need to refer to in order to + SAVE the day."; + ]; + +Include "VerbLib"; + +!============================================================================ +! Object classes + +Class Room + with description "UNDER CONSTRUCTION", + has light; + +Class Appliance + with before [; + Take,Pull,Push,PushDir: + "Even though your SCULPTED adamantine muscles are up to the task, + you don't favour property damage."; + ], + has scenery; + +!============================================================================ +! The game objects + +Room street "On the street" + with name 'city' 'buildings' 'skyscrapers' 'shops' 'apartments' 'cars', + description [; + if (player in booth) + "From this VANTAGE point, you are rewarded with a broad view + of the sidewalk and the entrance to Benny's cafe."; + else + "On one side -- which your HEIGHTENED sense of direction + indicates is NORTH -- there's an open cafe now serving + lunch. To the south, you can see a phone booth."; + ], + before [; + Go: + if (player in booth && noun == n_obj) <>; + ], + n_to [; <>; ], + s_to [; <>; ], + in_to "But which way?", + cant_go + "No time now for exploring! You'll move much faster in your + Captain FATE costume."; + +Object "pedestrians" street + with name 'passing' 'people' 'pedestrians', + description + "They're just PEOPLE going about their daily HONEST business.", + before [; + Examine: + return false; + default: + "The passing pedestrians are of NO concern to you."; + ], + has animate pluralname scenery; + +Appliance booth "phone booth" street + with name 'old' 'red' 'picturesque' 'phone' 'booth' 'cabin' + 'telephone' 'box', + description + "It's one of the old picturesque models, a red cabin with room + for one caller.", + before [; + Open: + "The booth is already open."; + Close: + "There's no way to close this booth."; + ], + after [; + Enter: + "With implausible celerity, you dive inside the phone booth."; + ], + has enterable container open; + +Appliance "sidewalk" street + with name 'sidewalk' 'pavement' 'street', + article "the", + description + "You make a quick surveillance of the sidewalk and discover much + to your surprise that it looks JUST like any other sidewalk in + the CITY!"; + +Appliance outside_of_cafe "Benny's cafe" street + with name 'benny^s' 'cafe' 'entrance', + description + "The town's favourite for a quick snack, Benny's cafe has a 50's + ROCKETSHIP look.", + before [; + Enter: + print "With an impressive mixture of hurry and nonchalance you + step into the open cafe.^"; + PlayerTo(cafe); + return true; + ], + has enterable proper; + +!---------------------------------------------------------------------------- + +Room cafe "Inside Benny's cafe" + with description + "Benny's offers the FINEST selection of pastries and sandwiches. + Customers clog the counter, where Benny himself manages to + serve, cook and charge without missing a step. At the north side + of the cafe you can see a red door connecting with the toilet.", + before [; + Go: ! The player is about to depart. Is he making for the street? + if (noun ~= s_obj) return false; + if (benny.coffee_not_paid == true || + benny.key_not_returned == true) { + print "Just as you are stepping into the street, the big hand + of Benny falls on your shoulder."; + if (benny.coffee_not_paid == true && + benny.key_not_returned == true) + "^^~Hey! You've got my key and haven't paid for the + coffee. Do I look like a chump?~ You apologise as only a + HERO knows how to do and return inside."; + if (benny.coffee_not_paid == true) + "^^~Just waidda minute here, Mister,~ he says. + ~Sneaking out without paying, are you?~ You quickly + mumble an excuse and go back into the cafe. Benny + returns to his chores with a mistrusting eye."; + if (benny.key_not_returned == true) + "^^~Just where you think you're going with the toilet + key?~ he says. ~You a thief?~ As Benny forces you back + into the cafe, you quickly assure him that it was only + a STUPEFYING mistake."; + } + if (costume has worn) { + deadflag = 5; ! you win! + "You step onto the sidewalk, where the passing pedestrians + recognise the rainbow EXTRAVAGANZA of Captain FATE's costume + and cry your name in awe as you JUMP with sensational + momentum into the BLUE morning skies!"; + } + ], + first_time_out false, ! Captain Fate's first appearance? + after [; + Go: ! The player has just arrived. Did he come from the toilet? + if (noun ~= s_obj) return false; + if (costume has worn && self.first_time_out == false) { + self.first_time_out = true; + StartDaemon(customers); + } + ], + s_to street, + n_to toilet_door; + +Appliance counter "counter" cafe + with name 'counter' 'bar', + article "the", + description + "The counter is made of an astonishing ALLOY of metals, + STAIN-PROOF, SPILL-RESISTANT and VERY EASY to clean. Customers + enjoy their snacks with UTTER tranquillity, safe in the notion + that the counter can take it all.", + before [; + Receive: + <>; + ], + has supporter; + +Object food "Benny's snacks" cafe + with name 'food' 'pastry' 'pastries' 'sandwich' 'sandwiches' 'snack' + 'snacks' 'doughnut', + before [; "There is no time for FOOD right now."; ], + has scenery proper; + +Object menu "menu" cafe + with name 'informative' 'menu' 'board' 'picture' 'writing', + description + "The menu board lists Benny's food and drinks, along with their + prices. Too bad you've never learnt how to read, but luckily + there is a picture of a big cup of coffee among the + incomprehensible writing.", + before [; + Take: + "The board is mounted on the wall behind Benny. Besides, it's + useless WRITING."; + ], + has scenery; + +Object customers "customers" cafe + with name 'customers' 'people' 'customer' 'men' 'women', + description [; + if (costume has worn) + "Most seem to be concentrating on their food, but some do + look at you quite blatantly. Must be the MIND-BEFUDDLING + colours of your costume."; + else + "A group of HELPLESS and UNSUSPECTING mortals, the kind + Captain FATE swore to DEFEND the day his parents choked on a + DEVIOUS slice of RASPBERRY PIE."; + ], + life [; + Ask,Tell,Answer: + if (costume has worn) + "People seem to MISTRUST the look of your FABULOUS costume."; + else + "As John Covarth, you attract LESS interest than Benny's + food."; + Kiss: + "There's no telling what sorts of MUTANT bacteria these + STRANGERS may be carrying around."; + Attack: + "Mindless massacre of civilians is the qualification for + VILLAINS. You are SUPPOSED to protect the likes of these + people."; + ], + orders [; + "These people don't appear to be of the cooperative sort."; + ], + number_of_comments 0, ! for counting the customer comments + daemon [; + if (location ~= cafe) return; + if (self.number_of_comments == 0) { + self.number_of_comments = 1; + print "^Nearby customers glance at your costume with open + curiosity.^"; + } + if (random(2) == 1) { ! do this 50% of the time + self.number_of_comments = self.number_of_comments + 1; + switch (self.number_of_comments) { + 2: "^~Didn't know there was a circus in town,~ comments one + customer to another. ~Seems like the clowns have the + day off.~"; + 3: "^~These fashion designers don't know what to do to show + off,~ snorts a fat gentleman, looking your way. Those + within earshot try to conceal their smiles."; + 4: "^~Must be carnival again,~ says a man to his wife, who + giggles, stealing a peek at you. ~Time sure flies.~"; + 5: "^~Bad thing about big towns~, comments someone to his + table companion, ~is you get the damnedest bugs coming + out from toilets.~"; + 6: "^~I sure WISH I could go to work in my pyjamas,~ says a + girl in an office suit to some colleagues. ~It looks SO + comfortable.~"; + default: StopDaemon(self); + } + } + ], + has scenery animate pluralname; + +Object benny "Benny" cafe + with name 'benny', + description + "A deceptively FAT man of uncanny agility, Benny entertains his + customers crushing coconuts against his forehead when the mood + strikes him.", + coffee_asked_for false, ! has player asked for a coffee? + coffee_not_paid false, ! is Benny waiting to be paid? + key_not_returned false, ! is Benny waiting for the key? + life [; + Give: + switch (noun) { + clothes: + "You NEED your unpretentious John Covarth clothes."; + costume: + "You NEED your stupendous ACID-PROTECTIVE suit."; + toilet_key: + self.key_not_returned = false; + move toilet_key to benny; + "Benny nods as you ADMIRABLY return his key."; + coin: + remove coin; + self.coffee_not_paid = false; + print "With marvellous ILLUSIONIST gestures, you produce the + coin from the depths of your "; + if (costume has worn) print "BULLET-PROOF costume"; + else print "ordinary street clothes"; + " as if it had dropped on the counter from Benny's ear! + People around you clap politely. Benny takes the coin + and gives it a SUSPICIOUS bite. ~Thank you, sir. Come + back anytime,~ he says."; + } + Attack: + if (costume has worn) { + deadflag = 4; + print "Before the horror-stricken eyes of the surrounding + people, you MAGNIFICENTLY jump OVER the counter and + attack Benny with REMARKABLE, albeit NOT sufficient, + speed. Benny receives you with a TREACHEROUS upper-cut + that sends your GRANITE JAW flying through the cafe.^^ + ~These guys in pyjamas think they can bully innocent + folk,~ snorts Benny, as the EERIE hands of DARKNESS + engulf your vision and you lose consciousness."; + } + else + "That would be an unlikely act for MEEK John Covarth."; + Kiss: + "This is no time for MINDLESS infatuation."; + Ask,Tell,Answer: + "Benny is too busy for idle chit-chat."; + ], + orders [; ! handles ASK BENNY FOR X and BENNY, GIVE ME XXX + Give: + if (second ~= player or nothing) "Benny looks at you strangely."; + switch (noun) { + toilet_key: + if (toilet_key in player) "But you DO have the key already."; + if (self.coffee_asked_for == true) + if (toilet_key in self) { + move toilet_key to player; + self.key_not_returned = true; + "Benny tosses the key to the rest rooms on the + counter, where you grab it with a dextrous and + precise movement of your HYPER-AGILE hand."; + } + else + "~Last place I saw that key, it was in YOUR + possession,~ grumbles Benny. ~Be sure to return it + before you leave.~"; + else + "~Toilet is only fer customers,~ he grumbles, looking + pointedly at a menu board behind him."; + coffee: + if (self.coffee_asked_for == true) + "One coffee should be enough."; + move coffee to counter; + self.coffee_asked_for = self.coffee_not_paid = true; + "With two gracious steps, Benny places his world-famous + Cappuccino in front of you."; + food: + "Food will take too much time, and you must change NOW."; + menu: + "With only the smallest sigh, Benny nods towards the menu + on the wall behind him."; + default: + "~I don't think that's on the menu, sir.~"; + } + ], + has scenery animate male proper transparent; + +Object coffee "cup of coffee" benny + with name 'cup' 'of' 'coffee' 'steaming' 'cappuccino' + 'cappucino' 'capuccino' 'capucino', + description [; + if (self in benny) + "The picture on the menu board SURE looks good."; + else + "It smells delicious."; + ], + before [; + Take,Drink,Taste: + if (self in benny) "You should ask Benny for one first."; + else { + move self to benny; + print "You pick up the cup and swallow a mouthful. Benny's + WORLDWIDE REPUTATION is well deserved. Just as you + finish, Benny takes away the empty cup."; + if (benny.coffee_not_paid == true) + " ~That will be one quidbuck, sir.~"; + else + ""; + } + Buy: + if (coin in player) <>; + else "You have no money."; + Smell: + "If your HYPERACTIVE pituitary glands are to be trusted, + it's Colombian."; + ]; + +Object outside_of_toilet "toilet" cafe + with name 'toilet' 'bath' 'rest' 'room' 'bathroom' 'restroom', + before [; + Enter: + if (toilet_door has open) { + PlayerTo(toilet); + return true; + } + else + "Your SUPERB deductive mind detects that the DOOR is + CLOSED."; + Examine: + if (toilet_door has open) + "A brilliant thought flashes through your SUPERLATIVE + brain: detailed examination of the toilet would be + EXTREMELY facilitated if you entered it."; + else + "With a TREMENDOUS effort of will, you summon your + unfathomable ASTRAL VISION and project it FORWARD towards + the closed door... until you remember that it's + Dr Mystere who's the one with mystic powers."; + Open: + <>; + Close: + <>; + Take,Push,Pull: + "That would be PART of the building."; + ], + has scenery openable enterable; + +Object toilet_door + with pname '.x' 'red' '.x' 'toilet' 'door', + short_name [; + if (location == cafe) print "door to the toilet"; + else print "door to the cafe"; + return true; + ], + description [; + if (location == cafe) + "A red door with the unequivocal black man-woman silhouettes + marking the entrance to hygienic facilities. There is a + scribbled note stuck on its surface."; + else + "A red door with no OUTSTANDING features."; + ], + found_in cafe toilet, + before [ ks; + Open: + if (self hasnt locked || toilet_key notin player) return false; + ks = keep_silent; keep_silent = true; + ; keep_silent = ks; + return true; + Lock: + if (self hasnt open) return false; + print "(first closing ", (the) self, ")^"; + ks = keep_silent; keep_silent = true; + ; keep_silent = ks; + return false; + ], + after [ ks; + Unlock: + if (self has locked) return false; + print "You unlock ", (the) self, " and open it.^"; + ks = keep_silent; keep_silent = true; + ; keep_silent = ks; + return true; + Open: + give toilet light; + Close: + give toilet ~light; + ], + door_dir [; + if (location == cafe) return n_to; + else return s_to; + ], + door_to [; + if (location == cafe) return toilet; + else return cafe; + ], + with_key toilet_key, + has scenery door openable lockable locked; + +Object toilet_key "toilet key" benny + with pname '.x' 'toilet' 'key', + article "the", + invent [; + if (clothes has worn) print "the CRUCIAL key"; + else print "the used and IRRELEVANT key"; + return true; + ], + description + "Your SUPRA PERCEPTIVE senses detect nothing of consequence + about the toilet key.", + before [; + if (self in benny) + "You SCAN your surroundings with ENHANCED AWARENESS, + but fail to detect any key."; + Drop: + "Benny is trusting you to look after that key."; + ]; + +Object "scribbled note" cafe + with name 'scribbled' 'note', + description [; + if (self.read_once == false) { + self.read_once = true; + "You apply your ENHANCED ULTRAFREQUENCY vision to the note + and squint in concentration, giving up only when you see the + borders of the note begin to blacken under the incredible + intensity of your burning stare. You reflect once more how + helpful it would've been if you'd ever learnt to read. + ^^A kind old lady passes by and explains: + ~You have to ask Benny for the key, at the counter.~^^ + You turn quickly and begin, ~Oh, I KNOW that, but...~^^ + ~My pleasure, son,~ says the lady, as she exits the cafe."; + } + else + "The scorched undecipherable note holds no SECRETS from + you NOW! Ha!"; + ], + read_once false, ! has the player read the note once? + before [; + Take: + "No reason to start collecting UNDECIPHERABLE notes."; + ], + has scenery; + +!---------------------------------------------------------------------------- + +Room toilet "Unisex toilet" + with description + "A surprisingly CLEAN square room covered with glazed-ceramic + tiles, featuring little more than a lavatory and a light switch. + The only exit is south, through the door and into the cafe.", + s_to toilet_door, + has ~light scored; + +Appliance light_switch "light switch" toilet + with name 'light' 'switch', + description + "A notorious ACHIEVEMENT of technological SCIENCE, elegant yet + EASY to use.", + before [; + Push: + if (self has on) <>; + else <>; + ], + after [; + SwitchOn: + give self light; + "You turn on the light in the toilet."; + SwitchOff: + give self ~light; + "You turn off the light in the toilet."; + ], + has switchable ~on; + +Appliance lavatory "lavatory" toilet + with name 'lavatory' 'wc' 'toilet' 'loo' 'bowl' 'can' 'john' 'bog', + before [; + Examine,Search,LookUnder: + if (coin in self) { + move coin to parent(self); + "The latest user CIVILLY flushed it after use, but failed to + pick up the VALUABLE coin that fell from his pants."; + } + Receive: + "While any other MORTALS might unwittingly throw just about + ANYTHING into ", (the) self, ", you remember the WISE teachings + of your mentor, Duke ELEGANT, about elderly plumbing and rising + waters."; + ]; + +Object coin "valuable coin" lavatory + with name 'valuable' 'coin' 'silver' 'quidbuck', + description "It's a genuine SILVER QUIDBUCK.", + before [; + Drop: + if (self notin player) return false; + "Such a valuable coin? Har, har! This must be a demonstration of + your ULTRA-FLIPPANT jesting!"; + ], + after [; + Take: + "You crouch into the SLEEPING DRAGON position and deftly, with + PARAMOUNT STEALTH, you pocket the lost coin."; + ], + has scored; + +!============================================================================ +! The player's possessions + +Object clothes "your clothes" + with name 'ordinary' 'street' 'clothes' 'clothing', + description + "Perfectly ORDINARY-LOOKING street clothes for a NOBODY like + John Covarth.", + before [; + Wear: + if (self has worn) + "You are already dressed as John Covarth."; + else + "The town NEEDS the power of Captain FATE, not the anonymity + of John Covarth."; + Change,Disrobe: + if (self hasnt worn) + "Your KEEN eye detects that you're no longer wearing them."; + switch (location) { + street: + if (player in booth) + "Lacking Superman's super-speed, you realise that it + would be awkward to change in plain view of the passing + pedestrians."; + else + "In the middle of the street? That would be a PUBLIC + SCANDAL, to say nothing of revealing your secret + identity."; + cafe: + "Benny allows no monkey business in his establishment."; + toilet: + if (toilet_door has open) + "The door to the bar stands OPEN at tens of curious eyes. + You'd be forced to arrest yourself for LEWD conduct."; + print "You quickly remove your street clothes and bundle them + up together into an INFRA MINUSCULE pack ready for easy + transportation. "; + if (toilet_door has locked) { + give clothes ~worn; give costume worn; + "Then you unfold your INVULNERABLE-COTTON costume and + turn into Captain FATE, defender of free will, adversary + of tyranny!"; + } + else { + deadflag = 3; + "Just as you are slipping into Captain FATE's costume, + the door opens and a young woman enters. She looks at + you and starts screaming, ~RAPIST! NAKED RAPIST IN THE + TOILET!!!~^^ + Everybody in the cafe quickly comes to the rescue, only + to find you ridiculously jumping on one leg while trying + to get dressed. Their laughter brings a QUICK END to + your crime-fighting career!"; + } + thedark: + "Last time you changed in the dark, you wore the suit inside + out!"; + default: ! this _should_ never happen... + "There must be better places to change your clothes!"; + } + ], + has clothing proper pluralname; + +Object costume "your costume" + with name 'captain' 'captain^s' 'fate' 'fate^s' 'costume' 'suit', + description + "STATE OF THE ART manufacture, from chemically reinforced 100% + COTTON-lastic(tm).", + before [; + Wear: + if (self has worn) + "You are already dressed as Captain FATE."; + else + "First you'd have to take off your commonplace unassuming + John Covarth INCOGNITO street clothes."; + Change,Disrobe: + if (self has worn) + "You need to wear your costume to FIGHT crime!"; + else + "But you're not yet wearing it!"; + Drop: + "Your UNIQUE Captain FATE multi-coloured costume? The most + coveted clothing ITEM in the whole city? Certainly NOT!"; + ], + has clothing proper; + +!============================================================================ +! Entry point routines + +[ Initialise; + #Ifdef DEBUG; pname_verify(); #Endif; ! suggested by pname.h + location = street; + move costume to player; + move clothes to player; give clothes worn; + lookmode = 2; + "^^Impersonating mild mannered John Covarth, assistant help boy at an + insignificant drugstore, you suddenly STOP when your acute hearing + deciphers a stray radio call from the POLICE. There's some MADMAN + attacking the population in Granary Park! You must change into your + Captain FATE costume fast...!^^"; +]; + +[ DeathMessage; + if (deadflag == 3) print "Your secret identity has been revealed"; + if (deadflag == 4) print "You have been SHAMEFULLY defeated"; + if (deadflag == 5) print "You fly away to SAVE the DAY"; +]; + +[ InScope person item; + if (person == player && location == thedark && real_location == toilet) { + PlaceInScope(light_switch); + PlaceInScope(toilet_door); + } + if (person == player && location == thedark) + objectloop (item in parent(player)) + if (item has moved) PlaceInScope(item); + return false; +]; + +!============================================================================ +! Standard and extended grammar + +Include "Grammar"; + +[ ChangeSub; + if (noun has pluralname) print "They're"; + else print "That's"; + " not something you must change to save the day."; +]; + +Verb 'change' 'exchange' 'swap' 'swop' + * noun -> Change; + +Extend 'ask' + * creature 'for' topic -> AskFor; + +!============================================================================