cotn/notes/
cotn/src/
/***************************************************************************
 *  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.                                                  *
 ***************************************************************************/
/***************************************************************************
 *                                 _/                            _/        *
 *      _/_/_/  _/_/      _/_/_/  _/    _/_/    _/    _/    _/_/_/         *
 *     _/    _/    _/  _/        _/  _/    _/  _/    _/  _/    _/          *
 *    _/    _/    _/  _/        _/  _/    _/  _/    _/  _/    _/           *
 *   _/    _/    _/    _/_/_/  _/    _/_/      _/_/_/    _/_/_/            *
 ***************************************************************************
 * Mindcloud Copyright 2001-2003 by Jeff Boschee (Zarius),                 *
 * Additional credits are in the help file CODECREDITS                     *
 * All Rights Reserved.                                                    *
 ***************************************************************************/
/***********************************
 * Dystopian Kingdom Code, by Jobo *
 ***********************************/

#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "merc.h"
#include "interp.h"

void imm_kset args((CHAR_DATA * ch, char *argument));

void save_kingdoms()
{
        int       i;
        FILE     *fp;

        if ((fp = fopen("../txt/kingdoms.txt", "w")) == NULL)
        {
                log_string(LOG_ERR, "Error writing to kingdoms.txt");
                return;
        }
        for (i = 1; i <= MAX_KINGDOM; i++)
        {
                fprintf(fp, "%s~\n", kingdom_table[i].name);
                fprintf(fp, "%s~\n", kingdom_table[i].whoname);
                fprintf(fp, "%s~\n", kingdom_table[i].leader);
                fprintf(fp, "%s~\n", kingdom_table[i].general);
                fprintf(fp, "%s~\n", kingdom_table[i].rankl);
                fprintf(fp, "%s~\n", kingdom_table[i].rankp);
                fprintf(fp, "%s~\n", kingdom_table[i].rank1m);
                fprintf(fp, "%s~\n", kingdom_table[i].rank2m);
                fprintf(fp, "%s~\n", kingdom_table[i].rank3m);
                fprintf(fp, "%s~\n", kingdom_table[i].rank4m);
                fprintf(fp, "%s~\n", kingdom_table[i].rank5m);
                fprintf(fp, "%s~\n", kingdom_table[i].rank1f);
                fprintf(fp, "%s~\n", kingdom_table[i].rank2f);
                fprintf(fp, "%s~\n", kingdom_table[i].rank3f);
                fprintf(fp, "%s~\n", kingdom_table[i].rank4f);
                fprintf(fp, "%s~\n", kingdom_table[i].rank5f);
                fprintf(fp, "%d\n", kingdom_table[i].recall);
                fprintf(fp, "%d %d %d\n",
                        kingdom_table[i].kills, kingdom_table[i].deaths,
                        kingdom_table[i].qps);
                fprintf(fp, "%d %d %d %d\n", kingdom_table[i].req_hit,
                        kingdom_table[i].req_move, kingdom_table[i].req_mana,
                        kingdom_table[i].req_qps);
        }
        fclose(fp);
}

