MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame^] | 1 | // 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 | |
| 11 | inherit "std/container"; |
| 12 | |
| 13 | // Spielerhaufen sollen sich etwas anders als NPC-haufen verhalten. |
| 14 | private nosave status spielerhaufen; |
| 15 | |
| 16 | #include <properties.h> |
| 17 | #include <moving.h> |
| 18 | |
| 19 | void 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 | |
| 44 | mixed _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. |
| 61 | protected 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. |
| 73 | protected 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. |
| 88 | public 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 |
| 94 | public void NotifyRemove( object ob ) { |
| 95 | NotifyLeave( ob, 0); |
| 96 | } |
| 97 | |
| 98 | // Haufen, die von zweimal dem selben NPC kommen, werden |
| 99 | // zusammengelegt |
| 100 | void 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 | |
| 111 | void 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 | |