/*
* Obiekt zajmuje sie obsluga mapy.
* by Tanis - wrzesien 1998
*
*  Na podstawie mapera wlasnej roboty z Loren :-)
*
* Opis :
*  Obiekt korzysta z pliku maper.h, w ktorym zdefiniowana
*   jest mapa i parametry konfiguracyjne.
*  Zajmuje sie obsluga mapy zwracajac odpowiednie wyjscia dla lokacji.
*  W stosunku do Loren "obcieto" losowe przejscia.
*  Dodano - przeszukiwanie mapy tak, aby lokacja mogla podawac 
*   nie swoje wspolrzedne, lecz swoj numer.
*
* Legenda mapy:
*   -/\|X - wyjscia
*       n - wyjscia brak
*  numery - numery lokacji
*       p - puste miejsce
*
* Funkcje :
*    wyswietl_mape - wyswietla aktualna mape ( tez do wywolywania z zewnatrz )
*    wczytaj_mape - wczytuje wyjscia dla danych wspolrzednych i zwraca je w postaci nazw lokacji.
*    czy_jestes - zwraca 1 ( do sprawdzania, cyz ten obiekt juz zostal zaladowany czy tez nie :)
*
*/

#include "tanis.h"
inherit "/std/object.c";

#include "maper.h"

string *jakich_dodalem=({});
int ile_dodalem_band=0;

int *znajdz_wspolrzedne(int numer_lokacji)
{
  int x,y;
  
  for(y=0;y<sizeof(mapa);y++)
     for(x=0;x<sizeof(mapa[y]);x++)
         if(mapa[y][x]==""+numer_lokacji) return ({x,y});
  return ({-1,-1});
}

string *zwroc_liste_plikow()
{
  int x,y;
  string *tablica=({});
  string s;
  
  for(y=0;y<sizeof(mapa);y++)
     for(x=0;x<sizeof(mapa[y]);x++)
        {
           s=mapa[y][x];
           
           if(s!="n" && s!="p" && s!="|" && s!="/" && s!="-" && s!="\\" && s!="X") tablica+=({s});
        }
        
  return tablica;
}

string
*konwertuj(string *tabliczka,int x, int y)
{
 int a;
 string s;

 for(a=0;a<8;a++)
    {
     s=tabliczka[a];

     switch(a)
       {
         case 0 : if(s=="\\" || s=="X") tabliczka[a] = mapa[y-2][x-2];
                  else tabliczka[a]="0";
                  break;
         case 1 : if(s=="|") tabliczka[a] = mapa[y-2][x];
                  else tabliczka[a]="0";
                  break;
         case 2 : if(s=="/" || s=="X") tabliczka[a] = mapa[y-2][x+2];
                  else tabliczka[a]="0";
                  break;
         case 3 : if(s=="-") tabliczka[a] = mapa[y][x+2];
                  else tabliczka[a]="0";
                  break;
         case 4 : if(s=="\\" || s=="X") tabliczka[a] = mapa[y+2][x+2];
                  else tabliczka[a]="0";
                  break;
         case 5 : if(s=="|") tabliczka[a] = mapa[y+2][x];
                  else tabliczka[a]="0";
                  break;
         case 6 : if(s=="/" || s=="X") tabliczka[a] = mapa[y+2][x-2];
                  else tabliczka[a]="0";
                  break;
         case 7 : if(s=="-") tabliczka[a] = mapa[y][x-2];
                  else tabliczka[a]="0";
                  break;
       }
     }

   for(a=0;a<8;a++)
       {
         s=tabliczka[a];

         if(s=="p" || s=="0") tabliczka[a]="0";
         else tabliczka[a]= POCZATEK + s + ".c";
       }

return tabliczka;
}


