atd/area/
atd/build/
atd/clans/
atd/log/
atd/player/store/
atd/site/
atd/src/bin/
#include <sys/time.h>
#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "merc.h"
#include "commands.h"

void load_kingdoms(void) {

	FILE *fp;
	int i;
	int vnum;

	king_table[0].name = str_dup("");
	king_table[0].who_name = str_dup("");
	king_table[0].leader_name = str_dup("");
	king_table[0].pk = 0;
	king_table[0].pd = 0;
	king_table[0].num = 0;
        king_table[0].recall = 0;
        king_table[0].altar = 0;

	if ((fp = fopen("../data/kingdom.dat", "r")) == NULL) {
	log_string("Error: kingdom.dat not found!");
	exit(1);}

        for (i = 1; i < MAX_KINGDOM; i++) {
       
        vnum = 90000 + i*100;
        
	king_table[i].name = fread_string(fp);
	king_table[i].who_name = fread_string(fp);
	king_table[i].leader_name = fread_string(fp);
	king_table[i].pk = fread_number(fp);
	king_table[i].pd = fread_number(fp);
	king_table[i].num = i;
	king_table[i].recall = fread_number(fp);
        king_table[i].altar = fread_number(fp);
	}	

	fclose(fp);
	return;
}


void save_kingdoms(void) {

	FILE *fp;
	int i;

	if ((fp = fopen("../data/kingdom.dat","w")) == NULL) {
	log_string("Error writing to kingdom.dat");
	}

	for (i = 1; i < MAX_KINGDOM; i++) {
	fprintf(fp,"%s~\n", king_table[i].name);
	fprintf(fp,"%s~\n", king_table[i].who_name);
	fprintf(fp,"%s~\n", king_table[i].leader_name);
	fprintf(fp, "%d\n%d\n",king_table[i].pk, king_table[i].pd);
        fprintf(fp, "%d\n%d\n",king_table[i].recall,king_table[i].altar);
	}

	fclose(fp);
	return;
}

void do_kinglist(CHAR_DATA *ch, char *argument) {

	char buf[MAX_STRING_LENGTH];
        char rep[MAX_STRING_LENGTH];
        int KRatio;
	int i;

	if (IS_NPC(ch)) return;

	sprintf(buf, "{WClan                Leader      PKs     PDs     Ratio  Symbol{x\n\r" );
        send_to_char(buf,ch);
	sprintf(buf, "{R----                ------      ---     ---     -----  ------{x\n\r" );
	send_to_char(buf,ch);
	for (i = 1; i < MAX_KINGDOM; i++) {
           if ((king_table[i].pk + king_table[i].pd) != 0)
           {
             KRatio = (int)((float)king_table[i].pk/(float)(king_table[i].pk + king_table[i].pd)*100);
             sprintf(rep, "%4d#+", KRatio);
           }  
           else
           {
             KRatio = 100;
             sprintf(rep, "%4d#+", KRatio);
           }
	sprintf(buf, "{C%-25s {W%-12s {R%-7d {B%-7d {W%-4s  {w%-5s{x\n\r", 
	king_table[i].name,
	king_table[i].leader_name,
	king_table[i].pk,
	king_table[i].pd,
        rep,
        king_table[i].who_name);
	send_to_char(buf,ch);
	}
	send_to_char("\n\r", ch );

	return;
}

void do_induct(CHAR_DATA *ch, char *argument) {

	CHAR_DATA *victim;
	char arg[MAX_STRING_LENGTH];
        char buf[MAX_STRING_LENGTH];

	argument = one_argument(argument,arg);

	if (IS_NPC(ch)) return;

	if (ch->pcdata->kingdom == 0) {
	send_to_char("You are not in a clan.\n\r", ch );
	return;}

	if (str_cmp(ch->name,king_table[ch->pcdata->kingdom].leader_name)
		&& !IS_SET(ch->special, SPC_PRINCE) 
		&& !IS_SET(ch->special, SPC_LEADER))
	 {
		send_to_char("You cannot induct people.\n\r", ch );
		return;
	}

	if ((victim = get_char_room(ch, arg)) == NULL) {
	send_to_char("They are not here.\n\r", ch );
	return;}

	if (IS_NPC(victim)) {
	send_to_char("Not on NPCs.\n\r", ch );
	return;}

	if (!IS_SET(victim->newbits, NEW_CLANNABLE)) {
	send_to_char("That person is not CLANNABLE.\n\r", ch );
	return;}

	if (victim->pcdata->kingdom != 0) {
	send_to_char("That person is already clanned.\n\r", ch );
	return;}

	victim->pcdata->kingdom = ch->pcdata->kingdom;
	if (IS_SET(victim->special, SPC_PRINCE)) 
	REMOVE_BIT(victim->special, SPC_PRINCE);
	send_to_char("They are now in your clan.\n\r", ch);
	send_to_char("You are now in a clan.\n\r", victim);
        sprintf(buf, "%s has joined %s!", victim->name, king_table[ch->pcdata->kingdom].who_name);
        do_info(ch, buf);
	save_char_obj(victim);
	return;
}

