/*
 * Nazwa funkcji : advemots
 * Opis          : Rozszezona funkcja do wypisywania emotow zalatwia wszystkie
 *                 poprzednie i dodaje jeszcze kilka innych ciekawych rzeczy.
 *                 Sam nie znam wszystkich jej mozliwosci :) Hans Kloss
 * Przyklad      : advemots("Widzisz jak","pokazuje jezyk",
 *                              "grajac mu na nosie.\n",oblist,PL_BIE,PL_MIA
 *                              EM_ALL_EXP_TARGET_AND_PLAYER+EM_CAN_SEE);
 *
 *                 Widzisz jak Alvin pokazuje jezyk Galenowi grajac mu na nosie.
 *                 Widzisz jak bursztynooki elf pokazuje jezyk Galenowi 
 *
 *
 * Argumenty     : string str1    - poczatkowa wiadomosc do wyswietlenia.
 *                 string str2    - srodkowa wiadomosc do wyswietlenia
 *                 string str2    - koncowa wiadomosc do wyswietlenia.
 *                 object *cele   - do kogo wiadomosc sie odnosi.
 *                 int  przypcele - przypadek dla powyzszego.
 *                 int    przyp   - przypadek dla gracza wykonywujacego.
 *                 int   rodzaj   - rodzaj emota makra dadawane do siebie.
 *   EM_PLAYER                    - wiadomosc idzie do gracza
 *   EM_TARGET                    - wiadomosc idzie do celu emota
 *   EM_ALL_EXP_TARGET_AND_PLAYER - wiadomosc idzie do obserwatorow
 *   EM_CAN_SEE                   - wyswietla wiadomosc do widzacych wykonywujacego
 *   EM_CANT_SEE                  - wyswietla wiadomosc do nie widzacych wykonywujacego
 *          jedna z dwoch ostatnich opcji musi byc by emot sie wyswietlil komus
 *                 string adverb  - opcjonalnie - przyslowek (dla npcow).
 *
 */
#include <filter_funs.h>
#include <composite.h>
#include <pl.h>

#define EM_TARGET                    1
#define EM_PLAYER                    2
#define EM_ALL_EXP_TARGET_AND_PLAYER 4
#define EM_CAN_SEE                   8
#define EM_CANT_SEE                  16



void
advemots(string str1="",string str2="",string str3="", object *cele=({}),
             int przypcele=PL_MIA,int  przyp=PL_MIA,int
             rodzaj=EM_ALL_EXP_TARGET_AND_PLAYER+EM_TARGET,string adverb = "")
{
    int i = -1;
    int ilu;
    string imie;
    object *wszyscy=({});
    object *widzacy;
    object *nie_widzacy;
    object gracz=this_player();
    object *npce;

    if (rodzaj & EM_TARGET)
      wszyscy+=cele;
    if (rodzaj & EM_PLAYER)
      wszyscy+=({gracz});
    if (rodzaj & EM_ALL_EXP_TARGET_AND_PLAYER)
      wszyscy += FILTER_LIVE(all_inventory(environment(gracz)) - 
                        ({ gracz }) - cele);

    widzacy = FILTER_CAN_SEE_IN_ROOM(wszyscy);
    widzacy = FILTER_IS_SEEN(gracz, widzacy);
    nie_widzacy = wszyscy - widzacy;
    wszyscy = ({});
    if (rodzaj & EM_CAN_SEE)
      wszyscy += widzacy;
    if (rodzaj & EM_CANT_SEE)
      wszyscy += nie_widzacy;
    npce = wszyscy - FILTER_PLAYERS(wszyscy);

    if (rodzaj & EM_ALL_EXP_TARGET_AND_PLAYER) 
       if (sizeof(npce)){
          npce->emote_hook_onlooker(query_verb(), gracz, adverb, cele);
          wszyscy -= npce;
       }
    else
    if (rodzaj & EM_TARGET)
       if (sizeof(npce)){
          npce->emote_hook(query_verb(), gracz, adverb);
          wszyscy -= npce;
       }
    ilu = sizeof(wszyscy);
    while (++i < ilu)
        if (rodzaj & EM_ALL_EXP_TARGET_AND_PLAYER){
           if (str1=="")
              imie=gracz->query_Imie(wszyscy[i],przyp);
           else
              imie=gracz->query_imie(wszyscy[i],przyp);
           wszyscy[i]->catch_msg(str1+imie+str2
             + ((sizeof(cele)) ? FO_COMPOSITE_LIVE(cele, wszyscy[i], przypcele) : "")
             + str3+"\n");
        } else 
        if (rodzaj & EM_TARGET){
           if (str1=="")
              imie=gracz->query_Imie(wszyscy[i],przyp);
           else
              imie=gracz->query_imie(wszyscy[i],przyp);
        wszyscy[i]->catch_msg(str1+imie+str2+str3+"\n");
        } else
        if (rodzaj & EM_PLAYER)
           write (str1+((sizeof(cele)) ? COMPOSITE_LIVE(cele,przypcele) : "" )
                     +str2+str3+"\n");

}
