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


FUNKTION
========

   void SetChats(int chance, mixed strs);


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

   /std/npc/chat.c


ARGUMENTE
=========

   int chance
      Prozentuale Wahrscheinlichkeit einer Ausgabe

   mixed strs
      Array mit den verschiedenen Moeglichkeiten der Monsterchats


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

   Der NPC gibt mit der Wahrscheinlichkeit <chance> pro Heartbeat
   einen zufaellig gewaehlten Text aus dem Array <strs> in den Raum
   aus. Dabei wird per Default send_room() ohne erneutes Umbrechen mit
   den Messagetypen MT_LOOK|MT_LISTEN|MT_FEEL|MT_SMELL verwendet.

   Die einzelnen Arrayelemente koennen:

      * Strings sein

      * Closures sein, 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>})* sein, 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
