combat.c-Dateireferenz

#include <sys_debug.h>
#include <thing/properties.h>
#include <thing/commands.h>
#include <thing/description.h>
#include <language.h>
#include <combat.h>
#include <attributes.h>
#include <defines.h>
#include <moving.h>
#include <new_skills.h>
Include-Abhängigkeitsdiagramm für combat.c:

gehe zum Quellcode dieser Datei

Makrodefinitionen

#define NEED_PROTOTYPES

Funktionen

void create ()
void doWieldMessage ()
void doUnwieldMessage (object wielded_by)
protected void InformWield (object pl, int silent)
protected void InformUnwield (object pl, int silent)
varargs int wield_me (int silent)
varargs int DoWield (int silent)
varargs int DoUnwield (int silent)
varargs int wield (string str, int silent)
int unwield (string str)
int QueryDamage (object enemy)
int QueryDefend (string *dam_type, mixed spell, object enemy)
int _set_nr_hands (int arg)
mixed _set_dam_type (mixed arg)
mixed _set_item_damaged (mixed arg)
mixed _set_hit_func (mixed arg)
mixed _set_defend_func (mixed arg)
int _query_max_wc ()
int Damage (int new_dam)
varargs void TakeFlaw (object enemy)
mixed * QueryFlaw ()

Variablen

int ftime
int flaw
static private int logged
static private closure defend_cl
static private closure hit_cl

Makro-Dokumentation

#define NEED_PROTOTYPES

Definiert in Zeile 15 der Datei combat.c.


Dokumentation der Funktionen

int _query_max_wc (  ) 

Definiert in Zeile 693 der Datei combat.c.

Benutzt P_DAMAGED, P_EFFECTIVE_WC, P_WC und QueryProp().

00694 {   int a,b;
00695 
00696     a=QueryProp(P_WC)+QueryProp(P_DAMAGED);
00697     b=QueryProp(P_EFFECTIVE_WC);
00698     if (b>a)
00699         return b;
00700     return a;
00701 }

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

mixed _set_dam_type ( mixed  arg  ) 

Definiert in Zeile 645 der Datei combat.c.

Benutzt F_VALUE, P_DAM_TYPE, Query() und Set().

00646 {
00647     if (pointerp(arg))
00648     {
00649         return Set(P_DAM_TYPE, arg, F_VALUE);
00650     }
00651     else if (stringp(arg))
00652     {
00653         return Set(P_DAM_TYPE, ({ arg }), F_VALUE);
00654     }
00655     return Query(P_DAM_TYPE, F_VALUE);
00656 }

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

mixed _set_defend_func ( mixed  arg  ) 

Definiert in Zeile 684 der Datei combat.c.

Benutzt defend_cl, F_VALUE, P_DEFEND_FUNC und Set().

00685 {
00686     defend_cl=0;
00687     return Set(P_DEFEND_FUNC, arg, F_VALUE);
00688 }

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

mixed _set_hit_func ( mixed  arg  ) 

Definiert in Zeile 676 der Datei combat.c.

Benutzt F_VALUE, hit_cl, P_HIT_FUNC und Set().

00677 {
00678     hit_cl=0;
00679     return Set(P_HIT_FUNC, arg, F_VALUE);
00680 }

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

mixed _set_item_damaged ( mixed  arg  ) 

Definiert in Zeile 660 der Datei combat.c.

Benutzt F_VALUE, P_DAMAGED, Query(), QueryProp() und Set().

00661 {
00662     if (arg && !intp(arg))
00663     {
00664         return Query(P_DAMAGED, F_VALUE);
00665     }
00666 
00667     if (previous_object(1))
00668       call_other("/secure/awmaster","RegisterDamager",
00669             previous_object(1),QueryProp(P_DAMAGED),arg);
00670     
00671     return Set(P_DAMAGED,arg,F_VALUE);
00672 }

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

int _set_nr_hands ( int  arg  ) 

Definiert in Zeile 636 der Datei combat.c.

Benutzt F_VALUE, Query() und Set().

00637 {
00638     if (!intp(arg) || (arg<1) )
00639         return Query(P_NR_HANDS, F_VALUE);
00640     return Set(P_NR_HANDS, arg, F_VALUE);
00641 }

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

void create (  ) 

Definiert in Zeile 33 der Datei combat.c.

Benutzt AddCmd(), defend_cl, DT_BLUDGEON, F_MODE_AS, F_VALUE, flaw, ftime, hit_cl, logged, P_AC, P_DAM_TYPE, P_DAMAGED, P_LAST_USE, P_PARRY, P_RESTRICTIONS, P_WEAPON_TYPE, P_WIELDED, PARRY_NOT, PROTECTED, Set(), SetProp() und WT_CLUB.

