/* Zielarnia
*  Napisane przez Alfena
*  obiekt przeznaczony do dziedziczenia
*  tak w lokacji, jak i w npc'u
*/

#include <pl.h>
#include <money.h>
#include <stdproperties.h>
#include <macros.h>
#include <ss_types.h>
#include <composite.h>

private mixed lista_ziol=({});
static string nazwa_pliku_str=0;

#define NAZWA 2
#define SCIEZKA 0
#define ILOSC 1



string money_short(int *i, int cal);
void dodaj_ziola(mixed z, int il=1);
mixed query_ziola(int nr=-1);
int klonuj_ziolo(mixed z);
void ustaw_nazwe_pliku_ziol(string nazwa);
string query_nazwa_pliku_ziol();


int do_kup(string s);
int do_sprzedaj(string s);
int do_przejrzyj(string s);

int query_sell_price(object ob);
int query_buy_price(object ob);


void init_ziola();

void ziola_hook_kup_cant_pay(object ob);
void ziola_hook_kup(object ob);
void ziola_hook_kup_cant_get(object ob);

void ziola_hook_no_herbs();

void ziola_hook_przejrzyj();
void ziola_hook_przejrzyj_ziolo(int i);

void ziola_hook_sprzedaj_no_herb(object ob);
void ziola_hook_sprzedaj_no_price(object ob);
void ziola_hook_sprzedaj(object ob);


void 
ziola_hook_no_herbs()
{
  notify_fail("Ziol brak.\n");
}


void
ustaw_nazwe_pliku_ziol(string nazwa)
{
  nazwa_pliku_str = nazwa;
}


string
query_nazwa_pliku_ziol()
{
  return nazwa_pliku_str;
}


void
init_ziola()
{
  add_action(do_kup,"kup");
  add_action(do_sprzedaj,"sprzedaj");
  add_action(do_przejrzyj,"przejrzyj");
}


void
dodaj_ziola(mixed z, int il=1)
{
  int ok, i=sizeof(lista_ziol);
  string s;
  
  if (!z)
    return ;
    
  
  if (stringp(z))
 {
    s = z;
    if (wildmatch("*.c",s))
      s = extract(s,0,strlen(s)-3);
  }
  else
  {
    s = MASTER_OB(z);
    if (!z->remove_object())
      notify_fail("Zglos buga, zwiazanego z niemoznoscia usuniecia ziola.\n");
  }
  
  if (il<1)
    return ;
    
  ok=-1;
  while ((--i>=0)&&(ok==-1))
  {
    if (lista_ziol[i][SCIEZKA]==s)
      ok=i;
  }
  if (ok==-1)
  {
    lista_ziol+=allocate(1);
    i = sizeof(lista_ziol)-1;
    lista_ziol[i]=allocate(3);
    lista_ziol[i][SCIEZKA]  = s;
    lista_ziol[i][ILOSC] = il;
    lista_ziol[i][NAZWA] = s->query_nazwa_ziola(PL_BIE);
  }
  else
  {
    lista_ziol[ok][ILOSC]+=il;
  }
  
}


mixed 
query_ziola(int nr=-1)
{
  int i = sizeof(lista_ziol);
  
  if ((nr<0)||(nr>i))
    return lista_ziol;
  return lista_ziol[nr];
}


object
klonuj_ziolo(mixed z)
{
  object pom;
  int ok, i = sizeof(lista_ziol);
  
  if (!stringp(z)&&!intp(z))
    return 0;
  
  if (stringp(z))
  {
    ok=-1;
    while (--i>=0)
    {
      if (lista_ziol[i][SCIEZKA]==z)
        ok =i;
    }
    if (ok==-1)
      return 0;
    
  }
  else
    ok = z;
  z = lista_ziol[ok][SCIEZKA];
  if (!lista_ziol[ok][ILOSC])
  {
    lista_ziol-=({lista_ziol[ok]});
    return 0;
  }
  if (!(--lista_ziol[ok][ILOSC]))
      lista_ziol-=({lista_ziol[ok]});
  if (pom = clone_object(z))
    pom -> force_dry();
  else
    notify_fail("Zglos buga zwiazanego z niemoznoscia sklonowania ziola.\n");
  return pom;
}


