// gielda przedmiotow magicznych
// Pomysl Silvy, wykonanie Alfen

#include "alfen.h"
#include "silvy.h"


inherit "/lib/trade.c";
inherit "/d/Imperium/std/room.c";

#include <time.h>

static string store_room;

private mixed aukcja;

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_"


int query_price(object ob){
  int seed;
  
  sscanf(OB_NUM(ob), "%d", seed);
  return 2 * ob->query_prop(OBJ_I_VALUE) * ( query_money_greed_buy() +
     15 - this_player()->query_skill(SS_TRADING)/4 + random (15) * seed /100);
}


void set_store_room(string s){
  store_room = s;
}


string query_store_room(){
  return store_room;
}


mixed query_aukcja(){
  return aukcja;
}


void create_gielda(){
  set_store_room( APATH + "lokacje/magazyn_gieldy.c");
}


void create_imperium_room(){
  aukcja=({});
  create_gielda();
}



void reset_gielda(){
}


void reset_imperium_room(){
  reset_gielda();
}



void init_gielda(){
  add_action ("do_wystaw", "wystaw");
  add_action ("do_przejrzyj", "przejrzyj");
}


void init(){
  ::init();
  init_gielda();
}


object wystaw_to(object ob, string s, int *czas){
  int value, err, cena;
  
  cena = 0;
  call_other(store_room, "load_me"); // zaladuj store room
  
  // 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();
    return 0;
  }  
  
  // obiekt nie na sprzedaz
  if (ob->query_prop(OBJ_M_NO_SELL)) {
    return 0;
  }
  
  cena = query_price(ob);
  
  if (cena <= 0) {
    return 0;
  }
  
  if (ob->query_prop(OBJ_I_NO_DROP)) {
    return 0;
  }
  
    
  // blad w przesowaniu obiektu
  if (err = ob ->move (store_room)) {
    return 0;
  }
  
  aukcja+=allocate(1);  // dodaj kolejnego wystawiajacego
  aukcja [sizeof(aukcja)-1] = allocate(5);
  aukcja [sizeof(aukcja)-1] [OBIEKT]=ob;  // przedmiot pozadania
  aukcja [sizeof(aukcja)-1] [WYSTAWIAJACY]=this_player();   // wystawiajacy
  aukcja [sizeof(aukcja)-1] [KUPUJACY]=({this_player()});   // kupujacy
  aukcja [sizeof(aukcja)-1] [CENA]=({cena}); // proponowana cena
  aukcja [sizeof(aukcja)-1] [CZAS]=({czas}); // czas licytacji
  
  return ob; 
}



int do_wystaw (string s){
  string wzor;
  object o1;
  int *czas1, c1, c2;
  
  if (!s) {
    notify_fail("Co wystawic na licytacje???\n");
    return 0;
  }
  
  wzor = " %o:" + PL_BIE + " 'do' %d";
  if (!parse_command(s, all_inventory(this_player()), wzor, o1, c1)){
    notify_fail("Co wystawic na licytacje i do ktorej godziny????\n");
    return 0;
  }
  
  czas1 = TIME2NUM(time() + 7200);
  
  if (c1 < czas1[1] ) {
    notify_fail("Czas chyba biegnie do przodu........\n");
    return 0;
  }
  
  if (c1 == czas1[1] ) {
    notify_fail("Na aukcje wystawia sie rzeczy co najmniej na godzine.\n");
    return 0;
  }
  
  if ((c1 > 23)||(c1<0)) {
    notify_fail("Hmm, doba liczy chyba 24 godziny....\n");
    return 0;
  }
  
  if (( c1- czas1[1])  < 3 ) {
    notify_fail("Przedmiot mozna wystawic co najmniej na trzy 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) {
    if (!(o1 = wystaw_to(o1 , "zloto", czas1))) {
      return 0;
    }
    else {
      write ("Wystawiles na aukcje " + o1 -> query_nazwa (PL_BIE) + ".\n");
      return  1;
    }
    this_player()->remove_prop(OBJ_O_WYSTAW_NA_AUKCJE);
  }
  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);
    write ("Wystaw na aukcje drugi raz ten sam przedmiot w "+
         "celu potwierdzenia transakcji.\n");
  }
  return 1;
}


void aukcja_hook_przejrzyj(int nr){
  string pom;
  pom = sprintf("%d3%s20%s30%d2:%d2",nr,aukcja[nr][OBIEKT]->query_nazwa(PL_MIA),
      aukcja[nr][CZAS][1], aukcja[nr][CZAS][2]);
  write (pom);
}

  
void aukcja_hook_przejrzyj_info(int nr){
  write("Przedmiot: " + aukcja[nr][OBIEKT]->query_nazwa(PL_MIA) + "\n");
  write("Wystawiajacy: " + aukcja[nr][WYSTAWIAJACY]->query_nazwa(PL_MIA) + "\n");
  write("Aktualna Cena: " + text(split_values(aukcja[nr][CENA]), PL_MIA)  + "\n");
  write("Cena zaproponowana przez: " + aukcja[nr][KUPUJACY]->query_nazwa(PL_MIA) + "\n");
  write("Zakonczenie aukcji: " +  aukcja[nr][CZAS] +":"+aukcja[nr][CZAS]+"\n");
  write("Przedmiot przetrwa Apokalipse: ");
  if (aukcja[nr][OBIEKT]->check_recoverable(0))
    write("TAK\n");
  else
    write("NIE\n");
}

 
int  do_przejrzyj (string s){
  int i;
  
  if (!s) {
    if (!aukcja) {
      write ( "Aktualnie nie odbywa sie zadna aukcja.\n");
      return 1;
    }
    for (i=0; i < sizeof(aukcja); i++)
      aukcja_hook_przejrzyj(i);
    return 1;
  }
  if (!sscanf(s,"aukcje nr %d", i)) {
    notify_fail("Przejrzyj aukcje nr ???\n");
    return 0;
  }
  if ((d < 0)||(d > sizeof(aukcja)) {
    notify_fail("Nie ma aukcji o podanym numerze.\n");
    return 0;
  }
  aukcja_hook_przejrzyj_info(i);
  return 1;
}