00034 {
00035     // Variablen initialisieren
00036     logged=ftime=flaw=0;
00037     defend_cl=0;
00038     hit_cl=0;
00039 
00040     // Einige Grundwerte setzen
00041     SetProp(P_WEAPON_TYPE, WT_CLUB);
00042     SetProp(P_DAM_TYPE, ({DT_BLUDGEON}));
00043     SetProp(P_NR_HANDS, 2);
00044     SetProp(P_PARRY,PARRY_NOT);
00045     SetProp(P_AC,0);
00046     Set(P_RESTRICTIONS,([]),F_VALUE);
00047     Set(P_LAST_USE,time(),F_VALUE);
00048 
00049     // Einige Properties sollten nicht von aussen gesetzt werden koennen
00050     Set(P_PARRY,   PROTECTED, F_MODE_AS);
00051     Set(P_WIELDED, PROTECTED, F_MODE_AS);
00052     Set(P_LAST_USE,PROTECTED, F_MODE_AS);
00053     
00054     // Diese kann von aussen gesetzt werden (noch), aber bitte nur ueber die
00055     // hier definierte Setmethode.
00056     Set(P_DAMAGED, PROTECTED, F_MODE_AS);
00057 
00058     // Eine Waffe benoetigt Kommandos, mit denen man sie zuecken 
00059     // und wegstecken kann
00060     AddCmd( ({"zueck","zuecke","zieh","ziehe"}), "wield" );
00061     AddCmd( ({"steck","stecke"}), "unwield" );
00062 }

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

int Damage ( int  new_dam  ) 

Definiert in Zeile 707 der Datei combat.c.

Benutzt F_VALUE, MAX_PARRY_CLASS, MAX_WEAPON_CLASS, MIN_PARRY_CLASS, MIN_WEAPON_CLASS, P_AC, P_DAMAGED, P_PARRY, P_TOTAL_AC, P_TOTAL_WC, P_WC, P_WIELDED, PARRY_ONLY, QueryProp(), Set() und SetProp().

00708 {   int    wc,old_dam;
00709     object w;
00710 
00711     // Uebergebenes Argument pruefen
00712     if (!new_dam || !intp(new_dam))
00713     {
00714         return 0;
00715     }
00716 
00717     // Bei Waffen, die nicht ausschliesslich zur Parade eingesetzt werden,
00718     // geht die Beschaedigung auf die Kampfkraft, sprich: P_WC
00719     if (QueryProp(P_PARRY)<PARRY_ONLY)
00720     {
00721         if ((wc=QueryProp(P_WC))<=MIN_WEAPON_CLASS && new_dam>0)
00722         {
00723             // Sonst wuerde Beschaedigung zur Reparatur fuehren
00724             return 0;
00725         }
00726 
00727         // Min-WC und Max-WC beachten
00728         if ((wc-new_dam) < MIN_WEAPON_CLASS)
00729         {
00730             new_dam = wc-MIN_WEAPON_CLASS;
00731         }
00732         else if ((wc-new_dam) > MAX_WEAPON_CLASS)
00733         {
00734             new_dam = wc-MAX_WEAPON_CLASS;
00735         }
00736 
00737         // Nie mehr als 100% reparieren
00738         if (((old_dam=QueryProp(P_DAMAGED))<-new_dam) && new_dam<0)
00739         {
00740             new_dam=-old_dam;
00741         }
00742 
00743         // Aenderungen an der Waffenklasse und der dem Beschaedigungswert
00744         // durchfuehren
00745         SetProp(P_WC,(wc-new_dam));
00746         // Ausnahmeweise Set, um die loggende Setmethode zu umgehen.
00747                 // TODO: SetProp, sobald direktes Beschaedigen raus ist.
00748                 Set(P_DAMAGED, old_dam+new_dam, F_VALUE);
00749 
00750         // P_TOTAL_WC im Traeger updaten, so vorhanden
00751         if (objectp(w=QueryProp(P_WIELDED)))
00752             w->QueryProp(P_TOTAL_WC);
00753 
00754         // Rueckgabewert: Durchgefuehrte Aenderung an P_DAMAGE
00755         return new_dam;
00756     }
00757 
00758     // Bei reinen Parierwaffen geht die Beschaedigung auf die
00759     // Schutzwirkung, sprich: P_AC
00760 
00761     if ((wc=QueryProp(P_AC))<=0 && new_dam>0)
00762     {
00763         // Sonst wuerde Beschaedigung zur Reparatur fuehren
00764         return 0;
00765     }
00766     
00767     // Min-AC=0 und Max-AC beachten
00768     if ((wc-new_dam) < MIN_PARRY_CLASS)
00769     {
00770         new_dam = wc-MIN_PARRY_CLASS;
00771     }
00772     else if ((wc-new_dam) > MAX_PARRY_CLASS)
00773     {
00774         new_dam = wc-MAX_PARRY_CLASS;
00775     }
00776  
00777     // Nie mehr als 100% reparieren
00778     if (((old_dam=QueryProp(P_DAMAGED))<-new_dam) && new_dam<0)
00779     {
00780         new_dam=-old_dam;
00781     }
00782 
00783     // Aenderungen an der Ruestungsklasse und dem Beschaedigungswert
00784     // durchfuehren
00785     SetProp(P_AC,wc-new_dam);
00786     // Ausnahmeweise Set, um die loggende Setmethode zu umgehen.
00787     // TODO: SetProp, sobald direktes Beschaedigen raus ist.
00788     Set(P_DAMAGED,old_dam+new_dam, F_VALUE);
00789 
00790     // P_TOTAL_AC im Traeger updaten, so vorhanden
00791     if (objectp(w=QueryProp(P_WIELDED)))
00792         w->QueryProp(P_TOTAL_AC);
00793     
00794     // Rueckgabewert: Durchgefuehrte Aenderung an P_DAMAGE
00795     return new_dam;
00796 }

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

