// Ein transparenter Container, in dem die Gegenstaende landen,
// die ein Spieler bei seinem Tod verliert.
// Sinn dieses Objektes ist es, das invenotry eines Raumes klein
// zu halten und die kosten im init() eines Spielers zu senken.

#pragma strict_types
#pragma save_types
#pragma range_check

inherit "std/container";

// Spielerhaufen sollen sich etwas anders als NPC-haufen verhalten.
private nosave status spielerhaufen;

#include <properties.h>
#include <moving.h>

void create() {
	string von;
	if (object_name(this_object()) == __FILE__[0..<3]) {
	  set_next_reset(-1);
	  return;
	}   
	if( !clonep(this_object()) ) return;
	::create();
	von = ({string})previous_object()->QueryProp(P_PILE_NAME);
	SetProp( P_PILE_NAME, "\nhaufen "+von );
	spielerhaufen = ({int})previous_object()->IsPlayerCorpse();

	AddId( ({"haufen","krempel","kluengel","gegenstaende"}) );
	AddId( QueryProp(P_PILE_NAME) );
	SetProp( P_NAME, "Haufen Krempel" );
	SetProp( P_GENDER, MALE );
	SetProp( P_INFO, "Diese Gegenstaende gehoerten einmal " + von + ".\n" );
	SetProp( P_LONG, break_string("Du betrachtest einen Haufen, der aus einer von Leichenresten zusammengebackenen Menge diverser Gegenstaende besteht. Zum Glueck ist von der Leiche nicht mehr genug uebrig, um Ekelgefuehle zu wecken. Ganz im Gegenteil: Dir juckt es ein wenig in den Fingern, Dich an diesem Haufen zu bedienen. Aber man kann sich nie ganz sicher sein, ob nicht doch ein Fluch auf den Dingen lastet. Vielleicht hat der verschiedene Besitzer sie auch jemandem vererbt? Andererseits, wenn gerade niemand guckt ...\n" ) );
	AddDetail( ({"fetzen","leiche","leichenteile"}), "Mit blossen Augen kann man nicht mehr viel erkennen, aber einige Fetzen deuten darauf hin, dass die Sachen von "+von+" stammen.\n" );
	AddDetail( ({"ekel","ekelgefuehle"}), "Es ist nicht mehr genug da, um welche zu wecken.\n" );
	AddDetail( "menge", "Viele kleine Fetzen, die an den Gegenstaenden kleben.\n" );
	AddDetail( "fluch", "Dem Anschein nach lastet auf den Sachen kein Fluch, aber wer weiss ...?\n" );
	call_out( "merge_pile", 1 );
}

mixed _query_short() {
	int sz = sizeof(all_inventory());
	if( sz==0 ) {
		call_out("remove",0,1); // fallback, wenn inhalt auf unerwartete weise verschwindet
		return 0;
	} else if( sz<10 ) {
		return "Ein kleiner Haufen Krempel";
	} else if( sz<30 ) {
		return "Ein Haufen Krempel";
	} else {
		return "Ein grosser Haufen Krempel";
	}
}

// Prueft, ob wir in einen Spieler gemovt werden sollen.
// Liefert passendes Moveresult, ansonsten 0.
protected int PreventMove(object dest, object oldenv, int method) {
    if( !objectp(dest) ) return 0;
    if( method & M_NOCHECK ) return 0;
    if( query_once_interactive(dest) ) {
      return ME_NOT_ALLOWED;
    // default meldung in put_and_get:pick
    // IDEE: im spieler per hook eine andere meldung unterbringen
    }
    return ::PreventMove(dest, oldenv, method);
}

// Sorgt dafuer, dass im NPC sich der Haufen selbst zerstoert.
protected void NotifyMove(object dest, object oldenv, int method) {
    if( query_once_interactive(dest)) {
	log_file( "PILE.log", dtime(time()) + ": pile in " 
	    + ({string})dest->query_real_name() + " gelandet.\n" );
    }
    if( living(dest) ) {
	filter_objects( all_inventory(), "move", dest, M_SILENT | M_NOCHECK );
	// NPCs erwarten nicht, dass dinge im move verschwinden, deshalb
	// abwarten
	call_out( "remove", 0, 1 );
    }
    return ::NotifyMove(dest, oldenv, method);
}

// wenn nur noch ein Objekt im Haufen ist, soll dieser zerstoert werden.
public void NotifyLeave( object ob, object dest ) {
	if( sizeof(all_inventory())>1 ) return;
	call_out( "remove", 0, 1 ); // verzoegern, um prepare_destruct gnaedig zu stimmen
}

// dito fuers loeschen
public void NotifyRemove( object ob ) {
    NotifyLeave( ob, 0);
}

// Haufen, die von zweimal dem selben NPC kommen, werden
// zusammengelegt
void merge_pile() {
	object* other = filter_objects(
		all_inventory(environment()) - ({ this_object() }),
		"id",
		QueryProp( P_PILE_NAME )
	);
	if( !sizeof(other) ) return;
	filter_objects( all_inventory(), "move", other[0], M_SILENT | M_NOCHECK );
	remove();
}

void reset() {
  // wenn es ein NPC-Haufen ist, werden Gegenstaende, die oefter als 3mal
  // vorkommen, zerstoert. Schraenkt die Objektflut an Stellen ein, wo NPC
  // ihren Kram nicht mit AddItem clonen.
  if (!spielerhaufen)
    remove_multiple(3);
  ::reset();
  // wenn nur noch unsichtbare items im Haufen: aufloesen
  if (!sizeof(filter(all_inventory(), function int (object o)
          { return stringp(({string})o->short());} )))
    remove(1);

}

// Verhindert die Zerstoerung im reset() von Containern, die mit
// remove_multiple() nach identischen Objekten suchen, um Muell zu
// reduzieren. Das ist aber nur dann sinnvoll, wenn nach dem Zerstoeren
// nicht mehr Muell rumliegt als vorher, daher geben wir 0 zurueck, wenn
// der Haufen mehr als ein Objekt enthaelt. Weiterhin raeumt sich der Pile
// im Lauf der Zeit selber auf/weg.
// Objekte, die 0 zurueckgeben, werden in remove_multiple() uebersprungen.
public string description_id()
{
  if ( sizeof(all_inventory(this_object())) > 1 )
  {
    return 0;
  }
  return ::description_id();
}
