/*
 * Obiekt losujacy opisy.
 * by Tanis - listopad 1998
 *
 *                       Tanis
 */

/*
 * 'Srodowisko' pracy /zmienne, parametry ustawiane z zewnatrz/ :
 */
 
private int czy_widac_wyjscia=0; // 0 -widac, 1 - nie widac
private mixed *opisy_terenu_1=({      ({  ({"", ({}) })  })        });
private mixed *opisy_terenu_2=({      ({  ({"", ({}) })  })        });
private int *tablica_zmeczen_dla_roznych_terenow=({0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, });
private int typ_tego_opisu=0;
private string plik_mapera="";
private string sciezka_do_lokacji="";

/*
 * Koniec zmiennych srodowiskowych.
 */
 
private string opis_tej_lokacji_1="";
private string opis_tej_lokacji_2="";

/*
 * Ustawianie sciezki do lokacji (np. dla lokacji /d/Imperium/tanis/lokacje/ulica1.c, ulica2.c itd
 *   bedzie to set_sciezka_do_lokacji("/d/Imperium/tanis/lokacje/");
 */

void
dodaj_specjalne_dla_terenu(int typ_opisu)
{
  // Nic nie robi, ale moze jej nie byc w plikach dziedziczacych i w takim wypadku wole,
  // zeby jednak sie wywolala...
  // A noz by wywalilo blad ? ;-)
}
 
void
set_sciezka_do_lokacji(string odp)
{
   sciezka_do_lokacji=odp;
}

/*
 * Ustawianie, czy gracze widza wyjscia czy nie
 * 0 - widza, 1 - nie widza.
 */

void
set_czy_widac_wyjscia(int odp)
{
   czy_widac_wyjscia=odp;
}

/*
 * Przyjmuje tablice opisami, czesc pierwsza, wprowadzajaca.
 * Szczegoly dotyczace tablicy - w examples/opisy.h
 */

void
set_opisy_lokacji_1(mixed *odp)
{
     opisy_terenu_1=odp;
}

/*
 * Podobna do powyzszej. Przyjmuje druga tablice, juz nie wprowadzajaca.
 */

void
set_opisy_lokacji_2(mixed *odp)
{
     opisy_terenu_2=odp;
}

/*
 * Przyjmuje tablice ze zmeczeniami dla danych typow terenu /danych opisow/
 *  zmeczenie=tablica_zmeczen[numer_opisu].
 */

void
set_tablica_zmeczen(int *odp)
{
    tablica_zmeczen_dla_roznych_terenow=odp;
}

/*
 * Zwraca zmeczenie w zaleznosci od typu terenu, oraz uwzglednia ewentualna 
 *  pogode, inheritowana przez pokoj dziedziczacy ten obiekt.
 */

int
zmeczenie()
{
	int ile;

	ile=tablica_zmeczen_dla_roznych_terenow[typ_tego_opisu] + this_object()->go();

	return ile;
}

/*
 * Przerabia stringi w zaleznosci od plci.
 * Np. : "Doszedl[es/as] do skraju lasu." dla mezczyzny zmieni na "Doszedles do skraju lasu."
 * Moze byc duzo takich [/] w jednym stringu i moga nastepowac zaraz po sobie.
 */

string
przerob(string napis1,object dla_kogo)
{
  string napis2="";
  string opcja1="", opcja2="";
  int a, b=0 ,dlug;
 
  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;
}

/*
 * Usuwa koncowke stringa, jesli to jest spacja albo znak konca linii (\n)
 * Potem funkcja dlugi_opis() sama dba o te znaki.
 */

string
usun_koncowki(string napis1)
{
    string napis2;
    
    if(napis1[(strlen(napis1)-1)]==' ' || napis1[(strlen(napis1)-1)] == '\n') napis2=napis1[0..(strlen(napis1)-1)];
    else napis2=napis1;
    
    return napis2;
}

/*
 * Zwraca opis lokacji, uwzgledniajac ewentualna pogode.
 */

string
dlugi_opis()
{
    string napis;
  
    napis=przerob(usun_koncowki(opis_tej_lokacji_1),this_player());
    
    if((this_object()->opis_pory_roku())!=0)
       napis=napis+przerob(usun_koncowki((this_object()->opis_pory_roku())),this_player()) +" ";
    
    napis=napis+przerob(usun_koncowki(opis_tej_lokacji_2),this_player()) + "\n";
    
    return napis;
}

