
replace_personal()
******************


FUNKTION
========

   varargs string replace_personal(string str, mixed *obs [, int caps]);


DEFINIERT IN
============

   /secure/simul_efun.c


ARGUMENTE
=========

   str    - zu bearbeitender String
   obs    - Liste von Objekt1, Objekt2, ..., Objekt9
            (Objekte oder Strings)
   caps   - 1 fuer Grossschreibung des Ersetzten nach Satzenden (.,?,!,")
            0 sonst


BESCHREIBUNG
============

   Ersetzt in Strings
   @WERx, @WESSENx, @WEMx, @WENx durch
      Objectx->name(<casus>, 1);
   @WERUx, @WESSENUx, @WEMUx, @WENUx durch
      Objectx->name(<casus>);
   @WERQPx, @WESSENQPx, @WEMQPx, @WENQPx durch
      Objectx->QueryPronoun(<casus>);
   @WERQAx, @WESSENQAx, @WEMQAx, @WENQAx durch
      Objectx->QueryArticle(<casus>, 1, 1);
   @WERQPPGNx, @WESSENQPPGNx, @WEMQPPGNx, @WENQPPGNx durch
      Objectx->QueryPossPronoun(<gender>, <casus>, <number>);
   oder den entsprechenden String bei "Objektx".


BEMERKUNGEN
===========

   x steht fuer die Position des Objekts/Strings in *obs, beginnend bei 1.

   Besonderheiten beim Possessivpronomen (@WERQPPGNx):
   G muss durch das Geschlecht (M, F oder N) und N durch den Numerus (S
   oder P) ersetzt werden.
   Alle Angaben, auch der CASUS, beziehen sich dabei auf das Objekt, welches
   besessen wird, nicht auf den Besitzer! Dieser ist bereits durch x
   bestimmt.


RUeCKGABEWERT
=============

   durchersetzter String


Beispiele
=========

   replace_personal("@WER1", ({find_player("gloinson")})) ==> "Gloinson"

   replace_personal("@WEMQP1", ({find_player("gloinson")})) ==> "ihm"

   // unbestimmter und bestimmter Artikel:
   replace_personal("@WER1 zueckt @WENU2 und verhaut @WEN3.",
                    ({find_player("gloinson"),
                      find_object("/obj/mpa"),
                      find_object("/obj/wanderer")}))
   ==> "Gloinson zueckt eine Zeitung und verhaut den Wanderer."

   // Beim Possessivpronomen beziehen sich WEN, F und P (Akkusativ,
   // Femininum, Plural) auf die Taschen, nicht auf Kessa:
   replace_personal("@WER1 steckt @WESSEN2 Turnschuhe in @WENQPPFP1 "
                    "Taschen.",
                    ({find_player("kessa"),
                      find_player("gloinson")}))
   ==> "Kessa steckt Gloinsons Turnschuhe in ihre Taschen."

   // Ein Beispiel mit laengerem *obs:
   replace_personal("@WER1 zieht @WENQPPMP1 neuen Turnschuhe an. @WER2 ist "
                    "so beeindruckt, dass @WERQP2 @WEMQP1 @WENU3 auf die "
                    "@WEN4 haut und die Schuhe in @WEMQPPFS2 Tasche "
                    "verschwinden laesst. @WERU5 schaut zu und kichert "
                    "irre. Wenn das @WER6 gesehen haette!",
                    ({find_player("gloinson"),
                      find_player("kessa"),
                      find_object("/obj/mpa"),
                      "Birne",
                      find_object("/obj/wanderer"),
                      find_netdead("jof")}),1)
   ==> "Gloinson zieht seine neuen Turnschuhe an. Kessa ist so "
       "beeindruckt, dass sie ihm eine Zeitung auf die Birne haut und die "
       "Schuhe in ihrer Tasche verschwinden laesst. Ein Wanderer schaut "
       "zu und kichert irre. Wenn das Jof gesehen haette!"


SIEHE AUCH
==========

   AddCmd(L)

5. September 2015, Arathorn
