/*
 * /doc/examples/pojemniki/plecak.c
 *
 * Plecak z zabezpieczeniem przed przypadkowym sprzedaniem.
 *
 * /Mercade, 24 January 1993
 * Mozliwosc dziedziczenia - Olorin
 *
 * Globalne zmiany i przerobienie (zaimki itp.) by Tigr (Sep 1998)
 *
 */

#pragma save_binary
#pragma strict_types

inherit "/std/receptacle";
inherit "/lib/keep";

#include <cmdparse.h>
#include <composite.h>
#include <language.h>
#include <macros.h>
#include <ss_types.h>
#include <stdproperties.h>

#define NO_SELL_VBFC "@@no_sell_vbfc@@"
#define BACKPACK_SUBLOC  "_backpack"
#define TP this_player()
#define TO this_object()
#define ENTO environment(TO)

//	Prototypes
int fillpack(string str);
int emptypack(string str);
string long_description();

//	Global variables
int     worn, keep;
string  fill_verb = "napelnij",
        empty_verb = "oproznij",
        backpack_long;

void    set_fill_verb(string s) { fill_verb = s; }
void    set_empty_verb(string s) { empty_verb = s; }
string  query_backpack_long() { return backpack_long; }
void    set_backpack_long(string s) { backpack_long = s; }
int     query_keep();


void
create_backpack()
{
    ustaw_nazwe(({"plecak", "plecaka", "plecakowi", "plecak", "plecakiem",
                  "plecaku"}),
                ({"plecaki", "plecakow", "plecakami", "plecaki", "plecakami",
                  "plecakach"}), PL_MESKI_NZYW);

    dodaj_przym("zielony", "zieleni");
    dodaj_przym("niewielki", "niewielcy");

    set_backpack_long("Niezbyt duzy plecak, zrobiony z wytrzymalego, zielonego "
                    + "materialu.");
}

void
create_container()
{
    create_backpack();

    set_long("@@long_description");

    set_keep(1);
    add_prop(OBJ_I_VALUE,             200);
    add_prop(CONT_I_CLOSED,             1);
    add_prop(CONT_I_WEIGHT,          2000);
    add_prop(CONT_I_VOLUME,          2500);
    add_prop(CONT_I_MAX_WEIGHT,     50000);
    add_prop(CONT_I_MAX_VOLUME,     50000);
    add_prop(CONT_I_REDUCE_VOLUME,    125);
    remove_prop(CONT_I_RIGID);

}

/*
string
query_sell()
{
   string konc=koncowka("y","a","e")
   if (worn) return capitalize(TO->short(PL_MIA)) + " jest zalozon" + konc +"!\n";
   if (sizeof(all_inventory(TO))) return capitalize(TO->short(PL_MIA)) + " nie jest pust" +konc+"!\n";
   return NO_SELL_VBFC;
}

*/

string
long_description()
{
    string long_desc = query_backpack_long();
    string add_desc;

    if (ENTO!=TP) return long_desc + "\n";
    
    add_desc = " Jesli napiszesz '" + fill_verb 
               + ( (worn)?"":" <co>" ) + "', wlozysz wszystkie "
               + "rzeczy ktorych nie masz na sobie, z wyjatkiem pieniedzy "
               + "i pojemnikow, do " + query_nazwa(PL_DOP) + ". Jesli "
               + "natomiast napiszesz '" + empty_verb 
               + ( (worn)?"":" <co>" )
               + "', wyciagniesz je z "
               + "powrotem.";
    if (query_keep())
    {
        add_desc += " W tej chwili, " + query_nazwa() + " jest pod ochrona, "
                   + " dzieki czemu nie sprzedasz "
                   + koncowka("go", "jej", "go", "ich", "ich") + ", "
                   + "spieniezajac swoje lupy. Napisz <odbezpiecz "
                   + query_nazwa() + "> aby zdjac to zabezpieczenie.";
    }
    else
    {
        add_desc += " Sprzedajac ekwipunek, mozesz tez sprzedac "
                   + query_nazwa()+". Aby sie przed tym uchronic, napisz "
                   + "<zabezpiecz " + query_nazwa() + ">.";
    }

    return long_desc + add_desc + "\n";
}

