
RemoveSounds()
**************


FUNKTION
========

   void RemoveSounds(string|string* keys);


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

   /std/thing/description.c


ARGUMENTE
=========

   keys
     String oder Array von Strings mit den zu entfernenden Details.


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

   Diese Funktion entspricht dem RemoveDetail() fuer Standarddetails,
   nur koennen hiermit Gerauesche entfernt werden:
   Entfernt die in <keys> angegebenen Details aus der Liste der
   vorhandenen Details. Uebergibt man fuer <keys> eine 0, so werden
   saemtliche Details entfernt!


BEISPIEL
========

   Wir lassen etwas Musik spielen und wenn wir den Plattenspieler
   ausmachen, dann endet sie und man hoert auch nichts mehr:

     int ausmachen(string str);
     ...
     AddSounds(({"musik","hip-hop"}) ,"Klingt nach Hip-Hop...\n");
     AddCmd("mach|mache&plattenspieler&aus", #'ausmachen,
            "Was willst du (aus)machen?|Willst du den ausmachen?^");
     ...
     int ausmachen(string str) {
       if(!GetDetail("musik", 0, SENSE_SOUND)) // existiert Musikdetail ?
         return("Der Plattenspieler laeuft doch gar nicht!\n", 1);
       RemoveSounds(0);
        return 1;
     }


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

   Setzen:    AddDetail(), AddReadDetail(), AddSmells(), AddSounds(),
              AddTouchDetail()
   Loeschen:  RemoveDetail(), RemoveReadDetail(), RemoveSmells(),
              RemoveTouchDetail()
   Daten:     P_DETAILS, P_READ_DETAILS, P_SMELLS, P_SOUNDS, P_TOUCH_DETAILS
   Veraltet:  AddSpecialDetail(), RemoveSpecialDetail(), P_READ_MSG
   Sonstiges: GetDetail(), break_string()

8. Juli 2011 Gloinson
