corpse.c-Dateireferenz

#include <properties.h>
#include <language.h>
#include <defines.h>
#include <moving.h>
#include <wizlevels.h>
#include <living/life.h>
#include "/secure/scoremaster.h"
Include-Abhängigkeitsdiagramm für corpse.c:

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 )

Makro-Dokumentation

#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().


Dokumentation der Funktionen

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 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

Hier ist ein Graph der zeigt, wo diese Funktion aufgerufen wird:

int _query_kma (  ) 

Definiert in Zeile 602 der Datei corpse.c.

Benutzt kma.

00602 { return kma; }

string _query_leichen_name (  ) 

Definiert in Zeile 83 der Datei corpse.c.

Benutzt _name.

00084 {   return _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 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

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 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

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 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

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 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

public int IsPlayerCorpse (  ) 

Definiert in Zeile 143 der Datei corpse.c.

Benutzt spielerleiche.

00143 { return spielerleiche; }

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 }

Hier ist ein Graph der zeigt, wo diese Funktion aufgerufen wird:

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 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

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 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

Hier ist ein Graph der zeigt, wo diese Funktion aufgerufen wird:

int MayAddObject ( object  ob  ) 

Definiert in Zeile 79 der Datei corpse.c.

00079 { return 1; }

int MayAddWeight ( int  weight  ) 

Definiert in Zeile 78 der Datei corpse.c.

00078 { return 0; }

int QueryDecay (  ) 

Definiert in Zeile 246 der Datei corpse.c.

Benutzt _decay.

00246 { return _decay; }

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 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

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 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

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 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

Hier ist ein Graph der zeigt, wo diese Funktion aufgerufen wird:


Variablen-Dokumentation

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().

inherit std container

Definiert in Zeile 24 der Datei corpse.c.

private nosave int gespottet = 0

Definiert in Zeile 40 der Datei corpse.c.

Wird benutzt von spott().

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().

Erzeugt am Thu Jun 3 14:42:18 2010 für MorgenGrauen Mudlib von  doxygen 1.6.3