// gielda przedmiotow magicznych
// Pomysl Silvy, wykonanie Alfen


inherit "/lib/trade.c";
inherit "/d/Imperium/std/room.c";

#include <time.h>
#include "alfen.h"
#include "silvy.h"
#include <stdproperties.h>

static string store_room;
static string sprzedawca;
static string log_gieldy;

private object ob_sprzedawca;
private mixed aukcja;
private object *przedmioty;
private int poprzeczka_cenowa;

static int WYSTAWIAJACY = 0;
static int KUPUJACY  = 1;
static int CENA = 2;
// static int OBIEKT = 3;
static int CZAS = 4;






#define OBJ_O_WYSTAW_NA_AUKCJE "_obj_o_wystaw_na_aukcje_"
#define PNAZWA(ob, przyp) (ob->query_short(przyp) ? ob->query_short(przyp) : ob->query_nazwa(przyp))


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(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_podbij(int nr, int *v, object o1);
int gielda_hook_podbij_low_cash();
int gielda_hook_podbij_to_small();
int gielda_hook_podbij_koniec();



int gielda_hook_odbierz_ob_to_heavy(object o1);
int gielda_hook_odbierz_money(int *v, object o1);
int gielda_hook_odbierz_ob(int *v, object o1);
int gielda_hook_odbierz_no_end();
int gielda_hook_odbierz_incorrect_person_money(object ob);
int gielda_hook_end_of_aukcja(int i);
int gielda_hook_odbierz_incorrect_person_ob(object ob);
int gielda_hook_odbierz_cant_pay();
int gielda_hook_odbierz_nobody_buy(object ob);


int gielda_hook_wycofaj(object ob);
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_time_for_winner(object ob);
int gielda_hook_wycofaj_ob_to_heavy(object ob);

int czy_player();

string query_log_file(){
  return log_gieldy;
}

void set_log_file(string s){
  log_gieldy=s;
}



void
set_min_price(int price)
{
  poprzeczka_cenowa = price;
}



int
query_min_price()
{
  return poprzeczka_cenowa;
}



int query_price(object ob){
  int seed;
  
  sscanf(OB_NUM(ob), "%d", seed);
  return ob->query_prop(OBJ_I_VALUE) * 100 /( query_money_greed_buy() +
     15 - this_player()->query_skill(SS_TRADING)/4 + random (15) * seed /100);
}


void 
set_shop_keeper(string sp)
{ 
    if (ob_sprzedawca = clone_object(sp))
    {
      ob_sprzedawca -> move(this_object());
      sprzedawca =  sp;
    }
}


object
query_shop_keeper()
{
  return ob_sprzedawca;
}


void set_store_room(string s){
  store_room = s;
}


string query_store_room(){
  return store_room;
}


int
gielda_hook_magic()
{
  
  return 1;
}

int
gielda_hook_attack()
{
  
  return 1;
}

string
gielda_hook_attack_txt()
{
  if (this_player())
    if (czy_player())
    {
      say(capitalize(QIMIE(this_player(), PL_MIA)) + " zostal otoczony "+
        "niebieska poswiata.\n");
      this_player()->command("w");
    }
  return "Tajemnicza sila zmusza Cie do opuszczenia terenu Gieldy.\n";
}


string
gielda_hook_magic_txt()
{
  if (this_player())
    if (czy_player())
    {
      say(capitalize(QIMIE(this_player(), PL_MIA)) + " zostal otoczony "+
        "niebieska poswiata.\n");
      this_player()->command("w");
    }
  return "Wyczuwasz, ze magia, jaka sie posluzyles obrocila sie przeciw "+
    "Tobie. Cos zmusilo Cie do opuszczenia budynku gieldy.\n";
}


mixed query_aukcja(){
  return aukcja;
}


int czy_player(){
  return !this_player()->query_wiz_level();
}


void create_gielda(){
  set_long("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 "+
     "marmurowa tablica.\n");
  set_short("Dom Aukcyjny Hoffera");
  
  set_store_room(NPATH + "sklepy/magazyn_gieldy.c");
  set_log_file( "log_imperialnej_gieldy");
  set_shop_keeper(NPATH + "npc/aukcyjny.c");
  set_min_price(300); 
  
  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_cmd_item(({"napis na tabliczce", "tabliczke", 
    "napis na srebrnej tabliczce", "srebrna tabliczke"}),
    "przeczytaj", "@@standard_tabliczka");
  add_cmd_item(({"napis na marmurowej tablicy", "napis na tablicy",
    "tablice", "marmurowa tablice"}), "przeczytaj", "@@standard_tablica");
}


string standard_tabliczka(){
  return " Witamy na aukcji przedmiotow drogocennych.\n" + 
    "Mozna tu robic nastepujace rzeczy:\n" +
    "  1 - wystawic przedmiot na licytajc, np.: wystaw szpilke na 3 godziny\n"+
    "    W celu potwierdzenia transakcji, nalezy wystawic przedmiot 2 razy.\n"+
    "  2 - pobic cene, np.: podbij cene szpilki do 0 0 0 1\n"+
    "pierwsze zero oznacza ilosc sztuk platyny, drugie zlota itd.\n"+
    "Dozwolone jest nie pisanie koncowych zer, np.: podbij cene szpilki do 1\n"+
    " podbije jej cene do sztuki platyny.\n"+
    "  3 - odebrac przedmiot, po zakonczeniu licytacji, np.: odbierz szpilke\n"+
    "  4 - wreszcie, wycofac przedmiot z licytacji (opcja ta dotyczy tylko\n"+
    "osoby wystawiajacej przedmiot na licytacje, np.: wycofaj szpilke\n"+
    "Nalezy jednak pamietac, ze wycofujacy zaplaci 20% wylicytowanej juz ceny\n"+
    "  5 - mozna takze przejrzec, prowadzone wlasnie licytacje, np.: przejrzyj\n"+
    "przejrzyj aukcje, przejrzyj aukcje nr [numer]\n"+
    "  6 - odebrac pieniadze, za przedmiot wystawiony na licytacje (dotyczy"+
    " tylko osob wystawiajacych ten przedmiot)\n"+
    "np.: odbierz pieniadze za szpilke\n\n";
        
}



string standard_tablica(){
 write("Na marmurowej tablicy widnieje napis:\n"+
   "    Ku czci zapominalskim kupujacym, znanym pod nastepujacymi "+
   "imionami:\n");
 if (file_size("/d/Imperium/alfen/log/"+query_log_file()))
   cat ("/d/Imperium/alfen/log/"+query_log_file());
 return "\n";
}


void create_imperium_room(){
  aukcja=({});
  przedmioty=({});
  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_ATTACK, "@@gielda_hook_attack");
  add_prop (ROOM_I_NO_MAGIC, "@@gielda_hook_magic");
  add_prop (ROOM_M_NO_MAGIC, "@@gielda_hook_magic_txt");
  add_prop ( ROOM_M_NO_ATTACK, "@@gielda_hook_attack_txt");
  poprzeczka_cenowa = 0;
  ob_sprzedawca = sprzedawca = 0;
  create_gielda();
}



