/***************************************************************************
 *  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.                                                  *
 ***************************************************************************/

#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) );

/* 
 * Donate Command
 */
void do_donate(CHAR_DATA *ch, char *argument)
{
 char Object_Name[MAX_INPUT_LENGTH];
 ROOM_INDEX_DATA *xRoom;
 OBJ_DATA *xObject;
 int DONATION_ROOM;

 argument = one_argument(argument, Object_Name);
 if ( Object_Name == '\0' )
 {
   send_to_char("Donate WHAT Object?",ch);
   return;  
 }
 if ( ( xObject= get_obj_carry(ch,Object_Name)) == NULL)
 {
   send_to_char("You can't donate that item! You have not got it!",ch);
   return;
 }
 switch(xObject->item_type)
 {
   case ITEM_WEAPON :
       DONATION_ROOM=DONATION_ROOM_WEAPON;
       break;   
   case ITEM_ARMOR  :
       DONATION_ROOM=DONATION_ROOM_ARMOR;
       break;   
   default :
       DONATION_ROOM=DONATION_ROOM_REST;
       break;   
 }
 if ( ( xRoom = get_room_index(DONATION_ROOM)) == NULL)
 {
   bug("Donate Room Does Not Exist : %d",DONATION_ROOM);
   return;
 }
 act("$p vanishes from your hands in a pink mist.",ch,xObject,NULL,TO_CHAR);
 act("$p vanishes from $n's hands in a pink mist.",ch,xObject,NULL,TO_ROOM);
 obj_from_char(xObject);
 obj_to_room(xObject,xRoom);
 act("$p appears in a pink mist in the room.",ch,xObject,NULL,TO_ROOM);
 return;
}

/* 
 * OutPuts Current Mud Code Version
 */ 
void do_version( CHAR_DATA *ch, char *argument)
{
   char buf[MAX_INPUT_LENGTH];

   sprintf(buf, "\n\r*************************************\n\rGodWars Version Number :- %d\n\r*************************************\n\r",VERSION_NUMBER);
   send_to_char(buf,ch);
   return;
}

void clan_table_write()
{
  int clan_pos;
  int kill_count;
  FILE *fp;

  if ( ( fp = fopen(CLAN_LIST, "w") ) !=NULL) 
  {  
     for(clan_pos=0;clan_pos<=MAX_CLAN-1;clan_pos++)
     {  
         fprintf( fp, "ClanName     %s~\n",clan_table[clan_pos].clan_name);
         fprintf( fp, "ClanLeader   %s~\n",clan_table[clan_pos].clan_leader);
         fprintf( fp, "ClanPower1   %s~\n",clan_table[clan_pos].clan_powers_1);
         fprintf( fp, "ClanPower2   %s~\n",clan_table[clan_pos].clan_powers_2);
         fprintf( fp, "ClanPower3   %s~\n",clan_table[clan_pos].clan_powers_3);
         fprintf( fp, "LowerVnum    %d\n",clan_table[clan_pos].lvnum);
         fprintf( fp, "UpperVnum    %d\n",clan_table[clan_pos].uvnum);
         fprintf( fp, "ClanRecall   %d\n",clan_table[clan_pos].clan_recall);
         fprintf( fp, "ClanKills    ");
         for(kill_count=0;kill_count<=MAX_CLAN-1;kill_count++)
         {
             fprintf(fp, "%d ", clan_table[clan_pos].clan_kills[kill_count]);
         }
         fprintf( fp, "\n"); 
     }
     fclose( fp );
  }
  else
  {
    /*bug("Cannot Open Clan file :- WRITE CLAN TABLE", 0);*/
  }
  return;
}


