/* obiekt zegara napisany przez:
 * Sir Elvarona zbojcerza z Krainy Zgromadzenia
 *
 * Proby naprawy by Silvy
 * 1.03.98
 * Zobaczymy czy mi sie uda 
 */


inherit "/std/object";

#include "/d/Imperium/sys/alarm.h"

#define OB_NA_TURE	10 /* Ile obiektow zostaje powiadomionych na ture. */

object *obiekty_do_wywolania = ({});
object *obiekty_dzien_noc = ({});

void dodaj_obiekt(object obiekt);

void
create_zegar()
{
}

nomask void
create_object()
{
   create_zegar();
}

mixed
query_obiekty()
{
    return ({obiekty_do_wywolania,obiekty_dzien_noc});
} 

/*
 * Powiadamia podane obiekty o zmianie czasu na str.
 */
public void
powiadom_obiekty(object *obiekty, string str)
{
    int i;
    
    i = sizeof(obiekty);
    while (--i >= 0)
        obiekty[i]->czas(str);
}

void
czas(string str)
{
    int i = sizeof(obiekty_do_wywolania);
    int j = sizeof(obiekty_dzien_noc);
    object *obiekty;
    
    float opoznienie = 0.5;

    while(--i > 0) // Przelatuje przez tablice i usuwa elemnty == 0
    {
        if (!obiekty_do_wywolania[i])
            obiekty_do_wywolania = exclude_array(obiekty_do_wywolania, i, i);
    }
    
    obiekty = obiekty_do_wywolania + ({});
    
    if((str == "ranek") || (str == "pozny wieczor"))
    {
        while(--j > 0) // Przelatuje i usuwa elementy == 0
        {
            if (!obiekty_dzien_noc[j])
                obiekty_dzien_noc = exclude_array(obiekty_dzien_noc, j, j);
        }
        obiekty += obiekty_dzien_noc;
    }
    
    // Tablica obiekty zawiera liste obiektow do wywolania w nich funkcji
    // czas().
    
    i = sizeof(obiekty);
    while(i >= 0) 
    {
    /* Powiadamiamy obiekty turami, co 0.5 sekundy. Wywolujemy
     * funkcje powiadom_obiekty(), przekazujac jej kolejne tury obiektow.
     */
    
        set_alarm(opoznienie, 0.0, &powiadom_obiekty(
            obiekty[(i >= OB_NA_TURE ? (i - OB_NA_TURE) : 0)..i],
                str));
        i -= OB_NA_TURE;
        opoznienie += 1.0;
    }
}


void
dodaj_obiekt(object ob)
{
    if(ob->query_czy_dni_noce())
    {
        obiekty_dzien_noc += ({ ob });
        return;
    }    
    obiekty_do_wywolania += ({ ob });
}    

void
usun_obiekt(object ob)
{
    int il = sizeof(obiekty_do_wywolania);
    int jl = sizeof(obiekty_dzien_noc);
    
    if(!ob) return;
    
    while(--il >= 0)
    if(obiekty_do_wywolania[il] == ob || obiekty_do_wywolania[il] == 0) 
    {
        exclude_array(obiekty_do_wywolania,il,il);
        return;
    }
    
    while(--jl >= 0)
    if(obiekty_dzien_noc[jl] == ob || obiekty_dzien_noc[jl] == 0) 
    {
        exclude_array(obiekty_dzien_noc,jl,jl);
    }
} 
