Defaultwerte und Auswertung SP_REDUCE_ARMOUR

Defaultwerte fuer SP_REDUCE_ARMOUR an einigen Stellen ergaenzt und
sicherstellen, dass der Defaultwert immer existiert.

Entfall der vorberechnenden Schleife, es wird entweder der Defaultwert
oder der passende Wert fuer den Ruestungstyp genutzt.

Hiermit geaenderter Code nutzt jetzt lokale Variablen mit aussagekraeftigen Namen anstelle der allgemein verwendeten res und res2.

Change-Id: I16c3ebf428ef38632519736109742aac98d53e11
diff --git a/std/living/combat.c b/std/living/combat.c
index ff74256..7363301 100644
--- a/std/living/combat.c
+++ b/std/living/combat.c
@@ -841,7 +841,7 @@
   {
     ainfo[SI_SPELL] = ([ SP_PHYSICAL_ATTACK : !ainfo[SI_SPELL],
                SP_SHOW_DAMAGE     : !ainfo[SI_SPELL],
-               SP_REDUCE_ARMOUR   : ([ ])  ]);
+               SP_REDUCE_ARMOUR   : ([ AT_DEFAULT_REDUCE: 100 ])  ]);
   }
 
   // defendinfo anhaengen, falls ainfo[SI_SPELL] ein mapping ist
@@ -1005,7 +1005,7 @@
   if ( intp(spell) )
     spell = ([ SP_PHYSICAL_ATTACK : !spell,
                SP_SHOW_DAMAGE     : !spell,
-               SP_REDUCE_ARMOUR   : ([ ]),
+               SP_REDUCE_ARMOUR   : ([ AT_DEFAULT_REDUCE: 100 ]),
                EINFO_DEFEND       : ([ORIGINAL_DAM:dam,
                                       ORIGINAL_DAMTYPE:dam_type ])
              ]);
@@ -1020,26 +1020,14 @@
       spell[EINFO_DEFEND] = ([ORIGINAL_DAM:dam,
                               ORIGINAL_DAMTYPE:dam_type]);
     }
+    // SP_REDUCE_ARMOUR muss auch mit zumindest dem Defaultwert
+    // AT_DEFAULT_REDUCE vorhanden sein.
     if ( !mappingp(spell[SP_REDUCE_ARMOUR]) )
-      spell[SP_REDUCE_ARMOUR] = ([]);
-    else
+      spell[SP_REDUCE_ARMOUR] = ([AT_DEFAULT_REDUCE: 100]);
+    else if (!(AT_DEFAULT_REDUCE in spell[SP_REDUCE_ARMOUR])
+             || !intp(spell[SP_REDUCE_ARMOUR][AT_DEFAULT_REDUCE]) )
     {
-      // Erstmal die Variable setzen, damit die folgenden Abfragen
-      // uebersichtlicher werden. Auf die Existenz muss trotzdem geprueft
-      // werden, weil bei einem nicht existierenden Key auch 0 zurueckgegeben
-      // wuerde.
-      int default_reduce = ({int})spell[SP_REDUCE_ARMOUR][AT_DEFAULT_REDUCE];
-      if(AT_DEFAULT_REDUCE in spell[SP_REDUCE_ARMOUR] &&
-          default_reduce >= 0)
-      {
-        foreach(string key :
-            VALID_ARMOUR_CLASS + ([P_PARRY_WEAPON: 0, P_BODY: 0]))
-        {
-          if(key in spell[SP_REDUCE_ARMOUR]) continue;
-
-          m_add(spell[SP_REDUCE_ARMOUR], key, default_reduce);
-        }
-      }
+      spell[SP_REDUCE_ARMOUR][AT_DEFAULT_REDUCE] = 100;
     }
   }
   else // Illegaler spell-Parameter