void load_kingdoms()
{
        int       i;
        FILE     *fp;

        kingdom_table[0].name = "";
        kingdom_table[0].whoname = "";
        kingdom_table[0].leader = "";
        kingdom_table[0].general = "";
        kingdom_table[0].rankl = "";
        kingdom_table[0].rankp = "";
	kingdom_table[0].rank1m = "";
        kingdom_table[0].rank2m = "";
        kingdom_table[0].rank3m = "";
        kingdom_table[0].rank4m = "";
        kingdom_table[0].rank5m = "";
        kingdom_table[0].rank1f = "";
        kingdom_table[0].rank2f = "";
        kingdom_table[0].rank3f = "";
        kingdom_table[0].rank4f = "";
        kingdom_table[0].rank5f = "";
        kingdom_table[0].kills = 0;
        kingdom_table[0].deaths = 0;
        kingdom_table[0].qps = 0;
        kingdom_table[0].req_hit = 0;
        kingdom_table[0].req_move = 0;
        kingdom_table[0].req_mana = 0;
        kingdom_table[0].req_qps = 0;

        if ((fp = fopen("../txt/kingdoms.txt", "r")) == NULL)
        {
                log_string(LOG_ERR, "Fatal Error: kingdoms.txt not found!");
                exit(1);
        }
        for (i = 1; i <= MAX_KINGDOM; i++)
        {
                kingdom_table[i].name = fread_string(fp);
                kingdom_table[i].whoname = fread_string(fp);
                kingdom_table[i].leader = fread_string(fp);
                kingdom_table[i].general = fread_string(fp);
                kingdom_table[i].rankl = fread_string(fp);
                kingdom_table[i].rankp = fread_string(fp);
                kingdom_table[i].rank1m = fread_string(fp);
                kingdom_table[i].rank2m = fread_string(fp);
                kingdom_table[i].rank3m = fread_string(fp);
                kingdom_table[i].rank4m = fread_string(fp);
                kingdom_table[i].rank5m = fread_string(fp);
                kingdom_table[i].rank1f = fread_string(fp);
                kingdom_table[i].rank2f = fread_string(fp);
                kingdom_table[i].rank3f = fread_string(fp);
                kingdom_table[i].rank4f = fread_string(fp);
                kingdom_table[i].rank5f = fread_string(fp);
                kingdom_table[i].recall = fread_number(fp);
                kingdom_table[i].kills = fread_number(fp);
                kingdom_table[i].deaths = fread_number(fp);
                kingdom_table[i].qps = fread_number(fp);
                kingdom_table[i].req_hit = fread_number(fp);
                kingdom_table[i].req_move = fread_number(fp);
                kingdom_table[i].req_mana = fread_number(fp);
                kingdom_table[i].req_qps = fread_number(fp);
        }
        fclose(fp);
}

void do_kingdoms(CHAR_DATA * ch, char *argument)
{
        char      buf[MAX_STRING_LENGTH];
        char      buf2[MAX_STRING_LENGTH];
        char      pkratio[20];  // perhaps some colors :)
        int       i;

        if (IS_NPC(ch))
                return; 
        
	send_to_char("#C------------------------------------------------------------------------------------------#n\n\r",ch);  
        xprintf(buf, "#C| #L%-14s #C| #L%7s #C| #L%7s #C| #L%12s #C| #L%6s #C| #L%6s #C| #L%6s #C| #L%7s #C|\n\r",
			"Name", "Pkills", "Pdeaths", "Leader", "HP", "MV", "MA", "Bones");
	stc(buf,ch);

        for (i = 1; i <= MAX_KINGDOM; i++)
        {
                /*
                 * calculation ratio
                 */
                if (kingdom_table[i].kills > 0)
                {
                        if (100 * kingdom_table[i].kills /
                            (kingdom_table[i].kills +
                             kingdom_table[i].deaths) < 100)
                                xprintf(pkratio, "0.%-2d",
                                        (100 * kingdom_table[i].kills /
                                         (kingdom_table[i].kills +
                                          kingdom_table[i].deaths)));
                        else
                                xprintf(pkratio, "1.00");
                }
                else
                        xprintf(pkratio, "0.00");

                /*
                 * buffering everything
                 */
        
        	send_to_char("#C------------------------------------------------------------------------------------------#n\n\r",ch);
                xprintf(buf2,
                        "#C| #W%-14s #C| #W%7d #C| #W%7d #C| #W%12s #C| #W%6d #C| #W%6d #C| #W%6d #C| #W%7d #C|#n\n",
			kingdom_table[i].name, kingdom_table[i].kills,
                        kingdom_table[i].deaths, kingdom_table[i].leader,
                        kingdom_table[i].req_hit, kingdom_table[i].req_move,
                        kingdom_table[i].req_mana, kingdom_table[i].req_qps);
                stc(buf2,ch);

	}
	send_to_char("#C------------------------------------------------------------------------------------------#n\n\r",ch);
        return;
}

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

        one_argument(argument, arg);

        if (IS_NPC(ch))
                return;
        if (ch->pcdata->kingdom == 0)
        {
                send_to_char("What kingdoms did you say you where from ?\n\r",
                             ch);
                return;
        }
        if (str_cmp(kingdom_table[ch->pcdata->kingdom].leader, ch->name) &&
            str_cmp(kingdom_table[ch->pcdata->kingdom].general, ch->name))
        {
                send_to_char
                        ("Talk to your kingdom leaders, they are the only persons allowed to induct new members.\n\r",
                         ch);
                return;
        }
        if ((victim = get_char_room(ch, NULL, arg)) == NULL)
        {
                send_to_char("They are not here.\n\r", ch);
                return;
        }
        if( victim->pcdata->KdefectTimer > current_time && !IS_IMMORTAL(victim) )
        {
        	stc( "They have not yet overcome thier guilt for defecting from their previous kingdom.\n\r", ch );
        	return;
	}

        if (IS_NPC(victim))
        {
                send_to_char("That's silly.\n\r", ch);
                return;
        }
        if (victim->pcdata->kingdom != 0)
        {
                send_to_char
                        ("They are already a member of another kingdom.\n\r",
                         ch);
                return;
        }
        if (victim->max_hit < kingdom_table[ch->pcdata->kingdom].req_hit ||
            victim->max_move < kingdom_table[ch->pcdata->kingdom].req_move ||
            victim->bones < kingdom_table[ch->pcdata->kingdom].req_qps ||
            victim->max_mana < kingdom_table[ch->pcdata->kingdom].req_mana)
        {
                send_to_char("They don't have the reqs to get inducted.\n\r",
                             ch);
                return;
        }
        if (!IS_SET(victim->pcdata->jflags, JFLAG_WANT_KINGDOM))
        {
                send_to_char("They don't want to be inducted.\n\r", ch);
                return;
        }
        victim->pcdata->kingdom = ch->pcdata->kingdom;
        victim->bones -= kingdom_table[ch->pcdata->kingdom].req_qps;
        kingdom_table[ch->pcdata->kingdom].qps +=
                kingdom_table[ch->pcdata->kingdom].req_qps;
        send_to_char("You induct them into your kingdom.\n\r", ch);
        xprintf(buf, "#W%s #nhas been induct into %s#n\n\r", victim->name, kingdom_table[ch->pcdata->kingdom].whoname);
        do_info(NULL, buf);
        return;
}

