/*
 * Glowny obiekt pustkowi chaosu
 * by Tanis - sierpien 1998
 *
 * Uwaga ! Wszelkie opisy nie moga konczyc sie \n, zamiast tego musza konczyc sie spacja !
 */

#include "tanis.h"

inherit PATH + "std/pogoda.c";
inherit "/d/Imperium/std/room.c";

inherit "/lib/drink_water";     /* Funkcje obslugujace picie wody. */

#include "rownina.h"

#define DEF_DIRS ({ "polnoc", "poludnie", "wschod", "zachod", "gora", "dol",\
		    "polnocny-wschod", "polnocny-zachod", \
		    "poludniowy-wschod", "poludniowy-zachod" })

string opis_tej_lokacji="BLAD ! BRAK OPISU LOKACJI ! ZGLOS TO ! ";
int *uklad_opisu_tej_lokacji=({0,0,0,0});

mixed *zdania_tmp=({});

int
query_typ_terenu()
{
  return uklad_opisu_tej_lokacji[0];
}

void
ustaw_dlugi_opis(string napis)
{
   opis_tej_lokacji=napis;
}

void
rozszerz_dlugi_opis(string o_co)
{
   opis_tej_lokacji=opis_tej_lokacji+o_co;
}

string
zwroc_dlugi_opis()
{
   return opis_tej_lokacji;
}

void
dodaj_stworki(int typ_terenu)
{
/*
 * Mnie sie to nie podoba - wole po swojemu
 *
    int a,b,x,y,suma,liczba_stworow;
    string ktory;
    mixed *rodzaj=JAKIE_STWORY;

   // Tutaj dodawane sa standardowe dla wszystkich terenow stworki
   //  ( z tablicy stworow w rownina.h )
 
    a=random(10);

    // Tutaj sie trzeba zastanowic, jakie maja byc wartosci...

    if(a<5) liczba_stworow=0;
    if(a>4 && a<8) liczba_stworow=1;
    if(a==8 || a==9) liczba_stworow=2;

    suma=0;    

    for(x=0;x<sizeof(rodzaj);x=x+2)
       {
         suma=suma+rodzaj[x];
       }         

    for (x = 0; x < liczba_stworow; x++)
        {
            a=random(suma);        
            b=sizeof(rodzaj);
            
            for(y=0;y<b;y=y+2)
               {
                  a=a-rodzaj[y];
                  if(a<0)
                    {
                         dodaj_npca(rodzaj[y+1]);
                    }
              }
        }
        
   // Tutaj moga byc dodawane stworki w zaleznosci od typu terenu
 
     //   if(typ_terenu==1) dodaj_npca("/d/Imperium/Nuln/npc/dziwka1.c");
     // We wszystkich lokacjach typu 1 ('rownina') bedzie dodatkowa
     //  atrakcja w postaci panienki ;-))        
  
 *
 */

  if(!random(50)) dodaj_npca(NPATH + "troll.c");
 
  if(typ_terenu==1)
    {
    if(!random(20))
      {
      // Banda snotlingow
        dodaj_npca(NPATH + "snotwodz.c");
        dodaj_npca(NPATH + "snotling.c");   
        dodaj_npca(NPATH + "snotling.c");   
        if(!random(2)) dodaj_npca(NPATH + "snotling.c");   
        if(!random(2)) dodaj_npca(NPATH + "snotling.c");   
        if(!random(2)) dodaj_npca(NPATH + "snotling.c");   
        if(!random(2)) dodaj_npca(NPATH + "snotling.c");   
        if(!random(2)) dodaj_npca(NPATH + "snotling.c");   
        if(!random(2)) dodaj_npca(NPATH + "snotling.c");   
      }
    }         
    else
    {
      switch(random(200))
      {
        case 0:
        dodaj_npca(NPATH + "zwczlek1.c");
        case 1:
        dodaj_npca(NPATH + "zwczlek2.c");
        case 2:
        dodaj_npca(NPATH + "zwczlek3.c");
        case 3:
        dodaj_npca(NPATH + "zwczlek4.c");
        case 4:
        dodaj_npca(NPATH + "zwczlek5.c");
        case 5:
        dodaj_npca(NPATH + "zwczlek6.c");
        case 6:
        dodaj_npca(NPATH + "zwczlek7.c");
        case 7:
        dodaj_npca(NPATH + "zwczlek8.c");
        case 8:
        dodaj_npca(NPATH + "zwczlek9.c");
        case 9:
        dodaj_npca(NPATH + "zwczlek10.c");
        case 10:
        dodaj_npca(NPATH + "zwczlek_gig.c");
      }      
    }  
         
  return;

}

