/*
 * To jest taki moj maly pomysl pod tytulem 
 * Charity.c bo nie wiem na razie jak to sie 
 * bedzie nazywac.
 * To jest obiekt ktory ma za zadanie zawierac
 * w sobie bron i zbroje ktore zechca tu
 * wrzucic gracze. Cos na ksztalt charity box.
 * Tyle ze za umieszczanie tu rzeczy dostaje sie
 * malutki bonusik w doswiadczeniu a wyjmowac
 * mozna tylko 1 sztuke broni i 1 sztuke zbroi.
 *
 * Created by Silvy - start 12.03.97
 * Last Update - 6.01.98
 *
 */
 
inherit "/std/container";

#include <stdproperties.h>
#include <macros.h>
#include <silvy.h>
#include "local.h"

#define GRACZ_WZIAL_BRON   "_gracz_wzial_bron_z_urny"
#define GRACZ_WZIAL_ZBROJE  "_gracz_wzial_zbroje_z_urny"
#define OBJ_I_WZIETY_Z_URNY    "_obj_i_wziety_z_urny"

#define U_GRACZ 0
#define U_OFIARA 1


private mixed pamiec = ({ ({}), ({}) });

void ofiara(object cos, object ktos);
void reset_urny();

private static object w1,w2,w3,a1,a2,a3;

void
create_container()
{
    ustaw_nazwe(({"urna","urny","urnie","urne","urna","urnie"}),
        ({"urny","urn","urnom","urny","urnami","urnach"}),PL_ZENSKI);        
    dodaj_przym("ofiarny","ofiarni");
    ustaw_shorty(({"urna ofiarna","urny ofiarnej","urnie ofiarnej","urne ofiarna",
        "urna ofiarna","urnie ofiarnej"}),
        ({"urny ofiarne","urn ofiarnych","urnom ofiarnym","urny ofiarne",
        "urnami ofiarnymi","urnach ofiarnych"}),PL_ZENSKI);
    set_long("Wielka, wmurowana w podloge urna jest dominujacym elementem " +
        "tego pomieszczenia. Wykonana z blyszczacej miedzi, ma ksztalt " +
        "sredniej wielkosci termy. Bez trudu mozesz siegnac do srodka.\n");
    
    add_prop(CONT_I_WEIGHT, 1000000);
    add_prop(CONT_I_MAX_WEIGHT, 100000000);
    add_prop(CONT_I_MAX_VOLUME, 100000000);
    add_prop(CONT_I_VOLUME, 1000000);
    add_prop(CONT_I_RIGID, 1);
    add_prop(OBJ_M_NO_GET, "Jak ty to sobie wyobrazasz? \n");

//    set_alarm(1.0,1800.0,"reset_urny");
    enable_reset();
    
    if (file_size(LPATH + "urna.o")>0)
    {
      pamiec = restore_map(LPATH + "urna")["pamiec"];
      rm (LPATH + "urna.o");
    }
    reset_urny();
}

int
prevent_enter(object ob)
{
    object wlasc;
    string name = ((wlasc = environment(ob))?
      (wlasc->query_real_name()):"");
    int i = (wlasc?member_array(name, pamiec[U_GRACZ]):-1);
    
    

    if ((!function_exists("create_armour", ob)) && 
        (!function_exists("create_weapon",ob)))    
    {
        tell_room(environment(this_object()),
           "Kaplan mowi: Jeno bron lub zbroje umiescic tam mozesz!\n",
            wlasc);
        wlasc->catch_msg("Probujesz wlozyc " + ob->short(wlasc, PL_BIE) +
            " do urny, lecz kaplan broni ci don dostepu, mowiac: " +
            "Jeno bron lub zbroje umiescic tam mozesz!\n");
        
        return 1;
    }
    
    if(ob->query_prop(OBJ_I_BROKEN))
    {
        tell_room(environment(this_object()), 
            "Kaplan mowi: Zamierzasz okpic Sigmara ?!\n", wlasc);
        wlasc->catch_msg("Probujesz wlozyc " + ob->short(wlasc, PL_BIE) +
            " do urny, lecz kaplan broni ci don dostepu, mowiac: " +
            "Zamierzasz okpic Sigmara ?!\n");
        return 1;
    }
    
    if(ob->query_prop(OBJ_I_WZIETY_Z_URNY))
    {
        tell_room(environment(this_object()),
            "Kaplan mowi: Odnoszac co wzi"+wlasc->koncowka("ales","elas")+
            " lub inni wzieli, wlasciwie czynisz!\n");
        return 0;
    }        
    
    if(!wlasc) return 0;
    if (i!=-1)
      if ((pamiec[U_OFIARA][i]--)<=0)
      {
        pamiec[U_OFIARA]=exclude_array(pamiec[U_OFIARA],i,i);
        pamiec[U_GRACZ]=exclude_array(pamiec[U_GRACZ],i,i);
      }
    ofiara(ob, wlasc);
    
    return 0;
}