void do_kpromote(CHAR_DATA * ch, char *argument)
{
        CHAR_DATA *victim;
        char      arg1[MAX_INPUT_LENGTH];
	char	  arg2[MAX_INPUT_LENGTH];

	argument = one_argument(argument, arg1);
        one_argument(argument, arg2);

        if (IS_NPC(ch))
                return;

        if (ch->pcdata->kingdom == 0)
        {
                send_to_char("What kingdoms did you say you where from ?\n\r", ch);
                return;
        }
        if (str_cmp(kingdom_table[ch->pcdata->kingdom].leader, ch->name) &&
            str_cmp(kingdom_table[ch->pcdata->kingdom].general, ch->name))
        {
                send_to_char("Talk to your kingdom leaders, they are the only persons allowed to promote members.\n\r", ch);
                return;
        }
        if ((victim = get_char_room(ch, NULL, arg1)) == NULL)
        {
                send_to_char("They are not here.\n\r", ch);
                return;
        }
        if (IS_NPC(victim))
        {
                send_to_char("That's silly.\n\r", ch);
                return;
        }
        if (victim->pcdata->kingdom != ch->pcdata->kingdom)
        {
                send_to_char("They are already a member of another kingdom.\n\r", ch);
                return;
        }

	if (atoi(arg2) < 0 || atoi(arg2) > 5)
	{
		stc("You must choose between 1 and 5 for your promotion ranks.\n\r",ch);
		return;
	}

	victim->pcdata->kingrank = atoi(arg2);
	send_to_char("You have been promoted!\n\r",victim);
	send_to_char("Done.\n\r",ch);
	return;
}	

void do_wantkingdom(CHAR_DATA * ch, char *argument)
{
        if (IS_NPC(ch))
                return;

        if (IS_SET(ch->pcdata->jflags, JFLAG_WANT_KINGDOM))
        {
                REMOVE_BIT(ch->pcdata->jflags, JFLAG_WANT_KINGDOM);
                send_to_char("You can no longer be inducted.\n\r", ch);
                return;
        }
        SET_BIT(ch->pcdata->jflags, JFLAG_WANT_KINGDOM);
        send_to_char("You can now be inducted.\n\r", ch);
        return;
}

