combat.c-Dateireferenz

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

gehe zum Quellcode dieser Datei

Makrodefinitionen

#define NEED_PROTOTYPES

Funktionen

void create ()
int QueryDefend (string *dam_type, mixed spell, object enemy)
static mixed _set_armour_type (mixed type)
static object _set_defend_func (object arg)
static mixed _set_dam_type (mixed arg)
static mixed _set_resistance_strengths (mixed resmap)
static mapping _query_resistance_strengths ()

Variablen

private nosave closure defend_cl
private nosave mapping resistance_strengths = ([])

Makro-Dokumentation

#define NEED_PROTOTYPES

Definiert in Zeile 13 der Datei combat.c.


Dokumentation der Funktionen

static mapping _query_resistance_strengths (  )  [static]

Definiert in Zeile 218 der Datei combat.c.

Benutzt resistance_strengths.

00218                                              {
00219   return (resistance_strengths||([]));
00220 }

static mixed _set_armour_type ( mixed  type  )  [static]

Definiert in Zeile 108 der Datei combat.c.

Benutzt AddId(), AT_ILLEGAL, COMBAT_MASTER, F_VALUE, P_ARMOUR_TYPE, resistance_strengths und Set().

00108                                            {
00109     if (!COMBAT_MASTER->valid_armour_type(type))
00110     {
00111         Set(P_ARMOUR_TYPE, (type=AT_ILLEGAL), F_VALUE);
00112     }
00113     else
00114     {
00115         Set(P_ARMOUR_TYPE, type);
00116     }
00117     AddId(type);
00118 
00119     resistance_strengths=([]);
00120     return type;
00121 }

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

static mixed _set_dam_type ( mixed  arg  )  [static]

Definiert in Zeile 138 der Datei combat.c.

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

00138                                       {
00139     if (pointerp(arg))
00140     {
00141         return Set(P_DAM_TYPE, arg, F_VALUE);
00142     }
00143     else if (stringp(arg))
00144     {
00145         return Set(P_DAM_TYPE, ({ arg }), F_VALUE);
00146     }
00147     return Query(P_DAM_TYPE, F_VALUE);
00148 }

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

static object _set_defend_func ( object  arg  )  [static]

Definiert in Zeile 126 der Datei combat.c.

Benutzt defend_cl, F_VALUE, P_DEFEND_FUNC und Set().

00126                                            {
00127   if (objectp(arg) &&
00128       closurep(defend_cl=symbol_function("DefendFunc",arg))) {  
00129     return Set(P_DEFEND_FUNC, arg, F_VALUE);
00130   }
00131   defend_cl=0;
00132   return(Set(P_DEFEND_FUNC, 0, F_VALUE));
00133 }

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

static mixed _set_resistance_strengths ( mixed  resmap  )  [static]

Definiert in Zeile 156 der Datei combat.c.

Benutzt AT_AMULET, AT_ARMOUR, AT_CLOAK, AT_RING, AT_SHIELD, P_ARMOUR_TYPE, P_WORN, QueryProp() und resistance_strengths.

00156                                                      {
00157     float  max_res;
00158     object worn_by;
00159 
00160     // Es duerfen nur mappings angegeben werden
00161     if (!mappingp(resmap))
00162     {
00163         return -1;
00164     }
00165 
00166     // die Maxwerte muessen jeweils durch -100 geteilt sein, da hinterher
00167     // mit der Prozentzahl multipliziert wird und die angabe der Vorzeichen
00168     // hier umgekehrt wie bei den "normalen" Resistenzen ist. Der
00169     // Maximalwert ist vom Ruestungstyp abhaengig.
00170     switch (QueryProp(P_ARMOUR_TYPE))
00171     {
00172         case AT_CLOAK  :
00173         case AT_RING   :
00174         case AT_AMULET : max_res=-0.0010;
00175                          break;
00176         case AT_SHIELD :
00177         case AT_ARMOUR : max_res=-0.0015;
00178                          break;
00179         default        : max_res=-0.0005;
00180     }
00181 
00182     // Resistenz-Mapping aktualisieren
00183     resistance_strengths=([]);
00184     foreach(string damtype, int res: resmap)
00185     {
00186         if (!intp(res)) res=to_int(res);
00187         // Mehr als 100 Prozent ist nicht erlaubt
00188         if (res>100)
00189         {
00190             res=100;
00191         }
00192         else if (res<0)
00193         {
00194              res=(res/4)*5;
00195              // Man kann auch nicht beliebig negativ werden
00196              if (res<-1000)
00197              {
00198                  res=-1000;
00199              }
00200         }
00201         // Der Resistenzwert berechnet sich aus dem Produkt des
00202         // Maximalwertes und der Prozentzahl
00203         resistance_strengths[damtype]=res*max_res;
00204     }
00205 
00206     // Werden die Resistenzen bei einer getragenen Ruestung geaendert,
00207     // muss der Traeger davon natuerlich beeinflusst werden.
00208     if (objectp(worn_by=QueryProp(P_WORN)))
00209     {
00210         worn_by->AddResistanceModifier(resistance_strengths,
00211                                        QueryProp(P_ARMOUR_TYPE));
00212     }
00213    return resistance_strengths;
00214 }

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