varargs int DoUnwield ( int  silent  ) 

Definiert in Zeile 403 der Datei combat.c.

Benutzt break_string(), cl, doUnwieldMessage(), InformUnwield(), M_NOCHECK, ME, name, P_CURSED, P_PARRY, P_PARRY_WEAPON, P_TOTAL_AC, P_TOTAL_WC, P_UNWIELD_FUNC, P_UNWIELD_TIME, P_WEAPON, P_WIELDED, PARRY_NOT, PARRY_ONLY, QueryProp(), SetProp() und WEN.

Wird benutzt von move(), remove() und unwield().

00404 {   closure cl;
00405     int     parry;
00406     mixed   res;
00407     object  wielded_by;
00408 
00409     // Waffen, die nicht gezueckt sind, kann man natuerlich nicht
00410     // wegstecken
00411     if (!objectp(wielded_by=QueryProp(P_WIELDED)))
00412     {
00413         return 0;
00414     }
00415 
00416     // Ist eine UnwieldFunc gesetzt, wird diese aufgerufen
00417     if ( objectp(res=QueryProp(P_UNWIELD_FUNC)) &&
00418          !(res->UnwieldFunc(ME,silent,wielded_by)) ) 
00419     {
00420         // Eine Meldung muss die UnwieldFunc schon selbst ausgeben.
00421         return 1;
00422     }
00423 
00424     // Eine verfluchte Waffe kann man natuerlich nicht wegstecken - aber
00425     // auch da gibts Ausnahmefaelle, wie z.B. den Tod eines Spielers
00426     if ((res=QueryProp(P_CURSED)) && !(silent&M_NOCHECK)) 
00427     {
00428         if (stringp(res))
00429         {
00430             // Stand in P_CURSED ein String? Dann diesen ausgeben
00431             tell_object(wielded_by, 
00432                 (res[<1]=='\n' ? res : break_string(res,78)));
00433         }
00434         else
00435         {
00436             // Sonst eine Standard-Meldung ausgeben
00437             tell_object(wielded_by, break_string(
00438                 "Du kannst "+name(WEN)+" nicht wegstecken.",78));
00439         }
00440         return 1;
00441     }
00442 
00443     // Ok, jetzt ist alles klar, die (Parier)Waffe wird weggesteckt
00444     parry=QueryProp(P_PARRY);
00445     cl=symbol_function("SetProp",wielded_by);
00446 
00447     if (parry<PARRY_ONLY)
00448     {
00449         // Eintrag als Waffe im Spieler loeschen
00450         funcall(cl,P_WEAPON, 0);
00451     }
00452     if (parry>PARRY_NOT)
00453     {
00454         // Eintrag als Parierwaffe im Spieler loeschen
00455         funcall(cl,P_PARRY_WEAPON, 0);
00456     }
00457 
00458     // Im Spieler die Zeit setzen, zu der er zuletzt eine Waffe weggesteckt
00459     // hat.
00460     funcall(cl,P_UNWIELD_TIME,time());
00461 
00462     // Meldung ausgeben, wenn silent-Flag nicht gesetzt ist
00463     if (!silent) 
00464     {
00465         doUnwieldMessage(wielded_by);
00466     } 
00467 
00468     // Die Haende, die bisher von der Waffe benutzt wurden, freigeben
00469     wielded_by->FreeHands(ME);
00470     SetProp(P_WIELDED, 0);
00471 
00472     // Waffen koennen Attribute aendern/blockieren. Also muessen diese
00473     // nach dem Wegstecken aktualisiert werden
00474     wielded_by->deregister_modifier(ME);
00475     wielded_by->UpdateAttributes();
00476 
00477     // P_TOTAL_AC/P_TOTAL_WC im Spieler aktualisieren. Da dort Attribute
00478     // eingehen, kann das erst hier gemacht werden.
00479     if (parry<PARRY_ONLY)
00480     {
00481         wielded_by->QueryProp(P_TOTAL_WC);
00482     }
00483     if (parry>PARRY_NOT)
00484     {
00485         wielded_by->QueryProp(P_TOTAL_AC);
00486     }
00487 
00488     // Inform-Funktion aufrufen
00489     InformUnwield(wielded_by, silent);
00490 
00491     // Fertig mit dem Wegstecken
00492     return 1;
00493 }

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

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

