inherit "/lib/trade";
inherit "/d/Imperium/std/monster";

#include <ss_types.h>
#include <formulas.h>
#include <language.h>
#include <files.h>
#include <macros.h>
#include <stdproperties.h>
#include <filter_funs.h>
#include <cmdparse.h>

#include "local.h"

string *emoty_kowala = ({});
string *br = ({});
 
mapping naprawiane=([ ]),eq=([ ]);
int zajety=0;
string nazwa;

#define WARTOSC		600

#define LOG             "/d/Imperium/private/kowal.log"

void ustaw_co_robimy(string *co);
void ustaw_emoty_przy_pracy(string *jakie);
void naprawiamy(object ob, int *ktory_alarm);

// Funkcja indywidualizujaca kowali

void
create_kowal()
{
    ustaw_imie(({"trebhar","trebhara","trebharowi","trebhara",
                 "trebharem","tebharze"}),PL_MESKI_OS);

    dodaj_nazwy(({ "kowal", "kowala", "kowalowi", "kowala",
    		   "kowalem", "kowalu" }), ({ "kowale",
    		   "kowali", "kowalom", "kowali", "kowalami",
                   "kowalach" }), PL_MESKI_OS);

    set_long("Poteznej postury krasnolud, jego ogromne miesnie zdradzaja, "+
             "ze ciezka fizyczna praca nie jest mu obca. Jest wysoki "+
             "jak na przedstawiciela swej rasy. Nosi pobrudzony ciemno "+
             "niebieski fartuch z grubego materialu, w prawej rece dzierzy "+
             "ogromny metalowy mlot. Nie ma watpliwosci, iz para sie "+
             "kowalstwem.\n");

    ustaw_odmiane_rasy(PL_KRASNOLUD);
    dodaj_przym("olbrzymi","olbrzymie");
    dodaj_przym("umorusany","umorusani");

    set_gender(G_MALE);

    add_prop(CONT_I_WEIGHT, 120000);
    add_prop(CONT_I_HEIGHT, 140);

    set_skill(SS_DEFENCE, 50 + random(5));
    set_skill(SS_UNARM_COMBAT, 50 + random(5));
    set_skill(SS_PARRY, 50 + random(5));

    set_stats(({ 75, 55, 70, 60, 60, 50, 100}));

// Przedmioty ktore mozna tu wykonac
// Zarowno bronie jak i zbroje, choc mozna ich nie mieszac.
// Te ponizej to tylko przyklady - praktycznie powinno to byc
// wpisane w create_kowal()

    ustaw_co_robimy(({ 
              NULN + "bronie/miecz",
              NULN + "bronie/laska1",
              NULN + "bronie/sztylet",
              }));
}


void
create_monster()
{
    int i;

    dodaj_nazwy( ({"kowal","kowala","kowalowi","kowala","kowalem","kowalu"}),
    		 ({"kowale","kowali","kowalom","kowali","kowalami","kowalach"}),
    		 PL_MESKI_OS);
    
    create_kowal();   

    set_money_accept(({1,1,1,0}));
    config_default_trade();
    seteuid(getuid());

    for(i=0;i<sizeof(br);i++)
       eq[clone_object(br[i])]=br[i];

    add_ask("zwrot", VBFC_ME("zwrot"));
    add_ask(({"pomoc", "naprawe", "usluge"}), "Jesli potrzebujesz cos naprawic "
                + "przeczytaj najpierw tabliczke.\n");           
 
    set_default_answer(QCIMIE(this_object(),PL_MIA) + 
      " mowi: Przeszkadzasz mi w pracy.\n");

              
// To co kolega robi podczas pracy.
// W wyjatkowych wypadkach mozna to zmieniac, ale po co, sa
// takie ladne.

    ustaw_emoty_przy_pracy(({
                "emote zabiera sie do roboty.",
                "emote nawleka igle na nitke.",
                "emote spiewa wesola piosenke.", 
                "emote zaczyna cos wyszywac", 
                "emote przygotowuje kroje.",
                "emote usmiecha sie do ciebie.",
                "emote mowi: Zaraz juz bedzie..."
                }));

}

void
ustaw_co_robimy(string *co)
{
    br = co;
}    

void
ustaw_emoty_przy_pracy(string *jakie)
{
    emoty_kowala = jakie;
}   