void reset_gielda(){
}


void reset_imperium_room(){
  reset_gielda();
}





void init_gielda(){
  add_action ("do_wystaw", "wystaw");
  add_action ("do_przejrzyj", "przejrzyj");
  add_action ("do_podbij", "podbij");
  add_action ("do_odbierz", "odbierz");
  add_action ("do_wycofaj", "wycofaj");
}


void init(){
  ::init();
  init_gielda();
}


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 + ({});
  
  
  // przedmiot nie posiada wartosci
  if (!(value=ob->query_prop(OBJ_I_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;
  }
  
  cena = query_price(ob);

  if ((cena <= 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;
  }
  
    
  // blad w przesowaniu obiektu
  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);
  przedmioty+=({ob});
  aukcja [sizeof(aukcja)-1] [WYSTAWIAJACY]=this_player()->query_name(PL_MIA);   
         // 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
  
  value_arr = split_values(cena);
//  change_money( null_arr + value_arr, this_player());
  
  return ob; 
}



int do_wystaw (string s){
  string wzor, pom;
  mixed lis;
  object o1;
  int czas1, c1, i;
  
  
  if (!s) {
    notify_fail("Co wystawic na licytacje???\n");
    return 0;
  }
  
  wzor = " %i:" + PL_BIE + " 'na' %d [godzin] / [godziny]";
  if (!parse_command(s, all_inventory(this_player()), wzor, lis, c1)){
    notify_fail("Co wystawic na licytacje i na ile godzin????\n");
    return 0;
  }

  if (!( i = lis[0])) {
      notify_fail("Co ?\n");
      return 0;
  }
  if (i < 0)
    i=-i;
  o1 = lis[i];
  
  
  czas1 = time() + 7200 + c1*3600;

  if (c1 < 1 ) {
    notify_fail("Na aukcje wystawia sie rzeczy co najmniej na godzine.\n");
    return 0;
  }

  
  if ( c1 > 24 ) {
    notify_fail("Przedmiot mozna wystawic co najmniej na 24 godziny.\n");
    return 0;
  }
  
  // nie wystawiac tego co ma sie na sobie lub nie posiada wartosci
  if (this_player()->query_prop(OBJ_O_WYSTAW_NA_AUKCJE)==o1) {
    this_player()->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 (!this_player()->query_prop(OBJ_O_WYSTAW_NA_AUKCJE))
      this_player()->add_prop(OBJ_O_WYSTAW_NA_AUKCJE, o1);
    else 
      this_player()->change_prop(OBJ_O_WYSTAW_NA_AUKCJE, o1);
    gielda_hook_wystaw_potwierdz(o1);
  }
  return 1;
}


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 posiada"+
      " zadnej wartosci.");
  }
  else
  {
    notify_fail (capitalize(PNAZWA(ob, PL_MIA))+" nie posiada"+
      " zadnej wartosci.");
    say(capitalize(QIMIE(this_player(), PL_MIA)) + " probuje sprzedac "+
      "trefny towar.\n");
  }
  return 0;
}


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 " +PNAZWA(ob, PL_MIA)+" jest przeklety");
  }
  else
  {
    notify_fail (capitalize(PNAZWA(ob, PL_MIA))+" nie chce cie"+
      " opuscic.");
    say(capitalize(QIMIE(this_player(), PL_MIA)) + " probuje sprzedac "+
      "trefny towar.\n");
  }
  return 0;
}


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 " +PNAZWA(ob, PL_MIA)+" jest "+
      "bezwartosciowy dla mnie.");
  }
  else
  {
    notify_fail (capitalize(PNAZWA(ob, PL_MIA))+" posiada zbyt mala wartosc");
    say(capitalize(QIMIE(this_player(), PL_MIA)) + " probuje sprzedac "+
      "trefny towar.\n");
  }
  return 0;
}

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)+" jest "+
      "bezwartosciowy dla mnie.");
  }
  else
  {
    notify_fail (capitalize(PNAZWA(ob, PL_MIA))+" posiada zbyt mala wartosc");
    say(capitalize(QIMIE(this_player(), PL_MIA)) + " probuje sprzedac "+
      "trefny towar.\n");
  }
  return 0;
}

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 zdejmij " + PNAZWA(ob, PL_BIE));
  }
  else
  {
    notify_fail (capitalize(PNAZWA(ob, PL_MIA))+" jest dobyty lub zalozony\n");
    say(capitalize(QIMIE(this_player(), PL_MIA)) + " prosi "+o->query_name(PL_BIE)+
      "o pomoc w rozbieraniu.\n");
  }  
  return 0;
}

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");
    say(capitalize(QIMIE(this_player(), PL_MIA)) + " chce sprzedac trefny towar.\n");
  }
  return 0;
}



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");
    say(capitalize(QIMIE(this_player(), PL_MIA)) + " wystawil " +
      PNAZWA(ob, PL_BIE) + " na licytajce.\n");
  }
  return 1;
}

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("popatrz przenikliwie na " + 
      this_player()->query_nazwa(PL_BIE));
    o->command("powiedz " + "Jestes pewien, ze chcesz wystawic " +
     PNAZWA(ob, PL_BIE) + " na licytacje?");
  }
  else
  {
    write("Wystaw " + PNAZWA(ob, PL_BIE) +" na licytacje w celu "+
      "potwierdzenia transakcji.\n");
  }
  return 1;
}