int
prevent_leave(object ob)
{
    object wlasc;
    int index = member_array((wlasc = this_player())->query_real_name(),
        pamiec[U_GRACZ]);
    string w=function_exists("create_weapon",ob);
    string t = function_exists("create_armour",ob);

    if ((w||t)&&(index==-1))
    {
      pamiec[U_GRACZ] += ({wlasc->query_real_name()});
      index = sizeof(pamiec[U_GRACZ]) -1;
      pamiec[U_OFIARA] += ({1});
    }
    
    if(w)
    {   
        if(pamiec[U_OFIARA][index]>2)
        {
            tell_room(environment(TO),"Kaplan krzywi sie i kiwa glowa mowiac: " +
                "Ostaw to w spokoju! Sigmar nie lubi pazernych!\n",wlasc);
            wlasc->catch_msg("Probujesz wziac " + ob->short(wlasc, PL_BIE) +
            " z urny, lecz kaplan krzywi sie i kiwa glowa mowiac: " +
                "Ostaw to w spokoju! Sigmar nie lubi pazernych!\n");
            if ((pamiec[U_OFIARA][index]++)>100)
              pamiec[U_OFIARA][index] = 100; // dokladnie, nie lubi pazernych
            return 1;
        }

        
        ob->add_prop(OBJ_I_WZIETY_Z_URNY, 1);
        pamiec[U_OFIARA][index]++;
        
        return 0;
        
    }    
    
    if(t) 
    {
        if(pamiec[U_OFIARA][index]>2)
        {
            tell_room(environment(TO),"Kaplan krzywi sie i kiwa glowa mowiac: " +
                "Ostaw to w spokoju! Sigmar nie lubi pazernych!\n",wlasc);
            wlasc->catch_msg("Probujesz wziac " + ob->short(wlasc, PL_BIE) +
            " z urny, lecz kaplan krzywi sie i kiwa glowa mowiac: " +
                "Ostaw to w spokoju! Sigmar nie lubi pazernych!\n");
            if ((pamiec[U_OFIARA][index]++)>100)
              pamiec[U_OFIARA][index] = 100;
            return 1;
        }     

        pamiec[U_OFIARA][index]++;
        ob->add_prop(OBJ_I_WZIETY_Z_URNY, 1);
        
        return 0;
    }
    return 0;    
}
    
void
ofiara(object cos, object ktos)
{
        tell_room(environment(ktos),"Kaplan kiwa glowa z aprobata.\n");
        ktos->catch_msg("Czujesz ze twoja ofiara nie pozostala niezauwazona " +
            "przez Bogow, a twe doswiadczenie wzroslo nieznacznie.\n");
        ktos->add_exp(10 + random(10), 1);
}

void
reset_urny()
{
    seteuid(getuid());
    
    if(!a1 || !(E(a1) == this_object()))
    {
        a1 = clone_object(NPATH + "bronie/toporrdza.c");
        a1 -> move(this_object());
    }
    if(!a2 || !(E(a2) == this_object()))
    {
        a2 = clone_object(NPATH + "bronie/mieczrdza.c");
        a2 -> move(this_object());
    }
    if(!a3 || !(E(a3) == this_object()))
    {
        a3 = clone_object(NPATH + "bronie/sztyletrdza.c");
        a3 -> move(this_object());
    }
    if(!w1 || !(E(w1) == this_object()))
    {
        w1 = clone_object(NPATH + "zbroje/kolczugardza.c");
        w1 -> move(this_object());
    }
    if(!w2 || !(E(w2) == this_object()))
    {
        w2 = clone_object(NPATH + "zbroje/tarczardza.c");
        w2 -> move(this_object());
    }
    if(!w3 || !(E(w3) == this_object()))
    {
        w3 = clone_object(NPATH + "zbroje/helmrdza.c");
        w3 -> move(this_object());
    }
    set_alarm(0.2,0.0,"zlamasy_won");
}    
    
void
zlamasy_won()
{
    if(a1->query_prop(OBJ_I_BROKEN)) a1->remove_object();
    if(a2->query_prop(OBJ_I_BROKEN)) a2->remove_object();
    if(a3->query_prop(OBJ_I_BROKEN)) a3->remove_object();
    if(w1->query_prop(OBJ_I_BROKEN)) w1->remove_object();
    if(w2->query_prop(OBJ_I_BROKEN)) w2->remove_object();
    if(w3->query_prop(OBJ_I_BROKEN)) w3->remove_object();
}


void
reset_container()
{
  reset_urny();
}


int
remove_object()
{
  if (sizeof(pamiec[U_GRACZ]))
    save_map( (["pamiec" : pamiec ]), LPATH + "urna");
  return ::remove_object();
}