void
enter_env(object dest, object old)
{
  int i;
  int cenna;
  string s="";
  object *ind;
 
  ind=m_indexes(eq);
  for (i=0;i<sizeof(ind);i++)
  { 
    if(ind[i]->query_prop(OBJ_I_VALUE) > WARTOSC)
      cenna = ind[i]->query_prop(OBJ_I_VALUE)*10;
    else
      cenna = ind[i]->query_prop(OBJ_I_VALUE)*3;
    
           s+="* "+ind[i]->short(this_object(),PL_MIA)+" - "+
               text(split_values(cenna),3)+".\n";
  }  

  dest->add_cmd_item(({"napis", "tabliczke"}),
       "przeczytaj", 
       "Mozesz tu naprawic swoj ekwipunek, badz zamowic nowy.\n"
     + "Wykonujemy nastepujace uslugi:\n\n"
     + "\t<oczysc nazwa_broni>       - oczyszczenie zardzewialej broni\n"
     + "\t<naostrz nazwa_broni>      - naostrzenie stepionej broni\n"
     + "\t<napraw nazwa_zbroi>       - podreperowanie nadwerezonej zbroi\n"
     + "\t<zamow nazwa_przedmiotu>   - zamowienie czesci ekwipunku\n"
     + "\t<pokaz nazwa_przedmiotu>   - mozliwosc obejrzenia probki towaru\n\n"
     + "\t\t Lista wykonywanych przedmiotow:\n\n"+s+"\n"
     + "Gwarantujemy, ze wszystkie wykonywane na zamowienie przedmioty beda wlascicielowi dlugo sluzyc.\n"
     + "By dowiedziec sie o cenach pozostalych uslug zapytaj o to personel.\n");
    
  ::enter_env(dest, old);
}


void
add_introduced(string kto)
{
    object o_kto = find_player(kto);

    set_alarm (2.0,0.0,"intro",o_kto);
}

void
intro(object ob)
{
    if (objectp(ob)) 
        command ("przedstaw sie "+OB_NAME(ob));
}


void
emote_hook(string emote, object wykonujacy, string przyslowek)
{
    switch (emote)
    {
        case "zasmiej": set_alarm(2.5, 0.0, "command", "usmiech wesolo");
        	      break;
    }
}

/**************************************************************************/
/**************************************************************************/
/**************************************************************************/



int
znajdz_max_repair(object co)
{
    int j,uszk,rep;

        uszk=co->query_condition();
        
        rep=co->query_repair();
        
/* Tigr: Dodalem to, aby rozroznic prypadek, gdy nie da sie naprawic zbroi 
   Tak samo trzeba dodac (tylko inne makra) w dwuch pozostalych 
   f-cjach znajdz_max */

    if (uszk>rep&&rep>=F_ARMOUR_MAX_REPAIR(uszk)) return -1;
     /* jesli jest juz popsuta i nie da sie naprawic */
        
    
    for(j=uszk;(j>rep)&&!(F_LEGAL_ARMOUR_REPAIR(j,uszk));j--);
    
    if (j>rep)
      return j-rep;
    return 0;
}

/**************************************************************************/

int
znajdz_max_dull(object co)
{
    int j,uszk,rep;

        uszk=co->query_dull();
        rep=co->query_repair_dull();
    
    if (uszk>rep&&rep>=F_WEAPON_MAX_REPAIR_DULL(uszk)) return -1;
        
    for(j=uszk;(j>rep)&&!(F_LEGAL_WEAPON_REPAIR_DULL(j,uszk));j--);
    
    if (j>rep)
      return j-rep;
    return 0;
}

/**************************************************************************/

int
znajdz_max_corr(object co)
{
    int j,uszk,rep;

        uszk=co->query_corroded();
        rep=co->query_repair_corr();
        
    if (uszk>rep&&rep>=F_WEAPON_MAX_REPAIR_CORR(uszk)) return -1;
    
    for(j=uszk;(j>rep)&&!(F_LEGAL_WEAPON_REPAIR_CORR(j,uszk));j--);
    
    if (j>rep)
      return j-rep;
    return 0;
}


/**************************************************************************/
/**************************************************************************/
/**************************************************************************/

