
// Pomysl Silvy, wykonanie Alfen
// Powazne zmiany i modyfikacje - Silvy III 98
// Przerobienie - Tigr V 99

inherit "/lib/trade.c";
inherit "/d/Imperium/std/room.c";

#include <time.h>
#include "alfen.h"
#include "silvy.h"
#include <stdproperties.h>
#include <language.h>
#include <money.h>
#include <cmdparse.h>
#include <composite.h>
#include <filter_funs.h>
#include <macros.h>

#define const 7200
#define SEC 3600
#define MAX_AUKC 20
#define MAX_KLONOW(ob) 2+(ob->query_prop(OBJ_I_VALUE)/poprzeczka_cenowa)
#define PROC 20

#define NAME TP->query_real_name()
#define AUKCJA_NULN_I_LIC_CENA "_aukcja_nuln_i_lic_cena"
#define AUKCJA_NULN_S_WYST "_aukcja_nuln_s_wyst"

static string store_room;
static string sprzedawca;
static string log_gieldy;

private object ob_sprzedawca;
private mixed aukcja; 
private int poprzeczka_cenowa;
private mapping frs=([]);
static mapping tempor=([]);
private string nieuczciwi="";
private mapping odbieramy=([]);

#define WYSTAWIAJACY	0
#define KUPUJACY	1
#define CENA		2
#define OBIEKT		3
#define CZAS		4

#define OBJ_O_WYSTAW_NA_AUKCJE "_obj_o_wystaw_na_aukcje_"
#define PNAZWA(ob, przyp) (ob->short(przyp) ? ob->short(przyp) : ob->query_nazwa(przyp))

int gielda_hook_react_not_see(object ob);

gielda_hook_wystaw_not_accepted(object ob);
int gielda_hook_wystaw_no_sell(object ob);
int gielda_hook_wystaw_worn_or_wielded(object ob);
int gielda_hook_wystaw_no_value(object ob);
int gielda_hook_wystaw_to_low_price(object ob);
int gielda_hook_wystaw_no_move(object ob);
int gielda_hook_wystaw_potwierdz(object ob);
int gielda_hook_wystaw_no_drop(object ob);
int gielda_hook_wystaw_za_duzo_klonow(object ob);
int gielda_hook_wystaw(object ob);

/* Dwie ponizsze funkcje sluza do okreslenia komentarza, czy tez konkretnej
*  akcji na uzycie magii badz zaatakowanie kogos na terenie gieldy
* 0 - uzycie odpowiednio magii lub zaatakowanie kogos jest dozwolone
* 1 - zabronione. Mozna pokryc te funkcje, powodujac 
* np.: okreslona reakcje ze strony npcow
*/
int gielda_hook_attack();
int gielda_hook_magic();
string gielda_hook_magic_txt();
string gielda_hook_attack_txt();

int gielda_hook_koniec_licytacji(object ob, string kupiec);

int gielda_hook_podbij(int nr, int *v, object o1);
int gielda_hook_podbij_low_cash(object gracz);
int gielda_hook_podbij_to_small(object o1);

int gielda_hook_podbij_wycofaj_koniec(int nr=-1);

int gielda_hook_odbierz_ob_too_heavy(object *ob);
//int gielda_hook_odbierz_money(int *v, int nr);
int gielda_hook_odbierz_ob(int *v, object *o1);
//int gielda_hook_odbierz_no_end(int nr);
//int gielda_hook_odbierz_incorrect_person_money(object ob, string kto);
//int gielda_hook_end_of_aukcja(int i);
int gielda_hook_odbierz_no_present();
int gielda_hook_odbierz_cant_pay(object *ob);

int gielda_hook_wycofaj(object ob, int *v);
int gielda_hook_wycofaj_armageddon(object ob);
int gielda_hook_wycofaj_cant_pay(object ob);
int gielda_hook_wycofaj_incorrect_person(object ob); 
int gielda_hook_wycofaj_ob_too_heavy(object ob);

int czy_player();
string standard_tablica();

void
loguj(string str)
{
   string *pom,s;
   int p;
   
   seteuid("silvy");
   
   p=strlen(s=ctime(time()) + " : ");
   
   pom=explode(break_string(s+str,80),"\n");
   s=pom[0]+"\n"+break_string(implode(exclude_array(pom,0,0)," "),80,p);
   
   write_file(log_gieldy,s+"\n");
}

// Ok
string 
query_log_file()
{
  return log_gieldy;
}

// Ok
void 
set_log_file(string s)
{
  log_gieldy=s;
}

// Ok
void
set_min_price(int price)
{
  poprzeczka_cenowa = price;
}

// Ok
int
query_min_price()
{
  return poprzeczka_cenowa;
}

// Ok
void 
set_shop_keeper(string sp)
{ 
    if (ob_sprzedawca = clone_object(sp))
    {
      ob_sprzedawca -> move(TO);
      sprzedawca =  sp;
    }
}

// Ok
object
query_shop_keeper()
{
  return ob_sprzedawca;
}

// Ok
void 
set_store_room(string s)
{
  store_room = s;
}

// Ok
string 
query_store_room()
{
  return store_room;
}

// Ok
int
gielda_hook_magic()
{ 
  return 1;
}

// Ok
int
gielda_hook_attack()
{ 
  return 1;
}

// Ok
string
gielda_hook_attack_txt()
{
  if (TP)
    if (czy_player())
    {
      say(QCIMIE(TP, PL_MIA) + TP->koncowka(" zostal otoczony"," zostala otoczona")+" "+
        "niebieska poswiata.\n");
      TP->command("w");
    }
  return "Tajemnicza sila zmusza cie do opuszczenia terenu Gieldy.\n";
}

// Ok
string
gielda_hook_magic_txt()
{
  if (TP)
    if (czy_player())
    {
      say(capitalize(QIMIE(TP, PL_MIA)) + TP->koncowka(" zostal otoczony"," zostala otoczona")+" "+
        "niebieska poswiata.\n");
      TP->command("w");
    }
  return "Wyczuwasz, ze magia, jaka sie posluzy"+TP->koncowka("les","las")+" obrocila sie przeciw "+
    "tobie. Cos zmusilo cie do opuszczenia budynku gieldy.\n";
}

int
gielda_hook_react_not_see(object ob)
{
   ob_sprzedawca->command("emote rozglada sie z zagubieniem.");
   return 1;
}

// Ok
mixed 
query_aukcja()
{
  return aukcja;
}

// Ok
int 
czy_player()
{
  if (!interactive(TP)) return 0;
  return !TP->query_wiz_level();
}

