inherit "/d/Imperium/std/room";

#include "szturmix.h"
#include <money.h>
#include <composite.h>

#define TAX 3
#define S_FILE ("/d/Imperium/GUILDS/Rodzina_Ragazzi/lokacje/skarbiec")
#define LOG_FILE ("/d/Imperium/GUILDS/Rodzina_Ragazzi/log/skarbiec.log")
#define ENG "/d/Imperium/GUILDS/Rodzina_Ragazzi/engine/engine.c"
#define TYPY ({"miedz","srebro","zloto","mithryl"})

#define OPISY11 ({"miedziana monete","srebrna monete","zlota monete",\
		"mithrylowa monete"})
#define OPISY12 ({"miedzi","srebra","zlota","mithryle"})
#define OPISY13 ({"miedzi","srebra","zlota","mithryli"})

#define OPISY22 ({"miedziane monety","srebrne monety","zlote monety",\
		"mithrylowe monety"})
#define OPISY23 ({"miedzianych monet","srebrnych monet","zlotych monet",\
		"mithrylowych monet"})

#define NT num(typ)

#define C(str) capitalize(str)
#define NAME (TP->query_real_name())

int *forsa=({0,0,0,0}),*prow=({0,0,0,0});
mapping in=([]),out=([]);
int ksg=0,strona=0;

string sprawdz(string imie);
string opis_mon_arr(int *arr);

create_imperium_room()
{
       add_prop(ROOM_I_INSIDE, 1);
        
        set_short("Skarbiec");
        set_long("Skarbiec z ksiega\n");
                  

         add_item("tabliczke","Tabliczke ta mozna przeczytac.\n");
         add_item("bariere","Wykonana z mocnego debu, bariera ta przegradza " +
         	"pokoj, dzialac go na dwie nierowne czesci.\n");
         add_item("ksiege","@@opis_ksiegi");
         
        add_cmd_item("tabliczke","przeczytaj",
         "Mozna tu <wplacic> jakas kwote, <pobrac> kwote, o ile " +
       "ma sie do tego prawo.\n");
         
        add_cmd_item("ksiege","przeczytaj","@@czyt_ksiege");
        add_cmd_item("ksiege","otworz","@@otw_ksiege");
        add_cmd_item("ksiege","zamknij","@@zam_ksiege");
        add_cmd_item("strone","przewroc","@@przewr_strone");
         add_cmd_item("formularz","wez","@@wez_form");
                  
        add_exit("/d/Imperium/GUILDS/Rodzina_Ragazzi/lokacje/sklepik.c","poludnie",0,1,0);
        
        restore_object(S_FILE);
        
        ksg=0;strona=0;
}

string
opis_ksiegi()
{
   string opis="W tej ksiedze umieszczone zostaly " +
         	"wszystkie informacje do wgladu przez upowaznione osoby " +
         	"o przeprowadzonych wplatach i wyplatach. Z niej mozna sie " +
         	"dowiedziec tez o aktualnym napelnieniu Skarbca.\n";
   
   opis+=(!ksg)?"Ksiega jest zamknieta.\n":"Ksiega jest otwarta.\n";
   
   return opis;
}

string
spis_wplac()
{
   string *imiona=m_indexes(in);
   int i;
   string spis="";
   
   imiona=sort_array(imiona);
   
   for (i=0;i<sizeof(imiona);i++)
       {
          spis+=C(imiona[i]) + (strlen(imiona[i])<8?"\t":"") + 
             "\t-\t" + opis_mon_arr(in[imiona[i]]) + ".\n";
       }
   return spis;
}

string
spis_pob()
{
   string *imiona=m_indexes(out);
   int i;
   string spis="";
   
   imiona=sort_array(imiona);
   
   for (i=0;i<sizeof(imiona);i++)
       {
          spis+=C(imiona[i]) + (strlen(imiona[i])<8?"\t":"") + 
             "\t-\t" + opis_mon_arr(out[imiona[i]]) + ".\n";
       }
   return spis;
}

int
pusto(int *gdzie)
{
   int i,suma=0;
   
   for (i=0;i<sizeof(gdzie);i++)
       {
          suma+=gdzie[i];
       }
   return suma==0;
}