void do_kdeposit(CHAR_DATA * ch, char *argument)
{
        //char arg1[MAX_STRING_LENGTH];
        char      buf[MAX_STRING_LENGTH];
        int       amt;

        if (IS_NPC(ch))
                return;

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

        amt = atoi(argument);
        if (amt < 1)
        {
                send_to_char("Syntax: kdeposit <amt>\n\r", ch);
                return;
        }

        if (amt > ch->bones)
        {
                send_to_char
                        ("My my my, you have philanthropy down to an artform?\n\rYou give away more then you own!\n\r",
                         ch);
                return;
        }

        xprintf(buf, "You deposit %d bones into the kingdom treasury.\n\r",
                amt);
        send_to_char(buf, ch);
        xprintf(buf, "%s has deposited %d bones into the kingdom treasury.",
                ch->name, amt);
        do_info(ch, buf);
        make_note("Kingdom", "Kingdom Clerk",
                  kingdom_table[ch->pcdata->kingdom].name, "Treasury Grows",
                  7, buf);

        ch->bones -= amt;
        kingdom_table[ch->pcdata->kingdom].qps += amt;
        save_char_obj(ch);
        save_kingdoms();
}

void do_kset(CHAR_DATA * ch, char *argument)
{
        char      keyword[MAX_INPUT_LENGTH];

        if (IS_NPC(ch))
                return;
        if (ch->level > 6)
        {
                imm_kset(ch, argument);
                return;
        }
        argument = one_argument(argument, keyword);

        if (ch->pcdata->kingdom == 0)
        {
                send_to_char("But you are not a member of a kingdom.\n\r",
                             ch);
                return;
        }
        if (str_cmp(kingdom_table[ch->pcdata->kingdom].leader, ch->name))
        {
                send_to_char
                        ("Only the leader can change the kingdom settings.\n\r",
                         ch);
                return;
        }
        if (keyword[0] == '\0' || argument[0] == '\0')
        {
                send_to_char("What do you want to change ?\n\r\n\r", ch);
                send_to_char("req_mana, req_hit, req_move, req_qps, general\n\r", ch);
		send_to_char("rankl, rankp, rank1m, rank2m, rank3m, rank4m, rank5m\n\r",ch);
		send_to_char("rank1f, rank2f, rank3f, rank4f, rank5f\n\r",ch);
                return;
        }
        if (!str_cmp(keyword, "req_mana"))
        {
                kingdom_table[ch->pcdata->kingdom].req_mana = atoi(argument);
        }
        else if (!str_cmp(keyword, "req_qps"))
        {
                kingdom_table[ch->pcdata->kingdom].req_qps = atoi(argument);
        }
        else if (!str_cmp(keyword, "req_hit"))
        {
                kingdom_table[ch->pcdata->kingdom].req_hit = atoi(argument);
        }
        else if (!str_cmp(keyword, "req_move"))
        {
                kingdom_table[ch->pcdata->kingdom].req_move = atoi(argument);
        }
        else if (!str_cmp(keyword, "general"))
        {
                free_string(kingdom_table[ch->pcdata->kingdom].general);
                kingdom_table[ch->pcdata->kingdom].general = str_dup(argument);
        }
        else if (!str_cmp(keyword, "rankl"))
        {
                free_string(kingdom_table[ch->pcdata->kingdom].rankl);
                kingdom_table[ch->pcdata->kingdom].rankl = str_dup(argument);
        }
        else if (!str_cmp(keyword, "rankp"))
        {
                free_string(kingdom_table[ch->pcdata->kingdom].rankp);
                kingdom_table[ch->pcdata->kingdom].rankp = str_dup(argument);
        }
        else if (!str_cmp(keyword, "rank1m"))
        {
                free_string(kingdom_table[ch->pcdata->kingdom].rank1m);
                kingdom_table[ch->pcdata->kingdom].rank1m = str_dup(argument);
        }
        else if (!str_cmp(keyword, "rank2m"))
        {
                free_string(kingdom_table[ch->pcdata->kingdom].rank2m);
                kingdom_table[ch->pcdata->kingdom].rank2m = str_dup(argument);
        }
        else if (!str_cmp(keyword, "rank3m"))
        {
                free_string(kingdom_table[ch->pcdata->kingdom].rank3m);
                kingdom_table[ch->pcdata->kingdom].rank3m = str_dup(argument);
        }
        else if (!str_cmp(keyword, "rank4m"))
        {
                free_string(kingdom_table[ch->pcdata->kingdom].rank4m);
                kingdom_table[ch->pcdata->kingdom].rank4m = str_dup(argument);
        }
        else if (!str_cmp(keyword, "rank5m"))
        {
                free_string(kingdom_table[ch->pcdata->kingdom].rank5m);
                kingdom_table[ch->pcdata->kingdom].rank5m = str_dup(argument);
        }
        else if (!str_cmp(keyword, "rank1f"))
        {
                free_string(kingdom_table[ch->pcdata->kingdom].rank1f);
                kingdom_table[ch->pcdata->kingdom].rank1f = str_dup(argument);
        }
        else if (!str_cmp(keyword, "rank2f"))
        {
                free_string(kingdom_table[ch->pcdata->kingdom].rank2f);
                kingdom_table[ch->pcdata->kingdom].rank2f = str_dup(argument);
        }
        else if (!str_cmp(keyword, "rank3f"))
        {
                free_string(kingdom_table[ch->pcdata->kingdom].rank3f);
                kingdom_table[ch->pcdata->kingdom].rank3f = str_dup(argument);
        }
        else if (!str_cmp(keyword, "rank4f"))
        {
                free_string(kingdom_table[ch->pcdata->kingdom].rank4f);
                kingdom_table[ch->pcdata->kingdom].rank4f = str_dup(argument);
        }
        else if (!str_cmp(keyword, "rank5f"))
        {
                free_string(kingdom_table[ch->pcdata->kingdom].rank5f);
                kingdom_table[ch->pcdata->kingdom].rank5f = str_dup(argument);
        }
        else
        {
                do_kset(ch, "");
                return;
        }
        send_to_char("Done.\n\r", ch);
        save_kingdoms();
        return;
}

