// MorgenGrauen MUDlib
//
// player/soul.c -- Die Seele des Spielers
//
// $Id: soul.c 9527 2016-03-12 11:37:54Z Arathorn $

// Letzte Aenderung vom 08.09.95  Wargon

// Set TabStop to 2 characters

/* Version 1.41 MG, September 95
   - Bei "frage" und "antworte" Test auf P_PERM_STRING fuer Sprachflueche.
   - bugfix bei "schweige" (nahm keine Adverbien an)
   */

/* Version 1.4 MG, August 95
   - Hilfefunktion eingebaut, siehe auch soulhelp.c
   - einige kleinere Aenderungen erst jetzt durch eine neue Version gewuerdigt
   - neue Verben, wie eigentlich fast immer :>
   - typos und bugs gefixed (und neue eingebaut...)
   - Funktion zur Abfrage von Adverbien von aussen eingebaut (Hallo, Anthea :>)
   - so schlimm kann das doch nicht sein, einen TabStop von 2 zu nehmen, fuer
     dieses eine file, alles andere zerlegt meine Formatierung immer so :<
   - koenntet ihr bitte mal oben das "Letzte Aenderung" aendern, wenn ihr
     irgendwo was aendert?
   */

/* Version 1.35 MG, Dezember 94
   - Verben
   - Aenderung des Parsings der quoted adverbs
   - rknuddel ignorieren wird vom normalen ignore uebernommen
   */

/* Version 1.32 MG, Juli 94
   - einige Verben
   - ignorieren des rknuddel
   */

/* Version 1.31 MG, Mai 94
   - einige Verben
   */

/* Version 1.3 MG, Mai 94
   - quoted adverbs GEHEN jetzt
   - ParseRest / ParseRemote neu geschrieben
   */

/* Version 1.21 MG, April 94
   - quoted adverbs
   */

/* Danke an Angus fuer den Text von "liebe" */

/* Version 1.2 MG, Januar 94
   - Umstellung der Feelings von vielen kleinen Funktionen auf eine grosse,
     damit der Funktionsoverhead wegfaellt.
   - neue Ausgabe der Adverbien, mit more und nur noch eines pro Zeile
   - mal wieder neue Verben.
   - und das neue Standardadverb "jofi" :)
   */

/* Version 1.1 MG, November 93
   Aenderungen:
   - Ich habe "alle(n)" eingebaut. Die Verwaltung steht, man kann jetzt
     Verben die Moeglichkeit "alle" geben (Bsp. "wink alle").
   - inzwischen wieder einige Verben mehr, aber muss ich das noch
     erwaehnen?
   - (HASS) Rumata hat mein schoenes System fuer die Ausgabestrings
     verkompliziert. Statt &a steht da jetzt z.B. @@adverb@@, was in
     einer weiteren unnoetigen Funktion resultierte. Naja.
   Highlander ryn Tahar
   */

/*
   Ha! Ich nehme jetzt die erste ganze Versionsnummer fuer mich in Anspruch :)
   So, heute ist's geschafft (Ich auch...). Ich bin fertig - ich mach nur
   noch neue Verben rein, wenn Ideen kommen.
   Gegeben an Dienstag, dem 22. Juni 1993 im heimatlichen Horst.
   Highlander ryn Tahar.
   P.S.: Kopiere sich das Ding, wer will - unter folgenden Bedingungen:
   - Den Goettern von MorgenGrauen und
   - Highlander@TAPPMud     Bescheid sagen und ausserdem
   *seufz* nehmt Highlander hier in MorgenGrauen!! -HrT
   Ha! Ihr koennt wieder TAPPMud nehmen :>  Aber sagt's ruhig in MG. -HrT
   - entweder den ganzen Schwall hier drinlassen oder mich mit einem
   neuen Text erwaehnen.
   Das Ganze unter der Voraussetzung, dass ueberhaupt mal jemand eine deutsche
   Seele braucht und sie nicht selber schreiben will :-) (ersparts euch lieber)
   Highlander ryn Tahar.

   **Arbeit:
   Einbau von Adverbien, andere Reaktionen bei Geistern als "Wie bitte?",
   einige neue Verben, einige alte Verben rausgeschmissen.
   Weil es Probleme mit dem autoloading der playeradverbs gab, wurde
   ausserdem die soul vom Objekt zum inheritfile fuer die playershell.

   **Ideen  zum Weitermachen:
   - (verb) alle, z.B. tritt alle   -- Moeglichkeit eingebaut
   - Geisterverben mit Adverb

   Version 1.0 fuer MorgenGrauen    Highlander Mai/Juni 93
   */


/* Hier ist sie nun, die DEUTSCHE version der soul,
   viel Spass damit.
   Poietix  Mai 1992
   Vers.: 0.4 fuer JRMud
   P.S. bitte meckert nicht dran rum , sondern verbessert und
   erweitert sie.

   Olpp November 1992
   Vers.: 0.5 fuer MorgenGrauen

   He, Olpp, schreibt man nicht die neueste Aenderung UEBER die alten?
   *grins*, Highlander
   */
#pragma strong_types
#pragma save_types
//#pragma range_check
#pragma no_clone

#define SOULHELP "/std/player/soulhelp"
#define LF "\n"
#define NOT_SELF 1
#define NOT_DEAD 1

#define QPP QueryPossPronoun
#define RETURN return _notify_fail
#define Return return 0||_notify_fail  // netter Trick, muss ich mir merken -HrT
#define GHOSTCHECK(sel,oth,vic) if (ghost()) {  write(sel); say(oth,who||ME);\
                                  if (vic) who->Message(vic); return 1;  }
#define HELPCHECK(x) if (str && (str=="-h" || str=="-?" || str=="/h" \
         || str=="/?" || str=="hilfe"))\
                       { More(SOULHELP->Help(x)); return 1; }

// "schau an" als nicht-Untersuchung. Klappt aber anscheinend nicht, weil
// ich nicht gegen den GD ankomme. Also besser auskommentiert lassen.
#ifdef SCHAU_AN
#undef SCHAU_AN
#endif

// Anpiepsen mit Text. Im Moment erlaubt, bei Missfallen auskommentieren und
// in der Hilfe auskommentieren.
#ifdef WECKE
#undef WECKE
#endif

#define WECKE

#define NEED_PROTOTYPES
#include <thing/description.h>
#include <thing/properties.h>
#include <player.h>
#include <player/comm.h>
#include <language.h>
#undef NEED_PROTOTYPES

#include <properties.h>

#include <defines.h>
#include <moving.h>
#include <wizlevels.h>
#include <class.h>

static object who, ofoo;
static int for_all, flag, ifoo;
mapping plr_adverbs;
static string out_sel, out_vic, out_oth, adverb, sfoo;

private void ParseAdverb(string *words);
private string convert_string(string str);
varargs mixed More(string str, int fflag, string returnto);
string MatchAdverb(string str);

mapping
QueryStdAdverbs()  {
  return ([
    "unve" : "unverschaemt",
    "gutg" : "gutgelaunt",
    "gutm" : "gutmuetig",
    "froh" : "froh",
    "glue" : "gluecklich",
    "wuet" : "wuetend",
    "frec" : "frech",
    "daem" : "daemonisch",
    "boes" : "boese",
    "ungl" : "ungluecklich",
    "lang" : "langsam",
    "schn" : "schnell",
    "jamm" : "jammernd",
    "freu" : "freundlich",
    "shue" : "schuechtern",
    "amue" : "amuesiert",
    "aerg" : "aergerlich",
    "aner" : "anerkennend",
    "erst" : "erstaunt",
    "bitt" : "bitter",
    "brei" : "breit",
    "vors" : "vorsichtig",
    "char" : "charmant",
    "kalt" : "kalt",
    "verf" : "verfuehrerisch",
    "zufr" : "zufrieden",
    "tief" : "tief",
    "verz" : "verzweifelt",
    "drec" : "dreckig",
    "vert" : "vertraeumt",
    "uebe" : "ueberzeugt",
    "frus" : "frustriert",
    "stra" : "strahlend",
    "hoff" : "hoffnungsvoll",
    "unge" : "ungeduldig",
    "unsi" : "unsinnigerweise",
    "unsc" : "unschuldig",
    "unwi" : "unwissend",
    "iron" : "ironisch",
    "wiss" : "wissend",
    "gema" : "gemaechlich",
    "sehn" : "sehnsuechtig",
    "laut" : "laut",
    "lieb" : "liebevoll",
    "froe" : "froehlich",
    "dank" : "dankbar",
    "natu" : "natuerlich",
    "gedu" : "geduldig",
    "perf" : "perfekt",
    "vers" : "verspielt",
    "hoef" : "hoeflich",
    "stol" : "stolz",
    "frag" : "fragend",
    "rupp" : "ruppig",
    "trau" : "traurig",
    "vera" : "veraechtlich",
    "scha" : "schamlos",
    "erns" : "ernst",
    "schu" : "schuechtern",
    "zaer" : "zaertlich",
    "sanf" : "sanft",
    "entg" : "entgeistert",
    "heim" : "heimtueckisch",
    "gela" : "gelangweilt",
    "wild" : "wild",
    "jofi" : "wie Jof, wenn er mal nicht idlet",
  ]);
}

mapping
QueryAdverbs() {
  if (extern_call())
    return deep_copy(plr_adverbs);
  return plr_adverbs;
}

string
MatchAdverb(string a)  {
  ParseAdverb(explode(a," "));
  return adverb;
}

// Verwaltungsroutinen

static void
add_soul_commands()  {
  if (!plr_adverbs)
    plr_adverbs=([]);
  add_action("SoulComm", "", 1);
}

static int
verben_liste()  {
  More(SOULHELP->Help());
  return 1;
}

#define ghost() QueryProp(P_GHOST)
#define frog() QueryProp(P_FROG)
#define capname() capitalize(name())
#define gname() (ghost()?(frog()?"Der Geist eines Frosches"\
			        :"Der Geist von "+capname())\
		        :capname())

varargs private void
ParseRest(string arg, mixed extra)  {
  string wie,*words,quotea;
  int num,bis;
  who = for_all = adverb = 0;
  if (!arg) return;
  if (extra)
    if (!pointerp(extra)) {
      if (sscanf(arg, extra+" %s", wie)==1)
      arg=wie;
    }
    else
      for (bis=sizeof(extra),num=0; num<bis; num++)
        if (sscanf(arg, extra[num]+" %s", wie)==1)
          arg=wie;

  if ((bis=strstr(arg, "/"))>=0)
    quotea=arg[bis..],arg=arg[0..bis-1];
  quotea=quotea||"",arg=arg||"";

  words=explode(implode(explode(arg, ","), " und"), " ");
  if (!sizeof(words)) return;
  <string|int> wer;
  if (sizeof(words) && (words[0]=="alle" || words[0]=="allen")) {
    for_all=1;
    wer=words[0];
    words=words[1..];
  }
  if (!for_all)  {     /* noch kein Opfer */
    wer=match_living(lower_case(words[0]));
    if (stringp(wer)) who=present(wer, environment(ME));
    if (!who) who=present(words[0], environment(ME));
    if (who && who->QueryProp(P_INVIS)) who=0;
    }
  if (who && sizeof(words))
    words=words[1..];  /* Opfer gefunden - wenn's eines gibt */
  words+=explode(quotea, " ");
  words-=({""});
  if (sizeof(words)) ParseAdverb(words);
}

private int
ParseRemote(string arg)  {
  string* words;

  adverb = 0; // Adverb vom letzten Mal keinesfalls wiederverwenden. ;-)

  if (!stringp(arg) || !sizeof(arg)) return 0;
  
  words=explode(arg," ");

  mixed liv = match_living(lower_case(words[0]));
  if (stringp(liv))
      who=find_player(liv);
  
  if (who) {
    // Ziel ist ein Spieler.
    if (!who->QueryProp(P_INVIS) || IS_WIZARD(ME))
    {
      // Spieler ist nicht Invis oder ich bin Magier.
      string nam = (query_once_interactive(ME) ? getuid() : 
	             lower_case(name(RAW)));
      if (query_verb()[0..5]=="rknudd" &&
	  who->TestIgnore(nam+".rknuddel") )
      {
        // ich oder das Kommando werde ignoriert.
        write(who->Name(WER)+" ignoriert Deinen Knuddelversuch.\n");
        return 1;
      }
    }
    else
      // Spieler ist invis und ich bin kein Magier.
      who = 0;
  }
  // kein eingeloggter und sichtbarer Spieler. Vielleicht ein NPC? (BTW: kein
  // else if, weil im if fuer Spieler oben who genullt werden kann und dann
  // nochmal nach nem NPC gesucht werden soll.)
  if (!who) {
    string|int wer = match_living(lower_case(words[0]));
    if(stringp(wer)) 
      who=present(wer,environment(ME));
    if (!who) who=present(words[0], environment(ME));
    if (who && who->QueryProp(P_INVIS)) who=0;
  }

  if (!who || sizeof(words)==1) return 0;
  words=words[1..];
  ParseAdverb(words);
  return(0);
}

/**
 Gibt den passenden Adverb-Text zu einem key zurueck
 \param s Danach wird in der Adverbien-Liste gesucht
 \param fuzzy 
 \return Der gefundene Adverbientext oder 0
 */