void
konfiguruj_teren()
{
  int a;
  
  a = query_typ_terenu();
  
  // Ponizej nalezy tez dodac, ze jesli typ terenu jakis tam (np. gory) to dodaje propa, 
  // ze lokacja nie nadaje sie do obozowania /bandy orkow/
  // Tutaj jest tez miejsce na wlaczenie 'efektow specjalnych' ;-))
 switch(a)
  {
    case 9 :  set_drink_places("z rzeki");    /* Skad mozna napic sie wody. */
              break;
    default : break;
  }

  dodaj_stworki(a); // I przekazujemy typ terenu...
  
}    

/* Opis towarzyszacy piciu wody z wodospadu. */

void
drink_effect(string str)
{
    write("Podchodzisz do samego brzegu rzeki, przyklekasz i pijesz z niej odrobine wody.\n");
    say(QCIMIE(this_player(), PL_MIA) + " podchodzi do samego brzegu rzeki, przykleka i pije z niej lyk wody.\n");
}
                              

int *zmien_kolejnosc(int *tablica1)
{
  int *tablica2=({});
  int a,b,c;

  c=sizeof(tablica1);

  for(a=0;a<c;a++)
     {
       b=random(sizeof(tablica1));
       if(a==0) b=0; // Pierwsza czesc opisu jest stala.

       tablica2=tablica2+({tablica1[b]});
       tablica1[b]=-5;
       tablica1=tablica1-({-5});
     }
 
  return tablica2;
}

