
#include "silvy.h"

inherit "/lib/shop"; /* ten obiekt jest sklepem */
inherit "/d/Imperium/std/monster.c";

#include <stdproperties.h> /* standardowe wlasciwosci */

nomask object sprzed;
nomask string sell_emote;
nomask string value_emote;
nomask string buy_emote;
nomask string show_emote;
nomask string store_emote;
nomask string list_emote;


nomask string s_item;
nomask string s1_item;


void do_emote_value();
void do_emote_list();
void do_emote_buy();
void do_emote_sell();
void do_emote_show();
void do_emote_store();

// s -lp biernika,  s1- lm biernika przedmiotu na tabliczce
void set_standard_shop_item(string s, string s1);

void set_value_emote(string s);
void set_list_emote(string s);
void set_buy_emote(string s);
void set_sell_emote(string s);
void set_show_emote(string s);
void set_store_emote(string s);

object osiolek;

#define OBJ_I_WZIETY_Z_URNY    "_obj_i_wziety_z_urny"

void 
create_chodzacy_sklep()
{ 
    ustaw_nazwe(({"rolf","rolfa","rolfowi","rolfa","rolfem","rolfie"}),
       allocate(6),PL_MESKI_OS);

    set_random_move(100);
    set_restrain_path(PATH);
    set_whimpy(100);

    set_store_room(PATH + "magazyn_na_osiolku.c"); /* ktory obiekt jest
    							naszym magazynem */
    set_long("Widzisz przed soba czlowieka, lat okolo czterdziestu. "+
      "Jest troche za gruby jak na swoj wzrost i widac po nim zmeczenie. "+
      "Na sobie ma podrozny stroj, a kilka pokaznych mieszkow dynda mu u pasa. "+
      "Uwage zwraca jego szeroki kapelusz, skrzetnie ukrywajacy lysine.\n");

    ustaw_odmiane_rasy(PL_CZLOWIEK);
    set_gender(G_MALE);

        dodaj_przym("barylkowaty","barylkowaci");
        dodaj_przym("zmeczony","zmeczeni");        
        set_stats(({45, 54, 100, 45, 55, 70}));
        
        set_skill(SS_DEFENCE, 200);
        set_skill(SS_SWIM, 25);
        set_skill(SS_PARRY, 200);

        add_prop(CONT_I_WEIGHT, 95000);
        add_prop(CONT_I_HEIGHT, 175);
        
        set_default_answer(QCIMIE(this_object(),PL_MIA) + " odpowiada: "+
        "Nie bardzo wiem o czym mowisz. Moze chcesz cos kupic albo sprzedac?\n");
                
    sprzed = this_object();
    
    set_act_time(24+random(23));
    add_act("emote usmiecha sie szeroko i potrzasa sakiewka.");
    add_act("emote mowi: Moze chcesz cos kupic albo sprzedac?");
    add_act("krzyknij Najlepsze ceny! Tylko u mnie!");
    add_act("emote ociera pot z czola.");
    add_act("emote przelicza monety.");
    add_act("emote pogania swego mula.");
    add_act("emote mocuje towar do sakw na mule.");
    add_act("emote glaszcze mula po glowie.");
    add_act("krzyknij Tylko tutaj! Tylko tutaj!");

    set_standard_shop_item("miecz", "miecze");

    dodaj_zloto(1);
    dodaj_srebro(13);
    dodaj_miedz(31);
}

void
create_monster()
{
   config_default_trade(); /* ustawia standardowe wartosci */

   add_ask(({"oferte","zakup","obsluge","kupowanie","sprzedawanie","handel"}),
       VBFC_ME("ask_handel"));

   set_value_emote("drapie sie w glowe.");
   set_list_emote("nerwowo rozglada sie na boki.");
   set_buy_emote("usmiecha sie uradowany.");
   set_sell_emote("spoglada nieufnie.");
   set_show_emote("zaciera rece.");
   set_store_emote("dlugo sie namysla.");

   create_chodzacy_sklep();

  setuid();
  seteuid(getuid());

   osiolek = clone_object(BRONIE + "mul.c");
   set_alarm(0.1,0.0,"dodajemy_osiolka");
}

void
dodajemy_osiolka()
{
    object gdzie = environment(this_object());

    osiolek->move(gdzie,0);
    
    this_object()->team_join(osiolek);
}    

string
ask_handel()
{
    write(this_object()->query_Imie() + "usmiecha sie i pokazuje ci tabliczke "+
        "z tym oto tekstem:\n");
    write(standard_shop_sign());
    say(QCIMIE(this_object(),PL_MIA) + " pokazuje " + QCIMIE(this_player(),PL_CEL) +
        "niewielka tabliczke.\n");    
    return "";
}        

