Funktion zum Normieren der Argumente von Defend
Defend bekommt aus historischem Code haeufig Argumente
uebergeben, die nicht der aktuellen Konvention entsprechen.
Damit nicht jeder Magier selber ueberlegen muss, wie die Argumente
zu normieren sind und den Code dafuer formulieren muss, stellt
das Living intern jetzt eine Funktion dafuer zur Verfuegung.
Damit wird dann auch immer gleich normiert.
Change-Id: I678b7656d7cea23e26ee2bb4897fece5c30b3ba8
diff --git a/std/living/combat.c b/std/living/combat.c
index 880f3f6..d14bedc 100644
--- a/std/living/combat.c
+++ b/std/living/combat.c
@@ -959,6 +959,43 @@
return;
}
+protected nomask void normalize_defend_args(int dam, string|string* dam_type,
+ int|mapping spell, object enemy)
+{
+ // this_player(), wenn kein enemy bekannt...
+ enemy ||= this_player();
+
+ // Schadenstyp ueberpruefen
+ if ( !pointerp(dam_type) )
+ dam_type = ({ dam_type });
+
+ // Und das Spellmapping pruefen, erzeugen, ergaenzen etc.
+ if ( intp(spell) )
+ spell = ([ SP_PHYSICAL_ATTACK : !spell,
+ SP_SHOW_DAMAGE : !spell,
+ SP_REDUCE_ARMOUR : ([ ]),
+ EINFO_DEFEND : ([ORIGINAL_DAM:dam,
+ ORIGINAL_DAMTYPE:dam_type ])
+ ]);
+ else if ( mappingp(spell) )
+ {
+ // testen ob eine erweiterte defendinfo vorhanden ist
+ if(!member(spell,EINFO_DEFEND))
+ {
+ // wenn nicht, koennen wir an den fehlenden Infos wenig machen, aber
+ // zumindest ergaenzen wir es und schreiben die (hier) initialen dam und
+ // dam_type rein.
+ spell[EINFO_DEFEND] = ([ORIGINAL_DAM:dam,
+ ORIGINAL_DAMTYPE:dam_type]);
+ }
+ if ( !mappingp(spell[SP_REDUCE_ARMOUR]) )
+ spell[SP_REDUCE_ARMOUR] = ([]);
+ }
+ else // Illegaler spell-Parameter
+ raise_error(sprintf("Ungueltiger Typ des spell-Arguments: %d\n",
+ get_type_info(spell,0)));
+}
+
public int Defend(int dam, string|string* dam_type, int|mapping spell, object enemy)
{
int i,k;
@@ -966,42 +1003,17 @@
object *armours,tmp;
mixed hookData;
mixed hookRes;
-
+
// string what, how;
string enname, myname;
- // this_player(), wenn kein enemy bekannt...
- enemy ||= this_player();
+ normalize_defend_args(&dam, &dam_type, &spell, &enemy);
+
// Testen, ob dieses Lebewesen ueberhaupt angegriffen werden darf
if ( !this_object() || !enemy || QueryProp(P_NO_ATTACK)
|| ( query_once_interactive(enemy) && ! interactive(enemy) ) )
return 0;
- if ( intp(spell) )
- spell = ([ SP_PHYSICAL_ATTACK : !spell,
- SP_SHOW_DAMAGE : !spell,
- SP_REDUCE_ARMOUR : ([ ]) ]);
- else if ( !mappingp(spell) ) // Illegaler spell-Parameter
- return 0;
-
- // testen ob eine erweiterte defendinfo vorhanden ist
- if(!member(spell,EINFO_DEFEND))
- {
- //spell+=([EINFO_DEFEND:([])]); // ggf hinzufuegen
- // use a temporary mapping to avoid recursive
- // val[x][y] = deep_copy(val);
- mapping tmpdefend = ([
- ORIGINAL_AINFO:deep_copy(spell),
- ORIGINAL_DAM:dam,
- ORIGINAL_DAMTYPE:dam_type,
- ]);
- spell[EINFO_DEFEND]=tmpdefend;
- }
-
- // Schadenstyp ueberpruefen
- if ( !pointerp(dam_type) )
- dam_type = ({ dam_type });
-
spell[EINFO_DEFEND][CURRENT_DAMTYPE]=dam_type;
spell[EINFO_DEFEND][CURRENT_DAM]=dam;
@@ -1179,9 +1191,6 @@
}
} // Ende Hook-Behandlung
- if ( !member(spell,SP_REDUCE_ARMOUR) || !mappingp(spell[SP_REDUCE_ARMOUR]) )
- spell[SP_REDUCE_ARMOUR] = ([]);
-
// Es gibt auch Parierwaffen,
if ( objectp(tmp=QueryProp(P_PARRY_WEAPON)) )
{