int
wear_me(object kto)
{
   if (!present(TO, kto))
   {
        notify_fail("Przeciez nie masz " + query_nazwa(PL_DOP) + " !\n");
        return 0;
    }

    if (worn)
    {
        write("Wlasnie masz " + koncowka("go", "ja", "go", "ich", "je")
            + " na plecach.\n");
        return 1;
    }
  
    if (member_array(BACKPACK_SUBLOC, kto->query_sublocs()) > -1)
    { 
       write("Niestety, masz juz na plecach cos innego.\n");
       return 1;
    } 

    kto->add_subloc(BACKPACK_SUBLOC, TO);
    write("Zakladasz na plecy " + short(kto, PL_BIE) + ".\n");
    saybb(QCIMIE(kto, PL_MIA) + " zaklada na plecy " + short(kto, PL_BIE) + ".\n");
    worn = 1;
    move(kto,BACKPACK_SUBLOC);
    return 1;
}


int
czy_to_plecak(object ob)
{
   return ob->query_plecak();
}

int
wear(string str)
{
    mixed plecaki;
    int ret_val;
    
    notify_fail("Zaloz co?\n");
    
    if (!str) return 0;
    
    parse_command(str,TP,"%i:"+PL_BIE,plecaki);
    
    plecaki=NORMAL_ACCESS(plecaki,0,0);
    
    if (!sizeof(plecaki)) return 0;
    
    if (sizeof(plecaki)>1) return 0;
    
    if (TO!=plecaki[0]) return 0;
    
    if (ret_val=(plecaki[0]->wear_me(TP)))
       TP->set_obiekty_zaimkow( ({plecaki[0]}) );
    return ret_val;
    
}

int
remove_me(object kto)
{
    kto->remove_subloc(BACKPACK_SUBLOC);
    kto->catch_msg("Zdejmujesz " + short(kto, PL_BIE)+".\n");
    saybb(QCIMIE(kto,PL_MIA) + " zdejmuje "+short(kto, PL_BIE)+".\n",kto);
    worn = 0;
    move(kto);
    return 1;
}

int
remove(string str)
{
    int ret_val;
    object plecak=TP->query_subloc_obj(BACKPACK_SUBLOC);
    mixed plecaki;
    
    notify_fail("Zdejmij co?\n");
    
    if (!str||!plecak) return 0;
       
    parse_command(str,TP,"%i:"+PL_BIE,plecaki);
    
    plecaki=NORMAL_ACCESS(plecaki,0,0);
    
    if (!sizeof(plecaki)) return 0;
    
    if (sizeof(plecaki)>1) return 0;
    
    if (plecak!=plecaki[0]) return 0;
    
    if (ret_val = (plecak->remove_me(TP)))
       {
          TP->set_obiekty_zaimkow( ({plecak}) );
          return ret_val;
       }
}

void
leave_env(object old, object dest)
{
    if (worn)
       {
         old->remove_subloc(BACKPACK_SUBLOC);
         worn = 0;
         old->catch_msg("Zdejmujesz " + short(PL_BIE) + ".\n");
         saybb(QCIMIE(TP,PL_MIA) + " zdejmuje " + 
                   short(PL_BIE) + ".\n",old);
       }
    ::leave_env(old, dest);
}

public string
show_subloc(string subloc, object on, object for_obj)
{
    string data;

    if (subloc == BACKPACK_SUBLOC)
    {
	if (for_obj != on)
            data = "Nosi na plecach " + short(PL_BIE) + ".\n";
	else
            data = "Nosisz na plecach " + short(PL_BIE) + ".\n";
	return data;
    }
}