void clan_table_read()
{
  int clan_pos;
  int kill_count;
  FILE *fp;
  char *dummy;

  if ( ( fp = fopen(CLAN_LIST, "r") ) !=NULL) 
  {  
     for(clan_pos=0;clan_pos<=MAX_CLAN-1;clan_pos++)
     {  
         dummy=fread_word( fp );
         clan_table[clan_pos].clan_name=fread_string( fp );
         dummy=fread_word( fp );
         clan_table[clan_pos].clan_leader=fread_string( fp );
         dummy=fread_word( fp );
         clan_table[clan_pos].clan_powers_1=fread_string( fp );
         dummy=fread_word( fp );   
         clan_table[clan_pos].clan_powers_2=fread_string( fp );
         dummy=fread_word( fp );
         clan_table[clan_pos].clan_powers_3=fread_string( fp );
         dummy=fread_word( fp );
         clan_table[clan_pos].lvnum=fread_number( fp );
         dummy=fread_word( fp );
         clan_table[clan_pos].uvnum=fread_number( fp );
         dummy=fread_word( fp );
         clan_table[clan_pos].clan_recall=fread_number( fp );
         dummy=fread_word( fp );
         for(kill_count=0;kill_count<=MAX_CLAN-1;kill_count++)
         {
             clan_table[clan_pos].clan_kills[kill_count]=fread_number( fp );
         }
     }
  }
  else
  {
    /*bug("Cannot Open Clan Table:- Loading Default Table", 0);*/
    return;
  }
  fclose( fp );
  return;
}

void show_clan_info(CHAR_DATA *ch, char *argument)
{
  char buf[MAX_INPUT_LENGTH];
  int clan_pos;
  int clan_pos_outer;

  if (!strcmp(argument,"more"))
  { 
    sprintf( buf, "\n\r                          Inter-Clan Kills\n\r\n\r");
    send_to_char(buf,ch);
    sprintf( buf,"Clan Name");
    format_string_spaces(buf,15);
    send_to_char(buf,ch);
    for (clan_pos=0;clan_pos<MAX_CLAN-1;clan_pos++)
    {
      sprintf( buf,"%d",clan_pos);
      format_string_spaces(buf,5);
      send_to_char(buf,ch);
    }
    sprintf( buf,"\n\r\n\r");
    send_to_char(buf,ch);
    for (clan_pos_outer=0;clan_pos_outer<MAX_CLAN-1;clan_pos_outer++)
    {
      sprintf( buf,"%d) %s",clan_pos_outer,clan_table[clan_pos_outer].clan_name);
      format_string_spaces(buf,15);
      send_to_char(buf,ch);
      for (clan_pos=0;clan_pos<MAX_CLAN-1;clan_pos++)
      {
         sprintf( buf,"%d",clan_table[clan_pos_outer].clan_kills[clan_pos]);
         format_string_spaces(buf,5);
         send_to_char(buf,ch);
      }
      sprintf( buf,"\n\r");
      send_to_char(buf,ch);
    }
  }
  else
  {
    sprintf( buf, "\n\r                          Current Vampire Clans\n\r\n\r");
    send_to_char(buf,ch);
    sprintf( buf, "Clan Name       Leader          Powers\n\r\n\r");
    send_to_char(buf, ch);
    for (clan_pos=0;clan_pos<MAX_CLAN-1;clan_pos++)
    {
       sprintf( buf,"%s",clan_table[clan_pos].clan_name);
       format_string_spaces(buf,15);
       send_to_char(buf,ch);
       sprintf( buf,"%s",clan_table[clan_pos].clan_leader);
       format_string_spaces(buf,15);
       send_to_char(buf,ch);
       sprintf( buf,"%s",clan_table[clan_pos].clan_powers_1);
       format_string_spaces(buf,12);
       send_to_char(buf,ch);
       sprintf( buf,"%s",clan_table[clan_pos].clan_powers_2);
       format_string_spaces(buf,12);
       send_to_char(buf,ch);
       sprintf( buf,"%s",clan_table[clan_pos].clan_powers_3);
       format_string_spaces(buf,12);
       send_to_char(buf,ch);
       sprintf( buf,"\n\r");
       send_to_char(buf,ch);
    }
    sprintf( buf,"Type 'claninfo more' (to see inter clan kills)\n\r");
    send_to_char(buf,ch);
  }
  return;
}

/*
 * This procedure hands what happens when a vampire is killed
 */

void clan_table_dec(CHAR_DATA *ch,CHAR_DATA *victim)
{
  int ch_pos  = clan_table_search( ch );
  int vic_pos = clan_table_search( victim );

  if ((ch_pos!=-1)||(vic_pos!=-1))
  {
      clan_table[ch_pos].clan_kills[vic_pos]=
      clan_table[ch_pos].clan_kills[vic_pos]+1;
      clan_table_write();
  }
  return;
}

/* 
 * This Procedure handles it when a new vampire clan is created
 * It adds the leaders name the to the clan table
 */