// Ok
void 
create_gielda()
{
    
    if (file_size(NPATH + "inne/aukcja_kasa.o")>0)
    {
        setuid(); seteuid(getuid());
        restore_object(NPATH + "inne/aukcja_kasa");
        aukcja = ({});
        odbieramy=([]);
    }
  
  set_long("@@dlugi");
  set_short("Dom Aukcyjny Hoffera");

  set_store_room(NPATH + "sklepy/magazyn_gieldy.c");
  set_log_file( NPATH + "inne/gielda.log");
  set_shop_keeper(NPATH + "npc/aukcyjny.c");
  set_min_price(600); 

  set_alarm(3600.0, 3600.0, "nagrywamy_gielde");
  
//  add_exit( store_room, "polnoc", "@@czy_player", 1);
  add_exit(NPATH + "lokacje/magow.c","zachod");
  
  add_item (({"tabliczke", "srebrna tabliczke"}),
    "Jest cos na niej napisane.\n");
  add_item(({"tablice", "marmurowa tablice"}),
    "Jest cos na niej napisane.\n");
  add_item("dywan","Marmurowe posadzki wylozone sa miekkim miekkim, " +
      "puszystym dywanym, ozdobionym przedziwnymi ornamentami.\n");
  add_item("arrasy","Przywiezione tu z najdalszych zakadkow swiata arrasy " +
      "to oznaka bogactwa wlasciciela domu aukcyjnego.\n");
  add_item("kontuar","Obowiazkowy element kazdego domu akcyjnego. " +
      "Ustawiono na nim wystawione do licytacji przedmioty.\n");
  add_item("sztaluge","Przymocowano do niej tabliczke informacyjna.\n");     
  
    
  add_read_item(({"napis na tabliczce", "tabliczke", 
    "napis na srebrnej tabliczce", "srebrna tabliczke"}),
    "@@standard_tabliczka");
  add_read_item(({"napis na marmurowej tablicy", "napis na tablicy",
    "tablice", "marmurowa tablice"}), "@@standard_tablica");
  
  add_item("plakat", "Napisano na nim jakis tekst.\n");
  add_read_item(({"tekst","tekst z plakatu","plakat"}),
    "@@plakat");
}

string
dlugi()
{
    string str;
    str = "";
    str += "Znajdujesz sie w dobrze utrzymanym budynku. "+
     "Na podlodze rozlozono miekki, puszysty dywan. Sciany sa "+
     "ozdobine bogatymi arrasami. Przed toba znajduje sie kontuar. " +
     "Po lewej stronie kontuaru stoi machoniowa sztaluga. Przymocowano " +
     "do niej srebrna tabliczke. Na jednej za scian znajduje sie "+
     "okazaly plakat, obok niego zawieszona jest tablica.\n";
    return str;
}

// Ok
string
plakat()
{
  int i, tmp;
  string pom=query_short()+" wita Szanownych Gosci.\n";
  string *names=sort_array(m_indexes(frs));
  
  if (tmp=sizeof(names))
  {
    pom = "Pieniedzy za zalegle aukcje nie odebrali:\n";
    for (i=0; i < tmp; i++) names[i]=capitalize(names[i]);
    pom+=COMPOSITE_WORDS(names);
    
    pom+=".\nZ gory dziekujemy i zapraszamy do korzystania z uslug "+
      "Domu Aukcyjnego Hoffera.\n";
  }
  return pom;
}

// Ok
string 
standard_tabliczka()
{
  return " Gielda przedmiotow drogocennych. Mozesz tu:\n" + 
    "  - wystawic przedmiot na licytacje.\n"+ 
    "      np. 'wystaw szpilke na 2 godziny'.\n"+
    "    W celu potwierdzenia transakcji, nalezy wystawic przedmiot 2 razy.\n"+
    "  - podbic cene jednego z licytowanych przedmiotow.\n"+
    "      np. 'podbij cene szpilki do 0 0 0 1'.\n"+
    "    Pierwsza liczba oznacza ilosc sztuk mithrylu, druga zlota itd.\n"+
    "    Dozwolone jest nie pisac koncowe zera.\n"+
    "      np. 'podbij cene szpilki do 1'.\n"+
    "  - odebrac przedmiot, po wygraniu licytacji.\n"+
    "      np. 'odbierz szpilke'.\n"+
    "  - wycofac przedmiot z licytacji.\n"+ 
    "      np. 'wycofaj szpilke'.\n"+
    "    Uwaga! Wycofujacy zaplaci "+PROC+"% ceny wywolawczej.\n"+
    "    W przypadku gdy cena zostala podbita, nie mozna\n"+
    "    juz wycofac przedmiotu z licytacji.\n"+
    "  - przejrzec prowadzone licytacje lub przedmioty do odebrania:\n"+
    "      'przejrzyj', 'przejrzyj aukcje nr 1', 'przejrzyj odbierane'.\n"+
    "  - odebrac zalegle pieniadze za przedmiot sprzedany na licytacji:\n"+
    "      'odbierz pieniadze'\n"+
    "    Uwaga! Pobieramy prowizje w wysokosci "+PROC+"% wylicytowanej kwoty.\n"+
    "  - obejrzec przedmiot wystawiony na licytacje.\n"+
    "      np. 'pokaz miecz', 'pokaz trzecia halabarde'.\n";
} 

// Ok
string 
standard_tablica()
{
  string str;
  str = "";
  str += (" Oto lista tych, ktorzy wygrali licytacje przed ostatnia Apokalipsa, a nie zglosili sie z "+
      "pieniedzmi:\n");
  str += (nieuczciwi);
  return str;
}

// Ok
void 
create_imperium_room()
{
  aukcja=({}); 
  config_default_trade();
  add_prop (ROOM_I_INSIDE, 1);
  add_prop (ROOM_I_NO_SKY, 1);
  add_prop (ROOM_I_LIGHT, 3);
  add_prop (ROOM_I_NO_MAGIC, "@@gielda_hook_magic");
  add_prop (ROOM_M_NO_MAGIC, "@@gielda_hook_magic_txt");
  poprzeczka_cenowa = 0;
  ob_sprzedawca = sprzedawca = 0;
  create_gielda();
}

// Ok
void 
reset_gielda()
{
    if(!ob_sprzedawca)
    {
        ob_sprzedawca=clone_object(sprzedawca);
        ob_sprzedawca->move(TO);
    }    
}

// Ok
void 
reset_imperium_room()
{
  reset_gielda();
}

int
wez_procent(int od_czego, int jaki)
{
   return (od_czego*jaki)/100;
}

object *
sprawdz_aukcje()
{
   int i=sizeof(aukcja),p1;
   string p2,p4;
   object *tmp=({}),p3;
   
   while (i--)
     {
        if (aukcja[i][CZAS]<time()+const)
           {
              p1=aukcja[i][CENA];
              p3=aukcja[i][OBIEKT];
              if ((p2=aukcja[i][KUPUJACY])!=query_short()&&stringp(p2))
                 {
                    if (!pointerp(odbieramy[p2])) odbieramy[p2]=({});
                    odbieramy[p2]+=({p3});
                    p3->add_prop(AUKCJA_NULN_I_LIC_CENA, p1);
                    p3->add_prop(AUKCJA_NULN_S_WYST,
                    	p4=aukcja[i][WYSTAWIAJACY]);
                    loguj("Koniec licytacji o " + 
                    	p3->short(PL_BIE) + ", wystawi" +
                    	p3->koncowka("ony","ona","one","wni","one") + " przez '" +
                    	capitalize(p4) + "'. Licytacje wygral " + capitalize(p2) +
                    	", wylicytowana cena - " + text(split_values(p1),PL_DOP) +
                    	".");
                    	
                 }
              else
                 {
                    p1-=wez_procent(p1,PROC);
                    p4=aukcja[i][WYSTAWIAJACY];
                    frs[p4]+=p1;
                    loguj("Koniec licytacji o " + 
                    	p3->short(PL_BIE) + ", wystawi" +
                    	p3->koncowka("ony","ona","one","wni","one") + " przez '" +
                    	capitalize(p4) + "', nikt nie podbil ceny przedmiotu, " +
                    	capitalize(p4) + " otrzymuje " + text(split_values(p1),PL_BIE) +
                    	".");
                 }
              tmp+=({aukcja[i][OBIEKT]});
              set_alarm(1.5,0.0,
                &gielda_hook_koniec_licytacji(aukcja[i][OBIEKT],
                			      aukcja[i][KUPUJACY]));
              
              
              aukcja-=({aukcja[i]});
              /* Po tym juz nic nie mozna wstawiac odwolujacego sie do aukcja[i] */
           }
     }
   return tmp;
}

