/*
 * Genialny droproom napisany przez Morleya w lipcu '98 na potrzeby
 * Wolnej Kompanii Stirlandu :>
 * Mozliwosci mozna wyczytac na tabliczce w koncu pliku, ewentualnie
 * w jakies ksiazce z biblioteki Kompanii
 */


#pragma strict_types
#pragma no_clone

#include "zol_naj.h"
#include <macros.h>
#include <filter_funs.h>
#include <composite.h>
#include <ss_types.h>

inherit STD_PATH + "war_in.c";
inherit "/cmd/std/command_driver";

void
create_warownia_room()
{
    set_short ("Zbrojownia");

    add_exit (WPATH + "dziedz2.c", "poludnie", 0, 0);

    add_item ( ({"tabliczke", "metalowa tabliczke"}), "Niewielka metalowa " +
              "tabliczka. Napisano na niej zasady korzystania ze zbrojowni.\n");

    add_cmd_item ( ({"tabliczke", "metalowa tabliczke"}), "przeczytaj", 
                  "@@tabliczka");

    call_other (WPATH + "magazyn_zbroj.c", "load_me");
}

void
init()
{
    setuid();
    seteuid(getuid());
    add_action ("zostaw", "zostaw");
    add_action ("zabierz", "zabierz");
    add_action ("zbrojownia", "zbrojownia");
    add_action ("pokaz", "pokaz");
    ::init();
}

int
zostaw(string str)
{
    mixed *oblist;
    object *oblist_filt;
    int cnt;
    
    if (!stringp (str) )
    {
	notify_fail ("Co chcesz zostawic?\n");
	return 0;
    }

    if (!parse_command (str, all_inventory (this_player() ), "%i:" + PL_BIE,
			oblist) )
    {
	notify_fail ("Co chcesz zostawic?\n");
	return 0;
    }
    oblist_filt = oblist[1..(sizeof (oblist) - 1)];
    oblist_filt = FILTER_SHOWN (oblist_filt);
    
    if (oblist[0] == 0)
    {
	int a, tmp = sizeof (oblist_filt);
	object *wlozone = ({ });

	for (a = 0 ;  a < tmp ;  a++)
	{
	    if(oblist_filt[a]->check_weapon() || oblist_filt[a]->check_armour() )
	    {
		oblist_filt[a]->move (WPATH + "magazyn_zbroj.c");
		if (!(!oblist_filt[a]->query_recover() &&
		      find_living ("armageddon")->shutdown_active() ) )
		    ENGINE->put_into_droproom (this_player(), 
					       oblist_filt[a]->query_value() );
		wlozone += ({ oblist_filt[a] });
	    }
	}
	
	if (!sizeof (wlozone) )
	    write ("Nic nie zostawiles w zbrojowni.\n");
	else
	{
	    write ("Zostawiasz " + COMPOSITE_DEAD(wlozone, PL_BIE) + " w zbrojowni.\n");
	    say (QCIMIE (this_player(), PL_MIA) + " zostawia " + QCOMPDEAD(PL_BIE) +
	    " w zbrojowni.\n");
	}
	return 1;
    }
    
    cnt = oblist[0];
    if (cnt < 0 || cnt == 1)
    {
	if (cnt == 1) cnt = -1;
	cnt++;

	if (-cnt > sizeof (oblist_filt) - 1 )
	{
	    notify_fail ("Co chcesz zostawic?\n");
	    return 0;
	}
	
	if (oblist_filt[-cnt]->check_armour() || 
	    oblist_filt[-cnt]->check_weapon() )
	{
	    write ("Zostawiasz " + oblist_filt[-cnt]->short(this_player(),PL_BIE)
		   + " w zbrojowni.\n");
	    say (QCIMIE (this_player(), PL_MIA) + " zostawia " + 
		 QSHORT (oblist_filt[-cnt], PL_BIE) + " w zbrojowni.\n");
	    oblist_filt[-cnt]->move (WPATH + "magazyn_zbroj.c");
	    if (!(!oblist_filt[-cnt]->query_recover() &&
		  find_living ("armageddon")->shutdown_active() ) )
		ENGINE->put_into_droproom (this_player(), 
					   oblist_filt[-cnt]->query_value() );
	    return 1;
	}
	
	write (capitalize (oblist_filt[-cnt]->short(this_player(), PL_MIA) ) 
	       + " nie jest bronia ani zbroja. Nie potrzebujemy tu tego.\n");
	return 1;
    }

    if (cnt > 1)
    {
	object *wlozone = ({ });
	int licznik = 0, a = 0;

	while (licznik < cnt && a < sizeof (oblist_filt) )
	{
	    if (oblist_filt[a]->check_weapon() || oblist_filt[a]->check_armour() )
	    {
		wlozone += ({ oblist_filt[a] });
		licznik++;
		oblist_filt[a]->move (WPATH + "magazyn_zbroj.c");
		if (!(!oblist_filt[a]->query_recover() &&
		      find_living ("armageddon")->shutdown_active() ) )
		    ENGINE->put_into_droproom (this_player(),
					       oblist_filt[a]->query_value() );
	    }
	    a++;
	}

	if (!sizeof (wlozone) )
	    write ("Nic nie zostawiles w zbrojowni.\n");
	else
	{
	    write ("Zostawiasz " + COMPOSITE_DEAD(wlozone, PL_BIE) + " w zbrojowni.\n");
	    say (QCIMIE (this_player(), PL_MIA) + " zostawia " + QCOMPDEAD(PL_BIE) +
	    " w zbrojowni.\n");
	}
	return 1;
    }
}

