blob: 685b1ed42d0e2f1111b08f578f34063f617b8b41 [file] [log] [blame]
zesstrac34bfc12016-06-27 22:04:41 +02001// /p/service/mupfel/getkill.c
2// Ermittelt, wenn in 'die' aufgerufen, den Killer, auch wenn
3// mit Bumerang, Kampfdaemon o.ae. Hilfsmitteln getoetet wurde
4// 22-07-1996 - Mupfel@MorgenGrauen -
5// Jetzt wird auch ein Beistand (Schutzengel, Phoenix, etc) erkannt
6// 06-07-1997 - Mupfel@MorgenGrauen -
7// Args der Pflanzenkrieger hat ja auch die id "Beistand" ;(
8// 09-01-2001 - Mupfel@MorgenGrauen -
9// Immer neue Retrowaffen... jetzt wird auch Tsunamis Toga erkannt
10// 04-01-2005 - Mupfel@MorgenGrauen -
11// 21.11.2006 - Zesstra
12// Der Bumerang ist umgezogen. Pfad aktualisiert
13// 13.10.2013 - Zesstra
14// Einmal auf Basis von P_KILLER neugebaut.
15// 16.10.2013 - Zesstra
16// Man muss es jetzt nicht mehr erben, sondern kann auch per Callother
17// abfragen. Dann wird der Killer vom previous_object() ermittelt.
18// 12.06.2016 - Mupfel
19// Zesstra war fleissig und hat diese Kruecke ueberfluessig gemacht.
20// Siehe Manpage zu "get_killing_player"
21
22#define NEED_PROTOTYPES
23#include <thing/properties.h>
24#undef NEED_PROTOTYPES
25
26#include <thing/language.h>
27#include <properties.h>
28
29public mixed get_killer_data(int extern)
30{
31 object killer;
32 // wenn von ausser gerufen und ein PO existiert, fragen wir P_KILLER darin
33 // ab. Dann muss man dieses Ding hier nicht unbedingt erben.
34 if ((extern || extern_call()) && previous_object())
35 killer=previous_object()->QueryProp(P_KILLER);
36 else
37 killer=QueryProp(P_KILLER);
38
39 // Eigentlich tritt dieser Fall nur bei Vergiftungen auf.
40 if (!objectp(killer))
41 return ({0,"<unbekannt>"});
42
43 // Spieler selber? Ist ja einfach.
44 if (query_once_interactive(killer))
45 return ({killer,killer->Name(WER)});
46
47 // Helfer-NPC?
48 mixed helperdata = killer->QueryProp(P_HELPER_NPC);
49 if (pointerp(helperdata) && objectp(helperdata[0]))
50 return ({helperdata[0], helperdata[0]->Name(WER) + " mit Helfer-NPC"});
51 // Einige Gilden-NPC verweisen auf ihren Spieler. Diese wird natuerlich nur
52 // abgefragt, wenn die Gilde noch keinen Helfer-NPC registrieren.
53 else if (killer->id("\nchaos_gilden_daemon"))
54 {
55 killer=find_player(killer->QueryProp("chaos_daem_beschwoerer"));
56 return ({killer, killer->Name(WER)+" (mit Kampfdaemon)"});
57 }
58 else if (killer->id("Beistand") && !killer->id("P-KRIEGER"))
59 {
60 killer = killer->QueryProp("klerus_owner");
61 return ({killer, killer->Name(WER)+" (mit Beistand)"});
62 }
63
64 // Einige toetende Objekte gesondert behandeln und Spieler als Killer
65 // liefern.
66 switch(object_name(blueprint(killer)))
67 {
68 case "/d/ebene/obj/gring":
69 killer = killer->QueryProp(P_WORN);
70 return ({killer, killer->name(RAW)+" (mit Goblinring)"});
71 case "/d/unterwelt/wurzel/dorf/shabz":
72 killer = killer->QueryProp(P_WORN);
73 return ({killer, killer->name(RAW)+" (mit Abzeichen)"});
74 case "/d/wueste/tsunami/schule/rue/hex_toga2":
75 killer = killer->QueryProp(P_WORN);
76 return ({killer, killer->name(RAW)+" (mit Toga)"});
77 case "/p/seher/laden/obj/bumerang":
78 killer = killer->query_werfer();
79 return ({killer, killer->name(RAW)+" (mit Bumerang)"});
80 }
81 // killer ist jedenfalls kein Spieler hier.
82 return ({killer, killer->name(RAW)});
83}
84
85// Name des Killers
86public string get_killer()
87{
88 return get_killer_data(extern_call())[1];
89}
90// Objekt des Killers
91public object get_killer_object()
92{
93 return get_killer_data(extern_call())[0];
94}
95