skylib_mudos_v1/
skylib_mudos_v1/bin/
skylib_mudos_v1/bin/db/
skylib_mudos_v1/mudlib/banish/a/
skylib_mudos_v1/mudlib/banish/b/
skylib_mudos_v1/mudlib/banish/c/
skylib_mudos_v1/mudlib/banish/d/
skylib_mudos_v1/mudlib/banish/e/
skylib_mudos_v1/mudlib/banish/f/
skylib_mudos_v1/mudlib/banish/g/
skylib_mudos_v1/mudlib/banish/h/
skylib_mudos_v1/mudlib/banish/j/
skylib_mudos_v1/mudlib/banish/l/
skylib_mudos_v1/mudlib/banish/m/
skylib_mudos_v1/mudlib/banish/n/
skylib_mudos_v1/mudlib/banish/o/
skylib_mudos_v1/mudlib/banish/p/
skylib_mudos_v1/mudlib/banish/r/
skylib_mudos_v1/mudlib/banish/s/
skylib_mudos_v1/mudlib/banish/t/
skylib_mudos_v1/mudlib/banish/u/
skylib_mudos_v1/mudlib/banish/w/
skylib_mudos_v1/mudlib/cmds/
skylib_mudos_v1/mudlib/cmds/admin/
skylib_mudos_v1/mudlib/cmds/guild-race/
skylib_mudos_v1/mudlib/cmds/guild-race/crafts/
skylib_mudos_v1/mudlib/cmds/guild-race/magic/
skylib_mudos_v1/mudlib/cmds/guild-race/other/
skylib_mudos_v1/mudlib/cmds/living/broken/
skylib_mudos_v1/mudlib/cmds/player/group_cmds/
skylib_mudos_v1/mudlib/d/admin/
skylib_mudos_v1/mudlib/d/admin/room/
skylib_mudos_v1/mudlib/d/admin/room/we_care/
skylib_mudos_v1/mudlib/d/admin/save/
skylib_mudos_v1/mudlib/d/admin/text/
skylib_mudos_v1/mudlib/d/learning/TinyTown/buildings/
skylib_mudos_v1/mudlib/d/learning/TinyTown/map/
skylib_mudos_v1/mudlib/d/learning/TinyTown/roads/
skylib_mudos_v1/mudlib/d/learning/chars/
skylib_mudos_v1/mudlib/d/learning/functions/
skylib_mudos_v1/mudlib/d/learning/handlers/
skylib_mudos_v1/mudlib/d/learning/help_topics/
skylib_mudos_v1/mudlib/d/learning/help_topics/npcs/
skylib_mudos_v1/mudlib/d/learning/help_topics/objects/
skylib_mudos_v1/mudlib/d/learning/help_topics/rcs_demo/
skylib_mudos_v1/mudlib/d/learning/help_topics/rcs_demo/RCS/
skylib_mudos_v1/mudlib/d/learning/help_topics/rooms/
skylib_mudos_v1/mudlib/d/learning/help_topics/rooms/crowd/
skylib_mudos_v1/mudlib/d/learning/help_topics/rooms/situations/
skylib_mudos_v1/mudlib/d/learning/save/
skylib_mudos_v1/mudlib/d/learning/school/
skylib_mudos_v1/mudlib/d/learning/school/add_sc/
skylib_mudos_v1/mudlib/d/learning/school/characters/
skylib_mudos_v1/mudlib/d/learning/school/general/
skylib_mudos_v1/mudlib/d/learning/school/getting-started/
skylib_mudos_v1/mudlib/d/learning/school/getting-started/basic_commands/
skylib_mudos_v1/mudlib/d/learning/school/getting-started/edtutor/
skylib_mudos_v1/mudlib/d/learning/school/getting-started/unix_tutor/
skylib_mudos_v1/mudlib/d/learning/school/items/
skylib_mudos_v1/mudlib/d/learning/school/npc_school/
skylib_mudos_v1/mudlib/d/learning/school/room_school/
skylib_mudos_v1/mudlib/d/learning/school/room_school/room_basic/
skylib_mudos_v1/mudlib/d/learning/school/room_school/situations/
skylib_mudos_v1/mudlib/d/learning/school/room_school/terrain_tutor/
skylib_mudos_v1/mudlib/d/learning/text/
skylib_mudos_v1/mudlib/d/liaison/
skylib_mudos_v1/mudlib/d/mudlib/
skylib_mudos_v1/mudlib/d/mudlib/changes/
skylib_mudos_v1/mudlib/d/playtesters/
skylib_mudos_v1/mudlib/d/playtesters/effects/
skylib_mudos_v1/mudlib/d/playtesters/handlers/
skylib_mudos_v1/mudlib/d/playtesters/items/
skylib_mudos_v1/mudlib/d/sage/
skylib_mudos_v1/mudlib/doc/
skylib_mudos_v1/mudlib/doc/creator/
skylib_mudos_v1/mudlib/doc/driver/
skylib_mudos_v1/mudlib/doc/driver/efuns/arrays/
skylib_mudos_v1/mudlib/doc/driver/efuns/buffers/
skylib_mudos_v1/mudlib/doc/driver/efuns/compile/
skylib_mudos_v1/mudlib/doc/driver/efuns/filesystem/
skylib_mudos_v1/mudlib/doc/driver/efuns/floats/
skylib_mudos_v1/mudlib/doc/driver/efuns/functions/
skylib_mudos_v1/mudlib/doc/driver/efuns/general/
skylib_mudos_v1/mudlib/doc/driver/efuns/mappings/
skylib_mudos_v1/mudlib/doc/driver/efuns/mixed/
skylib_mudos_v1/mudlib/doc/driver/efuns/mudlib/
skylib_mudos_v1/mudlib/doc/driver/efuns/numbers/
skylib_mudos_v1/mudlib/doc/driver/efuns/parsing/
skylib_mudos_v1/mudlib/doc/known_command/
skylib_mudos_v1/mudlib/doc/login/
skylib_mudos_v1/mudlib/doc/lpc/basic_manual/
skylib_mudos_v1/mudlib/doc/lpc/intermediate/
skylib_mudos_v1/mudlib/doc/new/add_command/
skylib_mudos_v1/mudlib/doc/new/events/
skylib_mudos_v1/mudlib/doc/new/handlers/
skylib_mudos_v1/mudlib/doc/new/living/race/
skylib_mudos_v1/mudlib/doc/new/living/spells/
skylib_mudos_v1/mudlib/doc/new/object/
skylib_mudos_v1/mudlib/doc/new/player/
skylib_mudos_v1/mudlib/doc/new/room/guild/
skylib_mudos_v1/mudlib/doc/new/room/outside/
skylib_mudos_v1/mudlib/doc/new/room/storeroom/
skylib_mudos_v1/mudlib/doc/object/
skylib_mudos_v1/mudlib/doc/playtesters/
skylib_mudos_v1/mudlib/doc/policy/
skylib_mudos_v1/mudlib/doc/weapons/
skylib_mudos_v1/mudlib/global/
skylib_mudos_v1/mudlib/global/creator/
skylib_mudos_v1/mudlib/global/handlers/
skylib_mudos_v1/mudlib/global/virtual/setup_compiler/
skylib_mudos_v1/mudlib/include/cmds/
skylib_mudos_v1/mudlib/include/effects/
skylib_mudos_v1/mudlib/include/npc/
skylib_mudos_v1/mudlib/include/room/
skylib_mudos_v1/mudlib/include/shops/
skylib_mudos_v1/mudlib/net/daemon/
skylib_mudos_v1/mudlib/net/daemon/chars/
skylib_mudos_v1/mudlib/net/inherit/
skylib_mudos_v1/mudlib/net/obj/
skylib_mudos_v1/mudlib/obj/amulets/
skylib_mudos_v1/mudlib/obj/b_day/
skylib_mudos_v1/mudlib/obj/clothes/
skylib_mudos_v1/mudlib/obj/dwarmours/plate/
skylib_mudos_v1/mudlib/obj/dwclothes/transport/horse/
skylib_mudos_v1/mudlib/obj/dwscabbards/
skylib_mudos_v1/mudlib/obj/dwweapons/axes/
skylib_mudos_v1/mudlib/obj/dwweapons/chains/
skylib_mudos_v1/mudlib/obj/faith/symbols/
skylib_mudos_v1/mudlib/obj/fungi/
skylib_mudos_v1/mudlib/obj/gatherables/
skylib_mudos_v1/mudlib/obj/instruments/
skylib_mudos_v1/mudlib/obj/magic/
skylib_mudos_v1/mudlib/obj/media/
skylib_mudos_v1/mudlib/obj/misc/player_shop/
skylib_mudos_v1/mudlib/obj/monster/godmother/
skylib_mudos_v1/mudlib/obj/monster/transport/
skylib_mudos_v1/mudlib/obj/rings/
skylib_mudos_v1/mudlib/obj/spells/
skylib_mudos_v1/mudlib/obj/stationery/
skylib_mudos_v1/mudlib/obj/stationery/envelopes/
skylib_mudos_v1/mudlib/obj/stationery/papers/
skylib_mudos_v1/mudlib/obj/toys/
skylib_mudos_v1/mudlib/obj/vessels/
skylib_mudos_v1/mudlib/obj/weapons/swords/
skylib_mudos_v1/mudlib/save/autodoc/
skylib_mudos_v1/mudlib/save/leaflets/
skylib_mudos_v1/mudlib/save/mail/
skylib_mudos_v1/mudlib/save/new_soul/data/
skylib_mudos_v1/mudlib/save/parcels/
skylib_mudos_v1/mudlib/save/playerinfo/
skylib_mudos_v1/mudlib/save/players/d/
skylib_mudos_v1/mudlib/save/random_names/
skylib_mudos_v1/mudlib/save/random_names/data/
skylib_mudos_v1/mudlib/save/terrains/
skylib_mudos_v1/mudlib/save/terrains/tutorial_desert/
skylib_mudos_v1/mudlib/save/terrains/tutorial_grassy_field/
skylib_mudos_v1/mudlib/save/terrains/tutorial_mountain/
skylib_mudos_v1/mudlib/save/todo_lists/
skylib_mudos_v1/mudlib/secure/
skylib_mudos_v1/mudlib/secure/cmds/admin/
skylib_mudos_v1/mudlib/secure/cmds/lord/
skylib_mudos_v1/mudlib/secure/config/
skylib_mudos_v1/mudlib/secure/handlers/autodoc/
skylib_mudos_v1/mudlib/secure/handlers/intermud/
skylib_mudos_v1/mudlib/secure/include/global/
skylib_mudos_v1/mudlib/secure/save/
skylib_mudos_v1/mudlib/secure/save/handlers/
skylib_mudos_v1/mudlib/secure/std/classes/
skylib_mudos_v1/mudlib/secure/std/modules/
skylib_mudos_v1/mudlib/std/commands/
skylib_mudos_v1/mudlib/std/commands/shadows/
skylib_mudos_v1/mudlib/std/creator/
skylib_mudos_v1/mudlib/std/dom/
skylib_mudos_v1/mudlib/std/effects/
skylib_mudos_v1/mudlib/std/effects/external/
skylib_mudos_v1/mudlib/std/effects/fighting/
skylib_mudos_v1/mudlib/std/effects/priest/
skylib_mudos_v1/mudlib/std/effects/room/
skylib_mudos_v1/mudlib/std/environ/
skylib_mudos_v1/mudlib/std/guilds/
skylib_mudos_v1/mudlib/std/guilds/old/
skylib_mudos_v1/mudlib/std/languages/
skylib_mudos_v1/mudlib/std/languages/BACKUPS/
skylib_mudos_v1/mudlib/std/liquids/
skylib_mudos_v1/mudlib/std/npc/
skylib_mudos_v1/mudlib/std/npc/goals/
skylib_mudos_v1/mudlib/std/npc/goals/basic/
skylib_mudos_v1/mudlib/std/npc/goals/misc/
skylib_mudos_v1/mudlib/std/npc/plans/
skylib_mudos_v1/mudlib/std/npc/plans/basic/
skylib_mudos_v1/mudlib/std/npc/types/
skylib_mudos_v1/mudlib/std/npc/types/helper/
skylib_mudos_v1/mudlib/std/npcs/
skylib_mudos_v1/mudlib/std/outsides/
skylib_mudos_v1/mudlib/std/races/shadows/
skylib_mudos_v1/mudlib/std/room/basic/topography/
skylib_mudos_v1/mudlib/std/room/controller/
skylib_mudos_v1/mudlib/std/room/inherit/topography/
skylib_mudos_v1/mudlib/std/room/topography/area/
skylib_mudos_v1/mudlib/std/room/topography/iroom/
skylib_mudos_v1/mudlib/std/room/topography/milestone/
skylib_mudos_v1/mudlib/std/shadows/curses/
skylib_mudos_v1/mudlib/std/shadows/disease/
skylib_mudos_v1/mudlib/std/shadows/fighting/
skylib_mudos_v1/mudlib/std/shadows/healing/
skylib_mudos_v1/mudlib/std/shadows/magic/
skylib_mudos_v1/mudlib/std/shadows/poison/
skylib_mudos_v1/mudlib/std/shadows/rituals/
skylib_mudos_v1/mudlib/std/shadows/room/
skylib_mudos_v1/mudlib/std/shops/controllers/
skylib_mudos_v1/mudlib/std/shops/objs/
skylib_mudos_v1/mudlib/std/shops/player_shop/
skylib_mudos_v1/mudlib/std/socket/
skylib_mudos_v1/mudlib/std/soul/
skylib_mudos_v1/mudlib/std/soul/d/
skylib_mudos_v1/mudlib/std/soul/e/
skylib_mudos_v1/mudlib/std/soul/i/
skylib_mudos_v1/mudlib/std/soul/j/
skylib_mudos_v1/mudlib/std/soul/k/
skylib_mudos_v1/mudlib/std/soul/l/
skylib_mudos_v1/mudlib/std/soul/n/
skylib_mudos_v1/mudlib/std/soul/o/
skylib_mudos_v1/mudlib/std/soul/q/
skylib_mudos_v1/mudlib/std/soul/u/
skylib_mudos_v1/mudlib/std/soul/v/
skylib_mudos_v1/mudlib/std/soul/y/
skylib_mudos_v1/mudlib/std/soul/z/
skylib_mudos_v1/mudlib/std/stationery/
skylib_mudos_v1/mudlib/w/
skylib_mudos_v1/mudlib/w/default/
skylib_mudos_v1/mudlib/w/default/armour/
skylib_mudos_v1/mudlib/w/default/clothes/
skylib_mudos_v1/mudlib/w/default/item/
skylib_mudos_v1/mudlib/w/default/npc/
skylib_mudos_v1/mudlib/w/default/room/
skylib_mudos_v1/mudlib/w/default/weapon/
skylib_mudos_v1/mudlib/www/
skylib_mudos_v1/mudlib/www/download/
skylib_mudos_v1/mudlib/www/java/
skylib_mudos_v1/mudlib/www/secure/
skylib_mudos_v1/mudlib/www/secure/lpc/advanced/
skylib_mudos_v1/mudlib/www/secure/lpc/intermediate/
skylib_mudos_v1/v22.2b14-DSv10/
skylib_mudos_v1/v22.2b14-DSv10/ChangeLog.old/
skylib_mudos_v1/v22.2b14-DSv10/Win32/
skylib_mudos_v1/v22.2b14-DSv10/compat/
skylib_mudos_v1/v22.2b14-DSv10/compat/simuls/
skylib_mudos_v1/v22.2b14-DSv10/include/
skylib_mudos_v1/v22.2b14-DSv10/mudlib/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/clone/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/command/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/data/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/etc/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/include/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/inherit/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/inherit/master/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/log/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/single/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/single/tests/compiler/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/single/tests/efuns/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/single/tests/operators/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/u/
skylib_mudos_v1/v22.2b14-DSv10/tmp/
skylib_mudos_v1/v22.2b14-DSv10/windows/
/**
 * This class keeps track of the current set of quests availabe in the
 * game.
 * @author Furball
 */

