
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