void
init_living()
{
    ::init_living(); /* MUSI byc wywolane w kazdym inicie */
    
    init_shop(); /* dodanie komend takich jak 'kup', 'sprzedaj' itp */
}


void shop_hook_list_object(object ob, int price){
  string str, mess;
  int i;

  str = sprintf("%-36s", capitalize(ob->short(PL_MIA)));

  if (mess=("/d/Imperium/std/ziola")->money_short(split_values(price),1))
    mess = sprintf("%-35s", mess);
  else{
    mess = "Ten przedmiot nie ma wartosci. Zglos buga!";
    mess = sprintf("%-36s", mess);
  }
  write("| " + str + " | " + mess + " |\n");
  /*
  for (i=0; i < 7; i++)
    write("----------");
  write("---------\n");
  */
}


int do_list(string str){
  string pom;
  int i, tmp;
  
  if (!objectp(sprzed)) {
    notify_fail("Niestety nie ma sprzedawcy, wiec sklep jest nieczynny.\n");
    return 0;
  }

  do_emote_list();
  for (i=0; i < 7; i++)
    write("----------");
  write("---------\n");
  pom = sprintf("%-36s","Nazwa przedmiotu");
  write("| "+pom+" | ");
  pom = sprintf("%-36s","Cena przedmiotu");
  write(pom+" |\n");
  
  for (i=0; i < 7; i++)
    write("----------");
  write("---------\n");
  tmp = (::do_list(str));
  for (i=0; i < 7; i++)
    write("----------");
  write("---------\n");
  return tmp;
}


int do_buy(string str){
  if (!objectp(sprzed)) {
    notify_fail("Niestety nie ma sprzedawcy, wiec sklep jest nieczynny.\n");
    return 0;
  }

  do_emote_buy();
  return ::do_buy(str);
}


int do_sell(string str){
  if (!objectp(sprzed)) {
    notify_fail("Niestety nie ma sprzedawcy, wiec sklep jest nieczynny.\n");
    return 0;
  }

/* Wylaczam to bo juz nie jest potrzebne
 *
  if(this_player()->query_prop("_gracz_i_wzial_rzecz") > 0) 
  {
       notify_fail("Czujesz boska obecnosc w swym umysle. Juz wiesz, ze "+
           "zanim cos sprzedasz, powinienes oddac cos potrzebujacym. " +
           "Jak przez mgle widzisz smukla swiatynie i stojaca w niej urne " +
           "ofiarna.\n");    
       return 0;
  }         
 *
 */

  do_emote_sell();
  return ::do_sell(str);
}


int do_value(string str){
  if (!objectp(sprzed)) {
    notify_fail("Niestety nie ma sprzedawcy, wiec sklep jest nieczynny.\n");
    return 0;
  }
  do_emote_value();
  return ::do_value(str);
}


int do_show(string str){
  if (!objectp(sprzed)) {
    notify_fail("Niestety nie ma sprzedawcy, wiec sklep jest nieczynny.\n");
    return 0;
  }
  do_emote_show();
  return ::do_show(str);
}


int do_store(string str){
  if (!objectp(sprzed)) {
    notify_fail("Niestety nie ma sprzedawcy, wiec sklep jest nieczynny.\n");
    return 0;
  }
  do_emote_store();
  return ::do_store(str);
}

void do_emote_list(){
  if (list_emote)
    sprzed->command("emote " + list_emote);
}

void do_emote_buy(){
  if (buy_emote)
    sprzed->command("emote " + buy_emote);
}


void do_emote_sell(){
  if (sell_emote)
    sprzed->command("emote "+ sell_emote);
}


void do_emote_show(){
  if (show_emote)
    sprzed->command("emote " +show_emote);
}


void do_emote_store(){
  if (store_emote)
    sprzed->command("emote " + store_emote);
}

void do_emote_value(){
  if (value_emote)
    sprzed->command("emote " + value_emote);
}


void set_list_emote(string s){
  list_emote=s;
}

void set_buy_emote(string s){
  buy_emote=s;
}


void set_value_emote(string s){
  value_emote=s;
}

void set_sell_emote(string s){
  sell_emote=s;
}


void set_show_emote(string s){
  show_emote=s;
}

void set_store_emote(string s){
  store_emote=s;
}


// nazwa przedmiotu w bierniku lp - s
// nazwa przedmiotu w w bierniku lm -s1

