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