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