int
gielda_hook_koniec_licytacji(object ob, string kupiec)
{
  object o=query_shop_keeper();
  
  if (objectp(o)) 
     {
        o->command("krzyknij Licytacja o " + PNAZWA(ob,PL_BIE) + " zostala " +
        	"zakonczona. "+
        	(kupiec==query_short()||!stringp(kupiec)?
        	"":"Licytacje wygral " + capitalize(kupiec) + "."));
     }
  else
     tell_room(TO, "Licytacja o " + PNAZWA(ob,PL_BIE) + " zostala " +
        	"zakonczona. "+
        	(kupiec==query_short()||!stringp(kupiec)?
        	"":"Licytacje wygral " + capitalize(kupiec) + ".")+"\n");
  return 1;  
}

object* query_przedmioty()
{
   int i;
   object *tmp=({});
   
   for (i=0;i<sizeof(aukcja);i++)
      tmp+=({aukcja[i][OBIEKT]});
   
   return tmp;
}

przypomnienie_fun(object komu)
{
   if (environment(komu)!=TO) return;
   if (!CAN_SEE(ob_sprzedawca,komu)) return;
   
   ob_sprzedawca->command("powiedz do " + OB_NAME(komu) +
           " Prosze odebrac zalegle pieniadze!");
}

mixed *
standard_access(mixed *arr)
{
  int num;
  object *a;
  
  if (!sizeof(arr)) return 0;
  
  num=arr[0];
  arr-=({num});
  
  a=COMPOSITE_SORT(arr,"short");
  
  if (!sizeof(a)) return ({});
  
  if (num==0) return a;
  
  if (num<0) return ({a[-num-1]}); //a jest juz obciete...
   
  if (num>0&&num<=sizeof(a)) return exclude_array(a,num,sizeof(a));
  
  return ({}); 
}

// Ok
void 
init_gielda()
{
   add_action ("do_wystaw", "wystaw");
   add_action ("do_przejrzyj", "przejrzyj");	//Ok
   add_action ("do_podbij", "podbij");		//OK
   add_action ("do_odbierz", "odbierz");	//OK
   add_action ("do_wycofaj", "wycofaj");	
   add_action ("do_pokaz", "pokaz");

  
  if (member_array(NAME,m_indexes(frs))>-1)
     {
	set_alarm(1.0,0.0,&przypomnienie_fun(TP));
     }
}

// Ok
void 
init()
{
  ::init();
  init_gielda();
}

int
query_thing_accepted(object ob)
{
   if (function_exists("create_object",ob)=="/std/weapon") return 1;
   if (function_exists("create_object",ob)=="/std/armour") return 1;
   if (ob->query_prop("_obj_i_wyrob_zlotniczy")) return 1;
   return 0;
}

int
jest_to_klon(string czego, object ob)
{
   return MASTER_OB(ob)==czego;
}

int
probe_wystaw_to(object ob)
{
  int value=ob->query_prop(OBJ_I_VALUE);
  
  if (!query_thing_accepted(ob)) 
     {
        gielda_hook_wystaw_not_accepted(ob);
        return 0;
     }
  
  if (!value) 
  {
    gielda_hook_wystaw_no_value(ob);
    return 0;
  }
  
  //przedmiot jest zalozony lub wyciagniety
  if ((ob->query_worn()) || ob->query_wielded()) 
  {
    gielda_hook_wystaw_worn_or_wielded(ob);
    return 0;
  }  
  
  // obiekt nie na sprzedaz
  if (ob->query_prop(OBJ_M_NO_SELL))
  {
    gielda_hook_wystaw_no_sell(ob);
    return 0;
  }
  
  if ((value <= poprzeczka_cenowa)&&(!ob->query_prop(MAGIC_AM_ID_INFO))) {
    gielda_hook_wystaw_to_low_price(ob);
    return 0;
  } 

  if (ob->query_prop(OBJ_I_NO_DROP)) 
  {
    gielda_hook_wystaw_no_drop(ob);
    return 0;
  }
  
  if (sizeof(filter(query_przedmioty(),
                    &jest_to_klon(MASTER_OB(ob))))>=MAX_KLONOW(ob))
     {
        gielda_hook_wystaw_za_duzo_klonow(ob);
        return 0;
     }
  
  return 1;
}

int
gielda_hook_wystaw_not_accepted(object ob)
{
  object o = query_shop_keeper();
  
  notify_fail("");
  if (o)
  {
    o->command("emote uwaznie oglada " + PNAZWA(ob,PL_BIE)+".");
    o->command("powiedz Nie przyjmuje tego typu rzeczy na aukcje.");
  }
  else
  {
    notify_fail ("Nie przyjmujemy takich rzeczy na aukcje.\n");
  }
  return 0;
}

// Ok
object 
wystaw_to(object ob, int czas)
{
  int value, err, cena, *value_arr, *null_arr, *null;
  
  cena = 0;
  
  call_other(store_room, "load_me"); // zaladuj store room
  
  value_arr = allocate(sizeof(query_money_types()));
  null_arr = value_arr + ({});
  
    // blad w przesunieciu obiektu
  
  cena=ob->query_prop(OBJ_I_VALUE);
  
  if (err = ob ->move (store_room)) 
  {
    gielda_hook_wystaw_no_move(ob);
    return 0;
  }
  
  aukcja+=allocate(1);  // dodaj kolejnego wystawiajacego
  aukcja [sizeof(aukcja)-1] = allocate(5);
  aukcja [sizeof(aukcja)-1] [WYSTAWIAJACY]=NAME;   
  // wystawiajacy
  aukcja [sizeof(aukcja)-1] [KUPUJACY]=query_short();
  // kupujacy
  aukcja [sizeof(aukcja)-1] [CENA]=cena; 
  // proponowana cena
  aukcja [sizeof(aukcja)-1] [CZAS]=czas; 
  // czas licytacji
  aukcja [sizeof(aukcja)-1] [OBIEKT]=ob; 
  // obiekt
  
  loguj(capitalize(NAME) + " wystawil"+ TP->koncowka("","a") + 
  	" " + ob->short(PL_BIE) + " na licytacje na " + 
  	(czas-time()-const)/SEC + " godz. Cena wywolawcza: " +
  	text(split_values(cena), PL_DOP) +".");
  
  return ob; 
}

int
czy_aukcja_idzie(mixed elem)
{
   return 1;
}

int
query_ilosc_aukcji()
{
   sprawdz_aukcje();
   return sizeof(aukcja);
}