#include <library.h>

#define QUEST_LOG "QUESTS"
#define SAVE_FILE "/save/quests"
#define BACKUP_FILE "/save/quests/quests"

inherit OBJECT_OBJ;

private int *quest_level;
private int *quest_xp;
private int *num_times_done;
private int *quest_status;
private string *quest_name;
private string *quest_title;
private string *quest_story;
private string *last_done_by;
private nosave int total_qp;

/**
 * This method reloads the quests from the save file.
 * @see save_quests()
 */
void load_quests() { unguarded( (: restore_object, SAVE_FILE :) ); }

/**
 * This method saves the current set of quests to the save file.
 * @see load_quests()
 */
void save_quests() { unguarded( (: save_object, SAVE_FILE :) ); }

void create() {
   int i;
   ::create();
   load_quests();
   if ( !quest_name ) {
      quest_name = ({ });
   }
   if ( !quest_level ) {
      quest_level = ({ });
   }
   if ( !quest_title ) {
      quest_title = ({ });
   }
   if ( !quest_story ) {
      quest_story = ({ });
   }
   if ( !quest_xp ) {
      quest_xp = ({ });
   }
   if ( !last_done_by ) {
      last_done_by = ({ });
   }
   if ( !num_times_done ) {
      num_times_done = ({ });
   }
   if ( !quest_status ) {
     if(sizeof(quest_name)) {
       quest_status = allocate(sizeof(quest_name));
       for(i=0; i<sizeof(quest_name); i++) {
         quest_status[i] = 1;
       }
     } else {
       quest_status = ({ });
     }
   }

   for(i = 0; i<sizeof(quest_level); i++) {
     if(quest_status[i]) {
       total_qp += quest_level[i];
     }
   }

} /* create() */