void doUnwieldMessage ( object  wielded_by  ) 

Definiert in Zeile 138 der Datei combat.c.

Benutzt break_string(), BS_LEAVE_MY_LFS, name, P_UNWIELD_MSG, QueryProp(), replace_personal(), WEN und WER.

Wird benutzt von DoUnwield().

00139 {
00140   string *str,s1;
00141 
00142   if(!objectp(wielded_by))  // Hoops! Gar nicht gezueckt? Abbruch!
00143   {
00144     return;
00145   }
00146 
00147   if(QueryProp(P_UNWIELD_MSG))  // Hier gibt es eine UnwieldMsg.
00148   {
00149     if(closurep(QueryProp(P_UNWIELD_MSG)))  // Sogar als Closure, wow :-)
00150     {
00151       str = funcall(QueryProp(P_UNWIELD_MSG),wielded_by);
00152 
00153       if(interactive(wielded_by))
00154       {
00155         tell_object(wielded_by,break_string(str[0],78, 0, BS_LEAVE_MY_LFS));
00156       }
00157       //(Zesstra): say() ist hier bloed, weil es an das Env vom this_player()
00158       //ausgibt, sofern der existiert. So koennen Spieler die meldung kriegen,
00159       //obwohl die laengst woanders sind (z.B. Sequenzen)
00160       //Daher nun Ausgabe an das Env vom Env (es ist fuer tell_room() egal,
00161       //ob das nen Raum ist oder nicht, daher keine Pruefung, ob es wirklich
00162       //ein Raum ist. ;-)
00163       //say(break_string(str[1],78,0, BS_LEAVE_MY_LFS),({ wielded_by }));
00164       if ( objectp(environment()) && objectp(environment(environment())) )
00165                   tell_room(environment(environment()),
00166                       break_string(str[1],78,0, BS_LEAVE_MY_LFS),({ wielded_by }) );
00167     
00168       return;
00169     }
00170   
00171     else if(interactive(wielded_by))
00172     {
00173       s1 = replace_personal(sprintf(QueryProp(P_UNWIELD_MSG)[0],"@WEN2"),
00174                                       ({this_player(),this_object()}), 1);
00175     
00176       tell_object(wielded_by,break_string(s1,78, 0 , BS_LEAVE_MY_LFS));
00177     }
00178 
00179     s1 = replace_personal(sprintf(QueryProp(P_UNWIELD_MSG)[1],"@WEN1","@WEN2"),
00180                                     ({wielded_by, this_object()}), 1);
00181     
00182     //s.o., ersetzt durch tell_toom()
00183     //say(break_string(s1,78, 0, BS_LEAVE_MY_LFS ),({ wielded_by }));
00184     if ( objectp(environment()) && objectp(environment(environment())) )
00185                 tell_room(environment(environment()),
00186                     break_string(s1,78, 0, BS_LEAVE_MY_LFS ),({ wielded_by }) );
00187     
00188     return;
00189   }
00190   /*
00191    * Keine UnwieldMsg, also Default-Meldungen ausgeben.
00192    */
00193   else if(interactive(wielded_by))
00194   {
00195     tell_object(wielded_by,break_string("Du steckst "
00196      +name(WEN,1)+" zurueck.",78));
00197   }
00198   //s.o., ersetzt durch tell_room()
00199   //say(break_string(wielded_by->Name(WER)+" steckt "
00200   // +name(WEN,0)+" zurueck.",78),({ wielded_by }));
00201   if ( objectp(environment()) && objectp(environment(environment())) )
00202       tell_room(environment(environment()),break_string(wielded_by->Name(WER)
00203                     +" steckt "+name(WEN,0)+" zurueck.",78),
00204                   ({wielded_by }) );
00205 }

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

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

varargs int DoWield ( int  silent  ) 

Definiert in Zeile 229 der Datei combat.c.

Benutzt _notify_fail(), A_DEX, break_string(), cl, doWieldMessage(), InformWield(), logged, MAX_PARRY_CLASS, MAX_WEAPON_CLASS, ME, name, notify_fail(), P_AC, P_EQUIP_TIME, P_M_ATTR_MOD, P_PARRY, P_PARRY_WEAPON, P_RESTRICTIONS, P_TOTAL_AC, P_TOTAL_WC, P_WC, P_WEAPON, P_WIELD_FUNC, P_WIELDED, PARRY_NOT, PARRY_ONLY, PL, QueryProp(), SetProp(), WEM und WEN.