void
ustaw_itemy_standardowe(int typ)
{
    switch(typ)
     {
        case  1 : add_item("ziemie","Pod nogami masz szary piasek, a wlasciwie pyl. Kroczac po nim wzbijasz chmury kurzu, osiadajacego na wszystkim wokol.\n");
                  break;
        case  2 : add_item("ziemie","Ziemia pod twymi stopami jest prawie gola, gdzieniegdzie tylko porosnieta malymi, zasuszonymi kepkami trawy.\n");
                  add_item(({"wzgorza","wzniesienia"}),"Otaczajace cie wzgorza wygladaja jak ziemia pod twoimi nogami - sa szare i smutne.\n");
                  break;
        case  3 : add_item("ziemie","Ziemia pod twymi stopami jest prawie gola, gdzieniegdzie tylko porosnieta malymi, zasuszonymi kepkami trawy.\n");
                  break;
                  add_item(({"wzgorza","wzniesienia"}),"Otaczajace cie wzgorza wygladaja jak ziemia pod twoimi nogami - sa szare i smutne.\n");                  
        case  4 : add_item("ziemie","Stoisz na twardym, skalistym gruncie. Lezy tu mnostwo roznej wielkosci kamieni, o ktore potknac sie nie trudno.\n");
                  add_item(({"skaly","kamienie"}),"Otaczajace cie skaly maja tak ostre krawedzie, ze moga bez trudu rozciac skorzana kurtke, a tym bardziej twoja skore.\n");
                  break;
        case  5 : add_item("ziemie","Stoisz na twardym, skalistym gruncie. Lezy tu mnostwo roznej wielkosci kamieni, o ktore potknac sie nie trudno.\n");
                  add_item(({"skaly","kamienie"}),"Otaczajace cie skaly maja tak ostre krawedzie, ze moga bez trudu rozciac skorzana kurtke, a tym bardziej twoja skore.\n");        
                  break;
        case  6 : add_item("ziemie","Pod stopami masz szary, sypki piasek. Wlasciwie niczym nie rozni sie od pylu pokrywajacego rownine poza tym, ze kilka krokow stad jest regularnie moczony przez morskie fale.\n");
                  add_item(({"morze","ocean"}),"Spogladajac na morze masz wrazenie, ze ciagnie sie ono bez konca. Az po horyzont nie udaje ci si dostrzec ani sladu jakiegos ladu.\n");
                  break;
        case  7 : add_item("ziemie","Grunt pod twymi nogami jest skalisty, jakby tylko czekal, az z urwiska na gorze spadnie ktos nierozsadny i roztrzaska sie tu na miazge.\n");
                  add_item("urwisko","Aby spojrzec na urwisko musisz zadrzec glowe. Ciagnie sie ono pionowo w gore na kilkanascie metrow.\n");
                  break;
        case  8 : add_item("ziemie","Stoisz na skalach, ktore nieco dalej koncza sie, jakby uciete nozem. Jeden nieostrozny krok i roztrzaskasz sie na skalach na dole...\n");
                  add_item("urwisko","Aby zerknac na urwisko trzeba by wychylic sie znad krawedzi, a na to sie nie odwazysz...\n");
                  break;
        case  9 : add_item("ziemie","Stoisz na trwawie. Nie jest moze specjalnie zielona ani bujna, ale po wielu, wielu godzinach na suchej rowninie wydawac by sie moglo, ze stoisz na zielonej lace.\n");
                  add_item("rzeke","Rzeka jest kilka krokow stad. Wydaje ci sie, ze ozesz sie z niej napic.\n");
                  break;
        case 10 : add_item("ziemie","Pod nogami masz brudne, smierdzace bloto. Ugina sie pod toba tak, ze masz nieprzyjemne wrazenie, ze za ktoryms krokiem trzesawisko cie pochlonie.\n");
                  break;
        case 11 : add_item("ziemie","Grunt wokol jest taki jak na rowninie - suchy i piaszczysty. Jedynym urozmaiceniem sa lezace tu i owdzie niewielkie kamienie o ostrych krawedziach.\n");
                  add_item("kamienie","Kamienie zupelnie tutaj nie pasuja, jakby ktos umyslnie je tu porozrzucal, ale urozmaicaja nieco krajobraz.\n");
                  add_item("gory","Otaczajace cie gory wygladaja, jakby pastwily sie nad ta dolinka samym swym wygladem. Cujesz, ze przytlaczaja cie swym ogromem.\n");
                  break;
        case 12 : add_item("ziemie","Stoisz na piachu, prawie takim jak wszedzie wokol. Jednya roznica jest fakt, ze tutaj z poludniowego zachodu na polnocny wschod biegnie jakis trakt.\n");
                  add_item(({"trakt","droge"}),"Droga biegnaca z poludniowego zachodu na polnocny wschod wydaje sie nie miec konca.\n");
                  break;
        case 13 : add_item("ziemie","Pod nogami masz sucha, szara ziemie, przypominajaca ta na rownine otaczajacej las. Jedyna roznica jest fakt, iz tutaj walaja sie zasuszone galezie drzew i stare, karlowate liscie.\n");
                  add_item(({"las","drzewa","drzewo","pnie","pnie"}),"Otaczaja cie male, karlowate drzewa. Sa tak poskrecane, ze ydaje ci sie, ze to jakas potezna sila powyginala je swa magia.\n");
                  break;
      }
}

string
usun_koncowki(string napis1)
{
    string napis2;
    
    if(napis1[(strlen(napis1)-1)]==' ' || napis1[(strlen(napis1)-1)] == '\n') napis2=napis1[0..(strlen(napis1)-2)];
    else napis2=napis1;

    napis1=napis2;

    if(napis1[(strlen(napis1)-1)]==' ' || napis1[(strlen(napis1)-1)] == '\n') napis2=napis1[0..(strlen(napis1)-2)];
    else napis2=napis1;
    
// To jest 2 razy, jakby ktos dodal i spacje i \n (pojedyncza operacja usuwa ostatni znak, jesli to spacja albo \n
//      a podwojna radzi sobie rowniez jesli to jest ' \n')

    return napis2;
}

