/* obiekt zegara napisany przez:
 * Sir Elvarona zbojcerza z Krainy Zgromadzenia
 */


inherit "/std/object";

#include <macros.h>
#include "/d/Imperium/sys/alarm.h"



#define PSWIT 0
#define PWRANEK 1
#define PRANEK 2
#define PPOLUDNIE 3
#define PPOPOLUDNIE 4
#define PWIECZOR 5
#define PPWIECZOR 6
#define PPOLNOC 7
#define PNOC 8
#define PPNOC 9


mixed t_pora_dnia = ({});

void dodaj_obiekt(mixed path, int znacznik);

public void
create_zegar()
{
  /*
    * zegar wywoluje w obiektach funkcje czas przy zmianie por dnia.
    * w obiekcie musi byc zdefiniowana funkcja:
    *   void czas(string str) { }
    * obiekt zegara jako parametr funkcji podaje stringa okreslajacego pore dnia
    * aby w obiekcie byla wywolywana funkcja czas naezy go tutaj dodac funkcja:
    *   dodaj_obiekt(obiekt,wrano,rano,poludnie,popoludnie,wieczor,noc);
    *      obiekt - sciezka do obiektu.
    *      pozostale flagi do wywolywania-> jezeli ktoras z nich zostanie
    *      ustawiona na 1 to przy zmianie na ta pore obiekcie bedzie
    *      wywolywana funkcja czas .
    * btw zegar moze wywolywac nastepny zegar.
    */
}


nomask void
create_object()
{
   int i;
   
   t_pora_dnia = allocate(10);
   for (i=0; i < 10; i++)
     t_pora_dnia[i] = ({});
   
   create_zegar();
}

void lista()
{
/*
 set_this_player(find_player("elvaron"));
 dump_array(anoc);
 dump_array(awczesny_ranek);
 dump_array(aranek);
 dump_array(apoludnie);  
 dump_array(apopoludnie);
 dump_array(awieczor);
 */
 dump_array(t_pora_dnia);
} 


void ping(object ob, string pora)
{

    int b = 0;
    object *clony=({});
    object obiekt = ob;
    
    
    clony = object_clones(obiekt);
    if (!sizeof(clony))
      clony += ({obiekt});
 
    while(b < sizeof(clony))
    {
        clony[b]->czas(pora);
        b++;
    }


}

void
czas(string str)
{
  mapping tmp = ([	"swit"		: PSWIT,
  			"ranek"		: PRANEK,
  			"wczesny ranek" : PWRANEK,
  			"poludnie"	: PPOLUDNIE,
  			"popoludnie"	: PPOPOLUDNIE,
  			"wieczor"	: PWIECZOR,
  			"pozny wieczor" : PPWIECZOR,
  			"polnoc"	: PPOLNOC,
  			"noc"		: PNOC,	
  			"poza noc"	: PPNOC,	]);
  			
  			
 mixed *pom = t_pora_dnia[tmp[str]];
 int i = 0, il = sizeof(pom);
 
 while (i < il)
 {
   ping (pom[i], str);
   i++;
 }

    log_file("alarm", ctime(time()) + ": to[" + sprintf("%O",this_object())
           + "], przez[" + sprintf("%O",previous_object()) + "], pora = "
           + str + "\n");
        
          
}


void dodaj_obiekt(mixed path, int znacznik)
 { 
   int *tmp = ({ A_SWIT, A_RANEK, A_WCZRANEK, A_POLUDNIE, 
   		 A_POPOLUDNIE, A_WIECZOR, A_PWIECZOR, A_POLNOC, A_NOC, 
   		 A_PNOC });
   int il = sizeof(tmp);
   mixed str;
   object ob;
   
     setuid();
     seteuid(getuid());
     
     
     //     path->zaladuj_sie();
     if (!objectp(path))
     {
       if (!(ob=find_object(path)))
       {
         
         if ((str=LOAD_ERR(path)))
         {
           log_file("BAD_OB_PING", ctime(time()) + ": " + path + "\n");
           throw(str);
         }
         ob = find_object(path);
       }
    }
    else ob = path;

   
    while (--il>=0)
      if (znacznik & tmp[il])
        t_pora_dnia[il] += ({ ob });

    log_file("alarm", ctime(time()) + ": dodanie ob ="+
       sprintf("%O\n",path));
 } 


void
usun_obiekt(mixed path)
{
  int ok =0;
  int il = sizeof(t_pora_dnia);
  
  if (!path)
    return ;
    
  while (--il>=0)
    if (-1!=member_array(path, t_pora_dnia[il]))
    {
      t_pora_dnia[il] -= ({ path  });
      ok = 1;
      
    }
  if (ok)
    log_file("alarm",ctime(time()) + ": usuniecie ob ="+
        sprintf("%O",path)+"\n");
}
