//  usercmd.c -- Modul fuer benutzerdefinierte Befehle
//
//  (c) 1995 Wargon@MorgenGrauen
//
// $Id: usercmd.c,v 1.4 2003/11/15 13:48:46 mud Exp $
//

#define NEED_PROTOTYPES
#include "../haus.h"
#include <properties.h>
#include <wizlevels.h>
#include <thing/properties.h>
#include <thing/commands.h>

private string ucFilter(string str);
private string ucText(string str);
private void splitCmd(string *cmd, string *verb, string *para);

protected void create()
{
  Set(H_COMMANDS, SAVE, F_MODE);
  Set(H_COMMANDS, ([]));

  AddCmd("", "userCommands", 1);
}

/*
 * AddUserCmd: eigenes Kommando hinzufuegen
 *  cmd: String oder Array von Strings. Enthaelt entweder nur die Verben oder
 *         die kompletten Befehle (Verb + Parameter). Siehe auch pa.
 *  pa:  Zahl oder Array von Strings. Falls pa eine Zahl ist, so enthaelt cmd
 *         die kompletten Befehle (samt Parametern). Ansonsten enthaelt pa die
 *         Parameter fuer das entsprechende Verb in cmd.
 *         Ist pa = ({ "@NF@"}) , so handelt es sich um ein notify_fail, das an
 *         die Beschreibung des Verbs (falls vorhanden) angehaengt wird.
 *  me:  Text fuer den Ausfuehrenden. Der Text muss schon geparsed worden
 *         sein!
 *  oth: Text fuer die Umstehenden oder 0. Der Text muss schon geparsed wor-
 *         den sein!
 */
varargs void
AddUserCmd(mixed cmd, mixed pa, string me, string oth)
{
  int v,p;
  mapping cmds, desc;
  string *verb, *para, txt;

  cmds = Query(H_COMMANDS);
  if (stringp(cmd))
    verb = ({ cmd });
  else
    verb = cmd;

  if (intp(pa))
    splitCmd(verb[0..], &verb, &para);
  else {
    if (stringp(pa))
      para = ({ pa });
    else if (pointerp(pa))
      para = pa;
    for (desc = ([]), p=sizeof(para)-1; p>=0; p--)
      desc += ([ para[p] : me; oth ]);
  }

  for (v = sizeof(verb)-1; v>= 0; v--) {
    if (member(cmds, verb[v])) {
      if (intp(pa))
        cmds[verb[v]] += ([para[v] : me; oth ]);
      else
        cmds[verb[v]] += desc;
    }
    else {
      if (intp(pa))
        cmds += ([ verb[v] : ([para[v] : me; oth ]) ]);
      else
        cmds += ([ verb[v] : desc ]);
    }
  }
  Set(H_COMMANDS, cmds);
}

/*
 * RemUserCmd: Kommando(s) wieder entfernen
 *  com: String oder Array von Strings. Enthaelt das zu loeschende Kommando
 *         (Verb oder Verb + Parameter).
 *  all: Falls != 0, so werden die Verben aus com komplett mit allen Para-
 *         metern geloescht.
 */
varargs void
RemUserCmd(mixed com, int all)
{
  mapping cmd, tmp;
  string *verb, *para;
  int v, p;

  cmd = Query(H_COMMANDS);
  splitCmd(stringp(com) ? ({com}) : com, &verb, &para);

  if (all)
    for (v=sizeof(verb)-1; v>=0; v--)
      cmd = m_copy_delete(cmd, verb[v]);
  else {
    for (v=sizeof(verb)-1; v>=0; v--) {
      if (tmp = cmd[verb[v]]) {
        for (p=sizeof(para)-1; p>=0; p--)
          tmp = m_copy_delete(tmp, para[p]);
        cmd[verb[v]] = tmp;
      }
    }
  }
  Set(H_COMMANDS,cmd);
}

/*
 * userCommands: Auswertung der benutzerdefinierten Befehle.
 */