void
sprawdz_cene_naprawy(object *lista)
{
  int i,j,cena=0;
  lista=NORMAL_ACCESS(lista,0,0);
  for(i=0;i<sizeof(lista);i++)
  {
  /*Tigr: Dodalem tez to, aby kowal odpowiednio odpowiadal.
     Podobnie trzeba bedzie zrobic w dwoch pozostalych sprawdz_cene_ */
  if (!function_exists("create_armour",lista[i]))
     {
       command("powiedz " + capitalize(lista[i]->short(TP,PL_MIA)) +
       		" nie jest zbroja.");
       continue;
     }
  if (!lista[i]->query_prop(OBJ_I_VALUE)){
     command("powiedz "+capitalize(lista[i]->query_nazwa(PL_MIA))
                                  +" nie nadaje sie do naprawy.");
     continue;
     }
   cena = lista[i]->query_prop(OBJ_I_VALUE)*znajdz_max_repair(lista[i])*5/20;
/* Tigr: dodalem tez to - jesli cena<0 to nie da sie naprawic, 
   =0 - nie trzeba naprawiac, >0 mozna naprawic i tyle bedzie kosztowac */
  
  if (cena<0) 
     {
        command("powiedz "+lista[i]->koncowka("Ten ","Ta ","To ")+
                     lista[i]->query_nazwa(PL_MIA)+
                                 " nie nadaje sie do naprawy.");
        continue;
     }
  if (!cena)
     command("powiedz "+lista[i]->koncowka("Ten ","Ta ","To ")+
                     lista[i]->query_nazwa(PL_MIA)+
                                 " nie wymaga naprawy.");
  else 
     command("powiedz Hmm... za naprawe "+
               lista[i]->koncowka("tego ","tej ")+
               lista[i]->query_nazwa(PL_DOP)+
                       " musisz zaplacic "+text(split_values(cena),3)+".");
}
return;
}

/**************************************************************************/

void
sprawdz_cene_ostrzenia(object *lista)
{
  int i,j,cena=0;
  lista=NORMAL_ACCESS(lista,0,0);
  for(i=0;i<sizeof(lista);i++)
  {
  if (!function_exists("create_weapon",lista[i]))
     {
       command("powiedz " + capitalize(lista[i]->short(TP,PL_MIA)) +
       		" nie jest bronia.");
       continue;
     }
  if (!lista[i]->query_prop(OBJ_I_VALUE)){
     command("powiedz "+capitalize(lista[i]->query_nazwa(PL_MIA))
                                  +" nie nadaje sie do ostrzenia.");
     continue;
     }
   cena = lista[i]->query_prop(OBJ_I_VALUE)*znajdz_max_dull(lista[i])*5/20;
  if (cena<0) 
     {
        command("powiedz "+lista[i]->koncowka("Ten ","Ta ","To ")+
                     lista[i]->query_nazwa(PL_MIA)+
                                 " nie nadaje sie do ostrzenia.");
        continue;
     }
  if (!cena)
     command("powiedz "+lista[i]->koncowka("Ten ","Ta ","To ")+
                     lista[i]->query_nazwa(PL_MIA)+
                                 " nie wymaga ostrzenia.");
  else 
     command("powiedz Hmm... za ostrzenie "+
               lista[i]->koncowka("tego ","tej ")+
               lista[i]->query_nazwa(PL_DOP)+
                       " musisz zaplacic "+text(split_values(cena),3)+".");
}
return;
}

/**************************************************************************/

void
sprawdz_cene_czyszczenia(object *lista)
{
  int i,j,cena=0;
  lista=NORMAL_ACCESS(lista,0,0);
  for(i=0;i<sizeof(lista);i++)
  {
  if (!function_exists("create_weapon",lista[i]))
     {
       command("powiedz " + capitalize(lista[i]->short(TP,PL_MIA)) +
       		" nie jest bronia.");
       continue;
     }
  if (!lista[i]->query_prop(OBJ_I_VALUE)){
     command("powiedz "+capitalize(lista[i]->query_nazwa(PL_MIA))
                                  +" nie nadaje sie do czyszczenia.");
     continue;
     }
   cena = lista[i]->query_prop(OBJ_I_VALUE)*znajdz_max_corr(lista[i])*5/20;
  if (cena<0) 
     {
        command("powiedz "+lista[i]->koncowka("Ten ","Ta ","To ")+
                     lista[i]->query_nazwa(PL_MIA)+
                                 " nie nadaje sie do czyszczenia.");
        continue;
     }
  if (!cena)
     command("powiedz "+lista[i]->koncowka("Ten ","Ta ","To ")+
                     lista[i]->query_nazwa(PL_MIA)+
                                 " nie wymaga czyszczenia.");
  else 
     command("powiedz Hmm... za czyszczenie "+
               lista[i]->koncowka("tego ","tej ")+
               lista[i]->query_nazwa(PL_DOP)+
                       " musisz zaplacic "+text(split_values(cena),3)+".");
}
return;
}