void aukcja_hook_przejrzyj(int nr){
  string pom, pom1;
  int  *p1, p2;
  
  p1 = split_values(aukcja[nr][CENA]);
  p2 = ((!aukcja[nr][KUPUJACY])||(!aukcja[nr][WYSTAWIAJACY]));
  
  pom = sprintf("%-4i%-30s%6d%-3s%6d%-3s%6d%-3s%6d%-3s%-02i:%02i", 
      (p2 ? -nr-1 : nr+1),
      capitalize(PNAZWA(przedmioty[nr], PL_MIA)),
      p1[3], " p,",
      p1[2], " z,", 
      p1[1], " s,",
      p1[0], " m",
      TIME2NUM(aukcja[nr][CZAS])[1], 
      TIME2NUM(aukcja[nr][CZAS])[2] );
  write (pom+"\n");
}

  
void aukcja_hook_przejrzyj_info(int nr){
  string p, pom, pom1;
  
  
  p=text(split_values(aukcja[nr][CENA]), PL_MIA);
  
  
  write("Przedmiot: " + PNAZWA(przedmioty[nr],PL_MIA) + "\n");
  write("Wystawiajacy: ");
  if (!(pom=capitalize(aukcja[nr][WYSTAWIAJACY]))){
    write("Nieznany");
    write(", transakcja sfinalizowana.");
  }
  else
    write(pom);
  write("\n");
  
  write("Aktualna Cena: " + p + "\n");

  write("Cene podbil(a): ");
  if (!(pom=aukcja[nr][KUPUJACY]))
    write("Nieznany kupujacy, trasakcja sfinalizowana.");
  else
    write (pom);
  write("\n");
  
  write("Zakonczenie aukcji: " +  sprintf("%02i:%02i",
    TIME2NUM(aukcja[nr][CZAS])[1],
    TIME2NUM(aukcja[nr][CZAS])[2]) + 
    "\n");
  write("Przedmiot przetrwa Apokalipse: ");
  if (przedmioty[nr]->check_recoverable())
    write("Tak\n");
  else
    write("Nie\n");
}

 
int  do_przejrzyj (string s){
  int i;
  
  
  if (!s) {
    if (!sizeof(aukcja)) {
      notify_fail ("Aktualnie nie odbywa sie zadna aukcja.\n");
      return 0;
    }
   
  say (capitalize(QIMIE(this_player(), PL_MIA)) + " przeglada przedmioty "+
    "wystawione na licytacje.\n");

    for (i=0; i < sizeof(aukcja); i++)
      aukcja_hook_przejrzyj(i);
    return 1;
  }
  if ((s=="aukcje")||(s=="licytacje")) {
    for (i=0; i < sizeof(aukcja); i++) {
      aukcja_hook_przejrzyj_info(i);
      write ("\n");
    }
    return 1;
  }
  if (!sscanf(s,"aukcje nr %d", i)) {
    notify_fail("Przejrzyj aukcje nr ???\n");
    return 0;
  }
  if ((i < 1)||(i > sizeof(aukcja))) {
    notify_fail("Nie ma aukcji o podanym numerze.\n");
    return 0;
  }
  aukcja_hook_przejrzyj_info(i-1);
  return 1;
}



