FUNKTION:
public string *TruncateBodyzone(string bzone, string msg2opfer,
string msg2room)
ARGUMENTE:
bzone: 'u_name' (Uniquename) der abzuhackenden Koerperzone.
msg2opfer: Message, die an das Opfer ausgegeben wird und ueber den
Verlust des Koerperteils informieren sollte.
msg2room: Message, die an den Raum des Opfers ausgegeben wird und
ueber den Verlust des Koerperteils informieren sollte.
DEFINIERT IN:
/sys/living/body.h
/std/living/body.c
RÜCKGABEWERT:
* Array aus Strings mit allen erfolgreich abgehackten
Koerperzonen (u_name)
* leeres Array, wenn die Zone schon fehlte oder es die
Koerperzone nicht gibt
BESCHREIBUNG:
TruncateBodyzone() - Hackt ein Koerperteil ab
Die Funktion wird erst nach der Einfuehrung des Koerperzonen-
Konzeptes (ca. Juli 2002) ausgewertet!
Dem abgehackten Koerperteil wird einfach BZO_TRUNCATED gesetzt.
Es wird NICHT wirklich aus 'bodyzones' entfernt! Ausserdem werden
auch alle damit verbundenen Koerperteile abgehackt. Abgetrennt werden
koennen nur Koerperteile, die ein Leichenteil-Object (BZO_CORPSE)
gesetzt haben. Bei Spielern sind das standardmaessig alle Zonen
ausser dem Rumpf. Es werden alle erfolgreich entfernten (Sub-)Teile
als Returnwert zurueckgegeben. Also ein Abhacken von einem Arm
fuehrt auch zum Verlust einer damit verbundenen Hand, etc.
Ist BZO_CORPSE mit einem String belegt, so wird dieser als Pfad zum
Leichenteil-Objekt gewertet. Ist BZO_CORPSE stattdessen 1, wird ein
Standard-Leichenteil erzeugt.
Bei Verlust einer Hand wird die mit dieser Hand gefuehrte Waffe
automatisch 'zurueckgesteckt' und faellt in den Raum. Ruestungen
fallen erst in den Raum, wenn das letzte Stueck der Ruestung
abgehackt wird. Bis dahin wird in der Ruestung nur um den Schutz der
verlorenen Zonen beraubt.
Bei der Benutzung der Message-Argumente muss man schon vorher
wissen, was letztendlich abgetrennt wird. Oder man wertet statt dessen
den Rueckgabewert aus und gibt dann die Meldung getrennt aus.
Je nach Bodytyp koennen die Uniquenamen der Bodyzonen unterschied-
liche sein. Die Uniquenamen fuer die standardisierten Bodytypen
koennen in /sys/living/body.h nachgelesen werden.
msg2room und msg2opfer werden mittels parse_mess() ausgewertet.
BEISPIELE:
1) Kleine Beispiele zum Spielen mit dem Xtool (jeweils mit
vollstaendigem Koerper):
xcall $m->TruncateBodyzone("lHand")
Result: ({"lHand"})
xcall $m->TruncateBodyzone("lBein")
Result: ({"lBein", "lFuss"})
2) Wir wollen eine Hand entfernen. Am liebsten die rechte. Wenn der
Spieler aber keine rechte Hand mehr hat, nehmen wir auch die
linke. ;-)
int hand_abhacken()
{
string *ret;
ret = this_player()->TruncateBodyzone("rHand", "Du hackst Dir die "
"rechte Hand ab.", PL->name(WER, NAME_DEF|NAME_CAP)+" hackt sich "
"die rechte Hand ab.");
// ret sollte nun ({"rHand"}) sein
// wenn nicht:
if (!sizeof(ret))
ret = this_player()->TruncateBodyzone("lHand", "Du hackst Dir "
"die linke Hand ab.", PL->name(WER, NAME_DEF|NAME_CAP)+
" hackt sich die linke Hand ab.");
// ret sollte nun ({"lHand"}) sein
// wenn nicht:
if (!sizeof(ret) // das ging auch nicht ... komisch
write(break_string(
"Huch? Du hast wohl gar keine Haende? Du musst ein "
"Lebenskuenstler sein."));
return 1;
}
SIEHE AUCH:
RestoreBodyzone(L), AddBodyzone(L), QueryBodyzone(L), GetBodyType(L),
RestoreAllBodyzones(L), RemoveBodyzone(L), CreateBody(L),
GetBodyzones(L), GetZonesByType(L), SetBodyzone(L),
koerperzonen(WL), P_MAX_HANDS
|