void imm_kset(CHAR_DATA * ch, char *argument)
{
        char      arg1[MAX_INPUT_LENGTH];
        char      arg2[MAX_INPUT_LENGTH];
        int       i;

        argument = one_argument(argument, arg1);
        argument = one_argument(argument, arg2);

        if (arg1[0] == '\0' || arg2[0] == '\0' || argument[0] == '\0')
        {
                send_to_char
                        ("Syntax       : kset <kingdom> <field> <value>\n\r",
                         ch);
                send_to_char
                        ("Valid fields : leader, name, whoname, recall, kills, deaths, treasury\n\r",
                         ch);
                return;
        }
        if (!is_number(arg1))
        {
                send_to_char("Please pick a number as the kingdom.\n\r", ch);
                return;
        }
        i = atoi(arg1);
        if (i < 1 || i > MAX_KINGDOM)
        {
                send_to_char("Please pick a real kingdom.\n\r", ch);
                return;
        }
        if (!str_cmp(arg2, "leader"))
        {
                free_string(kingdom_table[i].leader);
                argument[0] = UPPER(argument[0]);
                kingdom_table[i].leader = str_dup(argument);
        }
        else if (!str_cmp(arg2, "name"))
        {
                free_string(kingdom_table[i].name);
                argument[0] = UPPER(argument[0]);
                kingdom_table[i].name = str_dup(argument);
        }
        else if (!str_cmp(arg2, "whoname"))
        {
                free_string(kingdom_table[i].whoname);
                argument[0] = UPPER(argument[0]);
                kingdom_table[i].whoname = str_dup(argument);
        }
        else if (!str_cmp(arg2, "kills"))
        {
                kingdom_table[i].kills = atoi(argument);
        }
        else if (!str_cmp(arg2, "treasury"))
        {
                kingdom_table[i].qps = atoi(argument);
        }
        else if (!str_cmp(arg2, "recall"))
        {
                kingdom_table[i].recall = atoi(argument);
        }
        else if (!str_cmp(arg2, "deaths"))
        {
                kingdom_table[i].deaths = atoi(argument);
        }
        else
        {
                imm_kset(ch, "");
                return;
        }
        send_to_char("Done.\n\r", ch);
        save_kingdoms();
        return;
}

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

        one_argument(argument, arg);

        if (IS_NPC(ch))
                return;
        if (ch->pcdata->kingdom == 0)
        {
                send_to_char("What kingdoms did you say you where from ?\n\r",
                             ch);
                return;
        }
        if (str_cmp(kingdom_table[ch->pcdata->kingdom].leader, ch->name) &&
            str_cmp(kingdom_table[ch->pcdata->kingdom].general, ch->name))
        {
                send_to_char("You are not allowed to outcast members.\n\r",
                             ch);
                return;
        }
        if ((victim = get_char_room(ch, NULL, arg)) == NULL)
        {
                send_to_char("Outcast whom?\n\r", ch);
                return;
        }
        if (IS_NPC(victim))
        {
                send_to_char("That's a monster, not a player.\n\r", ch);
                return;
        }
        if (ch == victim)
        {
                send_to_char("You cannot outcast yourself.\n\r", ch);
                return;
        }
        if (victim->pcdata->kingdom != ch->pcdata->kingdom)
        {
                send_to_char("They are not a member of your kingdom.\n\r",
                             ch);
                return;
        }
        if (!str_cmp(victim->name, kingdom_table[ch->pcdata->kingdom].leader))
        {
                send_to_char("That is not a good plan.\n\r", ch);
                return;
        }
        victim->pcdata->kingdom = 0;
	victim->pcdata->kingrank = 0;
        send_to_char("Done.\n\r", ch);
	xprintf(buf, "#W%s #nhas been outcasted from %s#n\n\r", victim->name, kingdom_table[ch->pcdata->kingdom].whoname);
	do_info(NULL, buf);
        return;
}

