Przeszukiwanie - teoria i praktyka

   Na Arkadii istnieja dwie dostepne dla graczy komendy, sluzace do
przeszukiwania: 'szukaj' i 'przeszukaj'. Bezargumentowe 'szukaj' sluzy
graczom wylacznie do znajdowania obiektow ukrytych w lokacji (patrz man
hiding). Prosimy o nie naruszanie tej konwencji. Z argumentem sluzy
natomiast do wykonywania kilku standardowych czynnosci, takich jak 'szukaj
ziol' lub 'szukaj drewna'. (Podane przyklady nie zostaly jeszcze
zaimplementowane. Zostana dodane do odpowiednich obiektow standardowych.)
Bardzo interesujaca komenda jest natomiast 'przeszukaj'. Przyjmuje argumenty
bedace nazwa obiektu, wzglednie nazwa dodana w otoczeniu gracza przez
add_item(). W zalozeniu, sluzy ona do zdobywania dodatkowych informacji o
obiekcie.

   Do definiowania reakcji obiektu na przeszukanie sluzy funkcja
search_fun() (patrz odpowiedni sman). Oto przyklad jej wykorzystania:

/* Niech nasz obiekt bedzie lokacja, w ktorej znajduje sie na przyklad
   krolicza nora. Chcemy, zeby po jej przeszukaniu gracz znalazl niewielki
   bibelocik. W create_room() musimy oczywiscie umiescic odpowiedni
   add_item() - w przeciwnym razie gracz nie bedzie mogl przeszukac nory.
   Nie musze chyba dodawac, ze gracz musi moc domyslic sie z opisu, ze jest
   tu cos byc moze wartego przeszukania. */

string
search_fun(string str, int trail)
{
    object artefakt;

    /* Zauwazmy, ze sprawdzamy czy komenda bylo 'przeszukaj'. Ponadto,
       powinnismy zapewnic, aby zadzialala kazda z nazw dodanych przez
       add_item(). */

    if ((str == "nore" || str == "krolicza nore") && trail)
    {

        /* Testujemy zmienna globalna, zeby sprawdzic czy juz wczesniej nie
           znaleziono tego obiektu. Do testowania, czy graczowi sie
           poszczescilo, uzyjemy resolve_task() (patrz man tasks), co jest
           ideologicznie bardzo wlasciwe. */

        if (!znaleziono_artefakt &&
            this_player()->resolve_task(TASK_SIMPLE, ({SS_AWARENESS})) > 0)
        {
            znaleziono_artefakt = 1;
            artefakt = clone_object(OBJPATH + "czaszeczka");

            /* Sprawdzamy, czy gracz moze podniesc obiekt. Wazne jest poprawne
               rozwiazanie tej sytuacji - nie chcemy, by obiekt gdzies
               graczowi tajemniczo zniknal. */

            if (artefakt->move(this_player())
            {
                /* Trzeba cos zrobic z obiektem - w przeciwnym wypadku bedzie
                    niepotrzebnie zajmowal pamiec. W tym przypadku bedziemy na
                    tyle uprzejmi, ze przeniesiemy go do lokacji. */

                artefakt->move(this_object());
                saybb(QCIMIE(this_player(), PL_MIA) + " wyciaga z "
                    + "kroliczej nory niewielka, wydluzona czaszeczke, "
                    + "ktora jednak wyslizguje "
                    + this_player()->koncowka("mu", "jej") + " sie z reki, "
                    + "ladujac na ziemi.\n");
                return "Gleboko wewnatrz kroliczej nory udalo ci sie wymacac "
                     + "jakis chlodny w dotyku, niewielki, kulisty obiekt. "
                     + "Rozgrzebujesz delikatnie ziemie, usilujac wyciagnac "
                     + "na zewnatrz dziwna, wydluzona krysztalowa "
                     + "czaszeczke. Wyslizguje ci sie jednak ona z dloni, "
                     + "ladujac na ziemi.\n";
            }

            /* Wywolanie move() zakonczylo sie sukcesem - trzeba tylko
               poinformowac o tym gracza. */

            saybb(QCIMIE(this_player(), PL_MIA) + " wyciaga cos z "
                + "kroliczej nory.\n");
            return "Gleboko wewnatrz kroliczej nory udalo ci sie wymacac "
                 + "jakis chlodny w dotyku, niewielki kulisty obiekt. "
                 + "Rozgrzebujesz delikatnie ziemie i wyciagasz na zewnatrz "
                 + "dziwna, wydluzona krysztalowa czaszeczke.\n";
        }

        /* Graczowi nie udalo sie znalezc czaszki. Dodajemy mu wiec
           uprzyjemnienia dla klimatu. */

        return "Udalo ci sie znalezc kilka kroliczych bobkow.\n";
    }

    /* Pobawmy sie jeszcze troszke... Raz na szesc przeszukan krzakow, gracz
       sploszy zimorodka. */

    if ((str == "krzak" || str == "krzaki") && trail && !random(6))
    {
        saybb("Sploszony przez " + QIMIE(this_player(), PL_BIE) + ", z "
            + "krzakow wylatuje z furkotem w niebo maly, niebieski "
            + "ptaszek.\n");
        return "Nagle prawie spomiedzy twoich wscibskich palcow wyfrunal z "
             + "furkotem w niebo maly, niebieski ptaszek.\n";
    }

    /* Gracz przeszukiwal cos innego. Jestem pewien, ze potraficie teraz
       wymyslec mnostwo innych radosnych rzeczy. My jednak na tym zakonczymy,
       pozwalajac mudlibowi wypisac standardowy komunikat. */

    return ::search_fun(str, trail);
}


   Pamietajmy o tym, ze gracz powinien moc domyslec sie, ze wykonanie danej
czynnosci da potencjalnie interesujace efekty.


Przydatne propy: OBJ_I_SEARCH_TIME - jak dlugo trwa przeszukanie obiektu
                                     (dodawane do standardowych 5 s)
Przydatne umiejetnosci: SS_AWARENESS - spostrzegawczosc