void
ziola_hook_przejrzyj_ziolo(int i)
{
  if (!find_object(lista_ziol[i][SCIEZKA]))
    LOAD_ERR(lista_ziol[i][SCIEZKA]);
  write(sprintf("%-40s %-39s\n",
      capitalize(lista_ziol[i][SCIEZKA]->query_nazwa_ziola(PL_MIA)),
      money_short(MONEY_SPLIT(query_buy_price(lista_ziol[i][SCIEZKA])), 1)));
}


int
do_przejrzyj(string s)
{
  int i = sizeof(lista_ziol);
  
  if ((s!="ziola")&&(s!="cennik")&&s)
  {
    notify_fail("Co przejrzec?\n");
    return 0;
  }
  
  if (!i)
    ziola_hook_no_herbs();
  while (--i>=0)
  {
    ziola_hook_przejrzyj_ziolo(i);
  }
  ziola_hook_przejrzyj();
  return 1;
}


void
ziola_hook_przejrzyj()
{
  say(QCIMIE(this_player(), PL_MIA)+" przeglada ziola wystawione na "+
    "sprzedaz.\n");
}



int
do_kup(string s)
{
  int i;
  object ob;
  
  
  if (!s)
  {
    notify_fail("Co chcesz kupic?\n");
    return 0;
  }
  if (!(i=sizeof(lista_ziol)))
  {
    ziola_hook_no_herbs();
    return 0;
  }
  
  while ((--i>=0)&&(s!=lista_ziol[i][NAZWA]));
  
  if (i<0)
  {
    notify_fail("Co chcesz kupic?\n");
    return 0;
  }
  
  if (!(ob=klonuj_ziolo(i)))
  {
    notify_fail("Zglos buga, zwiazanego z klonowaniem ziola.\n");
    return 0;
  }
  
  if (TOTAL_MONEY(this_player())<query_buy_price(ob))
  {
    ziola_hook_kup_cant_pay(ob);
    dodaj_ziola(ob);
    return 0;
  }
  
  if (ob->move(this_player()))
  {
    ziola_hook_kup_cant_get(ob);
    dodaj_ziola(ob);
    return 0;
  }

  MONEY_ADD(this_player(), -query_buy_price(ob));
  ziola_hook_kup(ob);
  return 1;
}


void
ziola_hook_kup_cant_get(object ob)
{
 notify_fail("Niestety "+ob->query_nazwa_ziola(PL_MIA) +
      " jest dla Ciebie zbyt ciezk"+ob->koncowka("i","a","ie")+".\n"); 
}



void
ziola_hook_kup_cant_pay(object ob)
{
  notify_fail("Nie posiadasz dostatecznej ilosci pieniedzy.\n");
}


void
ziola_hook_kup(object ob)
{
  write("Kupil"+this_player()->koncowka("es","as")+" " + 
    ob->query_nazwa_ziola(PL_BIE)+".\n");
  write("Zaplacil"+this_player()->koncowka("es","as")+" "+
    MONEY_TEXT(MONEY_SPLIT(query_buy_price(ob)),PL_BIE)+".\n");
  say(QCIMIE(this_player(), PL_MIA)+ " kupuje "+
    ob->short(PL_BIE)+".\n");
}



void ziola_hook_sprzedaj(object ob)
{
  write("Sprzedal"+this_player()->koncowka("es","as")+" "+
    ob->short(PL_BIE)+".\n");
  write("Otrzymal"+this_player()->koncowka("es","as")+" "+
    MONEY_TEXT(MONEY_SPLIT(query_sell_price(ob)), PL_BIE)+".\n");
  say(QCIMIE(this_player(), PL_MIA)+" sprzedaje "+
    ob->short(PL_BIE)+".\n");
}