/**************************************************************************/

void
sprawdz_cene_zrobienia(object *lista)
{
  int cenna;
   
  lista=NORMAL_ACCESS(lista,0,0);

    if(lista[0]->query_prop(OBJ_I_VALUE) > WARTOSC)
      cenna = lista[0]->query_prop(OBJ_I_VALUE)*10;
    else
      cenna = lista[0]->query_prop(OBJ_I_VALUE)*3;

     command("powiedz Hmm... za zrobienie "+
               lista[0]->koncowka("tego ","tej ")+
               lista[0]->query_nazwa(PL_DOP)+" musisz zaplacic "
                  +text(split_values(cenna),3)+".");
return;
}

/**************************************************************************/
/**************************************************************************/
/**************************************************************************/

string
zwrot()
{
object *gracze;
int i,j;
if (zajety)
  return"";
    gracze=FILTER_LIVE(all_inventory(environment(this_object())));
    for (i=0;i<sizeof(gracze);i++)
   if (CAN_SEE_IN_ROOM(this_object())&&CAN_SEE(this_object(),gracze[i]))
       if(naprawiane[gracze[i]])
         if (objectp(naprawiane[gracze[i]]) && present(naprawiane[gracze[i]],this_object()))
           if (present(gracze[i], environment(this_object())))
              {
               if (naprawiane[gracze[i]]->move(gracze[i]))
                 if (naprawiane[gracze[i]]->move(environment(gracze[i])))
                    gracze[i]->catch_msg("Wystapil nieoczekiwany blad"+
                      " 'zglos blad' o tym.\n");
                 else
                     for(j=0;j<sizeof(gracze);j++)
                       gracze[j]->catch_msg(
                        this_object()->query_Imie(gracze[j],PL_MIA)+" odklada "+
                        QSHORT(naprawiane[gracze[i]],PL_BIE)+" na ziemie.\n");
                else
                  {
                  gracze[i]->catch_msg(this_object()->query_Imie(gracze[i],
                         PL_MIA)+" daje ci "+
                         QSHORT(naprawiane[gracze[i]],PL_BIE)+".\n");
                  for(j=0;j<sizeof(gracze);j++)
                    if(i!=j)
                      gracze[j]->catch_msg(this_object()->query_Imie(gracze[j],
                       PL_MIA)+" daje "+gracze[i]->query_imie(gracze[j],PL_CEL)
                         +" "+QSHORT(naprawiane[gracze[i]],PL_BIE)+".\n");
                  }   
               naprawiane=m_delete(naprawiane,gracze[i]);
               }
return"";
}

/**************************************************************************/

void
pracuj(int czy_tworzenie = 0, int ile_warte = 0)
{
  int i;
  string str;
  int ile_minut;
  int *ktory_alarm = allocate(5);
  
  zajety=1;
  
  if(!czy_tworzenie)
  {  
    command("powiedz Zobacze co da sie zrobic.");
    command("powiedz To potrwa tylko chwile.");
    command("emote zabiera sie do roboty.");
    for (i=0;i<5;i++)
     set_alarm(itof(i*random(8)), 0.0, "command", emoty_kowala[random(sizeof(emoty_kowala))]); 
    set_alarm(12.0, 0.0, "naprawiamy", this_player());
        return;
  }
  
    if(ile_warte < WARTOSC)
      ile_minut = 1;
    else
      //ile_minut = ftoi(itof(ile_warte) / 30.0);  
         ile_minut=1;
	  
    if(ile_minut < 1) ile_minut = 1;
  
    command("powiedz Zobacze co da sie zrobic.");
    if(ile_minut < 2)
      command("powiedz To potrwa okolo jednej minuty.");
    else
      command("powiedz To potrwa okolo "+ile_minut+" minut.");
    command("powiedz Nie musisz czekac tutaj, mozesz przyjsc pozniej i odebrac zamowiony przedmiot.");
    command("emote zabiera sie do roboty.");
    for (i=0;i<5;i++)
     ktory_alarm[i] = set_alarm(itof(i*random(30)), itof(50+random(50)), "command", emoty_kowala[random(sizeof(emoty_kowala))]); 
    set_alarm(itof(ile_minut*60), 0.0, &naprawiamy(this_player(),ktory_alarm));      
}