varargs string GetPlayerAdverb( string s, int fuzzy ) {
  int i, j; 
  string *search_pattern,
         *search_result, 
          result;

  // Erstmal gucken, ob der String direkt gefunden werden kann
  // das geht am schnellsten
  result = QueryStdAdverbs()[s] || plr_adverbs[s];

  // Wenn noch kein Ergebnis gefunden, und man unscharf suchen will
  if ( fuzzy && !result) {

    // Suchmuster fuer das Intersect erzeugen
    search_pattern=({s});

    j = sizeof(s)-1;
    for ( i=2;  i < j ;i++) {
      search_pattern += ({s[0..<i]});
    }

    // Intersect zwischen allen bekannten Abkuerzungen und Search-Pattern
    // erzeugen. Dieses wird dann gleichzeitig nach Laenge sortiert
    // genauester Treffer = String mit groesster Laenge
    search_result = sort_array(
      (m_indices(QueryStdAdverbs()) | m_indices(plr_adverbs))&search_pattern, 
         #'>);

    // Adverb zum genauesten Treffer zurueckgeben
    if (sizeof(search_result)) 
      result = QueryStdAdverbs()[search_result[0]] || 
               plr_adverbs[search_result[0]];
  }

  return result;
}

/**
  Parst die Adverbienparameter fuer Verben und speichert die
  passende Textausgabe in der globalen Variable "adverb"
  \param words Array mit den zu parsenden Adverbien-Strings
*/
private void
ParseAdverb(string *words)  {
  int num,andsign,bis;
  string qadv,*adv,cnt;

  adv=({});
  qadv=0;

  bis=sizeof(words);
  // Sonderfall Gequotetes Adverb (alles nach dem Quote) speichern und aus 
  // Words rausschneiden.
  for (num=0; num<bis; num++)
    if (words[num][0..0]=="/")  {
      words[num]=words[num][1..];
      qadv=implode(words[num..], " ");
      words=words[0..num-1];
      break;
    }

  // Es kann sein, dass vor dem Quote noch eine und steht. Das wird jetzt auch 
  // noch entfernt, muss aber spaeter wieder eingefuegt werden.
  if (sizeof(words) && words[<1]=="und")  {
    words=words[0..<2];
    andsign=1;
  }

  // Weitersuchen?
  if (bis=sizeof(words))
    for (num=0; num<bis; num+=2)
       adv+=({GetPlayerAdverb(words[num], 1)});
  cnt=CountUp(adv-({0}));

  // Ausgabe zusammenbauen
  if (andsign)
    adverb=CountUp((sizeof(adv) ? adv : ({}))+(qadv ? ({qadv}) : ({})));
  else if (sizeof(cnt) && sizeof(qadv))
    adverb = cnt + " " + qadv;
  else if (sizeof(qadv))
    adverb = qadv;
  else if (sizeof(cnt))
    adverb = cnt; 
  if (adverb=="") adverb=0;
}

private mixed MixedOut(int casus)  {
  object *envs,*vics;
  string *names,out,aufz;
  int count,msg;

  for_all=0;
  vics=({});
  names=({});
  envs=all_inventory(environment())-({this_player()});
  if (!(count=sizeof(envs)))
    RETURN("Nichts und niemand da. Schau Dich naechstes Mal besser um.\n");
  for ( ; count--; )
    if (living(envs[count]) && !envs[count]->QueryProp(P_INVIS))  {
      vics+=({envs[count]});
      names+=({envs[count]->name(casus)});
    }
  if (!sizeof(vics))
    RETURN("Keiner da. Schau Dich naechstes Mal besser um.\n");
  aufz=CountUp(names);
  for (count=sizeof(vics); count--;)
  {
    out=implode(explode(out_vic, "@@alle@@"),aufz);
        out = regreplace( out, "\\<"+vics[count]->name(casus)+"\\>",
                          capitalize(vics[count]->QueryDu(casus)), 0 );

    msg=vics[count]->ReceiveMsg(convert_string(out),MT_COMM,MA_EMOTE,
                                0,this_object());
    switch(msg)
    {
      case MSG_DELIVERED:
      case MSG_BUFFERED:
        break;
      case MSG_IGNORED:
      case MSG_VERB_IGN:
      case MSG_MUD_IGN:
        write(vics[count]->Name()+" ignoriert Dich oder diesen Befehl.\n");
        break;
      default:
        write(vics[count]->Name()+" konnte Dich gerade nicht lesen.\n");
    }
  }
  write(break_string(convert_string(implode(explode(out_sel,"@@alle@@"),aufz)
    +LF), 78));
  return 1;
}

varargs private int
CheckLife(int no_self,int no_dead, string no_self_text, string no_dead_text)  {
  if (who && living(who) && who!=this_player()) return 0;
  if (no_self && who && who==this_player())  {
    if (no_self_text)
      write(no_self_text+LF);
    else
      write("Mach das mit anderen, nicht mit Dir selber.\n");
    return 1;
  }
  if (who && !living(who) && no_dead)  {
    if (no_dead_text)
      write(no_dead_text+LF);
    else
      write("Das darfst Du nur mit Lebewesen.\n");
    return 2;
  }
  if (!who)  {
    write("Schau Dich erst mal um - das angegebene Objekt ist nicht da.\n");
    return 3;
  }
  return(0); //non-void. Fall-through, alles OK.
}

private string
convert_string(string str)  {
  /* Ich bin unschuldig, ich hatte das viel einfacher und schoener :)
     Rumata wollte das so ;)  -HrT                                     */
  str = implode( explode( str, "@@name@@" ), capname() );
  str = implode( explode( str, "@@gname@@" ), gname() );
  str = implode( explode( str, "@@wer@@" ),
    (who?capitalize(who->name(WER,2)||""):"" ));
  str = implode( explode( str, "@@ wen@@" ),
    (who?" "+who->name(WEN,2):""));
  str = implode( explode( str, "@@ wem@@" ),
    (who?" "+who->name(WEM,2):""));
  str = implode( explode( str, "@@wen@@" ),
    (who?who->name(WEN,2):""));
  str = implode( explode( str, "@@wem@@" ),
    (who?who->name(WEM,2):""));
  str = implode( explode( str, "@@wessen@@" ),
    (who?who->name(WESSEN,2):""));
  str = implode( explode( str, "@@adverb@@" ),
    (adverb?" "+adverb:"") );
  return str;
}

private int
FeelIt()  {
  int msg, flg;

  flg = MSGFLAG_SOUL;
  if (query_verb() && (query_verb()[0..3]=="frag" || query_verb()[0..3]=="antw"))
    flg |= MSGFLAG_SAY;
  if (query_verb() && (query_verb()[0..5]=="rknudd" || query_verb()=="rwink"))
    flg |= MSGFLAG_REMOTE;

  // NPC haben keine TM-Hist (comm.c). Leider erben aber div. Magier die Soul
  // (trotzdem sie in /std/player/ liegt) in ihren NPC... *fluch*
  if (query_once_interactive(ME))
    _recv(who, break_string(convert_string(out_sel),78), flg);
  else
    tell_object(ME, break_string(convert_string(out_sel),78));

  if (out_vic && who)  {
    if (query_once_interactive(who))  {
      msg=who->Message( break_string(convert_string( out_vic ),78), flg);
      if (msg==-1)
        write(who->name()+" ignoriert Dich oder diesen Befehl.\n");
    } else
      tell_object(who,break_string(convert_string( out_vic ),78));
  }
  if (out_oth)
  say( break_string(convert_string( out_oth ),78), ({who,this_player()}) );
  out_sel=out_vic=out_oth=sfoo=adverb=0;
  return 1;
}

/**
  Die Funktion stellt einen Hilfetext zur Verfuegung und listet die 
  definierten Adverbien auf.
  \param mine 0 = alle Adverbien, 
              1=nur selbst definierte Adverbien 
              2=nur die vom System bereitgestellten
 */
private int zeige_adverbs(int mine)  {
  mapping adverb_list;
  string out,s;

  // Parameter auswerten
  switch (mine){
    case 1:
      adverb_list=plr_adverbs;
      out = "Du hast folgende Adverbien definiert:\n";
      break;
    case 2:
      adverb_list=QueryStdAdverbs();
      out = "Systemseitig sind folgende Adverbien definiert:\n";
      break;
    default:
      adverb_list=QueryStdAdverbs()+plr_adverbs;
      out = "Folgende Adverbien stehen Dir zur Verfuegung:\n";
  }

  out +="  Abk.    Adverb\n  ======  ======\n";

  if ( sizeof(adverb_list) == 0) 
    out += " keine.\n";
  else
    // Ueber alle Elemente der indizies der Adverbienliste gehen
   foreach ( s : sort_array(m_indices(adverb_list), #'> ) ) {
      out += break_string(adverb_list[s],78,
                          sprintf("  %-6s  ",s),BS_INDENT_ONCE);
    }

  More(out+"\nWie diese Adverbien benutzt werden ist in <hilfe adverb> "
    "beschrieben.\n");

  return 1;
}

varargs static int
SoulComm(string str, string _verb)  {
  int t_g,t_n,flag;
  string str1,str2,*taenze,vb;
  out_sel=out_vic=out_oth=who=0;
//  if (this_interactive()!=ME) return 0;
  if (interactive(ME)) str=_unparsed_args(); // NPCs haben das nicht :(
  if (str=="") str=0;
  vb=_verb||query_verb();
  if (sizeof(vb)>1 && vb[<1]=='e' && vb!="noe") vb=vb[0..<2];
  sfoo = 0;
  switch (vb)  {
    /**************** Aechzen ***************/
    case "aechz":
    HELPCHECK("aechz");
    ParseRest(str);
    if (str && !adverb)
      Return("Aechze wie?\n");
    out_sel="Du aechzt@@adverb@@.";
    out_oth="@@gname@@ aechzt@@adverb@@.";
    return FeelIt();

    /**************** Anschmiegen ***************/
    case "schmieg":
    HELPCHECK("schmieg");
    ParseRest(str);
    if (!who)
      Return("An wen willst Du Dich anschmiegen?\n");
    if (CheckLife(NOT_SELF,NOT_DEAD,
      "Das geht doch nicht.",
      "Nein, das macht keinen Spass. Lebt ja nicht mal."))
        return 1;
    out_sel="Du schmiegst Dich@@adverb@@ an@@ wen@@ an.";
    out_vic="@@gname@@ schmiegt sich@@adverb@@ an Dich.";
    out_oth="@@gname@@ schmiegt sich@@adverb@@ an@@ wen@@ an.";
    return FeelIt();

    /**************** Antworten ***************/
    case "antwort":
    HELPCHECK("antwort");
    if (!str)
      Return("Antworte [WEM] WAS?\n");
    ParseRest(str);
    if (!who)
      str1=capitalize(str);
    else
      if (sscanf(str,"%s %s",str1,str1)!=2)
        Return("Antworte was?\n");
      else
        str1=capitalize(str1);
    out_sel="Du antwortest@@ wem@@: "+str1;
    /* Sprachflueche beruecksichtigen -Wargon, 8. 9. 95 */
    if (QueryProp(P_PERM_STRING))
      str1 = call_other(QueryProp(P_PERM_STRING),"permutate_string",str1)||"";
    if (who) out_vic="@@gname@@ antwortet Dir: "+str1;
    out_oth="@@gname@@ antwortet@@ wem@@: "+str1;
    return FeelIt();

    /**************** Applaudieren ***************/
    case "applaudier":
    HELPCHECK("applaudier");
    GHOSTCHECK("Deine Haende fahren durcheinander durch - war wohl nix.\n",
      gname()+" will applaudieren, aber "+QPP(FEMALE,WER,PLURAL)
        +" Haende sausen\ndurcheinander durch.\n", 0);
    if (!str)  {
      out_sel="Du applaudierst von ganzem Herzen.";
      out_oth="@@name@@ gibt eine Runde Applaus.";
    }
    else  {
      ParseRest(str);
      if (for_all)  {
        out_sel="Du applaudierst @@alle@@@@adverb@@.";
        out_vic="@@name@@ applaudiert @@alle@@@@adverb@@.";
        return MixedOut(WEM);
      }
      if (!who && !adverb)
        Return("Applaudiere wem oder wie oder so aehnlich.\n");
      if (who && CheckLife(NOT_SELF,NOT_DEAD,
        "Nein, das gehoert sich nicht.",
        "Sachen wird hier nicht applaudiert, OK?"))
          return 1;
      out_sel="Du applaudierst@@ wem@@@@adverb@@.";
      if (who) out_vic="@@name@@ applaudiert Dir@@adverb@@.";
      out_oth="@@name@@ applaudiert@@ wem@@@@adverb@@.";
    }
    return FeelIt();

    /**************** Argln ***************/
    case "argl":
    HELPCHECK("argl");
    ParseRest(str);
    if (str && !adverb)
      Return("Argle wie?\n");
    out_sel="Du arglst"+(adverb ? "@@adverb@@." : " ein wenig vor Dich hin.");
    out_oth="@@gname@@ arglt"
      +(adverb ? "@@adverb@@." : " ein wenig vor sich hin.");
    return FeelIt();

    /**************** Aufatmen ***************/
    case "atm":
    HELPCHECK("atm");
    if (!str || sscanf(str,"%sauf",str1)!=1)
      Return("Atme wie auf?\n");
    ParseRest(str1);
    out_sel="Du atmest"+(adverb ? "@@adverb@@" : " erleichtert")+" auf.";
    out_oth="@@gname@@ atmet"+(adverb ? "@@adverb@@" : " erleichtert")+" auf.";
    return FeelIt();

    /**************** Begruessen ***************/
    case "hallo":
    case "hi":
    case "begruess":
    HELPCHECK("begruess");
    ParseRemote(str);
    if (!who)
      Return("Wen willst Du begruessen?\n");
    if (present(who, environment()))  {
      out_sel="Du heisst @@wen@@@@adverb@@ willkommen.";
      out_vic="@@gname@@ heisst Dich@@adverb@@ willkommen.";
      out_oth="@@gname@@ heisst @@wen@@@@adverb@@ willkommen.";
    }
    else  {
      out_sel="Du heisst @@wen@@@@adverb@@ aus der Ferne willkommen.";
      out_vic="@@gname@@ heisst Dich@@adverb@@ aus der Ferne willkommen.";
    }
    return FeelIt();

    /**************** Betasten ***************/
    case "betast":
    HELPCHECK("betast");
    ParseRest(str);
    if (!who)
      Return("Begrabsche wen?\n");
    out_sel="Du grabbelst@@adverb@@ an "+who->name(WEM)+" herum.";
    out_vic="@@gname@@ grabbelt@@adverb@@ an Dir herum.";
    out_oth="@@gname@@ grabbelt@@adverb@@ an "+who->name(WEM)+" herum.";
    return FeelIt();

    /**************** Bewundern ***************/
    case "bewunder":
    HELPCHECK("bewunder");
    ParseRest(str);
    if (!who)
      Return("Bewundere wen?\n");
    out_sel="Du bewunderst @@wen@@@@adverb@@.";
    out_vic="@@gname@@ bewundert Dich@@adverb@@.";
    out_oth="@@gname@@ bewundert @@wen@@@@adverb@@.";
    return FeelIt();

    /**************** Bibbern ***************/
    case "bibber":
    HELPCHECK("bibber");
    if (ghost())
      Return("Als Geist fuehlst Du keine Kaelte.\n");
    ParseRest(str);
    if (str && !adverb)
      Return("Bibbere wie?\n");
    out_sel="Du bibberst@@adverb@@ vor Kaelte.";
    out_oth="@@name@@ bibbert@@adverb@@ vor Kaelte.";
    return FeelIt();

    /**************** Bohre Nase ***************/
    case "bohr":
    HELPCHECK("bohr");
    ParseRest(str, ({"nase","in der nase","in nase"}));
    if (str && str!="nase" && str!="in nase" && str!="in der nase" && !adverb)
      Return("Bohre wie Nase?\n");
    out_sel="Du bohrst@@adverb@@ in Deiner Nase.";
    out_oth="@@gname@@ bohrt@@adverb@@ in der Nase.     Igitt! :)";
    return FeelIt();

    /**************** Brummeln ***************/
    case "brummel":
    HELPCHECK("brummel");
    ParseRest(str);
    out_sel="Du brummelst"
      +(adverb ? "@@adverb@@." : (str ? " kaum verstaendlich: "+str+"." : "."));
    out_oth="@@gname@@ brummelt"
      +(adverb ? "@@adverb@@." : (str ? " kaum verstaendlich: "+str+"." : "."));
    return FeelIt();

    /**************** cls ***************/
    case "cls":
    HELPCHECK("cls");
    write("[2J[H");
    return 1;

    /**************** Daeumchendrehen ***************/
    case "dreh":
    HELPCHECK("dreh");
    if (!str)
      Return("Drehe was?\n");
    if(strstr(str,"daeumchen")<0 && strstr(str,"daumen")<0)
      Return("Drehe was?\n");
    ParseRest(str,({"daeumchen","daumen"}));
    out_sel="Du drehst@@adverb@@ Daeumchen.";
    out_oth="@@gname@@ dreht@@adverb@@ Daeumchen.";
    return FeelIt();

    /**************** Danken ***************/
    case "dank":
    HELPCHECK("dank");
    ParseRest(str);
    if (!who)
      Return("Bei wem willst Du Dich bedanken?\n");
    if (CheckLife(NOT_SELF, NOT_DEAD,
      "Leidest Du jetzt schon an Persoenlickeitsspaltung? Ne, ne...",
      "Keine Reaktion. Ist wohl befriedigender, sich bei Lebewesen zu "
        +"bedanken."))
        return 1;
    out_sel="Du bedankst Dich@@adverb@@ bei@@ wem@@.";
    out_vic="@@gname@@ bedankt sich@@adverb@@ bei Dir.";
    out_oth="@@gname@@ bedankt sich@@adverb@@ bei@@ wem@@.";
    return FeelIt();

    /**************** Denken ***************/
    case "denk":
    HELPCHECK("denk");
    if (ghost())
      Return("Womit willst Du denn denken? Du hast keine grauen Zellen...\n");
    if (str)
    {
      out_sel="Du denkst   . o O ("+str+")";
      out_oth="@@name@@ denkt   . o O ("+str+")";
      out_vic="@@name@@ denkt   . o O ("+str+")";
    }
    else
    {
      out_sel="Du faengst an zu denken.\nKleine "
        +"Rauchwoelkchen steigen auf...";
      out_oth="@@name@@ faengt an zu denken.\nKleine "
        +"Rauchwoelkchen steigen auf...";
    }
    return FeelIt();

    /**************** Deuten ***************/
    case "deut":
    HELPCHECK("deut");
    ParseRest(str,"auf");
    if (for_all)  {
      out_sel="Du deutest@@adverb@@ auf @@alle@@.";
      out_vic="@@gname@@ deutet@@adverb@@ auf @@alle@@.";
      return MixedOut(WEN);
    }
    if (!who)
      Return("Auf wen oder was willst Du deuten?\n");
    out_sel="Du deutest@@adverb@@ auf"
      +(who==this_object()?" Dich." : "@@ wen@@.");
    if (who != this_object()) out_vic="@@gname@@ deutet@@adverb@@ auf Dich.";
    out_oth="@@gname@@ deutet@@adverb@@ auf"
      +(who==this_object() ? " sich selber.": "@@ wen@@.");
    return FeelIt();

    /**************** Druecken ***************/
    case "drueck":
    HELPCHECK("drueck");
    ParseRest(str);
    if (for_all)  {
      out_sel="Du drueckst @@alle@@"+(adverb ? "@@adverb@@" : " zaertlich")
        +" an Dich.";
      out_vic="@@gname@@ drueckt @@alle@@"+
        (adverb ? "@@adverb@@" : " zaertlich")+" an sich.";
      return MixedOut(WEN);
    }
    if (!who)
      Return("Wen willst Du denn druecken?\n");
    if (CheckLife(NOT_SELF,NOT_DEAD,
      "Das macht doch keinen Spass.",
      "Ich druecke nur jemanden, nicht etwas."))
        return 1;
    GHOSTCHECK("Du willst "+who->name(WEN)+" an Dich druecken - nur hast Du "
        +"schon\nwieder nicht daran gedacht, dass so was als Geist nicht "
        +"geht.\n",
      gname()+" will "+who->name(WEN)+" an sich druecken - hat aber\n"
        +"mal wieder nicht an die Nachteile des Geisterdaseins gedacht.\n",
      gname()+" will Dich an sich druecken - hat aber mal wieder\n"
        +"nicht an die Nachteile des Geisterdaseins gedacht.\n");
    out_sel="Du drueckst @@wen@@"+(adverb ? "@@adverb@@" : " zaertlich")
      +" an Dich.";
    out_vic="@@name@@ drueckt Dich"+(adverb ? "@@adverb@@" : " zaertlich")
      +" an sich.";
    out_oth="@@name@@ drueckt @@wen@@"+(adverb ? "@@adverb@@" : " zaertlich")
      +" an sich.";
    return FeelIt();

    /**************** Entschuldige ***************/
    case "entschuldig":
    HELPCHECK("entschuldig");
    ParseRest(str);
    if (str && !who && !adverb)
      Return("Entschuldige Dich wie oder bei wem?\n");
    out_sel="Du bittest"+(who ? " @@wen@@" : "")
      +"@@adverb@@ um Entschuldigung.";
    if (who) out_vic="@@gname@@ bittet Dich@@adverb@@ um Entschuldigung.";
    out_oth="@@gname@@ bittet"+(who ? " @@wen@@" : "")
      +"@@adverb@@ um Entschuldigung.";
    return FeelIt();

    /**************** Erbleichen ***************/
    case "erbleich":
    HELPCHECK("erbleich");
    GHOSTCHECK("Ich weiss zwar nicht, wie Du das schaffst, aber Du wirst "
        +"noch bleicher.\n",
      break_string("Wie unwahrscheinlich das auch ist, aber "+gname()
        +" schafft es tatsaechlich, noch bleicher zu werden.",78), 0 );
    ParseRest(str);
    if (str && !adverb)
      Return("Wie willst Du erbleichen?\n");
    out_sel="Du erbleichst@@adverb@@.";
    out_oth="@@name@@ erbleicht@@adverb@@.";
    return FeelIt();

    /**************** Erroeten ***************/
    case "erroet":
    HELPCHECK("erroet");
    GHOSTCHECK("Du schaffst es nur bis zu einem blassen Rosa, aber immerhin.\n",
      "Die Wangen des Geistes von "+capname()+" werden leicht rosa.\n", 0);
    ParseRest(str);
    if (!adverb && str)
      Return("Erroete wie?\n");
    out_sel="Deine Wangen gluehen@@adverb@@.";
    out_oth="@@name@@ erroetet@@adverb@@.";
    return FeelIt();

    /**************** Erschrecken ***************/
    case "erschreck":
    case "erschrick":
    if (!ghost())
      Return("Du bist zu harmlos, Geist muesste man sein...\n");
    HELPCHECK("erschreck");
    ParseRest(str);
    if (!who)
      Return("Wen willst Du denn erschrecken?\n");
    out_sel="Mit einem lauten BUH! erschreckst Du @@wen@@"
      +(adverb ? "@@adverb@@." : " fuerchterlich.");
    out_vic="BUH! Du zuckst vor Schreck zusammen. @@gname@@ hat Dich"+
      (adverb ?  "@@adverb@@" : " fuerchterlich")+" erschreckt und lacht "
      "jetzt hohl ueber Dich.";
    out_oth="BUH! @@gname@@ erschreckt @@wen@@"
      +(adverb ? "@@adverb@@." : " fuerchterlich.");
    return FeelIt();

    /**************** Flippen ***************/
    case "flipp":
    HELPCHECK("flipp");
    ParseRest(str);
    if (str && !adverb)
      Return("Ausflippen wollen wir also, so so. Und wie, wenn ich "
        +"fragen darf?\n");
    out_sel="Du flippst"+(adverb ? "@@adverb@@ aus." : " total aus.");
    out_oth="@@gname@@ flippt"+(adverb ? "@@adverb@@ aus." : " total aus.");
    return FeelIt();

    /**************** Fluchen ***************/
    case "fluch":
    HELPCHECK("fluch");
    GHOSTCHECK("Du faengst mangels Resonanzkoerper leise an zu fluchen.\n",
      gname()+" faengt leise an zu fluchen. Laut kann er nicht,\n"
        +"mangels Luft und Resonanzkoerper.\n", 0);
    if (!str)  {
      out_sel="Du fluchst lautstark.";
      out_oth="@@name@@ faengt an, fuerchterlich zu fluchen.";
    }
    else  {
      ParseRest(str);
      if (!adverb)
        Return("Wie willst Du fluchen?\n");
      out_sel="Du fluchst@@adverb@@.";
      out_oth="@@name@@ flucht auf einmal@@adverb@@.";
    }
    return FeelIt();

    /**************** Fragen ***************/
    case "frag":
    HELPCHECK("frag");
    if (!str)
      Return("Frage wen was?\n");
    ParseRest(str);
    if (who && CheckLife(NOT_SELF,NOT_DEAD,
      "Du faengst zu gruebeln an...",
      "Frage jemand, der lebt."))
        return 1;
    if (who)
      sscanf(str,"%s %s", str1,str1);
    else
      str1=str;
    if (!str1)
      Return("Frage "+who->name(WEN)+" WAS?\n");
    str1=capitalize(str1);
    if (str1[<1] != '?')
      str1 += "?";
    out_sel="Du fragst@@ wen@@: "+str1;
    /* Sprachfluch beruecksichtigen -Wargon, 8. 9. 95 */
    if (objectp(QueryProp(P_PERM_STRING)))
      str1 = call_other(QueryProp(P_PERM_STRING), "permutate_string", str1)||"";
    if (who) out_vic=(ghost() ? "Der Geist von " : /* IS_LEARNER(ME) ?
      QueryProp(P_PRESAY)||"" : */ "")+capname()+" fragt Dich: "+str1;
    out_oth=(ghost() ? "Der Geist von " : /* IS_LEARNER(ME) ?
      QueryProp(P_PRESAY)||"" : */ "")+capname()+" fragt@@ wen@@: "+str1;
    return FeelIt();

    /**************** Freuen ***************/
    case "freu":
    HELPCHECK("freu");
    ParseRest(str);
    if (str && !who && !adverb)
      Return("Freue Dich wie?\n");
    out_sel="Du "+(who ? "grinst @@wen@@ an und " : "")
      +"freust Dich@@adverb@@.";
    if (who) out_vic="@@gname@@ grinst Dich an und freut sich@@adverb@@.";
    out_oth="@@gname@@ "+(who ? "grinst @@wen@@ an und " : "")
      +"freut sich@@adverb@@.";
    return FeelIt();

    /**************** Furzen ***************/
    case "furz":
    HELPCHECK("furz");
    GHOSTCHECK("Du laesst einen fahren - aber er riecht nach gar nix.\n",
      gname()+" laesst einen fahren. Man riecht aber nix.\n", 0);
    ParseRest(str);
    if (str && !adverb)
      Return("Furze wie?\n");
    out_sel="Du furzt"+(adverb ? "@@adverb@@." : " hemmungslos.");
    out_oth="@@name@@ laesst@@adverb@@ einen Stinkefurz fahren.";
    ofoo=clone_object("/items/furz");
    ofoo->set_furzer(this_player());
    ofoo->move(environment(this_player()));
    return FeelIt();
// DEBUG Furz testen!

    /**************** Gaehnen ***************/
    case "gaehn":
    HELPCHECK("gaehn");
    if (ghost())
      Return("Als Geist wirst Du nicht muede - also nicht gaehnen.\n");
    ParseRest(str);
    if (str && !adverb)
      Return("Wie willst Du gaehnen?\n");
    if (!adverb)
      out_sel="Kannst Du aber Dein(en) Mund/Maul/Schnabel weit aufreissen!";
    else
      out_sel="Du gaehnst@@adverb@@.";
    out_oth="@@gname@@ gaehnt@@adverb@@.";
    return FeelIt();

    /**************** Glucksen ***************/
    case "glucks":
    HELPCHECK("glucks");
    ParseRest(str);
    if (str && !adverb)
      Return("Gluckse wie?\n");
    out_sel="Du gluckst"+(adverb ? "@@adverb@@." : " wie ein Huhn.");
    out_oth="@@gname@@ gluckst"+(adverb ? "@@adverb@@." : " wie ein Huhn.");
    return FeelIt();

    /**************** Gratulieren ***************/
    case "gratulier":
    case "beglueckwuensch":
    HELPCHECK("gratulier");
    ParseRest(str);
    if (!who)
      Return("Wem willst Du gratulieren?\n");
    if (CheckLife(NOT_SELF, NOT_DEAD,
      "Na, meinst Du nicht, dass Eigenlob stinkt?",
      "Soll ich dem Ding vielleicht zum Totsein gratulieren? Nee nee."))
        return 1;
    out_sel="Du gratulierst @@wem@@@@adverb@@.";
    out_vic="@@gname@@ gratuliert Dir@@adverb@@.";
    out_oth="@@gname@@ gratuliert @@wem@@@@adverb@@.";
    return FeelIt();

    /**************** Grinsen ***************/
    case "grins":
    HELPCHECK("grins");
    GHOSTCHECK("Als Du grinst, siehst Du regelrecht, wie die anderen eine "
        +"Gaensehaut bekommen.\n",
      "Du bekommst eine Gaensehaut, als der Geist von "+capname()
        +" zu grinsen anfaengt.\n", 0);
    ParseRest(str);
    if (for_all)  {
      out_sel="Du grinst @@alle@@@@adverb@@ an.";
      out_vic="@@name@@ grinst @@alle@@@@adverb@@ an.";
      return MixedOut(WEN);
    }
    if (!who && !adverb && str)
      Return("Grinsen - schoen und gut. Aber wen oder wie (an)grinsen?\n");
    if (who && CheckLife(NOT_SELF,NOT_DEAD,
      "Du grinst Dir was, aber so, dass es kein anderer sieht.",
      "Nicht mal einen Spiegel darf man hier angrinsen, nur Lebewesen!"))
        return 1;
    out_sel="Du grinst@@ wen@@@@adverb@@"+(who ? " an" : "")+".";
    if (who) out_vic="@@name@@ grinst Dich@@adverb@@ an.";
    out_oth="@@name@@ grinst@@ wen@@@@adverb@@"+(who ? " an" : "")+".";
    return FeelIt();

    /**************** Gruebeln ***************/
    case "gruebel":
    case "gruebl":
    HELPCHECK("gruebel");
    ParseRest(str);
    if (str && !adverb)
      Return("Grueble wie?\n");
    out_sel="Du gruebelst@@adverb@@ eine Weile vor Dich hin.";
    out_oth="@@gname@@ gruebelt@@adverb@@ eine Weile vor sich hin.";
    return FeelIt();

    /**************** Grummeln ***************/
    case "grummel":
    case "grumml":
    HELPCHECK("grummel");
    ParseRest(str);
    if (str && !adverb)
      Return("Grummle wie?\n");
    out_sel="Du grummelst@@adverb@@.";
    out_oth="@@gname@@ grummelt@@adverb@@.";
    return FeelIt();

    /**************** Grunzen ***************/
    case "grunz":
    HELPCHECK("grunz");
    ParseRest(str);
    if (str && !adverb)
      Return("Grunze wie?\n");
    out_sel="Du grunzt@@adverb@@.";
    out_oth="@@gname@@ grunzt@@adverb@@.";
    return FeelIt();

    /**************** Gucken ***************/
    case "guck":
    HELPCHECK("guck");
    ParseRest(str);
    if (!adverb)
      Return("Gucke wie aus der Waesche?\n");
    out_sel="Du guckst@@adverb@@ aus der Waesche.";
    out_oth="@@gname@@ guckt@@adverb@@ aus der Waesche.";
    return FeelIt();

    /**************** Jammern ***************/
    case "jammer":
    HELPCHECK("jammer");
    ParseRest(str);
    if (str && !adverb)
      Return("Wie willst Du jammern?\n");
    out_sel="Du jammerst@@adverb@@.";
    out_oth="@@gname@@ jammert@@adverb@@.";
    return FeelIt();

    /**************** Haetscheln ***************/
    case "haetschel":
    case "haetschl":
    HELPCHECK("haetschel");
    GHOSTCHECK("Du ueberlegst es Dir anders - mit Deinen durchlaessigen "
        +"Haenden...",
      gname()+" will anscheinend jemand haetscheln, ueberlegt\n"
        +"es sich nach einem kurzen Blick auf seine Haende anders.\n", 0);
    ParseRest(str);
    if (for_all)  {
      out_sel="Du haetschelst @@alle@@@@adverb@@.";
      out_vic="@@name@@ haetschelt @@alle@@@@adverb@@.";
      return MixedOut(WEN);
    }
    if (!str || !who)
      Return("Wen willst Du haetscheln?\n");
    if (who && CheckLife(NOT_SELF, NOT_DEAD,
      "Das sieht viel zu albern aus - Du laesst es bleiben.",
      "Ist da ueberhaupt was zu haetscheln? Nein, da lebt doch nix."))
        return 1;
    out_sel="Du haetschelst@@ wen@@@@adverb@@.";
    out_vic="@@name@@ haetschelt Dich@@adverb@@.";
    out_oth="@@name@@ haetschelt@@ wen@@@@adverb@@.";
    return FeelIt();

    /**************** Hicksen ***************/
    case "hicks":
    HELPCHECK("hicks");
    GHOSTCHECK("Hoppla! Dieser Hickser zieht Dich ganz schoen zusammen!\n",
      gname()+" hat anscheinend Schluckauf.\n"
        +"Und was fuer einen! Fuer einen Moment zieht es "+QueryPronoun(WEN)
        +" ziemlich zusammen.\n", 0);
    if (!str)  {
      out_sel="Hicks!";
      out_oth="@@name@@ muss hicksen. Wahrscheinlich zu viel Alkohol...";
    }
    else  {
      ParseRest(str);
      if (!adverb)
        Return("Hickse wie?\n");
      out_sel="Du hickst@@adverb@@.";
      out_oth="@@name@@ hickst@@adverb@@.";
    }
    return FeelIt();

    /**************** Huepfen ***************/
    case "huepf":
    HELPCHECK("huepf");
    GHOSTCHECK("Du schwebst durch die Gegend.\n",
      gname()+" schwebt durch die Gegend.\n", 0);
    if (!str)  {
      out_sel="B O I N G !! Du huepfst in der Gegend herum.";
      out_oth="@@name@@ huepft in der Gegend herum.";
    }
    else  {
      ParseRest(str);
      if (!who && !adverb)
        Return("Huepfe wie oder um wen oder wie oder was oder haeh?\n");
      out_sel="Du huepfst@@adverb@@"+(who ? " um@@ wen@@" : "")+" herum.";
      if (who) out_vic="@@name@@ huepft@@adverb@@ um Dich herum.";
      out_oth="@@name@@ huepft@@adverb@@"+(who ? " um@@ wen@@" : "")+" herum.";
    }
    return FeelIt();

    /**************** Husten ***************/
    case "hust":
    HELPCHECK("hust");
    GHOSTCHECK("Du verstreust ein paar Geisterbazillen im Raum.\n",
      gname()+" macht ufff, ufff und verteilt ein paar Geister-\n"
        +"bazillen im Raum.\n", 0);
    if (!str)  {
      out_sel="Hust! Keuch! Halt dir doch wenigstens die Hand vor den Mund!";
      out_oth="@@name@@ hustet sich fast die Seele aus dem Leib.";
    }
    else  {
      ParseRest(str);
      if (!who && !adverb)
        Return("Wenn Du schon was hinter huste tippst, dann bitte was "
          +"vernuenftiges!\n");
      if (who && CheckLife(NOT_SELF,NOT_DEAD,
        "Dir selber koennen nur andere was husten.",
        "Bitte huste nur Lebewesen was."))
          return 1;
      out_sel="Du hustest@@ wem@@@@adverb@@"+(who? " was" : "")+".";
      if (who) out_vic="@@name@@ hustet Dir@@adverb@@ was.";
      out_oth="@@name@@ hustet@@ wem@@@@adverb@@"+(who? " was" : "")+".";
    }
    return FeelIt();

    /**************** Jubeln ***************/
    case "jubel":
    case "jubl":
    HELPCHECK("jubel");
    ParseRest(str);
    if (str && !who && !adverb)
      Return("Juble wie? Oder wem zu?\n");
    out_sel="Du jubelst@@ wem@@@@adverb@@"+(who ? " zu." : ".");
    if (who) out_vic="@@gname@@ jubelt Dir@@adverb@@ zu.";
    out_oth="@@gname@@ jubelt@@ wem@@@@adverb@@"+(who ? " zu." : ".");
    return FeelIt();

    /**************** Keuchen ***************/
    case "keuch":
    HELPCHECK("keuch");
    if (ghost())
      Return("Als Geist strengt Dich nix an - also wird auch nicht "
        +"gekeucht.\n");
    ParseRest(str);
    if (str && !adverb)
      Return("Keuche wie?\n");
    out_sel="Du keuchst"+(adverb ? "@@adverb@@." : " vor Anstrengung.");
    out_oth="@@name@@ keucht"+(adverb ? "@@adverb@@." : " vor Anstrengung.");
    return FeelIt();

    /**************** Kichern ***************/
    case "kicher":
    HELPCHECK("kicher");
    if (!str)  {
      out_sel="Du kicherst. (Wie albern von Dir)";
      out_oth="@@gname@@ gibt ein albernes Kichern von sich.";
    }
    else  {
      ParseRest(str);
      if (!who && !adverb)
        Return("Das haut so nicht hin, gib vernuenftige Parameter.\n");
      if (who && CheckLife(NOT_SELF,NOT_DEAD,
        "In diesem Fall nimm bitte nur kicher.",
        "Musst schon etwas Lebendes angeben, nichts Totes."))
          return 1;
      out_sel="Du kicherst@@adverb@@"+(who ? " hinter "+who->name(WESSEN)+
        " Ruecken." : ".");
      if (who)  out_vic="Jemand kichert@@adverb@@ hinter deinem Ruecken.";
      out_oth="@@gname@@ kichert@@adverb@@"+(who ? " hinter "+who->name(WESSEN)
        +" Ruecken." : ".");
    }
    return FeelIt();

    /**************** Kitzeln ***************/
    case "kitzel":
    case "kitzl":
    HELPCHECK("kitzel");
    GHOSTCHECK("Mit Deinen immateriellen Fingern schaffst Du das nicht.\n",
      gname()+" muss gerade feststellen, dass man mit\n"
        +"immateriellen Fingern nicht kitzeln kann.\n", 0);
    ParseRest(str);
    if (!who)
      Return("Wen willst Du kitzeln?\n");
    if (who && CheckLife(NOT_SELF,NOT_DEAD,
      "Du bist doch kein Masochist! Du laesst es bleiben.",
      "Dinge sind so selten kitzlig. Lass es bleiben."))
        return 1;
    if (member(({"highlander","hobo"}), who->query_real_name())>-1)
      switch (who->query_real_name())  {
        case "highlander": str1="unter"; str2="Federn"; break;
        case "hobo"      : str1="an";    str2="Kinn"; break;
      }
    else if (who->QueryProp(P_RACE))
      switch (lower_case(who->QueryProp(P_RACE)))  {
        case "drache" : str1="unter";str2="Schuppen";
          t_g=FEMALE; t_n=PLURAL; break;
        case "greif"  : str1="unter";str2="Federn";
          t_g=FEMALE; t_n=PLURAL; break;
        default       : str1="an"; str2="Kinn"; t_g=NEUTER; t_n=SINGULAR;
      }
    else  {
      str1="an"; str2="Kinn"; t_g=NEUTER; t_n=SINGULAR;
    }
    if (getuid(who)=="trest" || getuid(who)=="woelkchen")  {
      str1="an"; str2="Fuessen"; t_g=MALE; t_n=PLURAL;
    }
    out_sel="Du kitzelst@@ wen@@@@adverb@@ "+str1+" "+who->QPP(t_g,WEM,t_n)
      +" "+str2+".\n@@wer@@ versucht, sich zu beherrschen, muss aber "
      +"doch lachen.";
    out_vic="@@name@@ kitzelt Dich@@adverb@@ "+str1+" Deine"
      +(t_n ? "n" : (t_g==FEMALE ? "r" : "m"))+" "+str2
      +".\nDu versuchst, Dich zu beherrschen, musst aber doch lachen.";
    out_oth="@@name@@ kitzelt@@ wen@@@@adverb@@ "+str1+" "
      +who->QPP(t_g,WEM,t_n)+" "+str2
      +".\n@@wer@@ versucht, sich zu beherrschen, muss aber doch lachen.";
    return FeelIt();

    /**************** Klatschen ***************/
    case "klatsch":
    HELPCHECK("klatsch");
    GHOSTCHECK("Deine Haende sausen durcheinander durch.\n",
      gname()+" will in die Haende klatschen - aber sie\n"
        +"sausen durcheinander durch.\n", 0);
    ParseRest(str);
    if (!adverb && str)
      Return("Klatsche wie?\n");
    out_sel="Du klatschst@@adverb@@ in die Haende.";
    out_oth="@@name@@ klatscht@@adverb@@ in die Haende.";
    return FeelIt();

    /**************** Klopfen ***************/
    case "klopf":
    HELPCHECK("klopf");
    if (!str||sscanf(str,"%s auf schulter",sfoo)!=1)
      if (!str||sscanf(str,"%s auf die schulter",sfoo)!=1)
        Return("Klopfe wie wem wieso was?\n");
    if (ghost())
      Return("Das geht leider nicht mit durchlaessigen Haenden.\n");
    str=sfoo;
    if (str=="") str=0;
    ParseRest(str);
    if (!who)
      Return("Klopfe wem auf die Schulter?\n");
    out_sel="Du klopfst @@wem@@@@adverb@@ auf die Schulter.";
    out_vic="@@name@@ klopft Dir@@adverb@@ auf die Schulter.";
    out_oth="@@name@@ klopft @@wem@@@@adverb@@ auf die Schulter.";
    return FeelIt();

    /**************** Knabbern ***************/
    case "knabber":
    HELPCHECK("knabber");
    if (ghost())
      Return("Sorry, aber dafuer fehlt Dir im Moment der noetige "
        +"\"Biss\"...\n");
    ParseRest(str);
    if (!who)
      Return("Knabbere wen an?\n");
    if (CheckLife(NOT_SELF,NOT_DEAD,
      "Du kommst nicht an dein eigenes Ohr ran...",
      "Noe, noe, das schmeckt bestimmt nicht gut."))
        return 1;
    out_sel="Du knabberst@@adverb@@ an "+who->name(WESSEN)+" Ohr.";
    out_vic="@@name@@ knabbert@@adverb@@ an Deinem Ohr.";
    out_oth="@@name@@ knabbert@@adverb@@ an "+who->name(WESSEN)+" Ohr.";
    return FeelIt();

    /**************** Knicksen ***************/
    case "knicks":
    HELPCHECK("knicks");
    GHOSTCHECK("Du knickst in der Mitte ab, kriegst Dich aber schnell wieder "
        +"zusammen.\n",
      gname()+" knick(s)t in der Mitte ab, kriegt sich aber\n"
        +"zum Glueck schnell wieder zusammen.\n", 0);
    if (!str) {
      out_sel="Du machst einen anmutigen Knicks.";
      out_oth="@@name@@ macht einen anmutigen Knicks.";
    }
    else  {
      ParseRest(str,"vor");
      if (for_all)  {
        out_sel="Du knickst@@adverb@@ vor @@alle@@.";
        out_vic="@@name@@ knickst@@adverb@@ vor @@alle@@.";
        return MixedOut(WEM);
      }
      if (!who && !adverb)
        Return("Knickse irgendwie oder vor jemandem.\n");
      if (who && CheckLife(NOT_SELF,NOT_DEAD,
        "Wie willst Du das denn schaffen?",
        "Vor Sachen wird hier nicht geknickst!"))
          return 1;
      out_sel="Du knickst@@adverb@@"+(who ? " vor" : "")+"@@ wem@@.";
      if (who ) out_vic="@@name@@ knickst@@adverb@@ vor Dir.";
      out_oth="@@name@@ knickst@@adverb@@"+(who ? " vor" : "")+"@@ wem@@.";
    }
    return FeelIt();

    /**************** Knirschen ***************/
    case "knirsch":
    HELPCHECK("knirsch");
    if (ghost())
      Return("Du kannst mit nichts knirschen, so als Geist. Versuche doch "
        +"dafuer\nmal, zu rasseln...\n");
    ParseRest(str);
    if (str && !adverb)
      Return("Knirsche wie?\n");
    switch (QueryProp(P_RACE))  {
      case "greif"  : str1="dem Schnabel."; break;
      case "sandtiger" : str1="den Fangzaehnen."; break;
      case "drache" : str1="den Fangzaehnen."; break;
      default       : str1="den Zaehnen.";
    }
    out_sel="Du knirschst@@adverb@@ mit "+str1;
    out_oth="@@name@@ knirscht@@adverb@@ mit "+str1;
    return FeelIt();

    /**************** Knuddeln ***************/
    case "knuddel":
    case "knuddl":
    HELPCHECK("knuddel");
    if (ghost())
      Return("Sorry, nicht als Geist.\n");
    ParseRest(str);
    if (for_all)  {
      out_sel="Du knuddelst @@alle@@@@adverb@@.";
      out_vic="@@name@@ knuddelt @@alle@@@@adverb@@.";
      return MixedOut(WEN);
    }
    if (!who)
      Return("Knuddle wen?\n");
    if (CheckLife(NOT_SELF,NOT_DEAD,
      "Das bringt doch nix, lass es halt.",
      "Du kannst soviel ich weiss ausser Lebewesen nur Teddys knuddeln."))
        return 1;
    out_sel="Du knuddelst@@ wen@@@@adverb@@.";
    out_vic="@@name@@ knuddelt Dich@@adverb@@.";
    out_oth="@@name@@ knuddelt@@ wen@@@@adverb@@.";
    return FeelIt();

    /**************** Knurren ***************/
    case "knurr":
    HELPCHECK("knurr");
    ParseRest(str);
    if (for_all)  {
      out_sel="Du knurrst @@alle@@@@adverb@@ an.";
      out_vic="@@gname@@ knurrt @@alle@@@@adverb@@ an.";
      return MixedOut(WEN);
    }
    if (str && !who && !adverb)
      Return("Wen anknurren oder wie knurren?\n");
    if (who && CheckLife(NOT_SELF,NOT_DEAD,
      "Du knurrst in Dich hinein.",
      "Reagiert nicht. Solltest wohl besser Lebwesen anknurren."))
        return 1;
    out_sel="Du knurrst@@ wen@@@@adverb@@"+(who ? " an." : ".");
    if (who) out_vic="@@gname@@ knurrt Dich@@adverb@@ an.";
    out_oth="@@gname@@ knurrt@@ wen@@@@adverb@@"+(who ? " an." : ".");
    return FeelIt();

    /****************  Knutschen ***************/
    case "knutsch":
    HELPCHECK("knutsch");
    if (ghost())
      Return("Das kannst Du als Geist leider nicht. Irgendwie fehlt Dir "
        +"dazu das Herz.\n");
    ParseRest(str);
    if (!who)
      Return("Knutsche wen ab?\n");
    if (CheckLife(NOT_SELF,NOT_DEAD,
      "Das geht nicht.",
      "Igitt! Lieber nicht!"))
        return 1;
    out_sel="Du gibst @@wem@@@@adverb@@ einen RICHTIGEN Kuss.";
    out_vic="@@name@@ gibt Dir@@adverb@@ einen tiefen und hingebungsvollen "
      +"Kuss.\nDu schwebst im 7. Himmel.";
    out_oth="@@name@@ gibt @@wem@@@@adverb@@ einen tiefen und "
      +"hingebungsvollen Kuss.";
    return FeelIt();

    /**************** Kotzen ***************/
    case "kotz":
    HELPCHECK("kotz");
    if (ghost())
      Return("Ne, das ist eins von den Sachen, die als Geist nicht gehen.\n");
    ParseRest(str);
    if (str && !who && !adverb)
      Return("Kotze wie? Kotze auf wen?\n");
    if (who && CheckLife(NOT_SELF,0,
      "Igitt, nein danke."))
        return 1;
    if(!str) {
      out_sel="Du kotzt ueber deine Schuhe.";
      out_oth="@@name@@ verdreht die Augen und kotzt.";
    }
    else  {
      out_sel="Du kotzt@@adverb@@"+(who ? " auf @@wen@@." : ".");
      if (who) out_vic="@@name@@ kotzt@@adverb@@ auf Dich.";
      out_oth="@@name@@ kotzt@@adverb@@"+(who ? " auf @@wen@@." : ".");
    }
    return FeelIt();

    /**************** Kratzen ***************/
    case "kratz":
    HELPCHECK("kratz");
    ParseRest(str);
    if (who && (who!=this_player()))
      Return("Das mach mal schoen nur mit Dir selber.\n");
    if (str && !adverb)
      Return("Wie willst Du Dich kratzen?\n");
    out_sel="Du kratzt dich@@adverb@@ am Kopp.";
    out_oth="@@gname@@ kratzt sich@@adverb@@ am Kopp.";
    return FeelIt();

    /**************** Krieche ***************/
    case "kriech":
    HELPCHECK("kriech");
    ParseRest(str);
    out_sel="Du kriechst"+(who ? " vor @@wem@@" : "")+"@@adverb@@ im Staub.";
    if (who) out_vic="@@gname@@ kriecht@@adverb@@ vor Dir im Staub.";
    out_oth="@@gname@@ kriecht"+(who ? " vor @@wem@@" : "")
      +"@@adverb@@ im Staub.";
    return FeelIt();

    /**************** Kuessen ***************/
    case "kuess":
    HELPCHECK("kuess");
    if (ghost())
      Return("Als Geist kannst Du leider niemanden kuessen.\n");
    ParseRest(str);
    if (!who)
      Return("Wen willst Du kuessen?\n");
    if (CheckLife(NOT_SELF,NOT_DEAD,
      "Da hast Du aber Schwierigkeiten... Du gibst es schliesslich auf.",
      "Nix. Absolut nix. Kuesse lieber Lebewesen - die reagieren\n"
        +"wenigstens (und sei es, dass sie Dich fressen...)."))
        return 1;
    out_sel="Du kuesst@@ wen@@@@adverb@@.";
    out_vic="@@name@@ kuesst Dich@@adverb@@.";
    out_oth="@@name@@ kuesst@@ wen@@@@adverb@@.";
    FeelIt();
    if (who->QueryProp(P_FROG)&&QueryProp(P_LEVEL)>who->QueryProp(P_LEVEL)) {
      tell_room(environment(this_player()),"PLOPP!\n");
      write("Huch! Du wirst auf einmal so gruen und klein und kriegst auf\n"
        +"einmal furchtbar Hunger auf Fliegen und so...\n");
      who->Message("Auf einmal wird die Welt um Dich wieder so klein, wie sie\n"
        +" frueher mal war - und vor Dir sitzt ein kleiner gruener Frosch.\n");
      say(who->name(WER)+" steht auf einmal da und schaut dumm aus der "
        +"Waesche. Dafuer fehlt\njetzt seltsamerweise "+capname()
        +". Die Gesamtzahl an kleinen gruenen\nFroeschen im Raum hat sich "
        +"jedoch nicht geaendert...\n",({who,this_player()}));
      who->SetProp(P_FROG,0);
      SetProp(P_FROG,1);
    }
    return 1;

    /**************** Kuscheln ***************/
    case "kuschel":
    case "kuschl":
    HELPCHECK("kuschel");
    GHOSTCHECK("Dazu bist Du als Geist viel zu kalt und gar "
        +"schroecklich anzusehen.\n",
      gname()+" scheint Anwandlungen zu haben, sich an jemand "
        +"ankuscheln zu wollen.\nEntsetzt springen alle zurueck, weil "
        +"dazu ist er doch zu kalt und schroecklich\nanzusehen.\n", 0);
    ParseRest(str);
    if (!who)
      Return("An wen willst Du Dich ankuscheln?\n");
    out_sel="Du kuschelst Dich@@adverb@@ an @@wen@@ an.";
    out_vic="@@name@@ kuschelt sich@@adverb@@ an Dich an.";
    out_oth="@@name@@ kuschelt sich@@adverb@@ an @@wen@@ an.";
    return FeelIt();

    /**************** Lachen ***************/
    case "lach":
    HELPCHECK("lach");
    GHOSTCHECK("Du lachst mit hohler Stimme. Den Umstehenden (sind doch welche"
        +" da, oder?)\nlaeuft es kalt den Ruecken runter.\n",
      gname()+" lacht mit hohler Stimme.\nDir laeuft es eiskalt den Ruecken"
        +" runter.\n", 0);
    if (!str)  {
      out_sel="Du brichst vor Lachen zusammen.";
      out_oth="@@name@@ bricht vor Lachen zusammen.";
    }
    else  {
      ParseRest(str);
      if (for_all)  {
        out_sel="Du lachst@@adverb@@ ueber @@alle@@.";
        out_vic="@@name@@ lacht@@adverb@@ ueber @@alle@@.";
        return MixedOut(WEN);
      }
      if (!who && !adverb)
        Return("Lache wie, lache ueber wen?\n");
      if (who && CheckLife(NOT_SELF,NOT_DEAD,
        "Lach Dich doch nicht selber aus - das machen schon andere...",
        "Gelacht wird nur ueber Lebewesen (die koennen sich drueber aergern)."))
          return 1;
      out_sel="Du lachst@@adverb@@"+(who?" ueber@@ wen@@":"")+".";
      if (who) out_vic="@@name@@ lacht@@adverb@@ ueber Dich.";
      out_oth="@@name@@ lacht@@adverb@@"+(who?" ueber@@ wen@@":"")+".";
    }
    return FeelIt();

    /**************** Laecheln ***************/
    case "laechel":
    case "laechl":
    HELPCHECK("laechel");
    if (ghost()) {
      write("Du laechelst innerlich.\n");
      return 1;
    }
    if(!str) {
      out_sel="Du laechelst.";
      out_oth="@@name@@ laechelt.";
    }
    else  {
      ParseRest(str);
      if (for_all)  {
        out_sel="Du laechelst @@alle@@@@adverb@@ an.";
        out_vic="@@name@@ laechelt @@alle@@@@adverb@@ an.";
        return MixedOut(WEN);
      }
      if (!who && !adverb && str)
        Return("Wie oder wen?\n");
      if (who && CheckLife(NOT_SELF,NOT_DEAD,
        "Musst schon jemand anders anlaecheln.",
        "Bitte ein Lebewesen anlaecheln."))
          return 1;
      out_sel="Du laechelst@@ wen@@@@adverb@@"+(who ? " an." : ".");
      if (who) out_vic="@@name@@ laechelt Dich@@adverb@@ an.";
      out_oth="@@name@@ laechelt@@ wen@@@@adverb@@"+(who ? " an." : ".");
    }
    return FeelIt();

    /**************** Liebe ***************/
    /* These lines appear Courtesy of Angus@MorgenGrauen. So long, and thanks */
    /* for all the fish, errr, text, Angus :) */
    case "lieb":
    HELPCHECK("lieb");
    if (ghost())
      Return("Auf diese Freuden musst Du als Geist leider verzichten.\n");
    ParseRest(str);
    if (!who)
      Return("Wen hast Du lieb?\n");
    if (CheckLife(NOT_SELF,NOT_DEAD,
      "Ja, ich weiss, Du magst Dich, aber das musst Du nicht zur Schau "
        +"stellen.",
      "Du entwickelst seltsame Neigungen, finde ich."))
        return 1;
    str1=(who->QueryProp(P_GENDER)==FEMALE ? "ihr" : "ihm");
    /* old version:
      out_sel="Du fluesterst @@wem@@@@adverb@@ liebevolle Worte ins Ohr.";
      out_vic=gname()+" fluestert Dir@@adverb@@ liebevolle Worte ins Ohr.";
      out_oth=gname()+" fluestert@@adverb@@ sanfte Worte zu @@wem@@.";
    */
    out_sel="Du schliesst die Augen, schmiegst Dich eng an @@wen@@ und gibst"
      +LF+str1+" einen zaertlichen und leidenschaftlichen Kuss.\n"
      +"Um Dich herum versinkt die Welt und Du glaubst, auf Wolken zu "
      +"schweben.";
    out_vic="@@name@@ drueckt Dich zaertlich an sich und gibt Dir\n"
      +"einen zaertlichen und leidenschaftlichen Kuss. Du schliesst die\n"
      +"Augen und traeumst ein wenig......Du schwebst auf Wolken direkt\n"
      +"in den siebten Himmel.";
    out_oth="Du schaust dezent weg, als sich @@name@@ und "+who->name()
      +" verliebt in die Arme\nsinken.";
    return FeelIt();

    /**************** Loben ***************/
    case "lob":
    HELPCHECK("lob");
    if (!str)
      Return("Wen oder was willst Du loben?\n");
    ParseRest(str);
    if (who==ME)  {
      ofoo=clone_object("/items/furz");
      ofoo->set_furzer(this_player());
      ofoo->set_eigenlob();
      ofoo->move(environment(this_player()));
      //DEBUG Furz zum Eigenlob patchen :>
      out_sel="Du lobst Dich selber@@adverb@@. Die Folgen kennst Du ja...";
      out_oth="@@gname@@ lobt sich selber@@adverb@@, mit den bekannten Folgen.";
    } else if (who) {
      out_sel="Du lobst @@wen@@@@adverb@@.";
      out_vic="@@gname@@ lobt Dich@@adverb@@.";
      out_oth="@@gname@@ lobt @@wen@@@@adverb@@.";
    } else  {
      out_sel="Du lobst "+str+".";
      out_oth="@@gname@@ lobt "+str+".";
    }
    return FeelIt();

    /**************** Moppern ***************/
    case "mopper":
    HELPCHECK("mopper");
    ParseRest(str);
    if (str && !adverb)
      Return("Moppere wie?\n");
    out_sel="Du mopperst@@adverb@@.";
    out_oth="@@gname@@ moppert@@adverb@@.";
    return FeelIt();

    /**************** Mustern ***************/
    case "muster":
    HELPCHECK("muster");
    ParseRest(str);
    if (!who)
      Return("Mustere wen?\n");
    out_sel="Du musterst @@wen@@@@adverb@@.";
    out_vic="@@gname@@ mustert Dich@@adverb@@.";
    out_oth="@@gname@@ mustert @@wen@@@@adverb@@.";
    return FeelIt();

    /**************** Nicken ***************/
    case "ja":
    case "nick":
    HELPCHECK("nick");
    ParseRest(str);
    if (for_all)  {
      out_sel="Du nickst @@alle@@@@adverb@@ zu.";
      out_vic="@@gname@@ nickt @@alle@@@@adverb@@ zu.";
      return MixedOut(WEM);
    }
    if (str && !who && !adverb)
      Return("Nicke wie oder wem zu oder wem wie zu?\n");
    if (who && CheckLife(NOT_SELF,NOT_DEAD,
      "Du willst Dir selber zunicken? Lieber nicht, das sieht so albern aus.",
      "Hm. Nix passiert. Von Lebewesen bekommt man meistens mehr Feedback."))
        return 1;
    out_sel="Du nickst@@ wem@@@@adverb@@"
      +(who ? " zu." : (adverb ? "." : " zustimmend."));
    if (who) out_vic="@@gname@@ nickt Dir@@adverb@@ zu.";
    out_oth="@@gname@@ nickt@@ wem@@@@adverb@@"
      +(who ? " zu." : (adverb ? "." : " zustimmend."));
    return FeelIt();

    /**************** Niesen ***************/
    case "nies":
    HELPCHECK("nies");
    if (ghost())
      Return("Du hast keine Nase mehr, in der es Dich jucken koennte...\n");
    ParseRest(str);
    if (str && !adverb)
      Return("Niese wie?\n");
    out_sel="Haaaaaa-tschi! Gesundheit!"+(adverb ? " Du niest@@adverb@@." : "");
    out_oth="Haaaaaa-tschi! @@name@@ niest@@adverb@@.";
    return FeelIt();

    /**************** Ohrfeigen ***************/
    case "gib":
    HELPCHECK("gib");
    if (!str)
      Return("Gib wem was?\n");
    if (sscanf( str,"%s ohrfeige",str1)==0)
      return 0;
    ParseRest(str, ({"ohrfeige", "eine ohrfeige"}));
    if (for_all)  {
      out_sel="Du verpasst @@alle@@@@adverb@@ eine Ohrfeige.";
      out_vic="@@name@@ verpasst @@alle@@@@adverb@@ eine Ohrfeige.";
      return MixedOut(WEM);
    }
    if (!who)
      Return("Gib wem eine Ohrfeige?\n");
    if (CheckLife(NOT_SELF,NOT_DEAD,
      "Dazu sind Dir Deine Backen doch zu schade.",
      "Du wirst doch nichts schlagen, was sich nicht wehren kann?"))
        return 1;
    GHOSTCHECK("Deine Hand saust mit voller Wucht durch dein Opfer durch!",
      gname()+" will "+who->name(WEM)+" eine Ohrfeige geben - aber die Hand\n"
        +"saust mit voller Wucht durch das Opfer durch!", 0);
    out_sel="Du verpasst @@wem@@@@adverb@@ eine schallende Ohrfeige.";
    out_vic="@@name@@ verpasst Dir@@adverb@@ eine Watsche, dass Dir Hoeren "
      +"und Sehen vergeht.";
    out_oth="@@name@@ verpasst @@wem@@@@adverb@@ eine schallende Ohrfeige.";
    return FeelIt();

    /**************** Pfeifen ***************/
    case "pfeif":
    HELPCHECK("pfeif");
    GHOSTCHECK("Es kommt leider nur (nicht mal heisse) Luft, aber kein "
        +"Pfiff.\n",
      gname()+" spitzt den Mund und pustet angestrengt. Nichts passiert.\n", 0);
    ParseRest(str, "nach");
    if (str && !who && !adverb)
      Return("Pfeife wie? Pfeife wem nach? Haeh?\n");
    if (who && CheckLife(NOT_SELF,NOT_DEAD,
      "Was willst Du denn damit ausdruecken? Das gibt fuer mich keinen Sinn.",
      "Ich habe keine Lust dazu."))
        return 1;
    out_sel="Du pfeifst@@ wen@@@@adverb@@"
      +(who ? " nach." : (adverb ? "." : " anerkennend."));
    if (who) out_vic="@@name@@ pfeift Dir@@adverb@@ nach.";
    out_oth="@@name@@ pfeift@@ wen@@@@adverb@@"
      +(who ? " nach." : (adverb ? "." :" anerkennend."));
    return FeelIt();

    /**************** Philosophieren ***************/
    case "philosophier":
    HELPCHECK("philosophier");
    ParseRest(str);
    out_sel="Du philosophierst"+(adverb ? "@@adverb@@." :
      (str ? " ueber "+str+"." : "."));
    out_oth="@@gname@@ philosophiert"+(adverb ? "@@adverb@@." :
      (str ? " ueber "+str+"." : "."));
    return FeelIt();

    /**************** (Nase) Putzen ***************/
    case "putz":
    HELPCHECK("putz");
    if (ghost())
      Return("Nix da zum Putzen, so nebuloes, wie Du bist.\n");
    ParseRest(str, ({"nase", "die nase"}));
    if (str && str!="nase" && !adverb)
      Return("Putze Deine Nase wie?\n");
    out_sel="Du putzt Deine Nase@@adverb@@.";
    out_oth="@@name@@ putzt@@adverb@@ "+QPP(FEMALE,WEN)+" Nase.";
    return FeelIt();

    /**************** Quaken ***************/
    case "quak":
    HELPCHECK("quak");
    ParseRest(str);
    if (str && !adverb)
      Return("Quake wie?\n");
    sfoo="";
    flag=QueryProp(P_FROG)&&!ghost();
    for (t_g=0; t_g<=random(flag ? 4 : 2); t_g++)  {
      sfoo+=(flag ? " Qu" : " kw");
      for (t_n=0; t_n<=random(flag ? 10 : 5); t_n++)
        sfoo+="aA"[random(1)..random(1)];
      sfoo+="k";
    }
    if (!flag)
      sfoo=lower_case(sfoo);
    else
      sfoo+="!";
    out_sel="Du quakst"+(adverb ? "@@adverb@@" : (flag ? " aus voller Kehle"
      : " in etwa wie ein Frosch"))+":"+sfoo;
    out_oth="@@gname@@ quakt"+(adverb ? "@@adverb@@" : (flag ? " aus voller Kehle"
      : " in etwa wie ein Frosch"))+":"+sfoo;
    return FeelIt();

    /**************** Quietschen ***************/
    case "quietsch":
    case "quiek":
    HELPCHECK("quiek");
    ParseRest(str);
    if (str && !adverb)
      Return("Quietsche wie?\n");
    out_sel="Du quietschst"+(adverb ? "@@adverb@@." : " vergnuegt.");
    out_oth="@@gname@@ quietscht"+(adverb ? "@@adverb@@." : " vergnuegt.");
    return FeelIt();

    /**************** Raeuspern ***************/
    case "raeusper":
    HELPCHECK("raeusper");
    ParseRest(str);
    if (str && !adverb)
      Return("Hm? Wie meinen?\n");
    out_sel="Du raeusperst Dich@@adverb@@.";
    out_oth="@@gname@@ raeuspert sich@@adverb@@.";
    return FeelIt();

    /**************** Reiben ***************/
    case "reib":
    HELPCHECK("reib");
    if (ghost())
      Return("Du hast nichts zum Reiben, aber auch gar nichts.\n");
    if (str && (sscanf(str,"%s die Augen",sfoo)==1 || sscanf(str,"%s Augen",sfoo)==1))
      str=sfoo;
    else if (str && (sscanf(str,"%s die Haende",sfoo)==1
    ||sscanf(str,"%s Haende",sfoo)==1))  {
      flag=2;
      str=sfoo;
    }
    if (str=="") str=0;
    ParseRest(str);
    if (str && !adverb)
      Return("Reibe wie die "+(flag==2 ? "Haende" : "Augen")+"?\n");
    out_sel="Du reibst Dir"+(adverb ? "@@adverb@@"
      : (flag==2 ? " vergnuegt" : " muede"))+" die "
      +(flag==2 ? "Haende." : "Augen.");
    out_oth="@@name@@ reibt sich"+(adverb ? "@@adverb@@"
      : (flag==2 ? " vergnuegt" : " muede"))+" die "
      +(flag==2 ? "Haende." : "Augen.");
    return FeelIt();

    /**************** Rotfln ***************/
    case "rotfl":
    HELPCHECK("rotfl");
    ParseRest(str);
    if (str && !adverb)
      Return("Rotfl wie?\n");
    out_sel="Du rotflst@@adverb@@.";
    out_oth="@@gname@@ rotflt@@adverb@@.";
    return FeelIt();

    /**************** Ruelpsen ***************/
    case "ruelps":
    HELPCHECK("ruelps");
    GHOSTCHECK("Ein leichter Windhauch entfaehrt Deinem Mund, mehr nicht.\n",
      "Dem Mund des Geistes von "+capname()
        +" entfaehrt ein leichtes Lueftchen.\n", 0);
    if (!str)  {
      out_sel="BOOOOEEERRRRPP!  Entschuldige dich gefaelligst!";
      out_oth="@@name@@ ruelpst unanstaendig.";
    }
    else  {
      ParseRest(str);
      if (!adverb)  {
        write("Ruelpse wie (schlimm genug, dass Du Dich nicht beherrschen "
          +"kannst!)?\n");
        return 1;
      }
      out_sel="Du ruelpst@@adverb@@. Schaem Dich!";
      out_oth="@@name@@ ruelpst@@adverb@@ und wird nicht mal rot dabei.";
    }
    return FeelIt();
  }

  switch (vb)  {
    /**************** Runzeln ***************/
    case "runzel":
    case "runzl":
    HELPCHECK("runzel");
    if (ghost())
      Return("DAS geht als Geist nun wirklich nicht.\n");
    ParseRest(str,"stirn");
    if (str && !adverb)
      Return("Runzle die Stirn wie?\n");
    out_sel="Du runzelst@@adverb@@ die Stirn.";
    out_oth="@@name@@ runzelt@@adverb@@ die Stirn.";
    return FeelIt();

    /**************** Sabbere ***************/
    case "sabber":
    HELPCHECK("sabber");
    sfoo=ghost() ? "schleim" : "sabber";
    ParseRest(str);
    if (str && !adverb && !who)
      Return("Sabber wie oder wen an?\n");
    out_sel="Du "+sfoo+"st@@ wen@@@@adverb@@ "
      +(who ? "an." : "auf den Boden.");
    if (who) out_vic="@@gname@@ "+sfoo+"t Dich@@adverb@@ an.";
    out_oth="@@gname@@ "+sfoo+"t@@ wen@@@@adverb@@ "
      +(who ? "an." : "auf den Boden.");
    return FeelIt();

    /**************** Schaemen ***************/
    case "schaem":
    HELPCHECK("schaem");
    ParseRest(str);
    if (str && !adverb && lower_case(str)!="dich")
      Return("Schaeme Dich wie?\n");
    out_sel="Du schaemst Dich@@adverb@@.";
    out_oth="@@gname@@ schaemt sich@@adverb@@.";
    return FeelIt();

#ifdef SCHAU_AN
    /**************** Schau an ***************/
    case "schau":
    HELPCHECK("schau");
    if (!str || old_explode(str, " ")[sizeof(old_explode(str, " "))]!="an")
      return 0;
    ParseRest(str, "an");
    if (!who)
      Return("Schau wen an?\n");
    out_sel="Du schaust @@wen@@@@adverb@@ an.";
    out_vic="@@gname@@ schaut Dich@@adverb@@ an.";
    out_oth="@@gname@@ schaut @@wen@@@@adverb@@ an.";
    return FeelIt();
#endif

    /**************** Schluchzen ***************/
    case "schluchz":
    HELPCHECK("schluchz");
    ParseRest(str);
    if (str && !adverb)
      Return("Schluchze wie?\n");
    out_sel="Du schluchzt"+(adverb ? "@@adverb@@." : " herzzerreissend.");
    out_oth="@@gname@@ schluchzt"
      +(adverb ? "@@adverb@@." : " herzzerreissend.");
    return FeelIt();

    /**************** Schmollen ***************/
    case "schmoll":
    HELPCHECK("schmoll");
    GHOSTCHECK("Du schwebst beleidigt in die Ecke.\n",
      gname()+" schwebt beleidigt in die Ecke und schmollt.\n", 0);
    ParseRest(str);
    if (str && !adverb)
      Return("Schmolle wie?\n");
    out_sel="Du schmollst@@adverb@@.";
    out_oth="@@name@@ geht in die Ecke und schmollt@@adverb@@.";
    return FeelIt();

    /**************** Schmunzeln ***************/
    case "schmunzel":
    case "schmunzl":
    HELPCHECK("schmunzel");
    ParseRest(str);
    if (str && !adverb)
      Return("Schmunzle wie?\n");
    out_sel="Du schmunzelst@@adverb@@.";
    out_oth="@@gname@@ schmunzelt@@adverb@@.";
    return FeelIt();

    /**************** Schnalzen ***************/
    case "schnalz":
    HELPCHECK("schnalz");
    ParseRest(str, ({"zunge","mit zunge", "mit der zunge"}));
    out_sel="Du schnalzt@@adverb@@ mit der Zunge.";
    out_oth="@@gname@@ schnalzt@@adverb@@ mit der Zunge.";
    return FeelIt();

    /**************** Schnauben ***************/
    case "schnaub":
    HELPCHECK("schnaub");
    ParseRest(str);
    if (str && !adverb)
      Return("Schnaube wie?\n");
    out_sel="Du schnaubst"+(adverb ? "@@adverb@@." : " entruestet.");
    out_oth="@@gname@@ schnaubt"+(adverb ? "@@adverb@@." : " entruestet.");
    return FeelIt();

    /**************** Schnaufen ***************/
    case "schnauf":
    HELPCHECK("schnauf");
    ParseRest(str);
    if (str && !adverb)
      Return("Schnaufe wie?\n");
    out_sel="Du schnaufst"+(adverb ? "@@adverb@@." : " vor Anstrengung.");
    out_oth="@@gname@@ schnauft"+(adverb ? "@@adverb@@." : " vor Anstrengung.");
    return FeelIt();

    /**************** Schnippen ***************/
    case "schnipp":
    case "schnipps":
    HELPCHECK("schnipp");
    GHOSTCHECK("Du schaffst es nicht, weil die Finger durcheinander durch "
        +"gehen.\n",
      gname()+" versagt beim Schnippen - die Finger\ngehen durcheinander "
        +"durch.\n", 0);
    ParseRest(str);
    if (str && !adverb)
      Return("Schnippe wie?\n");
    out_sel="Du schnippst@@adverb@@ mit deinen Fingern.";
    out_oth="@@name@@ schnippt@@adverb@@ mit den Fingern.";
    return FeelIt();

    /**************** Schnarchen ***************/
    case "schnarch":
    HELPCHECK("schnarch");
    if (ghost())
      Return("Ich glaube, da fehlen Dir irgendwie die physischen "
        +"Voraussetzungen dazu.\n");
    ParseRest(str);
    if (str && !adverb)
      Return("Schnarche wie?\n");
    out_sel=(str ? "Zzzzzzzzzzz..." : "Du schnarchst@@adverb@@.");
    out_oth="@@name@@ schnarcht "+(str ? "@@adverb@@." : "laut.");
    return FeelIt();

    /**************** Schniefen ***************/
    case "snief":
    case "schnief":
    HELPCHECK("schnief");
    GHOSTCHECK("Du schniefst ganz leise.\n",
      gname()+" schnieft ganz leise.\n", 0);
    ParseRest(str);
    if (str && !adverb)
      Return("Schniefe wie?\n");
    out_sel="Du schniefst@@adverb@@.";
    out_oth="@@name@@ schnieft@@adverb@@.";
    return FeelIt();

    /**************** Schnurren ***************/
    case "schnurr":
    HELPCHECK("schnurr");
    ParseRest(str);
    if (str && !adverb)
      Return("Wie willst Du schnurren?\n");
    out_sel="MMMMIIIIIAAAAAAUUUUUUUU! Du schnurrst"
      +(adverb ? "@@adverb@@." : " zufrieden.");
    out_oth="@@gname@@ schnurrt"+(adverb ? "@@adverb@@." : " zufrieden.");
    return FeelIt();

    /**************** Schreien ***************/
    case "schrei":
    HELPCHECK("schrei");
    GHOSTCHECK("AAAAIIIIIIIIIIIEEEEEEEEEEEEEEEEEEEEEEEEEE! Ja, nur Geister "
        +"koennen so schreien!\n",
      gname()+" schreit - das Blut gefriert fast in deinen Ader!\n", 0);
    if (!str)  {
      out_sel="AUUUAAAHHHHHH!!!!";
      out_oth="@@name@@ schreit laut!";
    }
    else  {
      ParseRest(str);
      if (!who && !adverb)
        Return("Schreien - wie denn? Oder wen denn anschreien?\n");
      out_sel="Du schreist@@ wen@@@@adverb@@"+(who ? " an" : "")+".";
      if (who) out_vic="@@name@@ schreit Dich@@adverb@@ an.";
      out_oth="@@name@@ schreit@@ wen@@@@adverb@@"+(who? " an" : "")+".";
    }
    return FeelIt();

    /**************** Schuetteln ***************/
    case "schuettel":
    case "schuettl":
    HELPCHECK("schuettel");
    ParseRest(str);
    if (for_all)  {
      out_sel="Du schuettelst @@alle@@@@adverb@@ die Haende.";
      out_vic="@@gname@@ schuettelt @@alle@@@@adverb@@ die Haende.";
      return MixedOut(WEM);
    }
    if (str && !who && !adverb)
      Return("Schuettle wie? Schuettle wem die Hand?\n");
    if(!who) {
      out_sel="Du schuettelst Dich@@adverb@@.";
      out_oth="@@gname@@ schuettelt sich@@adverb@@.";
    }
    else  {
      if (CheckLife(0,NOT_DEAD,
        "", "Noe, das mach ich nur mit Lebewesen."))
          return 1;
      if (who == this_player())  {
        out_sel="Du hebst"+(adverb ? "@@adverb@@" : " triumphierend")
          +" Deine Haende ueber den Kopf und schuettelst sie.";
        out_oth="@@gname@@ hebt"+(adverb ? "@@adverb@@" : " triumphierend")
          +" die Haende ueber den Kopf\nund schuettelt sie.";
      }
      else  {
        out_sel="Du schuettelst@@ wem@@@@adverb@@ die Haende.";
        if (ghost()) out_sel+="\nNaja, Du versuchst es wenigstens - "
          +"immer diese durchlaessigen Haende...";
        out_vic="@@gname@@ schuettelt Dir@@adverb@@ die Haende.";
        if (ghost()) out_vic+="\nNaja, Du versuchst es wenigstens - "
          +"immer diese durchlaessigen Haende...";
        out_oth="@@gname@@ schuettelt@@ wem@@@@adverb@@ die Haende.";
        if (ghost()) out_oth+="\nNaja, Du versuchst es wenigstens - "
          +"immer diese durchlaessigen Haende...";
      }
    }
    return FeelIt();

    /**************** Schweigen ***************/
    case "schweig":
    HELPCHECK("schweig");
    ParseRest(str);
    if (str && !adverb)
      Return("Schweige wie?\n");
    out_sel="Du schweigst@@adverb@@.";
    out_oth="@@gname@@ schweigt@@adverb@@.";
    return FeelIt();

    /**************** Seufzen ***************/
    case "seufz":
    HELPCHECK("seufz");
    GHOSTCHECK("Du seufzt geisterhaft.\n",
      gname()+" seufzt geisterhaft. Naja, wie denn sonst?\n", 0);
    ParseRest(str);
    if (!adverb && str)
      Return("Seufze wie?\n");
    out_sel="Du seufzst@@adverb@@.";
    out_oth="@@name@@ seufzt@@adverb@@.";
    return FeelIt();

    /**************** Singen ***************/
    case "sing":
    HELPCHECK("sing");
    if (!str) {
      out_sel="Oh sole mio!";
      out_oth="@@gname@@ singt irgendwas italienisches.";
    }
    else  {
      ParseRest(str);
      out_sel="Du singst@@adverb@@"+(adverb ? "." : " '"+capitalize(str)+"'.");
      out_oth="@@gname@@ singt@@adverb@@"+(adverb ? "." : " '"
        +capitalize(str)+"'.");
    }
    return FeelIt();

    /**************** Sniffen ***************/
    case "sniff":
    HELPCHECK("sniff");
    ParseRest(str);
    if (str && !adverb && !who)
      Return("Sniffe wie?\n");
    out_sel="Du sniffst"+(who ? " @@wen@@" : "")
      +(adverb ? "@@adverb@@" : " traurig")+(who ? " an." : ".");
    if (who) out_vic="@@gname@@ snifft Dich"
      +(adverb ? "@@adverb@@" : " traurig")+" an.";
    out_oth="@@gname@@ snifft"+(who ? " @@wen@@" : "")
      +(adverb ? "@@adverb@@" : " traurig")+(who ? " an." : ".");
    return FeelIt();

    /**************** Spucken ***************/
    case "spuck":
    HELPCHECK("spuck");
    GHOSTCHECK("Du bringst nicht genug Spucke zusammen.\n",
      gname()+" stellt gerade fest, dass man ohne Spucke nicht\n"
        +"spucken kann.\n", 0);
    ParseRest(str);
    if (str && !who && !adverb)
      Return("Spucke wen wie an?\n");
    if (who && CheckLife(NOT_SELF,0,
      "Hast Du Dich so schlecht benommen? Lass es lieber bleiben."))
        return 1;
    out_sel="Du spuckst@@ wen@@@@adverb@@ "+(who ? "an." : "auf den Boden.");
    if (who) out_vic="@@name@@ spuckt Dich@@adverb@@ an.";
    out_oth="@@name@@ spuckt@@ wen@@@@adverb@@ "
      +(who ? "an." : "auf den Boden.");
    return FeelIt();

    /**************** Stampfen ***************/
    case "stampf":
    HELPCHECK("stampf");
    ParseRest(str, "auf");
    out_sel="Du stampfst@@adverb@@ mit dem Fuss auf.";
    out_oth="@@gname@@ stampft@@adverb@@ mit dem Fuss auf.";
    return FeelIt();

    /**************** Starren ***************/
    case "starr":
    HELPCHECK("starr");
    ParseRest(str);
    if (str && !who && !adverb)
      Return("Starre wie bzw. wen an?\n");
    if (who && CheckLife(NOT_SELF,0,
      "Wie willst Du in Deine eigenen Augen starren? "
        +"(Spiegel gelten nicht...)"))
        return 1;
    out_sel="Du starrst"+(!str ? " ins Leere." : (who ? "@@ wen@@" : "")
      +(adverb ? "@@adverb@@" : " vertraeumt")+(who ? " an." : "."));
    if (who) out_vic="@@gname@@ starrt"+(adverb ? "@@adverb@@" : " tief")
      +" in Deine Augen.";
    out_oth="@@gname@@ starrt"+(!str ? " ins Leere." : (who ? "@@ wen@@" : "")
      +(adverb ? "@@adverb@@" : " vertraeumt")+(who ? " an." : "."));
    return FeelIt();

    /**************** Staunen ***************/
    case "staun":
    HELPCHECK("staun");
    if (!str)  {
      out_sel="Du bist erstaunt.";
      out_oth="@@gname@@ ist erstaunt.";
    }
    else  {
      ParseRest(str, "ueber");
      if (!who && !adverb)
        Return("Bla bla. Wenn Du nach staune noch was tippst, sollte "
          +"das ein\nLebewesen sein.\n");
      if (who == this_player())  {
        out_sel="Du staunst@@adverb@@ ueber Dich selber.";
        out_oth="@@gname@@ staunt@@adverb@@ ueber sich selber.";
      }
      else  {
        out_sel="Du staunst@@adverb@@"+(who ? " ueber @@wen@@." : ".");
        if (who) out_vic="@@gname@@ staunt@@adverb@@ ueber Dich.";
        out_oth="@@gname@@ staunt@@adverb@@"+(who ? " ueber @@wen@@." : ".");
      }
    }
    return FeelIt();

    /**************** Stieren ***************/
    case "stier":
    HELPCHECK("stier");
    GHOSTCHECK("Du stierst mit hohlem Blick in die Gegend.\n",
      gname()+" stiert mit hohlem Blick in die Gegend.\n", 0);
    ParseRest(str);
    if (str && !who && !adverb)
      Return("Stiere wie oder wen an?\n");
    if (who && CheckLife(NOT_SELF,NOT_DEAD,
      "Du kannst Dich nicht selber anstieren.",
      "Bitte nur Lebewesen anstieren."))
        return 1;
    out_sel="Du stierst@@ wen@@@@adverb@@"
      +(who ? " an." : " in der Gegend herum.");
    if (who) out_vic="@@gname@@ stiert Dich@@adverb@@ an.";
    out_oth="@@gname@@ stiert@@ wen@@@@adverb@@"
      +(who ? " an." : " in der Gegend herum.");
    return FeelIt();

    /**************** Stimme zu ***************/
    case "stimm":
    HELPCHECK("stimm");
    ParseRest(str, "zu");
    if (str && !who && !adverb)
      Return("Stimme wem zu?\n");
    out_sel="Du stimmst@@ wem@@@@adverb@@ zu.";
    if (who) out_vic="@@gname@@ stimmt Dir@@adverb@@ zu.";
    out_oth="@@gname@@ stimmt@@ wem@@@@adverb@@ zu.";
    return FeelIt();

    /**************** Stoehnen ***************/
    case "stoehn":
    HELPCHECK("stoehn");
    GHOSTCHECK("Du stoehnst schauderlich.\n",
      gname()+" stoehnt schauderlich. Zum Glueck\nhast Du ziemlich "
        +"gute Nerven.\n", 0);
    ParseRest(str);
    if (!adverb && str)
      Return("Wie willst Du stoehnen?\n");
    out_sel="Du stoehnst@@adverb@@.";
    out_oth="@@name@@ stoehnt@@adverb@@.";
    return FeelIt();

    /**************** Stossen ***************/
    case "stoss":
    HELPCHECK("stoss");
    ParseRest(str);
    if (!who)
      Return("Stosse wen?\n");
    if (CheckLife(NOT_SELF,NOT_DEAD,
      "Was soll der Unsinn? Lass das!",
      "Das gibt nur bei Lebewesen Sinn."))
        return 1;
    GHOSTCHECK("Dein Ellenbogen versinkt in "+who->name(WEM)+".\n",
      gname()+" will "+who->name(WEM)+" in die Rippen stossen, aber "
        +QPP(MALE,WER,PLURAL)+"\nEllenbogen verteilen keinen Stoss, "
        +"sondern versinken.\n",
      gname()+" will Dich in die Rippen stossen, aber "+QPP(MALE,WER,PLURAL)
        +" Ellenbogen versinken.\n");
    out_sel="Du stoesst@@ wen@@@@adverb@@ in die Rippen.";
    out_vic="@@name@@ stoesst Dir@@adverb@@ in die Rippen.";
    out_oth="@@name@@ stoesst@@ wen@@@@adverb@@ in die Rippen.";
    return FeelIt();

    /**************** Streicheln ***************/
    case "streichel":
    case "streichl":
    HELPCHECK("streichel");
    ParseRest(str);
    if (!who)
      Return("Streichle wen?\n");
    if (for_all)  {
      out_sel="Du streichelst @@alle@@@@adverb@@.";
      out_vic="@@gname@@ streichelt @@alle@@@@adverb@@.";
      return MixedOut(WEN);
    }
    if (CheckLife(NOT_SELF,NOT_DEAD,
      "Lass Dich von anderen streicheln.",
      "Ich streichle nur Lebewesen."))
        return 1;
    GHOSTCHECK("Du willst "+who->name(WEN,2)+" streicheln, aber Deine "
      +"Haende koennen\nnichts beruehren.\n",
    gname()+" will "+who->name(WEN,2)+" streicheln, aber diese\n"
      +"Geisterhaende koennen halt nix beruehren...\n",
    gname()+" will Dich streicheln, scheitert aber wie so oft an\n"
      +"diesen dummen durchlaessigen Geisterhaenden.\n");
    out_sel="Du streichelst @@wen@@@@adverb@@.";
    out_vic="@@name@@ streichelt Dich@@adverb@@.";
    out_oth="@@name@@ streichelt @@wen@@@@adverb@@.";
    return FeelIt();

    /**************** Stupsen ***************/
    case "stups":
    HELPCHECK("stups");
    if (ghost())
      Return("Das geht nicht ohne Ellenbogen,..\n");
    ParseRest(str);
    if (!who)
      Return("Stupse wen an?\n");
    out_sel="Du stupst @@wen@@@@adverb@@ an.";
    out_vic="@@name@@ stupst Dich@@adverb@@ an.";
    out_oth="@@name@@ stupst @@wen@@@@adverb@@ an.";
    return FeelIt();

    /**************** Stutzen ***************/
    case "stutz":
    HELPCHECK("stutz");
    ParseRest(str);
    if (str && !adverb)
      Return("Stutze wie?\n");
    out_sel="Du stutzt@@adverb@@.";
    out_oth="@@gname@@ stutzt@@adverb@@.";
    return FeelIt();

    /**************** Taetscheln ***************/
    case "taetschel":
    case "taetschl":
    HELPCHECK("taetschel");
    ParseRest(str);
    if (!who)
      Return("Taetschle wen?\n");
    if (CheckLife(NOT_SELF,NOT_DEAD,
      "Das sieht zu doof aus, das mache ich nicht.",
      "Ich taetschle nur Lebewesen."))
        return 1;
     GHOSTCHECK("Du willst "+who->name(WEN)+" taetscheln - aber Deine "
        +"Haende gehen\nglatt durch den Kopf durch.\n",
      gname()+" will "+who->name(WEN)+" den Kopf taetscheln, aber "
        +"die Geister-\nhaende gehen glatt durch den Kopf durch.\n",
      gname()+" will Deinen Kopf taetscheln, aber diese Geisterhaende "
        +"gehen\nglatt durch Deinen Kopf durch - Du hast ein seltsames "
        +"Gefuehl dabei.\n");
    out_sel="Du taetschelst @@wem@@@@adverb@@ den Kopf.";
    out_vic="@@name@@ taetschelt Dir@@adverb@@ den Kopf.";
    out_oth="@@name@@ taetschelt @@wem@@@@adverb@@ den Kopf.";
    return FeelIt();

    /**************** Tanzen ***************/
    case "tanz":
    HELPCHECK("tanz");
    GHOSTCHECK("Du tanzt den klassischen GeisterTanz (tm).\n",
      gname()+" tanzt den klassischen GeisterTanz (tm).\n", 0);
    if (!str) {
      out_sel="Kommst Du Dir nicht irgendwie bloed vor? Du tanzt "
        +"den Ententanz.";
      out_oth="@@name@@ tanzt den Ententanz.";
    }
    else  {
      taenze=({"Walzer","Polka","Rumba","Tango","Cha cha cha","Foxtrott",
        "Mambo","Salsa","Slowfox","Breakdance","Pogo","Merengue",
        "Rock'n'Roll","Ballett","Regentanz","Hexentanz"});
      ParseRest(str,"mit");
      if (!who)
        Return("Mit wem willst Du tanzen?\n");
      if (who && CheckLife(NOT_SELF,NOT_DEAD,
        "Mit Dir selber kannst Du nicht tanzen.",
        "Keine Reaktion - will wahrscheinlich nicht tanzen."))
          return 1;
      ifoo=random(sizeof(taenze));
      out_sel="Du tanzt@@adverb@@ mit @@wem@@ eine Runde "+taenze[ifoo]+".";
      out_vic="@@name@@ reisst Dich an sich und tanzt@@adverb@@ eine Runde "
        +taenze[ifoo]+" mit Dir.";
      out_oth="@@name@@ schnappt sich @@wen@@ und die beiden tanzen"
        +"@@adverb@@ eine Runde "+taenze[ifoo]+".";
    }
    return FeelIt();

    /**************** Traeumen ***************/
    case "traeum":
    HELPCHECK("traeum");
    if (!str)
      Return("Traeume wovon oder von wem?\n");
    ParseRest(str);
    out_sel="Du traeumst"+(who ? "@@adverb@@ von @@wem@@."
      : (adverb ? "@@adverb@@." : " "+str+"."));
    if (who) out_vic="@@gname@@ traeumt@@adverb@@ von Dir.";
    out_oth="@@gname@@ traeumt"+(who ? "@@adverb@@ von @@wem@@."
      : (adverb ? "@@adverb@@." : " "+str+"."));
    return FeelIt();

    /**************** Treten (tritt) ***************/
    case "tritt":
    case "tret":
    HELPCHECK("tritt");
    if (!str)  {
      GHOSTCHECK("Dein Fuss faehrt durch die beruehmte langvergessene "
          +"unsichtbare Schildkroete\nhindurch.\n",
        gname()+" will die beruehmte langvergessene unsichtbare\n"
          +"Schildkroete treten, aber "+QPP(MALE,WER)
          +" Fuss faehrt durch sie hindurch.\n", 0);
      out_sel="Du trittst die beruehmte langvergessene unsichtbare "
        +"Schildkroete.";
      out_oth="@@gname@@ tritt die beruehmte langvergessene unsichtbare "
        +"Schildkroete.";
    }
    else  {
      ParseRest(str);
      if (for_all)  {
        out_sel="Du trittst @@alle@@@@adverb@@. Solltest Du nicht langsam "
          +"an Flucht denken?";
        out_vic="@@name@@ tritt @@alle@@@@adverb@@. Traut sich ganz "
          +"schoen was!";
        return MixedOut(WEN);
      }
      if (!who && !adverb)
        Return("Wenn Du schon was nach tritt tippst, dann sag mir, wen "
          +"oder wie ich das soll.\n");
      if (who && CheckLife(NOT_SELF,NOT_DEAD,
        "Du schaffst es nicht, Dir selber in den Hintern zu treten.",
        "Tote Sachen tritt man nicht auch noch!"))
          return 1;
      if (who)  {
        out_sel="Du trittst@@ wen@@@@adverb@@.";
        if (who) out_vic="@@gname@@ tritt Dich@@adverb@@.";
        out_oth="@@gname@@ tritt@@ wen@@@@adverb@@.";
      }
      else  {
        out_sel="Du trittst die beruehmte langvergessene unsichtbare "
          +"Schildkroete@@adverb@@.";
        out_oth="@@gname@@ tritt die beruehmte langvergessene unsichtbare "
          +"Schildkroete\n@@adverb@@.";
      }
    }
    return FeelIt();

    /**************** Troesten ***************/
    case "troest":
    HELPCHECK("troest");
    ParseRest(str);
    if (!who)
      Return("Wen willst Du troesten?\n");
    if (who && CheckLife(NOT_SELF,NOT_DEAD,
      "Trost musst Du bei jemand anders suchen.",
      "Das Teil musst Du nicht troesten, das fuehlt nix."))
        return 1;
    out_sel="Du troestest@@ wen@@@@adverb@@.";
    out_vic="@@gname@@ troestet Dich@@adverb@@.";
    out_oth="@@gname@@ troestet@@ wen@@@@adverb@@.";
    return FeelIt();

    /**************** Umarmen ***************/
    case "umarm":
    HELPCHECK("umarm");
    ParseRest(str);
    if (!who)
      Return("Wen willst Du umarmen?\n");
    if (who && CheckLife(0,NOT_DEAD,0,"Bitte umarme nur Lebewesen."))
      return 1;
    if (ghost() && CheckLife(NOT_SELF,0,
      "Du kannst Dich als Geist nicht selber waermen."))
        return 1;
    str1=who->name(WEN);
    str2=who->QueryPronoun(WEN);
    GHOSTCHECK("Du willst "+str1+" umarmen, aber Deine Arme gehen durch "
        +str2+" durch.\n",
      gname()+" will "+str1+" umarmen, aber "+QPP(MALE,WER,PLURAL)
        +" Arme gehen\ndurch "+str2+" hindurch.\n",
      gname()+" will Dich umarmen, aber "+QPP(MALE,WER,PLURAL)
        +" Arme gehen durch Dich hindurch.\n");
    if (for_all)  {
      out_sel="Du umarmst @@alle@@@@adverb@@.";
      out_vic="@@name@@ umarmt @@alle@@@@adverb@@.";
      return MixedOut(WEN);
    }
    if (who==this_player())  {
      out_sel="Du legst Deine Arme um Dich und waermst Dich "
        +"ein bisschen selber.";
      out_oth="@@name@@ legt "+QPP(MALE,WER,PLURAL)
        +" Arme um sich und waermt sich ein bisschen selber.";
    }
    else  {
      out_sel="Du umarmst@@ wen@@@@adverb@@.";
      out_vic="@@name@@ umarmt Dich@@adverb@@.";
      out_oth="@@name@@ umarmt@@ wen@@@@adverb@@.";
    }
    return FeelIt();

    /**************** Verfluchen ***************/
    case "verfluch":
    HELPCHECK("verfluch");
    if (!str)
      Return("Wen oder was willst Du denn verfluchen?\n");
    ParseRest(str);
    if (!who)  {
      out_sel="Du verfluchst "+str+".";
      out_oth="@@gname@@ verflucht "+str+".";
    }
    else  {
      if (who==this_player())
        Return("Sich selber verflucht man besser nicht...\n");
      if (!adverb)  {
        flag=sscanf(str, "%s %s", str1,str2);
        out_sel="Du verfluchst@@ wen@@"+(flag==2 ? " "+str2 : "")+".";
        out_vic="@@gname@@ verflucht Dich"+(flag==2?" "+str2 : "")+".";
        out_oth="@@gname@@ verflucht@@ wen@@"+(flag==2 ? " "+str2 : "")+".";
      }
      else  {
        out_sel="Du verfluchst@@ wen@@@@adverb@@.";
        out_vic="@@gname@@ verflucht Dich@@adverb@@.";
        out_oth="@@gname@@ verflucht@@ wen@@@@adverb@@.";
      }
    }
    return FeelIt();

    /**************** Verneigen / Verbeugen ***************/
    case "verneig":
    case "verbeug":
    HELPCHECK("verneig");
    GHOSTCHECK("Du verneigst Dich ein bisschen heftig - Dein Kopf taucht "
        +"kurz in den Boden.\n",
      gname()+" verneigt sich. Ein bisschen heftig - "+QPP(MALE,WER)
        +" Kopf\ntaucht kurz in den Boden ein.\n", 0);
    if ((!str) || (str == "dich")) {
      out_sel="Du verneigst Dich vor den Anwesenden.";
      out_oth="@@name@@ verneigt sich anmutig.";
    }
    else  {
      ParseRest(str);
      if (for_all)  {
        out_sel="Du verneigst Dich@@adverb@@ vor @@alle@@.";
        out_vic="@@name@@ verneigt sich@@adverb@@ vor @@alle@@.";
        return MixedOut(WEM);
      }
      if (!who && !adverb)
        Return("Verneige dich irgendwie oder vor jemandem.\n");
      if (who && CheckLife(NOT_SELF,NOT_DEAD,
        "Wie willst Du das denn schaffen?",
        "Vor Sachen wird hier nicht verneigt, klar?\n"))
          return 1;
      out_sel="Du verneigst Dich@@adverb@@"+(who ? " vor" : "")+"@@ wem@@.";
      if (who ) out_vic="@@name@@ verneigt sich@@adverb@@ vor Dir.";
      out_oth="@@name@@ verneigt sich@@adverb@@"+(who ? " vor" : "")
        +"@@ wem@@.";
    }
    return FeelIt();

    /**************** Verneinen ***************/
    case "nein":
    case "noe":
    HELPCHECK("nein");
    GHOSTCHECK("Du schuettelst Deinen Kopf so heftig, dass er kurz "
        +"davonschwebt.\n",
      gname()+" schuettelt heftig den Kopf.\nSo heftig, dass dieser "
        +"kurz davonschwebt und wieder eingefangen werden muss.\n", 0);
    ParseRest(str);
    if (str && !adverb)
      Return("Schuettle wie den Kopf?\n");
    out_sel="Du schuettelst@@adverb@@ den Kopf.";
    out_oth="@@name@@ schuettelt@@adverb@@ den Kopf.";
    return FeelIt();

    /**************** Wackeln ***************/
    case "wackel":
    case "wackl":
    HELPCHECK("wackel");
    if (ghost())
      Return("Da gibt es nichts mehr, womit Du wackeln kannst.\n");
    if (str)
      if (strstr(str, "mit ")==0)
        sscanf(str, "mit %s", sfoo);
      else if (strstr(str,"mit ")>0)  {
        sscanf(str, "%s mit %s", sfoo, sfoo);
        flag=1;
      }
    if (sfoo=="") sfoo=0;
    ParseRest(str, (sfoo ? (flag ? " mit " : "mit ")+sfoo : 0));
    if (str && !adverb && !sfoo)
      Return("Wackle wie oder womit?\n");
    out_sel="Du wackelst@@adverb@@ mit "+(sfoo ? sfoo+"." : "dem Hintern.");
    out_oth="@@name@@ wackelt@@adverb@@ mit "
      +(sfoo ? sfoo+"." : QPP(MALE,WEM)+" Hintern.");
    return FeelIt();

    /**************** Waelzen ***************/
    case "waelz":
    HELPCHECK("waelz");
    ParseRest(str);
    if (str && !adverb)
      Return("Waelze Dich wie auf dem Boden?\n");
    out_sel="Du waelzt Dich"+(adverb ? "@@adverb@@" : " vor Lachen")
      +" auf dem Boden.";
    out_oth="@@gname@@ waelzt sich"+(adverb ? "@@adverb@@" : " vor Lachen")
      +(ghost() ? " im" : " auf dem")+" Boden.";
    return FeelIt();

    /**************** Warten ***************/
    case "wart":
    HELPCHECK("wart");
    ParseRest(str);
    if (!str)  {
      out_sel="Du tippst mit dem Fuss auf den Boden.";
      out_oth="@@gname@@ tippt mit dem Fuss auf den Boden.";
    } else if (!who && adverb)  {
      out_sel="Du wartest@@adverb@@.";
      out_oth="@@gname@@ wartet@@adverb@@.";
    } else  {
      out_sel="Du wartest@@adverb@@ auf "+(who ? "@@wen@@." : str+".");
      if (who) out_vic="@@gname@@ wartet@@adverb@@ auf Dich.";
      out_oth="@@gname@@ wartet@@adverb@@ auf "+(who ? "@@wen@@." : str+".");
    }
    return FeelIt();

#ifdef WECKE
    /**************** Wecken ***************/
    case "weck":
    HELPCHECK("weck");
    if (ParseRemote(str))
      return 1;
//    ParseRest(str);
    if (!who)
      Return("Wen willst Du wecken?\n");
    if (sscanf(str, "%s %s", sfoo, sfoo)==2)
      flag=1;
    out_sel="Dein Wecker klingelt bei @@wem@@@@adverb@@"
      +(adverb ? "." : (flag ? ": "+sfoo : "."));
    out_vic=" "+name(WESSEN)+" Wecker klingelt bei Dir@@adverb@@"
      +(adverb ? "." : (flag ? ": "+sfoo : "."));
    out_oth="@@gname@@ wirft "+QPP(MALE, WEN)
      +" Wecker@@adverb@@ nach @@wem@@.";
          if (!(who->QueryProp(P_ALERT) & AL_NO_SOUND))
         out_vic[0]=7; // chr(7)==BEL
      else out_vic=out_vic[1..];
    return FeelIt();
#endif

    /**************** Weinen ***************/
    case "wein":
    HELPCHECK("wein");
    GHOSTCHECK("Es reicht leider nur fuer ein paar winzige Nebelwoelkchen, "
        +"nicht fuer Traenen.\n",
      gname()+" verzieht das Gesicht und ein paar winzige Nebel-\n"
        +"woelkchen entfernen sich von seinen \"Augen\".\n", 0);
    if (!str)  {
      out_sel="Waaaaah! Du weinst bitterlich.";
      out_oth="@@name@@ bricht in Traenen aus und weint bitterlich.";
    }
    else  {
      ParseRest(str);
      if (!who && !adverb)
        Return("Weine Dich irgendwie bei irgendwem aus, aber nicht so.\n");
      if (who && CheckLife(NOT_SELF,NOT_DEAD,
        "Bei sich selber kann man sich so schlecht ausweinen.",
        "Bei wem willst Du Dich ausweinen???"))
          return 1;
      if (who)  {
        out_sel="Du weinst Dich@@adverb@@ bei@@ wem@@ aus.";
        out_vic="@@name@@ weint sich@@adverb@@ bei Dir aus.";
        out_oth="@@name@@ weint sich@@adverb@@ bei@@ wem@@ aus.";
      }
      else  {
        out_sel="Du brichst in Traenen aus und weinst@@adverb@@.";
        out_oth="@@name@@ bricht in Traenen aus und weint@@adverb@@.";
      }
    }
    return FeelIt();

    /**************** Winken ***************/
    case "wink":
    HELPCHECK("wink");
    ParseRest(str);
    if (for_all)  {
      out_sel="Du winkst @@alle@@@@adverb@@ zu.";
      out_vic="@@name@@ winkt @@alle@@@@adverb@@ zu.";
      return MixedOut(WEM);
    }
    if (!who && !adverb && str)
      Return("Vielleicht solltest Du auch sagen, wem oder wie Du "
        +"(zu)winken willst.\n");
    if (who && CheckLife(NOT_SELF, NOT_DEAD,
      "Wink Dir nicht selber zu.",
      "Du musst schon einem Lebewesen zuwinken."))
        return 1;
    out_sel="Du winkst@@ wem@@@@adverb@@"+(who ? " zu" : "")+".";
    if (who) out_vic="@@gname@@ winkt Dir@@adverb@@ zu.";
    out_oth="@@gname@@ winkt@@ wem@@@@adverb@@"+(who ? " zu" : "")+".";
    return FeelIt();

    /**************** Wuergen ***************/
    case "wuerg":
    HELPCHECK("wuerg");
    ParseRest(str);
    if (str && !who && !adverb)
      Return("Wuerge wen oder wie?\n");
    if (!who)  {
      out_sel="Du faengst@@adverb@@ an zu wuergen.";
      out_oth="@@gname@@ faengt@@adverb@@ an zu wuergen.";
    } else if (CheckLife(NOT_SELF, NOT_DEAD,
          "Du wuergst ein bischen an Dir rum. Dir wird schnell langweilig.",
	  "Wuerg lieber ein Lebewesen.")) {
      return 1;
    } else {
      out_sel="Du springst @@wen@@ an und faengst an, "+who->QueryPronoun(WEN)
        +"@@adverb@@ zu wuergen.";
      out_vic="@@gname@@ springt Dich auf einmal an und wuergt Dich@@adverb@@.";
      out_oth="@@gname@@ springt auf einmal @@wen@@ an und wuergt "
        +who->QueryPronoun(WEN)+"@@adverb@@.";
    }
    return FeelIt();

    /**************** Wundern ***************/
    case "wunder":
    HELPCHECK("wunder");
    ParseRest(str);
    if (str && !who && !adverb)
      Return("Wie oder ueber wen willst Du Dich wundern?\n");
    out_sel="Du wunderst Dich@@adverb@@"+(who ? " ueber @@wen@@." : ".");
    if (who) out_vic="@@gname@@ wundert sich@@adverb@@ ueber Dich.";
    out_oth="@@gname@@ wundert sich@@adverb@@"+(who ? " ueber @@wen@@." : ".");
    return FeelIt();

    /**************** Wuscheln ***************/
    case "wuschel":
    case "wuschl":
    HELPCHECK("wuschel");
    ParseRest(str);
    if (!who)
      Return("Wen willst Du denn wuscheln?\n");
    if (CheckLife(0,NOT_DEAD,
      "", "Hmm, sehr tot. Ne, lieber nicht."))
        return 1;
    if (who->QueryProp(P_FROG))  {
      write("Du verwuschelst...  aeh... hm. Ein Frosch hat wohl nix "
        +"zum Wuscheln.\n");
      return 1;
    };
    GHOSTCHECK("Du willst "+who->name(WEN)+" wuscheln - aber Deine "
        +"Haende gehen\nglatt durch den Kopf durch.\n",
      gname()+" will "+who->name(WEN)+" den Kopf wuscheln, aber "
        +"die Geister-\nhaende gehen glatt durch den Kopf durch.\n",
      gname()+" will Dich wuscheln, aber diese Geisterhaende "
        +"gehen\nglatt durch Deinen Kopf durch - Du hast ein seltsames "
        +"Gefuehl dabei.\n");
    if (member(({"highlander","boing","mieze","freund"}), who->query_real_name())>-1)
      switch (who->query_real_name())  {
        case "highlander": str1="Federn"; break;
        case "freund"    :
        case "mieze"     :
        case "boing"     : str1="Fell"; break;
      }
    else if (who->is_class_member(({CL_DRAGON, CL_FISH, CL_REPTILE})))
      str1="Schuppen";
    else if (who->is_class_member(({CL_BIRD, "elster","greif"})))
      str1="Federn";
    else if (who->is_class_member(({CL_MAMMAL_LAND,CL_FELINE,"tiger",
                                    "steinbeisser","knuddeleisbaer"})))
      str1="Fell";
    else if(who->is_class_member(({CL_PLANT})))
      str1="Blaetter";
    else str1="Haare";
    out_sel="Du verwuschelst@@adverb@@ @@wessen@@ "+str1+".";
    out_vic="@@name@@ verwuschelt@@adverb@@ Dein"
      +(str1=="Fell" ? " " : "e ")+str1+".";
    out_oth="@@name@@ verwuschelt@@adverb@@ @@wessen@@ "+str1+".";
    return FeelIt();

    /**************** Zitieren ***************/
    case "zitier":
    HELPCHECK("zitier");
    ParseRest(str);
    if (!str)
      Return("Zitiere was oder wen womit?\n");
    sfoo=implode(explode(str, " ")[1..], " ");
    if (sfoo=="") sfoo=0;
    if (who)  {
      out_sel="Du zitierst @@wen@@"+(sfoo ? ": \""+sfoo+"\"" : "")+".";
      out_vic="@@gname@@ zitiert Dich"+(sfoo ? ": \""+sfoo+"\"" : "")+".";
      out_oth="@@gname@@ zitiert @@wen@@"+(sfoo ? ": \""+sfoo+"\"" : "")+".";
    }
    else  {
      sfoo=explode(str, "/")[0];
      out_sel="Du zitierst@@adverb@@"+(sfoo ? ": \""+sfoo+"\"" : "")+".";
      out_oth="@@gname@@ zitiert@@adverb@@"+(sfoo ? ": \""+sfoo+"\"" : "")+".";
    }
    return FeelIt();

    /**************** Zittern ***************/
    case "zitter":
    HELPCHECK("zitter");
    ParseRest(str);
    if (str && !adverb)
      Return("Zittere wie?\n");
    out_sel="Du zitterst"+(adverb ? "@@adverb@@." : " vor Angst.");
    out_oth="@@gname@@ zittert"+(adverb ? "@@adverb@@." : " vor Angst.");
    return FeelIt();

    /**************** Schulterzucken ***************/
    case "zuck" :
    HELPCHECK("zuck");
          if (str)
      if (sscanf(str,"%s mit den schultern",sfoo))
        str=sfoo;
    else if (sscanf(str,"%s den schultern",sfoo))
      str=sfoo;
    else
      if (sscanf(str,"%s schultern",sfoo))
        str=sfoo;
    if (str=="") str=0;
    ParseRest(str);
    if (str && !adverb)
      Return("Zucke wie mit den Schultern?\n");
    out_sel="Du zuckst@@adverb@@ mit den Schultern.";
    out_oth="@@gname@@ zuckt"+(adverb ? "@@adverb@@" : " ratlos")
            +" mit den Schultern.";
    return FeelIt();

    /**************** Zwinkern ***************/
    case "zwinker":
    HELPCHECK("zwinker");
    if (ghost())
      Return("Vergiss es - das ist als Geist viel zu unauffaellig, als dass\n"
        +"es andere Leute sehen wuerden.\n");
    ParseRest(str);
    if (str && !who && !adverb)
      Return("Zwinkere wie? Zwinkere wem zu?\n");
    if (who && CheckLife(NOT_SELF,NOT_DEAD,
      "Du kannst Dir nicht selber zuzwinkern.",
      "Wieso reagiert das Ding da nicht auf Dein Zwinkern? Ist es etwa tot?"))
        return 1;
    out_sel="Du zwinkerst@@ wem@@@@adverb@@"+(who ? " zu." : ".");
    if (who) out_vic="@@name@@ zwinkert Dir@@adverb@@ zu.";
    out_oth="@@name@@ zwinkert@@ wem@@@@adverb@@"+(who ? " zu." : ".");
    return FeelIt();

    /**************** Zunge rausstrecken ***************/
    case "streck":
    HELPCHECK("streck");
    GHOSTCHECK("Sorry, Du hast keine Zunge zum Rausstrecken.\n","",0);
    if (!str)
      Return("Strecke was wie wem wo wann wieso?\n");
    str=lower_case(str);
    if (sscanf(str, "%s zunge raus", str1)!=1 &&
    sscanf(str, "%s die zunge raus", str1)!=1)
      Return("Strecke was wie wem wo wann wieso?\n");
    ParseRest(str1);
    if (for_all)  {
      out_sel="Du streckst @@alle@@@@adverb@@ die Zunge raus.";
      out_vic="@@name@@ streckt @@alle@@@@adverb@@ die Zunge raus.";
      return MixedOut(WEM);
    }
    out_sel="Du streckst@@ wem@@@@adverb@@ die Zunge raus.";
    if (who) out_vic="@@name@@ streckt Dir@@adverb@@ die Zunge raus.";
    out_oth="@@name@@ streckt@@ wem@@@@adverb@@ die Zunge raus.";
    return FeelIt();

    // Spezialsachen - Geisterverben und Magierverben

    /**************** Rasseln ***************/
    case "rassel":
    case "rassl":
    if (!ghost())
      Return("Das ist nicht Dein Fachgebiet - Du bist doch kein Geist!\n");
    HELPCHECK("rassel");
    ParseRest(str);
    if (str && !adverb)
      Return("Rassel wie?\n");
    out_sel="Du rasselst"+(adverb ? "@@adverb@@" : " fuerchterlich")
      +" mit einer rostigen Rasselkette,\n"
      +"die Du auf einmal fuer einen Moment in der Hand haeltst.";
    out_oth="@@gname@@ holt auf einmal eine rostige Rasselkette aus\n"
      +"dem Nichts und faengt an,"+(adverb ? "@@adverb@@" : " fuerchterlich")
      +" damit zu rasseln.\n"
      +"Danach ist die Kette auf einmal wieder verschwunden.";
    return FeelIt();

    /**************** Heulen ***************/
    case "heul":
    if (!ghost())
      Return("Lass das mal den Fachleuten (also den Geistern).\n");
    HELPCHECK("heul");
    ParseRest(str);
    if (str && !adverb)
      Return("Heule wie?\n");
    out_sel="Du heulst"+(adverb ? "@@adverb@@." : " schauerlich.");
    out_oth="@@gname@@ heult"+(adverb ? "@@adverb@@." : " schauerlich.");
    return FeelIt();

    /**************** Treten (tretet) ***************/
    case "kick":
    if (!IS_WIZARD(this_player()))
      return 0;
    HELPCHECK("kick");
    if (!str)  {
      GHOSTCHECK("Dein Fuss faehrt durch die beruehmte langvergessene "
          +"unsichtbare Schildkroete\nhindurch.\n",
        gname()+" will die beruehmte langvergessene unsichtbare\n"
          +"Schildkroete treten, aber "+QPP(MALE,WER)
          +" Fuss faehrt durch sie hindurch.\n", 0);
      out_sel="Du tretest die beruehmte langvergessene unsichtbare "
        +"Schildkroete.";
      out_oth="@@name@@ tretet die beruehmte langvergessene unsichtbare "
        +"Schildkroete.";
    }
    else  {
      ParseRest(str);
      if (for_all)  {
        out_sel="Du tretest @@alle@@@@adverb@@.";
        out_vic="@@name@@ tretet @@alle@@@@adverb@@.";
        return MixedOut(WEN);
      }
      if (!who && !adverb)
        Return("Wenn Du schon was nach kick tippst, dann sag mir wen "
          +"oder wie ichdas soll.\n");
      if (who && CheckLife(NOT_SELF,NOT_DEAD,
        "Du schaffst es nicht, Dir selber in den Hintern zu treten.",
        "Tote Sachen tritt man nicht auch noch!"))
          return 1;
      if (who)  {
        out_sel="Du tretest@@ wen@@@@adverb@@.";
        if (who) out_vic="@@gname@@ tretet Dich@@adverb@@.";
        out_oth="@@gname@@ tretet@@ wen@@@@adverb@@.";
      }
      else  {
        out_sel="Du tretest die beruehmte langvergessene unsichtbare "
          +"Schildkroete@@adverb@@.";
        out_oth="@@gname@@ tretet die beruehmte langvergessene unsichtbare "
          +"Schildkroete\n@@adverb@@.";
      }
    }
    return FeelIt();

    /************* Nassspritzen ***************/
    case "splash":
    if (!IS_WIZARD(this_player()) &&
    !(IS_SEER(this_player()) && present("SEHER\nspritzpistole",this_player())))
      return 0;
    HELPCHECK("splash");
    ParseRest(str);
    if (for_all)  {
      out_sel="Du ziehst Deine Wasserpistole und spritzt @@alle@@@@adverb@@ "
        +"patschnass.";
      out_vic="@@gname@@ zieht "+QPP(FEMALE,WEN)+" Wasserpistole und spritzt\n"
        +"@@alle@@@@adverb@@ patschnass.";
      return MixedOut(WEN);
    }
    if (!who)
      Return("Wen willst Du denn nassmachen?\n");
    if (who == this_player())  {
      out_sel="Sag mal, kommst Du Dir nicht ein bisschen doof vor?\n"
        +"Du ziehst Deine Wasserpistole und spritzt Dich@@adverb@@ selber patschnass.";
      out_oth="@@gname@@ zieht "+QPP(FEMALE,WEN)+" Wasserpistole und spritzt "
        +"sich@@adverb@@ aus unerfindlichen Gruenden selbst patschnass.";
    }
    else  {
      out_sel="Du ziehst Deine Wasserpistole und spritzt @@wen@@@@adverb@@ "
        +"patschnass.";
      out_vic="@@gname@@ zieht "+QPP(FEMALE,WEN)+" Wasserpistole und spritzt "
        +"Dich@@adverb@@ patschnass.";
      out_oth="@@gname@@ zieht "+QPP(FEMALE,WEN)+" Wasserpistole und spritzt "
        +"@@wen@@@@adverb@@ patschnass.";
    }
    return FeelIt();

    /**************** Anflammen ***************/
    case "flam":
    if (!IS_WIZARD(this_player()) &&
    !(IS_SEER(this_player()) && present("SEHER\nflammenwerfer",this_player())))
      return 0;
    HELPCHECK("flame");
    if (ghost())
      Return("Du hast leider grade Deinen Flammenwerfer nicht dabei.\n");
    ParseRest(str);
    ifoo=!random(7);
    if (for_all)  {
      out_sel="Du holst aus Deinen tiefsten Taschen (oder was weiss denn "
        +"ich woher) Deinen\nMorgenGrauen handgearbeiteten Mini-Flammenwerfer "
        +"(tm), richtest ihn aus und...\n"
        +(ifoo ? "schaust leicht frustriert auf das Streichholz, in das "
          +"er sich verwandelt hat."
        : "feuerst@@adverb@@ einen riesigen Feuerball auf @@alle@@ ab.\n"
          +"Es riecht auf einmal so verbrannt hier...");
      out_vic="@@name@@ holt auf einmal irgendwoher einen MorgenGrauen "
        +"handgearbeiteten\nMini-Flammenwerfer (tm), richtet ihn aus und...\n"
        +(ifoo ? "schaut ziemlich frustriert auf das Streichholz, in das "
          +"sich das Ding verwandelt hat."
        : "feuert@@adverb@@ einen riesigen Feuerball auf @@alle@@ ab.\n"
          +"Dir wird so warm um's Herz...");
      return MixedOut(WEN);
    }
    if (!who)
      Return("Wen willst Du denn ankokeln?\n");
    out_sel="Du holst aus Deinen tiefsten Taschen (oder was weiss denn "
      +"ich woher) Deinen\nMorgenGrauen handgearbeiteten Mini-Flammenwerfer "
      +"(tm), richtest ihn aus und...\n"
      +(ifoo ? "schaust leicht frustriert auf das Streichholz, in das er "
        +"sich verwandelt hat."
      : "feuerst@@adverb@@ einen riesigen Feuerball auf @@wen@@ ab.\n"
        +"Es riecht auf einmal so verbrannt hier...");
    out_vic="@@name@@ holt auf einmal irgendwoher einen MorgenGrauen "
      +"handgearbeiteten\nMini-Flammenwerfer (tm), richtet ihn auf Dich "
      +"aus und...\n"
      +(ifoo ? "schaut ziemlich frustriert auf das Streichholz, in das "
        +"sich das Ding\nverwandelt hat."
      : "feuert@@adverb@@ einen riesigen Feuerball auf Dich ab.\n"
        +"Dir wird so warm ums Herz...");
    out_oth="@@name@@ holt auf einmal irgendwoher einen MorgenGrauen "
      +"handgearbeiteten\nMini-Flammenwerfer (tm), richtet ihn "
      +"auf@@ wen@@ aus und...\n"
      +(ifoo ? "schaut ziemlich frustriert auf das Streichholz, in das "
        +"sich das Ding\nverwandelt hat."
      : "feuert@@adverb@@ einen riesigen Feuerball auf@@ wen@@ ab.\nEs "
        +"riecht auf einmal irgendwie verbrannt hier ...");
    return FeelIt();

    // Special 2: remote verbs

    /**************** Remote knuddeln ***************/
    case "rknuddel":
    case "rknuddl":
    HELPCHECK("rknuddel");
    if (ParseRemote(str))
      return 1;
    if (!who)
      Return("Knuddle wen?\n");
    if (CheckLife(NOT_SELF,0,
      "Das bringt doch nix, lass es halt.",
      0))
        return 1;
    if (present(who, environment()))
      Return("Wenn jemand neben Dir steht, nimm knuddel.\n");
    out_sel="Du knuddelst @@wen@@@@adverb@@ aus der Ferne.";
    out_vic="@@gname@@ knuddelt Dich@@adverb@@ aus der Ferne.";
    return FeelIt();

    /**************** Remote winken ***************/
    case "rwink":
    HELPCHECK("rwink");
    if (ParseRemote(str))
      return 1;
    if (!who)
      Return("Winke wem zu?\n");
    if (CheckLife(NOT_SELF,0,
      "Sehr witzig. Pah.", 0))
        return 1;
    if (present(who, environment()))
      Return("Wenn jemand neben Dir steht, nimm wink.\n");
    out_sel="Du winkst @@wem@@@@adverb@@ aus der Ferne zu.";
    out_vic="@@gname@@ winkt Dir@@adverb@@ aus der Ferne zu.";
    return FeelIt();

    /**************** Verbenliste ***************/
    case "verb":
    case "verben":
    HELPCHECK("verb");
    More(SOULHELP->Help());
    return 1;

    /**************** Adverbienverwaltung ***************/
    case "adverb":
    case "adverben":
    case "adverbien": {   /* Das ist die richtige Form, aber wer weiss das? */
    string f1,f2;
    HELPCHECK("adverb");
    if (!str || str=="#" || str=="$")
      return zeige_adverbs((str=="#" ? 1 : (str=="$" ? 2 : 0)));
    if (sscanf(str, "%s %s", f1,f2)==2)  {
      f1 = lower_case(f1); // kleingeschrieben speichern, spart Umwandlung
      if (f1=="")
        Return("Hm, da muss wohl ein Leerzeichen zu viel gewesen sein. Bitte "
          +"nochmal,\naber ohne zuviele Leerzeichen.\n");
      if (f1=="?")  {
        f2 = lower_case(f2);
        string match;
        if ((match=QueryStdAdverbs()[f2] || plr_adverbs[f2]))
          write("Die Abkuerzung "+f2+" gehoert zu dem Adverb:\n"+match+LF);
        else
          write("Diese Abkuerzung ist bisher nicht definiert.\n");
        return 1;
      }
      if (QueryStdAdverbs()[f1])
        Return("Die Standardabkuerzungen koennen nicht neu definiert "
          +"werden.\n");
      if (sizeof(plr_adverbs)>=100) 
      {
        write("Mehr als 100 eigene Adverbien kannst Du nicht definieren.\n");
        return 1;
      }
      if (plr_adverbs[f1])  {
        plr_adverbs[f1]=f2;
        write("OK, Adverb mit der Abkuerzung \""+f1+"\" auf \""+f2
          +"\" gesetzt.\n");
      }
      else  {
        if (sizeof(f1) > 6)
          Return("Die Abkuerzung ist zu lang, bitte nicht mehr als "
            +"6 Zeichen.\n");
        plr_adverbs[f1]=f2;
        write("OK, neues Adverb \""+f2+"\" mit der Abkuerzung \""+f1+"\".\n");
      }
    }
    else  {
      str = lower_case(str);
      if (QueryStdAdverbs()[str])
        Return("Die Standardadverben koennen nicht geloescht werden.\n");
      else if (!plr_adverbs[str])
        Return("Du hast kein Adverb mit dieser Abkuerzung.\n"
          +"Syntax: adverb, um die Adverbien anzuzeigen,\n"
          +"        adverb #, um nur Deine Adverbien anzuzeigen,\n"
          +"        adverb $, um nur die Standardadverbien anzuzeigen,\n"
          +"        adverb ? <Abkuerzung>, um nachzusehen, ob <Abkuerzung> "
            +"definiert ist,\n"
          +"        adverb <Abkuerzung> <Adverb>, um der <Abkuerzung> das "
            +"<Adverb>\n"
          +"               zuzuordnen,\n"
          +"        adverb <Abkuerzung>, um das Adverb mit der <Abkuerzung> "
            +"zu loeschen,\n");
      else  {
        write("OK, Adverb \""+plr_adverbs[str]+"\" geloescht.\n");
        plr_adverbs=m_copy_delete(plr_adverbs, str);
      }
    }
    return 1; 
    }
  }
  return(0);  //fallthrough
}