int do_podbij(string s) {
  string wzor, *typ, str, *str_arr;
  mixed lis;
  int nr, ok, i, suma, pom, czas_a, czas_w, *czas1;
  int *null_arr, *value_arr, *mon;
  object o1, *pom_aukcja=({});
  
  value_arr= allocate(sizeof(query_money_types()));
  for (i=0; i < sizeof(value_arr); i++)
    value_arr[i]=0;
    
  null_arr=value_arr+({});
  
  
  if (!s)
    return 0;


//  l = " %i:" + Pl_DOP + "
  wzor = " 'cene' %i:" + PL_DOP + " 'do' %s ";
  if (!parse_command(s , przedmioty , wzor, lis, str)){
      notify_fail("Podbij cene <nazwa przedmiotu> do [ilosc sztuk "+
         "platyny] [ilosc sztuk zlota] [ilosc sztuk srebra] "+
         "[ilosc sztuk miedzi]\n");
    return 0;
  }
  
  if (!str) {
    notify_fail("Nalezaloby podac jeszcze podac wysokosc przebicia...\n");
    return 0;
  }
  
  
  
  typ = query_money_types();
  wzor = " %d %s ";
  i=0;
  while ((str!="")&&(++i<sizeof(typ))) {
    if (!parse_command(str, all_inventory(this_player()), wzor,pom, str)){
      notify_fail("co????\n");
      return 0;
    }
    
    value_arr[sizeof(typ)-i]+=pom;
  }
  
  if (!(nr = lis[0])) {
    notify_fail("Co ?\n");
    return 0;
  }
  if (nr < 0)
    nr=-nr;
  o1 = lis [nr];
  
  nr=-1;
  while (o1!=przedmioty[++nr]);
  
  
  czas_a = time() + 7200;
  czas1 = TIME2NUM(aukcja [nr][CZAS]);
  czas_w = czas1[0]*24*3600+czas1[1]*3600+czas1[2]*60+czas1[3];
  
  if (czas_a > czas_w) {
    gielda_hook_podbij_koniec();
    return 0;
  }
  
  suma = money_merge(value_arr);
  
  if (!can_pay(suma, this_player())){
    gielda_hook_podbij_low_cash();
    return 0;
  }
  
  if (suma <= aukcja[nr][CENA]) {
    gielda_hook_podbij_to_small();
    return 0;
  }
  
  
  aukcja[nr][KUPUJACY] =this_player()->query_name(PL_MIA);
  aukcja[nr][CENA]=suma;
  
  gielda_hook_podbij(nr++, value_arr, o1);
  
  
  return 1;
}