void do_outcast(CHAR_DATA *ch, char *argument) {

	CHAR_DATA *victim;
	char arg[MAX_STRING_LENGTH];
        char buf[MAX_STRING_LENGTH];
	argument = one_argument(argument, arg);

	if (IS_NPC(ch)) return;

	if (ch->pcdata->kingdom == 0) {
	send_to_char("You are not in a clan.\n\r", ch );
	return;}

/*	if (str_cmp(ch->name,king_table[ch->pcdata->kingdom].leader_name)) {
	send_to_char("You are not a clan leader.\n\r", ch );
	return;}*/

        if ( IS_SET(ch->special, SPC_LEADER) 
	   && str_cmp(ch->name,king_table[ch->pcdata->kingdom].leader_name))
        {
        send_to_char("You are not a King or Queen.\n\r", ch);
        return;
        }

	if ((victim = get_char_world(ch, arg)) == NULL ) {
	send_to_char("They are not here.\n\r", ch );
	return;}

	if (IS_NPC(victim)) {
	send_to_char("Not on NPCs.\n\r", ch );
	return;}

	if (victim->pcdata->kingdom != ch->pcdata->kingdom) {
	send_to_char("They are not in your clan.\n\r", ch );
	return;}

	if (ch == victim) {
	send_to_char("You can't outcast yourself.\n\r", ch );
	return;}

	victim->pcdata->kingdom = 0;
	if (IS_SET(victim->special, SPC_PRINCE))
	REMOVE_BIT(victim->special, SPC_PRINCE);
	send_to_char("You remove them from your clan.\n\r", ch );
	send_to_char("You have been outcasted from your clan!\n\r",victim);	
        sprintf(buf, "%s has been outcasted from %s!", victim->name, king_table[ch->pcdata->kingdom].who_name);
        do_info(ch, buf);
	return;
}

void do_prince(CHAR_DATA *ch, char *argument) {

	CHAR_DATA *victim;
	char arg[MAX_STRING_LENGTH];
        char buf[MAX_STRING_LENGTH];

	argument = one_argument(argument, arg);

	if (IS_NPC(ch)) return;

	if (ch->pcdata->kingdom == 0) {
	send_to_char("You are not in a clan.\n\r", ch );
	return;}

/*	if (str_cmp(ch->name,king_table[ch->pcdata->kingdom].leader_name)) {
	send_to_char("You are not the leader of your clan.\n\r", ch );
	return;}*/

        if (!IS_SET(ch->special, SPC_LEADER) || (str_cmp(ch->name,king_table[ch->pcdata->kingdom].leader_name)))
        {
        send_to_char("You are not a King or Queen.\n\r", ch);
        return; 
        }

	if ((victim = get_char_room(ch, arg)) == NULL) {
	send_to_char("They are not here.\n\r", ch );
	return;}

	if (IS_NPC(victim)) {
	send_to_char("Not on NPCs.\n\r", ch );
	return;}

	if (victim->pcdata->kingdom != ch->pcdata->kingdom) {
	send_to_char("They are not in your clan.\n\r", ch );
	return;}

	if (ch == victim) {
	send_to_char("You can't do that.\n\r", ch );
	return;}

	if (IS_SET(victim->special, SPC_PRINCE)) {
	REMOVE_BIT(victim->special, SPC_PRINCE);
	send_to_char("You are no longer a prince.\n\r", victim);
	send_to_char("They are no longer a prince.\n\r", ch );
        sprintf(buf, "%s is no longer prince of %s!", victim->name, king_table[ch->pcdata->kingdom].who_name);
        do_info(ch, buf);
	save_char_obj(victim);
	return;}

	SET_BIT(victim->special, SPC_PRINCE);
	send_to_char("You are now a prince!\n\r", victim);
	send_to_char("You make them a prince.\n\r", ch );
        sprintf(buf, "%s is now Prince of %s!", victim->name, king_table[ch->pcdata->kingdom].who_name);
        do_info(ch, buf);
	save_char_obj(victim);
	return;
}

