/*
 *  The new ultimate quest administration tool
 */

/* AENDERUNGEN
 * 2006-09-29 : Zook
 *              Questtool an neue Felder "Attribute" und "Klasse"
 *              angepasst.
 * 2000-11-18 : Zook:
 *		Questtool um neues Feld "Wartender Magier" des Questmaster
 *		erweitert.
 * 2000-11-18 : Zook:
 *		Questtool um neues Feld "Gruppeneinordnung" des Questmaster
 *		erweitert.
 */

inherit "/std/secure_thing";
inherit "/std/more";

#include <defines.h>
#include <properties.h>
#include <language.h>
#include <wizlevels.h>
#include "/secure/questmaster.h"

#define UA this_interactive()->_unparsed_args()

#define QNAME	0
#define QP	1
#define XP	2
#define ALLOW	3
#define INFO	4
#define LEVEL	5
#define CLASS	6
#define ATTR	7
#define WIZ	8
#define SCNDWIZ 9
#define END    10

#pragma strong_types

private void Load_NumKey();
int  Add_Quest	     ( string str );
void ReadNewQuest    ( string str );
int  Remove_Quest    ( string str );
int  Change_Quest    ( string str );
int  Restore_Quest   ( string str );
int  Set_Quest	     ( string str );
int  Remove_Quest    ( string str );
int  Query_Quest     ( string str );
int  Query_Keys      ( string str );
int  Query_Quests    ( string str );
int  ActivateQuest   ( string str );
int  DeactivateQuest ( string str );
int  GetReturn	     ( string str );

string name;
int    qp;
int    xp;
int    level;
int    need;
string *allowed;
string info;
string wizard;
string scndwizard;
int    group;
mapping num_key;

object owner;
int    counter;
mixed  *savequest;
string savekey;
int    do_change;
string changekey;

void create()
{
  string str;

  if(IS_BLUE(ME)) return;
  secure_thing::create();
  SetProp(P_GENDER,NEUTER);
  owner = PL;
  AddId("questtool");
  AddId("qt");
  SetProp(P_ARTICLE,0);
  SetProp(P_GENDER, NEUTER);
  str=capitalize(((str=owner->query_real_name())[<1]=='s'||str[<1]=='x'||str[<1]=='z')?str+="'":str+="s");
  SetProp(P_NAME, str+" QuestTool");
  SetProp(P_SHORT, str+" QuestTool");
  SetProp(P_LONG,
   "Das QuestTool dient der Administration von Quests. (by Kirk, 10.11.94)\n"
  +"implementierte Kommandos:\n"
  +"  AddQ			    : Neuen Questeintrag einfuegen\n"
  +"  RemoveQ	  <quest>	    : Questeintrag loeschen\n"
  +"  ChangeQ	  <quest>	    : Questeintrag aendern\n"
  +"  ReStoreQ			    : Zuletzt geloeschten oder geaenderten\n"
  +"				    : Questeintrag restaurieren\n"
  +"  SetQ	  <spieler> <quest> : Quest als 'geloest' markieren\n"
  +"  DelQ	  <spieler> <quest> : Quest als 'nicht geloest' markieren\n"
  +"  QueryQ	  <quest>	    : Questeintrag anzeigen\n"
  +"  QueryK			    : Alle Keys und Indices anzeigen\n"
  +"  QueryAllQ 		    : Alle Eintraege vollstaendig anzeigen\n"
  +"  ActiVateQ   <quest>	    : Quest im Questmaster aktivieren\n"
  +"  DeactiVateQ <quest>	    : Quest im Questmaster deaktivieren\n\n"
  +"  fuer <quest> kann der Index verwendet werden, den QueryK liefert!\n\n"
  +"  (Alle Kommandos koennen abgekuerzt werden.)\n"
	+"   -> Beispiel: DeactiVateQ == DVQ == dvq == deactivateq\n");

  SetProp(P_NEVERDROP, 1);
  SetProp(P_NODROP, 
  "Mit Hilfe des QuestTools koennen Quests eingetragen, oder geloescht\n"+
  "werden. Du brauchst es vielleicht noch, deshalb wirfst Du es nicht weg.\n");
  SetProp(P_NOBUY, 1);
  AddCmd(({ "AddQ", "addq", "AQ", "aq" }),		   "Add_Quest");
  AddCmd(({ "RemoveQ", "removeq", "RQ", "rq" }),	   "Remove_Quest");
  AddCmd(({ "ChangeQ", "changeq", "CQ", "cq" }),	   "Change_Quest");
  AddCmd(({ "ReStoreQ", "restoreq", "RSQ", "rsq" }),	   "Restore_Quest");
  AddCmd(({ "SetQ", "setq", "SQ", "sq" }),		   "Set_Quest");
  AddCmd(({ "DelQ", "delq", "DQ", "dq" }),		   "Del_Quest");
  AddCmd(({ "QueryQ", "queryq", "QQ", "qq" }),		   "Query_Quest");
  AddCmd(({ "QueryK", "queryk", "QK", "qk" }),		   "Query_Keys");
  AddCmd(({ "QueryAllQ", "queryallq", "QAQ", "qaq" }),	   "Query_Quests");
  AddCmd(({ "ActiVateQ", "activateq", "AVQ", "avq" }),	   "ActivateQuest");
  AddCmd(({ "DeactiVateQ", "deactivateq", "DVQ", "dvq" }), "DeactivateQuest");
  counter = QNAME;
  savekey = "";
  do_change = 0;
  num_key = ([]);
}