// Wystawianie
// Ok
int 
do_wystaw (string s)
{
  string wzor, pom;
  mixed obiekty;
  object o1;
  int czas1, c1, i;
  
  if(query_ilosc_aukcji() > MAX_AUKC)
      return notify_fail("Niestety nie jestesmy w stanie "+
          "prowadzic wiecej niz " + MAX_AUKC + " licytacji na raz.\n");
  
  if (!s) 
    return notify_fail("Co wystawic na licytacje?\n");
  
  wzor = " %i:" + PL_BIE + " 'na' %d [godzin] / [godziny] / [godzine]";
  
  if (!parse_command(s, all_inventory(TP), wzor, obiekty, c1))
    return notify_fail("Wystaw <co> na <ile godzin> ?\n");
  
  obiekty = NORMAL_ACCESS(obiekty, 0, 0);
  // Teraz obiekty zawiera liste obiektow, ktore mial na mysli gracz
  
  if (!sizeof(obiekty))
       return notify_fail("Co chcesz wystawic na licytacje?\n");
  
  if (sizeof(obiekty) > 1)
    return notify_fail("Mozesz naraz wystawic tylko jeden przedmiot.\n");

  o1 = obiekty[0];
  
  czas1 = time() + c1*SEC+const;

  if (c1 < 1 ) 
    return notify_fail("Na aukcje wystawia sie rzeczy co najmniej na godzine.\n");
  
  if ( c1 > 2 ) 
    return notify_fail("Przedmiot mozna wystawic najwyzej na 2 godziny.\n");
  
  // nie wystawiac tego co ma sie na sobie lub nie posiada wartosci
  
  if (!CAN_SEE(ob_sprzedawca,TP)) return gielda_hook_react_not_see(TP);
   
  if (TP->query_prop(OBJ_O_WYSTAW_NA_AUKCJE)==o1)
  {
    TP->remove_prop(OBJ_O_WYSTAW_NA_AUKCJE);
    if (!(o1 = wystaw_to(o1, czas1))) 
    {
      return 0;
    }
    else
    {
      /*if (!(pom=o1->query_short(PL_BIE))) 
        pom=o1->query_nazwa(PL_BIE);*/

      gielda_hook_wystaw(o1);
      return 1;
    }
  }
  else 
  {
    if (probe_wystaw_to(o1)) 
       {
         if (!TP->query_prop(OBJ_O_WYSTAW_NA_AUKCJE))
            TP->add_prop(OBJ_O_WYSTAW_NA_AUKCJE, o1);
         else 
            TP->change_prop(OBJ_O_WYSTAW_NA_AUKCJE, o1);
       }
    else {TP->remove_prop(OBJ_O_WYSTAW_NA_AUKCJE);return 0;}
    
    gielda_hook_wystaw_potwierdz(o1);
  }
  return 1;
}

// Ok
int
gielda_hook_wystaw_no_sell(object ob)
{
  object o = query_shop_keeper();
  
  notify_fail("");
  if (o)
  {
    o->command("emote uwaznie ocenia " + PNAZWA(ob,PL_BIE)+".");
    o->command("powiedz " +capitalize(PNAZWA(ob, PL_MIA))+" nie moze"+
      " byc sprzedany.");
  }
  else
  {
    notify_fail (capitalize(PNAZWA(ob, PL_MIA))+" nie moze"+
      " byc sprzedany.\n");
  }
  return 0;
}

// Ok
int
gielda_hook_wystaw_no_drop(object ob)
{
  object o = query_shop_keeper();

  notify_fail("");
  if (o)
  {
    o->command("emote uwaznie ocenia " + PNAZWA(ob,PL_BIE)+".");
    o->command("powiedz Ten przedmiot nie nadaje sie do wystawienia.");
  }
  else
  {
    notify_fail (capitalize(PNAZWA(ob, PL_MIA))+
        " nie nadaje sie do wystawienia.\n");
  }
  return 0;
}

// Ok
int
gielda_hook_wystaw_to_low_price(object ob)
{
  object o = query_shop_keeper();

  notify_fail("");
  if (o)
  {
    o->command("emote uwaznie ocenia " + PNAZWA(ob,PL_BIE)+".");
    o->command("powiedz Ten przedmiot posiada "+
       "zbyt mala wartosc.");
  }
  else
  {
    notify_fail (capitalize(PNAZWA(ob, PL_MIA))+" posiada zbyt mala wartosc.\n");
  }
  return 0;
}

// Ok
int
gielda_hook_wystaw_no_move(object ob)
{
  object o = query_shop_keeper();

  notify_fail("");
  if (o)
  {
    o->command("emote uwaznie ocenia " + PNAZWA(ob,PL_BIE)+".");
    o->command("chrzaknij");
    o->command("powiedz " +"Ten " +PNAZWA(ob, PL_MIA)+" nie nadaje sie "+
       "do wystawienia.");
  }
  else
  {
    notify_fail (capitalize(PNAZWA(ob, PL_MIA))+
        " nie nadaje sie do wystawienia.\n");
  }
  return 0;
}

// Ok
int
gielda_hook_wystaw_worn_or_wielded(object ob)
{
  object o = query_shop_keeper();

  notify_fail("");
  if (o)
  {
    o->command("emote uwaznie ocenia " + PNAZWA(ob,PL_BIE)+".");
    o->command("chrzaknij");
    o->command("powiedz " +"Nie zajmuje sie stripitzem.");
    o->command("powiedz " + "Prosze " +
       (ob->query_worn()?"zdejmij":"opusc") + " " +
       PNAZWA(ob, PL_BIE)+".");
  }
  else
  {
    notify_fail (capitalize(PNAZWA(ob, PL_MIA))+" jest " +
    	(ob->query_worn()?"zalozon":"dobyt") + ob->koncowka("y","a","e")+".\n");
  }  
  return 0;
}

// Ok
int
gielda_hook_wystaw_no_value(object ob)
{
  object o = query_shop_keeper();

  notify_fail("");
  if (o)
  {
    o->command("emote uwaznie ocenia " + PNAZWA(ob,PL_BIE)+".");
    o->command("chrzaknij");
    o->command("powiedz " +capitalize(PNAZWA(ob, PL_MIA)) +
      " nie posiada zadnej wartosci.");
  }
  else
  {
    notify_fail (capitalize(PNAZWA(ob, PL_MIA))+" nie posiada zadnej wartosci.\n");
  }
  return 0;
}

int 
gielda_hook_wystaw_za_duzo_klonow(object ob)
{
  object o = query_shop_keeper();

  notify_fail("");
  if (o)
  {
    o->command("emote uwaznie ocenia " + PNAZWA(ob,PL_BIE)+".");
    o->command("chrzaknij");
    o->command("powiedz Mamy juz za duzo przedmiotow tego typu na aukcji.");
  }
  else
  {
    notify_fail("Limit takich samych przedmiotow wystawionych " +
    	"jednoczesnie na aukcji zostal przekroczony.\n");
  }
  return 0;
}

// Ok
int 
gielda_hook_wystaw(object ob)
{
  object o = query_shop_keeper();

  if (o)
  {
    o->command("emote ponownie uwaznie ocenia " + PNAZWA(ob,PL_BIE)+".");
    o->command("mrugnij rad");
    o->command("powiedz " + "Dobrze. Wystawie na licytacje " +
     PNAZWA(ob, PL_BIE)+".");
  }
  else
  {
    write("Wystawiles " + PNAZWA(ob, PL_BIE) +" na licytacje.\n");
  }
  return 1;
}