int
gielda_hook_podbij_koniec()
{
  object o = query_shop_keeper();
  
  notify_fail("");
  if (o)
  {
    o->command("powiedz Ta licytacja zostala juz zakonczona");
    o->command("powiedz Bardzo mi przykro");
  }
  else
  {
    notify_fail("Ta licytacja zostala juz zakonczona.\n");
  }
  return 0;
}


int
gielda_hook_podbij_low_cash()
{
  object o = query_shop_keeper();
  
  notify_fail("");
  if (o)
  {
    o->command("powiedz Bardzo mi przykro, ale nie posiadasz przy "+
      "sobie tylu pieniedzy");
  }
  else
  {
    notify_fail("Nie posiadasz tylu pieniedzy.\n");
  }
  return 0;
}

int
gielda_hook_podbij_to_small()
{
  object o = query_shop_keeper();
  
  notify_fail("");
  if (o)
  {
    o->command("powiedz Bardzo mi przykro, ale to zby mala suma, "+
      "by podbic stawke");
  }
  else
  {
    notify_fail("To zby mala suma,  by podbic stawke.\n");
  }
  return 0;
}


int
gielda_hook_podbij(int nr, int *v, object o1)
{
  object o = query_shop_keeper();
  if (o)
  {
    o->command("powiedz " + capitalize(QIMIE(this_player(), PL_MIA)) +
      " podbil stawke w " +  nr + " licytacji do "+
      text(v, PL_DOP));
  }
  else
  {
    write("Podbiles cene "+
    PNAZWA(o1, PL_DOP) +
    " do " + text( v, PL_DOP) + "\n");
  say(capitalize(QIMIE(this_player(), PL_MIA)) + " podbija stawke w "+ nr + 
    " aukcji.\n");
  }
  return 1;
}