string
ustaw_opis_i_itemy(int *konfiguracja,int czy_itemy)
{
   int a,b,c;
   int los;
   string opis="";

   uklad_opisu_tej_lokacji=konfiguracja+({}); // Zapisuje konfiguracje podana przez lokacje w zmiennej.

   if(CZY_LOSOWAC_KOLEJNOSC_ZDAN) konfiguracja=zmien_kolejnosc(konfiguracja);

   if(czy_itemy==1) ustaw_itemy_standardowe(konfiguracja[0]);

   zdania_tmp=({});

   zdania_tmp=(TEREN)->zwroc_opis_terenu(konfiguracja[0]);
          
   los=random(sizeof(zdania_tmp));
   opis=opis+zdania_tmp[los][0];
   if(czy_itemy==1)
     {
         for(b=0;b<sizeof(zdania_tmp[los][1]);b=b+2)
             {
//                find_player("tanis")->catch_msg("Konfopisu : b->"+b+".\n");
//                find_player("tanis")->catch_msg("Numer tablicy :"+los+".\n");
//                find_player("tanis")->catch_msg(zdania_tmp[los][0]+"\n");                
//    Takie tam male usterki ;-)
                add_item(zdania_tmp[los][1][b],zdania_tmp[los][1][b+1]);
             }
      }

   for(a=1;a<sizeof(konfiguracja);a++)
      {
          c=konfiguracja[a]-20;
          if(c<0) c=0;
          zdania_tmp=(OKOLICA)->zwroc_opis_okolicy(c);
          los=random(sizeof(zdania_tmp));
          opis=opis+usun_koncowki(zdania_tmp[los][0])+" ";
          if(czy_itemy==1)
            {
               for(b=0;b<sizeof(zdania_tmp[los][1]);b=b+2)
                  {
                     add_item(zdania_tmp[los][1][b],zdania_tmp[los][1][b+1]);
                  }
            }
       }
   zdania_tmp=({});       
       
   ustaw_dlugi_opis(usun_koncowki(opis));
   
   konfiguruj_teren();
}

void
ustaw_opis(int *konfiguracja)
{
  ustaw_opis_i_itemy(konfiguracja,1);
}

void
ustaw_opis_bez_itemow(int *konfiguracja)
{
 ustaw_opis_i_itemy(konfiguracja,0);
}

int
go()
{
   int zmeczenie;

   zmeczenie=idzie(query_typ_terenu(), tablica_zmeczen); 

/*
 * Funkcja z pogody.c, rozszerzona
 * o obsluge roznych typow terenu 
 * Tablica zmeczen przechowuje modyfikatory dla typow terenu.
 */

   return zmeczenie;
}

void
konfiguruj(int numer_lokacji)
{
 int a;
 string *tablica;
 tablica=(MAPER)->zwroc_wyjscia(numer_lokacji);

  // write("Numer : "+numer_lokacji+"\n");
  // Wywalalo numer lokacji przy jej ladowaniu...

 for(a=0;a<8;a++)
    {
     switch(a)
       {
          case 0 : if(tablica[a]!="0") add_exit(RPATH + tablica[a],"polnocny-zachod",0,"@@go");
                   break;
          case 1 : if(tablica[a]!="0") add_exit(RPATH + tablica[a],"polnoc",0,"@@go");
                   break;
          case 2 : if(tablica[a]!="0") add_exit(RPATH + tablica[a],"polnocny-wschod",0,"@@go");
                   break;
          case 3 : if(tablica[a]!="0") add_exit(RPATH + tablica[a],"wschod",0,"@@go");
                   break;
          case 4 : if(tablica[a]!="0") add_exit(RPATH + tablica[a],"poludniowy-wschod",0,"@@go");
                   break;
          case 5 : if(tablica[a]!="0") add_exit(RPATH + tablica[a],"poludnie",0,"@@go");
                   break;
          case 6 : if(tablica[a]!="0") add_exit(RPATH + tablica[a],"poludniowy-zachod",0,"@@go");
                   break;
          case 7 : if(tablica[a]!="0") add_exit(RPATH + tablica[a],"zachod",0,"@@go");
                   break;
        }
     } 
}