// Ok
int 
gielda_hook_wystaw_potwierdz(object ob)
{
  object o = query_shop_keeper();

  if (o)
  {
    o->command("emote uwaznie ocenia " + PNAZWA(ob,PL_BIE)+"."); 
    o->command("powiedz Czy na pewno chcesz wystawic "+
       PNAZWA(ob, PL_BIE) + 
       " na licytacje? Jesli tak, wystaw przedmiot ponownie w celu "+
       "potwierdzenia transakcji.");
  }
  else
  {
    write("Wystaw " + PNAZWA(ob, PL_BIE) +" na licytacje w celu "+
        "potwierdzenia transakcji.\n");
  }
  return 1;
}

// Ok
void 
aukcja_hook_przejrzyj(int nr)
{ 
  int *p1;
  int p2 = 0;
  string jaki_przedmiot;
  int to_jest_obiekt = 0;
  
  p1 = split_values(aukcja[nr][CENA]);

  if( aukcja[nr][CZAS] < (time()+const) ) p2 = 2;

  if( aukcja[nr][KUPUJACY] == query_short() ) 
  { 
      if( aukcja[nr][CZAS] < (time()+const) ) 
      {
          p2 = 1;
          to_jest_obiekt = 1;
      }    
  }

  if(!aukcja[nr][KUPUJACY]) p2 = 1;

  if(p2 == 1)
  {
      if(to_jest_obiekt)
      {
          jaki_przedmiot = capitalize(PNAZWA(aukcja[nr][OBIEKT], PL_MIA));
      }
      else 
      {
          jaki_przedmiot = capitalize(aukcja[nr][OBIEKT]);
      }    
            
      write(sprintf("%-3i%-30s Pieniadze odbiera: " ,(nr+1),
      jaki_przedmiot));
      write(capitalize(aukcja[nr][WYSTAWIAJACY])+"\n");
      return;
  }
  
  if(p2 == 2)
  {
      write(sprintf("%-3i%-30s Placi: ",(nr+1),
      capitalize(PNAZWA(aukcja[nr][OBIEKT], PL_MIA)) ));
      write(capitalize(aukcja[nr][KUPUJACY])+"\n");
      return;
  }
    
  write(sprintf("%-3i%-35s%5d%-4s%5d%-3s%5d%-3s%5d%-4s%02i:%02i", 
      (nr+1),
      capitalize(PNAZWA(aukcja[nr][OBIEKT], PL_MIA)),
      p1[3], " mt,",
      p1[2], " z,", 
      p1[1], " s,",
      p1[0], " m",
      TIME2NUM(aukcja[nr][CZAS]-const)[1], 
      TIME2NUM(aukcja[nr][CZAS]-const)[2] ));
  write("\n");
}

// Ok  
void 
aukcja_hook_przejrzyj_info(int nr)
{
  string p, pom, pom1;

  p=text(split_values(aukcja[nr][CENA]), PL_MIA);

  write("Przedmiot: ");
  if(!aukcja[nr][KUPUJACY])
      write((aukcja[nr][OBIEKT])+"\n");
  else
      write(PNAZWA(aukcja[nr][OBIEKT],PL_MIA) + "\n");
  write("Wystawiajacy: " + capitalize(aukcja[nr][WYSTAWIAJACY]) + "\n");
  write("Aktualna Cena: " + p + "\n");
  
  write("Cene podbil(a): ");
  if (!(pom=aukcja[nr][KUPUJACY]))
    write("Nieznany kupujacy, trasakcja sfinalizowana.");
  else
    write (capitalize(pom));
  write("\n");
  
  write("Zakonczenie aukcji: " +  sprintf("%02i:%02i",
    TIME2NUM(aukcja[nr][CZAS]-const)[1],
    TIME2NUM(aukcja[nr][CZAS]-const)[2]) + 
    "\n");
  if(aukcja[nr][KUPUJACY])
  {
  write("Przedmiot przetrwa Apokalipse: ");
  if (aukcja[nr][OBIEKT]->check_recoverable())
    write("Tak\n");
  else
    write("Nie\n");
  }
}

int
odb_istn(object *ob)
{
   return sizeof(filter(ob,objectp))>0;
}

void
aukcja_hook_przejrzyj_odbierane()
{
   string *imiona,str;
   int i;
   
   odbieramy=filter(odbieramy,&odb_istn());
   imiona=m_indexes(odbieramy);
   
   if (!sizeof(imiona))
      {
        write("Nie ma zadnych przedmiotow do odebrania.\n");
        return;
      }
   imiona=sort_array(imiona);
   
   str="Przedmioty do odebrania:\n";
   
   for (i=0;i<sizeof(imiona);i++)
       str+=capitalize(imiona[i]) + " odbiera " + 
            COMPOSITE_DEAD(odbieramy[imiona[i]],PL_BIE) + ".\n";
   
   write(str);
   return;
}

// Przegladanie
// Ok 
int  
do_przejrzyj(string s)
{
  int i;
  
  if (!strlen(s)||(s=="aukcje")||(s=="licytacje")) 
  {
    sprawdz_aukcje();
    if (!sizeof(aukcja)) 
    {
      notify_fail ("Aktualnie nie odbywa sie zadna aukcja.\n");
      return 0;
    }
   
    saybb (QCIMIE(TP, PL_MIA) + " przeglada przedmioty "+
    "wystawione na licytacje.\n");

    for (i=0; i < sizeof(aukcja); i++)
      aukcja_hook_przejrzyj(i);
    return 1;
 }
 
 if (s=="odbierane")
    {
       saybb(QCIMIE(TP,PL_MIA) + " przeglada przedmioty do odebrania.\n");
       aukcja_hook_przejrzyj_odbierane();
       sprawdz_aukcje();
       return 1;
    }
 sprawdz_aukcje();
 if (!sscanf(s,"aukcje nr %d", i)) 
    return notify_fail("Przejrzyj [aukcje nr <numer>] czy odbierane?\n");
  
 if ((i < 1)||(i > sizeof(aukcja)))
    return notify_fail("Nie ma aukcji o podanym numerze.\n");
  
 aukcja_hook_przejrzyj_info(i-1);
 return 1;
}