void clan_table_bite(CHAR_DATA *ch)
{
  int clan_pos;

 if (ch->vampgen == 2)
 {  
  for (clan_pos=0;clan_pos<=MAX_CLAN-1;clan_pos++)
  {
    if (!str_cmp(clan_table[clan_pos].clan_name,"None"))
    {
      clan_table[clan_pos].clan_leader=ch->name;
      clan_table_write();
      return;
    }  
  } 
  send_to_char("Please Inform Implenator Not Enough Free Clan Slots", ch);
 }
 return;
}

/*
 * This procedure fills in the players clan name
 */
void clan_table_namefill(CHAR_DATA *ch)
{
  int clan_pos;

  for (clan_pos=0;clan_pos<=MAX_CLAN-1;clan_pos++)
  {
    if (!str_cmp(clan_table[clan_pos].clan_leader,ch->name))
    {
      clan_table[clan_pos].clan_name=ch->clan;
      clan_table_write();
      return;
    }
  }
  return;  
}
 
/*
 * This procedure fills in a clan power name
 */
 
void clan_table_powerselect(CHAR_DATA *ch,char *power_name)
{
   int ch_pos=clan_table_search( ch );
 
   if ((ch->vampgen>2)&&(ch->vampgen!=1))
   {
      return;
   }
   if ((ch_pos != -1) || (ch_pos > MAX_CLAN-1))
   {
      if (!strcmp(clan_table[ch_pos].clan_powers_1,"none"))
      {
        clan_table[ch_pos].clan_powers_1=power_name;
        clan_table_write();
        return;
      }
      else 
      if (!strcmp(clan_table[ch_pos].clan_powers_2,"none"))
      {
        clan_table[ch_pos].clan_powers_2=power_name;        
        clan_table_write();
        return;
      }
      else
      if (!strcmp(clan_table[ch_pos].clan_powers_3,"none"))
      {
        clan_table[ch_pos].clan_powers_3=power_name;
        clan_table_write();
        return;
      }
   }
   return;
}

/*
 * Procedure finds the postion of a vampire clan of a player 
 * in the clan table.  It returns a minus one when it can't
 * find it.
 */

int clan_table_search(CHAR_DATA *ch)
{
  int clan_pos;
  
  for (clan_pos=0;clan_pos<=MAX_CLAN-1;clan_pos++)
  {
    if (!strcmp(ch->clan,clan_table[clan_pos].clan_name))
    {
      return(clan_pos);
    }  
  }
  return(-1);
}

/*
 * This procedure adds spaces to string if it is not long enough
 */

void format_string_spaces(char *argument,int spaces)
{
  int loop_counter;
  int string_length=strlen(argument);

  if (string_length < spaces)
  {
     for (loop_counter=string_length;loop_counter<=spaces;loop_counter++)
     {
        strcat(argument," ");
     }
  }
  return;
}

void do_crap(CHAR_DATA *ch, char *argument)
{
  if (!strcmp(ch->name,"Rotain"))
  {
     clan_table_read();
  }
}

struct clan_table_type clan_table[MAX_CLAN] =
{
  {"None","None","none","none","none",{0,0,0,0,0,0,0,0,0,0},0,0,3001},
  {"None","None","none","none","none",{0,0,0,0,0,0,0,0,0,0},0,0,3001},
  {"None","None","none","none","none",{0,0,0,0,0,0,0,0,0,0},0,0,3001},
  {"None","None","none","none","none",{0,0,0,0,0,0,0,0,0,0},0,0,3001},
  {"None","None","none","none","none",{0,0,0,0,0,0,0,0,0,0},0,0,3001},
  {"None","None","none","none","none",{0,0,0,0,0,0,0,0,0,0},0,0,3001},
  {"None","None","none","none","none",{0,0,0,0,0,0,0,0,0,0},0,0,3001},
  {"None","None","none","none","none",{0,0,0,0,0,0,0,0,0,0},0,0,3001},
  {"None","None","none","none","none",{0,0,0,0,0,0,0,0,0,0},0,0,3001},
  {"None","None","none","none","none",{0,0,0,0,0,0,0,0,0,0},0,0,3001},
  {"None","None","none","none","none",{0,0,0,0,0,0,0,0,0,0},0,0,3001},
};