int
pn_filtr (object ob, int *params)
{
    if ( (ob->query_recover() && params[0]) ||
	 (!ob->query_recover() && params[1]) )
	return 1;
    return 0;
}

int
zabierz(string str)
{
    mixed *oblist;
    object *oblist_filt;
    int cnt;
    int *params = allocate (2);
    // params : 0 - przetraja, 1 - nie przetrwaja
    function filtr;

    if (!stringp (str) || !objectp (find_object (WPATH + "magazyn_zbroj.c") ) )
    {
	notify_fail ("Co chcesz zabrac?\n");
	return 0;
    }

    if (!parse_command (str, all_inventory (find_object (WPATH + "magazyn_zbroj.c"))
			, "%i:" + PL_BIE, oblist ) )
    {
	if (!parse_command (str, all_inventory (find_object (WPATH + "magazyn_zbroj.c"))
			, " 'p' %i:" + PL_BIE, oblist ) )
	{
	    if (!parse_command (str, all_inventory (find_object (WPATH + "magazyn_zbroj.c"))
			, " 'n' %i:" + PL_BIE, oblist ) )
	    {
		notify_fail ("Co chcesz zabrac?\n");
		return 0;
	    }
	    else params[1] = 1;
	}
	else
	    params[0] = 1;
    }
    else
    { params[0] = 1; params[1] = 1; }

    
    oblist_filt = oblist[1..(sizeof (oblist) - 1)];
    oblist_filt = FILTER_SHOWN (oblist_filt);
    filtr = &pn_filtr (,params);
    oblist_filt = filter (oblist_filt, filtr);

    if (oblist[0] == 0)
    {
	int a, tmp = sizeof (oblist_filt);
	object *zabrane = ({ });

	for (a = 0 ;  a < tmp ;  a++)
	{
	    if (ENGINE->moze_zabrac (this_player(), oblist_filt[a]->query_value() )
		&& !oblist_filt[a]->move (this_player () ) )
	    {
		if (!(!oblist_filt[a]->query_recover() &&
		      find_living ("armageddon")->shutdown_active() ) )
		    ENGINE->took_from_droproom (this_player(), 
						oblist_filt[a]->query_value() );
		zabrane += ({ oblist_filt[a] });
	    }
	}
	
	if (!sizeof (zabrane) )
	    write ("Nic nie zabrales ze zbrojowni.\n");
	else
	{
	    write ("Zabierasz " + COMPOSITE_DEAD(zabrane, PL_BIE) + " ze zbrojowni.\n");
	    say (QCIMIE (this_player(), PL_MIA) + " zabiera " + QCOMPDEAD(PL_BIE) +
	    " ze zbrojowni.\n");
	}
	return 1;
    }
    
    cnt = oblist[0];
    if (cnt < 0 || cnt == 1)
    {
	if (cnt == 1) cnt = -1;
	cnt++;

	if (-cnt > sizeof (oblist_filt) - 1 )
	{
	    notify_fail ("Co chcesz zabrac?\n");
	    return 0;
	}
	
	if (ENGINE->moze_zabrac (this_player(), oblist_filt[-cnt]->query_value() ) )
	{
	    if (!oblist_filt[-cnt]->move (this_player() ) )
	    {
		write ("Zabierasz " + oblist_filt[-cnt]->short(this_player(),PL_BIE)
		       + " ze zbrojowni.\n");
		say (QCIMIE (this_player(), PL_MIA) + " zabiera " + 
		     QSHORT (oblist_filt[-cnt], PL_BIE) + " ze zbrojowni.\n");
		if (!(!oblist_filt[-cnt]->query_recover() &&
		      find_living ("armageddon")->shutdown_active() ) )
		    ENGINE->took_from_droproom (this_player(), 
						oblist_filt[-cnt]->query_value() );
		    return 1;
	    }
	    write ("Nie mozesz podniesc " + oblist_filt[-cnt]->short(PL_DOP) +
		   ".\n");
	    return 1;
	}
	else
	{
	    write ("Niestety aby moc cos zabrac ze zbrojowni musisz najpierw " +
		   "zostawic tam rzeczy o podobnej wartosci.\n");
	    return 1;
	}
    }

    if (cnt > 1)
    {
	object *zabrane = ({ });
	int licznik = 0, a = 0;

	while (licznik < cnt && a < sizeof (oblist_filt) )
	{
	    if (ENGINE->moze_zabrac (this_player(), oblist_filt[a]->query_value())
		&& !oblist_filt[a]->move (this_player() ) )
	    {
		zabrane += ({ oblist_filt[a] });
		licznik++;
		if (!(!oblist_filt[a]->query_recover() &&
		      find_living ("armageddon")->shutdown_active() ) )
		    ENGINE->took_from_droproom (this_player(),
						oblist_filt[a]->query_value() );
	    }
	    a++;
	}

	if (!sizeof (zabrane) )
	    write ("Nic nie zabrales ze zbrojowni.\n");
	else
	{
	    write ("Zabierasz " + COMPOSITE_DEAD(zabrane, PL_BIE) + " ze zbrojowni.\n");
	    say (QCIMIE (this_player(), PL_MIA) + " zabiera " + QCOMPDEAD(PL_BIE) +
	    " ze zbrojowni.\n");
	}
	return 1;
    }
}

    
int
zbrojownia (string str)
{
    string *parametry;
    int a, tmp, *params = allocate (4);
    object *oblist;
    
    /*
     * params : 0 - zbroje, 1 - bronie, 2 - przetrwaja, 3 - nieprzetrwaja
     */

    if (stringp (str))
	parametry = explode (str, "");
    else
    {
	params[0] = 1; params[1] = 1; params[2] = 1; params[3] = 1;
    }

    if (member_array ("z", parametry) != -1)
	params[0] = 1;

    if (member_array ("b", parametry) != -1)
	params[1] = 1;

    if (member_array ("p", parametry) != -1)
	params[2] = 1;
    
    if (member_array ("n", parametry) != -1)
	params[3] = 1;

    if (!params[0] && !params[1])
    {
	params[0] = 1; params[1] = 1;
    }

    if (!params[2] && !params[3])
    {
	params[2] = 1; params[3] = 1;
    }
    
    if (objectp (find_object (WPATH + "magazyn_zbroj.c") ) )
	oblist = all_inventory (find_object (WPATH + "magazyn_zbroj.c") );
    else
	oblist = ({ });

    if (!sizeof (oblist))
    {
	write ("To bardzo przykre, ale w tej chwili zbrojownia jest pusciutenka.\n");
	return 1;
    }
    
    write ("-------------------- Oto zawartosc naszej zbrojowni : --------------------\n");
    tmp = sizeof (oblist);
    for (a = 0 ; a < tmp ; a++)
    {
	if ( ( (oblist[a]->check_armour() && params[0])
	       || (oblist[a]->check_weapon() && params[1]) ) &&
	     ( (oblist[a]->query_recover() && params[2])
	       || (!oblist[a]->query_recover() && params[3]) ) )
	    write (capitalize (oblist[a]->short() ) + "\n");
    }
    write ("--------------------------------------------------------------------------\n");
    return 1;
}