/**************************************************************************/

object*
sprawdz(string str)
{
object *lista;
notify_fail (this_object()->query_Imie(this_player(),PL_MIA)+
                  " ignoruje cie, jakby cie nie zauwazal.\n");
if (!(CAN_SEE_IN_ROOM(this_object())&&CAN_SEE(this_object(),this_player())))
    return 0;
notify_fail("Tak, ale co?\n");
if (!str)
    return 0;
notify_fail("Kowal jest pochloniety praca, nie wypada mu teraz przeszkadzac.\n"); 
if (zajety)
    return 0;
parse_command(str,all_inventory(this_player())," %i:"+PL_BIE,lista);
notify_fail("Nie masz niczego takiego.\n");
lista=NORMAL_ACCESS(lista,0,0);
if (!sizeof(lista))
  return 0;

notify_fail("Ciekawe jak ten przedmiot wszedl w twoje posiadanie? "+
               "Zglos blad na ten temat.\n");
if (lista[0]->query_prop(OBJ_M_NO_GET))
   return 0;
if (lista[0]->query_prop(OBJ_M_NO_GIVE))
    {
    if (stringp(lista[0]->query_prop(OBJ_M_NO_GIVE)))
        notify_fail(lista[0]->query_prop(OBJ_M_NO_GIVE));
    else
        notify_fail("Nie mozesz oddac "+check_call(QSHORT(lista[0],PL_DOP),
            this_player())+".\n");
    return 0;
    }
if (lista[0]->query_prop(OBJ_M_NO_DROP))
    {
    if (stringp(lista[0]->query_prop(OBJ_M_NO_DROP)))
         notify_fail(lista[0]->query_prop(OBJ_M_NO_DROP));
    else
         notify_fail("Nie mozesz porzucic "+check_call(QSHORT(lista[0],PL_DOP),
                this_player())+".\n");
    return 0;
    }
notify_fail("");
return lista;
}
/**************************************************************************/
/**************************************************************************/
/**************************************************************************/

int
napraw(string str)
{
int i,j,cena=0,*m;
object ob,*lista;
lista=sprawdz(str);
if (!sizeof(lista))
  return 0;
if (!function_exists("create_armour",lista[0]))
     {
       command("powiedz " + capitalize(lista[0]->short(TP,PL_MIA)) +
       		" nie jest zbroja.");
       return 1;
     }
if (!lista[0]->query_prop(OBJ_I_VALUE)){
     command("powiedz "+capitalize(lista[0]->query_nazwa(PL_MIA))
                                  +" nie nadaje sie do naprawy.");
     return 1;
  }
   cena = lista[0]->query_prop(OBJ_I_VALUE)*znajdz_max_repair(lista[i])*5/20;
  if (cena<0)
     {
        command("powiedz "+lista[i]->koncowka("Ten ","Ta ","To ")+
                     lista[i]->query_nazwa(PL_MIA)+
                                 " nie nadaje sie do naprawy.");
        return 1;
     }
  if (!cena)
     command("powiedz "+lista[0]->koncowka("Ten ","Ta ","To ")+
                     lista[0]->query_nazwa(PL_MIA)+
                                 " nie wymaga naprawy.");
  else 
  {
    notify_fail("Nie masz czym zaplacic.\n");
    if (!can_pay(cena,this_player()))
      return 0;
    m=what_coins(this_player());
    m[3]=0;
    if (!can_pay_arr(cena,m)){
       command("powiedz do "+OB_NAME(this_player())+
          " Przykro mi ale nie przyjmuje mitrylowych monet.");
       return 1;
    }
    if (naprawiane[environment(lista[0])])
      zwrot();
    write("Placisz "+this_object()->query_imie(this_player(),PL_CEL)+" "+
                              text(split_values(cena),3)+".\n");
    

    pay(cena,this_player(),0,0,0,0);
    naprawiane[environment(lista[0])]=lista[0]; 
    lista[0]->set_repair(znajdz_max_repair(lista[0])+lista[0]->query_repair());
    if (lista[0]->move(this_object()))
      write("Wystapil nieoczekiwany blad, prosze 'zglos blad' o tym.\n");
    
    write(this_object()->query_Imie(this_player(),PL_MIA)+" bierze twoj"+
          lista[0]->koncowka(" ","a ","e ")+lista[0]->query_nazwa(PL_BIE)+".\n");
    say(QCIMIE(this_object(),PL_MIA)+" bierze " + 
         lista[0]->short(PL_BIE)+" od "+QIMIE(this_player(),
        PL_DOP)+" do naprawy.\n");
    
    pracuj();
  }
    return 1;
}

