legend/
legend/area/
legend/player/
/***************************************************************************
 *  Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer,        *
 *  Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe.   *
 *                                                                         *
 *  Merc Diku Mud improvments copyright (C) 1992, 1993 by Michael          *
 *  Chastain, Michael Quan, and Mitchell Tse.                              *
 *                                                                         *
 *  In order to use any part of this Merc Diku Mud, you must comply with   *
 *  both the original Diku license in 'license.doc' as well the Merc       *
 *  license in 'license.txt'.  In particular, you may not remove either of *
 *  these copyright notices.                                               *
 *                                                                         *
 *  Much time and thought has gone into this software and you are          *
 *  benefitting.  We hope that you share your changes too.  What goes      *
 *  around, comes around.                                                  *
 ***************************************************************************/
/***************************************************************************
 *  God Wars Mud copyright (C) 1994, 1995, 1996 by Richard Woolcock        *
 *  									   *
 *  Legend of Chrystancia copyright (C) 1999, 2000, 2001 by Matthew Little *
 *  This mud is NOT to be copied in whole or in part, or to be run without *
 *  the permission of Matthew Little. Nobody else has permission to        *
 *  authorise the use of this code.                                        *
 ***************************************************************************/
#if defined(macintosh)
#include <types.h>
#else
#include <sys/types.h>
#endif
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "merc.h"

/*int clan_table_search args( (CHAR_DATA *ch) );*/
/*void format_string_spaces args ( (char *argument,int spaces) );*/

void artifact_table_write ()
{
   int art_pos;
   FILE *fp;


   if ((fp = fopen (ART_LIST, "w")) == NULL)
      perror (LOGIN_FILE);


   for (art_pos = 0; art_pos < MAX_ART; art_pos++)
   {
      fprintf (fp, "%d %s~\n",
	       artifact_table[art_pos].object_vnum,
	       artifact_table[art_pos].player_name);
   }
   fflush (fp);
   fclose (fp);
   return;
}

void artifact_table_read ()
{
   int art_pos;
   FILE *fp;

   if ((fp = fopen (ART_LIST, "r")) != NULL)
   {
      for (art_pos = 0; art_pos < MAX_ART; art_pos++)
      {
	 artifact_table[art_pos].object_vnum = fread_number (fp);
	 artifact_table[art_pos].player_name = fread_string (fp);
      }
   }
   else
   {
      bug ("Cannot Open ARTIFACT Table:- Loading Default Table", 0);
      return;
   }
   fflush (fp);
   fclose (fp);
   return;
}

void do_show_artifacts (CHAR_DATA * ch, char *argument)
{
   char buf[MAX_STRING_LENGTH];
   OBJ_INDEX_DATA *pObjIndex;
   int art_pos;

   for (art_pos = 0; art_pos < MAX_ART; art_pos++)
   {
      if ((pObjIndex =
	   get_obj_index (artifact_table[art_pos].object_vnum)) == NULL)
	 continue;
      if (strlen (artifact_table[art_pos].player_name) < 3 ||
	  !str_cmp ((artifact_table[art_pos].player_name), "none"))
      {
	 sprintf (buf, "%s, which has not yet been discovered.\n\r",
		  pObjIndex->short_descr);
      }
      else
      {
	 sprintf (buf, "%s, which has been discovered by %s.\n\r",
		  pObjIndex->short_descr,
		  artifact_table[art_pos].player_name);
      }
      buf[0] = UPPER (buf[0]);
      send_to_char (buf, ch);
   }
}

struct artifact_type artifact_table[MAX_ART] = {
   {"none", 25},
   {"none", 26},
   {"none", 27},
   {"none", 28},
   {"none", 29},
   {"none", 30},
   {"none", 31},
   {"none", 32},
   {"none", 33},
   {"none", 34},
   {"none", 35},
   {"none", 36},
   {"none", 37},
   {"none", 38},
   {"none", 39},
   {"none", 40},
   {"none", 41},
   {"none", 42},
   {"none", 43},
   {"none", 44},
   {"none", 45},
   {"none", 46},
   {"none", 47},
   {"none", 29500},
   {"none", 29501},
   {"none", 29502},
   {"none", 29503},
   {"none", 29504},
   {"none", 29505},
   {"none", 29506},
   {"none", 29507},
   {"none", 29508},
   {"none", 29509},
   {"none", 29510},
   {"none", 29511},
   {"none", 29512},
   {"none", 29513},
   {"none", 29514},
   {"none", 29515},
   {"none", 29516},
   {"none", 29517},
   {"none", 29518},
   {"none", 29519},
   {"none", 29520},
   {"none", 29521}
};