mixed
no_sell_vbfc()
{
    if (worn)
       {
         return capitalize(short()) + " jest zalozony!\n";
       }
    if (sizeof(all_inventory(TO)))
    {
        return capitalize(short()) + " nie jest pusty.\n";
    }
    return 0;
}

void
init()
{
    ::init();
    add_action(fillpack, fill_verb);
    add_action(emptypack, empty_verb);
    add_action(wear,"zaloz");
    add_action(remove,"zdejmij");
}

void
set_keep(int keep = 1)
{
    if (keep)
    {
        ::set_keep(keep);
        return;
    }

    add_prop(OBJ_M_NO_SELL, NO_SELL_VBFC);
}

int
query_keep()
{
    return (query_prop_setting(OBJ_M_NO_SELL) != NO_SELL_VBFC);
}

/*
 * Recovery stuff
 */
string
query_recover()
{
    return MASTER + ":" + query_container_recover() + query_keep_recover();
}

void
init_recover(string arg)
{
    init_keep_recover(arg);
    init_container_recover(arg);
}

int
prevent_enter(object ob)
{
/*
   if (living(ob)) 
      {
   	write(capitalize(ob->short(TP,PL_DOP)) + " nie da sie wlozyc do " +query_nazwa(PL_DOP) +"!\n");
   	return 1;
      }
   return ::prevent_enter(ob);
*/
}

int
a_filter(object ob)
{
    if (living(ob)) return 0;
    if (ob->query_prop(OBJ_I_INVIS)) return 0;
    if (function_exists("create_skora",ob)!=0) return 1; 
                                              /* skory mozna wlozyc */
    if (!(ob->query_prop(OBJ_I_VALUE))) return 0;
    if (ob->query_prop(OBJ_M_NO_SELL)) return 0;
    if (function_exists("create_torch",ob)!=0) return 0;
    if (ob->query_prop(OBJ_M_NO_GIVE)) return 0;
    if (ob->query_prop(OBJ_M_NO_DROP)) return 0;
    if (ob->query_prop(CONT_I_IN)) return 0;   /*containers*/
    if (ob->query_worn()) return 0;
    if (ob->query_wielded()) return 0;
    if (function_exists("create_beczulka",ob)) return 0;
    if (ob->query_prop(LIVE_I_IS)) return 0;
    if (ob->query_prop(OBJ_I_HAS_FIRE)) return 0;  /* eg a torch */
    return 1;
}

int
fill_me(object kto)
{
  object   *conts = ({}),
           *moved = ({});
  int x;
    
    if (TO->query_prop(CONT_I_CLOSED))
       {
         kto->catch_msg("Moze pojdzie ci latwiej, jesli najpierw otworzysz " +
          query_nazwa(PL_BIE) + "?\n");
         return 1;
       }
    
    conts = filter(all_inventory(kto), "a_filter", TO);
    for (x = 0; x < sizeof(conts); x++)  
    {
        conts[x]->move(TO); 
        if (present(conts[x], TO))  
        {
            moved += ({ conts[x] }) ;   /*successful move */
        }
    }   
    
    if (!sizeof(moved))
        {
           kto->catch_msg("Nie chowasz nic do "+query_nazwa(PL_DOP)+".\n");
           return 1;
        }
    else 
    {
        kto->catch_msg("Chowasz " + COMPOSITE_DEAD(moved, PL_BIE) + 
                                " do "+short(PL_DOP)+".\n");
        saybb(QCIMIE(kto,PL_MIA) + " chowa " + 
            COMPOSITE_DEAD(moved, PL_BIE) + " do "+short(PL_DOP)+".\n",kto);
    }
    return 1;
}

int
fillpack(string str)
{
    mixed plecaki;
    int ret_val;
    
    notify_fail(capitalize(fill_verb) + " co?\n");
    
    if (!strlen(str))
          return (TP->query_subloc_obj(BACKPACK_SUBLOC))->fill_me(TP);
       
    parse_command(str,TP,"%i:"+PL_BIE,plecaki);
    plecaki=NORMAL_ACCESS(plecaki,"czy_to_plecak",TO);
    
    if (!sizeof(plecaki)) return 0;
    
    if (sizeof(plecaki)>1) return 0;
    
    if(TO!=plecaki[0]) return 0;
    
    if (ret_val=(plecaki[0]->fill_me(TP)))
       TP->set_obiekty_zaimkow( ({plecaki[0]}) );
    return ret_val;
}