/**************************************************************************/

int
oczysc(string str)
{
int i,j,cena=0,*m;
object ob,*lista;
lista=sprawdz(str);
/* Tigr: uwaga: komentarze w tej f-cji odnosza sie tez to odpowiednich 
     miejsc w f-cjach oczysc i naostrz */
/* Tigr: zmienilem !lista na !sizeof(lista) */
if (!sizeof(lista))
  return 0;
/* Tigr: Dodalem to sprawdzenie: */  
  if (!function_exists("create_weapon",lista[0]))
     {
       command("powiedz " + capitalize(lista[0]->short(TP,PL_MIA)) +
       		" nie jest bronia.");
       return 1;
     }
  if (!lista[0]->query_prop(OBJ_I_VALUE)){
     command("powiedz "+capitalize(lista[0]->query_nazwa(PL_MIA))
                                  +" nie nadaje sie do czyszczenia.");
     return 1;
  }
   cena = lista[0]->query_prop(OBJ_I_VALUE)*znajdz_max_corr(lista[i])*5/20;
/* Tigr: dodalem to. oznacza to, ze obiekt jest nie do naprawienia */
  if (cena<0) 
     {
        command("powiedz "+lista[i]->koncowka("Ten ","Ta ","To ")+
                     lista[i]->query_nazwa(PL_MIA)+
                                 " nie nadaje sie do czyszczenia.");
        return 1;
     }
  if (!cena)
     command("powiedz "+lista[0]->koncowka("Ten ","Ta ","To ")+
                     lista[0]->query_nazwa(PL_MIA)+
                                 " nie wymaga czyszczenia.");
  else 
  {
    notify_fail("Nie masz czym zaplacic.\n");
    if (!can_pay(cena,this_player()))
      return 0;
    m=what_coins(this_player());
    m[3]=0;
    if (!can_pay_arr(cena,m)){
       command("powiedz do "+OB_NAME(this_player())+
          " Przykro mi ale nie przyjmuje mitrylowych monet.");
       return 1;
    }
    if (naprawiane[environment(lista[0])])
      zwrot();
    write("Placisz "+this_object()->query_imie(this_player(),PL_CEL)+" "+
                              text(split_values(cena),3)+".\n");
    
    pay(cena,this_player(),0,0,0,0);
    naprawiane[environment(lista[0])]=lista[0]; 
    lista[0]->set_repair_corr(
                  znajdz_max_corr(lista[0])+lista[0]->query_repair_corr());
    if(lista[0]->move(this_object()))
      write("Wystapil nieoczekiwany blad, prosze 'zglos blad' o tym.\n");
    
    write(this_object()->query_Imie(this_player(),PL_MIA)+" bierze twoj"+
          lista[0]->koncowka(" ","a ","e ")+lista[0]->query_nazwa(PL_BIE)+".\n");
    say(QCIMIE(this_object(),PL_MIA)+" bieze " + 
       lista[0]->short(PL_BIE) + " od "+QIMIE(this_player(),
        PL_DOP)+" do czyszczenia.\n");
    
    pracuj();
  }
    return 1;
}

/**************************************************************************/