string
standard_shop_sign()
{
    return
"Oto przyklady tego, co moge ci zaoferowac:\n" +
"    kup " + s_item + " za zlote monety    (standardowo najmniejsza denominacja)\n" +
"    kup " + s_item + " za zloto i wez miedziaki reszty\n" +
"    sprzedaj " + s_item + " za miedziaki  (standardowo najwieksza denominacja)\n" +
"    sprzedaj wszystko  - dzieki czemu sprzedasz wszystkie przedmioty, poza\n"+
"                         tymi, ktore dobywasz lub masz na sobie. Pamietaj,\n"+
"                         ze gdy masz za duzo przedmiotow do sprzedania, byc\n"+
"                         moze zajdzie koniecznosc ponownego wykonania tej\n"+
"                         komendy.\n"+
"    sprzedaj wszystko! - pozwoli ci sprzedac WSZYSTKIE przedmioty, ktore\n"+
"                         masz przy sobie - za wyjatkiem tych, ktorych nie\n" +
"                         da sie odlozyc i z wyjatkiem monet.\n"+
"                         (patrz ostrzezenie dla 'sprzedaj wszystko')\n"+
"    sprzedaj " + s1_item + ", sprzedaj drugi " + s_item + ", sprzedaj dwa "+ s1_item + " - te komendy\n"+
"                         takze dzialaja. Pamietaj jednak, ze nigdy\n" +
"                         nie bedziesz w stanie kupic wiecej, niz jednego\n"+
"                         przedmiotu.\n" +
"    wycen              - Sprzedawca wyceni ile wart jest dany przedmiot,\n"+
"                         zanim zdecydujesz sie go sprzedac.\n" +
"    pokaz              - Pozwoli ci obejrzec dokladnie jakis przedmiot\n"+
"                         z magazynu, zanim podejmiesz decyzje o kupnie go.\n"+
"    przejrzyj          - Pozwala ci przejrzec zawartosc magazynu.\n";
}



void set_standard_shop_item(string s, string s1){
  s_item= s;
  s1_item=s1;
}

int
shop_hook_allow_sell(object ob)
{
    if (ob->query_prop(OBJ_I_WZIETY_Z_URNY))
    {
        notify_fail("Ten przedmiot zostal poswiecony bogom. Nie mozesz "+ 
            "go tu sprzedac.\n");
        return 0;
    }
    
    return ::shop_hook_allow_sell(ob);
}    

void
do_die(object killer)
{
    osiolek->remove_object();

    ::do_die(killer);

    tell_room(environment(killer),"Mul, widzac smierc swego wlasciciela wpada w panike i "+
        "w szalonym pedzie ucieka w dal.\n");
    killer->catch_msg("Mul, widzac smierc swego wlasciciela wpada w panike i "+
        "w szalonym pedzie ucieka w dal.\n");

}                


void
add_introduced(string imie)
{
    set_alarm(2.0,0.0,"return_intro", imie);
}

varargs void 
return_intro(string kto)
{
    command("przedstaw sie " + find_player(kto)->query_real_name(PL_CEL));
}
// Dwie powyzsze funkcje pozwalaja naszemu elfowi przedstawiac sie.

string
query_presentation()
{
    return"Rolf Gunderbauer, Kupiec Rzeczy Wszelakich, czlowiek";
}

public void
wesprzyj(object ob)
{
    if (query_attack())
    {
/*
        switch(random(3))
        {
            case 0: command("emote syczy glosno."); break;
            case 1: command("krzyknij Besssstio!"); break;
            case 2: command("krzyknij Ku chwale gadow!"); break;
        }
*/        
        return ;
    }
    
    command("wesprzyj " + OB_NAME(ob));
    
    if (query_attack())
    {
        switch(random(5))
        {
            case 0: command("krzyknij Zgin Bestio!"); break;
            case 1: command("krzyknij Do broni!"); break;
            case 2: command("krzyknij Krasnoludow sie bic zachcialo, A?"); break;
            case 3: command("krzyknij Zgin pomiocie Chaosu!"); break;
            case 4: command("krzyknij Na smierc!"); break;
        }
        return ;
    }

}

public void
pomocy()
{
    (all_inventory(environment(this_object())) - ({ this_object() }))->wesprzyj(this_object());
}

void
attacked_by(object wrog)
{
    command("krzyknij Do broni!");
    set_alarm(0.1, 0.0, "pomocy");
    return ::attacked_by(wrog);
}

void
notify_you_killed_me()
{
    set_alarm(0.2,0.0,"ograbiamy");  
}    

void
ograbiamy()
{
    command("wez wszystko z ciala");
}