/**
 * This returns the current total gp for all of the current quests.
 * @return the total gp
 */
int query_total_qp() { return total_qp; }

/**
 * This method adds a new quest into the system.  You only need to call
 * this ONCE.  The name of the quest must be unique.  The story is
 * what can be seen in the players books about the player.
 * @param name the name of the quest
 * @param level the level of the quest 0-100
 * @param title the title for finishing the quest, 0 for none
 * @param story the story about the quest
 * @return 1 if successful, 0 if not
 * @see delete_quest()
 * @see query_quest_level()
 * @see query_quest_title()
 * @see query_quest_story()
 */
int add_quest( string name, int level, int xp, string title, string story ) {

  if(file_name(PO) != "/secure/cmds/lord/questtool"){
        printf("Illegal access.");
        return 0;
  }

   if ( member_array( name, quest_name ) != -1 )
      return 0;
   quest_name += ({ name });
   quest_level += ({ level });
   quest_xp += ({ xp });
   quest_title += ({ title });
   quest_story += ({ story });
   last_done_by += ({ "nobody" });
   num_times_done += ({ 0 });
   quest_status += ({ 1 }); //Make it active!
   log_file( QUEST_LOG, (string)this_player()->query_name() +
         " added: "+ name +", "+ level +", "+ title +", "+ story +"\n" );
   save_quests();
   unguarded( (: cp, SAVE_FILE +".o", BACKUP_FILE +"."+ time() :) );
   total_qp += level;
   return 1;
} /* add_quest() */