static int
userCommands(string str)
{
  mapping ucmd, uparm;
  string *parts, text;
  int i;

  ucmd = QueryProp(H_COMMANDS);
  str = this_player()->_unparsed_args(1)||"";
  if (uparm = ucmd[query_verb()]) {
    if (member(uparm, str)) {
      text = ucText(uparm[str,0]);
      if (sizeof(old_explode(text, "\n")) >= this_player()->QueryProp(P_SCREENSIZE))
        this_player()->More(capitalize(text)[0..<2]);
      else
        write(capitalize(text));

      if (uparm[str,1])
        say(ucText(uparm[str,1]));

      if (member(m_indices(QueryProp(P_EXITS)), query_verb()) == -1)
        return 1;
    }
    else {
      if (str && str != "" && text = uparm["@NF@"])
        notify_fail(implode(old_explode(text,"@F"),str));
    }
  }
  return 0;
}

/*** Functions private to this module... ***/

/*
 * ucFilter: Ersetzen von Name, Personal- und Possessivpronomen.
 *  Gibt den ersetzten String zurueck.
 */
private string
ucFilter(string str)
{
  int p,g;

  switch(str[0..1]) {
    case "@W": // Name in entsprechendem Fall...
      return this_player()->name(to_int(str[2..2]));
    case "@P": // Personalpronomen in entprechendem Fall...
      return this_player()->QueryPronoun(to_int(str[2..2]));
    case "@B": // Possesivpronomen in entprechendem Fall...
      p = to_int(str[4..4]);
      g = to_int(str[3..3]);
      return this_player()->QueryPossPronoun(g, to_int(str[2..2]), p);
  }
  return str;
}

/*
 * ucText: Rassen- und geschlechtsspezifische Teile bearbeiten sowie
 *  Namen und Pronomina einsetzen.
 *
 *  str enthaelt den String, der beim Beschreiben des Befehls
 *  eingegeben wurde. Bis auf den Default-Text sind alle Teile
 *  optional. Der String kann folgenden Aufbau haben:
 *  ------ schnipp ------
 *  Default-Text, der ausgegeben wird, wenn die folgenden spezielleren
 *  Texte nicht auftreten oder auf den Ausfuehrenden nicht zutreffen
 *  @NAME:nameA
 *  Text, der ausgegeben wird, wenn der Spieler "nameA" das Kommando
 *  eingegeben hat
 *  @NAME:nameB
 *  Und so weiter fuer Spieler "nameB" etc...
 *  @RA
 *  Text, der ausgegeben wird, wenn der Ausfuehrende auf der Erlaube-
 *  Liste des Hauses steht.
 *  @RE
 *  Text, der ausgegeben wird, wenn der Ausfuehrende ein Elf
 *  ist. Ebenso gibt es @RD fuer Dunkelelfen, @RF fuer Felinen,
 *  @RH fuer Hobbits, @RM fuer Menschen, @RG fuer Goblins, @RO fuer Orks
 *  und @RZ fuer Zwerge.
 *  ------ schnapp ------
 *
 *  Der Default-Text muss immer am Anfang stehen. Die anderen Bloecke
 *  koennen in beliebiger Reihenfolge folgen. Die Reihenfolge, in der
 *  die Bloecke betrachtet werden, ist dabei folgende:
 *  - zuerst werden @NAME-Bloecke untersucht
 *  - dann wird @RA (Erlaube-Liste) getestet
 *  - danach wird die Rasse ueberprueft (@RD/@RE/@RF/@RH/@RM/@RZ/@RG/@RO)
 *  - zuletzt wird der Default-Text betrachtet
 *
 *  Innerhalb jedes der Bloecke kann man noch mit @G zwischen
 *  maennlichen und weiblichen Vertretern unterscheiden (bei @NAME:
 *  macht das aber wenig Sinn). Beispiel:
 *  ------ schnipp ------
 *  @RZ
 *  Der Zwerg war maennlich
 *  @G
 *  Der Zwerg war weiblich
 *  ------ schnapp ------
 *
 *  Die Funktion gibt den fuer den Ausfuehrenden zutreffenden Text
 *  zurueck.
 */