int
zwroc_numer_lokacji()
{
    string *tablica;
    string plik;

    tablica=explode(file_name(),"/");

    plik=tablica[sizeof(tablica)-1];

    return atoi(plik[1..]);
}

void
create_rownina()
{
} 

string
przerob(string napis1,object dla_kogo)
{
  string napis2="";
  string opcja1="", opcja2="";
  int a, b=0 ,dlug;
 
   // @@item_rasowy|"+elfi+"|"+inny+"@@ 
   
  dlug=strlen(napis1); 
  for(a=0;a<dlug;a++)
      {
         if(napis1[a]=='[') 
          {
           b=a+1;
           while(napis1[b]!='/')
               {
                   opcja1=opcja1+sprintf("%c",napis1[b]);
                   b++;
               }
           b++;
           while(napis1[b]!=']')
               {
                   opcja2=opcja2+sprintf("%c",napis1[b]);
                   b++;
               }
           a=b;
           napis2=napis2+dla_kogo->koncowka(opcja1,opcja2);
          }
         else napis2=napis2+sprintf("%c",napis1[a]);
         opcja1="";
         opcja2="";
      }
  
  return napis2;
}

string
dlugi_opis()
{
  return (opis_pogody() + " " + przerob(opis_tej_lokacji,this_player()) + "\b.\n"); // UWAGA ! Na koncu opisow nie powinno byc \n, za to MUSI byc spacja !
}

void
create_imperium_room()
{   

    set_short("Pustkowia Chaosu");
    set_long("@@dlugi_opis");

    add_prop(ROOM_I_INSIDE, 0); 
    add_prop(ROOM_I_LIGHT, 1); 
 
    set_event_time(50.0, 200.0); 

    add_event("Z ciemnosci dobiega cie cichy szelest.\n",2);
     
    set_events_on(1);

    konfiguruj(zwroc_numer_lokacji());
    
    create_rownina();

//    (MAPER)->dodaj_podroznika(PATH + "npc/zielarz.c");

    reset_imperium_room();
} 

int
mapka(string str="")
{
  write((MAPER)->wyswietl_mape());
  return 1;
}

int
init()
{
  ::init();
  
  if (this_player()->query_wiz_level())
    {
     add_action(mapka,"mapka");
    }
    
  if(query_typ_terenu()==9) init_drink_water();                 /* Dodaje komende 'napij sie'. */
}

int
czy_jestes()
{
    return 1;
}

public int
unq_no_move_wycofane_na_razie(string str)
{ 
   switch(query_verb())
     {
       case "polnoc":
       case "poludnie":
       case "zachod":
       case "wschod":
       case "polnocny-wschod":
       case "polnocny-zachod":
       case "poludniowy-wschod":
       case "poludniowy-zachod": 
           if (member_array(query_verb(), DEF_DIRS) != -1)
             notify_fail("Ruszasz razno na " + 
                query_verb() + ", lecz geste krzaki zatrzymuja cie.\n");
           break;
       
       default:
           if (member_array(query_verb(), DEF_DIRS) != -1)
             notify_fail("Nie widzisz zadnego wyjscia prowadzacego na " + 
                (query_verb() == "gora" ? "gore" : query_verb()) + ".\n");
           break;
     }
    return 0;
}

void
enter_inv_wycofane(object ob, object from)
{
  ::enter_inv(ob,from);
  if(ob->query_race() == "elf" || ob->query_race() == "elfka")
    return;
  ob->add_panic(5);
  return;
}