Defaultwert für SP_REDUCE_ARMOUR

Möchte man, dass nur ein bestimmter Rüstungstyp zur Abwehr verwendet
werden kann, weil ein Angriff sich beispielsweise gegen den Kopf richtet
und Schuhe, Hose etc. daher keine Wirkung haben sollen, muss das Mapping
jeden einzelnen Rüstungsteil enthalten und ist daher äußerst unhandlich.

Aus diesem Grund ist es jetzt möglich, mit AT_DEFAULT_REDUCE einen
Defaultwert zu setzen, der für alle nicht explizit gesetzten Rüstungen gilt.

Change-Id: I14ac5752ec27211c98785b1fcb1974feecc2d4f1
diff --git a/doc/sphinx/lfun/Defend.rst b/doc/sphinx/lfun/Defend.rst
index 2057182..156806a 100644
--- a/doc/sphinx/lfun/Defend.rst
+++ b/doc/sphinx/lfun/Defend.rst
@@ -75,6 +75,9 @@
         Die Schutzwirkung durch P_AC/Magie einer Ruestung wird typabhaengig
         reduziert. Als Keys sind P_BODY, P_PARRY_WEAPON und die AT_* erlaubt,
         die Werte muessen ints >= 0 sein.
+        Mit AT_DEFAULT_REDUCE laesst sich ein Standardwert fuer alle nicht
+        gesetzten Eintraege setzen. Diese wirken dann nicht normal, sondern mit
+        der hier angegebenen Staerke.
         Aufbau eines Mappings im Beispiel::
 
           ([AT_BOOTS: 0,  // Stiefel schuetzen gar nicht
@@ -185,4 +188,4 @@
   Sonstiges:
     :doc:`CheckSensitiveAttack`, :doc:`InternalModifyDefend`, :doc:`normalize_defend_args`, :doc:`UseSkill`, :doc:`DefendInfo`
 
-Letzte Aenderung: 20.01.2019, Zesstra
+Letzte Aenderung: 08.07.2025, Bugfix
diff --git a/std/living/combat.c b/std/living/combat.c
index 2ab6562..ff74256 100644
--- a/std/living/combat.c
+++ b/std/living/combat.c
@@ -1022,6 +1022,25 @@
     }
     if ( !mappingp(spell[SP_REDUCE_ARMOUR]) )
       spell[SP_REDUCE_ARMOUR] = ([]);
+    else
+    {
+      // 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);
+        }
+      }
+    }
   }
   else // Illegaler spell-Parameter
     raise_error(sprintf("Ungueltiger Typ des spell-Arguments: %d\n",
diff --git a/sys/combat.h b/sys/combat.h
index d00cbd3..9991a32 100644
--- a/sys/combat.h
+++ b/sys/combat.h
@@ -255,6 +255,9 @@
 // Fuer alles, was sich unter den o.g. Typen nicht einordnen laesst
 #define AT_MISC     "Misc"
 
+// Defaultwert fuer SP_REDUCE_ARMOUR, kein gueltiger Ruestungstyp
+#define AT_DEFAULT_REDUCE "Default"
+
 // Ruestungen, die nicht angezogen werden koennen/duerfen
 #define AT_ILLEGAL  "ILLEGAL"