void do_kstats(CHAR_DATA * ch, char *argument)
{
        char      buf[MAX_STRING_LENGTH];
        char      buf2[MAX_STRING_LENGTH];
        int       i;

        if (IS_NPC(ch))
                return;
        if ((i = ch->pcdata->kingdom) == 0)
        {
                send_to_char("You are not a member of any kingdom.\n\r", ch);
                return;
        }
        xprintf(buf, " #W[#R***#W]  The Kingdom stats of %s  #W[#R***#W]#n\n\r\n\r",
                kingdom_table[i].whoname);
        xprintf(buf2, " #WCurrent Leader    :#n %s\n\r", kingdom_table[i].leader);
        strcat(buf, buf2);
        xprintf(buf2, " #WCurrent General   :#n %s\n\r",
                kingdom_table[i].general);
        strcat(buf, buf2);
        xprintf(buf2, " #WLeader Rank       :#n %s\n\r",
                kingdom_table[i].rankl);
        strcat(buf, buf2);
        xprintf(buf2, " #WPrince Rank       :#n %s\n\r",
                kingdom_table[i].rankp);
        strcat(buf, buf2);
        xprintf(buf2, " #WRank 1 Male       :#n %s\n\r",
		kingdom_table[i].rank1m);
	strcat(buf, buf2);
        xprintf(buf2, " #WRank 2 Male       :#n %s\n\r",
                kingdom_table[i].rank2m);
        strcat(buf, buf2);
        xprintf(buf2, " #WRank 3 Male       :#n %s\n\r",
                kingdom_table[i].rank3m);
        strcat(buf, buf2);
        xprintf(buf2, " #WRank 4 Male       :#n %s\n\r",
                kingdom_table[i].rank4m);
        strcat(buf, buf2);
        xprintf(buf2, " #WRank 5 Male       :#n %s\n\r",
                kingdom_table[i].rank5m);
        strcat(buf, buf2);
        xprintf(buf2, " #WRank 1 Female     :#n %s\n\r",
                kingdom_table[i].rank1f);
        strcat(buf, buf2);
        xprintf(buf2, " #WRank 2 Female     :#n %s\n\r",
                kingdom_table[i].rank2f);
        strcat(buf, buf2);
        xprintf(buf2, " #WRank 3 Female     :#n %s\n\r",
                kingdom_table[i].rank3f);
        strcat(buf, buf2);
        xprintf(buf2, " #WRank 4 Female     :#n %s\n\r",
                kingdom_table[i].rank4f);
        strcat(buf, buf2);
        xprintf(buf2, " #WRank 5 Female     :#n %s\n\r",
                kingdom_table[i].rank5f);
        strcat(buf, buf2);
        xprintf(buf2, " #WTreasury          :#n %d bones\n\r",
                kingdom_table[i].qps);
        strcat(buf, buf2);
        send_to_char(buf, ch);
        return;
}

