blob: ee52cb247d10ce24c800971b96c6c14f2102d04d [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");
165 return 1;
166 }
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 }
210 return 0;
211}
212
213static int cmd_leere(string str)
214{
215 object dest;
216 notify_fail("Was willst Du denn (wo hinein) leeren?\n");
217 if (!str)
218 return 0;
219
220 string strbottle,strobj;
221 // leere flasche
222 if (id(str))
223 {
224 //NOOP
225 }
226 // leere flasche in xxx
227 else if (sscanf(str,"%s in %s",strbottle,strobj)==2)
228 {
229 if (!id(strbottle))
230 return 0;
231 dest = present(strobj, environment(this_player()))
232 || present(strobj, this_player());
233 if (!dest)
234 return 0;
235 }
236 else
237 return 0;
238 // Syntaxpruefung fertig.
239
240 if(!QueryProp(P_WATER))
241 {
242 write("Da ist kein "+liquid_name+" drin!\n");
243 return 1;
244 }
245
246 if (dest)
247 {
248 write(break_string("Du leerst "+name(WEN,1)+ " in "
249 + dest->name(WEN) + ".",78));
250 say(break_string(TP->name()+" leert "+name(WEN,0)
251 + " in " + dest->name(WEN) + ".",78),TP);
252 transfer_to(dest);
253 return 1;
254 }
255 write(break_string("Du leerst "+name(WEN,1)+".",78));
256 say(break_string(TP->name()+" leert "+name(WEN,0)+".",78),TP);
257 empty();
258 return 1;
259}
260
261public int cmd_fuelle(string str)
262{
263 string strbottle,strobj;
264
265 notify_fail("Was willst Du denn (womit) fuellen?\n");
266 if(!str)
267 return 0;
268
269 // fuelle flasche
270 if (id(str))
271 {
272 if (fill_bottle(environment(this_player())))
273 {
274 write(break_string("Du fuellst etwas "+liquid_name+" in "
275 +name(WEN,1)+".",78));
276 say(break_string(TP->Name(WER)+" fuellt etwas "
277 +liquid_name+" in "+name(WEN)+".",78), TP);
278 }
279 return 1;
280 }
281 // fuelle flasche aus xxx
282 // fuelle flasche mit xxx
283 // fuelle xxx in flasche
284 // fuelle flasche in xxx
285 // fuelle xxx aus flasche
286 // fuelle xxx mit flasche
287 else if (sscanf(str,"%s in %s",strobj,strbottle)==2
288 || sscanf(str,"%s mit %s",strbottle,strobj)==2
289 || sscanf(str,"%s aus %s",strbottle,strobj)==2)
290 {
291 object obj;
292 // Flasche befuellen?
293 if (id(strbottle)
Zesstra3584a962016-07-26 16:00:08 +0200294 && ( ( obj=present(strobj, environment(this_player()))
295 || present(strobj, this_player()) )
296 || (strobj == lower_case(DEFAULT_LIQ)
297 && environment(this_player())->QueryProp(P_WATER)<W_OTHER)
298 )
299
MG Mud User88f12472016-06-24 23:31:02 +0200300 )
301 {
Zesstra3584a962016-07-26 16:00:08 +0200302 if (fill_bottle(obj || environment(this_player())))
MG Mud User88f12472016-06-24 23:31:02 +0200303 {
304 write(break_string(
Zesstra3584a962016-07-26 16:00:08 +0200305 "Du fuellst etwas "+liquid_name
306 + (obj ? " aus " + obj->name(WEM,1) : "")
MG Mud User88f12472016-06-24 23:31:02 +0200307 + " in "+name(WEN,1)+".",78));
Zesstra3584a962016-07-26 16:00:08 +0200308 say(break_string(TP->Name(WER)+" fuellt etwas "+liquid_name
309 + (obj ? " aus " + obj->name(WEM,1) : "")
310 + " in "+name(WEN)+".",78), TP);
MG Mud User88f12472016-06-24 23:31:02 +0200311 }
312 return 1;
313 }
314 // anderes Gefaess befuellen?
315 else if (id(strobj)
316 && ( obj=present(strbottle, environment(this_player()))
317 || present(strbottle, this_player()) )
318 )
319 {
320 if (transfer_to(obj))
321 {
322 write(break_string(
323 "Du fuellst etwas "+liquid_name+" aus " + name(WEM,1)
324 + " in "+obj->name(WEN,1)+".",78));
325 say(break_string(TP->Name(WER)+" fuellt etwas "+liquid_name+ " aus "
326 + name(WEM,1) + " in "+obj->name(WEN)+".",78), TP);
327 }
328 return 1;
329 }
330 }
331 // Syntax passt nicht.
332 return 0;
333}
334
335int IsBottle() {
336 return 1;
337}
338