private string
ucText(string str)
{
  string *parts, *names, *lnames;
  int i, n;

  // Text nach Namen- und Rassentrennern aufteilen
  parts = regexplode(str, "(@NAME:[A-Za-z1-9]*\n)|(@R[A-Z]\n)");
  i = -1;

  if (sizeof(parts) > 1) {

    // Zuerst wird nach Namenstrennern gesucht
    names = regexp(parts, "@NAME:");

    if (sizeof(names) > 0) {
      // ein kleiner Umweg, da der Name im Eingabestring nicht
      // notwendigerweise in Kleinbuchstaben vorliegt.
      lnames = map(names, #'lower_case);
      n = member(lnames, "@name:"+getuid(this_player())+"\n");

      if (n >= 0) {
        i = member(parts, names[n]);
      }
    }

    // Kein passender Namenstrenner gefunden: Erlaube-Liste
    // ueberpruefen
    if (i<0 && allowed_check(this_player())) {
      i=member(parts, "@RA\n");
    }

    // Weder Namenstrenner noch Erlaube-Liste passen: Rasse
    // ueberpruefen
    if (i<0) {
      switch(this_player()->QueryProp(P_RACE)) {
        case "Zwerg":
          i=member(parts, "@RZ\n");
          break;
        case "Elf":
          i=member(parts, "@RE\n");
          break;
        case "Feline":
          i=member(parts, "@RF\n");
          break;
        case "Hobbit":
          i = member(parts, "@RH\n");
          break;
        case "Dunkelelf":
          i = member(parts, "@RD\n");
          break;
        case "Goblin":
          i = member(parts, "@RG\n");
          break;
        case "Ork": 
          i = member(parts, "@RO\n");
          break;
        default:
          i=member(parts, "@RM\n");
          break;
      }
    }
    
    // Den richtigen Teil des Strings herauspicken
    if (i>-1)
      str = parts[i+1];
    else
      str = parts[0];
  }
  if (sizeof(parts = old_explode(str, "@G\n"))==2)
    str = parts[(this_player()->QueryProp(P_GENDER) == MALE ? 0 : 1)];

  parts = regexplode(str, "(@W[0-3]|@P[0-3]|@B[0-3][0-2][0-1])");
  parts = map(parts, #'ucFilter);
  return implode(parts, "");
}

/*
 * splitCmd: Komplettes Kommando in Arrays von Verben und Parametern zerlegen.
 *  cmd: Array von Strings. Dieses Array enthaelt die aufzuspaltenden Befehle.
 *  verb: Referenz auf ein Array von Strings fuer die Verben.
 *  para: Referenz auf ein Array von Strings fuer die Parameter.
 */
private void splitCmd(string *cmd, string *verb, string *para)
{
  int c, sp;

  for (verb = ({}), para = ({}), c = sizeof(cmd)-1; c>=0; c--) {
    if ((sp=member(cmd[c], ' ')) >= 0) {
      verb += ({ cmd[c][0..sp-1] });
      para += ({ cmd[c][sp+1..] });
    }
    else {
      verb += ({ cmd[c] });
      para += ({ "" });
    }
  }
}

// $Log: usercmd.c,v $
// Revision 1.4  2003/11/15 13:48:46  mud
// @RD als Trenner fuer Dunkelelfen
//
// Revision 1.3  2000/12/03 17:15:40  mud
// ucText: Neuer Trenner @NAME:foo, mit dem man in Seherhausbefehlen
// Texte fuer bestimmte Spieler vorsehen kann.
//
// Revision 1.2  2000/08/20 20:38:40  mud
// @RF als Trenner fuer Felinen
//
// Revision 1.1.1.1  2000/08/20 20:22:42  mud
// Ins CVS eingecheckt
//
// Revision 1.4  1996/04/19  23:10:52  Wargon
// @RA fuer Leute mit Erlaubnis
//
// Revision 1.3  1995/10/31  12:59:52  Wargon
// @RH fuer Hobbits
//
// Revision 1.2  1995/06/22  19:48:31  Wargon
// Bugfix in userCommands()
//
// Revision 1.1  1995/04/21  09:22:50  Wargon
// Initial revision
//
