AddToProp / SubFromProp eingefuehrt

Short-cuts fuer QueryProp() und += bzw. -= gefolgt von einem
SetProp().
Erlaubte Typen sind nur solche, mit denen += und -= was anfangen
koennen und welche zum aktuellen Wert der Property passen.

Change-Id: I699c9c605026e8058e72faad57c6e1a917ab8cb4
diff --git a/doc/sphinx/lfun/AddToProp.rst b/doc/sphinx/lfun/AddToProp.rst
new file mode 100644
index 0000000..9fbaaae
--- /dev/null
+++ b/doc/sphinx/lfun/AddToProp.rst
@@ -0,0 +1,49 @@
+AddToProp()
+=========
+
+FUNKTION
+--------
+
+public varargs int AddToProp(string propname, <int|float|string|mixed*|mapping|bytes> summand)
+
+DEFINIERT IN
+------------
+
+     /std/thing/properties.c
+     /sys/thing/properties.h (Prototyp)
+
+ARGUMENTE
+---------
+
+  - propname: Die Property, die veraendert wird
+  - summand: Was auf den aktuellen Wert "aufaddiert" werden soll
+
+BESCHREIBUNG
+------------
+
+  Die Funktion ruft den aktuellen Wert der Property mittels QueryProp() ab, addiert <summand> drauf und setzt den neuen Wert mit SetProp() wieder. Damit ist sie einfach eine Abkuerzung fuer SetProp(pname, QueryProp(pname)+ summand).
+
+  Erlaubte Typen fuer <summand> sind nur solche, mit denen += etwas anfangen kann und welche zum aktuellen Wert der Property passen. Alles andere loest ggf. einen (Laufzeit-)Fehler auf.
+
+RUeCKGABEWERT
+-------------
+
+     Der Wert der Property nach der Aenderung.
+
+BEISPIELE
+---------
+
+     // einen Int aufaddieren
+     AddToProp(P_WC, 42);
+     // ein Element an ein Array in der Property anhaengen
+     AddToProp(P_WAITFOR, ({"zesstra"}));
+     // Ein Mappingkey in ein Mapping in einer Property anhaengen (sollte der Key bereits existieren, wird dessen Wert damit ueberschrieben)
+     AddToProp(P_M_HEALTH_MOD, ([P_HP:5]))
+
+SIEHE AUCH
+----------
+
+     :doc:`QueryProp`, :doc:`SetProp`
+     Konzept: properties, /std/thing/properties.c
+
+19.06.2025, Zesstra
diff --git a/doc/sphinx/lfun/SubFromProp.rst b/doc/sphinx/lfun/SubFromProp.rst
new file mode 100644
index 0000000..e70fa47
--- /dev/null
+++ b/doc/sphinx/lfun/SubFromProp.rst
@@ -0,0 +1,50 @@
+SubFromProp()
+=========
+
+FUNKTION
+--------
+
+public varargs int SubFromProp(string propname, <int|float|string|mixed*|mapping|bytes> subtrahend)
+
+DEFINIERT IN
+------------
+
+     /std/thing/properties.c
+     /sys/thing/properties.h (Prototyp)
+
+ARGUMENTE
+---------
+
+  - propname: Die Property, die veraendert wird
+  - subtrahend: Was auf den aktuellen Wert "substrahiert" werden soll
+
+BESCHREIBUNG
+------------
+
+  Die Funktion ruft den aktuellen Wert der Property mittels QueryProp() ab, "subtrahiert" <subtrahend> davon und setzt den neuen Wert mit SetProp() wieder. Damit ist sie einfach eine Abkuerzung fuer SetProp(pname, QueryProp(pname) - subtrahend).
+
+  Erlaubte Typen fuer <subtrahend> sind nur solche, mit denen +- etwas anfangen kann und welche zum aktuellen Wert der Property passen. Alles andere loest ggf. einen (Laufzeit-)Fehler auf.
+
+RUeCKGABEWERT
+-------------
+
+     Der Wert der Property nach der Aenderung.
+
+BEISPIELE
+---------
+
+     // einen Int subtrahieren
+     SubFromProp(P_WC, 42);
+     // alle entsprechenden Elemente aus einem Array in der Property loeschen
+     // Achtung: erzeugt ein neues Array!
+     SubFromProp(P_WAITFOR, ({"zesstra"}));
+     // Ein Mappingkey aus einem Mapping in einer Property loeschen
+     SubFromProp(P_M_HEALTH_MOD, ([P_HP]))
+
+SIEHE AUCH
+----------
+
+     :doc:`QueryProp`, :doc:`AddProp`
+     Konzept: properties, /std/thing/properties.c
+
+19.06.2025, Zesstra
diff --git a/std/thing/properties.c b/std/thing/properties.c
index fb70913..5852704 100644
--- a/std/thing/properties.c
+++ b/std/thing/properties.c
@@ -22,7 +22,6 @@
 #include "/sys/thing/properties.h"
 #include "/secure/wizlevels.h"
 
-
 // the mapping where the actual properties are stored. Direct initialization.
 // Indexed with F_VALUE, F_MODE, F_SET_METHOD and F_QUERY_METHOD
 // F_MODE, F_SET_METHOD and F_QUERY_METHOD are usually 'sparse' (i.e. there is
@@ -237,6 +236,35 @@
   return prop[F_VALUE][name];
 }
 
+// Addiert einen Wert zu einer Prop. Eigentlich ist es nur ein Short-Cut fuer
+// QueryProp und += und SetProp. Dementsprechend gehen auch hier nur
+// Typ-Kombinationen, die += auch kann.
+public mixed AddToProp(string pname,
+                       <int|float|string|mixed*|mapping|bytes> add_value)
+{
+  mixed value = QueryProp(pname);
+  string err = catch(value += add_value; nolog);
+  if (err)
+    raise_error(sprintf("Nicht unterstuetzter Typ des Summanden: %s\n",
+                        err[strstr(err,":")+2..]));
+
+  return SetProp(pname, value, extern_call());
+}
+
+// "subtrahiert" einen Wert von einer Prop. Eigentlich ist es nur ein
+// Short-Cut fuer QueryProp und -= und SetProp. Dementsprechend gehen auch
+// hier nur Typ-Kombinationen, die -= auch kann.
+public mixed SubFromProp(string pname,
+                       <int|float|string|mixed*|mapping|bytes> sub_value)
+{
+  mixed value = QueryProp(pname);
+  string err = catch(value -= sub_value; nolog);
+  if (err)
+    raise_error(sprintf("Nicht unterstuetzter Typ des Subtrahenden: %s\n",
+                        err[strstr(err,":")+2..]));
+
+  return SetProp(pname, value, extern_call());
+}
 
 // Viele Properties auf einen Schlag setzen.
 // genutzt von simul_efun zum Setzen aller Properties, welche im
diff --git a/sys/thing/properties.h b/sys/thing/properties.h
index 2ccf20e..c472af5 100644
--- a/sys/thing/properties.h
+++ b/sys/thing/properties.h
@@ -49,6 +49,10 @@
 // filtered property access
 public mixed SetProp(string name, mixed Value, int drop_priv = extern_call());
 public mixed QueryProp(string name);
+public mixed AddToProp(string pname,
+                       <int|float|string|mixed*|mapping|bytes> add_value);
+public mixed SubFromProp(string pname,
+                       <int|float|string|mixed*|mapping|bytes> sub_value);
 
 // global property handling
 public void SetProperties(mapping props);