Wird benutzt von wield().

00230 {   int     dex, parry;
00231     closure cl;
00232     mixed   res;
00233   
00234     // Man kann nur Waffen zuecken, die man auch im Inventory hat.
00235     if (environment()!=PL) 
00236     {
00237         _notify_fail( break_string(
00238             "Du musst "+name(WEN,1)+" schon erst nehmen!",78) );
00239         return 0;
00240     }
00241 
00242     // Eine gezueckte Waffe kann man natuerlich nicht nochmal zuecken
00243     if (QueryProp(P_WIELDED)) 
00244     {
00245         notify_fail("Das hast Du schon gemacht!\n");
00246         return 0;
00247     }
00248 
00249     // Waffen, die ein oder mehrere Attribut veraendern und gegen
00250     // das gesetzte Limit verstossen, haben keine Wirkung bezueglich der
00251     // Attribute.
00252     if ( mappingp(res=QueryProp(P_M_ATTR_MOD)) && PL->TestLimitViolation(res) )
00253     {
00254         write(break_string(
00255             "Irgendetwas an Deiner Ausruestung verhindert, dass Du Dich mit "+
00256             name(WEM,1)+" so richtig wohl fuehlst.",78));
00257     }
00258 
00259     // Ueber P_RESTRICTIONS kann man einige Restriktionen definieren, ohne
00260     // gleich auf eine WieldFunc zurueckgreifen zu muessen.
00261     // Die Auswertung erfolgt ueber den RestrictionChecker
00262     if ( (res=QueryProp(P_RESTRICTIONS)) && mappingp(res) &&
00263          (res=(string)call_other("/std/restriction_checker","check_restrictions",
00264              PL,res)) && stringp(res) ) 
00265     {
00266         notify_fail(res);
00267         return 0;
00268     }
00269 
00270     parry=(int)QueryProp(P_PARRY);
00271     dex=(int)PL->QueryAttribute(A_DEX);
00272 
00273     // Testen, ob der Spieler die noetige Geschicklichkeit besitzt, um
00274     // mit dieser (Parier)Waffe umgehen zu koennen
00275     if ( ((parry<PARRY_ONLY) && ((dex+8)*10)<QueryProp(P_WC)) || 
00276          ((parry>PARRY_NOT)  && ((dex+5)*2 )<QueryProp(P_AC)) )
00277     {
00278         notify_fail(
00279             "Du bist nicht geschickt genug, um mit dieser Waffe umzugehen.\n");
00280         return 0;
00281     }
00282 
00283     // Eine Gezueckte Waffe muss natuerlich erst mal weggesteckt werden.
00284     if ( (parry<PARRY_ONLY) && objectp(res=(object)PL->QueryProp(P_WEAPON)) )
00285     {
00286         if ( (res->DoUnwield(silent)) && !((object)PL->QueryProp(P_WEAPON)) )
00287         {
00288             // Wenn die alte Waffe weggesteckt werden konnte, nochmal
00289             // versuchen zu zuecken
00290             return DoWield(silent);
00291         }
00292         else 
00293         {
00294             // Sonst Meldung ausgeben
00295             notify_fail("Das geht nicht, solange Du noch eine andere "+
00296                  "Waffe gezueckt hast.\n");
00297             return 0;
00298         }
00299     }
00300     // Das gleiche gilt natuerlich fuer Parierwaffen
00301     if ( (parry>PARRY_NOT) && objectp(res=(object)PL->QueryProp(P_PARRY_WEAPON)) )
00302     {
00303         if ( (res->DoUnwield(silent)) && !(PL->QueryProp(P_PARRY_WEAPON)) )
00304         {
00305             // Wenn die alte Parierwaffe weggesteckt werden konnte, nochmal
00306             // versuchen zu zuecken
00307             return DoWield(silent);
00308         }
00309         else 
00310         {
00311             // Sonst Meldung ausgeben
00312             notify_fail("Das geht nicht, solange Du noch eine andere "+
00313                  "Paierwaffe gezueckt hast.\n");
00314             return 0;
00315         }
00316     }
00317 
00318     // Ist eine WieldFunc gesetzt, wird diese aufgerufen.
00319     if (objectp(res=QueryProp(P_WIELD_FUNC)) 
00320                 && !(res->WieldFunc(ME,silent,environment())))
00321     {
00322         // Eine Meldung sollte schon von der WieldFunc ausgegeben werden.
00323         return 1;
00324     }
00325 
00326     // Die zulaessigen Hoechstwerte duerfen natuerlich nicht
00327     // ueberschritten werden.
00328     if ( (parry<PARRY_ONLY) && (QueryProp(P_WC)>MAX_WEAPON_CLASS) )
00329     {
00330         notify_fail(
00331             "Ungueltige Waffenklasse, bitte Erzmagier verstaendigen.\n");
00332         return 0;
00333     }
00334     if ( (parry>PARRY_NOT) && (QueryProp(P_AC)>MAX_PARRY_CLASS) )
00335     {
00336         notify_fail(
00337             "Ungueltige Parierklasse, bitte Erzmagier verstaendigen.\n");
00338         return 0;
00339     }
00340 
00341     // Testen, ob der Zuecker genug Haende frei hat.  
00342     if (!(PL->UseHands(ME,QueryProp(P_NR_HANDS))))
00343     {
00344         notify_fail("Du hast keine Hand mehr frei.\n");
00345         return 0;
00346     }
00347 
00348     // Ok, jetzt ist alles klar, die (Parier)Waffe wird gezueckt
00349     SetProp(P_WIELDED, PL);
00350     SetProp(P_EQUIP_TIME,time());
00351 
00352     cl=symbol_function("SetProp",PL);
00353 
00354     if (parry<PARRY_ONLY)
00355     {
00356         // Dieses Objekt als Waffe setzen
00357         funcall(cl,P_WEAPON, ME );
00358     }
00359     if (parry>PARRY_NOT)
00360     {
00361         // Dieses Objekt als Parierwaffe setzen
00362         funcall(cl,P_PARRY_WEAPON, ME );
00363     }
00364 
00365     // Waffen koennen Attribute aendern/blockieren. Also muessen diese
00366     // nach dem Zuecken aktualisiert werden
00367     PL->register_modifier(ME);
00368     PL->UpdateAttributes();
00369 
00370     // P_TOTAL_AC/P_TOTAL_WC im Spieler aktualisieren. Da dort Attribute
00371     // eingehen, kann das erst hier gemacht werden.
00372     if (parry<PARRY_ONLY)
00373     {
00374         PL->QueryProp(P_TOTAL_WC);
00375     }
00376     if (parry>PARRY_NOT)
00377     {
00378         PL->QueryProp(P_TOTAL_AC);
00379     }
00380 
00381     // Zueck-Meldung ausgeben, wenn das silent-Flag nicht gesetzt ist
00382     if (!silent)
00383     {
00384         doWieldMessage();
00385     }
00386 
00387     // Alle Waffen werden im awmaster registriert, sobald sie von einem
00388     // Spieler gezueckt werden
00389     if (!logged && query_once_interactive(PL)) 
00390     {
00391         call_other("/secure/awmaster","RegisterWeapon",ME);
00392         logged=1;
00393     }
00394 
00395     // Inform-Funktion aufrufen
00396     InformWield(PL,silent);
00397 
00398     // Fertig mit dem Zuecken
00399     return 1;
00400 }

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

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