void create (  ) 

Definiert in Zeile 29 der Datei combat.c.

Benutzt AT_ILLEGAL, F_VALUE, P_ARMOUR_TYPE, P_LAST_USE und Set().

00029               {
00030     // Einige Grundwerte setzen
00031     Set(P_ARMOUR_TYPE, AT_ILLEGAL, F_VALUE);
00032     Set(P_LAST_USE,time(),F_VALUE);
00033 }

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

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

Definiert in Zeile 36 der Datei combat.c.

Benutzt AT_MISC, DEF_ARMOUR_PROT, DEFEND_ARMOURS, defend_cl, DEFEND_CUR_ARMOUR_PROT, EINFO_DEFEND, ME, P_AC, P_ARMOUR_TYPE, P_DEFEND_FUNC, P_LAST_USE, P_WORN, PHYSICAL_DAMAGE_TYPES, pl, QueryProp(), SetProp() und SP_PHYSICAL_ATTACK.

00037 {
00038     int     prot;
00039     mixed   def_func;
00040     object  pl;
00041     // Zum Cachen von spell[EINFO_DEFEND], haeufiges Lookup aus dem Mapping
00042     // koennte unnoetig Zeit kosten.
00043     mapping einfo;
00044 
00045     // AT_MISC-Ruetungen schuetzen normalerweise gar nicht...
00046     if (QueryProp(P_ARMOUR_TYPE)==AT_MISC) {
00047                 // es sei denn, sie haben eine spezielle DefendFunc
00048                 if (!closurep(defend_cl)) return(0);
00049     }
00050     else {
00051                 // ansonsten Ruestungsschutz ermitteln und in EINFO_DEFEND vermerken.
00052                 // (Beides fuer AT_MISC in jedem Fall unnoetig)
00053 
00054                 // Ruestungen schuetzen nur gegen physikalischen Schaden
00055                 if ((!spell || (mappingp(spell) && spell[SP_PHYSICAL_ATTACK]))
00056                     && sizeof(filter(dam_type,PHYSICAL_DAMAGE_TYPES)))
00057                 { 
00058                   // Schutz bestimmen
00059                   prot = random(1+QueryProp(P_AC));
00060                   // ruestungschutz an defendfunc weitermelden
00061                   if (mappingp(spell) &&
00062                       mappingp(einfo=spell[EINFO_DEFEND])) {
00063                       // Schutz d. akt. Ruestung vermerken.
00064                       einfo[DEFEND_CUR_ARMOUR_PROT]=prot;
00065                       // daten der Ruestung vermerken.
00066                       if (mappingp(einfo[DEFEND_ARMOURS])) {
00067                                 einfo[DEFEND_ARMOURS][ME,DEF_ARMOUR_PROT]=prot;
00068                       }
00069                   } // ende vom if (mapping(spell) ...)
00070                 } // ende vom if (phys Schaden)
00071 
00072     } // ende vom else (wenn kein AT_MISC) 
00073 
00074     // Ist eine DefendFunc gesetzt, wird diese ausgewertet
00075     if (closurep(defend_cl)) {
00076                 if (!objectp(get_type_info(defend_cl,2))) {
00077                     // Closure gesetzt, aber nicht gueltig, schauen, ob wir sie neu
00078                     // erstellen koennen.
00079                     if (objectp(def_func=QueryProp(P_DEFEND_FUNC))) {
00080                                 defend_cl=symbol_function("DefendFunc",def_func);
00081                     }
00082                     // sonst loeschen, um spaeter diesen Zweig ganz zu sparen.
00083                     else defend_cl=0;
00084                 }
00085                 // BTW: Es ist ok, wenn defend_cl jetzt 0 ist, dann liefert funcall()
00086                 // auch 0.
00087                 // Bei Netztoten keine (zurueckschlagende) DefendFunc
00088                 if (objectp(pl=QueryProp(P_WORN)) && (!query_once_interactive(pl) ||
00089                                 interactive(pl)) ) {
00090                   // Der Rueckgabewert der DefendFunc wird zum Schutz addiert
00091                   prot += funcall(defend_cl, dam_type, spell, enemy);
00092                   // leider kann die DefendFunc jetzt auch noch das Objekt zerstoert
00093                   // haben...
00094                   if (!objectp(this_object()))
00095                     return prot;
00096                 }
00097     }
00098 
00099     // Zeitpunkt der letzten Benutzung ausgeben
00100     SetProp(P_LAST_USE,time());
00101 
00102     // Berechneten Schutz zurueckgeben
00103     return prot;
00104 }

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


Variablen-Dokumentation

private nosave closure defend_cl

Definiert in Zeile 26 der Datei combat.c.

Wird benutzt von _set_defend_func(), create() und QueryDefend().

private nosave mapping resistance_strengths = ([])

Definiert in Zeile 27 der Datei combat.c.

Wird benutzt von _query_resistance_strengths(), _set_armour_type() und _set_resistance_strengths().

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