/**
 * Change the status of a quest from active to inactive
 * and vice versa.
 * @param the name of a quest.
 */
int change_quest_status(string name) {
  int temp;

  if(file_name(PO) != "/secure/cmds/lord/questtool"){
        printf("Illegal access.");
        return 0;
  }

  temp = member_array(name, quest_name);
  if(temp == -1) {
    return -1;
  }
  quest_status[temp] = !quest_status[temp];
  return quest_status[temp];
}

/**
 * This method returns the status of a quest.
 * @param the name of a quest
 * @return 1 for active, 0 for inactive.
 */
int query_quest_status(string name) {
  int temp;

  temp = member_array(name, quest_name);
  if(temp == -1) {
    return -1;
  }
  return quest_status[temp];
}


/**
 * This method returns the level of the quest.
 * @param name the name of the quest
 * @return the level of the quest, -1 on failure
 * @see add_quest()
 * @see set_quest_level()
 */
int query_quest_level(string name) {
  int temp;

  temp = member_array(name, quest_name);
  if(temp == -1) {
    return -1;
  }
  return quest_level[temp];
} /* query_quest_level() */

/**
 * This method sets the level of the quest.
 * @param name the name of the quest
 * @param level the level of the quest
 * @return 0 on failure, 1 on success
 * @see add_quest()
 * @see query_quest_level()
 */