void doWieldMessage (  ) 

Definiert in Zeile 68 der Datei combat.c.

Benutzt break_string(), BS_LEAVE_MY_LFS, Name(), name, P_WIELD_MSG, QueryProp(), replace_personal(), WEN und WER.

Wird benutzt von DoWield().

00069 {
00070   string *str, s1;
00071   
00072   if(QueryProp(P_WIELD_MSG))  // Ist eine WieldMsg gesetzt?
00073   {
00074     if(closurep(QueryProp(P_WIELD_MSG)))  // Sogar als eigene Fkt.?
00075     {
00076       str = funcall(QueryProp(P_WIELD_MSG),this_player());
00077 
00078       if(interactive(this_player()))
00079       {
00080         write(break_string(str[0],78, 0, BS_LEAVE_MY_LFS));
00081       }
00082     
00083       //(Zesstra): say() ist hier bloed, weil es an das Env vom this_player()
00084       //ausgibt, sofern der existiert. So koennen Spieler die meldung kriegen,
00085       //obwohl die laengst woanders sind (z.B. Sequenzen)
00086       //Daher nun Ausgabe an das Env vom Env (es ist fuer tell_room() egal, 
00087       //ob das nen Raum ist oder nicht, daher keine Pruefung, ob es wirklich
00088       //ein Raum ist. ;-)
00089       //say(break_string(str[1],78, 0, BS_LEAVE_MY_LFS),({ this_player() }));
00090       if ( objectp(environment()) && objectp(environment(environment())) )
00091           tell_room(environment(environment()),
00092                     break_string(str[1],78, 0, BS_LEAVE_MY_LFS),({ this_player()}) );
00093     
00094       return;
00095     }
00096   
00097     else if(interactive(this_player()))
00098     {
00099       s1 = replace_personal(sprintf(QueryProp(P_WIELD_MSG)[0],"@WEN2"),
00100                                       ({this_player(),this_object()}), 1);
00101 
00102       write(break_string(s1,78, 0, BS_LEAVE_MY_LFS));
00103     }
00104 
00105     // Abwaertskompatibel: Das erste %s wird zu WEN1, das zweite zu WEN2
00106     s1 = replace_personal(sprintf(QueryProp(P_WIELD_MSG)[1],"@WEN1","@WEN2"),
00107                                     ({this_player(), this_object()}), 1);
00108    
00109     //s.o., ersetzt durch tell_room()
00110     //say(break_string(s1,78, 0, BS_LEAVE_MY_LFS ),({ this_player() }));
00111     if ( objectp(environment()) && objectp(environment(environment())) )
00112                 tell_room(environment(environment()),
00113                   break_string(s1,78, 0, BS_LEAVE_MY_LFS ),({this_player()}) );
00114     
00115     return;
00116   }
00117   /*
00118    * Keine WieldMsg gesetzt, Ausgabe der Default-Meldungen.
00119    */
00120   else if(interactive(this_player()))
00121   {
00122     write(break_string("Du zueckst "+name(WEN,1)+".",78));
00123   }
00124   
00125   //s.o. ersetzt durch tell_room()
00126   //say(break_string(this_player()->Name(WER)+" zueckt "
00127   // +name(WEN,0)+".",78),({ this_player() }));
00128   if ( objectp(environment()) && objectp(environment(environment())) )
00129       tell_room(environment(environment()),break_string(
00130                   this_player()->Name(WER)+" zueckt "+name(WEN,0)
00131                   +".",78),({ this_player() }));
00132 }

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

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

