/*
 *  Standardowa lokacja domeny Imperium.
 *
 *  /d/Imperium/std/room.c
 */

#pragma strict_types
#pragma save_binary

inherit "/std/room";

#include "/d/Imperium/std/room/czas.h"
#include "/d/Imperium/std/room/event.h"

#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 = "";
private static mapping for_read = ([]);

#define VOID "/d/Imperium/obj/void"

/* Prototypy */
public mixed *query_npce();
static void add_read_item(mixed item, string its_long);

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");
  
  add_prop(ROOM_I_HIDE, 50);
}

public nomask void
create_room()
{
  /* W tej chwili reset jest odpalony. Jesli nie jest redefiniowana
     funkcja reset_imperium_room(), reset nie jest potrzebny, chyba
     ze patrz nizej... */
    if (function_exists("reset_imperium_room",
			this_object()) == "/d/Imperium/std/room")
      enable_reset(0);

    add_prop(ROOM_I_HIDE, 20);
    create_imperium_room();
    this_object()->poprawka_do_room();

    if (!query_prop(ROOM_I_INSIDE) &&
        query_prop(ROOM_I_TYPE) != ROOM_UNDER_WATER)
      add_item("niebo", "@@obejrzyj_niebo");

    /* Jesli bedzie to potrzebne (do npcow), odpalamy reset. Ewentualnym
       resetem ziolek zajmie sie sam /std/room. */
    if (sizeof(query_npce()[1]))
      enable_reset();
}

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]);
	pom->szykuj();
	if (sizeof(kiedy))
	  {
	    pom->ustaw_czas_wystepowania(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);

  if (pom)
    {
      if (klonowac)
        {
	  npce+=({pom});
	  s_npce+=({sciezka});
	  k_npce+=({kiedy});
        }
        
      pom->szykuj();
        
      if (sizeof(kiedy))
        {
          pom->ustaw_czas_wystepowania(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");
  
  if (sizeof(m_indexes(for_read)))
    add_action("do_read","przeczytaj");
}

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;
}

public int
prevent_enter(object ob)
{
    if (blokada_lokacji && interactive(ob) && !(ob->query_wiz_level()))
    {
        tell_object(ob, kto_blokowal + " przeprowadza prace remontowe, "
          + "w zwiazku z czym lokacja jest chwilowo niedostepna.\n");
        return 1;
    }
    return 0;
}

static void
add_read_item(mixed item, string its_long)
{
   if (query_prop(ROOM_I_NO_EXTRA_ITEM)) return;
   
   if (!pointerp(item)) item=({item});
   
   for_read[item]=its_long;
}

string
query_read_desc(string item)
{
   mixed pom=m_indexes(for_read);
   int i;
   
   for (i=0;i<sizeof(pom);i++)
       {
          if (member_array(item,pom[i])+1) return check_call(for_read[pom[i]]);
       }
   return 0;
}

nomask int
do_read(string str)
{
   string pom=query_read_desc(str);
   
   if (stringp(pom))
      {
         write(pom);
         return 1;
      }
   notify_fail("Przeczytaj co?\n");
   
   return 0;
}
