#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>
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 = ([]) |
| 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 }

| 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 }

| 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 }

| 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 }

| 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 }

| 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 }

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