// 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";
	}
  return 0;
}

// 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();
}