// Podbijanie
// Ok
int 
do_podbij(string s) 
{
  string wzor, *typ, str;
  mixed obiekty;
  object *rzeczy = query_przedmioty();
  int nr, i, suma, pom;
  int *null_arr, *value_arr=allocate(sizeof(query_money_types()));
  object o1;
  
  // Przygotowania
  
  for (i=0; i < sizeof(value_arr); i++)
    value_arr[i]=0;
    
  null_arr=value_arr+({});

  if (!s)
    return notify_fail("Podbij cene <nazwa przedmiotu> do [ilosc sztuk "+
        "mithrylu] [ilosc sztuk zlota] [ilosc sztuk srebra] "+
        "[ilosc sztuk miedzi]\n");

  // Jedziemy z parse command

  wzor = " 'cene' %i:" + PL_DOP + " 'do' %s ";
  
  if (!parse_command(s , rzeczy, wzor, obiekty, str))
    return notify_fail("Podbij cene <nazwa przedmiotu> do [ilosc sztuk "+
         "mithryli] [ilosc sztuk zlota] [ilosc sztuk srebra] "+
         "[ilosc sztuk miedzi]\n");
  
  // Pieniazki  
  
  if (!str) 
    return notify_fail("Nalezaloby podac jeszcze podac wysokosc przebicia.\n");
  
  typ = query_money_types();
  wzor = " %d %s ";
  i=0;
  while ((str!="")&&(++i<sizeof(typ))) 
  {
    if (!parse_command(str, all_inventory(TP), wzor, pom, str))
       return notify_fail("Co?\n");
    value_arr[sizeof(typ)-i]+=pom;
  }
  
  // Co to za obiekt ? 

  nr = obiekty[0];
    
  if (nr == 0 || nr > 1)
      return notify_fail("Musisz podac konkretnie, cene ktorego przedmiotu chcesz podbic.\n");

  if (nr < 0)
      nr = -nr;

  if (nr >= sizeof(obiekty))
      return notify_fail("Cene czego chcesz podbic?\n");

  o1 = obiekty[nr];
  
  if (member_array(o1,sprawdz_aukcje())>-1)
     return gielda_hook_podbij_wycofaj_koniec();

  nr=member_array(o1,query_przedmioty());
  
  if(nr==-1)
      return notify_fail("No to mamy klops. Zglos buga.\n");

  // Sprawdzamy wszystko
 
 if (!CAN_SEE(ob_sprzedawca,TP)) return gielda_hook_react_not_see(TP);
 
 if(aukcja[nr][WYSTAWIAJACY] == NAME)
  {
     return notify_fail("Nie mozesz podbic ceny przedmiotu, ktory "+
       TP->koncowka("sam wystawiles ","sama wystawilas ")+
       "na licytacje.\n");
  }
 
  suma = money_merge(value_arr);
  
  if (!can_pay(suma, TP))
  {
    gielda_hook_podbij_low_cash(TP);
    return 0;
  }
  
  if (suma < aukcja[nr][CENA]+wez_procent(aukcja[nr][CENA]-1,PROC))
  { /*  _________________________________________________/^\____________
  	Oto chytra sztuczka, pozwalajaca na podbicie ceny o 'rowne' 20 % 
  	(np. z 10 zlota na 12 zlota), nie pozwalajaca jednak na podbicie
  	mniejsze ze wzgledu na calkowice dzielenie (np. z 10 zlota 1 miedzi
  	na 12 zlota) */
    gielda_hook_podbij_to_small(o1);
    return 0;
  }
  
  if (ARMAGEDDON->shutdown_active())
     {
        if (!pointerp(odbieramy[NAME])) odbieramy[NAME]=({});
        odbieramy[NAME]+=({aukcja[nr][OBIEKT]});
        aukcja[nr][OBIEKT]->add_prop(AUKCJA_NULN_I_LIC_CENA,suma);
        aukcja[nr][OBIEKT]->add_prop(AUKCJA_NULN_S_WYST,aukcja[nr][WYSTAWIAJACY]);
        
        gielda_hook_koniec_licytacji(aukcja[nr][OBIEKT],NAME);
        aukcja-=({aukcja[nr]});
        loguj(capitalize(NAME) + " podbil" + TP->koncowka("","a") + 
        	" cene " + aukcja[nr][OBIEKT]->short(PL_DOP) + 
        	" do " + text(split_values(suma),PL_DOP) + " wygrywajac " +
        	"aukcje. (Apokalipsa)");
        return 1;
     }
  
  aukcja[nr][KUPUJACY] = NAME;
  aukcja[nr][CENA] = suma;
  
  gielda_hook_podbij(nr, value_arr, o1);
  loguj(capitalize(NAME) + " podbil" + TP->koncowka("","a") + 
        " cene " + aukcja[nr][OBIEKT]->short(PL_DOP) + " do " + 
        text(split_values(suma),PL_DOP) + ".");
  return 1;
}

// Ok
int
gielda_hook_podbij_wycofaj_koniec(int nr=-1)
{
  object o = query_shop_keeper();
  
  notify_fail("");
  if (o)
  {
    o->command("powiedz Licytacja " +
    	(nr==-1?"ta":"nr "+(nr+1)+"")+ 
        " zostala juz zakonczona.");
    o->command("powiedz Bardzo mi przykro.");
  }
  else
  {
    notify_fail("Ta licytacja zostala juz zakonczona.\n");
  }
  return 0;
}

// Ok
int
gielda_hook_podbij_low_cash(object gracz)
{
  object o = query_shop_keeper();
  
  notify_fail("");
  if (o)
  {
    o->command("powiedz"+
       " Bardzo mi przykro, ale nie posiadasz przy "+
       "sobie tak duzej ilosci pieniedzy.");
  }
  else
  {
    notify_fail("Nie posiadasz tak duzej ilosci pieniedzy.\n");
  }
  return 0;
}

// Ok
int
gielda_hook_podbij_to_small(object o1)
{
  object o = query_shop_keeper();
  
  notify_fail("");
  if (o)
  {
    o->command("powiedz Musisz przebic cene " + PNAZWA(o1,PL_DOP) + 
    	" o co najmniej "+PROC+" procent.");
  }
  else
  {
    notify_fail("Musisz przebic cene " + PNAZWA(o1,PL_DOP) + 
    	" o co najmniej "+PROC+" procent.\n");
  }
  return 0;
}

// Ok
int
gielda_hook_podbij(int nr, int *v, object o1)
{
  object o = query_shop_keeper();
  
  if (o)
  {
    o->command("krzyknij Cena "+ PNAZWA(o1, PL_DOP) +
       " w licytacji nr "+(nr+1)+" podbita do "+
       text(v, PL_DOP)+".");
  }
  else
  {
    write("Cena "+PNAZWA(o1, PL_DOP) +
    " podbita do " + text(v, PL_DOP) + ".\n");
  }
  return 1;
}

int
czy_to_pieniadze(string s, object kto)
{
  int i;
  
  if(s == "pieniadze")
  {
    for(i = 0;i < sizeof(aukcja);i++)
    {
      if(aukcja[i][WYSTAWIAJACY] == kto->query_real_name(PL_MIA))
      {
        if(!aukcja[i][KUPUJACY]) return i;
        if((aukcja[i][KUPUJACY] == query_short()) && (time()+const > aukcja[i][CZAS]) )
          return i;
      }
    }
  }        
    return -1;
}    

// Odbieranie
// Ok

