blob: 60dacf14ccf689949cc89c95b1f82f37ad032257 [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) {
Zesstra0f151f72021-05-07 09:32:59 +020068 string haken,wurmname;
MG Mud User88f12472016-06-24 23:31:02 +020069 object wurm;
MG Mud User88f12472016-06-24 23:31:02 +020070
71 notify_fail("Was willst Du denn aufspiessen?\n");
72 if (!stringp(str) || !sizeof(str))
73 return 0;
74
75 if( sscanf(str, "%s auf%s", wurmname, haken) != 2 )
76 return 0;
77
78 haken = trim(haken);
79
80 notify_fail("So etwas hast Du nicht bei Dir.\n");
81 if ( !objectp(wurm=present(wurmname,TP)) )
82 return 0;
83
84 notify_fail("Das kannst Du nicht aufspiessen.\n");
85 if( !wurm->id(WURM_ID) )
86 return 0;
87
88 notify_fail("Worauf willst Du "+wurm->name(WEN,1)+" denn spiessen?\n");
89 if ( haken!="" && !id(haken) )
90 return 0;
91
92 notify_fail(break_string("Dazu solltest Du "+name(WEN,1)+" erst einmal "
93 "bei Dir haben.",78));
94 if ( environment(ME) != TP )
95 return 0;
96
97 notify_fail("An dem Haken haengt schon ein Koeder.\n");
98 if ( QueryKoeder() )
99 return 0;
100
101 // Haken und Koeder sind im Inventar und fuehlen sich von der Syntax
102 // angesprochen.
103 if( wurm->IsUnit() ) {
104 // Das QueryProp() ist nicht unnoetig. Bei der Abfrage von U_REQ wird
105 // U_REQ genullt, wenn das aktuelle query_verb() != dem letzten ist.
106 // Bei der ersten Abfrage wuerde also das hier gesetzte U_REQ wieder
107 // geloescht. Daher muss das jetzt hier als erstes einmal abgefragt
108 // werden...
109 wurm->QueryProp(U_REQ);
110 wurm->SetProp(U_REQ,1);
111 }
112 tell_object(TP, break_string(
113 "Du spiesst "+wurm->name(WEN,1)+" auf "+name(WEN,1)+".",78));
114 tell_room(environment(TP), break_string(
115 TP->Name(WER)+" spiesst "+wurm->name(WEN)+" auf "+name(WEN)+".",78),
116 ({TP}));
117 // M_GET, damit auch P_NODROP-Koeder aufgespiesst werden koennen.
118 if ( wurm->move(ME,M_GET) != MOVE_OK) {
119 tell_object(TP, break_string(
120 "Verdammt! Jetzt hast Du Dir fast in den Finger gestochen! "+
121 wurm->Name(WEN,1)+" hast Du dabei natuerlich verfehlt.", 78));
122 }
123 return 1;
124}
125
126int QueryKoeder(){
127 return objectp(present(WURM_ID, ME));
128}
129
130object QueryKoederObject() {
131 return present(WURM_ID,ME);
132}
133
134int MayAddObject(object ob) {
135 return (objectp(ob) && ob->id(WURM_ID) && sizeof(all_inventory(ME))<=1);
136}
137
138int _query_total_weight() {
139 int tw;
Arathorn2e164242020-07-27 23:49:19 +0200140 foreach(object w: all_inventory(ME)+({ME}))
MG Mud User88f12472016-06-24 23:31:02 +0200141 tw += w->QueryProp(P_WEIGHT);
142 return tw;
143}
144
145varargs int remove(int sil) {
146 all_inventory(ME)->remove(); // funktioniert auch mit leeren Arrays
147 return ::remove(sil);
148}
149
150int KoederGefressen() {
151 // Nicht QueryKoeder() pruefen, da das bei Spezialhaken immer 1 ist.
152 object koeder = present(WURM_ID, ME);
153 if ( objectp(koeder) )
154 return koeder->remove();
155 return -1;
156}