@@ -1227,16 +1215,19 @@
   // Es gibt auch Parierwaffen,
   if ( objectp(tmp=QueryProp(P_PARRY_WEAPON)) )
   {
-    res2=tmp->QueryDefend(dam_type, spell, enemy);
-
+    int schutz=tmp->QueryDefend(dam_type, spell, enemy);
     // Reduzierbare Wirksamkeit der Parierwaffe?
-    if ( member(spell[SP_REDUCE_ARMOUR],P_PARRY_WEAPON)
-        && intp(res=spell[SP_REDUCE_ARMOUR][P_PARRY_WEAPON]) && (res>=0) )
+    int gewicht;
+    if ( (P_PARRY_WEAPON in spell[SP_REDUCE_ARMOUR])
+        && intp(gewicht=spell[SP_REDUCE_ARMOUR][P_PARRY_WEAPON])
+        && (gewicht>=0) )
     {
-      res2=(res2*res)/100;
+      schutz=(schutz*gewicht)/100;
     }
+    else
+      schutz=(schutz*spell[SP_REDUCE_ARMOUR][AT_DEFAULT_REDUCE])/100;
 
-    dam-=res2;
+    dam-=schutz;
     spell[EINFO_DEFEND][CURRENT_DAM]=dam;
   }
 
@@ -1256,14 +1247,16 @@
     // pro Ruestung ein Key an Platz reservieren
     spell[EINFO_DEFEND][DEFEND_ARMOURS]=m_allocate(i,2);
     foreach(object armour : armours) {
-      if ( objectp(armour) ) {
+      if ( objectp(armour) )
+      {
         aty=armour->QueryProp(P_ARMOUR_TYPE);
-
-        if ( member(spell[SP_REDUCE_ARMOUR],aty)
-            && intp(res2=spell[SP_REDUCE_ARMOUR][aty]) && (res2>=0) )
-          dam -= (res2*armour->QueryDefend(dam_type, spell, enemy))/100;
+        int schutz=armour->QueryDefend(dam_type, spell, enemy);
+        int gewicht;
+        if ( (aty in spell[SP_REDUCE_ARMOUR])
+            && intp(gewicht=spell[SP_REDUCE_ARMOUR][aty]) && (gewicht>=0) )
+          dam -= (gewicht*schutz)/100;
         else
-          dam -= armour->QueryDefend(dam_type, spell, enemy);
+          dam -= (schutz*spell[SP_REDUCE_ARMOUR][AT_DEFAULT_REDUCE])/100;
         // Schaden NACH DefendFunc vermerken. 
         // Schutzwirkung VOR DefendFunc (DEF_ARMOUR_PROT) vermerkt
         // das QueryDefend() selber.
@@ -1328,16 +1321,19 @@
     // skaliert. Beim runterskalieren wird aufgerundet (Addition von
     // 5000 vor Division).
     int body = (QueryProp(P_BODY)+QueryAttribute(A_DEX)) * 10000;
-    res2 = ((body/4 + random(body*3/4 + 1) + 5000)/10000) || 1;
+    int schutz = ((body/4 + random(body*3/4 + 1) + 5000)/10000) || 1;
     if (stat)
-      stat->bodystat(body, res2, (random(body)+1)/10000);
+      stat->bodystat(body, schutz, (random(body)+1)/10000);
 
     // Reduzierbare Wirksamkeit des Bodies?
-    if ( member(spell[SP_REDUCE_ARMOUR], P_BODY)
-        && intp(res=spell[SP_REDUCE_ARMOUR][P_BODY]) && (res>=0) )
-      res2=(res2*res)/100;
+    int gewicht;
+    if ( (P_BODY in spell[SP_REDUCE_ARMOUR])
+        && intp(gewicht=spell[SP_REDUCE_ARMOUR][P_BODY]) && (gewicht>=0) )
+      schutz=(schutz*gewicht)/100;
+    else
+      schutz=(schutz*spell[SP_REDUCE_ARMOUR][AT_DEFAULT_REDUCE])/100;
 
-    dam-=res2;
+    dam-=schutz;
   }
   spell[EINFO_DEFEND][DEFEND_BODY]=dam;
   spell[EINFO_DEFEND][CURRENT_DAM]=dam;