blob: dcfe5ef57b042e67ad642117c84fd79716ca6942 [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
8#pragma pedantic
9#pragma range_check
10
11inherit "std/container";
12
13// Spielerhaufen sollen sich etwas anders als NPC-haufen verhalten.
14private nosave status spielerhaufen;
15
16#include <properties.h>
17#include <moving.h>
18
19void create() {
20 string von;
21 if (object_name(this_object()) == __FILE__[0..<3]) {
22 set_next_reset(-1);
23 return;
24 }
25 if( !clonep(this_object()) ) return;
26 ::create();
27 von = (string)previous_object()->QueryProp(P_PILE_NAME);
28 SetProp( P_PILE_NAME, "\nhaufen "+von );
29 spielerhaufen = (int)previous_object()->IsPlayerCorpse();
30
31 AddId( ({"haufen","krempel","kluengel","gegenstaende"}) );
32 AddId( QueryProp(P_PILE_NAME) );
33 SetProp( P_NAME, "Haufen Krempel" );
34 SetProp( P_GENDER, MALE );
35 SetProp( P_INFO, "Diese Gegenstaende gehoerten einmal " + von + ".\n" );
36 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" ) );
37 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" );
38 AddDetail( ({"ekel","ekelgefuehle"}), "Es ist nicht mehr genug da, um welche zu wecken.\n" );
39 AddDetail( "menge", "Viele kleine Fetzen, die an den Gegenstaenden kleben.\n" );
40 AddDetail( "fluch", "Dem Anschein nach lastet auf den Sachen kein Fluch, aber wer weiss ...?\n" );
41 call_out( "merge_pile", 1 );
42}
43
44mixed _query_short() {
45 int sz = sizeof(all_inventory());
46 if( sz==0 ) {
47 call_out("remove",0,1); // fallback, wenn inhalt auf unerwartete weise verschwindet
48 return 0;
49 } else if( sz<10 ) {
50 return "Ein kleiner Haufen Krempel";
51 } else if( sz<30 ) {
52 return "Ein Haufen Krempel";
53 } else {
54 return "Ein grosser Haufen Krempel";
55 }
56 return 0;
57}
58
59// Prueft, ob wir in einen Spieler gemovt werden sollen.
60// Liefert passendes Moveresult, ansonsten 0.
61protected int PreventMove(object dest, object oldenv, int method) {
62 if( !objectp(dest) ) return 0;
63 if( method & M_NOCHECK ) return 0;
64 if( query_once_interactive(dest) ) {
65 return ME_NOT_ALLOWED;
66 // default meldung in put_and_get:pick
67 // IDEE: im spieler per hook eine andere meldung unterbringen
68 }
69 return ::PreventMove(dest, oldenv, method);
70}
71
72// Sorgt dafuer, dass im NPC sich der Haufen selbst zerstoert.
73protected void NotifyMove(object dest, object oldenv, int method) {
74 if( query_once_interactive(dest)) {
75 log_file( "PILE.log", dtime(time()) + ": pile in "
76 + dest->query_real_name() + " gelandet.\n" );
77 }
78 if( living(dest) ) {
79 filter_objects( all_inventory(), "move", dest, M_SILENT | M_NOCHECK );
80 // NPCs erwarten nicht, dass dinge im move verschwinden, deshalb
81 // abwarten
82 call_out( "remove", 0, 1 );
83 }
84 return ::NotifyMove(dest, oldenv, method);
85}
86
87// wenn nur noch ein Objekt im Haufen ist, soll dieser zerstoert werden.
88public void NotifyLeave( object ob, object dest ) {
89 if( sizeof(all_inventory())>1 ) return;
90 call_out( "remove", 0, 1 ); // verzoegern, um prepare_destruct gnaedig zu stimmen
91}
92
93// dito fuers loeschen
94public void NotifyRemove( object ob ) {
95 NotifyLeave( ob, 0);
96}
97
98// Haufen, die von zweimal dem selben NPC kommen, werden
99// zusammengelegt
100void merge_pile() {
101 object* other = filter_objects(
102 all_inventory(environment()) - ({ this_object() }),
103 "id",
104 QueryProp( P_PILE_NAME )
105 );
106 if( !sizeof(other) ) return;
107 filter_objects( all_inventory(), "move", other[0], M_SILENT | M_NOCHECK );
108 remove();
109}
110
111void reset() {
112 // wenn es ein NPC-Haufen ist, werden Gegenstaende, die oefter als 3mal
113 // vorkommen, zerstoert. Schraenkt die Objektflut an Stellen ein, wo NPC
114 // ihren Kram nicht mit AddItem clonen.
115 if (!spielerhaufen)
116 remove_multiple(3);
117 ::reset();
118 // wenn nur noch unsichtbare items im Haufen: aufloesen
119 if (!sizeof(filter(all_inventory(), function int (object o)
120 { return !o->short();} )))
121 remove(1);
122
123}
124