int set_quest_level(string name, int level) {
   int temp;

  if(file_name(PO) != "/secure/cmds/lord/questtool"){
        printf("Illegal access.");
        return 0;
  }
   temp = member_array(name, quest_name);
   if(temp == -1) {
      return 0;
   }
   log_file(QUEST_LOG, "%s : level set for %s to %d\n\n",
            this_player()->query_name(), name, level);
   quest_level[ temp ] = level;
   save_quests();
   return 1;
} /* set_quest_level() */

/**
 * This method returns the xp reward of the quest.
 * @param name the name of the quest
 * @return the xp reward of the quest, -1 on failure
 * @see add_quest()
 * @see set_quest_xp()
 */
int query_quest_xp(string name) {
  int temp;

  temp = member_array(name, quest_name);
  if(temp == -1) {
    return -1;
  }
  return quest_xp[temp];
} /* query_quest_xp() */

/**
 * This method sets the xp reward of the quest.
 * @param name the name of the quest
 * @param amount the amount of xp reward of the quest
 * @return 0 on failure, 1 on success
 * @see add_quest()
 * @see query_quest_xp()
 */
int set_quest_xp(string name, int amount) {
   int temp;

  if(file_name(PO) != "/secure/cmds/lord/questtool"){
        printf("Illegal access.");
        return 0;
  }

   temp = member_array(name, quest_name);
   if(temp == -1) {
      return 0;
   }
   log_file(QUEST_LOG, "%s : xp amount set for %s to %d\n\n",
            this_player()->query_name(), name, amount);
   quest_xp[ temp ] = amount;
   save_quests();
   return 1;
} /* set_quest_level() */