int do_odbierz(string s) {
  mixed lis;
  int i, *czas1, czas_w, czas_a, l_pien, *null_arr, *value_arr;
  object o1;
  string wzor, pom;
  
  if (!s) {
    notify_fail("Co chcesz odebrac?\n");
    return 0;
  }
  
  if (!sizeof(aukcja)) {
    notify_fail("Nie odbywa sie zadna aukcja.\n");
    return 0;
  }
  
  wzor = " %i:" + PL_BIE;
  
  l_pien = 0;
  if (!parse_command(s, przedmioty, wzor, lis)) {
    wzor = " 'pieniadze' 'za' %i:"+PL_BIE;
    if (!parse_command(s, przedmioty, wzor, lis)) {
      notify_fail ("Co chcesz odebrac?\n");
      return 0;
    }
    else 
      l_pien = 1;
  }
  
  null_arr = allocate(sizeof(query_money_types()))+({});
  
  if (!( i = lis[0])) {
    notify_fail("Co ?\n");
    return 0;
  }
  if (i < 0)
    i=-i;
  o1 = lis[i];

  i=-1;
  while (o1!=przedmioty[++i]);
  
  czas_a = time() + 7200;
  czas_w = aukcja [i][CZAS];
  
  if (czas_a < czas_w) {
    gielda_hook_odbierz_no_end();
    return 0;
  }
  
  
  
  if (l_pien) {
    if (aukcja[i][WYSTAWIAJACY]!=this_player()->query_name(PL_MIA)) {
      gielda_hook_odbierz_incorrect_person_money(o1);
      return 0;
    }
    
    if ((aukcja[i][KUPUJACY]==query_short())||!aukcja[i][KUPUJACY]) {
      gielda_hook_odbierz_nobody_buy(o1);
      return 0;
    }
    
    pom = text(split_values(aukcja[i][CENA]-aukcja[i][CENA]/5), PL_MIA);
    
    
    value_arr = split_values(aukcja[i][CENA]-aukcja[i][CENA]/5);
    
    if (change_money(null_arr+value_arr, 0, this_player(),1)){
      notify_fail("Nie dasz rady uniesc tylu pieniedzy.\n");
      return 0;
    }
    
    gielda_hook_odbierz_money(value_arr, o1);
    
    
    aukcja[i][WYSTAWIAJACY]=0;
    if (!aukcja[i][KUPUJACY]){
      aukcja-= ({aukcja[i]});
      przedmioty-= ({przedmioty[i]});
      gielda_hook_end_of_aukcja(i+1);
    }
    
    return 1;
  }
  
  if (this_player()->query_nazwa(PL_MIA)!=aukcja[i][KUPUJACY]) {
    gielda_hook_odbierz_incorrect_person_ob(o1);
    return 0;
  }
  
  if (!can_pay(aukcja[i][CENA], this_player())){
    gielda_hook_odbierz_cant_pay();
    return 0;
  }
  
  if (o1->move(this_player())) {
        gielda_hook_odbierz_ob_to_heavy(o1);
        notify_fail("Niestety "+  
          PNAZWA(o1, PL_MIA) +
          " chyba jest dla ciebie za ciezkie.\n");
        return 0;
  }
  
  change_money(null_arr + split_values(aukcja[i][CENA]), this_player(), 0, 1);
  
  
  gielda_hook_odbierz_ob(split_values(aukcja[i][CENA]), o1);
  
    
  
  aukcja[i][KUPUJACY]=0;
  if (!aukcja[i][WYSTAWIAJACY]) {
    aukcja -= ({aukcja[i]});
    przedmioty -= ({przedmioty[i]});
    gielda_hook_end_of_aukcja(i+1);
  }
  
  
  return 1;
    
}


int
gielda_hook_end_of_aukcja(int i)
{
  return 1;
}



int 
gielda_hook_odbierz_no_end()
{
  object o = query_shop_keeper();
  
  notify_fail("");
  if (o)
  {
    o->command("powiedz Bardzo mi przykro, ale licytajca nie zostala "+
      "jeszcze zakonczona.");
  }
  else
  {
    notify_fail("Licytacja nie zostala jeszcze zakonczona.\n");
  }
  return 0;  
}

int 
gielda_hook_odbierz_ob(int *v, object o1)
{
  object o = query_shop_keeper();
  
  if (o)
  {
    o -> command("powiedz "+capitalize(QIMIE(this_player(), PL_MIA)) +
      " odebral " + PNAZWA(o1, PL_BIE));
  }
  else
  {
    write ("Odebrales " + PNAZWA(o1, PL_BIE) +
      ", placac " + text(v, PL_MIA) + ".\n");
    say (capitalize(QIMIE(this_player(), PL_MIA)) + " odebral "+
	PNAZWA(o1, PL_BIE) +
      ".\n");
  }
  return 1;
}


int 
gielda_hook_odbierz_money(int *v, object o1)
{
  object o = query_shop_keeper();
  
  string pom = text(v, PL_BIE);
  if (o)
  {
    o -> command("powiedz " + capitalize(QIMIE(this_player(), PL_MIA)) +
      " odebral pieniadze za "+PNAZWA(o1,PL_BIE));
  }
  else
  {
    write ("Otrzymujesz wylicytowana sume, minus 20% prowizjii, to znaczy:"+
      "\n" + pom + "\n");
    say(capitalize(QIMIE(this_player(), PL_MIA)) + " odbiera pieniadze za "+
      PNAZWA(o1, PL_BIE) +    
      ".\n");
  }
  return 1;
}