int
naostrz(string str)
{
int i,j,cena=0,*m;
object ob,*lista;
lista=sprawdz(str);
if (!sizeof(lista))
  return 0;
  if (!function_exists("create_weapon",lista[0]))
     {
       command("powiedz " + capitalize(lista[0]->short(TP,PL_MIA)) +
       		" nie jest bronia.");
       return 1;
     }
  if (!lista[0]->query_prop(OBJ_I_VALUE)){
     command("powiedz "+capitalize(lista[0]->query_nazwa(PL_MIA))
                                  +" nie nadaje sie do ostrzenia.");
     return 1;
  }
   cena = lista[0]->query_prop(OBJ_I_VALUE)*znajdz_max_dull(lista[i])*5/20;
  if (cena<0) 
     {
        command("powiedz "+lista[i]->koncowka("Ten ","Ta ","To ")+
                     lista[i]->query_nazwa(PL_MIA)+
                                 " nie nadaje sie do ostrzenia.");
        return 1;
     }
  if (!cena)
     command("powiedz "+lista[0]->koncowka("Ten ","Ta ","To ")+
                     lista[0]->query_nazwa(PL_MIA)+
                                 " nie wymaga ostrzenia.");
  else 
  {
    notify_fail("Nie masz czym zaplacic.\n");
    if (!can_pay(cena,this_player()))
      return 0;
    m=what_coins(this_player());
    m[3]=0;
    if (!can_pay_arr(cena,m)){
       command("powiedz do "+OB_NAME(this_player())+
          " Przykro mi ale nie przyjmuje mitrylowych monet.");
       return 1;
    }
    if (naprawiane[environment(lista[0])])
      zwrot();
    write("Placisz "+this_object()->query_imie(this_player(),PL_CEL)+" "+
                              text(split_values(cena),3)+".\n");
    
    pay(cena,this_player(),0,0,0,0);
    naprawiane[environment(lista[0])]=lista[0]; 
    lista[0]->set_repair_dull(
                  znajdz_max_dull(lista[0])+lista[0]->query_repair_dull());
    if (lista[0]->move(this_object()))
      write("Wystapil nieoczekiwany blad, prosze 'zglos blad' o tym.\n");
    write(this_object()->query_Imie(this_player(),PL_MIA)+" bierze twoj"+
          lista[0]->koncowka(" ","a ","e ")+lista[0]->query_nazwa(PL_BIE)+".\n");
    say(QCIMIE(this_object(),PL_MIA)+" bieze " + 
        lista[0]->short(PL_BIE) + " od "+QIMIE(this_player(),
        PL_DOP)+" do ostrzenia.\n");
    pracuj();
  }
    return 1;
}

/**************************************************************************/

int
zrob(string str)
{
int cena=0,*m;
int cenna;
object ob,*lista;
notify_fail (this_object()->query_Imie(this_player(),PL_MIA)+
                  " ignoruje cie, jakby cie nie zauwazal.\n");
if (!(CAN_SEE_IN_ROOM(this_object())&&CAN_SEE(this_object(),this_player())))
  return 0;
notify_fail("Tak, ale co?\n");
if (!str)
  return 0;
notify_fail("Kowal jest pochloniety praca, nie wypada mu teraz przeszkadzac.\n"); 
if (zajety)
  return 0;
notify_fail("Niczego takiego nie robie.\n");
if (!parse_command(str,m_indexes(eq)," %i:"+PL_BIE,lista))
    return 0;
notify_fail("Niczego takiego nie robie.\n");
if (!lista)
  return 0;
  if (this_player()->query_real_name() == "alvin")
  {
  dump_array(lista);
  dump_array(lista->short());
  }
notify_fail("Niczego takiego nie robie.\n");
lista=lista[1..sizeof(lista)-1]; 

    if(lista[0]->query_prop(OBJ_I_VALUE) > WARTOSC)
      cenna = lista[0]->query_prop(OBJ_I_VALUE)*10;
    else
      cenna = lista[0]->query_prop(OBJ_I_VALUE)*3;

cena = cenna;
notify_fail("Nie masz czym zaplacic.\n");
if (!can_pay(cena,this_player()))
    return 0;
m=what_coins(this_player());
    m[3]=0;
    if (!can_pay_arr(cena,m)){
       command("powiedz do "+OB_NAME(this_player())+
          " Przykro mi ale nie przyjmuje mitrylowych monet.");
       return 1;
    }
if (naprawiane[environment(lista[0])])
      zwrot();
write("Placisz "+this_object()->query_imie(this_player(),PL_CEL)+" "+
                              text(split_values(cena),3)+".\n");
say(QCIMIE(this_player(),PL_MIA)+" zamawia cos u "+QIMIE(this_object(),
        PL_DOP)+".\n");
notify_fail("");
pay(cena,this_player(),0,0,0,0);
ob=clone_object(eq[lista[0]]);

// Obiekty od kowala sa z zasady glowing

ob->may_recover();

// Log dla mojej wiadomosci

   seteuid("silvy");
   write_file(LOG, ctime(time()) + ": " + this_player()->query_name() 
              + ", "+ob->short() + "\n");


if(ob->move(this_object()))
      write("Wystapil nieoczekiwany blad, prosze 'zglos blad' o tym.\n");
naprawiane[this_player()]=ob; 
pracuj(1,lista[0]->query_prop(OBJ_I_VALUE));
return 1;
}