void do_clannable(CHAR_DATA *ch, char *argument) {

	if (IS_NPC(ch)) return;

	if (ch->pcdata->kingdom != 0) {
	send_to_char("You already are in a clan.\n\r", ch );
	return;}

	if (IS_SET(ch->newbits, NEW_CLANNABLE)) {
	REMOVE_BIT(ch->newbits, NEW_CLANNABLE);
	send_to_char("You can no longer be clanned.\n\r", ch );
	return;}

	SET_BIT(ch->newbits, NEW_CLANNABLE);
	send_to_char("You can now be clanned.\n\r", ch );

	return;
}

void do_kingdom(CHAR_DATA *ch, char *argument)
{

    char buf[MAX_STRING_LENGTH];
    CHAR_DATA *gch;
   char rankname[9];

    if (IS_NPC(ch)) return;

	if (ch->pcdata->kingdom == 0) {
	send_to_char("You are not in a kingdom.\n\r", ch );
	return;}

	sprintf(buf, "%s's Kingdom of %s:\n\r",
	king_table[ch->pcdata->kingdom].leader_name,
	king_table[ch->pcdata->kingdom].name);

    send_to_char( buf, ch );
    send_to_char("#2[    Name    ] [ Hits ] [ HPmax ] [ Mana ] [ Move ] [ Status ] [   Rank    ]#n\n\r",ch );
    for ( gch = char_list; gch != NULL; gch = gch->next )
    {
	if ( IS_NPC(gch) ) continue;
	if ( gch->pcdata->kingdom != ch->pcdata->kingdom) 
	    continue;
	if ((!str_cmp(king_table[ch->pcdata->kingdom].leader_name,gch->name) || IS_SET( gch->special,
SPC_LEADER)) && gch->sex == 1 ) 
	sprintf(rankname,"King");
	else if ((!str_cmp(king_table[ch->pcdata->kingdom].leader_name,gch->name) || IS_SET( gch->special, SPC_LEADER)) && gch->sex == 2 )
	sprintf(rankname,"Queen");
	else if (IS_SET(gch->special, SPC_PRINCE) && gch->sex == 1 ) 
	sprintf(rankname, "Prince");
        else if ( IS_SET( gch->special, SPC_PRINCE) && gch->sex == 2 )
        sprintf(rankname, "Princess"); 
 	else
	 sprintf(rankname,"Member");

/*        if (ch->pcdata->stats[KINGDOM_RANK] == 1)
          sprintf(rankname, "%s",king_table[ch->pcdata->kingdom].rank1);
        else if (ch->pcdata->stats[KINGDOM_RANK] == 2)
          sprintf(rankname, "Jew");
        else
          sprintf(rankname,"Blah");*/

	    sprintf( buf,
	    "#2[#n%-12s#2] [#n%6ld#2] [#n%7ld#2] [#n%6ld#2] [#n%6ld#2] [#n %-2d   #2] [ #n%-9s #2]#n\n\r",
		gch->name ,
		gch->hit,gch->max_hit,gch->mana,gch->move,
		gch->race, rankname);
		send_to_char( buf, ch );
    }
    return;
    }


void do_krecall(CHAR_DATA *ch, char *argument) 
{

	CHAR_DATA *victim;
	CHAR_DATA *mount;
	ROOM_INDEX_DATA *location;

	if (IS_NPC(ch)) return;

   if (ch->fight_timer >0) 
   {
        send_to_char("Not until your fight timer expires.\n\r", ch );
        return;
   }

   if (ch->pcdata->kingdom == 0)
   {
	send_to_char("Huh?\n\r", ch );
	return;
   }

	act("$n's body flickers with green energy.",ch,NULL,NULL,TO_ROOM);
	act("Your body flickers with green energy.",ch,NULL,NULL,TO_CHAR);

	if ( !(location = get_room_index(king_table[ch->pcdata->kingdom].recall))) 
	{
	send_to_char("You are completely lost.\n\r", ch );
	return;
	}

	if (ch->in_room == location) return;

	if (IS_SET(ch->in_room->room_flags, ROOM_NO_RECALL) || IS_AFFECTED(ch, AFF_CURSE)) {
	send_to_char("You are unable to recall.\n\r", ch );
	return;}

	if ((victim = ch->fighting) != NULL) {
	if (number_bits(1) == 0) {
		WAIT_STATE(ch,4);
		send_to_char("You failed!\n\r", ch );
		return;}
	send_to_char("You recall from combat!\n\r", ch );
	stop_fighting(ch,TRUE);
	}

	act("$n dissapears.",ch,NULL,NULL,TO_ROOM);
	char_from_room(ch);
	char_to_room(ch,location);
	act("$n appears in the room.",ch,NULL,NULL,TO_ROOM);
	do_look(ch,"auto");
	if ((mount = ch->mount) == NULL) return;
	char_from_room(mount);
	char_to_room(mount,ch->in_room);
	
	return;
}

