blob: 39708cad690cc84773e12486f6caa380888cd455 [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, "
Zaphob4b553152023-03-02 00:23:22 +010067 "von denen geheimnisvolle Runen leuchten.\nTOD.", 78, 0, 1 ) );
MG Mud User88f12472016-06-24 23:31:02 +020068}
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, "##" ) - ({""}) );
Zaphob4b553152023-03-02 00:23:22 +0100119
MG Mud User88f12472016-06-24 23:31:02 +0200120 for ( i = 0; i < sz; i++ )
121 if ( i%2 ){
122 sscanf( texte[i], "%d", wert );
Zaphob4b553152023-03-02 00:23:22 +0100123
MG Mud User88f12472016-06-24 23:31:02 +0200124 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
Zaphob4b553152023-03-02 00:23:22 +0100141parseText( string msg, object pl )
MG Mud User88f12472016-06-24 23:31:02 +0200142{
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;
Zaphob4b553152023-03-02 00:23:22 +0100160
MG Mud User88f12472016-06-24 23:31:02 +0200161 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;
Zaphob4b553152023-03-02 00:23:22 +0100174
MG Mud User88f12472016-06-24 23:31:02 +0200175 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;
Zaphob4b553152023-03-02 00:23:22 +0100187
MG Mud User88f12472016-06-24 23:31:02 +0200188 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;
Zaphob4b553152023-03-02 00:23:22 +0100200
MG Mud User88f12472016-06-24 23:31:02 +0200201 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;
Zaphob4b553152023-03-02 00:23:22 +0100209
MG Mud User88f12472016-06-24 23:31:02 +0200210 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;
Zaphob4b553152023-03-02 00:23:22 +0100217
MG Mud User88f12472016-06-24 23:31:02 +0200218 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);
Zaphob4b553152023-03-02 00:23:22 +0100259
MG Mud User88f12472016-06-24 23:31:02 +0200260 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]) ||
Zaphob4b553152023-03-02 00:23:22 +0100287 environment(players[j][0]) !=
MG Mud User88f12472016-06-24 23:31:02 +0200288 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;
Zaphob4b553152023-03-02 00:23:22 +0100308
MG Mud User88f12472016-06-24 23:31:02 +0200309 if ( !msg )
310 msg = players[j][3][1][nr];
Zaphob4b553152023-03-02 00:23:22 +0100311
MG Mud User88f12472016-06-24 23:31:02 +0200312 if ( msg )
313 tell_object( players[j][0], parseText( msg, players[j][0] ) );
314 }
Zaphob4b553152023-03-02 00:23:22 +0100315
MG Mud User88f12472016-06-24 23:31:02 +0200316 do_remove();
317}
318
319private void
320do_remove()
321{
322 int res;
323 string prayroom;
324 object plobj, pl;
Zaphob4b553152023-03-02 00:23:22 +0100325
MG Mud User88f12472016-06-24 23:31:02 +0200326 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();
Zaphob4b553152023-03-02 00:23:22 +0100331
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 );
Zaphob4b553152023-03-02 00:23:22 +0100342
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;
Zaphob4b553152023-03-02 00:23:22 +0100362
MG Mud User88f12472016-06-24 23:31:02 +0200363 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 }
Zaphob4b553152023-03-02 00:23:22 +0100375
MG Mud User88f12472016-06-24 23:31:02 +0200376 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 = ([]);
Zaphob4b553152023-03-02 00:23:22 +0100381
MG Mud User88f12472016-06-24 23:31:02 +0200382 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;
Zaphob4b553152023-03-02 00:23:22 +0100397 mixed dseq, act_seq, killer_msg;
398 string|string* killer_name;
399
MG Mud User88f12472016-06-24 23:31:02 +0200400 set_heart_beat(1);
401 kgen = MALE;
402
Zaphob4b553152023-03-02 00:23:22 +0100403 foreach(object prev : caller_stack(1)) {
MG Mud User88f12472016-06-24 23:31:02 +0200404 if ( !objectp(prev) || prev == pl )
405 continue;
406
407 string fn = object_name(prev);
408
409 if ( fn[0..12] == "/secure/login" && !kill_liv ){
410 escaped = 1;
411 break;
412 }
413
414 if ( fn[0..7] == "/secure/" && fn[0..13] != "/secure/merlin" )
415 continue;
416
417 if ( fn[0..21] == "/room/death/death_mark" )
418 continue;
419
420 if ( living(prev) ){
421 kill_liv = prev; // Killer
422 break;
423 }
424
425 kill_ob = prev; // killendes Objekt
426 }
427
Arathorn6fa8c9e2020-08-05 13:29:02 +0200428 string|object pre = pl->QueryProp(P_KILLER);
MG Mud User88f12472016-06-24 23:31:02 +0200429 if ( objectp(pre) ) {
Zesstra3882c2d2020-07-27 22:37:17 +0200430 dseq = pre->QueryProp(P_ENEMY_DEATH_SEQUENCE);
MG Mud User88f12472016-06-24 23:31:02 +0200431
Zesstra3882c2d2020-07-27 22:37:17 +0200432 if( !(killer_name = pre->QueryProp(P_KILL_NAME)) ){
433 killer_name = pre->QueryProp(P_NAME);
Arathornc0bc29e2020-12-28 11:02:57 +0100434 kart = ({int}) pre->QueryProp(P_ARTICLE);
435 kgen = ({int}) pre->QueryProp(P_GENDER);
MG Mud User88f12472016-06-24 23:31:02 +0200436 }
437
Zaphob4b553152023-03-02 00:23:22 +0100438 killer_msg = pre->QueryProp(P_KILL_MSG);
MG Mud User88f12472016-06-24 23:31:02 +0200439 }
440
441 if ( !killer_name && kill_liv && function_exists( "QueryProp", kill_liv ) ){
Zesstra3882c2d2020-07-27 22:37:17 +0200442 dseq = kill_liv->QueryProp(P_ENEMY_DEATH_SEQUENCE);
MG Mud User88f12472016-06-24 23:31:02 +0200443
Zesstra3882c2d2020-07-27 22:37:17 +0200444 if( !(killer_name = kill_liv->QueryProp(P_KILL_NAME)) ){
445 killer_name = kill_liv->QueryProp(P_NAME);
Arathornc0bc29e2020-12-28 11:02:57 +0100446 kart = ({int}) kill_liv->QueryProp(P_ARTICLE);
447 kgen = ({int}) kill_liv->QueryProp(P_GENDER);
MG Mud User88f12472016-06-24 23:31:02 +0200448 }
449
Zesstra3882c2d2020-07-27 22:37:17 +0200450 killer_msg = kill_liv->QueryProp(P_KILL_MSG);
MG Mud User88f12472016-06-24 23:31:02 +0200451 pre = kill_liv;
452 }
453
454 if ( !killer_name && kill_ob && function_exists( "QueryProp", kill_ob ) ){
Zesstra3882c2d2020-07-27 22:37:17 +0200455 dseq = kill_ob->QueryProp(P_ENEMY_DEATH_SEQUENCE);
MG Mud User88f12472016-06-24 23:31:02 +0200456
Zesstra3882c2d2020-07-27 22:37:17 +0200457 if( !(killer_name = kill_ob->QueryProp(P_KILL_NAME)) ){
458 killer_name = kill_ob->QueryProp(P_NAME);
Arathornc0bc29e2020-12-28 11:02:57 +0100459 kart = ({int}) kill_ob->QueryProp(P_ARTICLE);
460 kgen = ({int}) kill_ob->QueryProp(P_GENDER);
MG Mud User88f12472016-06-24 23:31:02 +0200461 }
462
Zesstra3882c2d2020-07-27 22:37:17 +0200463 killer_msg = kill_ob->QueryProp(P_KILL_MSG);
MG Mud User88f12472016-06-24 23:31:02 +0200464 pre = kill_ob;
465 }
Zaphob4b553152023-03-02 00:23:22 +0100466
MG Mud User88f12472016-06-24 23:31:02 +0200467 // falls keine Sequenz gesetzt, eventuelle eigene Todessequenz nehmen
468 if (!dseq)
Zesstra3882c2d2020-07-27 22:37:17 +0200469 dseq = ({<string|mapping|mixed*>})pl->QueryProp(P_NEXT_DEATH_SEQUENCE);
MG Mud User88f12472016-06-24 23:31:02 +0200470
471 act_seq = 0;
472
473 if ( mappingp(dseq) )
474 act_seq = get_sequence( "/room/death/sequences/lars" );
475 else if ( pointerp(dseq) ) // ganze Todessequenz...
476 act_seq = ({ dseq, 0 });
477 else if ( stringp(dseq) )
478 act_seq = get_sequence(dseq);
479
Zesstra3882c2d2020-07-27 22:37:17 +0200480 if(({int})pl->query_hc_play()>1)
MG Mud User88f12472016-06-24 23:31:02 +0200481 {
482 act_seq=({({22,([1:"Du faellst und faellst...\n",
483 5:"und faellst...\n",
484 10:"und faellst...\n",
485 12:"direkt in die Arme von TOD.\n",
486 14:"Triumphierend laechelt er Dich an.\n",
487 16:"NUN GEHOERST DU FUER IMMER MIR!\n",
488 18:"HAHHHAHAHAAAAAAAAAAHAAAAAAAAA!\n",
489 20:"TOD schlaegt Dir mit seiner Sense den Kopf ab.\n"])}),0});
490 }
491 if ( !act_seq )
492 act_seq = get_sequence();
493
494 if ( !mappingp(dseq) )
495 dseq = 0;
496
497 int i;
498 for ( i = sizeof(players); i--; )
499 if ( players[i][0] == pl )
500 break;
501
502 if ( i == -1 )
503 players += ({ ({ pl, 0, dseq, act_seq[0], act_seq[1], pre }) });
504 else
505 players[i][5] = pre;
506
507
Zaphob4b553152023-03-02 00:23:22 +0100508 if ( escaped )
509 {
510 killer_name = "TOD";
MG Mud User88f12472016-06-24 23:31:02 +0200511 killer_msg = upperstring(getuid(pl)) + " VERSUCHTE, MIR ZU "
512 "ENTKOMMEN - JETZT HABE ICH WIEDER EXTRA-ARBEIT MIT "+
Arathornc0bc29e2020-12-28 11:02:57 +0100513 (({int}) pl->QueryProp(P_GENDER) != 2 ? "IHM" : "IHR") +
MG Mud User88f12472016-06-24 23:31:02 +0200514 " ...";
515 }
516 else if ( !killer_name ) {
Arathornf0e57292021-04-16 19:35:27 +0200517 if ( ({object|string}) pl->QueryProp(P_KILLER) == "gift" ){
MG Mud User88f12472016-06-24 23:31:02 +0200518 killer_name = "Vergiftung";
519 kgen = FEMALE;
520 kart = 1;
521 }
522 else{
523 killer_name = "Etwas Geheimnisvolles und Unbekanntes";
524 kgen = NEUTER;
525 kart = 0;
526 }
527 }
528
529 if ( !pointerp(killer_msg) )
530 killer_msg = ({ killer_msg, 0, 0 });
531 else if ( sizeof(killer_msg) < 3 )
532 killer_msg += ({ 0, 0, 0 });
533
534 if ( stringp(killer_msg[0]) )
535 killer_msg[0] = sprintf( killer_msg[0], capitalize(getuid(pl)) );
536
537 SetProp( P_NAME, killer_name );
538 SetProp( P_ARTICLE, kart );
539 SetProp( P_GENDER, kgen );
540 string killname = Name(WER);
541 SetProp( P_NAME, "Lars" );
542 SetProp( P_ARTICLE, 0 );
543 SetProp( P_GENDER,MALE );
544
545 int magiertestie;
Arathornc0bc29e2020-12-28 11:02:57 +0100546 string testplayer = ({string}) pl->QueryProp(P_TESTPLAYER);
MG Mud User88f12472016-06-24 23:31:02 +0200547 if (sizeof(testplayer))
548 {
549 if (testplayer[<5..<1]!="Gilde")
550 magiertestie = 1;
551 }
Zaphob4b553152023-03-02 00:23:22 +0100552
MG Mud User88f12472016-06-24 23:31:02 +0200553 string kanal;
554 if (magiertestie || IS_LEARNING(pl))
555 kanal = "TdT";
556 else
557 kanal = "Tod";
558
559 CHMASTER->join( kanal, this_object() );
560
Zaphob4b553152023-03-02 00:23:22 +0100561 if ( (!escaped && sizeof(killname)) &&
562 (sizeof(killer_msg) < 4 || !killer_msg[3]) )
563 {
MG Mud User88f12472016-06-24 23:31:02 +0200564 if ( killer_msg[2] == PLURAL )
565 CHMASTER->send( kanal, this_object(),
566 killname + " haben gerade " +
567 capitalize(getuid(pl)) + " umgebracht." );
568 else
569 CHMASTER->send( kanal, this_object(),
570 killname + " hat gerade " +
571 capitalize(getuid(pl)) + " umgebracht." );
572 }
573
Arathornc0bc29e2020-12-28 11:02:57 +0100574 i = ({int}) pl->QueryProp(P_DEADS);
MG Mud User88f12472016-06-24 23:31:02 +0200575 if ( i && (getuid(pl) == "key" || i%100 == 0 || i%250 == 0) ){
Zaphob4b553152023-03-02 00:23:22 +0100576 SetProp( P_NAME, "TOD" );
MG Mud User88f12472016-06-24 23:31:02 +0200577 CHMASTER->send( kanal, this_object(),
578 sprintf( "DAS WAR SCHON DAS %dTE MAL!", i ) );
579 SetProp( P_NAME, "Lars" );
580 }
581
Zaphob4b553152023-03-02 00:23:22 +0100582 if( killer_msg[0] )
583 {
584 // escaped oder kein sinnvoller killer_name (ja, kein killname hier)?
585 // killer_name kann alles sein, was P_NAME/P_KILL_NAME sein kann.
586 if ( escaped || !sizeof(killer_name)
587 || (pointerp(killer_name) && sizeof(killer_name) != 4))
588 {
MG Mud User88f12472016-06-24 23:31:02 +0200589 CHMASTER->send( kanal, this_object(),
590 break_string( funcall(killer_msg[0]), 78,
591 "["+kanal+":] " )[0..<2],
592 MSG_EMPTY );
Zaphob4b553152023-03-02 00:23:22 +0100593 return;
MG Mud User88f12472016-06-24 23:31:02 +0200594 }
Zaphob4b553152023-03-02 00:23:22 +0100595 else
596 {
MG Mud User88f12472016-06-24 23:31:02 +0200597 if ( (killer_msg[1] < MSG_SAY) || (killer_msg[1] > MSG_GEMOTE) )
598 killer_msg[1] = MSG_SAY;
599
600 SetProp( P_NAME, killer_name );
601 SetProp( P_ARTICLE, kart );
602 SetProp( P_GENDER, kgen );
603 CHMASTER->send( kanal, this_object(), funcall(killer_msg[0]),
604 killer_msg[1] );
605 SetProp( P_NAME, "Lars" );
606 SetProp( P_ARTICLE, 0 );
607 SetProp( P_GENDER, MALE );
608 }
609 }
610
Zesstra3882c2d2020-07-27 22:37:17 +0200611 if ( pointerp(killer_msg = pl->QueryProp(P_DEATH_MSG)) &&
MG Mud User88f12472016-06-24 23:31:02 +0200612 sizeof(killer_msg) == 2 && stringp(killer_msg[0]) &&
613 intp(killer_msg[1]) ){
614 SetProp( P_NAME, capitalize(getuid(pl)) );
615 SetProp( P_ARTICLE, 0 );
Zesstra3882c2d2020-07-27 22:37:17 +0200616 SetProp( P_GENDER, ({int})pl->QueryProp(P_GENDER) );
MG Mud User88f12472016-06-24 23:31:02 +0200617 CHMASTER->send( kanal, this_object(), killer_msg[0],
618 killer_msg[1] );
619 SetProp( P_NAME, "Lars" );
620 SetProp( P_ARTICLE, 0 );
621 SetProp( P_GENDER, MALE );
622 }
623
Zesstra3882c2d2020-07-27 22:37:17 +0200624 if (({int})pl->query_hc_play()>1){
Zaphob4b553152023-03-02 00:23:22 +0100625 SetProp( P_NAME, "TOD" );
MG Mud User88f12472016-06-24 23:31:02 +0200626 CHMASTER->send( kanal, this_object(),"NUN GEHOERST DU FUER EWIG MIR!" );
627 SetProp( P_NAME, "Lars" );
628 }
629}
630
631public int
632SmartLog( string creat, string myname, string str, string date )
633{
634 int i;
635 string fn;
Zaphob4b553152023-03-02 00:23:22 +0100636
MG Mud User88f12472016-06-24 23:31:02 +0200637 for ( i = sizeof(players); i--; )
638 if ( players[i][0] == this_player() )
639 break;
640
641 // Spieler (Magier?) ist in keiner Todessequenz -> normales Repfile
642 if ( i == -1 )
643 return 0;
644
645 if ( !(fn = players[i][4]) ){
646 // Spieler hat eine unbekannte Todessequenz (kein Filename, Sequenz
647 // wurde komplett in P_ENEMY_DEATH_SEQUENCE abgelegt)
648 creat = "TOD/unbekannt.rep";
649 fn = "unbekannte Todessequenz";
650 }
651 else
652 // Jede Sequenz mit nem eigenen Repfile
653 creat = "TOD/" + explode( fn, "/" )[<1] + ".rep";
654
655 log_file( creat, myname + " von " + getuid(this_interactive())
656 + " ["+fn+"] (" + date + "):\n" + str + "\n" );
657
658 return 1;
659}
660
661public mixed hier_geblieben( mixed dest, int methods, string direction,
Zaphob4b553152023-03-02 00:23:22 +0100662 string textout, string textin )
MG Mud User88f12472016-06-24 23:31:02 +0200663{
664 // Magier duerfen Spieler heraustransen
665 if ( this_interactive() && IS_LEARNER(this_interactive()) &&
666 (this_interactive() != previous_object() ||
667 IS_DEPUTY(this_interactive())) ){
668 previous_object()->Set( P_TMP_MOVE_HOOK, 0 );
669 return ({ dest, methods, direction, textout, textin });
670 }
671
672 // Spieler haengt noch in der Todessequenz
673 for ( int i = sizeof(players); i--; )
674 if ( objectp(players[i][0]) && previous_object() == players[i][0] &&
675 environment(previous_object()) == find_object(
676 "/room/death/virtual/room_death_" + getuid(previous_object()))&&
677 interactive(previous_object()) ) {
678 // Move nur erlaubt, wenn das Ziel wieder der Todesraum ist.
679 // wenn mal fuer nen bestimmten Zwecks Bewegungen raus aus dem
680 // Todesraum erforderlich sind, sollten hier entsprechende
681 // Ausnahmen eingebaut werden.
Zaphob4b553152023-03-02 00:23:22 +0100682 if ( (stringp(dest) &&
MG Mud User88f12472016-06-24 23:31:02 +0200683 dest == object_name(environment(previous_object()))) ||
684 (objectp(dest) &&
685 dest == environment(previous_object())) ) {
686 previous_object()->Set( P_TMP_MOVE_HOOK, 0 );
687 return ({ dest, methods, direction, textout, textin });
688 }
689 else
690 return -1;
691 }
692
693 // Spieler ist nicht mehr im Raum oder eingeschlafen
694 if ( previous_object() )
695 previous_object()->Set( P_TMP_MOVE_HOOK, 0 );
Zaphob4b553152023-03-02 00:23:22 +0100696
MG Mud User88f12472016-06-24 23:31:02 +0200697 return ({ dest, methods, direction, textout, textin });
698}