blob: 66b91f4c69ed947e3c8e040d5b35d067e9992998 [file] [log] [blame]
MG Mud User88f12472016-06-24 23:31:02 +02001#pragma strong_types, save_types, rtt_checks
2#pragma no_shadow, no_clone
3
4inherit "/std/thing";
5
6#include <language.h>
7#include <properties.h>
8#include <items/fishing/fishing.h>
9#include <items/flasche.h>
10#include <unit.h>
11
12#define TP this_player()
13#define ME this_object()
14
15int QueryKoeder();
16
17protected void create() {
18 ::create();
19
20 AddId(({HAKEN_ID,"haken","angelhaken"}));
21 SetProp(P_NAME, "Haken");
22 SetProp(P_GENDER, MALE);
23 SetProp(P_ARTICLE, 1);
24 SetProp(P_WEIGHT, 5);
25 SetProp(P_SHORT, "Ein Angelhaken");
26 SetProp(P_LONG, "Ein Angelhaken aus Metall.\n");
27 SetProp(P_LONG_EMPTY,"Vielleicht kannst Du etwas damit aufspiessen?\n");
28
29 // Lang- und Kurzbeschreibungen reagieren auf einen evtl. vorhandenen
30 // Koeder, allerdings nur auf ein tatsaechlich existierendes Koeder-Objekt,
31 // nicht auf einen per ueberschriebenem QueryKoeder() vorgetaeuschten
32 // Koeder, wie es der Spezialhaken tut.
33 Set(P_SHORT, function string () {
34 object koeder = present(WURM_ID, ME);
35 return Query(P_SHORT,F_VALUE)+
36 (objectp(koeder)?" mit "+koeder->name(WEM):"");
37 }, F_QUERY_METHOD);
38 Set(P_LONG, function string () {
39 object koeder = present(WURM_ID, ME);
40 return Query(P_LONG,F_VALUE) + (objectp(koeder)?
41 koeder->Name(WER)+" haengt daran.\n":QueryProp(P_LONG_EMPTY));
42 }, F_QUERY_METHOD);
43
44 // P_FISH und P_WATER liefern die Daten eines evtl. vorhandenen Koeders
45 // Wenn kein Koeder dranhaengt, werden P_WATER und P_FISH des Hakens
46 // zurueckgegeben, falls es sich um einen Fake-Koeder handelt wie beim
47 // Spezialhaken; in diesem Fall hat der Haken selbst die Properties
48 // gesetzt.
49 Set(P_FISH, function int () {
50 object koeder = present(WURM_ID, ME);
51 return (objectp(koeder)?koeder->QueryProp(P_FISH):Query(P_FISH));
52 }, F_QUERY_METHOD);
53 Set(P_WATER, function int () {
54 object koeder = present(WURM_ID, ME);
55 return (objectp(koeder)?koeder->QueryProp(P_WATER):Query(P_WATER));
56 }, F_QUERY_METHOD);
57
58 SetProp(P_MATERIAL,([MAT_STEEL:100]));
59
60 AddCmd(({"spiess","spiesse"}),"spiessauf");
61}
62
63protected void create_super() {
64 set_next_reset(-1);
65}
66
67static int spiessauf(string str) {
68 string haken,wurmname,*substr;
69 object wurm;
70 int amount;
71
72 notify_fail("Was willst Du denn aufspiessen?\n");
73 if (!stringp(str) || !sizeof(str))
74 return 0;
75
76 if( sscanf(str, "%s auf%s", wurmname, haken) != 2 )
77 return 0;
78
79 haken = trim(haken);
80
81 notify_fail("So etwas hast Du nicht bei Dir.\n");
82 if ( !objectp(wurm=present(wurmname,TP)) )
83 return 0;
84
85 notify_fail("Das kannst Du nicht aufspiessen.\n");
86 if( !wurm->id(WURM_ID) )
87 return 0;
88
89 notify_fail("Worauf willst Du "+wurm->name(WEN,1)+" denn spiessen?\n");
90 if ( haken!="" && !id(haken) )
91 return 0;
92
93 notify_fail(break_string("Dazu solltest Du "+name(WEN,1)+" erst einmal "
94 "bei Dir haben.",78));
95 if ( environment(ME) != TP )
96 return 0;
97
98 notify_fail("An dem Haken haengt schon ein Koeder.\n");
99 if ( QueryKoeder() )
100 return 0;
101
102 // Haken und Koeder sind im Inventar und fuehlen sich von der Syntax
103 // angesprochen.
104 if( wurm->IsUnit() ) {
105 // Das QueryProp() ist nicht unnoetig. Bei der Abfrage von U_REQ wird
106 // U_REQ genullt, wenn das aktuelle query_verb() != dem letzten ist.
107 // Bei der ersten Abfrage wuerde also das hier gesetzte U_REQ wieder
108 // geloescht. Daher muss das jetzt hier als erstes einmal abgefragt
109 // werden...
110 wurm->QueryProp(U_REQ);
111 wurm->SetProp(U_REQ,1);
112 }
113 tell_object(TP, break_string(
114 "Du spiesst "+wurm->name(WEN,1)+" auf "+name(WEN,1)+".",78));
115 tell_room(environment(TP), break_string(
116 TP->Name(WER)+" spiesst "+wurm->name(WEN)+" auf "+name(WEN)+".",78),
117 ({TP}));
118 // M_GET, damit auch P_NODROP-Koeder aufgespiesst werden koennen.
119 if ( wurm->move(ME,M_GET) != MOVE_OK) {
120 tell_object(TP, break_string(
121 "Verdammt! Jetzt hast Du Dir fast in den Finger gestochen! "+
122 wurm->Name(WEN,1)+" hast Du dabei natuerlich verfehlt.", 78));
123 }
124 return 1;
125}
126
127int QueryKoeder(){
128 return objectp(present(WURM_ID, ME));
129}
130
131object QueryKoederObject() {
132 return present(WURM_ID,ME);
133}
134
135int MayAddObject(object ob) {
136 return (objectp(ob) && ob->id(WURM_ID) && sizeof(all_inventory(ME))<=1);
137}
138
139int _query_total_weight() {
140 int tw;
141 foreach(int w: all_inventory(ME)+({ME}))
142 tw += w->QueryProp(P_WEIGHT);
143 return tw;
144}
145
146varargs int remove(int sil) {
147 all_inventory(ME)->remove(); // funktioniert auch mit leeren Arrays
148 return ::remove(sil);
149}
150
151int KoederGefressen() {
152 // Nicht QueryKoeder() pruefen, da das bei Spezialhaken immer 1 ist.
153 object koeder = present(WURM_ID, ME);
154 if ( objectp(koeder) )
155 return koeder->remove();
156 return -1;
157}