Heidi.t
verze z: 4.11.2012
#charset "utf-8" /* * Copyright (c) 1999, 2002 by Michael J. Roberts. Permission is granted * to anyone to copy and use this file for any purpose. * * This is a starter TADS 3 source file. This is a complete TADS game * that you can compile and run. * * To compile this game in TADS Workbench, open the "Build" menu and * select "Compile for Debugging." To run the game, after compiling it, * open the "Debug" menu and select "Go." * * This is the "advanced" starter game - it has only the minimum set of * definitions needed for a working game. If you would like some more * examples, create a new game, and choose the "introductory" version when * asked for the type of starter game to create. */ /* * Include the main header for the standard TADS 3 adventure library. Note * that this does NOT include the entire source code for the library; this * merely includes some definitions for our use here. The main library * must be "linked" into the finished program by including the file * "adv3.tl" in the list of modules specified when compiling. In TADS * Workbench, simply include adv3.tl in the "Source Files" section of the * project. * * Also include the US English definitions, since this game is written in * English. */ #include <adv3.h> #include <cs_cz.h> /* * Our game credits and version information. This object isn't required * by the system, but our GameInfo initialization above needs this for * some of its information. * * IMPORTANT - You should customize some of the text below, as marked: the * name of your game, your byline, and so on. */ versionInfo: GameID IFID = '573a8b18-1008-ca66-9580-9a156f82eefa ' name = 'Další dobrodružství Heidi' byline = 'by An Author' htmlByline = 'by <a href="mailto:whatever@nospam.org"> ERIC EVE</a>' version = '3.0.16' authorEmail = 'ERIC EVE <whatever@nospam.org>' desc = 'Toto je jen nudná tutoriálová hra volně založená na The Adventures of Heidi od Rogera Firtha a Sonji Kesserichové.' htmlDesc = 'Toto je jen nudná tutoriálová hra volně založená na <i>The Adventures of Heidi</i> od Rogera Firtha a Sonji Kesserichové.' showCredit() { /* show our credits */ "Programovací jazyk TADS 3 a knihovna byla vytvořena Michaelem J. Robertsem.<.p> Původní <i>Adventures of Heidi</i> byla jednoduchá tutoriálová hra pro jazyk Inform napsaná Rogerem Firthem a Sonjou Kesserichovou."; /* * The game credits are displayed first, but the library will * display additional credits for library modules. It's a good * idea to show a blank line after the game credits to separate * them visually from the (usually one-liner) library credits that * follow. */ "\b"; } showAbout() { "<i>Další dobrodružství Heidi</i><.p> Výuková hra k TADS 3"; } ; /* * Define the player character. The name of this object is not important, * but note that it has to match up with the name we use in the main() * routine to initialize the game, below. * * Note that we aren't required to define any vocabulary or description * for this object, because the class Actor, defined in the library, * automatically provides the appropriate definitions for an Actor when * the Actor is serving as the player character. Note also that we don't * have to do anything special in this object definition to make the Actor * the player character; any Actor can serve as the player character, and * we'll establish this one as the PC in main(), below. */ me: Actor /* the initial location */ location = outsideCottage gender = 3 dobjFor(Row) { preCond = [touchObj] verify() { illogical('{Kdoco dobj} není něco, v čem by se dalo veslovat.'); } } ; + Wearable 'obyčejné slušivé modré šaty' 'modré šaty' *2 "Jsou sice celkem obyčejné, ale myslíš si o nich, že jsou celkem slušivé. " isPlural = true wornBy = me dobjFor(Doff) { check() { failCheck('Nemůžeš přece chodit po okolí svlečená! '); } } gcName = 'modrých šatů, modrým šatům, modré šaty, modrých šatech, modrými šaty' gcVocab = 'obyčejných obyčejným obyčejnými slušivých slušivým slušivými modrých modrým modrými šatů/šatům/šatech' ; /* * The only thing that HAS to be done in gameMain is to set the * initialPlayerChar, which can be called anything we like, but which is * normally (since it's the default) called me. * * In practice you'll normally want to override the showIntro() method as * well to display an introduction -- usually one that's rather more * substantial than than shown here. */ gameMain: GameMainDef initialPlayerChar = me // usePastTense = true showIntro() { "Vítejte v dalších dobrodružstvích Heidi!\b"; } showGoodbye() { "<.p>Díky, že jste si zahráli!\b"; } maxScore = 7 ; /* * This exemplifies how a function may be defined in TADS 3. This one is * fairly pointless, since it's only called from one point in the game. In * a game that called finishGameMsg from may different places, a wrapper * function like this might be more useful. * * Note that the function keyword here is optional, and most TADS 3 code * would omit it, defining the function thus: * * endGame(flag) { finishGameMsg(flag, * [finishOptionUndo,finishOptionFullScore]); } */ function endGame(flag) { finishGameMsg(flag, [finishOptionUndo,finishOptionFullScore]); } /* Modifications to behaviour of various classes */ modify Actor makeProper { if(isProperName == nil && properName != nil) { isProperName = true; name = properName; nameKohoCeho = properNameKohoCeho; nameKohoCo = properNameKohoCo; nameKomuCemu = properNameKomuCemu; nameKomCem = properNameKomCem; nameKymCim = properNameKymCim; /* Method 1: */ local tokList = Tokenizer.tokenize(properName); for (local i = 1, local cnt = tokList.length() ; i <= cnt ; ++i) { if(i < cnt) cmdDict.addWord(self, getTokVal(tokList[i]), &adjective); cmdDict.addWord(self, getTokVal(tokList[i]), &noun); } /* * Simpler Alternative: this doesn't add forenames as both * nouns and adjectives, but as adjectives only with the final * name as a noun: */ // initializeVocabWith(properName); } } ; /* * Modifications to Thing to implement a listRemoteContents() method, for * looking through the cottage window. */ modify Thing listLocation_ = nil listRemoteContents(otherLocation) { listLocation_ = otherLocation; try { lookAround(gActor, LookListSpecials | LookListPortables); } finally { listLocation_ = nil; } } adjustLookAroundTable(tab, pov, actor) { inherited(tab, pov, actor); if(listLocation_ != nil) { local lst = tab.keysToList(); foreach(local cur in lst) { if(!cur.isIn(listLocation_)) tab.removeElement(cur); } } } ; /* Definition of additional verbs */ DefineTAction(Cross); VerbRule(Cross) ('překroč' | 'překročit' | 'přebroď' | 'přebrodit') singleDobj : CrossAction verbPhrase = 'přebrodit/brod{íš}/přebrodil{a} (co)' ; modify Thing dobjFor(Cross) { preCond = [objVisible] verify() {illogical('{Kohoco dobj} nemůžeš přebrodit. ' ); } } ; DefineIAction(Row) execAction() { if(!oars.isHeldBy(gActor)) { "Nejdřív musíš mít vesla, abys mohla veslovat. "; exit; } if(!gActor.isIn(insideBoat)) { "Musíš být naloděna, abys mohla veslovat. "; exit; } "Vesluješ po řece pod mostem, až nakonec přistaneš "; if(boat.isIn(jetty)) { "na spodní straně zahrady.<.p> "; boat.moveInto(cottageGarden); } else { "u dřevěného mola.<.p> "; boat.moveInto(jetty); } nestedAction(Look); } ; VerbRule(Row) 'vesluj' | 'veslovat' | 'pádluj' | 'pádlovat' | ('zaber' | 'zabrat') 'vesly' : RowAction verbPhrase = 'veslovat/veslu{ješ}/vlesloval{a}' ; DefineTAction(Ring); VerbRule(Ring) ('zazvoň' | 'zazvonit' | 'zvoň' | 'zvonit') 'na' singleDobj : RingAction verbPhrase = 'zazvonit/zvon{íš}/zazvonil{a} (na co)' ; DefineIAction(RingWhat) execAction() { bellRing.triggerEvent(bell); } ; VerbRule(RingWhat) 'zazvoň' | 'zazvonit' | 'zvoň' | 'zvonit' | 'cink' : RingWhatAction verbPhrase = 'zazvonit/zvon{íš}/zazvonil{a}' ; modify Thing dobjFor(Ring) { preCond = [touchObj] verify() { illogical('Nemůžeš zazvonit na {kohoco dobj}.'); } } ; /* Definitions of additional special classes */ class Diggable : Floor dobjFor(DigWith) { preCond = [objVisible, touchObj] verify() {} check() {} action() { "Rozkopáním jsi neobjevila nic zajímavého. "; } } putDestMessage = &putDestFloor ; class ForestRoom : OutdoorRoom atmosphereList : ShuffledEventList { [ 'Přes cestu {ti/jí} přeběhla liška.\n', 'Tlupa králíků se poschovávala zpátky do nor.\n', 'Z ničeho nic mezi stromy vyskočil jelen a hned se zase vrhl do lesa.\n', 'V podrostu to tiše šust{í|ilo}.\n', 'Náhle se zleva ozvalo zaplácání křídel a z houští vyletěly sojky.\n' ] eventPercent = 90 eventReduceAfter = 6 eventReduceTo = 50 } ; /* * This MultiInstance effectively extends the functionality of the * ForestRoom class by ensuring that we provide a response to EXAMINE * TREES in every room of the ForestRoom class */ MultiInstance instanceObject : Decoration { 'borovice*stromy' 'borovice' *2 "Les je plný vysokých, rychle rostoucích borovicí. Sem tam se najde i nějaký dub či platan. " isPlural = true gcName = 'borovice, borovici, borovici, borovici, borovicí' gcVocab = 'borovici/borovicí' } initialLocationClass = ForestRoom ; modify Thing dobjFor(CleanWith) { verify() {} check() { failCheck(&cannotCleanMsg); } } ; modify InstructionsAction customVerbs = ['VESLUJ', 'PŘEBROĎ ŘEKU', 'ZAZVOŇ NA ZVON' ] ; modify playerActionMessages notASurfaceMsg = 'Na {kohoco iobj} nemůžeš nic položit. ' ; /* * Now for the actual scenario code - the definition of objects that * define the rooms, things and actors in the game. */ /* * ********************** OUTSIDE THE COTTAGE * *************************/ outsideCottage : OutdoorRoom 'Před chatou' 'před chatu' "Stojíš před chatou. Les se táhne na východ. Krátká pěšina vede kolem chaty na severozápad. " east = forest in = cottageDoor west asExit(in) northwest = cottageGarden ; + Enterable -> (outsideCottage.in) 'hezká hezký malá malý chata/dům/budova' 'hezká malá chata' *3 "Je to přesně ten typ hezké malé chaty, o které si lidé z města nechávají zdát. Kolem dveří rostou růže a světlo do chaty vniká oknem, s čerstvě natřeným rámem na zeleno. " cannotTakeMsg = 'I když to je malá chata, přesto je pořád větší než ty. Těžko bys ji přenášela! ' cannotCleanMsg = dobjMsg('Na tohle teď nemáš čas. ') notASurfaceMsg = iobjMsg('Na střechu nedosáhneš. ') dobjFor(LookIn) remapTo(LookThrough, cottageWindow) gcName = 'hezké malé chaty, hezké malé chatě, hezkou malou chatu, hezké malé chatě, hezkou malou chatou' gcVocab = 'hezkému hezkém hezkým malé malou malého malému malém malým chaty/ chatě/chatu/chato/chatou/domu/dome/domem/budovy/budově/budovu/budovo/ budovou' ; + cottageDoor : LockableWithKey, Door 'dveře' 'dveře' *3 "Jsou to pěkné bytelné dveře natřené na zeleno, aby ladily s okenním rámem. " isPlural = true keyList = [cottageKey] gcName = 'dveří, dveřím, dveře, dveřích, dveřmi' gcVocab = 'dveří/dveřím/dveřích/dveřmi' ; + Distant 'les' 'les' *2 "Les se rozkládá na východě. " tooDistantMsg = 'Na to je od tebe příliš daleko. ' gcName = 'lesu, lesu, les, lesu, lesem' gcVocab = 'lesu/lese/lesem' ; cottageWindow : SenseConnector, Fixture 'okno' 'okno' *4 "Okno chaty má čerstvě natřený zelený rám. Před nedávnem bylo sklo umyté. " dobjFor(LookThrough) { verify() {} check() {} action() { local otherLocation; connectorMaterial = glass; if(gActor.isIn(outsideCottage)) { otherLocation = insideCottage; "Koukáš oknem do pěkné malé místnosti v chatě. "; } else { otherLocation = outsideCottage; "Oknem vidíš cestu vedoucí do lesa. "; } gActor.location.listRemoteContents(otherLocation); } } dobjFor(LookIn) remapTo(LookThrough, cottageWindow) connectorMaterial = adventium locationList = [outsideCottage, insideCottage] gcName = 'okna, oknu, okno, oknu, oknem' gcVocab = 'okna/oknu/oknem' ; /* * ********************** DEEP IN THE FOREST * *************************/ forest : ForestRoom 'Hluboko v lese' 'do hlubokého lesa' "Hustým porostem letmo zahlédneš budovu na západě. Cesta vede na severovýchod a pěšina vede na jih." west = outsideCottage northeast = clearing south = outsideCave ; /* * ********************** THE CLEARING * *************************/ clearing : ForestRoom 'Mýtina' 'na mýtinu' "Uprostřed mýtiny stojí vysoký platan. Jedna pěšina se stáčí na jihozápad, druhá na sever." southwest = forest // up : NoTravelMessage { "The lowest bough is just too high for you to reach. "} up : TravelMessage { ->topOfTree "Přitažením k větvi se ti podařilo vyhoupnout na strom. " canTravelerPass(traveler) {return traveler.isIn(chair); } explainTravelBarrier(traveler) { "Nejnižší větev je o kousek výše, než kam dosáhneš. "; } } north = forestPath ; + tree : Fixture 'vysoký platan/strom' 'platan' *2 "Jak stojíš uprostřed mýtiny, ten silný strom vypadá, že by se po něm dalo dobře lézt. Pod stromem na zemi leží kupa větví. " dobjFor(Climb) remapTo(Up) dobjFor(ClimbUp) remapTo(Up) gcName = 'stromu, stromu, strom, stromu, stromem' gcVocab = 'vysokého vysokému vysokém vysokým platanu/platane/platanem/stromu /strome/stromem' ; ++ bough : OutOfReach, Fixture 'nejnižší spodní větev' 'spodní větev' *3 "Nejnižší větev stromu je vysoko, ze země na ni nedosáhneš. " canObjReachContents(obj) { if(obj.posture == standing && obj.location == chair) return true; return inherited(obj); } cannotReachFromOutsideMsg(dest) { return 'Větev je trošku vysoko, než abys na ní dosáhla přímo ze země. '; } gcName = 'spodní větve, spodní větvi, spodní větev, spodní větvi, spodní větví' // Zde schválně není druhý pád "větve", aby se nepletlo s kupou gcVocab = 'větvi/větví' ; + Decoration 'kupa větví/větve' 'kupa větví' *3 "Je tu spousta větviček. Většina z nich je malá, nedostatečná a nepoužitelná<<stick.moved ? nil : ', ale je mezi nimi i jeden celkem dlouhý a pevný klacek'>>. <<stick.discover>>" dobjFor(Search) asDobjFor(Examine) gcName = 'kupy větví, kupě větví, kupu větví, kupě větví, kupou větví' gcVocab = 'kupy kupě kupu kupou' ; + stick : Hidden 'dlouhý pevný rovný klacek' 'dlouhý klacek' *2 "Je zhruba půl metru dlouhý, v průměru má centimetr a je i vcelku rovný. " iobjFor(MoveWith) { verify() {} check() {} action() { if(gDobj==nest && !nest.moved) replaceAction(Take, nest); } } gcName = 'dlouhého klacku, dlouhému klacku, dlouhý klacek, dlouhém klacku, dlouhým klackem' gcVocab = 'dlouhého dlouhému dlouhém dlouhým pevného pevnému pevném pevným rovného rovnému rovném rovným klacku/klackem' ; /* * ********************** THE TOP OF THE TREE * *************************/ topOfTree : FloorlessRoom 'Na vrcholku stromu' 'vrchol stromu' "Stojíš nejistě přitisknuta ke kmeni hned vedle pevné úzké větve. " down = clearing enteringRoom(traveler) { if(!traveler.hasSeen(self) && traveler == gPlayerChar) addToScore(1, 'dosáhnutí vrcholu stromu '); } bottomRoom = clearing // receiveDrop(obj, desc) // { // obj.moveInto(clearing); // "\^<<obj.name>> falls to the ground below. "; // } roomBeforeAction() { if(gActionIs(Jump)) failCheck('Tady ne - mohla bys spadnout na zem a ošklivě se poranit. '); } roomAfterAction() { if(gActionIs(Yell)) "Tvůj křik však zaniká ve větru. "; } ; + branch : Surface, Fixture 'větev' 'větev' *3 "Větev vypadá příliš úzká na chození či lezení, ale dost silná na udržení určité tíhy. " gcName = 'větve, větvi, větev, větvi, větví' gcVocab = 'větve/větvi/větví' ; ++ nest : Container 'ptačí hnízdo' 'ptačí hnízdo' *4 "Je pečlivě upletené z větviček a mechu. " nameKohoCeho = 'ptačího hnízda' dobjFor(LookIn) { check() { if(!isHeldBy(gActor)) { "Musela bys hnízdo držet, aby ses mohla podívat dovnitř. "; exit; } } action() { if(ring.moved) { "Nic dalšího zajímavého jsi nenašla. "; exit; } ring.makePresent(); "Bližší pohled na hnízdo odhalil diamantový prsten! "; addToScore(1, 'nalezení prstenu'); } } dobjFor(Take) { check() { if(!moved && !stick.isIn(gActor)) { "Hnízdo je příliš daleko, než abys na něj dosáhla. "; exit; } } action() { if(!moved) "Použitím klacku se ti povedlo přiblížit hnízdo natolik, až se ti ho podařilo vzít. "; inherited; } } dobjFor(MoveWith) { verify() { if(isHeldBy(gActor)) illogicalAlready('Už ho držíš. '); } check() { if(gIobj != stick) { "Tím nemůžeš s hnízdem pohnout. "; exit; } } } gcName = 'ptačího hnízda, ptačímu hnízdu, ptačí hnízdo, ptačím hnízdu, ptačím hnízdem' gcVocab = 'ptačího ptačímu ptačím hnízda/hnízdu/hnízdem' ; +++ ring : PresentLater, Thing 'platinový diamantový prsten/prstýnek' 'diamantový prsten' *2 "Prsten je vyroben z třpytícího se diamantu zasazeného v platině. Vypadá jako zásnubní. " gcName = 'diamantovému prstenu, diamantového prstenu, diamantový prsten, diamantovém prstenu, diamantovým prstenem' gcVocab = 'platinového platinovému platinovém platinovým diamantového diamantovému diamantovém diamantovým prstenu/prstene/prstenem/prstýnku/ prstýnkem' ; /* * ********************** INSIDE THE COTTAGE * *************************/ insideCottage : Room 'Uvnitř chaty' 'do chaty' "Útulný pokoj vypadá bezvadně upravený. Dveře vedou na východ. " out = cottageDoorInside east asExit(out) inRoomName(pov) { return 'unvnitř chaty'; } remoteRoomContentsLister(other) { return new CustomRoomLister('Skrz okno, vidíš', ' položené na zemi.'); } ; + cottageDoorInside : Lockable, Door -> cottageDoor 'dveře' 'dveře' *3; + chair : Chair 'obyčejná dřevěná židle' 'dřevěná židle' *3 "Je to obyčejná dřevěná židle. " initSpecialDesc = "V koutě stojí obyčejná dřevěná židle. " remoteInitSpecialDesc(actor) { "Oknem chaty vidíš obyčejnou dřevěnou židli stojící v rohu. "; } gcName = 'dřevěné židle, dřevěné židli, dřevěnou židli, dřevěné židli, dřevěnou židlí' gcVocab = 'obyčejné obyčejnou dřevěné dřevěnou židli/židlí' ; /* * ********************** THE FOREST PATH * *************************/ forestPath : ForestRoom 'lesní pěšina' 'na lesní pěšinu' "Tahle široká pěšina se táhne lesem víceméně přímo ze severu na jih. Na severu se nad stromy občas objeví obláček dýmu. " south = clearing north = fireClearing ; /* * ********************** THE FIRE CLEARING * *************************/ fireClearing : OutdoorRoom 'Mýtina s ohništěm' 'na mýtinu s ohništěm' "Hlavním objektem na rozlehlé mýtině je doutnající milíř dřevěného uhlí, vypouštějící periodicky obláčky kouře. Cesta vede na jih a jiná na severozápad. " south = forestPath northwest = pathByStream ; + fire : Fixture 'velké velký doutnající oheň/ohniště/milíř' 'ohniště' *2 "Oheň hoří pomalu a přeměňuje dřevo na dřevěné uhlí. Přesto však je cítit horko i na tuto vzdálenost a každou chvíli přiletí oblak kouře, který míří tvým směrem. " dobjFor(Examine) { verify() {} action() { inherited; } } dobjFor(Smell) remapTo(Smell, smoke) dobjFor(Default) { verify() { illogical('Oheň je lepší nechat být, je velmi horký a ty se nechceš dostat až k němu.<.p>'); } } gcName = 'ohniště, ohništi, ohniště, ohništi, ohništěm' gcVocab = 'velkého velkému velkém velkým doutnajícího doutnajícímu doutnajícím ohně/ohni/ohněm/ohništi/ohništěm/milíře/milíři/milířem' ; + smoke : Vaporous 'kouř' 'kouř' *2 "Silný šedý kouř stoupá vytrvale z ohně, závany větru ho občas zaženou na tebe. " // smellDesc = "The smoke from the fire smells acrid and makes you cough. " gcName = 'kouře, kouři, kouř, kouři, kouřem' gcVocab = 'kouře/kouři/kouřem' ; ++ Odor 'štiplavý dráždivý smrad/zápach' 'štiplavý smrad' *2 sourceDesc = "Kouř z ohně štiplavě smrdí a dráždí kašel. " descWithSource = "Kouř voní po páleném dřevu." hereWithSource = "Vítr k tobě zavál dusivý oblak kouře. " displaySchedule = [2, 4, 6] gcName = 'štiplavého smradu, štiplavému smradu, štiplavý smrad, štiplavém smradu, štiplavým smradem' gcVocab = 'štiplavého štiplavému štiplavém štiplavým dráždivého dráždivému dráždivém dráždivým smradu/smrade/smradem/zápachu/zápachem' ; spade : Thing 'robustní lopata' 'lopata' *3 @burner "Je to robustní lopata s širokou železnou čepelí a dřevěnou násadou. " iobjFor(DigWith) { verify() {} check() {} } gcName = 'lopaty, lopatě, lopatu, lopatě, lopatou' gcVocab = 'lopaty/lopatě/lopatu/lopato/lopatou' ; /* * ********************** BANK OF THE STREAM * *************************/ pathByStream : OutdoorRoom 'U břehu' 'ke břehu řeky' "Cesta mezi stromy od jihovýchodu končí u potoka. Na protějším břehu na západ vidíš otevřenou louku. " southeast = fireClearing west = streamWade ; streamWade : RoomConnector room1 = pathByStream room2 = meadow canTravelerPass(traveler) { return boots.isWornBy(traveler); } explainTravelBarrier(traveler) { "Tvoje boty nejsou vodotěsné. Pokud bys přešla, nohy by se namočily a asi bys umřela na podchlazení. "; } ; /* * ********************** THE MEADOW * *************************/ meadow : OutdoorRoom 'Velká louka' 'na velkou louku' "Tahle rozlehlá louka se rozkládá skoro až k obzoru na sever, západ i jih. Na východě je ohraničena prudkým potokem. " vocabWords = 'louku/trávu' east = streamWade ; + cottageKey : Key 'malý drobný mosazný klíč/předmět' 'předmět' *2 "Je to malý mosazný klíč se zašlou visačkou, která se už nedá přečíst. " initSpecialDesc = "Drobný mosazný předmět leží v trávě. " remoteInitSpecialDesc(actor) { "V trávě se občas zableskne nějaký mosazný předmět, jak se v něm odráží slunce. "; } dobjFor(Take) { action() { if(!moved) addToScore(1, 'získání klíče'); inherited; name = 'malý mosazný klíč'; nameKohoCeho = 'malého mosazného klíče'; nameKomuCemu = 'malému mosaznému klíči'; nameKohoCo = 'malý mosazný klíč'; nameKomCem = 'malém mosazném klíči'; nameKymCim = 'malým mosazným klíčem'; } } gcName = 'předmětu, předmětu, předmět, předmětu, předmětem' gcVocab = 'malého malému malém malým drobného drobnému drobném drobným mosazného mosaznému mosazném mosazným klíče/klíči/klíčem/předmětu/ předměte/předmětem' ; DistanceConnector [pathByStream, meadow]; stream : MultiLoc, Fixture 'potok/řeka' 'potok' *2 "Potok není moc hluboký, ale teče celkem rychle na jih. " locationList = [pathByStream, meadow] dobjFor(Cross) { verify() {} check() {} action() { replaceAction(TravelVia, streamWade); } } gcName = 'potoku, potoku, potok, potoku, potokem' gcVocab = 'potoku/potokem/řeky/řece/řekou' ; /* * ********************** OUTSIDE THE CAVE * *************************/ outsideCave : OutdoorRoom 'Před jeskyní' 'před jeskyni' "Pěšina mezi stromy ze severu končí před ústím velké jeskyně na jihu. Nad jeskyní se prudce zvedá skála. " north = forest in = insideCave south asExit(in) ; + Enterable 'jeskyně/vstup' 'jeskyně' *3 "Vstup do jeskyně vypadá celkem úzký, ale pravděpodobně se protáhneš dovnitř. " connector = insideCave gcName = 'jeskyně, jeskyni, jeskyni, jeskyni, jeskyní' gcVocab = 'jeskyni/jeskyní/vstupu/vstupe/vstupem' ; /* * ********************** INSIDE THE COTTAGE * *************************/ insideCave : DarkRoom 'Uvnitř velké jeskyně' 'do jeskyně' "Jeskyně je větší, než by se z úzkého vchodu zdálo. Dokonce i dospělý se může pohodlně postavit. <<caveFloor.desc>>" vocabWords = 'jeskyně/jeskyni/jeskyní' out = outsideCave north asExit(out) roomParts = [caveFloor, defaultCeiling, caveNorthWall, defaultSouthWall, caveEastWall, defaultWestWall] ; caveFloor : Diggable 'podlaha/zem/povrch/písek' 'podlaha' *3 "Podlaha v jeskyni je dost písčitá, zhruba uprostřed <<hasBeenDug ? 'je čerstvě vykopaná díra' : 'je povrch, který musel být nedávno narušen'>>. " hasBeenDug = nil dobjFor(DigWith) { check() { if(hasBeenDug) { "Už jsi tu vykopala díru. "; exit; } } action() { hasBeenDug = true; "Vykopala jsi malou díru v písčité podlaze a našla staré boty. "; hole.moveInto(self); addToScore(1, 'nalezení bot'); } } gcName = 'podlahy, podlaze, podlahu, podlaze, podlahou' gcVocab = 'podlahy/podlaze/podlahu/podlahou/země/zemi/zemí/povrchu/povrchem/ písku/pískem' ; hole : Container, Fixture 'díra/jáma' 'díra' *3 "Je tu kulatá díra, čerstvě vykopaná v podlaze jeskyně. " gcName = 'díry, díře, díru, díře, dírou' gcVocab = 'díry/díře/díru/díro/dírou/jámy/jámě/jámu/jámou' ; + boots : Wearable 'staré boty' 'staré boty' *3 "Vypadají staře a zašle, ale pravděpodobně jsou stále vodotěsné. " initSpecialDesc = "Staré boty leží v díře. " gcName = 'starých bot, starým botám, staré boty, starých botách, starými botami' gcVocab = 'starých starým starými bot/botám/botách/botami' ; caveNorthWall : DefaultWall 'severní zeď' 'severní zeď' *3 "V severní zdi je úzká štěrbina vedoucí ven z jeskyně. " gcName = 'severní zdi, severní zdi, severní zeď, severní zdi, severní zdí' gcVocab = 'zdi/zdí' ; caveEastWall : DefaultWall 'východní zeď' 'východní zeď' *3 "Východní zeď jeskyně je celkem hladká a jsou na ní pozůstatky nějakých kreseb či nápisů. Bohužel se už nedá poznat, zda to byly původně neolitické malby nebo ukázka moderního graffiti. " gcName = 'východní zdi, východní zdi, východní zeď, východní zdi, východní zdí' gcVocab = 'zdi/zdí' ; /* * ********************** THE COTTAGE GARDEN * *************************/ cottageGarden : OutdoorRoom 'Zahrada' 'na zahradu' "Tahle roztomilá zahrádka je situována na sever od domu. Řeka teče podél zadního okraje zahrady, krátká cestička mizí dírou v plotě na jihovýchod a další cesta vede na západ k silnici. U plotu stojí zahradní kůlna. " vocabWords = 'zahrada/zahrádka/zahradu/zahrádku' nameKohoCeho = 'zahrady' southeast = outsideCottage north : NoTravelMessage {"<<gardenStream.cannotCrossMsg>> "} east : NoTravelMessage {"Nemůžeš projít plotem. "} west : FakeConnector {"Ta cesta vede dolů na silnici a tobě se nechce chodit mezi těmi smradlavými auty. " } in = insideShed ; + Decoration 'chata' 'chata' *3 "Pěkná malá chata je situovaná na jižním konci zahrady, do které vyhlížejí dvě okna. " gcName = 'chaty, chatě, chatu, chatě, chatou' gcVocab = 'chaty/chatě/chatu/chato/chatou' ; + Decoration 'dřevěný plot' 'dřevěný plot' *2 "Podél východní strany zahrady se táhne vysoký dřevěný plot. Na jeho jižním konci je průchod před chatu. " gcName = 'dřevěného plotu, dřevěnému plotu, dřevěný plot, dřevěném plotu, dřevěným plotem' gcVocab = 'dřevěného dřevěnému dřevěném dřevěným plotu/plotem' ; + gardenStream: Fixture 'řeka' 'řeka' *3 "<<cannotCrossMsg>>" dobjFor(Cross) { verify() {} check() { failCheck(cannotCrossMsg); } } cannotCrossMsg = ' Řeka je v tomto místě široká a příliš hluboká na přebrodění. ' gcName = 'řeky, řece, řeku, řece, řekou' gcVocab = 'řeky/řece/řeku/řekou' ; + Openable, Enterable -> insideShed 'malá dřevěná zahradní kůlna' 'zahradní kůlna' *3 "Je to normální zahradní kůlna. " dobjFor(LookIn) asDobjFor(Enter) /* * The following commented out code shows how matchNameCommon() could * be used here, but in practice it's easier in this case just to use * 'weak' tokens (i.e. tokens enclosed in parentheses) in our * vocabWords property. */ // matchNameCommon(origTokens, adjustedTokens) // { // if(adjustedTokens.indexOf('shed')) // return self; // else // return cottageGarden; // } gcName = 'zahradní kůlny, zahradní kůlně, zahradní kůlnu, zahradní kůlně, zahradní kůlnou' gcVocab = 'malé malou dřevěné dřevěnou kůlny/kůlně/kůlnu/kůlnou' ; /* * ********************** INSIDE THE SHED * *************************/ insideShed : Room 'Uvnitř zahradní kůlny' "Vnitřek kůlny je plný zahradního harampádí, takže se sem sotva vejde jedna postava. V rohu stojí stará kredenc. " out = cottageGarden ; + Decoration 'zahradní náčiní/nářadí/motyka/hrábě/nůžky/harampádí' 'zahradní harampádí' *4 "Je tu motyka, hrábě, nůžky a další věci. " gcName = 'zahradního harampádí, zahradnímu harampádí, zahradní harampádí, zahradním harampádí, zahradním harampádím' gcVocab = 'zahradního zahradnímu zahradním náčiním/nářadím/motyky/motyce/ motyku/motyko/motykou/hrábí/hrábím/hrábích/hráběmi/nůžek/nůžkám/nůžkách/ nůžkami/harampádím' ; + oars : Thing 'pár vesla' 'pár vesel' *2 "Vesla vypadají, že jsou určena na pramici. " bulk = 10 initSpecialDesc = "O zeď je opřen pár vesel. " gcName = 'páru vesel, páru vesel, pár vesel, páru vesel, párem vesel' gcVocab = 'páru páre párem vesel/veslům/veslech/vesly' ; + cupboard: ComplexContainer, TravelPushable 'stlučená stará dřevěná kredenc' 'stará kredenc' *3 "Kredenc je stará, stlučená z prken, s oprýskanou modrou a bílou malbou. " subContainer : ComplexComponent, OpenableContainer { objInPrep = 've' } subSurface : ComplexComponent, Surface { } gcName = 'staré kredence, staré kredenci, starou kredenc, staré kredenci, starou kredencí' gcVocab = 'stlučené stlučenou staré starou dřevěné dřevěnou kredence/ kredenci/kredencem/kredencí' ; ++ tin : OpenableContainer 'malá čtverhranná plechovka' 'malá plechovka' *3 "Je to malá čtyřhranná plechovka s držátkem na víčku. " subLocation = &subSurface bulkCapacity = 5 gcName = 'malé plechovky, malé plechovce, malou plechovku, malé plechovce, malou plechovkou' gcVocab = 'malé malou čtverhranné čtverhrannou plechovky/plechovce/ plechovku/plechovkou' ; class Coin : Thing 'libra/minci/peníz*mince libry peníze' 'mince' *3 "Je zlatavá, má na sobě hravu královny na straně jedné a <q>Jedna Libra</q> na straně druhé. Hrana je ozdobena slovy <q>DECUS ET TUTAMEN</q>" isEquivalent = true gcName = 'mince, minci, minci, minci, mincí' gcVocab = 'libru/libře/libro/librou/penízu/peníze/penízem*mincím*mince* mincích*mincemi*peníze*peněz*penězům*penězích*penězmi' ; +++ Coin; +++ Coin; +++ Coin; +++ Coin; ++ torch : Flashlight, OpenableContainer 'malá modrá svítilna' 'malá modrá svítilna' *3 "Je to jen malá modrá svítilna. " subLocation = &subContainer bulkCapacity = 1 dobjFor(TurnOn) { check() { if(! battery.isIn(self)) { "Nic se nestalo. "; exit; } } } iobjFor(PutIn) { check() { if(gDobj != battery) { "{Kdoco dobj} se dovnitř nevejde. "; exit; } } action() { inherited; makeOpen(nil); achieve.addToScoreOnce(1); } } notifyRemove(obj) { if(isOn) { "Po vyndání baterie svítilna přestala svítit. "; makeOn(nil); } } achieve: Achievement { desc = "vložení baterie do svítilny" } gcName = 'malé modré svítilny, malé modré svítilně, malou modrou svítilnu, malé modré svítilně, malou modrou svítilnou' gcVocab = 'malé malou modré modrou svítilny/svítilně/svítilnu/svítilno/ svítilnou' ; /* * ********************** THE ROWING BOAT * *************************/ boat : Heavy, Enterable -> insideBoat 'pramice' 'pramice' *3 @cottageGarden "Je to malá veslovací pramice. " specialDesc = "Hned u břehu řeky je uvázaná pramice. " useSpecialDesc { return true; } dobjFor(Board) asDobjFor(Enter) // dobjFor(Row) // { // verify() // { // illogicalNow('Mus{íš} být naloděna, a{bys} mohl veslovat. '); // } // } getFacets = [rowBoat] gcName = 'pramice, pramici, pramici, pramici, pramicí' gcVocab = 'pramici/pramicí' ; boatBottom : Floor 'podlaha/dno/(pramice)' 'dno pramice' *1 gcName = 'dna pramice, dnu pramice, dno pramice, dnu pramice, dnem pramice' gcVocab = 'podlahy/podlaze/podlahu/podlaho/podlahou/dna/dnu/dnem' ; insideBoat : OutdoorRoom name = ('V pramici (u '+ boat.location.nameKohoCeho + ')') destName = 'do pramice' desc = "Pramice je jednoduchá dřevěná veslovací loď pro jednoho. Je uvázaná u břehu řeky u <<boat.location.nameKohoCeho>>. " out = (boat.location) roomParts = [boatBottom, defaultSky] ; + rowBoat: Fixture 'dřevěná pramice' 'pramice' *3 "<<insideBoat.desc>>" dobjFor(Take) { verify() {illogical('Nemůžeš nastoupit do lodi, už seš v ní.'); } } getFacets = [boat] gcName = 'pramice, pramici, pramici, pramici, pramicí' gcVocab = 'dřevěné dřevěnou pramici/pramicí' ; + Chair, Fixture 'dřevěné prkno/sedadlo' 'dřevěné prkno' *4 gcName = 'dřevěného prkna, dřevěnému prknu, dřevěné prkno, dřevěném prknu, dřevěným prknem' gcVocab = 'dřevěného dřevěnému dřevěném dřevěným prkna/prknu/prknem/sedadla/ sedadlu/sedadlem' ; /* * ********************** THE JETTY * *************************/ jetty : OutdoorRoom 'Molo' 'na molo' "Tohle dřevěné molo stojí na břehu řeky. Po proudu na východ vidíš silniční most a cesta pokračuje kolem přístaviště na západ. Na jihu je malý krámek. " nameKohoCeho = 'mola' west : FakeConnector {"Mohla bys jít dolů po cestě, ale nemáš k tomu důvod. "} east : NoTravelMessage {"Cesta pod mostem nepokračuje. "} south = insideShop is asExit(south) ; + Distant 'most' 'most' *2 "Malý cihlový most se silnicí. " gcName = 'mostu, mostu, most, mostu, mostem' gcVocab = 'mostu/moste/mostem' ; + Fixture 'řeka' 'řeka' *3 "Řeka se stává dost širokou v těchto místech. Na východ teče pod mostem a na západ skrz vesnici. " dobjFor(Cross) { verify() {} check() { failCheck ('Tady je řeka příliš široká, nedá se přebrodit. '); } } gcName = 'řeky, řece, řeku, řece, řekou' gcVocab = 'řeky/řece/řeku/řeko/řekou' ; + Enterable -> insideShop 'malý obchod/krámek' 'obchod' *2 "Obchod má otevřené dveře a nad nimi je cedule Smíšené zboží" gcName = 'obchodu, obchodu, obchod, obchodu, obchodem' gcVocab = 'malého malému malém malým obchodu/obchodem/krámku/krámkem' ; /* * ********************** INSIDE THE SHOP * *************************/ insideShop : Room 'Uvnitř obchodu' 'do obchodu' "Interiér je přeplněn regály, které jsou zarovnané zbožím všeho druhu včetně základních potravin, bonbónů, tyčinek, baterií, pití a kapesníků. Za pultem jsou dveře označené 'VSTUP ZAKÁZÁN'. " out = jetty north asExit(out) south : OneWayRoomConnector { destination = backRoom canTravelerPass(traveler) { return traveler != gPlayerChar; } explainTravelBarrier(traveler) { "Přes pult ke dveřím nemůžeš. "; } } ; + Decoration 'dveře' 'dveře' *3 "Dveře označené 'VSTUP ZAKÁZÁN' jsou na opačné straně pultu a nevypadá to, že by se k nim dalo dostat. Další dveře jsou k molu na sever. " isPlural = true gcName = 'dveří, dveřím, dveře, dveřích, dveřmi' gcVocab = 'dveří/dveřím/dveřích/dveřmi' ; + Fixture, Surface 'pult/stůl' 'pult' *2 "Pult je asi dva metry dlouhý a půl metru široký. " gcName = 'pultu, pultu, pult, pultu, pultem' gcVocab = 'pultu/pulte/pultem/stolu/stole/stolem' ; ++ bell : Thing 'mosazný zvon/zvonek' 'mosazný zvonek' *2 "Zvonek se skládá z obrácené polokoule s malým čudlíkem koukajícím nahoře. Je k němu připevněna cedulka. " dobjFor(Ring) { verify() {} check() {} action() { bellRing.triggerEvent(self); } } gcName = 'mosazného zvonku, mosaznému zvonku, mosazný zvonek, mosazném zvonku, mosazným zvonkem' gcVocab = 'mosazného mosaznému mosazném mosazným zvonu/zvonem/zvonku/ zvonkem' ; +++ Component, Readable 'cedulka' 'cedulka' *3 "Na cedulce je napsáno ZAZVOŇTE NA OBSLUHU. " gcName = 'cedulky, cedulce, cedulku, cedulce, cedulkou' gcVocab = 'cedulky/cedulce/cedulku/cedulko/cedulkou' ; +++ Component 'čudlík' 'čudlík' *2 "Čudlík kouká z horní strany polokoule. " dobjFor(Push) remapTo(Ring, bell) gcName = 'čudlíku, čudlíku, čudlík, čudlíku, čudlíkem' gcVocab = 'čudlíku/čudlíkem' ; + Distant, Surface 'regál*regály' 'regály' *2 "Regály s nejzajímavějším zbožím jsou za pultem. Jsou na nich vystaveny bonbóny a baterie. " isPlural = true gcName = 'regálů, regálům, regály, regálech, regály' gcVocab = 'regálu/regále/regálem*regálů*regálům*regálech' ; ++ batteries : Distant 'baterie/baterky' 'baterie v regálu' *3 "Různé baterie jsou vystaveny v regálu za pultem. " isPlural = true salePrice = 3 saleName = 'baterie do svítilny' saleItem = battery gcName = 'baterií v regálu, bateriím v regálu, baterie v regálu, bateriích v regálu, bateriemi v regálu' gcVocab = 'baterii/baterií/bateriím/bateriích/bateriemi' ; ++ sweets : Distant 'bonbóny' 'bonbóny v regálu' *2 "Všemožné pytlíky bonbónů jsou vystaveny v regálu za pultem. " isPlural = true salePrice = 1 saleName = 'pytlík bonbónů' saleItem = sweetBag gcName = 'bonbónů v regálu, bonbónům v regálu, bonbóny v regálu, bonbónech v regálu, bonbóny v regálu' gcVocab = 'bonbónů/bonbónům/bonbónech' ; battery : Thing 'malá červená baterie/baterka' 'malá červená baterie' *3 "Je to malá červená baterie, 4,5 V. " bulk = 1 gcName = 'malé červené baterie, malé červené baterii, malou červenou baterii, malé červené baterii, malou červenou baterií' gcVocab = 'malé malou červené červenou baterii/baterií/baterky/baterce/ baterku/baterkou' ; sweetBag : Dispenser 'pytlík bonbónů/bonbóny' 'pytlík bonbónů' *2 "Pytlík bonbónů. " canReturnItem = true myItemClass = Sweet gcName = 'pytlíku bonbónů, pytlíku bonbónů, pytlík bonbónů, pytlíku bonbónů, pytlíkem bonbónů' gcVocab = 'pytlíku pytlíkem bonbónů/bonbónům/bonbónech' ; class Sweet : Dispensable, Food desc = "Je to malý, kulatý, průhledný, <<sweetGroupBaseName>> bonbón. " vocabWords = 'bonbón*bonbóny bonbónů' gender = 2 location = sweetBag listWith = [sweetGroup] sweetGroupBaseName = '' collectiveGroup = sweetCollective sweetGroupName = ('jeden ' + sweetGroupBaseName + 'ý') countedSweetGroupName(cnt) { return spellIntBelow(cnt, 2, 100) + ' ' + sweetGroupBaseName + ((cnt >= 5) ? 'ých' : (cnt > 1 ? 'é' : 'ý')); } tasteDesc = "Chutn{á|al} sladce a kysele. " dobjFor(Eat) { action() { "Hodila sis <<nameKohoCo>> do pusy a vycucala jsi ho. Chutná dobře, ale nevydržel tak dlouho, jak jsi očekávala.<.p>"; inherited; } } ; class RedSweet : Sweet 'červený - ' 'červený bonbón' isEquivalent = true sweetGroupBaseName = 'červen' gcVocab = 'červeného červenému červeném červeným' ; class GreenSweet : Sweet 'zelený - ' 'zelený bonbón' isEquivalent = true sweetGroupBaseName = 'zelen' gcVocab = 'zeleného zelenému zeleném zeleným' ; class YellowSweet : Sweet 'žlutý - ' 'žlutý bonbón' isEquivalent = true sweetGroupBaseName = 'žlut' gcVocab = 'žlutého žlutému žlutém žlutým' ; sweetGroup: ListGroupParen showGroupCountName(lst) { "<<spellIntBelowExt(lst.length(), 2, 100, 0, DigitFormatGroupSep)>> bonbón<<lst.length() > 4 ? 'ů' : lst.length() > 1 ? 'y' : ''>>"; } showGroupItem(lister, obj, options, pov, info) { say(obj.sweetGroupName); } showGroupItemCounted(lister, lst, options, pov, infoTab) { say(lst[1].countedSweetGroupName(lst.length())); } ; sweetCollective: ItemizingCollectiveGroup 'bonbóny' 'bonbóny' ; RedSweet; RedSweet; RedSweet; RedSweet; RedSweet; GreenSweet; GreenSweet; GreenSweet; YellowSweet; YellowSweet; bellRing : SoundEvent triggerEvent(source) { "CINK!<.p>"; inherited(source); } ; backRoom: Room north = insideShop ; SenseConnector, Intangible 'zeď' 'zeď' *3 connectorMaterial = paper locationList = [backRoom, insideShop] gcName = 'zdi, zdi, zeď, zdi, zdí' gcVocab = 'zdi/zdí' ; /* * ********************************************************************* * NON PLAYER CHARACTERS * ************************************************************************/ /* * Definition of Joe Black, the Burner NPC - as this is complex we * separate it from the other code and put it at the end */ burner : Person 'uhlíř' 'uhlíř' *1 @fireClearing "Je obtížné udělat si o něm představu pod tou vší špínou a sazemi. " pcReferralPerson = ThirdPerson properName = 'Joe Black' properNameKohoCeho = 'Joe Blacka' properNameKomuCemu = 'Joe Blackovi' properNameKohoCo = 'Joe Blacka' properNameKomCem = 'Joe Blackovi' properNameKymCim = 'Joe Blackem' globalParamName = 'burner' gcName = 'uhlíře, uhlířovi, uhlíře, uhlíři, uhlířem' gcVocab = 'uhlíře/uhlíři/uhlířem/uhlířovi' ; + GiveShowTopic @ring topicResponse { "Jakmile jsi podala prsten {komučemu burner}, jeho oči zaplály nadšením a v údivu mu poklesla čelist: <q>Ty jsi ho našla!</q> říká, <q>Bůh ti žehnej, tys ho opravdu našla! Teď můžu jít za svou láskou! Díky drahá, to je naprosto úžasné!</q><.p>"; addToScore (2, 'vrácení prstenu {komučemu burner} '); /* CHANGED IN 3.0.6n */ finishGameMsg(ftVictory, [finishOptionUndo,finishOptionFullScore]); } ; + DefaultGiveShowTopic, ShuffledEventList [ '{Kdoco burner} kroutí hlavou, <q>Ne díky, lásko.</q>', 'Podíval se a ušklíbl se, <q>To je hezké, má drahá.</q> poznamenává a vrací ti to zpět.', '<q>Být tebou, tak bych si to schoval.</q> radí. ' ] ; + burnerTalking : InConversationState stateDesc = "Stojí a baví se s tebou. " specialDesc = "{Kdoco burner} se opírá o lopatu a povídá si s tebou. " nextState = burnerWorking ; ++ burnerWorking : ConversationReadyState stateDesc = "Je zaměstnán udržováním ohně. " specialDesc = "{Kdoco burner} obchází kolem ohně, občas na něj lopatou připlácne hlínu. " isInitState = true a = 0 ; +++ HelloTopic, StopEventList [ '<q>Ehm, promiňte,</q> říkáš ve snaze upoutat pozornost {kohočeho burner}.\b {Kdoco burner} odstoupil od ohně a opřel se o lopatu, aby s tebou mohl mluvit. <q>Ahoj, mladá dámo. Dávej pozor, aby ses nedostala příliš blízko k ohni.</q>', '<q>Dobrý den!</q> povídáš s úsměvem.\b <q>Ještě jedou zdravím!</q> říká {kdoco burner} a dává si přestávku od práce, aby se opřel o lopatu.' ] ; +++ ByeTopic "<q>Zatím nashledanou.</q> říkáš.<.p> <q>Opatruj se.</q> {kdoco burner} tě nabádá a vrací se ke své práci." ; +++ ImpByeTopic "{Kdoco burner} krátce pokyne hlavou a vrací se k práci." ; ++ AskTopic, SuggestedAskTopic @smoke "<q>Neobtěžuje vás ten kouř?</q> se ptáš.<.p> <q>Ale ne! Na to si zvykneš, jen si musíš pamatovat, že nemáš dýchat příliš zhluboka, když zafouká tvým směrem.</q> ujištuje tě." name = 'kouř' ; ++ AskTopic, SuggestedAskTopic, ShuffledEventList @fire [ '<q>Proč jste udělal tak velký táborák uprostřed lesa?</q> ptáš se.<.p> <q>To není táborák, slečinko, to je milíř na výrobu dřevěného uhlí.</q> vysvětluje, <q>A k výrobě dřevěného uhlí je potřeba pálit dřevo - hezky pomalu - a les je ideální místo, kde se dá dřevo sehnat, chápeš?</q>', '<q>Není vám tak trochu horko, když celý den pracujete u ohně?</q> zajímáš se.<.p> <q>Ano, ale být zavřený celý den v kanceláři je ještě více ubíjející,</q> odpovídá, <q>to nemůžu vystát!</q>', '<q>Proč pořád sypete hlínu na ten oheň?</q> zajímáš se.<.p> <q>Aby nehořel tak rychle.</q> ti říká.' ] name = 'oheň' ; ++ AskTopic, SuggestedAskTopic @burner "<q>Já jsem Heidi,</q> představuješ se, <q>jak se jmenujete vy?</q><.p> <q><<burner.properName>>,</q> odpovídá, <q>ale moje jméno už brzy bude blb.</q> <.convnode burner-mud><<burner.makeProper>>" name = 'něho' ; +++ AltTopic, SuggestedAskTopic, StopEventList [ '<q>Jste uhlířem už dlouho?</q> zajímáš se.<.p> <q>Okolo deseti let.</q> odpovídá.', '<q>A líbí se vám být uhlířem?</q> divíš se, <q>To vypadá jako dost špinavá práce!</q><.p> <q>Je to rozhodně lepší, než trávit celý den namačkaný někde v kanceláři nebo v továrně.</q> ti říká.', '<q>Co děláte, když nevyrábíte dřevěné uhlí?</q> tážeš.<.p> <q>Ale -- tohle a tamto.</q> krčí rameny.' ] isActive = (burner.isProperName) name = 'něho' ; ++ AskTellTopic, SuggestedAskTopic, StopEventList @ring [ '<q>Co se stalo s prstenem -- jak se vám ho povedlo ztratit?</q> se ptáš.<.p> <q>Nebudeš tomu věřit,</q> potřásá znovu hlavou, <q>před pár hodinama jsem ho vyndal, abych se na něj podíval, a upustil jsem ho. Než jsem ho ale stačil sebrat, přilétla straka zlodějka a ulétla s ním!</q>', '<q>Kam si myslíte, že se mohl prsten dostat?</q> zajímáš se.<.p> <q>Myslím, že skončil někde v nějakém hnízdě,</q> vzdychá, <q>Bůhví zda ho ještě nekdy dostanu zpátky!</q>', '<q>Chtěl byste, abych se ho pokusila najít?</q> hlásíš se dobrovolně.<.p> <q>Jistě, to by bylo báječné.</q> souhlasí, bez známky přesvědčení, že by se ti to mohlo povést.' ] name = 'prsten' ; +++ AltTopic, SuggestedTellTopic "<q>Našla jsem prsten v ptačím hnízdě na stromě kousek odsud,</q> říkáš mu a ukazuješ přibližně na jih, <q>mohl by to být ten váš?</q><.p> <q>Opravdu?</q> ptá se a jeho oči zazářily příslibem naděje. <q>Ukaž mi ho!</q>" isActive = (gPlayerChar.hasSeen(ring)) name = 'prsten' nameKomCem = 'prstenu' ; ++ AskForTopic @spade topicResponse { "<q>Mohla bych si půjčit vaší lopatu, prosím?</q> požádáš.<.p> <q>No tak dobrá,</q> váhavě souhlasí a podává ti lopatu, <q>ale určitě mi ji zase přines zpátky.</q>"; spade.moveInto(gActor); getActor().setCurState(burnerFretting); } ; ++ DefaultAskTellTopic "<q>Co si myslíte o <<gTopicText>>?</q>, ptáš se.<.p> <q>Ah, ano, jistě, <<gTopicText>>,</q> moudře přikyvuje, <q><<rand('Celkem jo', 'Nikdy nevíš', 'Nebo tak nějak, neskutečné')>>.</q>" ; + ConvNode 'burner-mud'; ++ SpecialTopic, StopEventList 'popřít, že blb není jméno' ['popři', 'popřít', 'řekni', 'říci', 'říct', 'že', 'blb', 'není', 'jméno'] [ '<q>Blb! Co je to za jméno?</q> se ptáš.<.p> <q>Moje jméno -- dnes večer,</q> odpovídá zasmušile.<.convstay>', '<q>Ale nemůžete být <i>opravdu</i> nazýván <q>blb</q></q> namítáš.<.p> <q>Ale ano, můžu!</q> ujišťuje tě.<.convstay>' ] ; ++ SpecialTopic 'zeptat se proč' ['zeptej', 'zeptat', 'se', 'proč', 'blb'] "<q>Proč by vaše jméno bylo blb?</q> chceš vědět.<.p> Pokývá hlavou, zhluboka si povzdechne a odpovídá, <q>Dneska jsem jí chtěl dát prsten -- její zásnubní prsten -- ale ztratil jsem ho. Stál mě dvouměsíční plat. A teď už se mnou více nepromluví,</q> uzavírá s dalším smutným pokýváním hlavy, <q>nikdy.</q> <<gSetKnown(ring)>>" ; ++ DefaultAskTellTopic "<q>A proč byste...</q> začneš.<.p> <q>Blb,</q> opakuje v zoufalém povzdechu.<.convstay>" ; + burnerFretting : InConversationState specialDesc = "{Kdoco burner} stojí a baví se s tebou s rukama v bocích. " stateDesc = "Stojí a povídá si s tebou s rukama opřenýma o bok. " nextState = burnerWaiting ; ++ burnerWaiting : ConversationReadyState specialDesc = "{Kdoco burner} obchází kolem ohniště, mračí se, jak se instinktivně snaží nahmátnout lopatu, která tu není. " stateDesc = "Obchází kolem ohniště. " afterTravel(traveler, connector) { getActor().initiateConversation(burnerFretting, 'burner-spade'); } ; +++ HelloTopic "<q>Zdravím.</q> říkáš.<.p> <q>Ahoj, mladá dámo - přinesla jsi mi lopatu?</q> se ptá." ; +++ ByeTopic "<q>Zatím naschle,</q> loučíš se.<.p> <q>A nenechávej si ji moc dlouho -- hned jak ji nebudeš potřebovat, tak mi ji vrať!</q> naléhá na tebe." ; ++ GiveShowTopic @spade topicResponse { "<q>Tady máte lopatu,</q> říkáš a podáváš mu ji.<.p> <q>Oh, díky!</q> odvětí a bere si ji s evidentní úlevou. "; spade.moveInto(burner); burner.setCurState(burnerTalking); } ; ++ AskForTopic @spade "Nemá lopatu. " isConversational = nil ; ++ AskTellTopic @spade "<q>To vypadá na velmi robustní lopatu,</q> poznamenáváš.\b <q>Také že je -- dobře se o ni starej, potřebuji ji ke své práci!</q> {kdoco burner} odpovídá." ; +++ AltTopic "<q>Hm, asi jsem někde tu lopatu zapoměla,</q> přiznáváš se.\b <q>Tak to doufám, že ji najdeš!</q> {kdoco burner} poznamenává v obavách." isActive = (!spade.isIn(burner.location)) ; ++ DefaultAskTellTopic "<q>O tom si můžeme promluvit, až mi přineseš lopatu zpátky,</q> ti říká." ; + ConvNode 'burner-spade' npcGreetingMsg = "<.p>Jak vidí, že přicházíš, jde ti naproti. <q>Už jsi s mou lopatou skončila?</q> nervózně se ptá.<.p>" npcContinueMsg = "<q>Co ta moje lopata? Už jsi s ní skončila?</q> opakuje {kdoco burner}, plný obav. " ; ++ YesTopic "<q>Ano, skončila.</q> odpovídáš.<.p> <q>A můžeš mi ji tedy vrátit?</q> žádá." ; ++ NoTopic "<q>Ještě ne; mohu si ji ještě chvíli nechat?</q> požádáš.<.p> <q>Tak tedy dobře,</q> přiznává zdráhavě, <q>ale potřebuju ji k práci, takže si prosím pospěš.</q>" ; /* * Definition of Sally the Shopkeeper */ /* TODO: properNameKomuCemu by se melo samo brat z properName, pokud nezadam */ shopkeeper : SoundObserver, Person 'mladá prodavačka/žena' 'mladá prodavačka' *3 @backRoom "Prodavačka je srdečná žena s růžovými tvářemi a načechranými blond vlasy. " properName = 'Sally' properNameKohoCeho = 'Sally' properNameKomuCemu = 'Sally' properNameKohoCo = 'Sally' properNameKomCem = 'Sally' properNameKymCim = 'Sally' notifySoundEvent(event, source, info) { if(event == bellRing && daemonID == nil && isIn(backRoom)) daemonID = new SenseDaemon(self, &daemon, 2, self, sight); else if(isIn(insideShop) && event == bellRing) "<q>Dobrá, dobrá, tady jsem!</q> říká {kdoco shopkeeper}.<.p>"; } daemonID = nil daemon { moveIntoForTravel(insideShop); "{Kdoco shopkeeper} vchází dveřmi a stoupá si za pokladnu.<.p>"; daemonID.removeEvent(); daemonID = nil; if(canTalkTo(gPlayerChar)) initiateConversation(sallyTalking, 'sally-1'); } globalParamName = 'shopkeeper' cashReceived = 0 price = 0 saleObject = nil gcName = 'mladé prodavačky, mladé prodavačce, mladou prodavačku, mladé prodavačce, mladou prodavačkou' gcVocab = 'mladé mladou prodavačky/prodavačce/prodavačku/prodavačko/ prodavačkou/ženy/ženě/ženu/ženou' ; + ConvNode 'sally-1' npcGreetingMsg = "<q>Ahoj, čím mohu posloužit?</q> se ptá.<.p>" ; + sallyTalking : InConversationState specialDesc = "{Kdoco shopkeeper} stojí za pultem a povídá si s tebou. " stateDesc = "Stojí za pokladnou a povídá si s tebou. " nextState = sallyWaiting ; ++ sallyWaiting : ConversationReadyState specialDesc { "{Kdoco shopkeeper} stojí za pultem a kontroluje zboží v policích. "; } stateDesc { "Kontroluje zboží v policích za pultem. "; } isInitState = true takeTurn { if(!gPlayerChar.isIn(insideShop) && shopkeeper.isIn(insideShop)) shopkeeper.moveIntoForTravel(backRoom); inherited; } ; +++ HelloTopic "<q>Dobrý den, <<getActor.isProperName ? getActor.properName : 'paní prodavačko'>>,</q> oslovuješ.<.p> <q>Ahoj, <<getActor.isProperName ? 'Heidi' : 'mladá dámo'>>, co pro tebe mohu udělat?</q> ptá se {kdoco shopkeeper}." ; +++ ByeTopic "<q>Zatím naschle!</q> loučíš se.<.p> <q>Naschledanou<<isProperName ? ' Heidi' : nil>>.</q> {kdoco shopkeeper} mává na rozloučenou." ; +++ ImpByeTopic "{Kdoco shopkeeper} se otočila a začala přepočítávat zboží v policích." ; ++ AskTellTopic [shopkeeper, gPlayerChar] "<q>Já jsem Heidi. Jak se jmenujete vy?</q> ses zeptala.<.p> <q>Ahoj Heidi, já jsem <<shopkeeper.properName>>,</q> usmála se na tebe. <<shopkeeper.makeProper>>" ; +++ AltTopic "<q>Dneska se cítím opravdu <i>velmi</i> dobře; jak se máte vy?</q> ptáš se.<.p> <q>Také se cítím velmi dobře, děkuji.</q> odpovídá tobě." isActive = (shopkeeper.isProperName) ; ++ AskTellTopic @burner "<q>Znáte {kohoco burner}, starého chlápka pracujícího v lese?</q> ptáš se nevinně.<.p> <q>On ve skutečnosti není <i>tak</i> starý,</q> odpovídá nesměle." ; ++ AskTellTopic @tWeather "<q>Jaké překrásné počasí to máme, nemyslíte?</q> poznamenáš.<.p> <q>Absolutně,</q> souhlasí s tebou, <q>a pokud budeme mít štěstí, vydrží i zítra.</q>" ; ++ DefaultAskTellTopic, ShuffledEventList [ '<q>Máte nějaký názor na ' + gTopicText + '?</q> ptáš se.<.p> <q>Upřímně, moc toho nevím.</q> odpovídá.', '<q>Myslím, že je opravdu zajímavé, že...</q> jsi začala.<.p> <q>Ó ano, vemi zajímavé.</q> souhlasí.', 'Nadhodila jsi malou konverzaci na téma ' + gTopicText + ' a {kdoco shopkeeper} odpověděla zdvořilou odpovědí.' ] ; ++ DefaultGiveShowTopic "<q>Ne, díky drahá.</q> odpovídá. "; ; ++ GiveShowTopic matchTopic(fromActor, obj) { return obj.ofKind(Coin) ? matchScore : 0; } handleTopic(fromActor, obj) { // if(shopkeeper.cashFuseID == nil) // shopkeeper.cashFuseID = new Fuse(shopkeeper, &cashFuse, 0); shopkeeper.cashReceived ++; currency = obj; // if(shopkeeper.cashReceived > 1) // "number <<shopkeeper.cashReceived>>"; if(shopkeeper.cashReceived <= shopkeeper.price) obj.moveInto(shopkeeper); /* add our special report */ gTranscript.addReport(new GiveCoinReport(obj)); /* register for collective handling at the end of the command */ gAction.callAfterActionMain(self); } afterActionMain() { /* * adjust the transcript by summarizing consecutive coin * acceptance reports */ gTranscript.summarizeAction( {x: x.ofKind(GiveCoinReport)}, {vec: 'Vysypala jsi ' + spellInt(vec.length(), 3)+' ' + currency.name + '.\n'}); if(shopkeeper.saleObject == nil) { "<q>Za co to je?</q> ptá se {kdoco shopkeeper} a vrací peníze zpět, <q>Neměla bys mi nejdříve říci, co chceš koupit?</q>"; shopkeeper.cashReceived = 0; } else if(shopkeeper.cashReceived < shopkeeper.price) "<q>Ehm, to není dost,</q> zdůrazňuje a kouká na tebe v očekávání vyrovnání účtu. "; else { "{Kdoco shopkeeper} si bere peníze a z police nese <<shopkeeper.saleObject.nameKohoCo>>. Podává ti <<shopkeeper.saleObject.nameKohoCo>> se slovy: <q>Tady máš"; if(shopkeeper.cashReceived > shopkeeper.price) " a tady máš nazpátek"; ".</q>"; shopkeeper.saleObject.moveInto(gPlayerChar); shopkeeper.price = 0; shopkeeper.cashReceived = 0; shopkeeper.saleObject = nil; } } currency = nil ; class GiveCoinReport: MainCommandReport construct(obj) { /* remember the coin we accepted */ coinObj = obj; /* inherit the default handling */ gMessageParams(obj); inherited('Vysypala jsi minci. '); } /* my coin object */ coinObj = nil ; ++ BuyTopic @batteries alreadyBought = "Potřebuješ jen jednu baterii a už jsi ji koupila.<.p>" ; ++ BuyTopic @sweets alreadyBought = "Už sis koupila pytlík bonbónů. Mysli na svou figuru! A mysli na své zuby!<.p>" ; class BuyTopic : AskAboutForTopic topicResponse { if(matchObj.saleItem.moved) alreadyBought; else if (shopkeeper.saleObject == matchObj.saleItem) "<q>Mohla bych dostat <<matchObj.saleName>> prosím?</q> požádáš.<.p> <q>Musíš mi ještě dát <<currencyStringKohoCo(shopkeeper.price - shopkeeper.cashReceived)>>.</q> říká.<.p>"; else if (shopkeeper.saleObject != nil) "<q>Jo a také bych ráda <<matchObj.saleName>> prosím.</q> oznamuješ.<.p> <q>Neměli bychom se nejdříve vyrovnat za <<shopkeeper.saleObject.nameKohoCo>>?</q> {kdoco shopkeeper} navrhuje. "; else { purchaseRequest(); purchaseResponse(); shopkeeper.price = matchObj.salePrice; shopkeeper.saleObject = matchObj.saleItem; } } alreadyBought = "Už jsi koupila <<matchObj.saleName>>.<.p>" purchaseRequest = "<q>Ráda bych <<matchObj.saleName>>, prosím,</q> požaduješ.<.p>" purchaseResponse = "<q>Samozřejmě, <<matchObj.salePrice >= 2 && matchObj.salePrice <= 5 ? 'budou' : 'bude'>> to <<currencyString(matchObj.salePrice)>>,</q> informuje tě {kdoco shopkeeper}.<.p>" ; function currencyString(amount) { return spellInt(amount, 3) + ' ' + ((amount > 5) ? 'liber' : amount > 1 ? 'libry' : 'libra'); } function currencyStringKohoCo(amount) { return spellIntExt(amount, 3, SpellIntKohoCo) + ' ' + ((amount > 5) ? 'liber' : amount > 1 ? 'libry' : 'libru'); } tWeather : Topic 'počasí'; /* * ******************** DEBUGGING VERBS * ***********************/ #ifdef __DEBUG /* * The purpose of the everything object is to contain a list of all usable * game objects which can be used as a list of objects in scope for * certain debugging verb. Everything caches a list of all relevant * objects the first time its lst method is called. */ everything : object /* * lst_ will contain the list of all objects. We initialize it to nil * to show that the list is yet to be cached */ lst_ = nil /* * The lst_ method checks whether the list of objects has been cached * yet. If so, it simply returns it; if not, it calls initLst to build * it first (and then returns it). */ lst() { if (lst_ == nil) initLst(); return lst_; } /* * initLst loops through every game object descended from Thing and * adds it to lst_, thereby constructing a list of physical game * objects. */ initLst() { lst_ = new Vector(50); local obj = firstObj(); while (obj != nil) { if(obj.ofKind(Thing)) lst_.append(obj); obj = nextObj(obj); } lst_ = lst_.toList(); } ; DefineTAction(Purloin) cacheScopeList() { scope_ = everything.lst(); } ; VerbRule(Purloin) ('ukradni' | 'ukrást') dobjList :PurloinAction verbPhrase = 'ukrást/krad{eš}/ukral{a} (co)' ; modify Thing dobjFor(Purloin) { verify() { if(isHeldBy(gActor)) illogicalNow('Už {ho/ji dobj} držíš. '); } check() {} action { mainReport('{Kdoco dobj} se objevil{a dobj} ve tvých rukou.\n '); moveInto(gActor); } } ; modify Fixture dobjFor(Purloin) { verify {illogical ('To není něco, co bys mohla ukrást - je přidělan{ý dobj} na svém místě.'); } } ; modify Immovable dobjFor(Purloin) { check() { "Nemůžeš vzít {kohoco dobj}. "; exit; } } ; DefineTAction(Gonear) // cacheScopeList() // { // scope_ = everything.lst(); // } /* * defining objInScope is an alternative to defining cacheScopeList in * this particular situation; you can try out either way by commenting * out one method and uncommenting in the other. This also applies to * the Purloin verb. */ objInScope(obj) { return true; } ; VerbRule(Gonear) ('teleportuj' | 'teleportovat') 'se' ('k' | 'ke') singleDobj :GonearAction verbPhrase = 'teleportovat/teleportu{ješ}/teleportoval{a} (k čemu) se' ; modify Thing dobjFor(Gonear) { verify() {} check() {} action() { local obj = self.roomLocation; if(obj != nil) { "Jsi zázračně přenášena...</p>"; replaceAction(TravelVia, obj); } else "Tam se nemůžeš teleportovat. "; } } ; modify Decoration dobjFor(Gonear) { verify() {} check() {} action() {inherited;} } ; modify Distant dobjFor(Gonear) { verify() {} check() {} action() {inherited;} } ; modify MultiLoc dobjFor(Gonear) { verify() { illogical('Nemůžeš se teleportovat k {komučemu dobj}, protože existuje ve více než jedné lokaci. '); } } dobjFor(Purloin) { verify() { illogical('Nemůžeš ukradnout {kohoco dobj}, protože existuje ve více než jedné lokaci. '); } } ; #endif