
SetChats()
**********


FUNKTION
========

   void SetChats(int chance, mixed strs);


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

   /std/npc/chat.c


ARGUMENTE
=========

   int chance
      Prozentuale Wahrscheinlichkeit einer Ausgabe

   <string|closure|<string|closure|int>* >* strs
      Array mit den verschiedenen Moeglichkeiten der Monsterchats
      (optional)


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

   Der NPC gibt mit der Wahrscheinlichkeit <chance> pro Heartbeat
   einen zufaellig gewaehlten Text aus dem Array <strs> in den Raum
   aus. Wird kein <strs> uebergeben, wird nur die Chat-Chance
   geaendert und die bisherigen Chats werden beibehalten.

   Per Default wird send_room() ohne erneutes Umbrechen mit den
   Messagetypen MT_LOOK|MT_LISTEN|MT_FEEL|MT_SMELL zur Ausgabe
   verwendet.

   Die einzelnen Arrayelemente koennen sein:

      * Strings

      * Closures, deren Rueckgabe ausgegeben wird und die
        zusaetzlich einen aenderbaren und in send_room() verwendeten
        'msg_typ' per Referenz uebergeben bekommen

      * Arrays mit der Struktur *({<string|closure msg >, <int
        msg_typ>})*, fuer die obige Regeln auf 'msg' angewendet werden
        und bei denen 'msg_typ' im send_room() verwendet wird

   Fuer keine Ausgabe muss man einen Leerstring "" zurueckgeben oder
   verwenden. In allen Funktionen ist this_player() das Monster
   selbst. Normalerweise muss man die Nachrichten selbst umbrechen,
   ausser man uebergibt die Message-Typen explizit und uebergibt kein
   MSG_DONT_WRAP.


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

   * im Kampf werden keine Chats ausgegeben, man muss dann
     SetAttackChats() verwenden

   * die strings werden (noch) durch process_string() geschickt,
     dieses sollte man aber nicht mehr verwenden

   * 'chance' gilt sowohl fuer Attack- als auch normale Chats

   * 'chance' wird in der Property P_CHAT_CHANCE abgelegt. Um einen
     NPC voruebergehend 'stillzulegen', kann man P_CHAT_CHANCE auf 0
     setzen

   * Spieler koennen P_CHAT_CHANCE temporaer auf 0 setzen
     ('stillen')

   * NPC haben bei Abwesenheit von Spielern in der Regel keinen
     Heartbeat, weswegen dann auch die Chats ausgeschaltet sind

   * send_room() bekommt immer MSG_DONT_STORE|MSG_DONT_BUFFER
     uebergeben


BEISPIELE
=========

   // Ein einfaches Beispiel:
   SetChats(20,
    ({"Der Ork sagt: Hau ab, bevor ich Dich fresse.\n",
      "Der Ork grinst Dich unverschaemt an.\n",
      "Der Ork wedelt mit seinem Saebel vor dir herum.\n",
      "Der Ork stupst Dich mit dem Finger hart.\n"}));

   // Ein Beispiel mit send_room-Typen ohne MSG_DONT_WRAP
   SetChats(20,
    ({({"Der Ork sagt: Hau ab, bevor ich Dich fresse.", MT_LISTEN}),
      ({"Der Ork grinst Dich unverschaemt an.", MT_LOOK}),
      ({"Der Ork wedelt mit seinem Saebel vor dir herum.", MT_LOOK}),
      ({"Der Ork stupst Dich mit dem Finger hart.", MT_LOOK|MT_FEEL})}));

   // Laengeres Beispiel mit Closures
   protected string chat_flightinfo(int msg_typ);
   protected string chat_trysteal(int msg_typ);

   void create() {
     SetChats(20,
      ({({"Der Ork sagt: Hau ab, bevor ich Dich fresse.\n", MT_LISTEN}),
        #'chat_flightinfo,
        #'chat_trysteal}));
     // [...]
   }

   protected string chat_flightinfo(int msg_typ) {
     msg_typ = MT_LISTEN;
     return ("Der Ork sagt: "+
             (QueryProp(P_HP)<QueryProp(P_WIMPY)?
               "Ich hab Angst!":
               "Guck mich nicht so an, Schwaechling!"));
   }

   protected string chat_trysteal(int msg_typ) {
     object *pls = filter(all_inventory(environment()), #'interactive);
     if(sizeof(pls)) {
       object pl = pls[random(sizeof(pls))];
       if(!IS_LEARNER(pl)) {
         object *objs = all_inventory(pl);
         if(sizeof(objs)) {
           object ob = objs[random(sizeof(objs))];
           if(ob->move(this_object(),
                       M_NO_SHOW|M_GIVE|M_MOVE_ALL)==MOVE_OK) {
             if(pl->ReceiveMsg(Name(WER)+" stiehlt dir "+ob->name(WEN, 0)+".",
                               MT_FEEL|MT_LOOK)<0)
               pl->ReceiveMsg("Irgendwie scheint dir jetzt etwas zu fehlen.",
                              MT_FEEL|MT_LOOK|MSG_DONT_IGNORE);
             send_room(environment(),
               Name(WER, 1)+" bestiehlt "+pl->name(WEN)+".",
               MT_LOOK, 0, 0, ({pl}));
             return "";
           }
         }
       }
     }
     msg_typ = MT_LOOK;
     return Name(WER, 1)+" schaut sich verstohlen um.";
   }


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

   Verwandt:
      SetAttackChats()

   Props:
      P_CHAT_CHANCE, P_ACHATS, P_ACHAT_CHANCE

   Sonstiges:
      send_room(), process_string()

3. April 2017 Gloinson