/**************************************************************************/
/**************************************************************************/
/**************************************************************************/

void
init_living()
{
    add_action(zrob,   "zrob");
    add_action(zrob,  "zamow");
    add_action(naostrz, "naostrz");
    add_action(napraw, "napraw");
    add_action(oczysc, "oczysc");
    add_action ("do_pokaz", "pokaz");
    if (!zajety)
      set_alarm(0.2,0.0,zwrot);

    ::init_living();
}

/**************************************************************************/

void
naprawiamy(object ob, int *ktory_alarm = 0)
{    
    int i;
    command("emote konczy prace.");
    if(ktory_alarm)
    {
      for(i=0;i<5;i++)
        remove_alarm(ktory_alarm[i]);
    }
    zajety=0;
    zwrot();
}

/**************************************************************************/

void
catch_question(string str)
{
object *lista,dd;
int cena;
string tekst;
if (!(CAN_SEE_IN_ROOM(this_object())&&CAN_SEE(this_object(),this_player()))){
  write(this_object()->query_Imie(this_player(),PL_MIA)+
                  " ignoruje cie, jakby cie nie zauwazal.\n");
  return 0;
}
if (zajety){
  write("Kowal jest pochloniety praca, nie wypada mu teraz przeszkadzac.\n"); 
  return 0;
  }
if(parse_command(str,all_inventory(this_player()),
               " 'cene' 'naprawy' %i:"+PL_DOP,lista))
sprawdz_cene_naprawy(lista);
else if (parse_command(str,all_inventory(this_player()),
               " 'cene' 'oczyszczenia' / 'czyszczenia' %i:"+PL_DOP,lista))
sprawdz_cene_czyszczenia(lista);
else if (parse_command(str,all_inventory(this_player()),
               " 'cene' 'naostrzenia' / 'ostrzenia' %i:"+PL_DOP,lista))
sprawdz_cene_ostrzenia(lista);
else if (parse_command(str,m_indexes(eq),
               " 'cene' 'zrobienia' %i:"+PL_DOP,lista))
sprawdz_cene_zrobienia(lista);
else 
  if(parse_command(str,all_inventory(this_player()),
      " 'cene' 'naostrzenia' / 'naprawy' / 'oczyszczenia' / 'ostrzenia'"+
        " / 'czyszczenia' %s",tekst))
     if (tekst!="")
     command("powiedz Nie masz niczego takiego!");
     else
     command("powiedz Hmm, tak, ale czego?");
  else
  if(parse_command(str,m_indexes(eq),
      " 'cene' 'zrobienia' %s",tekst))
     if (tekst!="")
     command("powiedz Nie robie niczego takiego!");
     else
     command("powiedz Hmm, tak, ale czego?");

if (!lista&&!tekst)
::catch_question(str);
return;
}

int
do_pokaz(string str)
{
    object *item_arr;
    int i, *arr;

    notify_fail("Co pokazac?\n");
    if(!str) return 0;

    item_arr = m_indexes(eq);

    if (!sizeof(item_arr))
    {
        notify_fail("Niestety nie mozesz obejrzec "+str+".\n");
        return 0;
    }

    item_arr = FIND_STR_IN_ARR(str, item_arr, PL_BIE);

    if (sizeof(item_arr) < 1)
    {
        notify_fail("Niestety nie mozesz obejrzec "+str+".\n");
        return 0;
    }

    this_player()->catch_msg(item_arr[0]->long());

    return 1;
}
