Update fuer automatisch erzeugte Files.
Change-Id: I4ca905ed2b82c336aed038d8aa23c9e5e9281e18
diff --git a/doc/lfun-liste b/doc/lfun-liste
index 125719e..e7e21eb 100644
--- a/doc/lfun-liste
+++ b/doc/lfun-liste
@@ -222,6 +222,8 @@
* GetGroupMembers()
+* GetHelperObject()
+
* GetInfoArr()
* GetMatMembership()
diff --git a/doc/lfun/AddInfo b/doc/lfun/AddInfo
index a75a22d..e2774d5 100644
--- a/doc/lfun/AddInfo
+++ b/doc/lfun/AddInfo
@@ -108,7 +108,7 @@
AddInfo("muenzen",
"fluestert: Du willst Geld?",
0,
- "fluestert @WEM etwas zu.");
+ "fluestert @WEM1 etwas zu.");
// "frage monster nach geld": alle im Raum hoeren
// Das Monster sagt: Ich habe zwar kein Geld, aber [...]
@@ -185,7 +185,7 @@
protected string question_gold() {
// wieviel Kohle hat der Spieler
int money = this_player()->QueryMoney();
- string *y = map(deep_inventory(this_player()),
+ string* y = map(deep_inventory(this_player()),
function string(object o) {
if(o->QueryMaterial(MAT_GOLD)>0 &&
strstr(object_name(o),"/items/money")<0 &&
@@ -232,9 +232,9 @@
// Das Monster murmelt: Muenzen. Ausserdem ist/sind noch <object1>
// Das Monster murmelt: und <object2> aus Gold."
// - die Umstehenden hoeren:
- // "Das Monster murmelt @WEM etwas zu."
+ // "Das Monster murmelt @WEM1 etwas zu."
// oder
- // "Das Monster murmelt @WEM etwas zu und glotzt ihn/sie gierig an."
+ // "Das Monster murmelt @WEM1 etwas zu und glotzt ihn/sie gierig an."
SIEHE AUCH
diff --git a/doc/lfun/AddSpell b/doc/lfun/AddSpell
index 1661f8c..b8175e5 100644
--- a/doc/lfun/AddSpell
+++ b/doc/lfun/AddSpell
@@ -6,9 +6,10 @@
FUNKTION
========
- varargs int AddSpell(int rate, int damage, string TextForEnemy,
- string TextForOthers, string|string* dam_type,
- string|closure func, int|mapping spellarg)
+ varargs int AddSpell(int rate, int damage,
+ string|<int|spell>* TextForEnemy, string|<int|string>*
+ TextForOthers, string|string* dam_type, string|closure func,
+ int|mapping spellarg)
DEFINIERT IN
@@ -21,85 +22,104 @@
=========
rate - Relative Haeufigkeit der Anwendung (*),
- muss >= 0 sein
+ muss >= 0 sein
+
damage - Der Schadenswert fuer Defend(),
- muss > 0 sein
+ muss > 0 sein
+
TextForEnemy - Text, den der Feind erhalten soll
+ String <text> oder Array der Form ({<text>,<messagetype>})
+ (Siehe ReceiveMsg())
+
TextForOthers - Text, den andere im Raum erhalten sollen
+ String <text> oder Array der Form ({<text>,<messagetype>})
+ (Siehe ReceiveMsg())
+
dam_type - Schadenstyp(en) fuer Defend(),
- (Default: ({DT_MAGIC}) )
+ (Default: ({DT_MAGIC}) fuer Magische und ({DT_BLUDGEON}) fuer
+ physikalische Angriffe)
+
func - Funktionsname oder Closure, die nach Anwendung
- aufgerufen werden soll
- (Optional, bekommt als Argumente object enemy,
- int real_damage, string* dam_type)
+ aufgerufen werden soll (Optional, bekommt als Argumente object
+ enemy, int real_damage, string* dam_type)
+
spellarg - Spell-Argument fuer Defend(), Default ist "1"
BESCHREIBUNG
============
- Ermoeglicht einfache Angriffs-Zaubersprueche fuer NPCs. Das Ausfuehren von
- Spells verursacht bei dem NPC keine KP-Kosten.
+ Ermoeglicht einfache Angriffs-Zaubersprueche fuer NPCs. Das
+ Ausfuehren von Spells verursacht bei dem NPC keine KP-Kosten.
- Mit P_SPELLRATE wird die generelle Wahrscheinlichkeit der Ausfuehrung
- solcher Spells im Heartbeat angegeben, mit 'rate' kann man die relative
- Wahrscheinlichkeit der Spells untereinander steuern.
+ Mit P_SPELLRATE wird die generelle Wahrscheinlichkeit der
+ Ausfuehrung solcher Spells im Heartbeat angegeben, mit 'rate' kann
+ man die relative Wahrscheinlichkeit der Spells untereinander
+ steuern.
(*) Relative Haeufigkeit heisst, dass sich alle 'rate' der Spells
- aufaddieren und ein einzelnes 'rate' dann in Relation zur Gesamtsumme
- steht. D.h. drei Spells mit 80, 10, 10 (Summe 100) haben die selben
- Aufruf-Wahrscheinlichkeiten wie drei Spells mit 120, 15, 15 oder drei
- Spells mit 160, 20, 20.
+ aufaddieren und ein einzelnes 'rate' dann in Relation zur
+ Gesamtsumme steht. D.h. drei Spells mit 80, 10, 10 (Summe 100)
+ haben die selben Aufruf-Wahrscheinlichkeiten wie drei Spells mit
+ 120, 15, 15 oder drei Spells mit 160, 20, 20.
Ein Spell wird immer in folgender Reihenfolge abgearbeitet:
- 1. Die Texte werden an die Beteiligten ausgegeben.
- 2. Es wird ggf. SpellDefend gerufen (wenn kein SP_PHYSICAL_ATTACK).
- Abbruch bei Schutz.
- 3. Im Opfer wird Defend() mit den angegebenen Werten aufgerufen.
- Abbruch bei Tod/Zerstoerung des Opfers.
- 4. Eine Funktion, so definiert, wird ausgefuehrt.
+
+ 1. Die Texte werden an die Beteiligten ausgegeben.
+
+ 2. Es wird ggf. SpellDefend gerufen (wenn kein
+ SP_PHYSICAL_ATTACK). Abbruch bei Schutz.
+
+ 3. Im Opfer wird Defend() mit den angegebenen Werten aufgerufen.
+ Abbruch bei Tod/Zerstoerung des Opfers.
+
+ 4. Eine Funktion, so definiert, wird ausgefuehrt.
BEMERKUNGEN
===========
- TextForOthers wird vor der Ausgabe der Meldung durch replace_personal()
- geschickt, d.h. es koennen Platzhalter wie @WER1, @WEMQP1 und aehnliche
- verwendet werden (siehe auch die Manpage von replace_personal()).
- Da Ersetzungen nur fuer das Gegnerobjekt beruecksichtigt werden, koennen
- nur Platzhalter mit Endziffer 1 verwendet werden. Die Ersetzungen werden
- so gesteuert, dass die eingefuegten Namen nach Satzanfaengen automatisch
- gross geschrieben werden.
- Frueher wurden statt replace_personal() die Platzhalter @WER, @WESSEN,
- @WEM, @WEN verwendet. Diese funktionieren weiterhin, sollten aber nicht
- mehr in neuem Code benutzt werden.
+ TextForOthers wird vor der Ausgabe der Meldung durch
+ replace_personal() geschickt, d.h. es koennen Platzhalter wie
+ @WER1, @WEMQP1 und aehnliche verwendet werden (siehe auch die
+ Manpage von replace_personal()). Da Ersetzungen nur fuer das
+ Gegnerobjekt beruecksichtigt werden, koennen nur Platzhalter mit
+ Endziffer 1 verwendet werden. Die Ersetzungen werden so gesteuert,
+ dass die eingefuegten Namen nach Satzanfaengen automatisch gross
+ geschrieben werden. Frueher wurden statt replace_personal() die
+ Platzhalter @WER, @WESSEN, @WEM, @WEN verwendet. Diese
+ funktionieren weiterhin, sollten aber nicht mehr in neuem Code
+ benutzt werden.
In der von AddSpell gerufenen Methode "func" koennen speziellere
- Sachen mit dem aktuellen Feind angestellt werden koennen. Die Methode
- muss im selben Objekt definiert sein, sofern der Funktionsname und
- keine Closure uebergeben wird.
+ Sachen mit dem aktuellen Feind angestellt werden. Die Methode muss
+ im selben Objekt definiert sein, sofern der Funktionsname und keine
+ Closure uebergeben wird.
- Will man einen physischen Angriff ausloesen, MUSS <spellarg> ein Mapping
- mit ([SP_PHYSICAL_ATTACK: 1]) sein. Bei Uebergeben einer 0 oder Weglassen
- des Werts wird an Defend das Default '1' (da es Spells sind) uebergeben.
+ Will man einen physischen Angriff ausloesen, MUSS <spellarg> ein
+ Mapping mit ([SP_PHYSICAL_ATTACK: 1]) sein. Bei Uebergeben einer 0
+ oder Weglassen des Werts wird an Defend das Default '1' (da es
+ Spells sind) uebergeben.
- Wenn damage<=0 oder rate<0 oder keine Meldungen uebergeben werden, wird
- der Spell NICHT eingetragen, sondern die Funktion bricht mit Rueckgabe
- von 0 ab.
+ Wenn damage<=0 oder rate<0 oder keine Meldungen uebergeben werden,
+ wird der Spell NICHT eingetragen, sondern die Funktion bricht mit
+ Rueckgabe von 0 ab.
BEISPIELE
=========
+code-block:
+
// #1 Einfacher NPC mit drei Spells, Gesamtrate = 100, also sind die
// Raten direkt als Prozent Aufrufwahrscheinlichkeit lesbar.
AddSpell(80, 400,
"Der Hexer greift Dich mit einem kleinen Feuerball an.\n",
"Der Hexer greift @WEN mit einem kleinen Feuerball an.\n",
- ({DT_FIRE, DT_MAGIC}));
+ ({DT_FIRE, DT_MAGIC}));
AddSpell(10, 800,
"Der Hexer greift Dich mit einem riesigen Feuerball an.\n",
- "Der Hexer greift @WEN mit einem riesigen Feuerball an.\n",
+ "Der Hexer greift @WEN mit einem riesigen Feuerball an.\n",
({DT_FIRE, DT_MAGIC}));
AddSpell(8, 100,
"Der Hexer piekst Dir in die Augen!",
@@ -108,21 +128,28 @@
AddSpell(2, 5, (string)0, (string)0, (string*)0, "salto_mortalis");
(Kleiner Feuerball mit 80% Wahrscheinlichkeit, riesiger mit 10%,
- "augen_stechen" mit 8%, "salto_mortalis" mit 2%)
+ "augen_stechen" mit 8%, "salto_mortalis" mit 2%)
+
+code-block:
// Die Funktion "augen_stechen" kann dann so aussehen:
- void augen_stechen(object enemy, int damage, mixed dam_types ) {
- if (damage>10 && !enemy->QueryProp(P_BLIND)) {
+ void augen_stechen(object enemy, int damage, mixed dam_types )
+ {
+ if (damage>10 && !enemy->QueryProp(P_BLIND))
+ {
enemy->SetProp(P_BLIND, 1);
if(enemy->QueryProp(P_BLIND))
tell_object(enemy, "Du bist nun blind!\n");
}
}
+code-block:
+
// Zur Funktion "salto_mortalis" gibt es keine Meldungen, dennoch
// wird Defend mit: enemy->Defend(5, ({DT_MAGIC}), 1, this_object())
// gerufen!
- void salto_mortalis(object enemy, int damage, mixed dam_types ) {
+ void salto_mortalis(object enemy, int damage, mixed dam_types )
+ {
// dem geneigten Leser ueberlassen, den Gegner zu toeten
}
@@ -132,6 +159,7 @@
// DefendFuncs() ausgewertet). Es muss auch eine physische Schadensart
// enthalten sein!
// SpellDefend() wird bei diesem Flag nicht mehr am Gegner gerufen.
+
AddSpell(100, 200+random(200),
"Die kleine Ratte beisst Dich!\n",
"@WER wird von einer kleinen Ratte gebissen!\n",
@@ -153,7 +181,7 @@
"@WER wird von einer kleinen Ratte in die Wade gebissen!\n",
({DT_PIERCE, DT_POISON}), (string)0,
([SP_PHYSICAL_ATTACK:1, SP_NO_ACTIVE_DEFENSE:1,
- SP_REDUCE_ARMOUR: armours]));
+ SP_REDUCE_ARMOUR: armours]));
// SP_NO_ACTIVE_DEFENSE = 1 schaltet aktive Abwehr (Karate/Klerus) ab
// SP_REDUCE_ARMOUR enthaelt eine Liste von Ruestungstypen mit ihren
@@ -164,10 +192,10 @@
SIEHE AUCH
==========
- Sonstiges: SpellAttack, SpellDefend, Defend, QueryDefend, SelectEnemy
- replace_personal
- Properties: P_DISABLE_ATTACK, P_SPELLRATE, P_AGGRESSIVE
- Abwehr: Defend, Defend_bsp, SpellDefend
- Methoden: modifiers
+ Sonstiges: *SpellAttack()*, *SpellDefend()*, *Defend()*,
+ *QueryDefend()*, *SelectEnemy()*, *ReceiveMsg()*,
+ *replace_personal()*
-Zuletzt geaendert: 20.11.2016, Bugfix
+ Properties: *P_DISABLE_ATTACK*, *P_SPELLRATE*, *P_AGGRESSIVE*
+
+Letzte Aenderung: 15.02.2018, Bugfix
diff --git a/doc/lfun/Defend b/doc/lfun/Defend
index 3e40cfc..dd66fa1 100644
--- a/doc/lfun/Defend
+++ b/doc/lfun/Defend
@@ -40,105 +40,104 @@
BESCHREIBUNG
============
- 1. Generell
- Wenn das Lebewesen angegriffen wird, wird geprueft, wie stark
- die Ruestungen und koerpereigenen Abwehrkraefte sind und die
- Staerke des Schadens dementsprechend vermindert. Ggf. wird der
- Schaden zugefuegt und der Feind in die Liste der Feinde
- aufgenommen. Der Schaden betraegt: (dam-Summe(Ruestungsstaerken
- )-random(P_BODY+A_DEX))*CheckResistance/10 aber nicht unter 0.
+Generell
+--------
- 2. Der Parameter 'spell'
+ Wenn das Lebewesen angegriffen wird, wird geprueft, wie stark die
+ Ruestungen und koerpereigenen Abwehrkraefte sind und die Staerke
+ des Schadens dementsprechend vermindert. Ggf. wird der Schaden
+ zugefuegt und der Feind in die Liste der Feinde aufgenommen. Der
+ Schaden betraegt: (dam-
+ Summe(Ruestungsstaerken)-random(P_BODY+A_DEX))*CheckResistance/10
+ aber nicht unter 0.
- Ist 'spell' 0, dann gilt der Angriff als normale physische
- Attacke Uebergibt man als 'spell'-Parameter ein Mapping, so gibt
- es dafuer diverse Flags, die das Ergebnis manipulieren (in
- new_skills.h enthalten). Nichtangabe eines Flags gilt als 0.
- * SP_PHYSICAL_ATTACK ---------- 0/1 1, wenn Ruestungen wirken
- sollen, 0 sonst -> entspricht !spell, wenn dieses Int ist
+Der Parameter 'spell'
+---------------------
- * SP_NO_ENEMY ----------------- 0/1 1, falls der Angriff nicht
- toedlich ist, es also keinen echten Gegner gibt -> es wird
- dann reduce_hit_points() gerufen statt do_damage()
+ Ist 'spell' 0, dann gilt der Angriff als normale physische Attacke
+ Uebergibt man als 'spell'-Parameter ein Mapping, so gibt es dafuer
+ diverse Flags, die das Ergebnis manipulieren (in new_skills.h
+ enthalten). Nichtangabe eines Flags gilt als 0.
- * SP_NO_ACTIVE_DEFENSE -------- 0/1 1, falls aktive Abwehren
- (wie zurueckschlagende Amulette, Karateabwehren oder
- Ausweichmanoever) unterbleiben sollen -> zB bei Kratzen durch
- Dornen oder Fall aus grosser Hoehe ist aktive Abwehr oder
- Ausweichen unlogisch
+ * SP_PHYSICAL_ATTACK ---------- 0/1 1, wenn Ruestungen wirken
+ sollen, 0 sonst -> entspricht !spell, wenn dieses Int ist
- * SP_RECURSIVE ---------------- 0/1 1, falls der Spell aus
- einem Defend gerufen wurde (oder einer DefendFunc) ->
- verhindert Rekursionsprobleme
+ * SP_NO_ENEMY ----------------- 0/1 1, falls der Angriff nicht
+ toedlich ist, es also keinen echten Gegner gibt -> es wird dann
+ reduce_hit_points() gerufen statt do_damage()
- * SP_NAME --------------------- string Name des Spells
+ * SP_NO_ACTIVE_DEFENSE -------- 0/1 1, falls aktive Abwehren (wie
+ zurueckschlagende Amulette, Karateabwehren oder Ausweichmanoever)
+ unterbleiben sollen -> zB bei Kratzen durch Dornen oder Fall aus
+ grosser Hoehe ist aktive Abwehr oder Ausweichen unlogisch
- * SP_GLOBAL_ATTACK ------------ 0/1 1 bei Flaechenspells
+ * SP_RECURSIVE ---------------- 0/1 1, falls der Spell aus einem
+ Defend gerufen wurde (oder einer DefendFunc) -> verhindert
+ Rekursionsprobleme
- * SP_REDUCE_ARMOUR ------------ Mapping: keys AT_X/P_BODY,
- values int>=0 Die Schutzwirkung durch P_AC/Magie einer
- Ruestung wird typabhaengig reduziert. Aufbau eines Mappings im
- Beispiel:
+ * SP_NAME --------------------- string Name des Spells
- ([AT_BOOTS: 0, // Stiefel schuetzen gar nicht P_BODY: 50,
- // Koerper zu 50% AT_BELT: 600 // Guertel zu 600% ])
+ * SP_GLOBAL_ATTACK ------------ 0/1 1 bei Flaechenspells
- -> alle 'fehlenden' Eintraege wirken normal
+ * SP_REDUCE_ARMOUR ------------ Mapping: keys AT_X/P_BODY, values
+ int>=0 Die Schutzwirkung durch P_AC/Magie einer Ruestung wird
+ typabhaengig reduziert. Aufbau eines Mappings im Beispiel:
- * SP_SHOW_DAMAGE -------------- 0/1 oder Array von Arrays 0,
- fuer keine Treffermeldung, 1 sonst In einem Array koennen
- Ersatz-Treffermeldungen definiert werden. Format ist:
+ ([AT_BOOTS: 0, // Stiefel schuetzen gar nicht P_BODY: 50, //
+ Koerper zu 50% AT_BELT: 600 // Guertel zu 600% ]) -> alle
+ 'fehlenden' Eintraege wirken normal
- ({
+ * SP_SHOW_DAMAGE -------------- 0/1 oder Array von Arrays 0, fuer
+ keine Treffermeldung, 1 sonst In einem Array koennen Ersatz-
+ Treffermeldungen definiert werden. Format ist:
- ({ int lphit1, string mess_me, string mess_en, string
- mess_room }), ({ lphit2, mess_me, mess_en, mess_room }),
- ... ({ lphitn, mess_me, mess_en, mess_room }), }) wobei
- lphit1<lphit2<...<lphitn sein muss, d.h. das Array-Array
- aufsteigend sortiert.
+ ({ ({ int lphit1, string mess_me, string mess_en, string
+ mess_room }), ({ lphit2, mess_me, mess_en, mess_room }), ...
+ ({ lphitn, mess_me, mess_en, mess_room }), }) wobei
+ lphit1<lphit2<...<lphitn sein muss, d.h. das Array-Array
+ aufsteigend sortiert.
- Ist ein Treffer x LP hart, werden die Meldungen des lphit-
- Arrays ausgegeben, dessen Wert am naehesten unter dem Schaden
- liegt.
+ Ist ein Treffer x LP hart, werden die Meldungen des lphit-Arrays
+ ausgegeben, dessen Wert am naehesten unter dem Schaden liegt.
- In den Meldungen mess_me (an den Getroffenen), mess_en (an den
- Feind), mess_room (an die restlichen Umstehenden) koennen
- Ersatzstrings wie folgt verwendet werden:
+ In den Meldungen mess_me (an den Getroffenen), mess_en (an den
+ Feind), mess_room (an die restlichen Umstehenden) koennen
+ Ersatzstrings wie folgt verwendet werden:
- @WER1/@WESSEN1/@WEM1/@WEN1 - name(casus) des Getroffenen
- (TO) @WER2/@WESSEN2/@WEM2/@WEN2 - name(casus) des Feindes
- (enemy)
+ @WER1/@WESSEN1/@WEM1/@WEN1 - name(casus) des Getroffenen (TO)
+ @WER2/@WESSEN2/@WEM2/@WEN2 - name(casus) des Feindes (enemy)
- * EINFO_DEFEND ------------ Mapping Dieses Mapping liefert
- erweiterte Informationen zu dem bisherigen Ablauf des aktiven
- Attacks. Die verfuegbaren Informationen sind in der Manpage zu
- DefendInfo festgehalten.
+ EINFO_DEFEND ------------ Mapping Dieses Mapping liefert
+ erweiterte Informationen zu dem bisherigen Ablauf des aktiven
+ Attacks. Die verfuegbaren Informationen sind in der Manpage zu
+ DefendInfo festgehalten.
- 3. Reihenfolgen in Defend
- * das Living wird angegriffen, wenn - P_NO_ATTACK != 0 -
- 'enemy' existiert und kein netztoter Spieler ist
+Reihenfolgen in Defend
+----------------------
- * P_DEFENDERS werden durchgegangen (und eventuell
- benachrichtigt)
+ * das Living wird angegriffen, wenn * P_NO_ATTACK != 0 * 'enemy'
+ existiert und kein netztoter Spieler ist
- * P_TMP_ATTACK_HOOK wird abgefragt
+ * P_DEFENDERS werden durchgegangen (und eventuell benachrichtigt)
- * die Ruestungen werden vom Schaden gegebenenfalls abgezogen
+ * P_TMP_ATTACK_HOOK wird abgefragt
- * magischer Ausweichskill beruecksichtigt
+ * die Ruestungen werden vom Schaden gegebenenfalls abgezogen
- * sensitive Objekte werden ggf. benachrichtigt
+ * magischer Ausweichskill beruecksichtigt
- * InternalModifyDefend wird gerufen
+ * sensitive Objekte werden ggf. benachrichtigt
- * Koerperabwehr abgezogen
+ * InternalModifyDefend wird gerufen
- * der Schaden an do_damage()/reduce_hit_points() uebergeben
+ * Koerperabwehr abgezogen
- * Flucht ueberpruefen mit CheckWimpyAndFlee()
+ * der Schaden an do_damage()/reduce_hit_points() uebergeben
+
+ * Flucht ueberpruefen mit CheckWimpyAndFlee()
BEMERKUNGEN
@@ -161,39 +160,38 @@
Hoehe des tatsaechlichen Schadens. Dies kann mehr sein als die
Lebenspunkte des Lebewesens.
-BEISPIELE (SIEHE AUCH Defend_bsp):
- // ein simpler Angriff: enem->Defend(100, ({DT_BLUDGEON}),
- ([SP_PHYSICAL_ATTACK:1]), this_object());
- // ein magischer Angriff (ohne Treffermeldung): enem->Defend(100,
- ({DT_BLUDGEON, DT_FIRE}), ([SP_PHYSICAL_ATTACK:0]), this_object());
+BEISPIELE (SIEHE AUCH Defend_bsp)
+=================================
- // ein magischer Angriff mit Treffermeldung: enem->Defend(100,
- ({DT_BLUDGEON, DT_FIRE}), ([SP_SHOW_DAMAGE:1]),
+ // ein simpler Angriff:
+ enem->Defend(100, ({DT_BLUDGEON}), ([SP_PHYSICAL_ATTACK:1]), this_object());
- this_object());
+ // ein magischer Angriff (ohne Treffermeldung):
+ enem->Defend(100, ({DT_BLUDGEON, DT_FIRE}), ([SP_PHYSICAL_ATTACK:0]), this_object());
+
+ // ein magischer Angriff mit Treffermeldung:
+ enem->Defend(100, ({DT_BLUDGEON, DT_FIRE}), ([SP_SHOW_DAMAGE:1]),
+ this_object());
SIEHE AUCH
==========
- Angriff: *Attack()*, *P_NO_ATTACK*, *InsertEnemy()* Schaden:
- *P_ENABLE_IN_ATTACK_OUT*,
+ Angriff: *Attack()*, *P_NO_ATTACK*, *InsertEnemy()*
- *P_LAST_MOVE*, *do_damage()*, *reduce_hit_points()*
+ Schaden: *P_ENABLE_IN_ATTACK_OUT*, *P_LAST_MOVE*, *do_damage()*,
+ *reduce_hit_points()*
- Schutz: *P_DEFENDERS*, *InformDefend()*,
- *DefendOther()*, *P_ARMOURS*, *P_AC*, *P_DEFEND_FUNC*,
- *QueryDefend()*, *P_BODY*
+ Schutz: *P_DEFENDERS*, *InformDefend()*, *DefendOther()*,
+ *P_ARMOURS*, *P_AC*, *P_DEFEND_FUNC*, *QueryDefend()*, *P_BODY*
- Daten: *P_LAST_COMBAT_TIME*,
- *P_LAST_DAMTYPES*, *P_LAST_DAMTIME*, *P_LAST_DAMAGE*,
- *P_DAMAGE_MSG*
+ Daten: *P_LAST_COMBAT_TIME*, *P_LAST_DAMTYPES*,
+ *P_LAST_DAMTIME*, *P_LAST_DAMAGE*, *P_DAMAGE_MSG*
- Resistenz: *P_RESISTANCE_STRENGTHS*,
- *CheckResistance()*
+ Resistenz: *P_RESISTANCE_STRENGTHS*, *CheckResistance()*
- Sonstiges: *CheckSensitiveAttack()*,
- *InternalModifyDefend()*, *UseSkill()*, *DefendInfo()*
+ Sonstiges: *CheckSensitiveAttack()*, *InternalModifyDefend()*,
+ *UseSkill()*, *DefendInfo()*
Letzte Aenderung: 29.12.2017, Bugfix
diff --git a/doc/lfun/GetHelperObject b/doc/lfun/GetHelperObject
new file mode 100644
index 0000000..e879129
--- /dev/null
+++ b/doc/lfun/GetHelperObject
@@ -0,0 +1,93 @@
+
+GetHelperObject()
+*****************
+
+
+FUNKTION
+========
+
+ public varargs object GetHelperObject(int type, int|closure
+ strength
+ varargs mixed* extra)
+
+
+DEFINIERT IN
+============
+
+ /std/living/helpers.c
+
+
+ARGUMENTE
+=========
+
+ type:
+ Eine der in helpers.h definierten Konstanten
+
+ strength:
+ minimal geforderte Staerke des Helfers oder Closure zum Filtern
+ der Helferobjekte.
+
+ extra:
+ Beliebige und beliebig viele Argumente, welche an die Closure
+ <strength> weitergegeben werden.
+
+
+BESCHREIBUNG
+============
+
+ Gibt das zuerst gefundene als Helfer registrierte Objekt zurueck,
+ welches die Anforderungen erfuellt.
+
+ Ist <strength> ein int, muss die Staerke/Guete des Helfers
+ (Rueckgabewert der Callback-Methode, siehe
+ *RegisterHelperObject()*) mindestens so gross sein wie der als
+ <strength> uebergebene Wert.
+
+ Ist <strength> eine Closure, wird diese fuer jeden Helfer
+ ausgewertet und entscheidet, ob der Helfer akzeptiert wird. Die
+ Closure bekommt hierbei das Helferobjekt, die vom Helfer angegebene
+ Staerke/Guete und etwaige hier als <extra> uebergebene Argument
+ uebergeben. Ist der Rueckgabewert von <strength> != 0, wird der
+ Helfer akzeptiert und von GetHelperObject zurueckgegeben (ohne
+ weitere Helfer zu pruefen).
+
+
+RUECKGABEWERT
+=============
+
+ Objekt welches den uebergebenen Anforderungen entspricht.
+
+
+BEISPIELE
+=========
+
+ // Es wird ein Helfer zum Tauchen mit der Staerke 4 gesucht
+ PL->GetHelperObject(HELPER_TYPE_AQUATIC, 4);
+
+ // Es wird ein Helfer zum Fliegen mit der Staerke 4 gesucht, welcher aber
+ // mindestens 60 cm gross und maximal 900 g schwer ist.
+ PL->GetHelperObject(HELPER_TYPE_AERIAL, function int (object h, int s)
+ { return s >= 4
+ && h->QueryProp(P_SIZE) >= 60 && h->QueryProp(P_WEIGHT) <= 900;
+ }
+ );
+
+ // Es wird ein Helfer zum Fliegen mit der Staerke 4 gesucht, welcher aber
+ // mindestens 60 cm gross und maximal 900 g schwer ist, aber diese Grenzen
+ // werden nicht in der Funktion festgelegt, sondern als <extra> uebergeben.
+ PL->GetHelperObject(HELPER_TYPE_AERIAL,
+ function int (object h, int s, int min_s, int minsize, int maxweight)
+ { return s >= min_s
+ && h->QueryProp(P_SIZE) >= minsize
+ && h->QueryProp(P_WEIGHT) <= maxweight;
+ },
+ 4, 60, 900);
+
+
+SIEHE AUCH
+==========
+
+ *RegisterHelperObject()*, *UnregisterHelperObject()*,
+ *P_AERIAL_HELPERS*, *P_AQUATIC_HELPERS*, *P_HELPER_OBJECTS*
+
+Letzte Aenderung: 9.3.2018, Zesstra
diff --git a/doc/lfun/RegisterHelperObject b/doc/lfun/RegisterHelperObject
index af33a5c..21b75f4 100644
--- a/doc/lfun/RegisterHelperObject
+++ b/doc/lfun/RegisterHelperObject
@@ -138,7 +138,7 @@
SIEHE AUCH
==========
- Funktionen: UnregisterHelperObject()
+ Funktionen: UnregisterHelperObject(), GetHelperObject()
Properties: P_HELPER_OBJECTS, P_AERIAL_HELPERS, P_AQUATIC_HELPERS
Sonstiges: /sys/living/helpers.h
diff --git a/doc/lfun/init b/doc/lfun/init
index 481eec2..813c8f3 100644
--- a/doc/lfun/init
+++ b/doc/lfun/init
@@ -6,7 +6,7 @@
FUNKTION
========
- void init();
+ public varargs void init(object origin);
DEFINIERT IN
@@ -18,7 +18,9 @@
ARGUMENTE
=========
- keine
+ object origin
+ Ursprungsumgebung der Bewegung / letzte Umgebung des Lebewesen
+ (sofern existent)
BESCHREIBUNG
@@ -32,12 +34,32 @@
Der Hauptzweck dieser Funktion besteht darin, den Objekten
untereinander ihre jeweiligen Befehle zugaenglich zu machen.
Waehrend dies in anderen MudLibs durch eine Reihe von
- add_action()-Aufrufen im Rumpf von init() geschah, geschieht dies in
- der MG-MudLib bei Objekten, die /std/thing/commands.c erben
- (das sind zB. alle Standardobjekte) quasi automatisch
- (dort werden die Befehle dann per AddCmd() im create() angemeldet,
- man spart sich die Implementierung von init() und dem Mud somit
- Speicher). Der andere Weg ist aber natuerlich immer noch moeglich.
+ add_action()-Aufrufen im Rumpf von init() geschah, geschieht dies
+ in der MG-MudLib bei Objekten, die /std/thing/commands.c erben (das
+ sind zB. alle Standardobjekte) quasi automatisch (dort werden die
+ Befehle dann per AddCmd() im create() angemeldet, man spart sich
+ die Implementierung von init(). Der andere Weg ist aber natuerlich
+ immer noch moeglich.
+
+ Der Ablauf der init()-Kette ist wie folgt:
+
+ 1. Ist das Objekt X, welches ins Zielobjekt D bewegt wurde,
+ ein Lebewesen, so wird in D init() aufgerufen, wobei
+ this_player() auf X gesetzt ist.
+
+ 2. Dann wird fuer jedes Objekt C in D folgendes ausgefuehrt:
+
+ * Ist C ein Lebewesen, dann wird init() in X aufgerufen,
+ wobei this_player() auf C gesetzt ist.
+
+ * Ist X ein Lebewesen, dann wird init() in C aufgerufen,
+ wobei this_player() auf X gesetzt ist.
+
+ 3. Schliesslich wird in dem Fall, dass D lebendig ist, in X
+ init() aufgerufen, wobei this_player() auf D gesetzt ist.
+
+ Das Argument <origin> kann genutzt werden, um herauszufinden, wo
+ das Lebewesen nun eigentlich herkam.
RUeCKGABEWERT
@@ -49,43 +71,44 @@
BEMERKUNGEN
===========
- Der Ablauf der init()-Kette ist wie folgt:
- o Ist das Objekt X, welches ins Zielobjekt D bewegt wurde, ein
- Lebewesen, so wird in D init() aufgerufen, wobei this_player() auf
- X gesetzt ist.
- o Dann wird fuer jedes Objekt C in D folgendes ausgefuehrt:
- + Ist C ein Lebewesen, dann wird init() in X aufgerufen, wobei
- this_player() auf C gesetzt ist.
- + Ist X ein Lebewesen, dann wird init() in C aufgerufen, wobei
- this_player() auf X gesetzt ist.
- o Schliesslich wird in dem Fall, dass D lebendig ist, in X init()
- aufgerufen, wobei this_player() auf D gesetzt ist.
+ * Wenn man init() ueberschreibt und vergisst, in etwaigen
+ geerbten Programmen das init() zu rufen, resultiert das in
+ schweren Bugs
+
+ * Das Argument <origin> gab es frueher nicht und es ist
+ weitgehend optional. Die Standardlib uebergibt es, aber nicht
+ alle (speziell) aeltere Programme uebergeben es weiter an ihre
+ geerbten init().
BEISPIELE
=========
D sei ein Raum, in dem sich das Lebewesen L1 sowie die Gegenstaende
- N1 und N2 befinden.
- Betritt ein Spieler X diesen Raum, so werden folgende init()s
- aufgerufen:
+ N1 und N2 befinden. Betritt ein Spieler X diesen Raum, so werden
+ folgende init()s aufgerufen:
- D->init(); // this_player() == X
- X->init(); // this_player() == L1
- L1->init(); // this_player() == X
- N1->init(); // this_player() == X
- N2->init(); // this_player() == X
+ 1. D->init(); // this_player() == X
- Gelangt dagegen ein nichtlebendiges Objekt nach D, so sieht das Ganze
- wie folgt aus:
+ 2. X->init(); // this_player() == L1
- X->init(); // this_player() == L1
+ 3. L1->init(); // this_player() == X
+
+ 4. N1->init(); // this_player() == X
+
+ 5. N2->init(); // this_player() == X
+
+ Gelangt dagegen ein nichtlebendiges Objekt nach D, so sieht das
+ Ganze wie folgt aus:
+
+ 1. X->init(); // this_player() == L1
SIEHE AUCH
==========
- exit(), AddCmd(), add_action(),
- NotifyInsert()
+ *exit()*, *AddCmd()*, *NotifyInsert()*
-Last modified: 04.08.2007, Zesstra
+ add_action(E)
+
+Last modified: 07.03.2018, Zesstra
diff --git a/doc/lfun/remove b/doc/lfun/remove
index 914c1e1..78d8ada 100644
--- a/doc/lfun/remove
+++ b/doc/lfun/remove
@@ -12,27 +12,36 @@
DEFINIERT IN
============
- /std/thing/moving.c
- /std/living/moving.c
- /std/room/moving.c
+ /std/thing/moving.c /std/living/moving.c /std/room/moving.c
+ /std/unit.c
ARGUMENTE
=========
- silent
- Falls ungleich 0, so werden beim Zerstoeren keine Meldungen
- ausgegeben.
+ * silent: Falls ungleich 0, so werden beim Zerstoeren keine
+ Meldungen ausgegeben.
BESCHREIBUNG
============
- Beim Aufruf dieser Funktion entfernt sich das Objekt selbst. Durch
- Ueberladen dieser Funktion kann man diesen Vorgang noch durch die
- Ausgabe von Meldungen kommentieren, oder irgendwelche Daten
- abspeichern, oder das Zerstoeren ganz verhindern (auf diesem Weg... Mit
- destruct() kann das Objekt immer noch direkt zerstoert werden!)
+ Die meisten Objekte zerstoeren sich durch den Aufruf von remove()
+ selbst.
+
+ Unitobjekte reduzieren P_AMOUNT um U_REQ Einheiten. Will man ein
+ Unit- Objekt vollstaendig zerstoeren, ist vor dem Aufruf von
+ remove() U_REQ auf P_AMOUNT zu setzen. Wird durch remove() P_AMOUNT
+ 0, wird das Objekt natuerlich zerstoert.
+
+ Durch Ueberladen dieser Funktion kann man diesen Vorgang noch durch
+ die Ausgabe von Meldungen kommentieren, oder irgendwelche Daten
+ abspeichern, oder das Zerstoeren ganz verhindern (auf diesem Weg...
+ Mit destruct() kann das Objekt immer noch direkt zerstoert werden!)
+
+ ACHTUNG: Wenn ein Objekt durch remove() nicht zerstoert wird,
+ koennte das einen Grund haben. Bitte nicht einfach destruct()
+ verwenden, das ist nur fuer Notfaelle wie ein buggendes remove().
RUeCKGABEWERT
@@ -44,13 +53,13 @@
BEMERKUNGEN
===========
- Nach einem erfolgreichen ::remove() gelten die selben Einschraenkungen
- wie nach einem destruct()!
+ Nach einem erfolgreichen ::remove() gelten die selben
+ Einschraenkungen wie nach einem destruct()!
SIEHE AUCH
==========
- destruct()
+ "../efun/destruct", *U_REQ*, *P_AMOUNT*
-Last modified: Wed May 8 10:23:40 1996 by Wargon
+Letzte Aenderung: 24.07.2018, Bugfix
diff --git a/doc/materials/materials/MAT_CHOCOLATE b/doc/materials/materials/MAT_CHOCOLATE
index c5f6ecc..fc699f5 100644
--- a/doc/materials/materials/MAT_CHOCOLATE
+++ b/doc/materials/materials/MAT_CHOCOLATE
@@ -11,11 +11,11 @@
kakaohaltige Suessspeise mit Extra-Milch
Erkennbarkeit:
-MAT_SHIT:-50
-MAT_MISC_FOOD:-25
+MAT_SHIT:-40
+MAT_WAX: -20
+MAT_MISC_FOOD:5
MAT_CHOCOLATE
Gruppenzugehoerigkeit:
MATGROUP_EATABLE:100
-MATGROUP_BIO:100
MATGROUP_SOLID:100
diff --git a/doc/props/P_WEIGHT b/doc/props/P_WEIGHT
index 4c37e46..a68f580 100644
--- a/doc/props/P_WEIGHT
+++ b/doc/props/P_WEIGHT
@@ -18,26 +18,33 @@
BESCHREIBUNG
============
- - Objekte
- Das Gewicht eines Objetes in Gramm.
+ * Objekte Das Gewicht eines Objetes in Gramm.
- - Speisen
- Gewicht einer Portion der Speise.
+ * Speisen Gewicht einer Portion der Speise.
+
+ * Container Das Gewicht des Containers ohne Inhalt
+
+ * Lebewesen Das Gewicht des Lebewesens ohne Inhalt
BEMERKUNGEN
===========
- In tragbaren Speisen (erben von /std/food) setzt man mit SetProp
- das Gewicht _einer_ Portion. Per QueryProp erhaelt man aber das
- Gesamtgewicht der Speise inclusive des eventuell vorhandenen Behaelters.
- Das Gewicht des Behaelters wird dabei aus P_EMPTY_PROPS[P_WEIGHT]
- gelesen.
+ Das Gewicht eines Objektes (in Gramm). Bei normalen Objekten ist es
+ das Gesamtgewicht dieses Objektes. Bei Containern (und Lebewesen)
+ ist es das Gewicht des Containers ohne etwaigen Inhalt.
+
+ In tragbaren Speisen (welche von von /std/food erben) setzt man mit
+ SetProp das Gewicht _einer_ Portion. Per QueryProp erhaelt man aber
+ das Gesamtgewicht der Speise inclusive des eventuell vorhandenen
+ Behaelters. Das Gewicht des Behaelters wird dabei aus
+ P_EMPTY_PROPS[P_WEIGHT] gelesen.
SIEHE AUCH
==========
- Speisen: wiz/food, P_EMPTY_PROPS
+ *P_TOTAL_WEIGHT* *P_EMPTY_PROPS*, *P_WEIGHT_PERCENT*,
+ *P_WEIGHT_PER_UNIT*, zu Speisen: wiz/food
-Last modified: Thu Oct 28 12:15:00 2010 by Caldra
+Last modified: 25.07.2018 by Zesstra