/**
 * This method returns the story associated with the quest.
 * @param name of the quest
 * @return the story of the quest
 * @see add_quest()
 * @see set_quest_story()
 */
string query_quest_story(string name) {
  int temp;

  temp = member_array(name, quest_name);
  if(temp == -1) {
    return "did nothing";
  }
  return quest_story[temp];
} /* query_quest_story() */

/**
 * This method sets the story associated with the quest.
 * @param name of the quest
 * @param story the new story of the quest
 * @see add_quest()
 * @see query_quest_story()
 */
int set_quest_story(string name, string story) {
   int temp;

  if(file_name(PO) != "/secure/cmds/lord/questtool"){
        printf("Illegal access.");
        return 0;
  }

   temp = member_array(name, quest_name);
   if(temp == -1) {
      return 0;
   }
   log_file(QUEST_LOG, "%s : story set for %s to %s\n\n",
            this_player()->query_name(), name, story);
   quest_story[ temp ] = story;
   save_quests();
   return 1;
} /* set_quest_story() */

/**
 * This method returns the title associated with the quest.
 * @param name of the quest
 * @return the title of the quest
 * @see add_quest()
 * @see set_quest_title()
 */
string query_quest_title(string name) {
  int temp;

  temp = member_array(name, quest_name);
  if(temp == -1 || quest_title[temp] == "") {
    return "Unknown Quester";
  }
  return quest_title[temp];
} /* query_quest_title() */

