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;