void do_kingset(CHAR_DATA * ch, char *argument)
{
        CHAR_DATA *victim;
        char      arg1[MAX_INPUT_LENGTH];
        char      arg2[MAX_INPUT_LENGTH];
        int       i;

        if (IS_NPC(ch) || ch->level < 7)
        {
                send_to_char("Huh?\n\r", ch);
                return;
        }
        argument = one_argument(argument, arg1);
        one_argument(argument, arg2);
        if (arg1[0] == '\0' || arg2[0] == '\0')
        {
                send_to_char("Syntax : kingset <player> <kingdom number>\n\r",
                             ch);
                return;
        }
        if ((victim = get_char_world(ch, arg1)) == NULL)
        {
                send_to_char("They are not here.\n\r", ch);
                return;
        }
        if ((i = atoi(arg2)) < 0 || i > MAX_KINGDOM)
        {
                send_to_char("Please pick a valid kingdom.\n\r", ch);
                return;
        }
        if (IS_NPC(victim))
        {
                send_to_char("Please pick a player.\n\r", ch);
                return;
        }
        victim->pcdata->kingdom = i;
	victim->pcdata->kingrank = 0;
        send_to_char("Ok.\n\r", ch);
        send_to_char("Your kingdom has been changed.\n\r", victim);
        return;
}

void load_war(void)
{
        FILE     *fp;
        int       i;

        if ((fp = fopen(WAR_FILE, "r")) == NULL)
        {
                log_string(LOG_CRIT, "Error: war.dat not found!");
                exit(1);
        }

        for (i = 0; i < MAX_WAR; i++)
        {
                war_table[i].one = fread_number(fp);
                war_table[i].two = fread_number(fp);
        }
        fclose(fp);
        return;
}

void save_war(void)
{
        FILE     *fp;
        int       i;

        if ((fp = fopen(WAR_FILE, "w")) == NULL)
        {
                log_string(LOG_CRIT, "Error: kingdom.dat not found!");
                exit(1);
        }

        for (i = 0; i < MAX_WAR; i++)
        {
                fprintf(fp, "%d\n", war_table[i].one);
                fprintf(fp, "%d\n", war_table[i].two);
        }

        fclose(fp);
        return;
}

void do_warlist(CHAR_DATA * ch, char *argument)
{
        char      buf[MAX_STRING_LENGTH];

        int       i;

        stc("#B--==== #RThe WARLIST!!! #B====--#n\n\r\n\r", ch);

        for (i = 0; i < MAX_WAR; i++)
        {
                if (war_table[i].one != 0
                    && war_table[i].one <= MAX_KINGDOM
                    && war_table[i].two <= MAX_KINGDOM)
                {
                        xprintf(buf,
                                "#R(#W%d#R) #n%s's Kingdom of the %s is at war with\n\r%s's Kingdom of the %s\n\r",
                                i + 1, kingdom_table[war_table[i].one].leader,
                                kingdom_table[war_table[i].one].name,
                                kingdom_table[war_table[i].two].leader,
                                kingdom_table[war_table[i].two].name);
                        stc(buf, ch);
                }
        }
        return;
}

void do_decwar(CHAR_DATA * ch, char *argument)
{
        char      arg[MAX_INPUT_LENGTH];
        int       i;
        int       target = 0, slot = -1;

        one_argument(argument, arg);

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

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

        if (arg[0] == '\0')
        {
                stc("You need to type the name of the leader of the kingdom to declare war on.\n\r", ch);
                return;
        }

        for (i = 1; i <= MAX_KINGDOM; i++)
        {
                if (!str_prefix(arg, kingdom_table[i].leader))
                        target = i;
        }

        if (target == 0)
        {
                stc("No match found.\n\r", ch);
                return;
        }

        for (i = 0; i <= MAX_WAR; i++)
        {
                if ((war_table[i].one == ch->pcdata->kingdom
                     && war_table[i].two == target)
                    || (war_table[i].two == ch->pcdata->kingdom
                        && war_table[i].one == target))
                {
                        stc("You are already at war with them. Use warpeace to have a peace.\n\r", ch);
                        return;
                }
                if (war_table[i].one == 0 && war_table[i].two == 0
                    && slot < 0)
                        slot = i;
        }

        if (slot < 0)
        {
                stc("No slots left.\n\r", ch);
                return;
        }

        war_table[slot].one = ch->pcdata->kingdom;
        war_table[slot].two = target;
        stc("You are now at WAR!!!!\n\r", ch);
        save_war();
        do_info(ch, "THERE IS A NEW WAR!!!!! WARLIST TO SEE!!!!");
        return;
}