// This identifies which position in the artifact_table a given artifact holds. -- Serenity
int find_arti_pos (int vnum)
{
   int loop_var = 0;
   for (loop_var = 0; loop_var < MAX_ART; loop_var++)
   {
      if (artifact_table[loop_var].object_vnum == vnum)
	 return loop_var;
   }
   return -1;
}

// This identifies whether a given artifact IS part of the artifact table and is
// therefore an Artifact. - Serenity
bool OBJ_ARTIFACT (OBJ_DATA * obj)
{
   if (find_arti_pos (obj->pIndexData->vnum) > -1)
      return TRUE;
   return FALSE;
}

// Now to determine if a given artifact is in fact TRULY the one we are looking for
bool IS_ARTIFACT (OBJ_DATA * obj, int arti_vnum)
{
   if (OBJ_ARTIFACT (obj) == FALSE)
      return FALSE;
   if (obj->pIndexData->vnum == arti_vnum)
      return TRUE;

   return FALSE;
}

bool ANY_ARTIFACT (OBJ_DATA * obj1, OBJ_DATA * obj2, OBJ_DATA * obj3,
		   OBJ_DATA * obj4, int arti_vnum)
{
   bool FLAG1 = TRUE;
   bool FLAG2 = TRUE;
   bool FLAG3 = TRUE;
   bool FLAG4 = TRUE;

   if ((obj1 == NULL) || (OBJ_ARTIFACT (obj1) == FALSE))
      FLAG1 = FALSE;
   if ((obj2 == NULL) || (OBJ_ARTIFACT (obj2) == FALSE))
      FLAG2 = FALSE;
   if ((obj3 == NULL) || (OBJ_ARTIFACT (obj3) == FALSE))
      FLAG3 = FALSE;
   if ((obj4 == NULL) || (OBJ_ARTIFACT (obj4) == FALSE))
      FLAG4 = FALSE;

   if ((!FLAG1) && (!FLAG2) && (!FLAG3) && (!FLAG4))
      return FALSE;		// All 4 were either null or not artifacts

   if ((obj1 != NULL) && (IS_ARTIFACT (obj1, arti_vnum)))
      return TRUE;		// Object 1 is Arti Looked For
   if ((obj2 != NULL) && (IS_ARTIFACT (obj2, arti_vnum)))
      return TRUE;		// Object 2 is Arti Looked For
   if ((obj3 != NULL) && (IS_ARTIFACT (obj3, arti_vnum)))
      return TRUE;		// Object 3 is Arti Looked For
   if ((obj4 != NULL) && (IS_ARTIFACT (obj4, arti_vnum)))
      return TRUE;		// Object 4 is Arti Looked For

   return FALSE;		// Guess nothing matched
}

bool WORN_ARTIFACT (CHAR_DATA * ch, int arti_vnum)
{
   bool FLAG = FALSE;
   OBJ_DATA *obj;
   OBJ_DATA *obj_next;

   for (obj = ch->carrying; obj != NULL; obj = obj_next)
   {
      obj_next = obj->next_content;
      if (obj->wear_loc == WEAR_NONE)
	 continue;

      if ((obj == NULL) || (OBJ_ARTIFACT (obj) == FALSE))
	 continue;

      if (IS_ARTIFACT (obj, arti_vnum))	// Is this the artifact looked for?
	 FLAG = TRUE;

      if (FLAG)
	 return TRUE;		// Positive arti identification
   }

   if (!FLAG)
      return FALSE;		// Everything was either Null or not artifacts

   return FALSE;		// Guess nothing matched
}

OBJ_DATA *get_artifact (CHAR_DATA * ch, int arti_vnum)
{
   bool FLAG = FALSE;
   OBJ_DATA *obj;
   OBJ_DATA *obj_next;

   for (obj = ch->carrying; obj != NULL; obj = obj_next)
   {
      obj_next = obj->next_content;
      if (obj->wear_loc == WEAR_NONE)
	 continue;

      if ((obj == NULL) || (OBJ_ARTIFACT (obj) == FALSE))
	 continue;

      if (IS_ARTIFACT (obj, arti_vnum))	// Is this the artifact looked for?
	 FLAG = TRUE;

      if (FLAG)
	 return obj;		// Positive arti identification
   }

   if (!FLAG)
      return NULL;		// Everything was either Null or not artifacts

   return NULL;			// Guess nothing matched
}