blob: c37dcbec30ab6bd89ec271d2fb0db8661038a4a5 [file] [log] [blame]
MG Mud User88f12472016-06-24 23:31:02 +02001// MorgenGrauen MUDlib
2//
3// death_room.c -- Der Todesraum
4//
5// $Id: death_room.c 9138 2015-02-03 21:46:56Z Zesstra $
6
7
Zesstra3882c2d2020-07-27 22:37:17 +02008#pragma strong_types,rtt_checks
MG Mud User88f12472016-06-24 23:31:02 +02009
10#include <defines.h>
11#include <properties.h>
12#include <moving.h>
13#include <language.h>
14#include <wizlevels.h>
15#include <daemon.h>
16#include <new_skills.h>
17
18inherit "/std/room";
Zesstra39d1d2b2020-09-28 23:53:04 +020019nosave variables inherit "/std/channel_supervisor";
MG Mud User88f12472016-06-24 23:31:02 +020020
21mixed *players;
22mapping msgCache;
23
24
25private void flush( int unusedOnly );
26private string expand( string table, int value );
27private string parseText( string msg, object pl );
28private void do_remove();
29private varargs mixed get_sequence( string str );
30void add_player( object pl );
31static int filter_ldfied( string str );
32public int SmartLog( string creat, string myname, string str, string date );
33public mixed hier_geblieben( mixed dest, int methods, string direction,
34 string textout, string textin );
Arathorn306aa032018-08-29 22:18:28 +020035
36public varargs void init(object oldenv)
MG Mud User88f12472016-06-24 23:31:02 +020037{
38 this_player()->move("/room/death/virtual/death_room_"+getuid(this_player()),
39 M_NOCHECK|M_SILENT|M_NO_SHOW);
40 return;
41}
42
43public void create()
44{
Zesstra39d1d2b2020-09-28 23:53:04 +020045 if (IS_CLONE(this_object())) return;
MG Mud User88f12472016-06-24 23:31:02 +020046 ::create();
Zesstra39d1d2b2020-09-28 23:53:04 +020047 ch_read_init_file();
48
MG Mud User88f12472016-06-24 23:31:02 +020049 players = ({});
50 flush(0);
51
52 SetProp( P_NAME, "Lars" );
53 SetProp( P_GENDER, MALE );
54 SetProp( P_ARTICLE, 0 );
55 SetProp( P_LIGHT,1 );
56 SetProp( P_NO_TPORT, NO_TPORT_OUT );
57 SetProp( P_LOG_FILE, "TOD/Todesraum" );
58 SetProp( P_INT_SHORT, "Arbeitszimmer des Todes" );
59 SetProp( P_INT_LONG, break_string(
60 "Ein dunkler Raum, erleuchtet von dunklem Licht, das sich der "
61 "Dunkelheit nicht so sehr zu widersetzen scheint, indem es "
62 "leuchtet, als dass es der dunkelste Punkt in einer weniger "
63 "dunklen Umgebung ist. Im seltsamen Licht erkennst Du einen "+
64 "zentral aufgestellten Schreibtisch, der mit Diagrammen und "
65 "Buechern bedeckt ist. Die Waende verschwinden hinter Regalen, "
66 "die gefuellt sind mit in Leder gebundenen, dunklen Waelzern, "
67 "von denen geheimnisvolle Runen leuchten.\nTod.", 78, 0, 1 ) );
68}
69
Zesstra300b2122020-10-02 20:44:34 +020070public int ch_check_access(string ch, object user, string cmd) {
71 // sich selber fuer alles erlauben
72 if (user==this_object())
73 return 1;
74
75 return channel_supervisor::ch_check_access(ch, user, cmd);
76}
77
Zesstra39d1d2b2020-09-28 23:53:04 +020078public varargs string name(int casus,int demon)
79{
80 return room::name(casus, demon);
81}
82
83public varargs string Name(int casus, int demon)
84{
85 return room::Name(casus, demon);
86}
MG Mud User88f12472016-06-24 23:31:02 +020087
88public void reset()
89{
90 ::reset();
91 flush(1);
92}
93
94private void flush( int unusedOnly )
95{
96 string *mi;
97 int i;
98
99 if ( unusedOnly ){
100 if ( i = sizeof(mi = m_indices(msgCache)) ){
101 for ( ; i--; )
102 if ( msgCache[mi[i], 1] )
103 msgCache[mi[i], 1] = 0;
104 else
105 msgCache = m_copy_delete( msgCache, mi[i] );
106 }
107 }
108 else
109 msgCache = ([]);
110}
111
112
113private string expand( string table, int value )
114{
115 int sz, wert, i;
116 string *texte;
117
118 sz = sizeof( texte = explode( table, "##" ) - ({""}) );
119
120 for ( i = 0; i < sz; i++ )
121 if ( i%2 ){
122 sscanf( texte[i], "%d", wert );
123
124 if ( value < wert )
125 break;
126 }
127 else
128 table = texte[i];
129
130 return table;
131}
132
133
134#define TOS(s) s[<1]
135#define STOS(s) s[<2]
136#define PUSH(x,s) (s+= ({ x }))
137#define POP(s) (s=s[0..<2])
138
139// ziemlich vom htmld abgekupfert ;)
140private string
141parseText( string msg, object pl )
142{
143 string *words, *texte, *todo, *done;
144 int endFlag;
145
146 int sz = sizeof( words = regexplode(msg, "[<][^>]*[>]") );
147 todo = ({ });
148 done = ({""});
149
150 for ( int i=1; i<sz; i+=2 ){
151 string cmd = words[i][1..<2];
152 TOS(done) += words[i-1];
153
154 if ( cmd[0] == '/' ){
155 endFlag = 1;
156 cmd = cmd[1..];
157 }
158 else
159 endFlag = 0;
160
161 switch( cmd[0] ){
162 case 'A': /*** Alignment ersetzen ***/
163 if (!endFlag){
164 PUSH( cmd, todo );
165 PUSH( "", done );
166 }
167 else
168 if ( todo[<1] == "A" ){
Zesstra3882c2d2020-07-27 22:37:17 +0200169 STOS(done) += expand(TOS(done), ({int}) pl->QueryProp(P_ALIGN));
MG Mud User88f12472016-06-24 23:31:02 +0200170 done = done[0..<2];
171 todo = todo[0..<2];
172 }
173 break;
174
175 case 'D': /*** Tode ersetzen ***/
176 if ( !endFlag ){
177 PUSH( cmd, todo );
178 PUSH( "", done );
179 }
180 else
181 if ( todo[<1] == "D" ){
Zesstra3882c2d2020-07-27 22:37:17 +0200182 STOS(done) += expand(TOS(done), ({int}) pl->QueryProp(P_DEADS));
MG Mud User88f12472016-06-24 23:31:02 +0200183 POP(done);
184 POP(todo);
185 }
186 break;
187
188 case 'L': /*** Level ersetzen ***/
189 if ( !endFlag ){
190 PUSH( cmd, todo );
191 PUSH( "", done );
192 }
193 else
194 if ( todo[<1] == "L" ){
Zesstra3882c2d2020-07-27 22:37:17 +0200195 STOS(done) += expand(TOS(done), ({int}) pl->QueryProp(P_LEVEL));
MG Mud User88f12472016-06-24 23:31:02 +0200196 POP(done);
197 POP(todo);
198 }
199 break;
200
201 case 'Z': /*** Zufall ersetzen ***/
202 if ( !endFlag ){
203 PUSH( cmd, todo );
204 PUSH( "", done );
205 }
206 else{
207 if ( todo[<1][0] == 'Z'){
208 int cnt, rnd, wert, sz2;
209
210 if ( !sscanf(todo[<1], "Z=%d", rnd) )
211 STOS(done) += "\n###\n### Syntax Error in <Z>!\n###\n\n";
212 else {
213 rnd = random(rnd);
214 sz2 = sizeof( texte = explode(TOS(done), "##") );
215 wert=0;
216 cnt=0;
217
218 for ( int k = 1; k < sz2; k += 2 ){
219 sscanf( texte[k], "%d", wert );
220 cnt += wert;
221 if ( rnd < cnt ) {
222 STOS(done) += texte[k+1];
223 break;
224 }
225 }
226 }
227 POP(done);
228 POP(todo);
229 }
230 }
231 break;
232
233 case 'G': /*** Gender ersetzen ***/
234 if ( !endFlag ){
235 PUSH( cmd, todo );
236 PUSH( "", done );
237 }
238 else{
239 if( sizeof( texte = regexplode(TOS(done), ":") ) == 3 )
Zesstra3882c2d2020-07-27 22:37:17 +0200240 STOS(done) += texte[2*(({int}) pl->QueryProp(P_GENDER)
MG Mud User88f12472016-06-24 23:31:02 +0200241 == FEMALE)];
242 POP(done);
243 POP(todo);
244 }
245 break;
246
247 case 'R': /*** Rasse ersetzen ***/
248 if ( !endFlag ){
249 PUSH( cmd, todo );
250 PUSH( "", done );
251 }
252 else{
253 int race;
254
255 texte = regexplode( TOS(done), "\\|" );
256 race = 2 * (member( ({ "Mensch", "Elf", "Zwerg", "Hobbit",
257 "Feline", "Dunkelelf" }),
Zesstra3882c2d2020-07-27 22:37:17 +0200258 ({string}) pl->QueryProp(P_RACE) ) + 1);
MG Mud User88f12472016-06-24 23:31:02 +0200259
260 if ( race >= sizeof(texte) )
261 race = 0;
262
263 STOS(done) += texte[race];
264 POP(done);
265 POP(todo);
266 }
267 break;
268
269 case 'n': /*** Name, normal geschrieben ***/
Arathornc0bc29e2020-12-28 11:02:57 +0100270 TOS(done) += ({string})pl->name(RAW);
MG Mud User88f12472016-06-24 23:31:02 +0200271 break;
272
273 case 'N': /*** Name, in Grossbuchstaben ***/
Zesstra3882c2d2020-07-27 22:37:17 +0200274 TOS(done) += upperstring(({string})pl->name(RAW));
MG Mud User88f12472016-06-24 23:31:02 +0200275 break;
276 }
277 }
278 PUSH( words[<1], done );
279 return implode( done, "" );
280}
281
282
283public void heart_beat()
284{
285 for ( int j = sizeof(players); j--; )
286 if ( !objectp(players[j][0]) ||
287 environment(players[j][0]) !=
288 find_object("/room/death/virtual/death_room_"+getuid(players[j][0])) )
289 players[j] = 0;
290
291 players -= ({0});
292
293 if ( !sizeof(players) ) {
294 set_heart_beat(0);
295 return;
296 }
297
298 for ( int j = sizeof(players); j--; ) {
299 int nr;
300 string msg;
301
302 nr = ++players[j][1];
303
304 if ( mappingp(players[j][2]) )
305 msg = players[j][2][nr];
306 else
307 msg = 0;
308
309 if ( !msg )
310 msg = players[j][3][1][nr];
311
312 if ( msg )
313 tell_object( players[j][0], parseText( msg, players[j][0] ) );
314 }
315
316 do_remove();
317}
318
319private void
320do_remove()
321{
322 int res;
323 string prayroom;
324 object plobj, pl;
325
326 for ( int j = sizeof(players); j--; ){
327 if ( players[j][1] >= players[j][3][0]){
328 pl = players[j][0];
329 while ( plobj = present("\ndeath_mark", pl) )
330 plobj->remove();
331
Arathornc0bc29e2020-12-28 11:02:57 +0100332 if ( !(prayroom = ({string}) pl->QueryPrayRoom()) )
MG Mud User88f12472016-06-24 23:31:02 +0200333 prayroom="/room/pray_room";
334
335 pl->Set( P_TMP_MOVE_HOOK, 0 );
336 pl->Set( P_NO_ATTACK, 0, F_QUERY_METHOD );
337 pl->Set( P_LAST_KILLER, 0 );
338 pl->Set( P_KILLER, 0 );
339 pl->Set( P_ENEMY_DEATH_SEQUENCE, 0 );
340 pl->Set( P_NEXT_DEATH_SEQUENCE, 0 );
341 pl->Set( P_POISON, 0, F_QUERY_METHOD );
342
Arathornc0bc29e2020-12-28 11:02:57 +0100343 if ( catch( res = ({int}) pl->move(prayroom, M_GO|M_SILENT|M_NOCHECK) )
MG Mud User88f12472016-06-24 23:31:02 +0200344 || res < 1 )
345 pl->move( "/room/pray_room", M_GO|M_NOCHECK );
346
347 players[j] = 0;
348 }
349 }
350
351 players -= ({0});
352
353 if ( !sizeof(players) )
354 set_heart_beat(0);
355}
356
357private varargs mixed
358get_sequence( string str )
359{
360 string *sequences;
361 int i, len, cacheable;
362
363 if ( !stringp(str) || catch( len = file_size(str) ) || len <= 0 ){
364 sequences = get_dir( "/room/death/sequences/*" ) - ({ ".", "..", ".svn" });
365 str = "/room/death/sequences/" + sequences[random( sizeof(sequences) )];
366 }
367
368 if ( cacheable = ((sizeof(str) > 21) &&
369 (str[0..21] == "/room/death/sequences/")) ){
370 if ( member(msgCache, str) ){
371 msgCache[str, 1] = 1; // Touch it!
372 return ({ msgCache[str], str });
373 }
374 }
375
376 sequences = explode( read_file(str), "\n" );
377 sscanf( sequences[0], "%d", len );
378 string seq = implode( sequences[1..], "\n" );
379 sequences = regexplode( seq, "[0-9][0-9]*:" );
380 mapping m = ([]);
381
382 for ( i = 1; i < sizeof(sequences)-1; i += 2 )
383 m[(int) sequences[i]] = sequences[i+1];
384
385 if ( cacheable )
386 msgCache += ([ str: ({ len, m }); 1 ]);
387
388 return ({ ({ len, m }), str });
389}
390
391// Description: Adds a player to the list
392void add_player( object pl )
393{
394 int kart, kgen;
395 int escaped;
396 object kill_liv, kill_ob;
397 mixed dseq, act_seq, killer_name, killer_msg;
398
399 set_heart_beat(1);
400 kgen = MALE;
401
402 foreach(object prev : caller_stack(1)) {
403 if ( !objectp(prev) || prev == pl )
404 continue;
405
406 string fn = object_name(prev);
407
408 if ( fn[0..12] == "/secure/login" && !kill_liv ){
409 escaped = 1;
410 break;
411 }
412
413 if ( fn[0..7] == "/secure/" && fn[0..13] != "/secure/merlin" )
414 continue;
415
416 if ( fn[0..21] == "/room/death/death_mark" )
417 continue;
418
419 if ( living(prev) ){
420 kill_liv = prev; // Killer
421 break;
422 }
423
424 kill_ob = prev; // killendes Objekt
425 }
426
Arathorn6fa8c9e2020-08-05 13:29:02 +0200427 string|object pre = pl->QueryProp(P_KILLER);
MG Mud User88f12472016-06-24 23:31:02 +0200428 if ( objectp(pre) ) {
Zesstra3882c2d2020-07-27 22:37:17 +0200429 dseq = pre->QueryProp(P_ENEMY_DEATH_SEQUENCE);
MG Mud User88f12472016-06-24 23:31:02 +0200430
Zesstra3882c2d2020-07-27 22:37:17 +0200431 if( !(killer_name = pre->QueryProp(P_KILL_NAME)) ){
432 killer_name = pre->QueryProp(P_NAME);
Arathornc0bc29e2020-12-28 11:02:57 +0100433 kart = ({int}) pre->QueryProp(P_ARTICLE);
434 kgen = ({int}) pre->QueryProp(P_GENDER);
MG Mud User88f12472016-06-24 23:31:02 +0200435 }
436
Zesstra3882c2d2020-07-27 22:37:17 +0200437 killer_msg = pre->QueryProp(P_KILL_MSG);
MG Mud User88f12472016-06-24 23:31:02 +0200438 }
439
440 if ( !killer_name && kill_liv && function_exists( "QueryProp", kill_liv ) ){
Zesstra3882c2d2020-07-27 22:37:17 +0200441 dseq = kill_liv->QueryProp(P_ENEMY_DEATH_SEQUENCE);
MG Mud User88f12472016-06-24 23:31:02 +0200442
Zesstra3882c2d2020-07-27 22:37:17 +0200443 if( !(killer_name = kill_liv->QueryProp(P_KILL_NAME)) ){
444 killer_name = kill_liv->QueryProp(P_NAME);
Arathornc0bc29e2020-12-28 11:02:57 +0100445 kart = ({int}) kill_liv->QueryProp(P_ARTICLE);
446 kgen = ({int}) kill_liv->QueryProp(P_GENDER);
MG Mud User88f12472016-06-24 23:31:02 +0200447 }
448
Zesstra3882c2d2020-07-27 22:37:17 +0200449 killer_msg = kill_liv->QueryProp(P_KILL_MSG);
MG Mud User88f12472016-06-24 23:31:02 +0200450 pre = kill_liv;
451 }
452
453 if ( !killer_name && kill_ob && function_exists( "QueryProp", kill_ob ) ){
Zesstra3882c2d2020-07-27 22:37:17 +0200454 dseq = kill_ob->QueryProp(P_ENEMY_DEATH_SEQUENCE);
MG Mud User88f12472016-06-24 23:31:02 +0200455
Zesstra3882c2d2020-07-27 22:37:17 +0200456 if( !(killer_name = kill_ob->QueryProp(P_KILL_NAME)) ){
457 killer_name = kill_ob->QueryProp(P_NAME);
Arathornc0bc29e2020-12-28 11:02:57 +0100458 kart = ({int}) kill_ob->QueryProp(P_ARTICLE);
459 kgen = ({int}) kill_ob->QueryProp(P_GENDER);
MG Mud User88f12472016-06-24 23:31:02 +0200460 }
461
Zesstra3882c2d2020-07-27 22:37:17 +0200462 killer_msg = kill_ob->QueryProp(P_KILL_MSG);
MG Mud User88f12472016-06-24 23:31:02 +0200463 pre = kill_ob;
464 }
465
466 // falls keine Sequenz gesetzt, eventuelle eigene Todessequenz nehmen
467 if (!dseq)
Zesstra3882c2d2020-07-27 22:37:17 +0200468 dseq = ({<string|mapping|mixed*>})pl->QueryProp(P_NEXT_DEATH_SEQUENCE);
MG Mud User88f12472016-06-24 23:31:02 +0200469
470 act_seq = 0;
471
472 if ( mappingp(dseq) )
473 act_seq = get_sequence( "/room/death/sequences/lars" );
474 else if ( pointerp(dseq) ) // ganze Todessequenz...
475 act_seq = ({ dseq, 0 });
476 else if ( stringp(dseq) )
477 act_seq = get_sequence(dseq);
478
Zesstra3882c2d2020-07-27 22:37:17 +0200479 if(({int})pl->query_hc_play()>1)
MG Mud User88f12472016-06-24 23:31:02 +0200480 {
481 act_seq=({({22,([1:"Du faellst und faellst...\n",
482 5:"und faellst...\n",
483 10:"und faellst...\n",
484 12:"direkt in die Arme von TOD.\n",
485 14:"Triumphierend laechelt er Dich an.\n",
486 16:"NUN GEHOERST DU FUER IMMER MIR!\n",
487 18:"HAHHHAHAHAAAAAAAAAAHAAAAAAAAA!\n",
488 20:"TOD schlaegt Dir mit seiner Sense den Kopf ab.\n"])}),0});
489 }
490 if ( !act_seq )
491 act_seq = get_sequence();
492
493 if ( !mappingp(dseq) )
494 dseq = 0;
495
496 int i;
497 for ( i = sizeof(players); i--; )
498 if ( players[i][0] == pl )
499 break;
500
501 if ( i == -1 )
502 players += ({ ({ pl, 0, dseq, act_seq[0], act_seq[1], pre }) });
503 else
504 players[i][5] = pre;
505
506
507 if ( escaped ){
508 killer_name = "";
509 killer_msg = upperstring(getuid(pl)) + " VERSUCHTE, MIR ZU "
510 "ENTKOMMEN - JETZT HABE ICH WIEDER EXTRA-ARBEIT MIT "+
Arathornc0bc29e2020-12-28 11:02:57 +0100511 (({int}) pl->QueryProp(P_GENDER) != 2 ? "IHM" : "IHR") +
MG Mud User88f12472016-06-24 23:31:02 +0200512 " ...";
513 }
514 else if ( !killer_name ) {
Arathornc0bc29e2020-12-28 11:02:57 +0100515 if ( ({string}) pl->QueryProp(P_KILLER) == "gift" ){
MG Mud User88f12472016-06-24 23:31:02 +0200516 killer_name = "Vergiftung";
517 kgen = FEMALE;
518 kart = 1;
519 }
520 else{
521 killer_name = "Etwas Geheimnisvolles und Unbekanntes";
522 kgen = NEUTER;
523 kart = 0;
524 }
525 }
526
527 if ( !pointerp(killer_msg) )
528 killer_msg = ({ killer_msg, 0, 0 });
529 else if ( sizeof(killer_msg) < 3 )
530 killer_msg += ({ 0, 0, 0 });
531
532 if ( stringp(killer_msg[0]) )
533 killer_msg[0] = sprintf( killer_msg[0], capitalize(getuid(pl)) );
534
535 SetProp( P_NAME, killer_name );
536 SetProp( P_ARTICLE, kart );
537 SetProp( P_GENDER, kgen );
538 string killname = Name(WER);
539 SetProp( P_NAME, "Lars" );
540 SetProp( P_ARTICLE, 0 );
541 SetProp( P_GENDER,MALE );
542
543 int magiertestie;
Arathornc0bc29e2020-12-28 11:02:57 +0100544 string testplayer = ({string}) pl->QueryProp(P_TESTPLAYER);
MG Mud User88f12472016-06-24 23:31:02 +0200545 if (sizeof(testplayer))
546 {
547 if (testplayer[<5..<1]!="Gilde")
548 magiertestie = 1;
549 }
550
551 string kanal;
552 if (magiertestie || IS_LEARNING(pl))
553 kanal = "TdT";
554 else
555 kanal = "Tod";
556
557 CHMASTER->join( kanal, this_object() );
558
559 if ( (!stringp(killer_name) || killer_name != "") &&
560 (sizeof(killer_msg) < 4 || !killer_msg[3]) ){
561 if ( killer_msg[2] == PLURAL )
562 CHMASTER->send( kanal, this_object(),
563 killname + " haben gerade " +
564 capitalize(getuid(pl)) + " umgebracht." );
565 else
566 CHMASTER->send( kanal, this_object(),
567 killname + " hat gerade " +
568 capitalize(getuid(pl)) + " umgebracht." );
569 }
570
Arathornc0bc29e2020-12-28 11:02:57 +0100571 i = ({int}) pl->QueryProp(P_DEADS);
MG Mud User88f12472016-06-24 23:31:02 +0200572 if ( i && (getuid(pl) == "key" || i%100 == 0 || i%250 == 0) ){
573 SetProp( P_NAME, "Tod" );
574 CHMASTER->send( kanal, this_object(),
575 sprintf( "DAS WAR SCHON DAS %dTE MAL!", i ) );
576 SetProp( P_NAME, "Lars" );
577 }
578
579 if( killer_msg[0] ){
580 if ( stringp(killer_name) && killer_name == "" ){
581 CHMASTER->send( kanal, this_object(),
582 break_string( funcall(killer_msg[0]), 78,
583 "["+kanal+":] " )[0..<2],
584 MSG_EMPTY );
585 return;
586 }
587 else {
588 if ( (killer_msg[1] < MSG_SAY) || (killer_msg[1] > MSG_GEMOTE) )
589 killer_msg[1] = MSG_SAY;
590
591 SetProp( P_NAME, killer_name );
592 SetProp( P_ARTICLE, kart );
593 SetProp( P_GENDER, kgen );
594 CHMASTER->send( kanal, this_object(), funcall(killer_msg[0]),
595 killer_msg[1] );
596 SetProp( P_NAME, "Lars" );
597 SetProp( P_ARTICLE, 0 );
598 SetProp( P_GENDER, MALE );
599 }
600 }
601
Zesstra3882c2d2020-07-27 22:37:17 +0200602 if ( pointerp(killer_msg = pl->QueryProp(P_DEATH_MSG)) &&
MG Mud User88f12472016-06-24 23:31:02 +0200603 sizeof(killer_msg) == 2 && stringp(killer_msg[0]) &&
604 intp(killer_msg[1]) ){
605 SetProp( P_NAME, capitalize(getuid(pl)) );
606 SetProp( P_ARTICLE, 0 );
Zesstra3882c2d2020-07-27 22:37:17 +0200607 SetProp( P_GENDER, ({int})pl->QueryProp(P_GENDER) );
MG Mud User88f12472016-06-24 23:31:02 +0200608 CHMASTER->send( kanal, this_object(), killer_msg[0],
609 killer_msg[1] );
610 SetProp( P_NAME, "Lars" );
611 SetProp( P_ARTICLE, 0 );
612 SetProp( P_GENDER, MALE );
613 }
614
Zesstra3882c2d2020-07-27 22:37:17 +0200615 if (({int})pl->query_hc_play()>1){
MG Mud User88f12472016-06-24 23:31:02 +0200616 SetProp( P_NAME, "Tod" );
617 CHMASTER->send( kanal, this_object(),"NUN GEHOERST DU FUER EWIG MIR!" );
618 SetProp( P_NAME, "Lars" );
619 }
620}
621
622public int
623SmartLog( string creat, string myname, string str, string date )
624{
625 int i;
626 string fn;
627
628 for ( i = sizeof(players); i--; )
629 if ( players[i][0] == this_player() )
630 break;
631
632 // Spieler (Magier?) ist in keiner Todessequenz -> normales Repfile
633 if ( i == -1 )
634 return 0;
635
636 if ( !(fn = players[i][4]) ){
637 // Spieler hat eine unbekannte Todessequenz (kein Filename, Sequenz
638 // wurde komplett in P_ENEMY_DEATH_SEQUENCE abgelegt)
639 creat = "TOD/unbekannt.rep";
640 fn = "unbekannte Todessequenz";
641 }
642 else
643 // Jede Sequenz mit nem eigenen Repfile
644 creat = "TOD/" + explode( fn, "/" )[<1] + ".rep";
645
646 log_file( creat, myname + " von " + getuid(this_interactive())
647 + " ["+fn+"] (" + date + "):\n" + str + "\n" );
648
649 return 1;
650}
651
652public mixed hier_geblieben( mixed dest, int methods, string direction,
653 string textout, string textin )
654{
655 // Magier duerfen Spieler heraustransen
656 if ( this_interactive() && IS_LEARNER(this_interactive()) &&
657 (this_interactive() != previous_object() ||
658 IS_DEPUTY(this_interactive())) ){
659 previous_object()->Set( P_TMP_MOVE_HOOK, 0 );
660 return ({ dest, methods, direction, textout, textin });
661 }
662
663 // Spieler haengt noch in der Todessequenz
664 for ( int i = sizeof(players); i--; )
665 if ( objectp(players[i][0]) && previous_object() == players[i][0] &&
666 environment(previous_object()) == find_object(
667 "/room/death/virtual/room_death_" + getuid(previous_object()))&&
668 interactive(previous_object()) ) {
669 // Move nur erlaubt, wenn das Ziel wieder der Todesraum ist.
670 // wenn mal fuer nen bestimmten Zwecks Bewegungen raus aus dem
671 // Todesraum erforderlich sind, sollten hier entsprechende
672 // Ausnahmen eingebaut werden.
673 if ( (stringp(dest) &&
674 dest == object_name(environment(previous_object()))) ||
675 (objectp(dest) &&
676 dest == environment(previous_object())) ) {
677 previous_object()->Set( P_TMP_MOVE_HOOK, 0 );
678 return ({ dest, methods, direction, textout, textin });
679 }
680 else
681 return -1;
682 }
683
684 // Spieler ist nicht mehr im Raum oder eingeschlafen
685 if ( previous_object() )
686 previous_object()->Set( P_TMP_MOVE_HOOK, 0 );
687
688 return ({ dest, methods, direction, textout, textin });
689}