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