int
czy_sprzedac(object ob)
{
  if (!function_exists("create_herb",ob))
  {
    ziola_hook_sprzedaj_no_herb(ob);
    return 0;
  }
  
  if(ob->query_prop(OBJ_I_INVIS))
  {
    notify_fail("Co chcesz sprzedac?\n");
    return 0;
  }  
  
  if (query_sell_price(ob)<1)
  {
    ziola_hook_sprzedaj_no_price(ob);
    return 0;
  }
  
  return 1;
}


int
do_sprzedaj(string s)
{
  mixed obs;
  object *ob=({});
  int i,cena=0;
  
  if (!s||s=="")
  {
    notify_fail("Co chcesz sprzedac?\n");
    return 0;
  }
  
  parse_command(s,all_inventory(this_player()), " %i:"+PL_BIE,obs);
  
  if (!sizeof(obs)) return notify_fail("Co chcesz sprzedac?\n");
  
  if (obs[0]<0) ob = ({obs[-(obs[0])]});
  if (obs[0]==1) ob = ({obs[1]});
  if (!obs[0]) {
                ob = allocate(sizeof(obs)-1);
                for (i=1;i<sizeof(obs);i++)
                    ob[i-1] = obs[i];
               }
  
  ob  = filter(ob, czy_sprzedac);
  
  if (!sizeof(ob)) 
     {
       write("Niczego nie sprzedajesz.\n");
       return 1;
     }
  
  for (i=0;i<sizeof(ob);i++)
      { cena+=query_sell_price(ob[i]);}
      
  MONEY_ADD(this_player(), cena);
  
  write("Dostajesz " + MONEY_TEXT(MONEY_SPLIT(cena),PL_BIE) + ".\n");
  write("Sprzedajesz " + COMPOSITE_DEAD(ob,PL_BIE) + ".\n");
  say(QCIMIE(this_player(),PL_MIA) + " sprzedaje " + COMPOSITE_DEAD(ob,PL_BIE) + ".\n");
  
  for (i=0;i<sizeof(ob);i++)
      { dodaj_ziola(ob[i]); }
  
  return 1;
}


void
ziola_hook_sprzedaj_no_herb(object ob)
{
  notify_fail("Skupuje tylko ziola.\n");
}


void
ziola_hook_sprzedaj_no_price(object ob)
{
  notify_fail("To ziolo jest bezwartosciowe.\n");
}



int
zapisz_ziola()
{
  if (!nazwa_pliku_str)
    return 0;
  if (!sizeof(lista_ziol))
  {
    if (file_size(nazwa_pliku_str+".o")>=0)
      rm (nazwa_pliku_str+".o");
    return 0;
  }
  save_map((["lista_ziol":lista_ziol]), nazwa_pliku_str);
  return 1;
}  


int
odczytaj_ziola()
{
    mapping temp;

    return stringp(nazwa_pliku_str) && file_size(nazwa_pliku_str+".o") > 0 &&
           mappingp(temp = restore_map(nazwa_pliku_str)) &&
           pointerp(lista_ziol = temp["lista_ziol"]);
}


int
query_buy_price(object ob)
{
  int seed;
  int ile;
  ile = 2*ob->query_herb_value() -
      (ob->query_herb_value()*this_player()->query_skill(SS_TRADING)/300);
  return ile;
}


int
query_sell_price(object ob)
{
  int seed=1;
  
  int ile;
  ile = ob->query_herb_value() + 
      (ob->query_herb_value()*this_player()->query_skill(SS_TRADING)/300);
  return ile;
}


string
money_short(int *i, int cal=1)
{
  int j;
  string pom="";
  string *typy = ({"mt","z","s","m"});
 
  if (sizeof(i)!=4)
    return ""; 
  if (cal)
  {
    pom = sprintf("%5d %1s, %5d %1s, %5d %1s, %5d %1s, ",
       i[3], "mt",
       i[2], "z",
       i[1], "s",
       i[0], "m");
  }
  else
    for (j=0; j<sizeof(i); j++)
      if (i[j])
        pom += sprintf("%5d %1s, ",i[3-j],typy[3-j]);
  return extract(pom,0, strlen(pom)-3);
}