string
czyt_ksiege()
{
   string opis;
   string wpl=spis_wplac(),pb=spis_pob();
   
   if (!ksg) return "Ksiega jest zamknieta.\n";
   
  // if (!sprawdz(NAME)) return "Nie mozesz czytac tej ksiegi!\n";
   
   opis=(!strona)?
      (pusto(forsa)?"Skarbiec jest pusty.\n":
         "W Skarbcu znajduje sie " + opis_mon_arr(forsa) + ".\n") + 
      (pusto(prow)?"":
      "Dodatkowo " + opis_mon_arr(prow) + " jest przeznaczone dla " +
        "Ksiecia.\n") 
       +(wpl!=""?"\nWplacali:\n"+wpl:"") + (pb!=""?"\nPobierali:\n"+pb:"")
      :
      "Historia wplat i wyplat:\n"+read_file(LOG_FILE,1);
   
   seteuid("silvy");
   
   say(QCIMIE(TP,PL_MIA) + " czyta ksiege.\n");
//   if (strona) TP->more(LOG_FILE,1);
//      else 
   TP->more(opis,0);
      
   return "";
}

string
otw_ksiege()
{
   
   if (!ksg)
      {
         if (!sprawdz(NAME)) return "Nie mozesz dotykac tej ksiegi!\n";
         ksg=1;
         write("Otwierasz ksiege.\n");
         say(QCIMIE(TP,PL_MIA) + " otwiera ksiege.\n");
      }
   else return "Ksiega jest juz otwarta.\n";
   return "";
}

string
zam_ksiege()
{
   if (ksg)
      {
         ksg=0;
         write("Zamykasz ksiege.\n");
         say(QCIMIE(TP,PL_MIA) + " zamyka ksiege.\n");
      }
   else return "Ksiega jest juz zamknieta.\n";
   return "";
}

string
przewr_strone()
{
   if (!sprawdz(NAME)) return "Nie mozesz dotykac tej ksiegi!\n";
   strona=!strona;
   write("Przewracasz strone.\n");
   say(QCIMIE(TP,PL_MIA) + " przewraca strone ksiegi.\n");
   return "";
}

string
opis_przy_licz(int liczba, string str1, string str2, string str3)
{
   if (liczba==1) return str1;
   if ((liczba%10)>=2&&(liczba%10)<=4&&((liczba/10)%10)!=1) return str2;
   return str3;
}

int 
num(string typ)
{
   return member_array(typ,TYPY);
}

string
opis_mon(string typ,int ile)
{
   return "" + ile + " " +opis_przy_licz(ile,OPISY11[NT],OPISY12[NT],OPISY13[NT]);
}

int
czy_nie_zero(int val)
{
   return val;
}

string
opis_mon_arr(int *arr)
{
   string *strs=allocate(sizeof(filter(arr,czy_nie_zero)));
   int i=0,j=sizeof(arr)-1;
   
   while (j>-1)
         {
            if (arr[j]) 
               {
                  strs[i]="" + arr[j] + " " + 
                  opis_przy_licz(arr[j],OPISY11[j],OPISY12[j],OPISY13[j]);
                  i++;
               }
            j--;
         }

   return COMPOSITE_WORDS(strs);
}

int *
mon_array_from(int ile, string typ)
{
   int nm=NT;
   int *arr=allocate(4);
   
   arr[nm]=ile;
   
   return arr;
}

int
przelicznik(int num)
{
   switch(num)
      {
         case 1: return 12;
         case 2: return 20;
         case 3: return 100;
      }
}

int *
obetnij(int *arr, int num)
{
   int przel,pom,i;
   
   if ((pom=sizeof(arr)-num-1)<=0) return arr;
   
   for (i=pom;i>0;i--)
       {
          przel=przelicznik(i+num);
          arr[num+i-1]+=przel*arr[num+i];
          arr[num+i]=0;
       }
   return arr;
}

int *
dodaj_forse(int ile, string typ)
{
   int mie=MONEY_MERGE(mon_array_from(ile,typ)),pom,i,nr=NT;
   int *arr,*pom2;
   
   pom=TAX*mie/100;
   arr=obetnij(MONEY_SPLIT(pom),nr);
   
   mie=mie-pom;
   
   pom2=obetnij(MONEY_SPLIT(mie),nr);
   
   for (i=0;i<sizeof(pom2);i++)
       {
          forsa[i]+=pom2[i];
       }
   for (i=0;i<sizeof(arr);i++)
       {
          prow[i]+=arr[i];
       }
   
   return arr;
}
int
odejmij_forse(int ile, string typ)
{
   if (forsa[NT]>=ile)
      forsa[NT]-=ile;
   else return 0;
   return 1;
}