int
empty_me(object kto)
{
    object *conts = ({ }),  
           *moved = ({ });
    int     x;
  
    if (TO->query_prop(CONT_I_CLOSED))
       {
          kto->catch_msg("Moze pojdzie ci latwiej, jesli najpierw otworzysz " +
           query_nazwa(PL_BIE) + "?\n");
          return 1;
       }
    
    if (!sizeof(all_inventory(TO))) 
       { kto->catch_msg("Przeciez " + query_nazwa(PL_MIA) + " jest pusty!\n");
         return 1;
       }
    
    conts = filter(all_inventory(TO), "a_filter", TO);
  
    for (x = 0; x < sizeof(conts); x++)  
    {
        conts[x]->move(kto); 
        if (present(conts[x], kto))  
        {
            moved += ({ conts[x] }) ;   /*successful move */
        }
    }   
    if (sizeof(moved) == 0)
        kto->catch_msg("Nie wyciagasz nic z "+query_nazwa(PL_DOP)+".\n");
    else 
    {
        kto->catch_msg("Wyciagasz " + COMPOSITE_DEAD(moved, PL_BIE) + 
                                " z "+short(PL_DOP)+".\n");
        saybb(QCIMIE(kto, PL_MIA) + " wyciaga " + 
            COMPOSITE_DEAD(moved, PL_BIE) + " z "+short(PL_DOP)+".\n",kto);
    }
    return 1;
}

int
emptypack(string str)
{
    mixed plecaki;
    int ret_val;
    
    notify_fail(capitalize(empty_verb) + " co?\n");
    
    if (!strlen(str))
          return (TP->query_subloc_obj(BACKPACK_SUBLOC))->empty_me(TP);
       
    parse_command(str,TP,"%i:"+PL_BIE,plecaki);
    plecaki=NORMAL_ACCESS(plecaki,"czy_to_plecak",TO);
    
    if (!sizeof(plecaki)) return 0;
    
    if (sizeof(plecaki)>1) return 0;
    
    if(TO!=plecaki[0]) return 0;
    
    if (ret_val=(plecaki[0]->empty_me(TP)))
       TP->set_obiekty_zaimkow( ({plecaki[0]}) );
    return ret_val;
}

/*
 * Function name: tmp_add_prop
 * Description:   add OBJ_M_NO_DROP prop again
 */
public void
tmp_add_prop(mixed setting, object tp)
{
    // Add the prop only if the rucksack is still in 
    // the inventory of the player:
//    if (objectp(tp) && objectp(environment(TO)) && (tp == environment(TO)))
//	add_prop(OBJ_M_NO_DROP, setting);
}

int
czy_to_forsa(object ob)
{
   if (!function_exists("create_coins",ob)) return 0;
   return 1;
}


/*
 * Function name: query_auto_load
 * Description:   remove the OBJ_M_NO_DROP property if it is set
 *                so the backpack and its contents are not lost
 *                when a player logs out.
 * Returns:       0
 */

public string
query_auto_load()
{
    mixed setting,inv;

    if (setting = query_prop_setting(OBJ_M_NO_DROP))
    {
//        remove_prop(OBJ_M_NO_DROP);
        set_alarm(0.1, 0.0, &tmp_add_prop(setting, environment(TO)));
    }
    
//    inv = all_inventory(TO);
//    inv = filter(inv,czy_to_forsa);
    
//    if (calling_function(0)=="quit")
//       inv->move(TP,1);
    
    return 0;
}
int
jaki_worn()
{
   return worn;
}
int
query_plecak()
{
    return 1;
}