/*
 * Funkcja dodajaca wyjscia w oparciu o informacje z mapera.
 */

void
konfiguruj_lokacje(int numer_lokacji)
{
 int a;
 string *tablica;
 tablica=(plik_mapera)->konfiguruj_wyjscia(numer_lokacji);

 for(a=0;a<8;a++)
    {
     switch(a)
       {
          case 0 : if(tablica[a]!="0") this_object()->add_exit(sciezka_do_lokacji + tablica[a],"polnocny-zachod",0,"@@zmeczenie",czy_widac_wyjscia);
                   break;
          case 1 : if(tablica[a]!="0") this_object()->add_exit(sciezka_do_lokacji + tablica[a],"polnoc",0,"@@zmeczenie",czy_widac_wyjscia);
                   break;
          case 2 : if(tablica[a]!="0") this_object()->add_exit(sciezka_do_lokacji + tablica[a],"polnocny-wschod",0,"@@zmeczenie",czy_widac_wyjscia);
                   break;
          case 3 : if(tablica[a]!="0") this_object()->add_exit(sciezka_do_lokacji + tablica[a],"wschod",0,"@@zmeczenie",czy_widac_wyjscia);
                   break;
          case 4 : if(tablica[a]!="0") this_object()->add_exit(sciezka_do_lokacji + tablica[a],"poludniowy-wschod",0,"@@zmeczenie",czy_widac_wyjscia);
                   break;
          case 5 : if(tablica[a]!="0") this_object()->add_exit(sciezka_do_lokacji + tablica[a],"poludnie",0,"@@zmeczenie",czy_widac_wyjscia);
                   break;
          case 6 : if(tablica[a]!="0") this_object()->add_exit(sciezka_do_lokacji + tablica[a],"poludniowy-zachod",0,"@@zmeczenie",czy_widac_wyjscia);
                   break;
          case 7 : if(tablica[a]!="0") this_object()->add_exit(sciezka_do_lokacji + tablica[a],"zachod",0,"@@zmeczenie",czy_widac_wyjscia);
                   break;
        }
     } 
}

/*
 * Zwraca numer lokacji dla mapera, w oparciu o nazwe pliku obiektu.
 */
 
int
zwroc_numer_lokacji()
{
    string *tablica;
    string plik;
    int dlugosc_poczatku=0;

    tablica=explode(file_name(),"/");

    plik=tablica[sizeof(tablica)-1];

    dlugosc_poczatku=strlen((plik_mapera)->query_poczatek_nazw_plikow());

    return atoi(plik[dlugosc_poczatku..]);
}

/*
 * Funkcja, przyjmujaca jako argument typ opisu. Ustawia potem losowo opis, 
 *  w zaleznosci od otrzymanego typu.
 */

void
ustaw_typ_opisu(int typ)
{
    int a;
    int los;

    typ_tego_opisu=typ;

	los=random(sizeof(opisy_terenu_1[typ]));
    opis_tej_lokacji_1=opisy_terenu_1[typ][los][0];

    for(a=0;a<sizeof(opisy_terenu_1[typ][los][1]);a=a+2)
        {
             this_object()->add_item(opisy_terenu_1[typ][los][1][a],opisy_terenu_1[typ][los][1][a+1]);
         }
    
	los=random(sizeof(opisy_terenu_2[typ]));
    opis_tej_lokacji_2=opisy_terenu_2[typ][los][0];   
    
    for(a=0;a<sizeof(opisy_terenu_2[typ][los][1]);a=a+2)
        {
             this_object()->add_item(opisy_terenu_2[typ][los][1][a],opisy_terenu_2[typ][los][1][a+1]);
         }

     this_object()->set_long("@@dlugi_opis");
     this_object()->dodaj_specjalne_dla_terenu(typ);
}

/*
 * Funkcja pobierajaca plik mapera, a potem dodajaca wyjscia z lokacji 
 * na podstawie danych z mapera.
 */

void
set_plik_mapera(string odp)
{
	plik_mapera=odp;
	konfiguruj_lokacje(zwroc_numer_lokacji());
}