#include <properties.h>#include <language.h>#include <defines.h>#include <moving.h>#include <wizlevels.h>#include <living/life.h>#include "/secure/scoremaster.h"
gehe zum Quellcode dieser Datei
Makrodefinitionen | |
| #define | CORPSE_OBJ "/std/corpse.c" |
| #define | PILE_OBJ "/std/pile.c" |
| #define | KILL_MESSAGES |
| #define | KILL_MESSAGES2 |
| #define | KILL_MESSAGES3 |
Funktionen | |
| void | Identify (object ob) |
| void | do_decay () |
| int | QueryDecay () |
| static int | mampf (string str) |
| static int | spott (string str) |
| void | ChannelMessageJeer (mixed sender, string text, int flag) |
| object | _channel (object ob) |
| void | transform_into_pile () |
| void | create () |
| int | MayAddWeight (int weight) |
| int | MayAddObject (object ob) |
| string | _query_leichen_name () |
| public int | IsPlayerCorpse () |
| public string | QueryHealInfo () |
| private string | knabber_text () |
| static string | _query_short () |
| static int * | _query_nahrung () |
| private string | mampf_heilung (int wieviel) |
| int | _query_kma () |
Variablen | |
| inherit std | container |
| nosave int | _decay = 4 |
| nosave string | _name = "Unbekannt" |
| nosave object | moerder |
| private nosave int | gespottet = 0 |
| nosave int | nahrung_gesamt = 1 |
| nosave int | nahrung_aktuell = 1 |
| private nosave status | spielerleiche |
| private int | kma = sizeof( KILL_MESSAGES, KILL_MESSAGES2, KILL_MESSAGES3 ) |
| #define CORPSE_OBJ "/std/corpse.c" |
Definiert in Zeile 34 der Datei corpse.c.
Wird benutzt von _channel() und ChannelMessageJeer().
| #define KILL_MESSAGES |
Definiert in Zeile 373 der Datei corpse.c.
Wird benutzt von _channel().
| #define KILL_MESSAGES2 |
Definiert in Zeile 464 der Datei corpse.c.
Wird benutzt von _channel().
| #define KILL_MESSAGES3 |
Definiert in Zeile 540 der Datei corpse.c.
Wird benutzt von _channel().
| #define PILE_OBJ "/std/pile.c" |
Definiert in Zeile 35 der Datei corpse.c.
Wird benutzt von transform_into_pile().
| object _channel | ( | object | ob | ) |
Definiert in Zeile 605 der Datei corpse.c.
Benutzt CHMASTER, CORPSE_OBJ, i, IS_LEARNER, KILL_MESSAGES, KILL_MESSAGES2, KILL_MESSAGES3, kma, log_file, msg(), P_FORCE_MURDER_MSG, P_MAX_HP, P_MURDER_MSG, P_NAME, P_TOTAL_AC, P_TOTAL_WC, SetProp(), WESSEN und x.
Wird benutzt von Identify().
00606 { 00607 int m_FMM, m_HP, m_WC, m_AC, s_HP, s_WC, s_AC; 00608 string msg; 00609 object rueck; 00610 00611 if (member(inherit_list(previous_object()),CORPSE_OBJ)>-1) 00612 { 00613 string killer; 00614 int i, x, y, z, nr; 00615 closure m_q, s_q; 00616 00617 while( previous_object(i) && 00618 !query_once_interactive(previous_object(i)) ) 00619 i++; 00620 00621 if( !previous_object(i) || IS_LEARNER(previous_object(i)) ) 00622 return rueck; 00623 00624 killer = (string) previous_object(i)->name(); 00625 00626 if ( lower_case(killer) != getuid(previous_object(i)) ) 00627 killer = capitalize(getuid(previous_object(i))); 00628 00629 m_q = symbol_function( "QueryProp", ob ); // Monster 00630 s_q = symbol_function( "QueryProp", previous_object(i) ); // Spieler 00631 00632 if ( (m_FMM = (int) funcall( m_q, P_FORCE_MURDER_MSG )) >= 0 ) 00633 if ( (object_name(ob) == "/obj/shut") || 00634 (m_FMM > 0) || 00635 (nr = (random(100) >= 99) ? 1 : 0 ) || 00636 (nr = ((x = (m_HP = (int) funcall( m_q, P_MAX_HP )) * 00637 ((m_WC = (int) funcall( m_q, P_TOTAL_WC )) + 00638 (m_AC = (int) funcall( m_q, P_TOTAL_AC )))) 00639 > 200000) ? 2 : 0) || 00640 (nr = (((y = m_HP * (m_WC + m_AC)) > 00641 (z = 5 * (s_HP = (int) funcall( s_q, P_MAX_HP )) * 00642 ((s_WC = (int) funcall( s_q, P_TOTAL_WC )) + 00643 (s_AC = (int) funcall( s_q, P_TOTAL_AC ))))) 00644 ? 3 : 0))) 00645 { 00646 SetProp( P_NAME, "Geist "+(string) ob->name(WESSEN, 0) ); 00647 00648 if( !(msg = (string) ob->QueryProp(P_MURDER_MSG)) ) 00649 msg = KILL_MESSAGES, KILL_MESSAGES2, KILL_MESSAGES3 00650 [random(kma)]; 00651 00652 if ( stringp(msg) ) 00653 msg = sprintf( msg, killer || "Moerder" ); 00654 00655 CHMASTER->send( "Moerder", this_object(), funcall(msg) ); 00656 00657 rueck = previous_object(i); 00658 } 00659 00660 log_file( "moerder.log", 00661 sprintf( "MON(%O) COND(%d) NPC(%d), DIFF(%d,%d)\n", 00662 ob, nr, x, y, z) ); 00663 } 00664 00665 return rueck; 00666 }


| string _query_leichen_name | ( | ) |
| static int* _query_nahrung | ( | ) | [static] |
Definiert in Zeile 248 der Datei corpse.c.
Benutzt nahrung_aktuell und nahrung_gesamt.
00249 { return ({nahrung_aktuell, nahrung_gesamt}); }
| static string _query_short | ( | ) | [static] |
Definiert in Zeile 198 der Datei corpse.c.
Benutzt _decay, _name und knabber_text().
00199 { 00200 string txt; 00201 switch(_decay) { 00202 case 4: 00203 txt = "Die"+knabber_text()+" Leiche "; 00204 break; 00205 case 3: 00206 txt = "Die bereits ziemlich stinkende"+knabber_text()+" Leiche "; 00207 break; 00208 case 2: 00209 txt = "Die schimmelnde und halbverweste"+knabber_text()+" Leiche "; 00210 break; 00211 case 1: 00212 txt = "Die verfaulten"+(strlen(knabber_text()) ? 00213 "n":"")+" Einzelteile "; 00214 break; 00215 } 00216 txt += _name; 00217 return txt; 00218 }

| void ChannelMessageJeer | ( | mixed | sender, | |
| string | text, | |||
| int | flag | |||
| ) |
Definiert in Zeile 365 der Datei corpse.c.
Benutzt CHMASTER und CORPSE_OBJ.
00366 { 00367 if (member(inherit_list(previous_object()),CORPSE_OBJ)>-1) 00368 CHMASTER->send( "Moerder", sender, text, flag ); 00369 }
| void create | ( | ) |
Definiert in Zeile 55 der Datei corpse.c.
Benutzt AddCmd(), AddId(), create(), FEMALE, ME, P_ARTICLE, P_CORPSE_DECAY_TIME, P_GENDER, P_MATERIAL, P_NAME, P_NO_SCORE, set_next_reset() und SetProp().
00056 { 00057 if (object_name(ME) == __FILE__[0..<3]) { 00058 set_next_reset(-1); 00059 } 00060 ::create(); 00061 if( clonep(this_object()) ) 00062 { 00063 AddId(({ "leiche","\nleiche","rest","ueberrest"})); 00064 SetProp( P_GENDER, FEMALE ); 00065 SetProp( P_NAME, "Leiche" ); 00066 SetProp( P_MATERIAL, ([ MAT_MISC_DEAD: 100 ]) ); 00067 SetProp( P_CORPSE_DECAY_TIME, 30 ); 00068 SetProp(P_NO_SCORE,1); 00069 AddCmd(({"iss","verspeise"}),"mampf"); 00070 AddCmd("spotte","spott"); 00071 SetProp(P_ARTICLE, 1); 00072 } 00073 else 00074 SetProp( P_ARTICLE, 0 ); 00075 }

| void do_decay | ( | ) |
Definiert in Zeile 220 der Datei corpse.c.
Benutzt _decay, call_out(), P_CORPSE_DECAY_TIME, P_HEAL, QueryProp(), SetProp() und transform_into_pile().
00221 { 00222 _decay -= 1; 00223 00224 if ( _decay > 0 ) 00225 { 00226 if ( (_decay == 2) && (QueryProp( P_HEAL ) >= -4) ) 00227 SetProp( P_HEAL, -4 ); 00228 call_out( "do_decay", QueryProp(P_CORPSE_DECAY_TIME) ); 00229 return; 00230 } 00231 00232 transform_into_pile(); 00233 remove(); 00234 }

| void Identify | ( | object | ob | ) |
Definiert in Zeile 87 der Datei corpse.c.
Benutzt _channel(), _decay, _name, AddId(), call_out(), cl, i, info, moerder, nahrung_aktuell, nahrung_gesamt, P_ALIGN, P_ATTRIBUTES, P_CLASS, P_CORPSE_DECAY_TIME, P_HANDS, P_HEAL, P_KILLER, P_LAST_DAMTYPES, P_LEVEL, P_LONG, P_MAX_HP, P_ORIG_FILE_NAME, P_ORIG_NAME, P_PILE_NAME, P_RACE, P_SHORT, P_SIZE, P_WEIGHT, P_XP, QueryProp(), RAW, SetProp(), spielerleiche, WEM und WESSEN.
00088 { 00089 closure cl; 00090 int i; 00091 string info; 00092 00093 spielerleiche = query_once_interactive(ob); 00094 cl=symbol_function("QueryProp", ob); 00095 _name = (string) ob->name(WESSEN,0); 00096 SetProp( P_SHORT, "Die Leiche "+ _name ); 00097 SetProp( P_LONG, "Du siehst die sterblichen Ueberreste "+ _name + ".\n" ); 00098 _decay = 4; 00099 SetProp( P_ORIG_NAME, to_string(ob->name(RAW)) ); 00100 SetProp( P_PILE_NAME, to_string(ob->name(WEM)) ); 00101 AddId( "\nleiche "+ QueryProp(P_PILE_NAME) ); 00102 SetProp( P_KILLER, (object) funcall(cl, P_KILLER) ); 00103 SetProp( P_ATTRIBUTES, (mapping) funcall(cl, P_ATTRIBUTES) ); 00104 SetProp( P_LAST_DAMTYPES, (string *) funcall(cl, P_LAST_DAMTYPES) ); 00105 SetProp( P_XP, to_int(funcall(cl, P_XP)) ); 00106 SetProp( P_SIZE, to_int(funcall(cl, P_SIZE)) ); 00107 SetProp( P_LEVEL, to_int(funcall(cl, P_LEVEL)) ); 00108 SetProp( P_MAX_HP, to_int(funcall(cl, P_MAX_HP)) ); 00109 SetProp( P_RACE, to_string(funcall(cl, P_RACE)) ); 00110 SetProp( P_CLASS, (string *)(funcall(cl, P_CLASS)) ); 00111 SetProp( P_HANDS, (mixed *) funcall(cl, P_HANDS) ); 00112 SetProp( P_WEIGHT, (mixed *) funcall(cl, P_WEIGHT) ); 00113 SetProp( P_ALIGN, to_int(funcall(cl, P_ALIGN)) ); 00114 SetProp( P_ORIG_FILE_NAME, object_name(ob) ); 00115 SetProp( P_HEAL, to_int(funcall(cl, P_HEAL)) ); 00116 00117 // Saettigung der Leiche berechnen 00118 // P_WEIGHT und P_SIZE werden verwendet, Mittel bilden 00119 // Ein Saettigungspunkt fuer (konservative Rechnung): 00120 // 5 kg 00121 // 12 cm 00122 // Beispiele: 00123 // Mensch, 1.80 m gross, 75 kg schwer: 00124 // 180/12 + 75/5 = 15 + 15 = 30 00125 // Kuh, 1.50 m gross, 500 kg schwer: 00126 // 150/12 + 500/5 = 12 + 100 = 112 00127 // Drache, 5 m gross, 1500 kg schwer: 00128 // 500/12 + 1500/5 = 41 + 300 = 341 00129 nahrung_gesamt = QueryProp(P_WEIGHT)/5000 + QueryProp(P_SIZE)/12; 00130 if (nahrung_gesamt <= 0) 00131 nahrung_gesamt = 1; 00132 nahrung_aktuell = nahrung_gesamt; 00133 00134 if ( intp(i = funcall(cl, P_CORPSE_DECAY_TIME)) && i > 2 ) 00135 SetProp( P_CORPSE_DECAY_TIME, i ); 00136 00137 call_out( "do_decay", QueryProp(P_CORPSE_DECAY_TIME) ); 00138 00139 if ( !query_once_interactive(ob) ) 00140 moerder = (object) "/std/corpse"->_channel(ob); 00141 }

| public int IsPlayerCorpse | ( | ) |
| private string knabber_text | ( | ) |
Definiert in Zeile 170 der Datei corpse.c.
Benutzt nahrung_aktuell und nahrung_gesamt.
Wird benutzt von _query_short().
00171 { 00172 string txt; 00173 switch (nahrung_aktuell * 4 / nahrung_gesamt) { 00174 case 4: 00175 // Leiche noch komplett 00176 txt = ""; 00177 break; 00178 case 3: 00179 // noch maximal 99% 00180 txt = " mit Knabberspuren uebersaehte"; 00181 break; 00182 case 2: 00183 // noch maximal 74% 00184 txt = " angefressene"; 00185 break; 00186 case 1: 00187 // noch maximal 49% 00188 txt = " schon halb aufgefutterte"; 00189 break; 00190 default: 00191 // noch maximal 24% 00192 txt = " total abgenagte"; 00193 break; 00194 } 00195 return txt; 00196 }

| static int mampf | ( | string | str | ) | [static] |
Definiert in Zeile 269 der Datei corpse.c.
Benutzt _notify_fail(), mampf_heilung(), nahrung_aktuell, name, P_FOOD, P_GHOST, P_MAX_FOOD, QueryProp(), transform_into_pile(), WEM und WER.
00270 { 00271 int gegessen; 00272 00273 _notify_fail("Was moechtest Du essen?\n"); 00274 00275 if ( !str || !id(str) ) 00276 return 0; 00277 00278 if (this_player()->QueryProp(P_GHOST)) 00279 { 00280 _notify_fail("Das wuerde durch Dich hindurch fallen.\n"); 00281 return 0; 00282 } 00283 00284 // Das folgende ist nicht ganz sauber, da die Staerke bei eat_food nicht 00285 // unbedingt dem Saettigungswert entsprechen muss (wegen FOOD_VALUE). 00286 gegessen = (int) this_player()->QueryProp(P_MAX_FOOD) - 00287 (int) this_player()->QueryProp(P_FOOD); 00288 if (gegessen <= 0) { 00289 // Spieler ist proppenvoll, Meldung ausgeben 00290 gegessen = 0; 00291 write("Du bekommst von der Leiche nicht einen Bissen mehr runter.\n"); 00292 } else if (gegessen >= nahrung_aktuell) { 00293 // spieler kann die gesamte Leiche essen, also entfernen. 00294 this_player()->eat_food(nahrung_aktuell); 00295 // Verdammt. eat_food() kann TP umgebracht haben und im Falle eines NPC 00296 // ist der dann weg. 00297 if (objectp(this_player())) { 00298 write(mampf_heilung(nahrung_aktuell)); 00299 say( sprintf("%s wird von %s voll Hingebung verspeist.\n", 00300 capitalize(name(WER)), 00301 (string) this_player()->name(WEM)) ); 00302 } 00303 transform_into_pile(); 00304 remove(); 00305 } else { 00306 // Auch teilweise Verspeisung ist moeglich, nahrung_aktuell anpassen 00307 this_player()->eat_food(gegessen); 00308 if (objectp(this_player())) { 00309 write(mampf_heilung(gegessen)+"Leider bist Du nicht in der Lage," 00310 " alles aufzuessen.\n"); 00311 say( sprintf("%s knabbert an %s herum.\n", 00312 (string) this_player()->name(), 00313 capitalize(name(WEM)) ) ); 00314 } 00315 nahrung_aktuell -= gegessen; 00316 } 00317 return 1; 00318 }

| private string mampf_heilung | ( | int | wieviel | ) |
Definiert in Zeile 251 der Datei corpse.c.
Benutzt heal, msg(), nahrung_gesamt, P_HEAL und QueryProp().
Wird benutzt von mampf().
00252 { 00253 int heal; 00254 string msg; 00255 heal = QueryProp(P_HEAL); 00256 // Anteil an Gesamtheilung ausrechnen 00257 heal = heal * wieviel / nahrung_gesamt; 00258 if ( ( heal ) < 0 ) { 00259 // 00260 this_player()->do_damage( random(-heal), this_object() ); 00261 msg = "Buah, diese Leiche war zweifellos nicht besonders gesund.\n"; 00262 } else { 00263 this_player()->heal_self( random(heal) ); 00264 msg = "Hmmm, lecker!\n"; 00265 } 00266 return msg; 00267 }


| int QueryDecay | ( | ) |
| public string QueryHealInfo | ( | ) |
Definiert in Zeile 145 der Datei corpse.c.
Benutzt info, P_HEAL und QueryProp().
00146 { 00147 string info = "Solltest Du auf die aberwitzige Idee verfallen, diese " 00148 "Leiche zu essen, "; 00149 switch( QueryProp(P_HEAL) ) 00150 { 00151 case -__INT_MAX__..-100: 00152 info += "wird Dir das erheblichen Schaden zufuegen."; 00153 break; 00154 case -99..-11: 00155 info += "ist das ausgesprochen ungesund fuer Dich."; 00156 break; 00157 case -10..-1: 00158 info += "wird Dir sicher ein wenig uebel werden."; 00159 break; 00160 case 0..5: 00161 info += "wird Dir nichts schlimmes passieren."; 00162 break; 00163 case 6..__INT_MAX__: 00164 info += "koenntest Du sogar ein wenig geheilt werden."; 00165 break; 00166 } 00167 return info; 00168 }

| static int spott | ( | string | str | ) | [static] |
Definiert in Zeile 321 der Datei corpse.c.
Benutzt _decay, _notify_fail(), gespottet, moerder, MSG_EMOTE, MSG_GEMOTE, MSG_SAY und PL.
00322 { 00323 if ( !str ) 00324 return _notify_fail( "Syntax: spotte <text>\n" ), 0; 00325 00326 if ( !objectp(moerder) ) 00327 return _notify_fail( "Dieses Opfer ist den Spott nicht wert.\n" ), 0; 00328 00329 if ( PL != moerder ) 00330 return _notify_fail( "Du kannst nur Deine eigenen Opfer " 00331 +"verspotten!\n" ), 0; 00332 00333 if ( gespottet ) 00334 return _notify_fail( "Du kannst Dein Opfer nur einmal verspotten!\n" ) 00335 , 0; 00336 00337 if ( _decay < 4 ) 00338 return _notify_fail( "Da solltest Du schon etwas spontaner sein.\n" ) 00339 , 0; 00340 00341 str = (string) PL->_unparsed_args(); 00342 00343 switch ( str[0] ) 00344 { 00345 case ':': 00346 "/std/corpse"->ChannelMessageJeer( PL, str[1..], MSG_EMOTE ); 00347 break; 00348 00349 case ';': 00350 "/std/corpse"->ChannelMessageJeer( PL, str[1..], MSG_GEMOTE ); 00351 break; 00352 00353 default: 00354 "/std/corpse"->ChannelMessageJeer( PL, str, MSG_SAY ); 00355 break; 00356 } 00357 00358 gespottet = 1; 00359 write( "Du verspottest Dein totes Opfer.\n" ); 00360 00361 return 1; 00362 }

| void transform_into_pile | ( | ) |
Definiert in Zeile 668 der Datei corpse.c.
Benutzt inv(), M_NOCHECK, M_SILENT, p, P_PREVENT_PILE, PILE_OBJ und QueryProp().
Wird benutzt von do_decay() und mampf().
00668 { 00669 if( environment()->QueryProp(P_PREVENT_PILE) ) return; 00670 object* inv = all_inventory(); 00671 if( sizeof(inv)<2 ) return; 00672 object p = clone_object(PILE_OBJ); 00673 filter_objects( inv, "move", p, M_SILENT | M_NOCHECK ); 00674 p->move( environment(), M_SILENT | M_NOCHECK ); 00675 }


| nosave int _decay = 4 |
Definiert in Zeile 37 der Datei corpse.c.
Wird benutzt von _query_short(), do_decay(), Identify(), QueryDecay() und spott().
| nosave string _name = "Unbekannt" |
Definiert in Zeile 38 der Datei corpse.c.
Wird benutzt von _query_leichen_name(), _query_short() und Identify().
| private nosave int gespottet = 0 |
| private int kma = sizeof( KILL_MESSAGES, KILL_MESSAGES2, KILL_MESSAGES3 ) |
Definiert in Zeile 599 der Datei corpse.c.
Wird benutzt von _channel() und _query_kma().
| nosave object moerder |
Definiert in Zeile 39 der Datei corpse.c.
Wird benutzt von Identify() und spott().
| nosave int nahrung_aktuell = 1 |
Definiert in Zeile 42 der Datei corpse.c.
Wird benutzt von _query_nahrung(), Identify(), knabber_text() und mampf().
| nosave int nahrung_gesamt = 1 |
Definiert in Zeile 41 der Datei corpse.c.
Wird benutzt von _query_nahrung(), Identify(), knabber_text() und mampf_heilung().
| private nosave status spielerleiche |
Definiert in Zeile 44 der Datei corpse.c.
Wird benutzt von Identify() und IsPlayerCorpse().
1.6.3