int 
gielda_hook_odbierz_on_end()
{
  object o = query_shop_keeper();
  
  notify_fail("");
  if (o)
  {
    o->command("powiedz " + "Panie "+
      capitalize(this_player()->query_wolacz()) +
      ", ta licytacja jeszcze nie zostala zakonczona!");
  }
  else
  {
    notify_fail("Ta licytacja jeszcze nie zostala zakonczona.\n");
  }
  return 0;
}


int 
gielda_hook_odbierz_cant_pay()
{
  object o = query_shop_keeper();
  
  notify_fail("");
  if (o)
  {
    o->command("powiedz " + "Panie "+
      capitalize(this_player()->query_wolacz()) +
      " nie posiada Pan odpowiedniej ilosci gotowki.");
  }
  else
  {
    notify_fail("Ta licytacja jeszcze nie zostala zakonczona.\n");
  }
  return 0;
}



int
gielda_hook_odbierz_nobody_buy(object ob)
{
  object o = query_shop_keeper();
  
  notify_fail("");
  if (o)
  {
    o->command("powiedz Przykro mi ale tego przedmiotu");
  }
  else
  {
    notify_fail("Ta licytacja jeszcze nie zostala zakonczona.\n");
  }
  return 0;
}


int
gielda_hook_odbierz_incorrect_person_ob(object ob)
{
  object o = query_shop_keeper();
  
  notify_fail("");
  if (o)
  {
    o->command("powiedz " + "Panie "+
      capitalize(this_player()->query_wolacz()) +
      ". Pan nie wygral " + PNAZWA(ob, PL_BIE));
  }
  else
  {
    notify_fail("Nie wygrales " + PNAZWA(ob, PL_BIE)+"\n");
  }
  return 0;
}


int 
gielda_hook_odbierz_incorrect_person_money(object ob)
{
  object o = query_shop_keeper();
  
  notify_fail("");
  if (o)
  {
    o->command("powiedz " + "Panie "+
      capitalize(this_player()->query_wolacz()) +
      ". Pan nie jest osoba uprawniona do odbioru pieniedzy za " + 
      PNAZWA(ob, PL_BIE));
  }
  else
  {
    notify_fail("Nie jestes uprawniony do odbioru pieniedzy za " 
      + PNAZWA(ob, PL_BIE)+"\n");
  }
  return 0;
}


int
gielda_hook_odbierz_ob_to_heavy(object ob)
{
  object o = query_shop_keeper();
  
  notify_fail("");
  if (o)
  {
    o->command("powiedz Bardzo mi przykro, ale jest Pan za "+
      "bardzo obciazony.\n");
  }
  else
  {
    notify_fail("Jestes za bardzo obciazony.\n");
  }
  return 0;
}


int do_wycofaj ( string s) {
    mixed lis;
    string wzor;
    int i, null_arr, ok, czas_a, czas_w;
    object o1, o2;
    
    wzor = " %i:" + PL_BIE + " [z] [aukcji] ";
    if (!parse_command(s, przedmioty, wzor, lis)) {
      notify_fail("Co chcesz wycofac?\n");
      return 0;
    }
    
    null_arr = allocate(sizeof(query_money_types())) + ({});
    if (!( i = lis[0])) {
      notify_fail("Co ?\n");
      return 0;
    }
    if (i < 0)
      i=-i;
    o1 = lis[i];
    
    i=-1;
    while (o1!=przedmioty[++i]);

    if (aukcja[i][WYSTAWIAJACY]!=this_player()->query_name(PL_MIA)) {
      gielda_hook_wycofaj_incorrect_person(o1);
      return 0;
    }
    ok =0;
    if (o2=find_object("/secure/armageddon.c")) {
      if (!o2->shutdown_active())  {
	ok =1;
	if (!can_pay(aukcja[i][CENA] / 5, this_player())){  // 20% 
	  gielda_hook_wycofaj_cant_pay(o1);
	  return 0;
	}
	czas_a = time() + 7200;
	czas_w = aukcja[i][CZAS] + 3600;
	if ((czas_w > czas_a)&&(aukcja[i][KUPUJACY]!=query_short())&&!aukcja[i][KUPUJACY]) {
	  gielda_hook_wycofaj_time_for_winner(o1);
	  return 0;
	}
      }
      
    }
    else {
      notify_fail ("Zglos buga.\n");
      return 0;
    }
    
    if (o1->move(this_player())) {
       gielda_hook_wycofaj_ob_to_heavy(o1);
       return 0;
    }
    
    
    if (ok) 
    {
      change_money (null_arr + split_values(aukcja[i][CENA]/5), this_player(), 
	   0, 1);
      gielda_hook_wycofaj(o1);
    }
    else
    {
      gielda_hook_wycofaj_armageddon(o1);
    }
    
    aukcja -= ({aukcja[i]});
    przedmioty -= ({przedmioty[i]});
    
    return 1;
}    