protected void InformUnwield ( object  pl,
int  silent 
)

Definiert in Zeile 215 der Datei combat.c.

Wird benutzt von DoUnwield().

00216 {
00217     return;
00218 }

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

protected void InformWield ( object  pl,
int  silent 
)

Definiert in Zeile 208 der Datei combat.c.

Wird benutzt von DoWield().

00209 {
00210     return;
00211 }

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

int QueryDamage ( object  enemy  ) 

Definiert in Zeile 556 der Datei combat.c.

Benutzt A_STR, hit_cl, P_HIT_FUNC, P_LAST_USE, P_WC, P_WIELDED, QueryProp() und SetProp().

Wird benutzt von Attack().

00557 {   int    dam;
00558     mixed  hit_func;
00559     object wielder;
00560 
00561     // Nur gezueckte Waffen machen Schaden
00562     if (!objectp(wielder=QueryProp(P_WIELDED)))
00563         return 0;
00564 
00565     // Den Basis-Schaden berechnen. Die Staerke des Benutzers wird
00566     // hier beruecksichtigt.
00567     dam = (2*QueryProp(P_WC)+10*((int)wielder->QueryAttribute(A_STR)))/3;
00568 
00569     // Wie gut man getroffen hat, wird ueber ein random() simuliert
00570     dam = random(1+dam);
00571 
00572     // Ist eine HitFunc gesetzt, dann wird diese ausgewertet. Der 
00573     // Rueckgabe-Wert wird zum Schaden addiert
00574     if (!hit_cl || !get_type_info(hit_cl,2))
00575     {
00576         if (objectp(hit_func=QueryProp(P_HIT_FUNC)))
00577         {
00578             hit_cl=symbol_function("HitFunc",hit_func);
00579         }
00580     }
00581     if (hit_cl && get_type_info(hit_cl,2))
00582     {
00583         dam += funcall(hit_cl,enemy);
00584     }
00585 
00586     // Zeitpunkt der letzten Benutzung ausgeben
00587     SetProp(P_LAST_USE,time());
00588 
00589     // Berechneten Schaden zurueckgeben
00590     return dam;
00591 }

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

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

int QueryDefend ( string *  dam_type,
mixed  spell,
object  enemy 
)

Definiert in Zeile 594 der Datei combat.c.

Benutzt defend_cl, P_AC, P_DEFEND_FUNC, P_LAST_USE, P_WIELDED, PHYSICAL_DAMAGE_TYPES, pl, QueryProp(), SetProp() und SP_PHYSICAL_ATTACK.

00595 {   int     prot;
00596     mixed   def_func;
00597     object  pl;
00598 
00599     prot = 0;
00600 
00601     // Ruestungen schuetzen nur gegen physikalischen Schaden
00602     if (!spell || (mappingp(spell) && spell[SP_PHYSICAL_ATTACK]))
00603     {
00604         if (sizeof(filter(dam_type,PHYSICAL_DAMAGE_TYPES)))
00605         {
00606             prot = random(1+QueryProp(P_AC));
00607         }
00608     }
00609 
00610     // Ist eine DefendFunc gesetzt, wird diese ausgewertet
00611     if (!defend_cl || !get_type_info(defend_cl,2))
00612     {
00613         if (objectp(def_func=QueryProp(P_DEFEND_FUNC))) 
00614         {
00615             defend_cl=symbol_function("DefendFunc",def_func);
00616         }
00617     }
00618     //Bei Netztoten keine (zurueckschlagende) DefendFunc
00619     if (defend_cl && get_type_info(defend_cl,2) &&
00620         objectp(pl=QueryProp(P_WIELDED)) && (!query_once_interactive(pl) ||
00621         interactive(pl)) )
00622     {
00623         // Der Rueckgabewert der DefendFunc wird zum Schutz addiert
00624         prot += funcall(defend_cl, dam_type, spell, enemy);
00625     }
00626 
00627     // Zeitpunkt der letzten Benutzung ausgeben
00628     SetProp(P_LAST_USE,time());
00629 
00630     // Berechneten Schutz zurueckgeben
00631     return prot;
00632 }

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