int _query_autoloadobj() { return 1; }

public varargs void init(object oldenv)
{
  object tp;

  if(!(tp = PL) || tp != environment())
    return;

  secure_thing::init(oldenv);

  if ( !IS_WIZARD(tp) || tp != owner )
    return call_out("do_remove",1);
}

static void do_remove()
{
  write ( ME->QueryProp(P_SHORT)+" zerfaellt zu Staub.\n");
  say ( ME->QueryProp(P_SHORT)+" zerfaellt in "+PL->name(WESSEN)+
       " unbefugten Haenden zu Staub.\n");
  call_out("remove",1);
}

private void Load_NumKey()
{
  string *keys;
  int i;

  if ( !(keys = ({string*}) QM->QueryAllKeys()) ) return;
  keys=sort_array(keys,#'>);//')
  for ( i = 0, num_key = ([]); i < sizeof(keys); i++ )
    num_key += ([(i+1)+"":keys[i]]);
}

int Add_Quest(string str)
{
  counter = QNAME;
  write ( "Neue Quest: (Abbruch mit '.' oder '~q')\n" );
  write ( "Key :\n" ); 
  input_to ( "ReadNewQuest" );
  return 1;
}

void ReadNewQuest (string str)
{
  mixed *oldquest;
  int errstat;
  int active;

  if ( str == "~q" || str == "." )
  {
    counter = QNAME;
    if(do_change)
    {
      do_change = 0;
      changekey = "";
      savekey = "";
      savequest = ({});
    }
    return;
  }

  switch ( counter )
  {
    case QNAME:
      if((!str||!sizeof(str)) && do_change)
	name = savekey;
      else
	name = str;
      counter++;
      write ( sprintf("Punkte (>0) [%d]:\n",
		      (do_change ? savequest[0] : 10)) ); 
      input_to ( "ReadNewQuest" );
      break;
    case QP:
      if((!str||!sizeof(str)))
	if(do_change)
	  qp = ({int})savequest[Q_QP];
	else
	  qp = 10;
      else
	sscanf ( str, "%d", qp );
      counter++;
      write ( sprintf("Erfahrung (>=0) [%d]:\n",
		      (do_change ? savequest[1] : qp*1000)));
      input_to ( "ReadNewQuest" );
      break;
    case XP: 
      if((!str||!sizeof(str)))
	if(do_change)
	  xp = ({int})savequest[Q_XP];
	else
	  xp = qp * 1000;
      else
	sscanf ( str, "%d", xp );
      counter++;
      write ( sprintf("Filenamen file1[,file2,...]) %s:\n",
		      (do_change?"["+implode(savequest[2],",")+"]":
		       "")) );
      input_to ( "ReadNewQuest" );
      break;
    case ALLOW:
      if((!str||!sizeof(str)) && do_change)
	allowed = ({string *}) savequest[Q_ALLOWED];
      else
	allowed = old_explode(implode(old_explode(str,".c"),""),",");
      counter++;
      write ( sprintf("Info %s:\n", (do_change?
				     "["+break_string("\b\b\b\b\b\b"+({string})
						      savequest[3]+"]",78,6)
				     :"")) ); 
      input_to ( "ReadNewQuest" );
      break;
    case INFO:
      if((!str||!sizeof(str)) && do_change)
	info = ({string}) savequest[Q_HINT];
      else
	info = str;
      counter++;
      write ( sprintf("Stufe (-1 <=lev<=10) (-1 ist eine Seherquest) [%d]:\n",
		      (do_change ? savequest[4] : 0)) );
      input_to ( "ReadNewQuest" );
      break;
    case LEVEL:
      if((!str||!sizeof(str)))
	if(do_change)
	  level = ({int}) savequest[Q_DIFF];
	else
	  level = 0;
	sscanf ( str, "%d", level );
      counter++;
      write ( sprintf("Klasse ([012345]) [%d]:\n",
		      (do_change ? savequest[5] : 0)) ); 
      input_to ( "ReadNewQuest" );
      break;
    case CLASS:
      if((!str||!sizeof(str)))
	if(do_change)
	  need = ({int})savequest[Q_CLASS];
	else
	  need = 0;
      else
	sscanf ( str, "%d", need );
      counter++;
      write ( sprintf("Attribut [01234]\n(1=fleissig,2=heroisch,3=episch,4=legendaer) %s:\n",
		      (do_change?"["+savequest[9]+"]":"")) );
      input_to ( "ReadNewQuest" );
      break;
    case ATTR:
      if ((!str||!sizeof(str)))
	if (do_change)
	  group = ({int})savequest[Q_ATTR];
	else
	  group = 0;
      else
	sscanf (str, "%d", group);
      counter++;
      write ( sprintf("Magier %s:\n",
		      (do_change?"["+savequest[7]+"]":"")) );
      input_to ( "ReadNewQuest" );
    break;	
    case WIZ:
      if((!str||!sizeof(str)) && do_change)
        wizard = ({string})savequest[Q_WIZ];
      else
        wizard = str;
      wizard = lower_case(wizard);
      counter++;
      write ( sprintf("Wartender Magier %s:\n",
		      (do_change?"["+({string})savequest[8]+"]":"")) );
      input_to ( "ReadNewQuest" );
      break;
    case SCNDWIZ:
      if ((!str||!sizeof(str)) && do_change)
        scndwizard = ({string}) savequest[Q_SCNDWIZ];
      else
        scndwizard = str;
      scndwizard = lower_case(scndwizard);
      counter++;
      write ( "Eintragen (j/n)?\n" );
      input_to ( "ReadNewQuest" );
      break;
    case END:
      counter=QNAME;

      if ( str != "j" && str != "ja" && str != "y" && str != "yes" )
	return;

      active = 0;
      if ( do_change && changekey && sizeof(changekey) )
      {
        oldquest = ({mixed *}) QM->QueryQuest ( changekey );

	if ( !pointerp ( oldquest ) || !sizeof ( oldquest ) )
	{
	  write ( "Alten Eintrag nicht gefunden.\n" );
	  return;
	}

	errstat = ({int}) QM->RemoveQuest( changekey );

	do_change = 0;
	changekey = "";

	switch ( errstat )
	{
	  case	0: write ( "Zugriff auf alten Eintrag verweigert.\n" ); return;
	  case -1: write ( "Parameterfehler beim Loeschen.\n" ); return;
	  case -2: write ( "Alten Eintrag nicht gefunden.\n" ); return;
	  default: write ( "Alter Eintrag geloescht.\n" );
	}
	active = oldquest[6];
	savequest = oldquest;
	savekey   = changekey;
      }

      // add new Quest deactivated by default and keep old active flag
      // if changing an existing entry
      errstat= ({int})QM->AddQuest(name,qp,xp,allowed,info,level,need,active,
				 wizard, scndwizard, group);

      switch ( errstat )
      {
	case  0: write ( "Zugriff verweigert.\n" ); break;
	case -1: write ( "Key ungueltig oder sizeof(key) < 5.\n" ); break;
	case -2: write ( "QP ungueltig oder < 1.\n" ); break;
	case -3: write ( "XP ungueltig.\n" ); break;
	case -4: write ( "Filename(n) ungueltig.\n" ); break;
	case -5: write ( "Info ungueltig.\n" ); break;
	case -6: write ( "Stufe ungueltig oder < 0 oder > 20.\n" ); break;
	case -7: write ( "Aktiv-Flag < 0 oder > 1.\n" ); break;
	case -8: write ( "Magiername ungueltig.\n" ); break;
	case -9: write ( "Magiername des wartenden Magiers ungueltig.\n"); break;
	case -10: write ("Falsche Gruppeneinordnung.\n"); break;
	default: write ( "Eintrag eingefuegt.\n" );
      }
    default:
      return;
  }
}

int Remove_Quest ( string str )
{
  mixed *oldquest;
  string newstr;
  int errstat;

  if ( !(str=UA) )
  {
    write ( "Syntax: RemoveQ <name>\n" );
    return 1;
  }

  Load_NumKey();

  if ( !(newstr = num_key[str+""]) )
    newstr = str;

  oldquest = ({mixed *}) QM->QueryQuest ( newstr );

  if ( !pointerp ( oldquest ) || !sizeof ( oldquest ) )
  {
    write ( "Keine Quest dieses Namens gefunden.\n" );
    return 1;
  }

  errstat = ({int}) QM->RemoveQuest( newstr );

  switch ( errstat )
  {
    case  0: write ( "Zugriff verweigert.\n" ); break;
    case -1: write ( "Parameterfehler.\n" ); break;
    case -2: write ( "Quest nicht gefunden.\n" ); break;
    default: write ( "Quest entfernt.\n" );
  }

  savequest = oldquest;
  savekey   = newstr;

  return 1;
}

int Change_Quest ( string str )
{
  mixed *oldquest;
  string newstr;

  if ( !(str=UA) )
  {
    write ( "Syntax: ChangeQ <quest>\n" );
    return 1;
  }

  Load_NumKey();

  if ( !(newstr = num_key[str+""]) )
    newstr = str;

  oldquest = ({mixed *}) QM->QueryQuest ( newstr );

  if ( !pointerp( oldquest ) || !sizeof ( oldquest ) )
  {
    write ( "Keine Quest dieses Namens gefunden.\n" );
    return 1;
  }

  do_change = 1;
  changekey = newstr;
  savekey = newstr;
  savequest = oldquest;

  write ( "Aktueller Eintrag:\n");
  write ( "Key              : "+newstr+"\n" );
  write ( "Punkte           : "+oldquest[Q_QP]+"\n" );
  write ( "Erfahrung        : "+oldquest[Q_XP]+"\n" );
  write ( "Filenamen        : "+implode(oldquest[Q_ALLOWED],",")+"\n" );
  write ( "Info             : "+oldquest[Q_HINT]+"\n" );
  write ( "Stufe            : "+oldquest[Q_DIFF]+"\n" );
  write ( "Klasse           : "+QCLASS_STARS(oldquest[Q_CLASS])+"\n" );
  write ( "Attribut         : "+QATTR_STRINGS[oldquest[Q_ATTR]]+"\n" );
  write ( "Magier           : "+capitalize(oldquest[Q_WIZ])+"\n" );
  write ( "Wartender Magier : "+capitalize(oldquest[Q_SCNDWIZ])+"\n" );


  write ( "\nNeue Quest:     (mit '.' oder '~q' kann abgebrochen werden)\n" );
  write ( sprintf("Key [%s]:\n", savekey) );
  input_to ( "ReadNewQuest" );

  return 1;
}

int Restore_Quest ( string str )
{
  int errstat;

  if ( !savekey || !sizeof(savekey) )
  {
    write ( "\nTut mir leid!\n" );
    write ( "Nichts zum Restaurieren gefunden ...\n" );
    return 1;
  }

  errstat = 
	  ({int})QM->AddQuest(savekey, savequest[0], savequest[1],
			           savequest[2], savequest[3], savequest[4], savequest[5],
			           savequest[6], savequest[7], savequest[8]);

  switch ( errstat )
  {
    case  0: write ( "Zugriff verweigert.\n" ); break;
    case -1: write ( "Key ungueltig oder sizeof(key) < 5.\n" ); break;
    case -2: write ( "QP ungueltig oder < 1.\n" ); break;
    case -3: write ( "XP ungueltig.\n" ); break;
    case -4: write ( "Filename(n) ungueltig.\n" ); break;
    case -5: write ( "Info ungueltig.\n" ); break;
    case -6: write ( "Stufe ungueltig oder < 0 oder > 20.\n" ); break;
    case -7: write ( "Aktiv-Flag < 0 oder > 1.\n" ); break;
    case -8: write ( "Magiername ungueltig.\n" ); break;
    case -9: write ( "Magiername ungueltig.\n"); break;
    case -10: write ("Ungueltige Gruppennummer.\n"); break;
    default: write ( "'"+savekey+"' restauriert.\n" );
  }
  savekey = "";
  return 1;
}

int Set_Quest ( string str )
{
  string quest, player, newquest;
  int created;
  object ob;

  if ( !(str=UA) || sscanf( str, "%s %s", player, quest ) != 2 )
  {
    write ( "Syntax: SetQ <player> <quest>\n" );
    return 1;
  }

  created=0;
  Load_NumKey();

  if ( !(newquest = num_key[quest+""]) )
    newquest = quest;

  ob=find_player(player);
  if(!ob)
  {
    ob=find_netdead(player);
    if(!ob)
    {
      created=1;
      ob=__create_player_dummy(player);
    }
  }
  if(!ob)
  {
    write("Kein solcher Spieler gefunden.\n!");
    return 1;
  }
  
  write(ERRNO_2_STRING("GQ",({int})ob->GiveQuest(newquest,"__silent__"))+"\n");
  if(created)
  {
    ob->save_me(0);
    if(!(ob->remove()))
    {
    	destruct(ob);
    }
  }
  return 1;
}

int Del_Quest ( string str )
{
  string quest, player, newquest;
  int created;
  object ob;

  if ( !(str=UA) || sscanf( str, "%s %s", player, quest ) != 2 )
  {
    write ( "Syntax: DelQ <player> <quest>\n" );
    return 1;
  }

  Load_NumKey();

  if ( !(newquest = num_key[quest+""]) )
    newquest = quest;

  created=0;
  ob=find_player(player);
  if(!ob)
  {
    ob=find_netdead(player);
    if(!ob)
    {
      created=1;
      ob=__create_player_dummy(player);
    }
  }
  if(!ob)
  {
    write("Kein solcher Spieler gefunden.\n!");
    return 1;
  }
  
  write(ERRNO_2_STRING("DQ",({int}) ob->DeleteQuest ( newquest ))+"\n");
  if(created)
  {
    ob->save_me(0);
    if(!(ob->remove()))
    {
    	destruct(ob);
    }
  }
  return 1;
}

int Query_Quest ( string str )
{
  mixed *quest;
  string newstr;
  int i;

  if ( !(str=UA) )
  {
    write ( "Syntax: QueryQ <quest>\n" );
    return 1;
  }

  Load_NumKey();

  if ( !(newstr = num_key[str+""]) )
	newstr = str;

  quest = ({mixed *}) QM->QueryQuest( newstr );

  if ( !pointerp( quest ) || !sizeof ( quest ) )
  {
    write ( "Keine Quest dieses Namens gefunden.\n" );
    return 1;
  }

  write ( "Aktueller Eintrag:\n");
  write ( "Key              : "+newstr );
  if(quest[Q_ACTIVE])
    write (" (aktiviert)\n");
  else
    write (" (deaktiviert)\n");
  write ( "Punkte           : "+quest[Q_QP]+"\n" );
  write ( "Erfahrung        : "+quest[Q_XP]+"\n" );
  write ( break_string ( implode( quest[Q_ALLOWED], " " ), 65, "Filenamen	 : " ) );
  write ( break_string ( quest[Q_HINT], 65, "Info             : " ) );
  write ( "Stufe            : "+quest[Q_DIFF]+"\n" );
  printf("Stufe (avg)      : %.2f (%d)\n", quest[Q_AVERAGE][0], 
        quest[Q_AVERAGE][1]);
  write ( "Klasse           : "+ QCLASS_STARS(quest[Q_CLASS])+"\n");
  write ( "Attribute        : "+ QATTR_STRINGS[quest[Q_ATTR]]+"\n");
  write ( "Magier           : "+capitalize(quest[Q_WIZ])+"\n" );
  write ( "Wartender Magier : "+capitalize(quest[Q_SCNDWIZ])+"\n");
  return 1;
}

int Query_Keys ( string str )
{
  string *keys, active;
  mixed *quest;
  int i;

  if ( !(keys = ({string *}) QM->QueryAllKeys()) )
    return 1;

  write ( "\n" );
  keys=sort_array(keys,#'>);//')
  for ( i = 0; i < sizeof(keys); i++ )
  {
    quest = ({mixed *}) QM->QueryQuest(keys[i]);
    if(quest[6])
      active="*";
    else
      active=" ";
    write(sprintf("%2d%s %-33s%s",i+1,quest[6]?"*":" ",keys[i],
		      !(i%2)?" ":"\n"));
  }
  if(i%2)
    write("\n");

  return 1;
}

int Query_Quests ( string str )
{
  mixed *quest;
  string *keys, rstr;
  int i;

  if ( !(keys = ({mixed *})QM->QueryAllKeys()) )
    return 1;

  keys=sort_array(keys,#'>);//')
  for ( i = 0, rstr = ""; i < sizeof(keys); i++ )
  {
    quest = ({mixed *}) QM->QueryQuest(keys[i]);
      write ( "\nKey              : "+keys[i] );
  if(quest[Q_ACTIVE])
    write (" (aktiviert)\n");
  else
    write (" (deaktiviert)\n");
  write ( "Punkte           : "+quest[Q_QP]+"\n" );
  write ( "Erfahrung        : "+quest[Q_XP]+"\n" );
  write ( break_string ( implode( quest[Q_ALLOWED], " " ), 78, "Filenamen	 : " ) );
  write ( break_string ( quest[Q_HINT], 78, "Info		 : " ) );
  write ( "Stufe            : "+quest[Q_DIFF]+"\n" );
  write ( "Klasse           : "+ QCLASS_STARS(quest[Q_CLASS])+"\n");
  write ( "Attribute        : "+ QATTR_STRINGS[quest[Q_ATTR]]+"\n");
  write ( "Magier           : "+capitalize(quest[7])+"\n" );
  write ( "Wartender Magier : "+capitalize(quest[8])+"\n");
  }
  More( rstr, 0 );
  return 1;
}

int ActivateQuest( string str )
{
  mixed *quest;
  string newstr;
  int errstat;

  if ( !(str=UA) )
  {
    write ( "Syntax: ActiVateQ <quest>\n" );
    return 1;
  }

  Load_NumKey();

  if ( !(newstr = num_key[str+""]) )
	newstr = str;

  switch( QM->SetActive( newstr, 1 ) )
  {
    case -3: write ( "Ungueltiger Flag.\n" ); break;
    case -2: write ( "Quest war bereits aktiviert.\n" ); break;
    case -1: write ( "Keine Quest dieses Namens gefunden.\n" ); break;
    case  0: write ( "Zugriff verweigert\n" ); break;
    case  1: write ( "Quest '"+newstr+"' aktiviert.\n" ); break;
    default: write ( "unbekannter Fehlerstatus.\n" );
  }
  return 1;
}

int DeactivateQuest( string str )
{
  mixed *quest;
  string newstr;
  int errstat;

  if ( !(str=UA) )
  {
    write ( "Syntax: DeactiVateQ <quest>\n" );
    return 1;
  }

  Load_NumKey();

  if ( !(newstr = num_key[str+""]) )
	newstr = str;

  switch( QM->SetActive( newstr, 0 ) )
  {
    case -3: write ( "Ungueltiger Flag.\n" ); break;
    case -2: write ( "Quest war bereits deaktiviert.\n" ); break;
    case -1: write ( "Keine Quest dieses Namens gefunden.\n" ); break;
    case  0: write ( "Zugriff verweigert\n" ); break;
    case  1: write ( "Quest '"+newstr+"' deaktiviert.\n" ); break;
    default: write ( "unbekannter Fehlerstatus.\n" );
  }
  return 1;
}