/**
 * This method sets the title associated with the quest.
 * @param name of the quest
 * @param title the new title of the quest
 * @see add_quest()
 * @see query_quest_title()
 */
int set_quest_title(string name, string title) {
   int temp;

  if(file_name(PO) != "/secure/cmds/lord/questtool"){
        printf("Illegal access.");
        return 0;
  }

   temp = member_array(name, quest_name);
   if(temp == -1) {
      return 0;
   }
   log_file(QUEST_LOG, "%s : title set for %s to %s\n\n",
            this_player()->query_name(), name, title);
   quest_title[ temp ] = title;
   save_quests();
   return 1;
} /* set_quest_title() */

/**
 * This method returns the number of times the quest has been
 * completed.
 * @param name thre name of the quest
 * @return the number of times completed
 * @see quest_completed()
 * @see add_quest()
 * @see query_quest_done()
 */
int query_quest_times( string name ) {
   int i;

   i = member_array( name, quest_name );
   if ( i == -1 )
      return -1;
   return num_times_done[ i ];
} /* query_quest_times() */

/**
 * This method returns the name of the last person to complete the
 * quest.
 * @param name thre name of the quest
 * @return the last person to complete the quest
 * @see quest_completed()
 * @see add_quest()
 * @see query_quest_times()
 */
mixed query_quest_done( string name ) {
   int i;

   i = member_array( name, quest_name );
   if ( i == -1 )
      return -1;
   return last_done_by[ i ];
} /* query_quest_done() */

/**
 * This method removes the given quest from the system.
 * @see name the name of the quest to remove
 * @return 0 on failure, 1 on success
 * @see add_quest()
 */
int delete_quest(string name) {
   int temp;

   if(file_name(PO) != "/secure/cmds/lord/questtool"){
        printf("Illegal access.");
        return 0;
   }
   log_file(QUEST_LOG, this_player()->query_name() + " removed : " +
            name + "\n\n");
   temp = member_array(name, quest_name);
   if(temp == -1) {
      return 0;
   }
   total_qp -= quest_level[temp];
   quest_xp = delete(quest_xp, temp, 1);
   quest_name = delete(quest_name, temp, 1);
   quest_level = delete(quest_level, temp, 1);
   quest_title = delete(quest_title, temp, 1);
   quest_story = delete(quest_story, temp, 1);
   last_done_by = delete( last_done_by, temp, 1 );
   num_times_done = delete( num_times_done, temp, 1 );
   save_quests();
   return 1;
} /* delete_quest() */

/**
 * This method returns the names of all the quests.
 * @return the names of all the quests
 * @see add_quest()
 * @see delete_quest()
 */
string *query_quest_names() {
  return quest_name + ({ });
} /* query_quest_names() */

/**
 * This method returns the levels of all the quests.
 * @return the levels of all the quests
 * @see add_quest()
 * @see delete_quest()
 */
int *query_quest_levels() {
  return quest_level + ({ });
} /* query_quest_levels() */

/**
 * This method returns the xp rewards of all the quests.
 * @return the levels of all the quests
 * @see add_quest()
 * @see delete_quest()
 */
int *query_quest_xps() {
  return quest_xp + ({ });
} /* query_quest_levels() */

/**
 * This method returns the titles of all the quests.
 * @return the titles of all the quests
 * @see add_quest()
 * @see delete_quest()
 */
string *query_quest_titles() {
  return quest_title + ({ });
} /* query_quest_titles() */

/**
 * This method returns the stories of all the quests.
 * @return the stories of all the quests
 * @see add_quest()
 * @see delete_quest()
 */
