blob: dd4365bc8fa6e2124f08fbad06492a86fa5bda1d [file] [log] [blame]
MG Mud User88f12472016-06-24 23:31:02 +02001/*OBJ*/
2/* 2013-Mai-23, Arathorn
3 Umfassend ueberarbeitet; setup(), init() und ReplaceWasser() entsorgt,
4 P_WEIGHT und P_LONG dynamisch gebaut, so dass das staendige Umsetzen
5 der Properties mittels setup() nach jedem Fuellen/Leeren entfaellt.
6 */
7
8/* Letzte Aenderung: 4.5.2004, Arathorn.
9 Zeile 149: cont_obj->remove() eingefuegt, damit das geclonte Objekt
10 nach dem Abfragen seines Namens wieder entfernt wird.
11 Update 6.6.2004, Arathorn. Habe um ein destruct() ergaenzt, weil das
12 trotz remove() hartnaeckig weitergebuggt hat. *fluch*
13 */
14
15/* Version 1.3 by Fraggle (17.1.1995) */
16
17 // PreventInsert: verhindert Fuellen wie std/container
18/* Version 1.2 by Fraggle (17.1.1995) */
19
20 // Flasche kann nun mittels environment(TP)->GetLiquid()
21 // etwas anderes als Wasser enthalten, sofern
22 // environment(TP)->QueryProp(P_WATER)==W_OTHER
23 // BUG: auch 1l Methan wiegt 1 Kg, aendere ich spaeter
24
25/* Version 1.1 by Fraggle (17.1.1995) */
26#pragma strong_types,rtt_checks
27#pragma no_clone
28
29inherit "/std/thing";
30#include <language.h>
31#include <properties.h>
32#include <items/flasche.h>
33#include <items/fishing/fishing.h>
34
35#define DEFAULT_LIQ "Wasser"
36#define TP this_player()
37
38private string co_filename;
39public string liquid_name=DEFAULT_LIQ;
40
41string dynamic_long();
42
43protected void create() {
44 ::create();
45
46 AddId(({"wasserbehaelter","behaelter","\nwater_source"}));
47 SetProp(P_NAME, "Wasserbehaelter");
48 SetProp(P_GENDER , MALE);
49 SetProp(P_ARTICLE, 1);
50 SetProp(P_SHORT, "Ein Standard-Wasserbehaelter");
51 SetProp(P_LONG,"none");
52 Set(P_LONG, #'dynamic_long, F_QUERY_METHOD);
53 SetProp(P_LONG_EMPTY,""); // Beschreibung fuer leeren Zustand
54 SetProp(P_LONG_FULL,""); // Beschreibung fuer gefuellten Zusand
55 SetProp(P_LIQUID,1000); // Fuellmenge = 1 Liter
56 SetProp(P_WATER,0); // Flasche ist defaultmaessig leer!
57 SetProp(P_VALUE,10);
58
59 // P_WEIGHT auf Leergewicht der Flasche setzen, QueryMethode liefert
60 // die Summe aus Leergewicht+Fuellung zurueck (Dichte = 1).
61 SetProp(P_WEIGHT,20);
62 Set(P_WEIGHT, function int () {
63 return ( Query(P_WEIGHT,F_VALUE)+
64 (QueryProp(P_WATER)?QueryProp(P_LIQUID):0) );
65 }, F_QUERY_METHOD);
66
67 AddCmd(({"fuell","fuelle"}),"cmd_fuelle");
68 AddCmd(({"leere", "entleere"}),"cmd_leere");
69}
70
71protected void create_super() {
72 set_next_reset(-1);
73}
74
75// Behaelter ist gefuellt, dann ist die Langbeschreibung entweder die
76// P_LONG_FULL, falls angegben, oder die P_LONG + Beschreibung der Fuellung.
77// Genauso, wenn sie leer ist.
78string dynamic_long() {
79 string l=Query(P_LONG,F_VALUE);
80 if ( QueryProp(P_WATER) ) {
81 string lf = QueryProp(P_LONG_FULL);
82 if ( stringp(lf) && sizeof(lf) )
83 l=lf;
84 else
85 l+=capitalize(QueryPronoun(WER))+" enthaelt "+liquid_name+".\n";
86 // Falls die Flasche mit etwas anderem als Wasser gefuellt wird, die
87 // Langbeschreibung fuer "volle Flasche" (P_LONG_FULL) aber nur fuer
88 // Wasser ausgelegt ist, wird "Wasser" durch den Inhalt von liquid_name
89 // ersetzt.
90 if ( liquid_name != DEFAULT_LIQ )
91 l=regreplace(l, DEFAULT_LIQ, liquid_name, 1);
92 } else {
93 string le = QueryProp(P_LONG_EMPTY);
94 if ( stringp(le) && sizeof(le) )
95 l=le;
96 else
97 l+=capitalize(QueryPronoun(WER))+" ist leer.\n";
98 }
99 return l;
100}
101
102// Zum Ueberschreiben! PreventInsert(object ob){return 0;} z.B.
103// macht die Flasche gasdicht.
104// Oder man kann die Flasche verschliessbar machen.
105int PreventInsert(object obj)
106{
107 if(obj->id("gas")) { //default: NICHT Gasdicht!
108 write(obj->Name(WER,1)+" entweicht sofort wieder!\n");
109 return 1;
110 }
111 return 0;
112}
113
114// Transferiert den Inhalt der Flasche an <dest>
115protected int transfer_to(object dest)
116{
117 int water=QueryProp(P_WATER);
118 if (!water)
119 {
120 write(Name(WER,1) + " ist schon leer!\n");
121 return 0; // War schon leer!
122 }
123 int contents=QueryProp(P_LIQUID);
124
125 if ( water&W_OTHER )
126 {
127 dest->PutLiquid(co_filename);
128 }
129 else
130 {
131 dest->AddWater(contents);
132 }
133 SetProp(P_WATER,0);
134 RemoveId(lower_case(liquid_name));
135 liquid_name=DEFAULT_LIQ;
136 return contents; //gib die ml an Umgebung ab :)
137}
138
139// Entleert die Flasche ins Environment der Flasche, allerdings nicht, wenn
140// dies ein Lebewesen ist, dann wird das Environment von dem genommen.
141// TODO: Eine Flasche in einem Paket leeren wurde dann in das paket entleeren.
142// Das waere an sich sogar richtig... Nur: gewollt? Alternative koennen wir
143// auch das aeusserste Environment nehmen, was nicht lebt.
144public int empty()
145{
146 if (environment())
147 {
148 // Environment des Benutzers finden.
149 object env = environment();
150 while (living(env))
151 env=environment(env);
152 return transfer_to(env);
153 }
154 return 0;
155}
156
157// Fuellt die Flasche aus <src>
158protected int fill_bottle(object src)
159{
160 int liquidtype = src->QueryProp(P_WATER);
161 if(liquidtype)
162 {
163 if(QueryProp(P_WATER)) {
164 write(Name(WER,1)+" ist bereits voll!\n");
Arathorn1058e9e2020-12-28 11:30:00 +0100165 return 0;
MG Mud User88f12472016-06-24 23:31:02 +0200166 }
MG Mud User88f12472016-06-24 23:31:02 +0200167 if(liquidtype&W_OTHER)
168 {
Zesstra7221c9f2018-03-06 21:20:45 +0100169 object cont_obj;
MG Mud User88f12472016-06-24 23:31:02 +0200170 // Mittels GetLiquid() kann die Flasche mit was anderem als Wasser
171 // gefuellt werden.
172 co_filename=src->GetLiquid();
173 if (co_filename)
174 {
175 cont_obj=clone_object(co_filename);
176 if(PreventInsert(cont_obj))
177 {
178 // Hier passiert eigentlich das gleiche wie nach dem ifblock, aber
179 // auch noch Funktion beenden.
MG Mud User88f12472016-06-24 23:31:02 +0200180 // TODO: Die Meldung aus dem PreventInsert() muesste eigentlich
181 // _vorher_ noch mit einer Befuellmeldung begleitet werden.
182 cont_obj->remove(1);
183 if ( objectp(cont_obj) )
184 cont_obj->move("/room/muellraum",M_PUT);
185 cont_obj=0;
186 return 0;
187 }
188 else
189 liquid_name=cont_obj->name(WEN);
190 // In jedem Fall wird das Objekt wieder zerstoert - es wurde nur fuer
191 // das Ermitteln des liquid_name benutzt... Weia.
192 if ( cont_obj ) cont_obj->remove();
193 if ( cont_obj ) cont_obj->move("/room/muellraum",M_PUT);
194 }
195 }
Zesstra7221c9f2018-03-06 21:20:45 +0100196 // Wasser von Umgebung abziehen!
197 // Man kann als Magier die Funktion AddWater(int n) dazu benuetzten,
198 // beispielsweise eine Pfuetze zu leeren, ...
199 src->AddWater(-QueryProp(P_LIQUID));
MG Mud User88f12472016-06-24 23:31:02 +0200200 SetProp(P_WATER,liquidtype);
201 AddId(lower_case(liquid_name));
202 //wie praktisch, 1 ml == 1 g :) // Aber nur fuer Wasser, du VOGEL! :-|
203 return 1;
204 }
205 else {
206 write("Du findest hier nichts, was Du in "+name(WEN,1)+
207 " fuellen koenntest!\n");
208 return 0;
209 }
MG Mud User88f12472016-06-24 23:31:02 +0200210}
211
212static int cmd_leere(string str)
213{
214 object dest;
215 notify_fail("Was willst Du denn (wo hinein) leeren?\n");
216 if (!str)
217 return 0;
218
219 string strbottle,strobj;
220 // leere flasche
221 if (id(str))
222 {
223 //NOOP
224 }
225 // leere flasche in xxx
226 else if (sscanf(str,"%s in %s",strbottle,strobj)==2)
227 {
228 if (!id(strbottle))
229 return 0;
230 dest = present(strobj, environment(this_player()))
231 || present(strobj, this_player());
232 if (!dest)
233 return 0;
234 }
235 else
236 return 0;
237 // Syntaxpruefung fertig.
238
239 if(!QueryProp(P_WATER))
240 {
241 write("Da ist kein "+liquid_name+" drin!\n");
242 return 1;
243 }
244
245 if (dest)
246 {
247 write(break_string("Du leerst "+name(WEN,1)+ " in "
248 + dest->name(WEN) + ".",78));
249 say(break_string(TP->name()+" leert "+name(WEN,0)
250 + " in " + dest->name(WEN) + ".",78),TP);
251 transfer_to(dest);
252 return 1;
253 }
254 write(break_string("Du leerst "+name(WEN,1)+".",78));
255 say(break_string(TP->name()+" leert "+name(WEN,0)+".",78),TP);
256 empty();
257 return 1;
258}
259
260public int cmd_fuelle(string str)
261{
262 string strbottle,strobj;
263
264 notify_fail("Was willst Du denn (womit) fuellen?\n");
265 if(!str)
266 return 0;
267
268 // fuelle flasche
269 if (id(str))
270 {
271 if (fill_bottle(environment(this_player())))
272 {
273 write(break_string("Du fuellst etwas "+liquid_name+" in "
274 +name(WEN,1)+".",78));
275 say(break_string(TP->Name(WER)+" fuellt etwas "
276 +liquid_name+" in "+name(WEN)+".",78), TP);
277 }
278 return 1;
279 }
280 // fuelle flasche aus xxx
281 // fuelle flasche mit xxx
282 // fuelle xxx in flasche
283 // fuelle flasche in xxx
284 // fuelle xxx aus flasche
285 // fuelle xxx mit flasche
286 else if (sscanf(str,"%s in %s",strobj,strbottle)==2
287 || sscanf(str,"%s mit %s",strbottle,strobj)==2
288 || sscanf(str,"%s aus %s",strbottle,strobj)==2)
289 {
290 object obj;
291 // Flasche befuellen?
292 if (id(strbottle)
Zesstra3584a962016-07-26 16:00:08 +0200293 && ( ( obj=present(strobj, environment(this_player()))
294 || present(strobj, this_player()) )
295 || (strobj == lower_case(DEFAULT_LIQ)
296 && environment(this_player())->QueryProp(P_WATER)<W_OTHER)
297 )
298
MG Mud User88f12472016-06-24 23:31:02 +0200299 )
300 {
Zesstra3584a962016-07-26 16:00:08 +0200301 if (fill_bottle(obj || environment(this_player())))
MG Mud User88f12472016-06-24 23:31:02 +0200302 {
303 write(break_string(
Zesstra3584a962016-07-26 16:00:08 +0200304 "Du fuellst etwas "+liquid_name
305 + (obj ? " aus " + obj->name(WEM,1) : "")
MG Mud User88f12472016-06-24 23:31:02 +0200306 + " in "+name(WEN,1)+".",78));
Zesstra3584a962016-07-26 16:00:08 +0200307 say(break_string(TP->Name(WER)+" fuellt etwas "+liquid_name
308 + (obj ? " aus " + obj->name(WEM,1) : "")
309 + " in "+name(WEN)+".",78), TP);
MG Mud User88f12472016-06-24 23:31:02 +0200310 }
311 return 1;
312 }
313 // anderes Gefaess befuellen?
314 else if (id(strobj)
315 && ( obj=present(strbottle, environment(this_player()))
316 || present(strbottle, this_player()) )
317 )
318 {
319 if (transfer_to(obj))
320 {
321 write(break_string(
322 "Du fuellst etwas "+liquid_name+" aus " + name(WEM,1)
323 + " in "+obj->name(WEN,1)+".",78));
324 say(break_string(TP->Name(WER)+" fuellt etwas "+liquid_name+ " aus "
325 + name(WEM,1) + " in "+obj->name(WEN)+".",78), TP);
326 }
327 return 1;
328 }
329 }
330 // Syntax passt nicht.
331 return 0;
332}
333
334int IsBottle() {
335 return 1;
336}
337