void do_crown(CHAR_DATA *ch, char *argument)
{
	CHAR_DATA *victim;
	char arg[MAX_STRING_LENGTH];
	char buf[MAX_STRING_LENGTH];

	argument = one_argument( argument, arg);

	if (IS_NPC(ch))	return;

        if (ch->pcdata->kingdom == 0)
 	{
        send_to_char("You are not in a clan.\n\r", ch );
        return;
	}

        if (str_cmp(ch->name,king_table[ch->pcdata->kingdom].leader_name))
	{
        send_to_char("You are not the leader of your clan.\n\r", ch );
        return;
	}

        if ((victim = get_char_room(ch, arg)) == NULL) 
	{
        send_to_char("They are not here.\n\r", ch );
        return;
	}

        if (IS_NPC(victim)) 
	{
        send_to_char("Not on NPCs.\n\r", ch );
        return;
	}

        if (victim->pcdata->kingdom != ch->pcdata->kingdom) 
	{
        send_to_char("They are not in your clan.\n\r", ch );
        return;
	}

        if (ch == victim) 
	{
        send_to_char("You can't do that.\n\r", ch );
        return;
	} 	 

    if (!str_cmp(ch->name, victim->pcdata->marriage) && !str_cmp(victim->name, ch->pcdata->marriage))
    {
        if (!IS_EXTRA(ch,EXTRA_MARRIED) || !IS_EXTRA(victim,EXTRA_MARRIED))
	{
	 stc("You must be married with them to do this.\n\r",ch);
	 return;
	}
    }

        if (IS_SET(victim->special, SPC_LEADER)) 
	{
        REMOVE_BIT(victim->special, SPC_LEADER);
	 if ( victim->sex == 1 )
	 {
         send_to_char("You are no longer a king.\n\r", victim);
         send_to_char("They are no longer a king.\n\r", ch );
         sprintf(buf, "%s is no longer king of %s!", victim->name, king_table[ch->pcdata->kingdom].who_name );
         do_info(ch, buf);
	 }
	 if ( victim->sex == 2 )
	 {
	 stc("You are no longer a queen.\n\r",victim);
	 stc("They are no longer a queen.\n\r",ch);
	 sprintf(buf, "%s is no longer queen of %s!", victim->name, king_table[ch->pcdata->kingdom].who_name );
	 do_info( ch,buf );
	 }
        save_char_obj(victim);
        return;
	}

        SET_BIT(victim->special, SPC_LEADER);
	 if ( victim->sex == 1 )
	 {
         send_to_char("You are now a King!\n\r", victim);
         send_to_char("You make them a king.\n\r", ch );
         sprintf(buf, "%s is now King of %s!", victim->name, king_table[ch->pcdata->kingdom].who_name );
         do_info(ch, buf);
	 }
	 if ( victim->sex == 2 )
	 {
	 send_to_char("You are now a Queen!\n\r", victim);
         send_to_char("You make them a queen.\n\r", ch );
         sprintf(buf, "%s is now Queen of %s!", victim->name, king_table[ch->pcdata->kingdom].who_name );
         do_info(ch, buf);
	 }
        save_char_obj(victim);
        return;
}

void do_removeclan(CHAR_DATA *ch, char *argument) {

     char buf[MAX_STRING_LENGTH];

	if (IS_NPC(ch)) return;

	if ( ch->pcdata->kingdom == -1 )
	{
	 stc("You are exiled!\n\r",ch);
	 return;
	}

	ch->pcdata->kingdom = 0;
	if (IS_SET(ch->special, SPC_PRINCE))
	REMOVE_BIT(ch->special, SPC_PRINCE);
	send_to_char("You have removed yourself from your kingdom.\n\r", ch );
	send_to_char("You feel cold and empty without your once loved kingdom.!\n\r",ch);	
        sprintf(buf, "%s has left their kingdom!", ch->name );
        do_info(ch, buf);
}