string *query_quest_stories() {
  return quest_story + ({ });
} /* query_quest_stories() */

/**
 * This method should be called in the code when a quest is complete.
 * @param name name of the player
 * @param quest the quest completed
 * @param prev_ob the object which completed the quest
 * @see add_quest()
 * @see delete_quest()
 */
void quest_completed( string name, string quest, object prev_ob ) {
   int i;
   string word;

   log_file( QUEST_LOG, ctime( time() ) +" "+ name +" completed "+
         quest +"\n" );
   user_event( "inform", name +" completes "+ quest, "quest" );
   if ( file_name( previous_object() ) != LIBRARY ) {
      prev_ob = previous_object();
   }
   word = (string)prev_ob->query_name();
   if ( !word ) {
      word = file_name( prev_ob );
   } else {
      word += " ("+ file_name( prev_ob ) +")";
   }
   log_file( QUEST_LOG, "given by "+ word +"\n" );
   i = member_array( quest, quest_name );
   if ( i == -1 ) {
      log_file( QUEST_LOG, "non existent quest\n" );
      return;
   }
   last_done_by[ i ] = name;
   num_times_done[ i ]++;
   save_quests();
} /* query_completed() */

/* Fame functions - for use in halls of fame / libraries etc. */
/* Piecemaker 25/3/93                                         */

/**
 * This method returns the fame of the player.
 * Gets the fame percentage of the player. Quest points / total quest points
 * @param name the name of the player
 * @return the fame as a percentage (0-100)
 * @see query_player_story()
 * @see query_fame_string()
 * @see query_total_qp()
 */
int query_player_fame(string name){
   int playerqp, rank;

   /* do checking on the names */
   if (!name){
      return 0;
   }
   /* expand the nicknames if there are any */
   if (this_player()){
      name = (string)this_player()->expand_nickname(name);
   }
   /* are they a valid player ? */
   if( !rank(name) ) {
      return 0;
   }

   /* do the calculations */
   playerqp = (int)LIBRARY->query_quest_points(name);

   rank = ( playerqp * 125 ) / query_total_qp();
   return rank;
} /* query_player_fame() */

/**
 * This method returns a string associated with the fame level of the
 * player.
 * @param name the name of the player
 * @return the fame string
 * @see query_player_fame()
 * @see query_player_story()
 */
string query_fame_str( string name ) {
   switch ( query_player_fame( name ) ) {
      case 0 .. 4 :
         return "completely unknown";
      case 5 .. 14 :
         return "unknown";
      case 15 .. 24 :
         return "unknown";
      case 25 .. 34 :
         return "moderately well known";
      case 35 .. 44 :
         return "well known";
      case 45 .. 54 :
         return "very well known";
      case 55 .. 64 :
         return "known throughout the region";
      case 65 .. 74 :
         return "famous";
      case 75 .. 84 :
         return "renowned";
      case 85 .. 94 :
         return "very renowned";
      default :
         return "so renowned that no introduction is needed";
   }
} /* query_fame_str() */

/**
 * This method lists the stories for the quests the player has done.
 * @param name the name of the player
 * @return the story of the player
 * @see query_fame_string()
 * @see query_player_fame()
 */
string *query_player_story(string name){
   string *quests;
   string *story;
   int i;

   story = ({ });
   /* do checking on the names */
   if (!name){
      return ({ });
   }
   /* expand the nicknames if there are any */
   if (this_player()){
      name = (string)this_player()->expand_nickname(name);
   }
   /* are they a valid player ? */
   if( !rank(name) ) {
      return 0;
   }

   /* right, we checked everything now. Lets do some real work. */
   quests = query_quest_names();
   if (sizeof(quests) == 1){
      story = ({"Is an under achiever."});
   }
   else{
      for(i=0;i<sizeof(quests);i++){
         if (LIBRARY->query_quest_done(name, quests[i])){
            story = ({ query_quest_story( quests[ i ] ) }) + story;
         }
      }
   }
   return story;
} /* query_player_story() */