int
wplaca(string kto, int ile, string typ)
{
   int *arr=in[kto],*tax;
   object man=find_player(kto);
   
   if (!arr) arr=allocate(4);
   if (ile<=0) return notify_fail("Jak sobie to wyobrazasz?\n");
   
   if (MONEY_MOVE(ile,typ,man,0)==-1) return notify_fail("Nie masz tyle pieniedzy!\n");
   
   arr[NT]+=ile;
   tax=dodaj_forse(ile,typ);
   
   in[kto]=arr;
   
   set_this_player(man);
   
   write("Wplacasz " + ile + " " + 
     opis_przy_licz(ile,OPISY11[NT],OPISY12[NT],OPISY13[NT]) + ".\n");
   say(QCIMIE(TP,PL_MIA) + " wplaca pieniadze do skarbca.\n");
   
   write_file(LOG_FILE, C(kto) + " wplacil " +  opis_mon(typ,ile) + ", z czego " +
   	opis_mon_arr(tax) + "\npobrano na rzecz Rodziny Ragazzi.\n");
   	
   save_object(S_FILE);
   return 1;
}

string
sprawdz(string imie)
{
   if (ENG->query_ranga(imie)>=3) return "Moze";
    if (this_player()->query_real_name()=="homik") return "Moze";
   
   return 0;
}

string
kim_jest(string str)
{
   switch(str)
      {
         case "Mistrz": return " korzystajac z prawa Ojca";
         default: return ", z upowaznienia wystawionego przez " + C(str);
      }
}

int
pobiera(string kto, int ile, string typ)
{
   mixed *arr=out[kto];
   string pom;
   object man=find_player(kto);
   
   if (!arr) arr=allocate(4);
   
   if (ile<=0) return notify_fail("Jak sobie to wyobrazasz?\n");
   
   if (!(pom=sprawdz(kto))) 
      return notify_fail("Nie mozesz pobierac pieniedzy ze Skarbca!\n");;
   
   arr[NT]+=ile;
   
   if (!odejmij_forse(ile,typ)) return notify_fail("W skarbcu nie ma " +
   	"tych pieniedzy.\n");
   
   MONEY_MAKE(ile,typ)->move(man,1);
   
   set_this_player(man);
   write("Pobierasz " + opis_mon(typ,ile) + ".\n");
   say(QCIMIE(TP,PL_MIA) + " pobiera jakies pieniadze.\n");
   
   
   out[kto]=arr;
   
   write_file(LOG_FILE, C(kto) + " pobral " +  opis_mon(typ,ile)
   	+ kim_jest(pom) + ".\n");
   	
   save_object(S_FILE);
   return 1;
}

int
co_to_za_typ(string tp,int ile)
{
   int pom;
   
   switch (opis_przy_licz(ile,"a","b","c"))
      {
         
         case "a": if ( (pom=member_array(tp,OPISY11))>-1) return pom;
         	   return -1;
         case "b": if ( (pom=member_array(tp,OPISY12))>-1) return pom;
         	   if ( (pom=member_array(tp,OPISY22))>-1) return pom;
         	   return -1;
         case "c": if ( (pom=member_array(tp,OPISY13))>-1) return pom;
         	   if ( (pom=member_array(tp,OPISY23))>-1) return pom;
         	   return -1;
      }
   
   return -1;
}

int
wplac(string str)
{
   int ile,pom;
   string typ;
   
   notify_fail("Wplac <ile> ?\n");
   
   if (!str||!parse_command(str,({}),"%d %s",ile,typ)) return 0;
   
   if (!ile||!typ) return 0;
   
   if ((pom=co_to_za_typ(typ,ile))<0) return 0;
   return wplaca(NAME,ile,TYPY[pom]);
}

int 
pobierz(string str)
{
   int ile,pom;
   string typ;
   
   notify_fail("Pobierz <ile> ?\n");
   
   if (!str||!parse_command(str,({}),"%d %s",ile,typ)) return 0;
   
   if (!ile||!typ) return 0;
   
   if ((pom=co_to_za_typ(typ,ile))<0) return 0;
   
   return pobiera(NAME,ile,TYPY[pom]);
}



init()
{
   ::init();
   add_action(wplac,"wplac");
   add_action(pobierz, "pobierz");
}

remove_object()
{
   save_object(S_FILE);
   ::remove_object();
}
                         

int
save_me()
{
   save_object(S_FILE);
return 1;
}