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