int
gielda_hook_wycofaj(object ob)
{
  object o = query_shop_keeper();
  
  if (o)
  {
    o->command("powiedz Pan "+capitalize(QIMIE(this_player(), PL_MIA)) +
      " zdecydowal sie wycofac "+ PNAZWA(ob, PL_BIE) + " z licytacji");
  }
  else
  {
    write("Wycofales "+ PNAZWA(ob, PL_BIE) + " z licytacji.\n");
    say(capitalize(QIMIE(this_player(), PL_MIA)) + " wycofal "+
      PNAZWA(ob, PL_BIE) + " z licytacji.\n");
  }
  return 1;
}


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("Wycofales "+ PNAZWA(ob, PL_BIE) + " z licytacji "+
    "bez strat.\n");
    say(capitalize(QIMIE(this_player(), PL_MIA)) + " wycofal "+
      PNAZWA(ob, PL_BIE) + " z licytacji.\n");
  }
  return 1;
}


int 
gielda_hook_wycofaj_ob_to_heavy(object ob)
{
  object o = query_shop_keeper();
  
  notify_fail("");
  if (o)
  {
    o->command("powiedz "+capitalize(PNAZWA(ob, PL_MIA)) + 
      " jest dla Ciebie za ciezki, Panie " +
      capitalize(this_player()->query_wolacz()));
  }
  else
  {
    notify_fail(capitalize(PNAZWA(ob, PL_MIA)) +" jest zbyt ciezki.\n");
  }
  return 0;
}


int 
gielda_hook_wycofaj_time_for_winner(object ob)
{
  object o = query_shop_keeper();
  
  notify_fail("");
  if (o)
  {
    o->command("powiedz Osoba, ktora wygrala licytacje ma jeszcze czas, "+
      "by odebrac " + PNAZWA(ob, PL_BIE));
  }
  else
  {
    notify_fail("Osaba, ktora wygrala licytacje ma jeszcze czas, "+
      "by odebrac "+PNAZWA(ob, PL_BIE)+".\n");
  }
  return 0;
}



int 
gielda_hook_wycofaj_cant_pay(object ob)
{
  object o = query_shop_keeper();
  
  notify_fail("");
  if (o)
  {
    o->command("powiedz "+capitalize(QIMIE(this_player(), PL_MIA)) +
      " nie posiada wystarczajacej gotowki, by odebrac "+
      PNAZWA(ob, PL_BIE));
  }
  else
  {
    notify_fail("Nie posiadasz wystarczajacej ilosci gotowki, by odebrac "+
      PNAZWA(ob, PL_BIE) + ".\n");
  }
  return 0;
}


int
gielda_hook_wycofaj_incorrect_person(object ob)
{
  object o = query_shop_keeper();
  
  notify_fail("");
  if (o)
  {
    o->command("powiedz "+capitalize(QIMIE(this_player(), PL_MIA)) +
      " nie jest osoba uprawniona do odbioru "+
      PNAZWA(ob, PL_BIE));
  }
  else
  {
    notify_fail("Nie jestes osoba uprawniona do odbioru "+
      PNAZWA(ob, PL_BIE) + ".\n");
  }
  return 0;
}



public int
remove_object()
{
  string s;
  int i, pom;
  
  s="";
  if (pom=sizeof(aukcja)){
    for (i=0; i < pom; i++)
      if ((aukcja[i][KUPUJACY]!=query_short())&&aukcja[i][KUPUJACY])
        if ((time() + 7200) > aukcja[i][CZAS])
          s+=aukcja[i][KUPUJACY] +", cena, jaka wylicytowal: " +
            text(split_values(aukcja[i][CENA]), PL_MIA) + "\n";
    if (s!="")
      log_file(query_log_file(), s, 0);
  }
  return ::remove_object();
}
