blob: 049d84f6519a70ffe0a2d40f32d80b08ffdd11de [file] [log] [blame]
MG Mud User88f12472016-06-24 23:31:02 +02001// Ein transparenter Container, in dem die Gegenstaende landen,
2// die ein Spieler bei seinem Tod verliert.
3// Sinn dieses Objektes ist es, das invenotry eines Raumes klein
4// zu halten und die kosten im init() eines Spielers zu senken.
5
6#pragma strict_types
7#pragma save_types
MG Mud User88f12472016-06-24 23:31:02 +02008#pragma range_check
9
10inherit "std/container";
11
12// Spielerhaufen sollen sich etwas anders als NPC-haufen verhalten.
13private nosave status spielerhaufen;
14
15#include <properties.h>
16#include <moving.h>
17
18void create() {
19 string von;
20 if (object_name(this_object()) == __FILE__[0..<3]) {
21 set_next_reset(-1);
22 return;
23 }
24 if( !clonep(this_object()) ) return;
25 ::create();
Arathornc0bc29e2020-12-28 11:02:57 +010026 von = ({string})previous_object()->QueryProp(P_PILE_NAME);
MG Mud User88f12472016-06-24 23:31:02 +020027 SetProp( P_PILE_NAME, "\nhaufen "+von );
Arathorn979902f2021-03-27 19:16:57 +010028 spielerhaufen = ({int})previous_object()->IsPlayerCorpse();
MG Mud User88f12472016-06-24 23:31:02 +020029
30 AddId( ({"haufen","krempel","kluengel","gegenstaende"}) );
31 AddId( QueryProp(P_PILE_NAME) );
32 SetProp( P_NAME, "Haufen Krempel" );
33 SetProp( P_GENDER, MALE );
34 SetProp( P_INFO, "Diese Gegenstaende gehoerten einmal " + von + ".\n" );
35 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" ) );
36 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" );
37 AddDetail( ({"ekel","ekelgefuehle"}), "Es ist nicht mehr genug da, um welche zu wecken.\n" );
38 AddDetail( "menge", "Viele kleine Fetzen, die an den Gegenstaenden kleben.\n" );
39 AddDetail( "fluch", "Dem Anschein nach lastet auf den Sachen kein Fluch, aber wer weiss ...?\n" );
40 call_out( "merge_pile", 1 );
41}
42
43mixed _query_short() {
44 int sz = sizeof(all_inventory());
45 if( sz==0 ) {
46 call_out("remove",0,1); // fallback, wenn inhalt auf unerwartete weise verschwindet
47 return 0;
48 } else if( sz<10 ) {
49 return "Ein kleiner Haufen Krempel";
50 } else if( sz<30 ) {
51 return "Ein Haufen Krempel";
52 } else {
53 return "Ein grosser Haufen Krempel";
54 }
55 return 0;
56}
57
58// Prueft, ob wir in einen Spieler gemovt werden sollen.
59// Liefert passendes Moveresult, ansonsten 0.
60protected int PreventMove(object dest, object oldenv, int method) {
61 if( !objectp(dest) ) return 0;
62 if( method & M_NOCHECK ) return 0;
63 if( query_once_interactive(dest) ) {
64 return ME_NOT_ALLOWED;
65 // default meldung in put_and_get:pick
66 // IDEE: im spieler per hook eine andere meldung unterbringen
67 }
68 return ::PreventMove(dest, oldenv, method);
69}
70
71// Sorgt dafuer, dass im NPC sich der Haufen selbst zerstoert.
72protected void NotifyMove(object dest, object oldenv, int method) {
73 if( query_once_interactive(dest)) {
74 log_file( "PILE.log", dtime(time()) + ": pile in "
Arathorn5fecd832020-07-27 23:46:37 +020075 + ({string})dest->query_real_name() + " gelandet.\n" );
MG Mud User88f12472016-06-24 23:31:02 +020076 }
77 if( living(dest) ) {
78 filter_objects( all_inventory(), "move", dest, M_SILENT | M_NOCHECK );
79 // NPCs erwarten nicht, dass dinge im move verschwinden, deshalb
80 // abwarten
81 call_out( "remove", 0, 1 );
82 }
83 return ::NotifyMove(dest, oldenv, method);
84}
85
86// wenn nur noch ein Objekt im Haufen ist, soll dieser zerstoert werden.
87public void NotifyLeave( object ob, object dest ) {
88 if( sizeof(all_inventory())>1 ) return;
89 call_out( "remove", 0, 1 ); // verzoegern, um prepare_destruct gnaedig zu stimmen
90}
91
92// dito fuers loeschen
93public void NotifyRemove( object ob ) {
94 NotifyLeave( ob, 0);
95}
96
97// Haufen, die von zweimal dem selben NPC kommen, werden
98// zusammengelegt
99void merge_pile() {
100 object* other = filter_objects(
101 all_inventory(environment()) - ({ this_object() }),
102 "id",
103 QueryProp( P_PILE_NAME )
104 );
105 if( !sizeof(other) ) return;
106 filter_objects( all_inventory(), "move", other[0], M_SILENT | M_NOCHECK );
107 remove();
108}
109
110void reset() {
111 // wenn es ein NPC-Haufen ist, werden Gegenstaende, die oefter als 3mal
112 // vorkommen, zerstoert. Schraenkt die Objektflut an Stellen ein, wo NPC
113 // ihren Kram nicht mit AddItem clonen.
114 if (!spielerhaufen)
115 remove_multiple(3);
116 ::reset();
117 // wenn nur noch unsichtbare items im Haufen: aufloesen
118 if (!sizeof(filter(all_inventory(), function int (object o)
Arathorn5fecd832020-07-27 23:46:37 +0200119 { return stringp(({string})o->short());} )))
MG Mud User88f12472016-06-24 23:31:02 +0200120 remove(1);
121
122}
123
Arathorn0d093f62018-01-09 22:08:29 +0100124// Verhindert die Zerstoerung im reset() von Containern, die mit
125// remove_multiple() nach identischen Objekten suchen, um Muell zu
126// reduzieren. Das ist aber nur dann sinnvoll, wenn nach dem Zerstoeren
127// nicht mehr Muell rumliegt als vorher, daher geben wir 0 zurueck, wenn
128// der Haufen mehr als ein Objekt enthaelt. Weiterhin raeumt sich der Pile
129// im Lauf der Zeit selber auf/weg.
130// Objekte, die 0 zurueckgeben, werden in remove_multiple() uebersprungen.
131public string description_id()
132{
133 if ( sizeof(all_inventory(this_object())) > 1 )
134 {
135 return 0;
136 }
137 return ::description_id();
138}