SetAttackChats()
****************


FUNKTION
========

   void SetAttackChats(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> waehrend des
   Kampfes 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
===========

   * ausserhalb des  Kampf werden keine AttackChats ausgegeben, man
     muss dann SetChats() 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

   Man kann AttackChats nutzen, um Monsterspells zu realisieren.
   Besser ist es aber, dafuer 'AddSpell' zu benutzen, ausser man
   moechte zB die Spielerfaehigkeit des Abschaltens der Chats
   verwenden.


BEISPIELE
=========

   protected string knirschschrei(int msg_typ);

   SetAttackChats( 20,
    ({"Der Ork tritt Dir in den Hintern.\n",
      ({"Der Ork bruellt: Lebend kommst Du hier nicht raus!\n", MT_LISTEN}),
      ({"Der Ork blutet schon aus mehreren Wunden.\n", MT_LOOK}),
      #'knirschschrei}));

   protected string knirsch(int msg_typ) {
     object helm = this_player()->QueryArmourByType(AT_HELMET);
     if (objectp(helm)) {
       // AC nur dann senken, wenn sie nicht schon 0 ist.
       if (helm->QueryProp(P_AC)>0) {
         helm->Damage(1);
         msg_typ = MT_LISTEN|MT_FEEL;
         return ("Der Ork schreit dich so laut an, dass dabei "+
                 helm->QueryOwn(WER)+" "+
                 helm->name(RAW)+" beschaedigt wird.");
       }
     }
     return ""; // keine Meldung
   }


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

   Verwandt:
      SetChats(), AddSpell()

   Props:
      P_ACHAT_CHANCE, P_CHATS, P_CHAT_CHANCE

   Sonstiges:
      send_room(), process_string()

3. April 2017 Gloinson
