blob: 1b41d598b55f87bcdd22c7c04d4d90e80833bb8b [file] [log] [blame]
MG Mud User88f12472016-06-24 23:31:02 +02001
2/* 'reise' handling
3 *
4 * Ueberarbeitete und
5 * erweiterte Version: Tilly@MorgenGrauen, 10.01.02
6 * Basierend auf : base.c@SilberLand,
7 * Revision 3.55, Woody@SilberLand, 11.05.99
8 */
9#pragma strong_types
10#pragma save_types
11#pragma range_check
12#pragma no_clone
MG Mud User88f12472016-06-24 23:31:02 +020013
14#define NEED_PROTOTYPES
15#include <player.h>
16#include <living/moving.h>
17#include <thing/properties.h>
18#undef NEED_PROTOTYPES
19
20#include <properties.h>
21#include <config.h>
22#include <wizlevels.h>
23#include <moving.h>
24#include <living.h>
25#include <attributes.h>
26#include <defines.h>
27#include <new_skills.h>
28#include <combat.h>
29#include <transport.h>
30
31void create(){}
32
33private string _traveller(string *s)
34{
35 switch (sizeof(s))
36 {
37 case 1 : return s[0];
38 case 2 : return s[0]+" oder "+s[1];
39 }
40 return efun::implode(s[0..<2],", ")+" oder "+s[<1];
41}
42
43static int reise(string str)
44{
45 mixed t, ship, dstr;
46 string mit, nach, s1, s2;
47 int i;
48
49 _notify_fail("Syntax: reise mit <transportmittel> nach <zielort>\n\n"
50 "Weitere Syntaxen moeglich, bitte 'hilfe reise' lesen.\n");
51
52 t = QueryProp(P_TRAVEL_INFO);
53
54 if (!pointerp(t) || (sizeof(t) < 4) || !objectp(t[0]) || !objectp(t[1]))
55 {
56 SetProp(P_TRAVEL_INFO, t = 0);
57 }
58/* * * *
59 * REISE
60 * * * */
61 if (!str)
62 {
63 if (!t)
64 {
65 write("Du hast keine Reiseroute festgelegt.\n");
66 }
67 else if (t[0] == environment())
68 {
69 if (environment()->id("Transporter"))
70 {
71 write(sprintf("Du reist mit %s%s.\n",environment()->name(WEM,1),
72 t[2]?" "+t[3]:""));
73 }
74 else
75 {
76 write(sprintf("Du wirst mit %s%s reisen.\n",t[1]->name(WEM,1),
77 t[2]?" "+t[3]:""));
78 }
79 }
80 else
81 {
82 write(sprintf("Deine letzte Route (mit %s%s) ist hier nicht wirksam.\n",
83 t[1]->name(WEM,1),
84 t[2]?" "+t[3]:""));
85 }
86 return 1;
87 }
88
89 str = lower_case( _unparsed_args() );
90/* * * * * * *
91 * REISE ROUTE
92 * * * * * * */
93 if (str == "route")
94 {
95 string *harbours;
96
97 if (environment()->id("Transporter"))
98 {
99 if (environment()->QueryProp(P_NO_TRAVELING))
100 {
101 write(break_string(
102 capitalize(environment()->name(WER,1))+" hat gar keine "
103 "Reiseroute. Wo Dich das wohl hinfuehrt?",78));
104 return 1;
105 }
106
107 harbours = environment()->QueryHarbours(1);
108
109 if (!sizeof(harbours) || !stringp(harbours[0]))
110 {
111 write("Die Reiseroute "+environment()->name(WESSEN,1)+" ist "
112 +"leider nicht bekannt.\n");
113 }
114 else
115 {
116 write(break_string(capitalize(efun::implode(harbours," - "))+".",78,
117 "Reiseroute "+environment()->name(WESSEN,1)+": ",BS_INDENT_ONCE));
118 }
119 return 1;
120 }
121 if (environment()->QueryProp(P_NO_TRAVELING))
122 {
123 write(break_string("Hier kannst Du leider keine Reiseroute waehlen. "
124 "Was nicht heisst, dass hier kein Transportmittel "
125 "verkehrt.",78));
126 return 1;
127 }
128 if (!pointerp(ship = TRAVELD->HasTransporter(environment())))
129 {
130 _notify_fail("Hier verkehrt kein Transportmittel.\n");
131 return 0;
132 }
133
134 write("Hier verkehren folgende Transportmittel \n"
135 "--------------------------------------- \n");
136
137 for (i = 0; i < sizeof(ship); i++)
138 {
139 if (!ship[i]->Query(P_SHORT)) continue;
140
141 harbours = ship[i]->QueryHarbours(1);
142
143 if (sizeof(harbours) && stringp(harbours[0]))
144 {
145 write(break_string(efun::implode(harbours," - ")+".",78,
146 ship[i]->Query(P_SHORT)+": ",BS_INDENT_ONCE));
147 }
148 else
149 {
150 write(ship[i]->Query(P_SHORT)+": Route unbekannt.\n");
151 }
152 }
153 return 1;
154 }
155/* * * * * * *
156 * REISE AUS
157 * REISE NICHT
158 * * * * * * */
159 if (member((["aus","nicht"]),str))
160 {
161 if (!t)
162 {
163 write("Du hattest keine Reiseroute eingestellt.\n");
164 }
165 else
166 {
167 write("Du loeschst Deine Reiseroute.\n");
168 }
169 SetProp(P_TRAVEL_INFO, 0);
170 return 1;
171 }
172
173 str = regreplace(str,"\\<(zu|zum|zur|ins|ans)\\>","nach",0);
174/* * * * * * * * *
175 * REISE MIT NACH
176 * REISE NACH MIT
177 * * * * * * * * */
178 if ((sscanf(str, "mit %s nach %s", mit, nach) == 2) ||
179 (sscanf(str, "nach %s mit %s", nach, mit) == 2))
180 {
181 _notify_fail("Hier kannst Du leider keine Reiseroute waehlen.\n");
182
183 if (environment()->QueryProp(P_NO_TRAVELING))
184 {
185 return 0;
186 }
187 if (!sizeof(nach))
188 {
189 _notify_fail("Syntax: reise mit <transportmittel> nach <zielort>\n"
190 " reise nach <zielort> mit <transportmittel>\n");
191 return 0;
192 }
193 if (environment()->id("Transporter"))
194 {
195 if (environment()->id(mit))
196 {
197 command("reise nach "+nach);
198 return 1;
199 }
200 else
201 {
202 _notify_fail("Beende erstmal Deine aktuelle Reise mit "+
203 environment()->name(WEM,1)+".\n");
204 return 0;
205 }
206 }
207 if (!pointerp(ship = TRAVELD->HasTransporter(environment(), mit)))
208 {
209 _notify_fail("So ein Transportmittel verkehrt hier nicht.\n");
210 return 0;
211 }
212 for (i = sizeof(ship) -1 ; i >= 0; i--)
213 if (!ship[i]->HasRoute(nach))
214 {
215 ship[i] = 0;
216 }
217
218 ship -= ({0});
219
220 if (pointerp(t) && objectp(t[1]) && (member(ship,t[1]) != -1))
221 {
222 ship = ({ t[1] });
223 }
224 if (sizeof(ship) > 1)
225 {
226 if (object_name(environment()) == ship[0]->HasRoute(nach)[0])
227 {
228 _notify_fail("Aber da bist Du doch bereits.\n");
229 return 0;
230 }
231 write("Dorthin kannst Du mit "+CountUp(map_objects(ship,"name",WEM))
232 +"reisen.\n");
233
234
Arathorndc28afc2018-11-26 22:20:59 +0100235 dstr = filter(ship, function int (object x) {
Zesstraa9cfec12019-01-07 21:05:32 +0100236 return (environment(x) == environment() &&
237 stringp(x->short()));
Arathorndc28afc2018-11-26 22:20:59 +0100238 });
MG Mud User88f12472016-06-24 23:31:02 +0200239
240 if (sizeof(dstr))
241 {
242 ship = dstr[0];
243 }
244 else
245 {
246 ship = ship[0];
247 }
248
249 dstr = ship->HasRoute(nach);
250
251 write(sprintf("Du entscheidest Dich fuer %s und reist %s.\n",
252 ship->name(WEN,1),dstr[1]));
253 }
254 else if (sizeof(ship) < 1)
255 {
256 _notify_fail("Nach '"+capitalize(nach)+"' kann Dich das angegebene "
257 +"Transportmittel leider nicht bringen.\n");
258 return 0;
259 }
260 else
261 {
262 ship = ship[0];
263 dstr = ship->HasRoute(nach);
264
265 if (object_name(environment()) == dstr[0])
266 {
267 _notify_fail("Aber da bist Du doch bereits.\n");
268 return 0;
269 }
270 if (t && stringp(t[2]))
271 {
272 if (t[2] == dstr[0])
273 {
274 _notify_fail("Aber das tust Du doch bereits.\n");
275 return 0;
276 }
277 }
278 write(sprintf("Ok, Du reist nun mit %s %s.\n",
279 ship->name(WEM,1),dstr[1]));
280 }
281 if (environment(ship)==environment() && ship->short())
282 {
283 ship->Enter(this_object());
284 }
285 SetProp(P_TRAVEL_INFO, ({ environment(), ship, dstr[0], dstr[1] }) );
286 return 1;
287 }
288/* * * * * * *
289 * REISE NACH
290 * * * * * * */
291 if (sscanf(str,"nach %s",nach))
292 {
293 _notify_fail("Hier kannst Du leider keine Reiseroute waehlen.\n");
294
295 if (environment()->QueryProp(P_NO_TRAVELING))
296 {
297 return 0;
298 }
299 if (environment()->id("Transporter"))
300 {
301 if (!dstr = environment()->HasRoute(nach))
302 {
303 _notify_fail("Dorthin kann Dich "+environment()->name(WER,1)+
304 " leider nicht bringen.\n");
305 return 0;
306 }
307 if (t && stringp(t[2]))
308 {
309 if (t[2] == dstr[0])
310 {
311 _notify_fail("Aber das tust Du doch bereits.\n");
312 return 0;
313 }
314 }
315 write(sprintf("Ok, Du reist jetzt mit %s %s.\n",
316 environment()->name(WEM,1),dstr[1]));
317
318 if (IS_WIZARD(this_object()))
319 {
320 write("Als Magier nimmst Du natuerlich die Abkuerzung.\n");
321 move(dstr[0],M_NOCHECK);
322 return 1;
323 }
324 SetProp(P_TRAVEL_INFO,({ environment(),
325 environment(),
326 dstr[0],
327 dstr[1] }) );
328
329 if (object_name(environment(ship = environment())) == dstr[0] &&
330 ship->short())
331 {
332 environment()->Leave(this_object());
333
334 if (environment() != ship)
335 {
336 SetProp(P_TRAVEL_INFO, 0);
337 }
338 }
339 return 1;
340 }
341 if (!pointerp(ship = TRAVELD->HasTransporter(environment())))
342 {
343 _notify_fail("Von hier aus kannst Du nicht reisen.\n");
344 return 0;
345 }
346 for (i = sizeof(ship) - 1; i >= 0; i--)
347 if (!ship[i]->HasRoute(nach))
348 {
349 ship[i] = 0;
350 }
351
352 ship -= ({ 0 });
353
354 if (pointerp(t) && objectp(t[1]) && (member(ship,t[1]) != -1))
355 {
356 ship = ({ t[1] });
357 }
358 if (sizeof(ship) > 1)
359 {
360 if (object_name(environment()) == ship[0]->HasRoute(nach)[0])
361 {
362 _notify_fail("Aber da bist Du doch bereits.\n");
363 return 0;
364 }
365
366 write(break_string("Dahin kannst Du mit "
367 +_traveller(map_objects(ship, "name", WEM))+" gelangen.",78));
368
Arathorndc28afc2018-11-26 22:20:59 +0100369 dstr = filter(ship, function int (object x) {
Zesstraa9cfec12019-01-07 21:05:32 +0100370 return (environment(x) == environment() &&
371 stringp(x->short()));
Arathorndc28afc2018-11-26 22:20:59 +0100372 });
MG Mud User88f12472016-06-24 23:31:02 +0200373
374 if (sizeof(dstr))
375 {
376 ship = dstr[0];
377 }
378 else
379 {
380 ship = ship[0];
381 }
382
383 dstr = ship->HasRoute(nach);
384
385 write(sprintf("Du waehlst %s und reist %s.\n",ship->name(WEN,1),
386 dstr[1]));
387 }
388 else if (sizeof(ship) < 1)
389 {
390 _notify_fail("Nach '"+capitalize(nach)+"' kann Dich leider keines der "
391 +"hier verkehrenden Transportmittel bringen.\n");
392 return 0;
393 }
394 else
395 {
396 ship = ship[0];
397 dstr = ship->HasRoute(nach);
398
399 if (object_name(environment()) == dstr[0])
400 {
401 _notify_fail("Aber da bist Du ja bereits.\n");
402 return 0;
403 }
404 else if (t && stringp(t[2]))
405 {
406 if (t[2] == dstr[0])
407 {
408 _notify_fail("Aber das tust Du doch bereits.\n");
409 return 0;
410 }
411 }
412 write(sprintf("Ok, Du reist nun mit %s %s.\n",ship->name(WEM),
413 dstr[1]));
414 }
415 if (IS_WIZARD(this_object()))
416 {
417 write("Als Magier nimmst Du natuerlich die Abkuerzung.\n");
418 move(dstr[0],M_NOCHECK);
419 return 1;
420 }
421 if (environment(ship)==environment() && ship->short())
422 {
423 ship->Enter(this_object());
424 }
425 SetProp(P_TRAVEL_INFO, ({ environment(), ship, dstr[0], dstr[1] }) );
426 return 1;
427 }
428/* * * * * *
429 * REISE MIT
430 * * * * * */
431 if (sscanf(str, "mit %s", mit))
432 {
433 _notify_fail("Hier kannst Du leider keine Reiseroute waehlen.\n");
434
435 if (environment()->QueryProp(P_NO_TRAVELING))
436 {
437 return 0;
438 }
439 if (environment()->id("Transporter"))
440 {
441 if (environment()->id(mit))
442 {
443 _notify_fail("Aber das tust Du doch bereits.\n");
444 return 0;
445 }
446 else
447 {
448 _notify_fail("Beende erstmal Deine aktuelle Reise mit "+
449 environment()->name(WEM,1)+".\n");
450 return 0;
451 }
452 }
453 if (t && objectp(t[1]) && t[1]->id(mit) && t[0] == environment())
454 {
455 _notify_fail("Aber das tust Du doch bereits.\n");
456 return 0;
457 }
458 if (!pointerp(ship = TRAVELD->HasTransporter(environment(),mit)))
459 {
460 _notify_fail("So ein Transportmittel verkehrt hier nicht.\n");
461 return 0;
462 }
463 if (sizeof(ship) > 1)
464 {
465 write("'"+capitalize(mit)+"' koennte "
466 +_traveller(map_objects(ship,"name",WER))+" sein.\n");
467
Arathorndc28afc2018-11-26 22:20:59 +0100468 dstr = filter(ship, function int (object x) {
Zesstraa9cfec12019-01-07 21:05:32 +0100469 return (environment(x) == environment() &&
470 stringp(x->short()));
Arathorndc28afc2018-11-26 22:20:59 +0100471 });
MG Mud User88f12472016-06-24 23:31:02 +0200472
473 if (sizeof(dstr))
474 {
475 ship = dstr[0];
476 }
477 else
478 {
479 ship = ship[0];
480 }
481 write(sprintf("Du waehlst %s.\n", ship->name(WEN,1)));
482 }
483 else if (sizeof(ship) < 1)
484 {
485 notify_fail("So ein Transportmittel verkehrt hier nicht.\n");
486 return 0;
487 }
488 else
489 {
490 ship = ship[0];
491 write(sprintf("Du reist nun mit %s.\n",ship->name(WEM,1)));
492 }
493 if (environment(ship)==environment() && ship->short())
494 {
495 ship->Enter(this_object());
496 }
497 if (pointerp(t) && stringp(t[2]) && stringp(t[3]) &&
498 member(ship->QueryHarbours(),t[2]) != -1)
499 {
500 write("Du behaeltst Dein bisheriges Reiseziel ("+t[3]+") bei.\n");
501 SetProp(P_TRAVEL_INFO, ({ environment(), ship, t[2], t[3] }) );
502 }
503 else
504 {
505 SetProp(P_TRAVEL_INFO, ({ environment(), ship, 0, 0 }) );
506 }
507 return 1;
508 }
509 return 0;
510}
511