int 
do_odbierz(string s) 
{
  int ile=0,i,p1;
  mixed obiekty;
  object *pom1=({}),*pom2=pom1,*pom3=pom1;
  string wyst;
  
  notify_fail("Co chcesz odebrac?\n");
  
  if (!strlen(s)) 
    return 0;
  
  if (s=="pieniadze")
     {
        if (!(ile=frs[NAME])) 
           return notify_fail("Nie oczekuja na ciebie zadne pieniadze.\n");
           
        if (MONEY_ADD(TP, ile)==1)
           {
             frs=m_delete(frs,NAME);
             write("Odebral"+TP->koncowka("es","as")+" zalegle pieniadze w kwocie: "+
               text(MONEY_SPLIT(ile),PL_MIA)+".\n");
             saybb(QCIMIE(TP,PL_MIA) + " odbiera zalegle pieniadze.\n");    
           }
        else return notify_fail("Nie udalo sie ci odebrac pieniedzy. Zglos blad.\n");
        loguj(capitalize(NAME) + " odebral" + TP->koncowka("","a") + 
        	" z konta " + text(split_values(ile),PL_BIE) + ".");
        return 1;
     }
  
  if (!sizeof(odbieramy[NAME]))
     return gielda_hook_odbierz_no_present();
  
  if (!parse_command(s,odbieramy[NAME],"%i:"+PL_BIE,obiekty))
     return 0;

  obiekty=standard_access(obiekty);

  if (!sizeof(obiekty)) return 0;
  
  for (i=0;i<sizeof(obiekty);i++)
      {
        if (can_pay(ile+(p1=obiekty[i]->query_prop(AUKCJA_NULN_I_LIC_CENA)),TP))
           {
             if (!obiekty[i]->move(TP))
                {
                  pom1+=({obiekty[i]}); /* Ok */
                  wyst=obiekty[i]->query_prop(AUKCJA_NULN_S_WYST);
                  frs[wyst]+= (p1-wez_procent(p1,PROC));
                  ile+=p1;
                }
             else
                {
                   pom2+=({obiekty[i]}); /* Za ciezkie */
                }
           }
        else
           {
              pom3+=({obiekty[i]}); /* Za drogie */
           }
      }

  if (sizeof(pom1))
     {
       MONEY_ADD(TP, -ile);
       odbieramy[NAME]-=pom1;  
       pom1->remove_prop(AUKCJA_NULN_S_WYST);
       pom1->remove_prop(AUKCJA_NULN_I_LIC_CENA);
       gielda_hook_odbierz_ob(split_values(ile),pom1);
       TP->set_obiekty_zaimkow(pom1);
       loguj(capitalize(NAME) + " odebral" + TP->koncowka("","a") + " " +
       	COMPOSITE_DEAD(pom1,PL_BIE) + " placac " + 
       	text(split_values(ile),PL_BIE) +".");
       return 1;
     }
  
  if (sizeof(pom3))
     {
        gielda_hook_odbierz_cant_pay(pom3);
        return 0;
     }
     
  if (sizeof(pom2))
     {
        gielda_hook_odbierz_ob_too_heavy(pom2);
        return 0;
     }
}

// Ok
int 
gielda_hook_odbierz_ob(int *v, object *o1)
{
  object o = query_shop_keeper();
  
    write ("Odbierasz " + COMPOSITE_DEAD(o1, PL_BIE) +
      ", placac " + text(v, PL_MIA) + ".\n");
  return 1;
}

// Ok
int 
gielda_hook_odbierz_cant_pay(object *ob)
{
  object o = query_shop_keeper();
  
  notify_fail("");
  if (o)
  {
    o->command("powiedz Nie posiadasz odpowiedniej ilosci gotowki by odebrac "+
       COMPOSITE_DEAD(ob, PL_BIE)+".");
  }
  else
  {
    notify_fail("Nie posiadasz odpowiedniej ilosci gotowki by odebrac "+
       COMPOSITE_DEAD(ob, PL_BIE)+".\n");
  }
  return 0;
}

// Ok
int
gielda_hook_odbierz_no_present()
{
  object o = query_shop_keeper();
  
  notify_fail("");
  if (o)
  {
    o->command("powiedz Nie czekaja na ciebie zadne wylicytowane przedmioty."); 
  }
  else
  {
    notify_fail("Nie czekaja na ciebie zadne wylicytowane przedmioty.\n");
  }
  return 0;
}

// Ok
int 
gielda_hook_odbierz_incorrect_person_money(object ob, string kto)
{
  object o = query_shop_keeper();
  
  notify_fail("");
  if (o)
  {
    o->command("powiedz Nie mozesz odebrac pieniedzy za "+ 
       PNAZWA(ob, PL_BIE)+". Ten przedmiot wystawil(a) "+
       capitalize(kto)+".");
  }
  else
  {
    notify_fail("Nie mozesz odebrac pieniedzy za "+
        PNAZWA(ob, PL_BIE)+". Ten przedmiot wystawil(a) "+
        capitalize(kto)+".\n");
  }
  return 0;
}

// Ok
int
gielda_hook_odbierz_ob_too_heavy(object *ob)
{
  object o = query_shop_keeper();

  notify_fail("");
  if (o)
  {
    o->command("powiedz Bardzo mi przykro, ale nie mozesz uniesc "+
    COMPOSITE_DEAD(ob, PL_DOP)+".");
  }
  else
  {
    notify_fail("Nie mozesz uniesc "+
    COMPOSITE_DEAD(ob, PL_DOP)+".\n");
  }
  return 0;
}

// Wycofanie
// Ok
int 
do_wycofaj (string s) 
{
    mixed obiekty;
    string wzor;
    object *rzeczy = query_przedmioty();
    int i,pom,ok;
    object o1, o2;
    
    notify_fail("Co chcesz wycofac?\n");
    if (!s) return 0;
    
    wzor = "%i:" + PL_BIE;
    
    if (!parse_command(s, rzeczy, wzor, obiekty)) return 0;
    
    obiekty=standard_access(obiekty);
    
    if (!sizeof(obiekty)) return 0;
    
    if (sizeof(obiekty)>1) 
       return notify_fail("Mozesz wycofac tylko jeden przedmiot naraz.\n");

    o1 = obiekty[i];
    
    if (member_array(o1,sprawdz_aukcje())>-1)
       return gielda_hook_podbij_wycofaj_koniec();
    
    i=member_array(o1,query_przedmioty());
    
    if (aukcja[i][WYSTAWIAJACY]!=NAME)
    {
      gielda_hook_wycofaj_incorrect_person(o1);
      return 0;
    }
    
    ok = 0;

    if (!(ARMAGEDDON->shutdown_active()))
    {
       ok = 1;
       if (!can_pay((pom=wez_procent(aukcja[i][CENA],20)) , TP))
       {  
          gielda_hook_wycofaj_cant_pay(o1);
          return 0;
       } 
    }

    if(aukcja[i][KUPUJACY] != query_short())
    {
        notify_fail("Stawka za przedmiot zostala juz podbita. Nie mozesz "+
            "go wycofac z licytacji.\n");
        return 0;
    }    

    if (o1->move(TP)) 
    {
       gielda_hook_wycofaj_ob_too_heavy(o1);
       return 0;
    }

    if (ok) 
    {
      MONEY_ADD(TP, -pom); 
      gielda_hook_wycofaj(o1,split_values(pom));
    }
    else
    {
      pom=0;
      gielda_hook_wycofaj_armageddon(o1);
    }
    
    loguj(capitalize(NAME) + " wycofal" + TP->koncowka("","a") + " " +
    	o1->short(PL_BIE) + " z licytacji, " + 
    	(pom?"placac " + text(split_values(pom),PL_DOP)+".":
    	 "nic nie placac. (Apokalipsa)"));
    
    aukcja -= ({aukcja[i]});
    
    return 1;
}    

// Ok
int
gielda_hook_wycofaj(object ob,int *v)
{
  object o = query_shop_keeper();
  
  if (o)
  {
    o->command("powiedz "+capitalize(PNAZWA(ob, PL_MIA)) + " " +
        ob->koncowka("wycofany","wycofana") + " z licytacji. Wystawiajacy "+
        "zaplacil "+text(v,PL_MIA)+".");
  }
  else
  {
    write("Wycofujesz "+ PNAZWA(ob, PL_BIE) + " z licytacji, placac "+
        text(v, PL_MIA)+"\n");
  }
  return 1;
}