mixed* QueryFlaw (  ) 

Definiert in Zeile 817 der Datei combat.c.

Benutzt dtime(), flaw und ftime.

00818 {
00819     return({flaw,ftime,dtime(ftime)});
00820 }

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

varargs void TakeFlaw ( object  enemy  ) 

Definiert in Zeile 800 der Datei combat.c.

Benutzt c, Damage(), flaw, ftime, P_QUALITY und QueryProp().

00801 {   int c;
00802 
00803     // Flaw-Wert erhoehen
00804     flaw++;
00805 
00806     // Ist der Waffe eine Qualitaet gesetzt worden, so kann es zu einer
00807     // allmaehlichen Beschaedigung der Waffe kommen
00808     if ((c=QueryProp(P_QUALITY)) && !(flaw%c))
00809         Damage(1);
00810 
00811     // Zeitpunkt des ersten Aufrufes festhalten
00812     if (!ftime)
00813         ftime=time();
00814 }

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

int unwield ( string  str  ) 

Definiert in Zeile 514 der Datei combat.c.

Benutzt _notify_fail(), DoUnwield(), ME, P_PARRY, P_PARRY_WEAPON, P_WEAPON, P_WIELDED, PARRY_NOT, PARRY_ONLY, PL und QueryProp().

00515 {   int    parry;
00516     string dummy;
00517 
00518     // Erstmal die Eingabe auswerten. Ist dies wirklich ein Kommando
00519     // zum Wegstecken?
00520     if ( !stringp(str) || (sscanf(str,"%s weg",     dummy)!=1  && 
00521                            sscanf(str,"%s ein",     dummy)!=1  &&
00522                            sscanf(str,"%s zurueck", dummy)!=1 ) )
00523     {
00524         return 0;
00525     }
00526 
00527     str = dummy;
00528     parry=QueryProp(P_PARRY);
00529 
00530     // Ist wirklich diese Waffe gemeint?
00531     if ( !stringp(str) || !id(str) ||
00532          ((parry<PARRY_ONLY)&&((object)PL->QueryProp(P_WEAPON)!=ME)) ||
00533          ((parry>PARRY_NOT)&&((object)PL->QueryProp(P_PARRY_WEAPON)!=ME)) )
00534     {
00535         return 0;
00536     }
00537 
00538     // Man kann nur Waffen wegstecken, die man auch bei sich hat
00539     if (environment() != PL) 
00540     {
00541         _notify_fail("Diese Waffe gehoert Dir nicht!\n");
00542         return 0;
00543     }
00544 
00545     // Und natuerlich geht das auch nur, wenn die Waffe gezueckt ist.
00546     if (!QueryProp(P_WIELDED)) 
00547     {
00548         _notify_fail("Diese Waffe hast Du gar nicht gezueckt ...\n");
00549         return 0;
00550     }
00551 
00552     return DoUnwield();
00553 }

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

varargs int wield ( string  str,
int  silent 
)

Definiert in Zeile 496 der Datei combat.c.

Benutzt _notify_fail() und DoWield().

00497 {
00498     if ( !stringp(str) ||
00499          (query_verb()[0..3]=="zieh" && sscanf(str,"%s hervor",str)!=1) )
00500     {
00501         return 0;
00502     }
00503 
00504     if (!id(str)) 
00505     {
00506         _notify_fail("Du hast sowas nicht.\n");
00507         return 0;
00508     }
00509 
00510     return DoWield(silent);
00511 }

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

varargs int wield_me ( int  silent  ) 

Definiert in Zeile 222 der Datei combat.c.

00223 {
00224   raise_error("wield_me() ist veraltet. Bitte nutze DoWield()\n");
00225   return 1;
00226 }


Variablen-Dokumentation

private closure defend_cl [static]

Definiert in Zeile 31 der Datei combat.c.

int flaw

Definiert in Zeile 29 der Datei combat.c.

int ftime

Definiert in Zeile 29 der Datei combat.c.

private closure hit_cl [static]

Definiert in Zeile 31 der Datei combat.c.

Wird benutzt von _set_hit_func(), create() und QueryDamage().

private int logged [static]

Definiert in Zeile 30 der Datei combat.c.

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