void do_cpromote(CHAR_DATA *ch, char *argument)
{
        CHAR_DATA *victim;
        char arg[MAX_STRING_LENGTH];
        
        argument = one_argument( argument, arg);
        
        if (IS_NPC(ch)) return;
        
        if (ch->pcdata->kingdom == 0)
        {
        send_to_char("You are not in a clan.\n\r", ch );
        return;
        }

        if (str_cmp(ch->name,king_table[ch->pcdata->kingdom].leader_name))
        {
        send_to_char("You are not the leader of your clan.\n\r", ch );
        return;
        }
        
        if ((victim = get_char_room(ch, arg)) == NULL)
        {
        send_to_char("They are not here.\n\r", ch );
        return;
        }
         
        if (IS_NPC(victim))
        {
        send_to_char("Not on NPCs.\n\r", ch );
        return; 
        }
         
        if (victim->pcdata->kingdom != ch->pcdata->kingdom)
        {
        send_to_char("They are not in your clan.\n\r", ch );
        return;
        }
         
/*        if (ch == victim)
        {
        send_to_char("You can't do that.\n\r", ch );
        return;
        }*/

        if (ch->pcdata->stats[KINGDOM_RANK] < 10)
        {
        send_to_char("You need to have level 10 rank to do this.\n\r",ch);
        return;
        }

        if (victim->pcdata->stats[KINGDOM_RANK] >= 10)
        {
        send_to_char("You cannot promote them anymore.\n\r",ch);
        return;
        }

        victim->pcdata->stats[KINGDOM_RANK] += 1;                  
        return;
}

void do_cdemote(CHAR_DATA *ch, char *argument)
{
        CHAR_DATA *victim;
        char arg[MAX_STRING_LENGTH];
        
        argument = one_argument( argument, arg);
        
        if (IS_NPC(ch)) return;
        
        if (ch->pcdata->kingdom == 0)
        {
        send_to_char("You are not in a clan.\n\r", ch );
        return;
        }

        if (str_cmp(ch->name,king_table[ch->pcdata->kingdom].leader_name))
        {
        send_to_char("You are not the leader of your clan.\n\r", ch );
        return;
        }
        
        if ((victim = get_char_room(ch, arg)) == NULL)
        {
        send_to_char("They are not here.\n\r", ch );
        return;
        }
         
        if (IS_NPC(victim))
        {
        send_to_char("Not on NPCs.\n\r", ch );
        return; 
        }
         
        if (victim->pcdata->kingdom != ch->pcdata->kingdom)
        {
        send_to_char("They are not in your clan.\n\r", ch );
        return;
        }
         
        if (ch == victim)
        {
        send_to_char("You can't do that.\n\r", ch );
        return;
        }

        if (ch->pcdata->stats[KINGDOM_RANK] < 10)
        {
        send_to_char("You need to have level 10 rank to do this.\n\r",ch);
        return;
        }

        if (victim->pcdata->stats[KINGDOM_RANK] == 1)
        {
        send_to_char("You cannot demote them anymore.\n\r",ch);
        return;
        }

        victim->pcdata->stats[KINGDOM_RANK] -= 1;                  
        return;
}

void do_kset(CHAR_DATA *ch, char *argument) {
        
        char arg1[MAX_STRING_LENGTH];
        char arg2[MAX_STRING_LENGTH];
        char arg3[MAX_STRING_LENGTH];
        int value;
        
        smash_tilde(argument);

        argument = one_argument(argument, arg1); /* command */
	strcpy( arg3, argument );
        argument = one_argument(argument, arg2); /* value */
        
        if (IS_NPC(ch)) return;
        
        if (arg1[0] == '\0' || arg2[0] == '\0')
	{
                send_to_char("Syntax:  clanset [part] [value]\n\r", ch );
        	send_to_char("things:  name, whoname, recall, rank[1-10]\n\r\n\r", ch );
                return;
	}
        
        value = ch->pcdata->kingdom;
        
        
        if (!str_cmp(arg1,"name"))
	{
	        free_string(king_table[value].name);
	        king_table[value].name = str_dup(arg3);
        }
        else if (!str_cmp(arg1,"whoname"))
        {
       		free_string(king_table[value].who_name);
	        king_table[value].who_name = str_dup(arg2);
	}
	else if( !str_cmp(arg1,"recall"))
	{
		int x;
		if( !is_number( arg2 ) )
		{
		    stc( "Recall must be a valid room number.\n\r", ch);
		    return;
		}
		x = atoi( arg2 );
		
		if( !get_room_index( x ) )
		{
		    ch_printf( ch, "%d is not a valid room.\n\r", x );
		    return;
		}
		
		king_table[value].recall = x;
	}
        else
        {
	        send_to_char("Nothing set.\n\r", ch );
        	return;
        }

        send_to_char("Done.\n\r", ch );
        save_kingdoms();
        return;
}