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)

05. September 2015, Arathorn