// Ok
int
gielda_hook_wycofaj_armageddon(object ob)
{
  object o = query_shop_keeper();
  
  if (o)
  {
    o->command("powiedz Poniewaz niedlugo swiat ogarna ciemnosci mozesz "+
      "wycofac "+PNAZWA(ob, PL_BIE) +" bez strat.");
  }
  else
  {
    write("Wycofujesz "+ PNAZWA(ob, PL_BIE) + " z licytacji "+
    "bez strat.\n"); 
  }
  return 1;
}

// Ok
int 
gielda_hook_wycofaj_ob_too_heavy(object ob)
{
  object o = query_shop_keeper();
  
  notify_fail("");
  if (o)
  {
    o->command("powiedz Nie jestes w stanie uniesc "+
       capitalize(PNAZWA(ob, PL_BIE))+"."); 
  }
  else
  {
    notify_fail("Nie jestes w stanie uniesc "+
       capitalize(PNAZWA(ob, PL_BIE))+".\n");
  }
  return 0;
}

// Ok
int 
gielda_hook_wycofaj_cant_pay(object ob)
{
  object o = query_shop_keeper();
  
  notify_fail("");
  if (o)
  {
    o->command("powiedz Nie posiadasz wystarczajacej gotowki, by zaplacic "+
      "kare za wycofanie " + PNAZWA(ob, PL_DOP)+".");
  }
  else
  {
    notify_fail("Nie posiadasz wystarczajacej ilosci gotowki, by zaplacic "+
      "kare za wycofanie " + PNAZWA(ob, PL_DOP) + ".\n");
  }
  return 0;
}

// Ok
int
gielda_hook_wycofaj_incorrect_person(object ob)
{
  object o = query_shop_keeper();
  
  notify_fail("");
  if (o)
  {
    o->command("powiedz Nie jestes osoba uprawniona do wycofania "+
      PNAZWA(ob, PL_DOP)+".");
  }
  else
  {
    notify_fail("Nie jestes osoba uprawniona do wycofania "+
      PNAZWA(ob, PL_DOP) + ".\n");
  }
  return 0;
}

mixed
query_frs()
{
    return frs;
}

string
query_nieuczciwi()
{
    return nieuczciwi;
}        


mixed
query_tempor()
{
    return tempor;
}

void
nagrywamy_gielde()
{
  sprawdz_aukcje();
  setuid(); seteuid(getuid());
  rm(NPATH + "inne/aukcja_kasa.o");   
  save_object(NPATH + "inne/aukcja_kasa");
}

void
koniec_gieldy()
{
   int i,j,cena;
   string *names=m_indexes(odbieramy),wyst;
   
   nieuczciwi="";
   
   for(i=0;i<sizeof(aukcja);i++)
      {
         cena=aukcja[i][OBIEKT]->query_prop(OBJ_I_VALUE);
         cena-=wez_procent(cena,PROC);
         frs[aukcja[i][WYSTAWIAJACY]]+=cena;
         loguj("Koniec licytacji o " + 
                aukcja[i][OBIEKT]->short(PL_BIE) + ", wystawi" +
                aukcja[i][OBIEKT]->koncowka("ony","ona","one","wni","one") + 
                " przez '" + capitalize(aukcja[i][WYSTAWIAJACY]) + 
                "' (Apokalipsa). " + capitalize(aukcja[i][WYSTAWIAJACY]) + 
                " otrzymuje " + text(split_values(cena),PL_BIE) + ".");
         aukcja[i][OBIEKT]->remove_object();
      }
   for (i=0;i<sizeof(names);i++)
         for (j=0;j<sizeof(odbieramy[names[i]]);j++)
             {
                cena=odbieramy[names[i]][j]->query_prop(OBJ_I_VALUE);
                cena-=wez_procent(cena,PROC);
                wyst=odbieramy[names[i]][j]->query_prop(AUKCJA_NULN_S_WYST);
                frs[wyst]+=cena;
                loguj(capitalize(odbieramy[names[i]][j]->short(PL_MIA)) + 
                	", wystawi" +
                        odbieramy[names[i]][j]->koncowka("ony","ona","one","wni","one") + 
                        " przez '" + capitalize(wyst) + 
                        "', nie zostal odebrany przez '" + capitalize(names[i]) + 
                        "' przed Apokalipsa, " + capitalize(wyst) +
                        " otrzymuje " + text(split_values(cena),PL_BIE) + ".");
                nieuczciwi+=capitalize(names[i]) + ", " + 
                	odbieramy[names[i]][j]->short(PL_MIA) + ", " +
                	text(split_values(cena),PL_DOP) + ".\n";
                odbieramy[names[i]][j]->remove_object();
             }
   aukcja=({});odbieramy=([]);
   nagrywamy_gielde();
}

// Ok
public int
remove_object()
{
    koniec_gieldy();

    return ::remove_object();
}

// Ok
int
shop_hook_list_no_match(string str)
{
    notify_fail("Nic takiego nie jest wystawiono na aukcje.\n");
}

// Ok
int
do_pokaz(string str)
{
    object *item_arr=query_przedmioty();
    
    sprawdz_aukcje();

    notify_fail("Co pokazac?\n");
    if(!str) return 0;

    if (!sizeof(item_arr))
    {
        shop_hook_list_no_match(str);
        return 0;
    }

    item_arr = FIND_STR_IN_ARR(str, item_arr, PL_BIE);

    if (sizeof(item_arr) < 1)
    {
        return shop_hook_list_no_match(str);
    }

    item_arr->appraise_object();

    return 1;
}

/*
// Ok
int
do_wyplac(string s)
{
  int index;
  int ile = 0;
  string name=NAME;
  
  notify_fail("Co chcesz wyplacic?\n");

  if (!s || s!="pieniadze")
  {
        return 0;
  }
  
  ile=frs[name];
  
  if(!ile)
  {
    notify_fail("Niestety nie oczekuja na Ciebie zadne pieniadze.\n");
    return 0;
  }

  if (MONEY_ADD(TP, ile)==1)
    {
      frs=m_delete(frs,NAME);
      write("Odebral"+TP->koncowka("es","as")+" zalegle pieniadze w kwocie: "+
        text(MONEY_SPLIT(ile),PL_MIA)+".\n");
      saybb(QCIMIE(TP,PL_MIA) + " odbiera zalegle pieniadze.\n");    
    }
  else return notify_fail("Nie udalo sie odebrac pieniedzy.\n");
  return 1;
}
*/

void
dodaj_forse(string kto, int ile)
{
    frs[kto] += ile;
}    

/* int
prevent_enter(object ob)
{
   if (::prevent_enter(ob)) return 1;
   
   if (living(ob)&&!interactive(ob)&&ob!=ob_sprzedawca) return 1;
   
   if (interactive(ob)&&!ob->query_wiz_level()&&
       !wildmatch("*jr",ob->query_real_name()))
      {
         ob->catch_msg(
         	"Probujesz wejsc do siedziby Domu Aukcyjnego, jednak oddzwierny " +
         	"informuje cie: Przeprowadzane sa ostatnie prace remontowe przed " +
         	"otwarciem aukcji.\n");
         return 1;
      }
   
   return 0;
}

*/