/*
 *  Standardowa lokacja domeny Imperium.
 *
 *  /d/Imperium/std/room.c
 */

#pragma strict_types

inherit "/std/room";

#include "/d/Imperium/std/room/czas.c"
#include "/d/Imperium/std/room/event.c"

#include <macros.h>
#include <stdproperties.h>

private static object *npce = ({});
private static string *s_npce= ({});
private static mixed *k_npce = ({});
private static int klonowac = 1;
private static int blokada_lokacji = 0;
private static string kto_blokowal = "";

#define VOID "/d/Imperium/obj/void"

public void
create_imperium_room()
{
    set_short("Standardowa lokacja Imperium");
    set_long("Standardowa lokacja Imperium. Aby zdefiniowac wlasna lokacje, "
           + "powinienes zamaskowac funkcje create_imperium_room.\n");
}


public nomask void
create_room()
{
    create_imperium_room();

    if (!query_prop(ROOM_I_INSIDE) &&
        query_prop(ROOM_I_TYPE) != ROOM_UNDER_WATER)
        add_item("niebo", "@@obejrzyj_niebo");
}

void
reset_npc()
{
    int kon = sizeof(npce);
    string tmp;
    object pom;
    mixed kiedy;

    while (--kon >= 0)
        if (!npce[kon])
        {
            kiedy = k_npce[kon];
            pom = clone_object(s_npce[kon]);
            tmp = function_exists("pora_znikac", pom);
            if (tmp)
            {
              pom->ustaw_czas_wystepowania(kiedy);
              pom->szykuj();
            }
            if (tmp&&sizeof(kiedy))
            {
              if (!(pom->czy_npc_nie_wystepuje(pora_dnia(), pora_roku())))
                pom->pora_pojawic_sie(pora_dnia(), this_object());
              else
                pom->pora_znikac(pora_dnia(),this_object());
              pom->ustaw_stare_miejsce(this_object());
            }
            else
            {
              pom->move_living("M", this_object());
            }
            npce[kon]=pom;
        }
}


public void
reset_imperium_room()
{
}


public nomask void
reset_room()
{
    reset_npc();
    reset_imperium_room();
}


public void
klonowanie_npcow(int k)
{
    klonowac = k;
}



public object
dodaj_npca(string sciezka, mixed kiedy=({}) )
{
    object pom = clone_object(sciezka);
    string tmp = function_exists("pora_znikac", pom);
    
    if (pom)
    {
        if (klonowac)
        {
            npce+=({pom});
            s_npce+=({sciezka});
            k_npce+=({kiedy});
            if (tmp)
              pom->ustaw_czas_wystepowania(kiedy);
        }
        if (tmp)
          pom->szykuj();
        if (tmp&&sizeof(kiedy))
        {
          if (!(pom->czy_npc_nie_wystepuje(pora_dnia(), pora_roku())))
            pom->pora_pojawic_sie(pora_dnia(), this_object());
          else
            pom->pora_znikac(pora_dnia(),this_object());
          pom->ustaw_stare_miejsce(this_object());
        }
        else
        {
          pom->move_living("M", this_object());
        }
    }
    return pom;
}


public mixed *
query_npce()
{
    return ({npce,s_npce});
}


public void
init()
{
    ::init();

    if (events_on && interactive(this_player()) && !events_running)
    {
        events_running = 1;
        set_alarm(start_time, 0.0, "run_events");
    }
    
    // blokowanie lokacji dla graczy
    add_action("do_blokuj","blokada");
}


int
do_blokuj(string s)
{
  notify_fail("Slucham ?\n");
  if (!(this_player()->query_wiz_level()))
    return 0;
  if (!s||s=="")
  {
    write ("Blokada "+(blokada_lokacji?"aktywna":"nieaktywna")+".\n");
    return 1;
  }
  if ((s!="+")&&(s!="-"))
  {
     notify_fail("Blokada -/+\n");
     return 0;
  }
  if (s=="-")
  {
    write("Blokada zostala zdjeta.\n");
    blokada_lokacji = 0;
    return 1;
  }
  blokada_lokacji = 1;
  kto_blokowal = this_player()->query_name(PL_MIA);
  write("Blokada zalozona.\n");
  return 1;
}


int
remove_object()
{
  npce->remove_object();
  return ::remove_object();
}


public int
prevent_enter(object ob)
{
  int  ok;
  ok =  blokada_lokacji  && !ob->query_wiz_level() && interactive(ob);
  if (ok)
    tell_object(ob,kto_blokowal + " przeprowadza prace remontowe, " +
      "w zwiazku z czym lokacja jest chwilowo niedostepna.\n");
  return ok;
}


int
usun_npca(mixed ob)
{
  int usuniety = 0;
  int index;
  
  if (!(stringp(ob)||objectp(ob)))
    return usuniety;
  
  if (stringp(ob))
    index=member_array(ob, s_npce);
  else
    index = member_array(ob, npce);
  
  if (index!=-1)
  {
    if (npce[index])
    {
      npce[index]->move_living("M",VOID);
      npce[index]->remove_object();
    }
    s_npce = exclude_array(s_npce, index, index);
    npce = exclude_array(npce, index, index);
    k_npce = exclude_array(k_npce, index, index);
    usuniety = 1;
  }
  return usuniety;
}
