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);