int
pokaz(string str)
{
    mixed *oblist;
    object *oblist_filt;
    int cnt;
    
    if (!stringp (str) || !objectp (find_object (WPATH + "magazyn_zbroj.c") ) )
    {
	notify_fail ("Pokazac co?\n");
	return 0;
    }

    if (!parse_command (str, all_inventory (find_object (WPATH + "magazyn_zbroj.c"))
			, "%i:" + PL_BIE, oblist ) )
    {
	notify_fail ("Pokazac co?\n");
	return 0;
    }
    oblist_filt = oblist[1..(sizeof (oblist) - 1)];
    oblist_filt = FILTER_SHOWN (oblist_filt);
    
    if (oblist[0] == 0)
    {
	int a, tmp = sizeof (oblist_filt);
	
	for (a = 0 ;  a < tmp ;  a++)
	{
	    oblist_filt[a]->appraise_object(this_player()->
					    query_skill(SS_APPR_OBJ) );
	}
	
	return 1;
    }
    
    cnt = oblist[0];
    if (cnt < 0 || cnt == 1)
    {
	if (cnt == 1) cnt = -1;
	cnt++;

	if (-cnt > sizeof (oblist_filt) - 1 )
	{
	    notify_fail ("Pokazac co?\n");
	    return 0;
	}
	
	oblist_filt[-cnt]->appraise_object(this_player()->
					   query_skill(SS_APPR_OBJ) );
	return 1;
    }

    if (cnt > 1)
    {
	int licznik = 0;

	while (licznik < cnt && licznik < sizeof (oblist_filt) )
	{
	    oblist_filt[licznik]->appraise_object(this_player()->
						  query_skill(SS_APPR_OBJ) );
	    licznik++;
	}

	return 1;
    }
}