string
*wczytaj_mape(int x, int y)
{
  int a;

  string *tablica_wyjsc=allocate(8);

  for(a=0;a<8;a++)
      {
        switch(a)
            {
                case 0 : if((x-1) < 0 || (y-1) < 0) tablica_wyjsc[a] = "E";
                         else tablica_wyjsc[a] = mapa[y-1][x-1];
                         break;
                case 1 : if( (y-1) < 0 ) tablica_wyjsc[a] = "E";
                         else tablica_wyjsc[a] = mapa[y-1][x];
                         break;
                case 2 : if( (y-1) < 0 || (x+1) > sizeof(mapa[0]) ) tablica_wyjsc[a] = "E";
                         else tablica_wyjsc[a] = mapa[y-1][x+1];
                         break;
                case 3 : if( (x+1) > sizeof(mapa[0]) ) tablica_wyjsc[a] = "E";
                         else tablica_wyjsc[a] = mapa[y][x+1];
                         break;
                case 4 : if( (y+1) > sizeof(mapa) || (x+1) > sizeof(mapa[0]) ) tablica_wyjsc[a] = "E";
                         else tablica_wyjsc[a] = mapa[y+1][x+1];
                         break;
                case 5 : if( (y+1) > sizeof(mapa) ) tablica_wyjsc[a] = "E";
                         else tablica_wyjsc[a] = mapa[y+1][x];
                         break;
                case 6 : if( (y+1) > sizeof(mapa) || (x-1) < 0) tablica_wyjsc[a] = "E";
                         else tablica_wyjsc[a] = mapa[y+1][x-1];
                         break;
                case 7 : if( (x-1) < 0 ) tablica_wyjsc[a] = "E";
                         else tablica_wyjsc[a] = mapa[y][x-1];
                         break;
                default : return 0;
            }
       }

return konwertuj(tablica_wyjsc,x,y);
}

string
*zwroc_wyjscia(int numer_lokacji)
{
   int a,b;
   int x,y;
   int *wspolrzedne;
   string *tablica_wyjsc=allocate(8);

   wspolrzedne=znajdz_wspolrzedne(numer_lokacji);

   x=wspolrzedne[0];
   y=wspolrzedne[1];      

   if(x==-1 || y==-1)
     {
         write("Podany numer lokacji nie istnieje na mapie !\n");
         return tablica_wyjsc;
     }
  

   return wczytaj_mape(x,y);
}

void
dodaj_bande(string sciezka)
{
  int a,b,i;
  string *lista=zwroc_liste_plikow();
  object banda;
  
  seteuid(getuid());

  ile_dodalem_band++;

  i = random(MAX_LICZBA_BAND + 1); // Moze tez byc 0, jesli MIN_LICZBA_BAND to dopusci...

  if(i < MIN_LICZBA_BAND) i=MIN_LICZBA_BAND;

  if(ile_dodalem_band > i) return;

  b=random(sizeof(lista)) + 1;
  
  banda =  clone_object(sciezka);
  banda -> move(RPATH + POCZATEK + lista[b] + ".c");
  banda -> uruchom_bande(); // Nie mam pojecia, jak to ma dzialac...
}

void
dodaj_podroznika(string kto)
{
  int a,b;
  string *lista=zwroc_liste_plikow();
  
  seteuid(getuid());

  for(a=0;a<sizeof(jakich_dodalem);a++)
     {
        if(jakich_dodalem[a]==kto) return;
     }

  jakich_dodalem=jakich_dodalem + ({kto});

  b=random(sizeof(lista)) + 1;
  
  (RPATH + POCZATEK + lista[b] + ".c")->dodaj_npca(kto);
} 

int
czy_jestes()
{
    return 1;
}

string
wyswietl_mape()
{
 int a,b,c,max=0;
 string s,mapka="\n\n      MAPA PUSTKOWI CHAOSU\n\n";

 for(a=0;a<sizeof(mapa);a++)
    {
     for(b=0;b<sizeof(mapa[0]);b++)
        {
         if(strlen(mapa[a][b])>max) max = strlen(mapa[a][b]);
        }
    }

 for(a=0;a<sizeof(mapa);a++)
    {
     for(b=0;b<sizeof(mapa[0]);b++)
        {
         if(mapa[a][b] != "n" && mapa[a][b] != "p") s=mapa[a][b];
         else s=" ";
         if(strlen(s)<max) for(c=0;c<(max-strlen(s));c++)
                                      {
                                        mapka=mapka+" ";
                                      }
         mapka=mapka+s;
        }
     mapka=mapka+"\n";
    }
 mapka=mapka+"\n";
 return mapka;
}