void do_warpeace(CHAR_DATA * ch, char *argument)
{
        char      arg[MAX_INPUT_LENGTH];
        int       i;
        int       target = 0, slot = -1;

        one_argument(argument, arg);

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

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

        if (arg[0] == '\0')
        {
                stc("You need to type the name of the leader of the kingdom to make peace with.\n\r", ch);
                return;
        }

        for (i = 1; i <= MAX_KINGDOM; i++)
        {
                if (!str_prefix(arg, kingdom_table[i].leader))
                        target = i;
        }

        if (target == 0)
        {
                stc("No match found.\n\r", ch);
                return;
        }

        for (i = 0; i <= MAX_WAR; i++)
        {
                if ((war_table[i].one == ch->pcdata->kingdom
                     && war_table[i].two == target))
                {
                        slot = i;
                }
        }

        if (slot < 0)
        {
                stc("You are not at war with them, or they declared war on you. Get the other leader to make peace.\n\r", ch);
                return;
        }

        war_table[slot].one = 0;
        war_table[slot].two = 0;
        stc("You are now at PEACE!!!!\n\r", ch);
        do_info(ch, "THERE IS A NEW PEACE BETWEEN KINGDOMS!!");
        save_war();

        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->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 (ch->fight_timer > 0)
        {
                send_to_char("Not with a fighttimer.\n\r", ch);
                return;
        }

        if ((location =
             get_room_index(kingdom_table[ch->pcdata->kingdom].recall)) ==
            NULL)
        {
                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 disappears.", 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_kwithdraw(CHAR_DATA *ch, char *argument)
{
  char arg1[MAX_INPUT_LENGTH];
  char buf[MAX_INPUT_LENGTH];
  char buf2[MAX_INPUT_LENGTH];
  int i = 0;

  if (IS_NPC(ch) || ch->level < 1)
  {
    send_to_char("Huh?\n\r", ch);
    return;
  }

  argument = one_argument(argument, arg1);
  i = atoi(arg1);

  if (str_cmp(kingdom_table[ch->pcdata->kingdom].leader, ch->name))
  {
	stc("You must be the leader of your kingdom to withdraw from the treasury.\n\r",ch);
	return;
  }
  if (arg1[0] == '\0' )
  {
    send_to_char("Syntax : kwithdraw <amount>\n\r", ch);
    return;
  }
  if ( i > kingdom_table[ch->pcdata->kingdom].qps )
  {
    send_to_char( "You don't have that much within your kingdom treasury.\n\r",ch);
    return;
  }

  kingdom_table[ch->pcdata->kingdom].qps -= i;
  ch->bones += i;
  xprintf(buf,"You have withdrawn %d bones from %s's Treasury.\n\r", i, kingdom_table[ch->pcdata->kingdom].whoname);
  xprintf(buf2, "%s takes %d bones from %s's treasury now totaling %d bones!",
		ch->name, i, kingdom_table[ch->pcdata->kingdom].whoname, kingdom_table[ch->pcdata->kingdom].qps);
  send_to_char(buf,ch);
  do_info(NULL,buf2);
  save_kingdoms();
  return;
}

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

  one_argument(argument, arg);

  if (IS_NPC(ch)) return;
  if (ch->pcdata->kingdom == 0)
  {
    send_to_char("What kingdom did you say you where from?\n\r", ch);
    return;
  }

  if (arg[0] == '\0')
  {
	stc("This will remove you from your current kingdom.\n\r",ch);
	stc("If you wish to continue type #Wdefect forgood#n.\n\r",ch);
	return;
  }
  
  if (!str_cmp(arg, "forgood"))
  {
        ch->pcdata->KdefectTimer = current_time + (2 * 24L * 3600L);
  	xprintf(buf, "#W%s #nhas defected from %s#n\n\r", ch->name, kingdom_table[ch->pcdata->kingdom].whoname);
  	do_info(NULL, buf);
        ch->pcdata->kingdom = 0;
	ch->pcdata->kingrank = 0;
  }
  return;
}