string
tabliczka()
{
    return 
	"/--------------------------------------------------------\\\n" +
        "| /\\                                                  /\\ |\n" +
        "| \\/               Z B R O J O W N I A                \\/ |\n" +
        "|                                                        |\n" +
        "| zostaw <przedmioty> - odloz przedmioty do magazynu     |\n" +
        "| zabierz <przedmioty> - wez przedmioty z magazynu       |\n" +
        "| zbrojownia <opcje> - aktualna zawartosc magazynu       |\n" +
        "| przy tej komendzie dostepne sa opcje:                  |\n" +
        "| z - pokaz tylko zbroje,   b - pokaz tylko bronie       |\n" +
        "| p - pokaz tylko przedmioty ktore przetrwaja apokalipse |\n" +
        "| n - przedmioty ktore nie przetrwaja apokalipsy         |\n" +
	"| opcje p i n mozna uzywac przy komendzie zabierz np.:   |\n" +
	"| zabierz p miecze,  zabierz n wszystko                  |\n" +
        "| Mozliwe jest laczenie opcji.                           |\n" +
        "|                                                        |\n" +
        "|   Szczegoly korzystania ze zbrojowni mozna poznac w    |\n" +
        "| /\\                   bibliotece.                    /\\ |\n" +
        "| \\/                                                  \\/ |\n" +
        "\\--------------------------------------------------------/\n";
}
