/*
* Legend of Chrystancia Kingdom Code
* Based upon code originally created by Aioros and Tracker.
* Updated for Legend of Chrystancia by Matthew 24/05/2003
*/
#include <sys/types.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <ctype.h>
#include "merc.h"
int min_kingdom_members;
MEMBER_DATA *get_member_of_rank (MEMBER_DATA * mem, int rank);
void get_min_kingdom_members ();
void do_help args ((CHAR_DATA * ch, char *argument));
#define KEY( literal, field, value ) \
if ( !str_cmp( word, literal ) ) \
{ \
field = value; \
fMatch = TRUE; \
break; \
}
#define KKEY( literal, field, value ) \
if ( !str_cmp( word, literal ) ) \
{ \
field = value; \
fMatch = TRUE; \
break; \
}
/*
//free_string(field); \
*/
const struct kcommand_data kcmd_table [] =
{
{ "Initiate", KCMD_INDUCT },
{ "PromoteRank", KCMD_PROMOTE },
{ "DemoteRank", KCMD_DEMOTE },
{ "Expell", KCMD_OUTCAST },
{ "Declare", KCMD_DECLARE },
{ "", KCMD_MAX }
};
char *put_spc (char *buffer, int size, bool center)
{
char aux[MAX_INPUT_LENGTH];
int i, j, len;
for (i = 0, len = 0; buffer[i] != '\0'; i++)
{
if (buffer[i] == '#' || buffer[i] == '^')
i++;
else
len++;
}
if (center)
{
j = (size - len) / 2;
i = 0;
aux[0] = '\0';
while (i < j)
{
sprintf (aux + strlen (aux), " ");
i++;
}
strcat (aux, buffer);
strcpy (buffer, aux);
len += j;
}
while (len < size)
{
sprintf (buffer + strlen (buffer), " ");
len++;
}
return buffer;
}
void kingdom (CHAR_DATA * ch, char *kname)
{
MEMBER_DATA *m;
int rank = 0;
m = get_kingdom_char (ch->name);
if (m != NULL)
{
char buf[MAX_STRING_LENGTH];
rank = m->rank;
if (ch->sex == SEX_MALE)
strcpy (buf, m->kingdom->ranks[rank - 1]);
else if (m->kingdom->ranks[rank + 4][0] == '\0')
strcpy (buf, m->kingdom->ranks[rank - 1]);
else
strcpy (buf, m->kingdom->ranks[rank + 4]);
sprintf (kname, "%s#w%s of #g%s%s",
m->kingdom->open, buf, m->kingdom->descr, m->kingdom->close);
}
else
sprintf (kname, "%s", "");
put_spc (kname, 10, TRUE);
}
/*
* search for the kingdom member information of one player,
* receives the name of the player and
* returns NULL if the player is not in a kingdom
*/
MEMBER_DATA *get_kingdom_char (char *name)
{
KINGDOM_DATA *k;
MEMBER_DATA *m;
for (k = king_first; k != NULL; k = k->next)
{
for (m = k->members; m != NULL; m = m->next)
if (!str_cmp (name, m->name))
return m;
}
return NULL;
}
void kingdom2 (CHAR_DATA * ch, char *kname)
{
MEMBER_DATA *m;
m = get_kingdom_char (ch->name);
if (m != NULL)
{
sprintf (kname, "%s", m->kingdom->descr);
}
else
sprintf (kname, "%s", "");
put_spc (kname, 0, TRUE);
}
/*
* Read the kingdom data file
*/
void fread_kingdom (FILE * fp)
{
KINGDOM_DATA *kingdom;
KINGDOM_DATA *kiter;
int i;
char *word;
bool fMatch;
if (kingdom_free == NULL)
kingdom = alloc_perm (sizeof (*kingdom));
else
{
kingdom = kingdom_free;
kingdom_free = kingdom_free->next;
}
kingdom->next = NULL;
kingdom->prev = NULL;
kingdom->diplomacy = NULL;
kingdom->members = NULL;
kingdom->descr = str_dup ("");
kingdom->close = str_dup ("");
kingdom->open = str_dup ("");
kingdom->name = str_dup ("");
kingdom->memnum = 0;
for (i = 0; i < 10; i++)
kingdom->ranks[i] = str_dup ("");
for (i = 0; i < 10; i++)
kingdom->materials[i] = 0;
for (i = 0; i < KCMD_MAX; i++)
kingdom->cmd[i] = 1;
kingdom->vnum[0] = 0;
kingdom->vnum[1] = 0;
kingdom->krecall = 0;
kingdom->helper = 0;
if (king_first == NULL)
king_first = kingdom;
if (king_last != NULL)
{
king_last->next = kingdom;
kingdom->prev = king_last;
}
king_last = kingdom;
for (kiter = king_first; kiter != NULL; kiter = kiter->next)
{
DIPLOMACY_DATA *diplomacy;
// Inserting diplomacy into new kingdom
if (diplomacy_free == NULL)
diplomacy = alloc_perm (sizeof (*diplomacy));
else
{
diplomacy = diplomacy_free;
diplomacy_free = diplomacy_free->next;
}
diplomacy->next = NULL;
diplomacy->prev = NULL;
diplomacy->diplomacy = DIPL_NEUTRAL;
diplomacy->kingdom = kiter;
if (kingdom->diplomacy == NULL)
kingdom->diplomacy = diplomacy;
if (kingdom->diplomacy_last != NULL)
{
kingdom->diplomacy_last->next = diplomacy;
diplomacy->prev = kingdom->diplomacy_last;
}
kingdom->diplomacy_last = diplomacy;
if (kiter == king_last)
break;
// Inserting diplomacy into old kingdom
if (diplomacy_free == NULL)
diplomacy = alloc_perm (sizeof (*diplomacy));
else
{
diplomacy = diplomacy_free;
diplomacy_free = diplomacy_free->next;
}
diplomacy->next = NULL;
diplomacy->diplomacy = DIPL_NEUTRAL;
diplomacy->kingdom = kingdom;
if (kiter->diplomacy == NULL)
kiter->diplomacy = diplomacy;
if (kiter->diplomacy_last != NULL)
{
kiter->diplomacy_last->next = diplomacy;
diplomacy->prev = kiter->diplomacy_last;
}
kiter->diplomacy_last = diplomacy;
}
for (;;)
{
word = feof (fp) ? "End" : fread_word (fp);
fMatch = FALSE;
switch (UPPER (word[0]))
{
case '*':
fMatch = TRUE;
fread_to_eol (fp);
break;
case 'C':
KKEY ("Close", kingdom->close, fread_string (fp));
KKEY ("CmdInduct", kingdom->cmd[KCMD_INDUCT], fread_number (fp));
KKEY ("CmdPromote", kingdom->cmd[KCMD_PROMOTE], fread_number (fp));
KKEY ("CmdDemote", kingdom->cmd[KCMD_DEMOTE], fread_number (fp));
KKEY ("CmdOutcast", kingdom->cmd[KCMD_OUTCAST], fread_number (fp));
KKEY ("CmdDeclare", kingdom->cmd[KCMD_DECLARE], fread_number (fp));
case 'D':
KKEY ("Descr", kingdom->descr, fread_string (fp));
case 'E':
if (!str_cmp (word, "End"))
{
if (get_member_of_rank (king_last->members, 1) != NULL
&& king_last->memnum < min_kingdom_members && king_last->helper == 0)
min_kingdom_members = king_last->memnum;
return;
}
return;
case 'G':
KEY ("Gold", kingdom->materials[MAT_GOLD], fread_number (fp));
case 'H':
KEY ("Helper", kingdom->helper, fread_number (fp));
case 'K':
KEY ("Kreca", kingdom->krecall, fread_number (fp));
case 'M':
if (!str_cmp (word, "Member"))
{
MEMBER_DATA *m;
MEMBER_DATA *maux;
if (member_free == NULL)
m = alloc_perm (sizeof (*m));
else
{
m = member_free;
member_free = member_free->next;
}
m->rank = fread_number (fp);
m->sex = fread_number (fp);
free_string (m->name);
m->name = fread_string (fp);
m->kingdom = kingdom;
m->next = NULL;
m->prev = NULL;
if (kingdom->members == NULL)
kingdom->members = m;
else
{
for (maux = kingdom->members; maux->next != NULL;
maux = maux->next);
maux->next = m;
m->prev = maux;
}
kingdom->memnum++;
fMatch = TRUE;
break;
}
case 'N':
KKEY ("Name", kingdom->name, fread_string (fp));
case 'O':
KKEY ("Open", kingdom->open, fread_string (fp));
case 'P':
if (!str_cmp (word, "PKPD"))
{
kingdom->pk_pd[0] = fread_number (fp);
kingdom->pk_pd[1] = fread_number (fp);
fMatch = TRUE;
break;
}
case 'Q':
KEY ("Quest", kingdom->materials[MAT_QUEST], fread_number (fp));
case 'R':
KKEY ("Rank1", kingdom->ranks[0], fread_string (fp));
KKEY ("Rank2", kingdom->ranks[1], fread_string (fp));
KKEY ("Rank3", kingdom->ranks[2], fread_string (fp));
KKEY ("Rank4", kingdom->ranks[3], fread_string (fp));
KKEY ("Rank5", kingdom->ranks[4], fread_string (fp));
KKEY ("Rank6", kingdom->ranks[5], fread_string (fp));
KKEY ("Rank7", kingdom->ranks[6], fread_string (fp));
KKEY ("Rank8", kingdom->ranks[7], fread_string (fp));
KKEY ("Rank9", kingdom->ranks[8], fread_string (fp));
KKEY ("Rank10", kingdom->ranks[9], fread_string (fp));
case 'S':
KEY ("Stone", kingdom->materials[MAT_STONE], fread_number (fp));
KEY ("Steel", kingdom->materials[MAT_STEEL], fread_number (fp));
case 'V':
if (!str_cmp (word, "Vnum"))
{
kingdom->vnum[0] = fread_number (fp);
kingdom->vnum[1] = fread_number (fp);
fMatch = TRUE;
break;
}
case 'W':
KEY ("Wood", kingdom->materials[MAT_WOOD], fread_number (fp));
}
if (!fMatch)
{
bug ("Fread_char: no match.", 0);
fread_to_eol (fp);
}
}
}
void fread_diplomacy (FILE * fp)
{
KINGDOM_DATA *kiter;
char *word;
bool fMatch;
for (;;)
{
word = feof (fp) ? "End" : fread_word (fp);
fMatch = FALSE;
switch (UPPER (word[0]))
{
case '*':
fMatch = TRUE;
fread_to_eol (fp);
break;
case 'D':
if (!str_cmp (word, "Diplomacy"))
{
bool stop = FALSE;
int diplomacy;
char *k1 = NULL;
char *k2 = NULL;
free_string (k1);
free_string (k2);
diplomacy = fread_number (fp);
k1 = fread_string (fp);
k2 = fread_string (fp);
for (kiter = king_first; kiter != NULL && !stop;
kiter = kiter->next)
{
DIPLOMACY_DATA *d;
for (d = kiter->diplomacy; d != NULL && !stop; d = d->next)
{
if (!str_cmp (k1, kiter->name)
&& !str_cmp (k2, d->kingdom->name))
{
d->diplomacy = diplomacy;
stop = TRUE;
}
}
}
free_string (k1);
free_string (k2);
fMatch = TRUE;
break;
}
case 'E':
if (!str_cmp (word, "End"))
return;
}
if (!fMatch)
{
bug ("Fread_diplomacy: no match.", 0);
fread_to_eol (fp);
}
}
}
void load_kingdoms ()
{
FILE *fp;
char *word;
if ((fp = fopen ("../db/kingdom.dat", "r")) == NULL)
{
bug ("load_kingdoms: error opening file.", 0);
exit (1);
}
while (1)
{
if (fread_letter (fp) != '#')
{
bug ("load_kingdoms: # not found.", 0);
exit (1);
}
word = fread_word (fp);
if (!strcmp (word, "END"))
break;
else if (!strcmp (word, "KINGDOM"))
fread_kingdom (fp);
else if (!strcmp (word, "DIPLOMACY"))
fread_diplomacy (fp);
else
{
bug ("load_kingdoms: bad section name.", 0);
exit (1);
}
}
get_min_kingdom_members ();
fclose (fp);
}
/*
* Save kingdom data to file
*/
void do_save_kings (CHAR_DATA * ch, char *argument)
{
KINGDOM_DATA *k;
MEMBER_DATA *m;
FILE *fd;
if ((fd = fopen ("../db/kingdom.dat", "w")) == NULL)
{
bug ("Do_save_kings: error opening file.", 0);
return;
}
for (k = king_first; k != NULL; k = k->next)
{
fprintf (fd, "#KINGDOM\n");
fprintf (fd, "Descr %s~\n", k->descr);
fprintf (fd, "Open %s~\n", k->open);
fprintf (fd, "Close %s~\n", k->close);
fprintf (fd, "Name %s~\n", k->name);
fprintf (fd, "Rank1 %s~\n", k->ranks[0]);
fprintf (fd, "Rank2 %s~\n", k->ranks[1]);
fprintf (fd, "Rank3 %s~\n", k->ranks[2]);
fprintf (fd, "Rank4 %s~\n", k->ranks[3]);
fprintf (fd, "Rank5 %s~\n", k->ranks[4]);
fprintf (fd, "Rank6 %s~\n", k->ranks[5]);
fprintf (fd, "Rank7 %s~\n", k->ranks[6]);
fprintf (fd, "Rank8 %s~\n", k->ranks[7]);
fprintf (fd, "Rank9 %s~\n", k->ranks[8]);
fprintf (fd, "Rank10 %s~\n", k->ranks[9]);
fprintf (fd, "Vnum %d %d\n", k->vnum[0], k->vnum[1]);
fprintf (fd, "Kreca %d\n", k->krecall);
fprintf( fd, "Helper %d\n", k->helper);
fprintf (fd, "Gold %d\n", k->materials[MAT_GOLD]);
fprintf (fd, "Stone %d\n", k->materials[MAT_STONE]);
fprintf (fd, "Wood %d\n", k->materials[MAT_WOOD]);
fprintf (fd, "Steel %d\n", k->materials[MAT_STEEL]);
fprintf (fd, "Quest %d\n", k->materials[MAT_QUEST]);
fprintf (fd, "PKPD %d %d\n", k->pk_pd[0], k->pk_pd[1]);
fprintf (fd, "CmdInduct %d\n", k->cmd[KCMD_INDUCT]);
fprintf (fd, "CmdPromote %d\n", k->cmd[KCMD_PROMOTE]);
fprintf (fd, "CmdDemote %d\n", k->cmd[KCMD_DEMOTE]);
fprintf (fd, "CmdOutcast %d\n", k->cmd[KCMD_OUTCAST]);
fprintf (fd, "CmdDeclare %d\n", k->cmd[KCMD_DECLARE]);
for (m = k->members; m != NULL; m = m->next)
fprintf (fd, "Member %d %d %s~\n", m->rank, m->sex, m->name);
fprintf (fd, "End\n\n");
}
fprintf (fd, "#DIPLOMACY\n");
for (k = king_first; k != NULL; k = k->next)
{
DIPLOMACY_DATA *d = NULL;
for (d = k->diplomacy; d != NULL; d = d->next)
{
fprintf (fd, "Diplomacy %d %s~ %s~\n",
d->diplomacy, k->name, d->kingdom->name);
}
}
fprintf (fd, "End\n\n");
fprintf (fd, "#END\n");
get_min_kingdom_members();
fclose (fd);
}
void do_ksave (CHAR_DATA * ch, char *argument)
{
do_save_kings (ch, argument);
send_to_char ("Kingdoms SAVED!.\n\r", ch);
}
/*
* search for a player of a given rank (1 to 5)
* receives a list of members and the rank you want to search and
* returns NULL if there is no member with that rank
*/
MEMBER_DATA *get_member_of_rank (MEMBER_DATA * mem, int rank)
{
MEMBER_DATA *m;
for (m = mem; m != NULL; m = m->next)
if (m->rank == rank)
break;
return m;
}
void get_min_kingdom_members ()
{
KINGDOM_DATA *kiter;
MEMBER_DATA *m;
for (kiter = king_first; kiter != NULL; kiter = kiter->next)
{
m = get_member_of_rank (kiter->members, 1);
if (m == NULL)
continue;
if (kiter->helper == 1) break;
if (kiter->memnum < min_kingdom_members && kiter->helper == 0)
min_kingdom_members = kiter->memnum;
}
}
/*
* Shows the information about a kingdom (OLC style)
*/
void kshow (CHAR_DATA * ch, KINGDOM_DATA * k)
{
char buf[MAX_INPUT_LENGTH];
MEMBER_DATA *m;
int i;
send_to_char ("\n\r#yKing#7dom Edi#ytor#n\n\r\n\r", ch);
sprintf (buf, "#yName#7: %s#n\n\r", k->name);
send_to_char (buf, ch);
sprintf (buf, "#yOpen/Close#7: %s, %s#n\n\r", k->open, k->close);
send_to_char (buf, ch);
sprintf (buf, "#yDescr#7: %s#n\n\r", k->descr);
send_to_char (buf, ch);
m = get_member_of_rank (k->members, 1);
sprintf (buf, "#yKing#7: %s#n\n\r", ((m != NULL) ? m->name : "none"));
send_to_char (buf, ch);
for (i = 0; i < 5; i++)
{
sprintf (buf, "#yRank%d (m/f)#7: %s#7, %s#n\n\r",
i + 1, k->ranks[i], k->ranks[i + 5]);
send_to_char (buf, ch);
}
sprintf (buf, "#yVnums#7: %d %d#n\n\r", k->vnum[0], k->vnum[1]);
send_to_char (buf, ch);
sprintf (buf, "#yKreca#7: %d#n\n\r", k->krecall);
send_to_char (buf, ch);
sprintf (buf, "#yHelper#7: %d (0 = no, 1 = yes)#n\n\r", k->helper);
send_to_char (buf, ch);
sprintf (buf, "#yNo. Members#7 :%d#n\n\r", k->memnum);
send_to_char (buf, ch);
send_to_char ("\n\r", ch);
}
/*
* OLC style kingdom editor
*/
void do_kedit (CHAR_DATA * ch, char *argument)
{
KINGDOM_DATA *kiter;
KINGDOM_DATA *kingdom;
char buf[MAX_INPUT_LENGTH];
int value;
argument = one_argument (argument, buf);
if (!str_cmp ("create", buf))
{
if (member_free == NULL)
kingdom = alloc_perm (sizeof (*kingdom));
else
{
kingdom = kingdom_free;
kingdom_free = kingdom_free->next;
}
kingdom->next = NULL;
kingdom->prev = NULL;
kingdom->members = NULL;
kingdom->ranks[0] = str_dup ("#wKing");
kingdom->ranks[1] = str_dup ("#wHeir");
kingdom->ranks[2] = str_dup ("#wPrince");
kingdom->ranks[3] = str_dup ("#wKnight");
kingdom->ranks[4] = str_dup ("#wSquire");
kingdom->ranks[5] = str_dup ("#wQueen");
kingdom->ranks[6] = str_dup ("#wHeir");
kingdom->ranks[7] = str_dup ("#wPrincess");
kingdom->ranks[8] = str_dup ("#wLady");
kingdom->ranks[9] = str_dup ("#wMaiden");
kingdom->vnum[0] = 0;
kingdom->vnum[1] = 0;
kingdom->pk_pd[0] = 0;
kingdom->pk_pd[1] = 0;
kingdom->krecall = 0;
kingdom->helper = 0;
kingdom->open = str_dup ("");
kingdom->close = str_dup ("");
kingdom->descr = str_dup ("#7New Kingdom");
kingdom->name = str_dup ("new");
kingdom->memnum = 0;
if (king_first == NULL)
king_first = kingdom;
if (king_last != NULL)
{
king_last->next = kingdom;
kingdom->prev = king_last;
}
king_last = kingdom;
for (kiter = king_first; kiter != NULL; kiter = kiter->next)
{
DIPLOMACY_DATA *diplomacy;
// Inserting diplomacy into new kingdom
if (diplomacy_free == NULL)
diplomacy = alloc_perm (sizeof (*diplomacy));
else
{
diplomacy = diplomacy_free;
diplomacy_free = diplomacy_free->next;
}
diplomacy->next = NULL;
diplomacy->prev = NULL;
diplomacy->diplomacy = DIPL_NEUTRAL;
diplomacy->kingdom = kiter;
if (kingdom->diplomacy == NULL)
kingdom->diplomacy = diplomacy;
if (kingdom->diplomacy_last != NULL)
{
kingdom->diplomacy_last->next = diplomacy;
diplomacy->prev = kingdom->diplomacy_last;
}
kingdom->diplomacy_last = diplomacy;
if (kiter == king_last)
break;
// Inserting diplomacy into old kingdom
if (diplomacy_free == NULL)
diplomacy = alloc_perm (sizeof (*diplomacy));
else
{
diplomacy = diplomacy_free;
diplomacy_free = diplomacy_free->next;
}
diplomacy->next = NULL;
diplomacy->diplomacy = DIPL_NEUTRAL;
diplomacy->kingdom = kingdom;
if (kiter->diplomacy == NULL)
kiter->diplomacy = diplomacy;
if (kiter->diplomacy_last != NULL)
{
kiter->diplomacy_last->next = diplomacy;
diplomacy->prev = kiter->diplomacy_last;
}
kiter->diplomacy_last = diplomacy;
}
ch->desc->pEdit = (void *) kingdom;
ch->desc->connected = CON_KEDITOR;
kshow (ch, kingdom);
}
else if (is_number (buf))
{
int i;
value = atoi (buf);
for (i = 1, kingdom = king_first;
kingdom != NULL && i < value; i++, kingdom = kingdom->next);
if (kingdom == NULL)
{
send_to_char ("\n\rNo such kingdom.\n\r\n\r", ch);
return;
}
ch->desc->pEdit = (void *) kingdom;
ch->desc->connected = CON_KEDITOR;
kshow (ch, kingdom);
}
else
{
send_to_char ("Syntax: kedit create|<number>\n\r\n\r", ch);
return;
}
}
void kedit (CHAR_DATA * ch, char *argument)
{
KINGDOM_DATA *k;
MEMBER_DATA *m;
char arg[MAX_STRING_LENGTH];
char arg1[MAX_STRING_LENGTH];
char arg2[MAX_STRING_LENGTH];
char arg3[MAX_STRING_LENGTH];
strcpy (arg, argument);
smash_tilde (argument);
argument = one_argument (argument, arg1);
strcpy (arg2, argument);
k = (KINGDOM_DATA *) ch->desc->pEdit;
if (!str_cmp (arg1, "show") || arg1[0] == '\0')
{
kshow (ch, k);
return;
}
if (!str_cmp (arg1, "delete"))
{
del_kingdom (k);
//get_min_kingdom_members ();
}
if (!str_cmp (arg1, "done") || !str_cmp (arg1, "delete"))
{
ch->desc->pEdit = NULL;
ch->desc->connected = CON_PLAYING;
return;
}
if (!str_cmp (arg1, "?"))
{
do_help (ch, "kedit");
return;
}
if (!str_cmp (arg1, "name"))
{
if (arg2[0] == '\0')
{
send_to_char ("Syntax: name [string]\n\r", ch);
return;
}
free_string (k->name);
k->name = str_dup (arg2);
send_to_char ("Kingdom name set.\n\r", ch);
return;
}
if (!str_cmp (arg1, "descr"))
{
if (arg2[0] == '\0')
{
send_to_char ("Syntax: descr [string]\n\r", ch);
return;
}
free_string (k->descr);
k->descr = str_dup (arg2);
send_to_char ("Kingdom descr set.\n\r", ch);
return;
}
if (!str_cmp (arg1, "open"))
{
if (arg2[0] == '\0')
{
send_to_char ("Syntax: open [string]\n\r", ch);
return;
}
free_string (k->open);
k->open = str_dup (arg2);
send_to_char ("Kingdom open descr set.\n\r", ch);
return;
}
if (!str_cmp (arg1, "close"))
{
if (arg2[0] == '\0')
{
send_to_char ("Syntax: close [string]\n\r", ch);
return;
}
free_string (k->close);
k->close = str_dup (arg2);
send_to_char ("Kingdom close descr set.\n\r", ch);
return;
}
if (!str_cmp (arg1, "rank"))
{
int rank_n;
argument = one_argument (argument, arg2);
argument = one_argument (argument, arg3);
if (arg2[0] == '\0' || !is_number (arg2))
{
send_to_char ("Syntax: rank <number> <m/f> [string]\n\r", ch);
return;
}
if (atoi (arg2) < 1 || atoi (arg2) > 5)
{
send_to_char ("Rank must be a number between 1 and 5.\n\r", ch);
return;
}
if (argument[0] == '\0')
{
send_to_char ("You haven't specified a string.\n\r", ch);
return;
}
rank_n = (!str_cmp (arg3, "f")) ? 5 : 0;
rank_n += atoi (arg2) - 1;
free_string (k->ranks[rank_n]);
k->ranks[rank_n] = str_dup (argument);
send_to_char ("Kingdom rank set.\n\r", ch);
return;
}
if (!str_cmp (arg1, "king"))
{
char *name;
FILE *fd;
int sex = 1;
char line[MAX_STRING_LENGTH];
one_argument (argument, arg2);
name = capitalize (arg2);
if (!str_cmp ("none", arg2))
{
m = get_member_of_rank (k->members, 1);
if (m == NULL)
{
send_to_char ("This kingdom has no king.\n\r", ch);
return;
}
del_member (m);
k->memnum--;
get_min_kingdom_members ();
send_to_char ("King removed.\n\r", ch);
return;
}
sprintf (arg1, "../player/%s", name);
if ((fd = fopen (arg1, "r")) == NULL)
{
send_to_char ("That player doesn't exist.\n\r", ch);
return;
}
while (fgets (line, 100, fd))
{
if (sscanf (line, "Sex %d", &sex))
break;
}
fclose (fd);
m = get_kingdom_char (name);
if (m != NULL)
{
send_to_char ("That player already has a kingdom.\n\r", ch);
return;
}
m = get_member_of_rank (k->members, 1);
del_member (m);
if (member_free == NULL)
m = alloc_perm (sizeof (*m));
else
{
m = member_free;
member_free = member_free->next;
}
m->rank = 1;
m->name = str_dup (name);
m->sex = sex;
m->kingdom = k;
m->next = NULL;
m->prev = NULL;
if (k->members == NULL)
k->members = m;
else
{
m->next = k->members;
k->members->prev = m;
k->members = m;
}
k->memnum++;
get_min_kingdom_members ();
send_to_char ("King set.\n\r", ch);
return;
}
if (!str_cmp (arg1, "qp+"))
{
one_argument (argument, arg2);
if (!is_number (arg2))
{
send_to_char ("Syntax: qp+ <number>\n\r", ch);
return;
}
k->materials[MAT_QUEST] += atoi (arg2);
send_to_char ("QP added.\n\r", ch);
return;
}
if (!str_cmp (arg1, "qp-"))
{
one_argument (argument, arg2);
if (!is_number (arg2))
{
send_to_char ("Syntax: qp- <number>\n\r", ch);
return;
}
k->materials[MAT_QUEST] -= atoi (arg2);
send_to_char ("QP removed.\n\r", ch);
return;
}
if (!str_cmp (arg1, "qp"))
{
one_argument (argument, arg2);
if (!is_number (arg2))
{
send_to_char ("Syntax: qp <number>\n\r", ch);
return;
}
k->materials[MAT_QUEST] = atoi (arg2);
send_to_char ("QP set.\n\r", ch);
return;
}
if (!str_cmp (arg1, "members"))
{
one_argument (argument, arg2);
if (!is_number (arg2))
{
send_to_char ("Syntax: members <number>\n\r", ch);
return;
}
k->memnum = atoi (arg2);
send_to_char ("Members set.\n\r", ch);
return;
}
if (!str_cmp (arg1, "pk"))
{
one_argument (argument, arg2);
if (!is_number (arg2))
{
send_to_char ("Syntax: pk <number>\n\r", ch);
return;
}
k->pk_pd[0] = atoi (arg2);
send_to_char ("Pkills set.\n\r", ch);
return;
}
if (!str_cmp (arg1, "pd"))
{
one_argument (argument, arg2);
if (!is_number (arg2))
{
send_to_char ("Syntax: pk <number>\n\r", ch);
return;
}
k->pk_pd[1] = atoi (arg2);
send_to_char ("Pdeaths set.\n\r", ch);
return;
}
if (!str_cmp (arg1, "lvnum"))
{
one_argument (argument, arg2);
if (!is_number (arg2))
{
send_to_char ("Syntax: lvnum <number>\n\r", ch);
return;
}
if (atoi (arg2) > k->vnum[1])
{
send_to_char
("The lower vnum must be smaller or equal to upper vnum.\n\r",
ch);
return;
}
k->vnum[0] = atoi (arg2);
send_to_char ("Lower vnum set.\n\r", ch);
return;
}
if (!str_cmp (arg1, "uvnum"))
{
one_argument (argument, arg2);
if (!is_number (arg2))
{
send_to_char ("Syntax: uvnum <number>\n\r", ch);
return;
}
if (atoi (arg2) < k->vnum[0])
{
send_to_char
("The upper vnum must be greater or equal to lower vnum.\n\r",
ch);
return;
}
k->vnum[1] = atoi (arg2);
send_to_char ("Upper vnum set.\n\r", ch);
/*
if( k->vnum[0] > k->krecall || k->krecall > k->vnum[1] )
{
k->krecall = 0;
send_to_char("Kingdom recall was reseted.\n\r",ch);
}
*/
return;
}
if (!str_cmp (arg1, "vnums"))
{
argument = one_argument (argument, arg2);
one_argument (argument, arg1);
if (!is_number (arg2) || !is_number (arg1) || atoi (arg2) > atoi (arg1))
{
send_to_char ("Syntax: vnums <lvnum> <uvnum>\n\r", ch);
send_to_char (" lvnum must be lower or equal to uvnum.\n\r",
ch);
return;
}
k->vnum[0] = atoi (arg2);
k->vnum[1] = atoi (arg1);
send_to_char ("Castle vnums set.\n\r", ch);
/*
if( k->vnum[0] > k->krecall || k->krecall > k->vnum[1] )
{
k->krecall = 0;
send_to_char("Kingdom recall was reseted.\n\r",ch);
}
*/
return;
}
if (!str_cmp ( arg1, "helper"))
{
one_argument (argument, arg2);
if (!str_cmp(arg2,"yes")) k->helper = 1;
else if (!str_cmp(arg2,"no")) k->helper = 0;
else send_to_char("Options are yes, or no.\n\r",ch);
send_to_char("Helper flag changed.\n\r",ch);
return;
}
if (!str_cmp (arg1, "krecall"))
{
one_argument (argument, arg2);
if (!is_number (arg2))
{
send_to_char ("Syntax: kreca <number>\n\r", ch);
return;
}
/*
if( (k->vnum[0] > atoi(arg2)) || (k->vnum[1] < atoi(arg2)) )
{
sprintf( arg1, "The kingdom recall must be a number between %d and %d.\n\r",
k->vnum[0], k->vnum[1] );
send_to_char( arg1, ch );
return;
}
*/
k->krecall = atoi (arg2);
send_to_char ("Kingdom recall set.\n\r", ch);
return;
}
interpret (ch, arg);
return;
}
void gshow (CHAR_DATA * ch, KINGDOM_DATA * k)
{
char buf[MAX_INPUT_LENGTH];
MEMBER_DATA *m;
send_to_char ("\n\r#yKing#7dom Edi#ytor#n\n\r\n\r", ch);
sprintf (buf, "#yName#7: %s#n\n\r", k->name);
send_to_char (buf, ch);
sprintf (buf, "#yDescr#7: %s#n\n\r", k->descr);
send_to_char (buf, ch);
m = get_member_of_rank (k->members, 1);
sprintf (buf, "#yKing#7: %s#n\n\r", ((m != NULL) ? m->name : "none"));
send_to_char (buf, ch);
send_to_char ("\n\r", ch);
}
/*
* OLC style kingdom editor
*/
void do_kingdoms (CHAR_DATA * ch, char *argument)
{
KINGDOM_DATA *kingdom;
KINGDOM_DATA *kiter;
KINGDOM_DATA *k;
MEMBER_DATA *m;
char buf[MAX_INPUT_LENGTH];
char buf2[MAX_INPUT_LENGTH];
char *name;
argument = one_argument (argument, buf);
strcpy (buf2, argument);
if ((m = get_kingdom_char (ch->name)) != NULL)
{
do_kingdom (ch, "");
return;
}
return;
if (get_hours (ch) < 10)
{
stc ("You need at least 10 hours before creating a Kingdom.\n\r", ch);
return;
}
/*
if (ch->max_hit < 25000)
{
stc ("You need at least 25,000 hit points to create a Kingdom.\n\r",
ch);
return;
}
if (ch->race < 15)
{
stc ("You require 15 status before you can create a kingdom!\n\r", ch);
return;
}
if (ch->exp < 1500000)
{
stc ("It takes 1.5 million exp to create a Kingdom.\n\r", ch);
return;
}
*/
if (buf[0] == '\0' || buf2[0] == '\0')
{
stc ("Syntax: kingdom create <name>\n\r", ch);
return;
}
if (strlen (bash_color (buf2)) > 19 || strlen (bash_color (buf2)) < 3)
{
send_to_char ("From 3 to 19 characters please.\n\r", ch);
return;
}
name = ch->name;
if (!str_cmp ("create", buf))
{
for (k = king_first; k != NULL; k = k->next)
{
if (!str_cmp (bash_color(buf2), k->name))
{
stc ("Theres already a kingdom named that!\n\r", ch);
return;
}
}
if (member_free == NULL)
kingdom = alloc_perm (sizeof (*kingdom));
else
{
kingdom = kingdom_free;
kingdom_free = kingdom_free->next;
}
kingdom->next = NULL;
kingdom->prev = NULL;
kingdom->members = NULL;
kingdom->ranks[0] = str_dup ("#wKing");
kingdom->ranks[1] = str_dup ("#wPrince");
kingdom->ranks[2] = str_dup ("#wBaron");
kingdom->ranks[3] = str_dup ("#wKnight");
kingdom->ranks[4] = str_dup ("#wMember");
kingdom->ranks[5] = str_dup ("#wQueen");
kingdom->ranks[6] = str_dup ("#wPrincess");
kingdom->ranks[7] = str_dup ("#wBaroness");
kingdom->ranks[8] = str_dup ("#wKnight");
kingdom->ranks[9] = str_dup ("#wMember");
kingdom->vnum[0] = 0;
kingdom->vnum[1] = 0;
kingdom->krecall = 0;
if (IS_SET (ch->extra2, NHELPER)) kingdom->helper = 1;
else
kingdom->helper = 0;
kingdom->memnum = 0;
kingdom->memnum += 1;
kingdom->open = str_dup ("");
kingdom->close = str_dup ("");
//free_string (kingdom->descr);
kingdom->descr = str_dup (buf2);
//free_string (kingdom->name);
kingdom->name = str_dup (bash_color (buf2));
if (king_first == NULL)
king_first = kingdom;
if (king_last != NULL)
{
king_last->next = kingdom;
kingdom->prev = king_last;
}
king_last = kingdom;
for (kiter = king_first; kiter != NULL; kiter = kiter->next)
{
DIPLOMACY_DATA *diplomacy;
// Inserting diplomacy into new kingdom
if (diplomacy_free == NULL)
diplomacy = alloc_perm (sizeof (*diplomacy));
else
{
diplomacy = diplomacy_free;
diplomacy_free = diplomacy_free->next;
}
diplomacy->next = NULL;
diplomacy->prev = NULL;
diplomacy->diplomacy = DIPL_NEUTRAL;
diplomacy->kingdom = kiter;
if (kingdom->diplomacy == NULL)
kingdom->diplomacy = diplomacy;
if (kingdom->diplomacy_last != NULL)
{
kingdom->diplomacy_last->next = diplomacy;
diplomacy->prev = kingdom->diplomacy_last;
}
kingdom->diplomacy_last = diplomacy;
if (kiter == king_last)
break;
// Inserting diplomacy into old kingdom
if (diplomacy_free == NULL)
diplomacy = alloc_perm (sizeof (*diplomacy));
else
{
diplomacy = diplomacy_free;
diplomacy_free = diplomacy_free->next;
}
diplomacy->next = NULL;
diplomacy->diplomacy = DIPL_NEUTRAL;
diplomacy->kingdom = kingdom;
if (kiter->diplomacy == NULL)
kiter->diplomacy = diplomacy;
if (kiter->diplomacy_last != NULL)
{
kiter->diplomacy_last->next = diplomacy;
diplomacy->prev = kiter->diplomacy_last;
}
kiter->diplomacy_last = diplomacy;
}
if (member_free == NULL)
m = alloc_perm (sizeof (*m));
else
{
m = member_free;
member_free = member_free->next;
}
m->rank = 1;
m->name = str_dup (ch->name);
m->sex = ch->sex;
m->kingdom = kingdom;
m->next = NULL;
m->prev = NULL;
if (kingdom->members == NULL)
kingdom->members = m;
else
{
m->next = kingdom->members;
kingdom->members->prev = m;
kingdom->members = m;
}
get_min_kingdom_members();
do_ksave (ch, "");
sprintf (buf, "#y%s #7has founded #y%s#7.", ch->name, m->kingdom->descr);
do_info (ch, buf);
// ch->exp -= 1500000;
return;
}
else
{
send_to_char ("Syntax: kingdom create <name>\n\r\n\r", ch);
return;
}
}
void del_diplomacy (DIPLOMACY_DATA * d, KINGDOM_DATA * k)
{
if (d == NULL)
return;
if (d->prev != NULL)
d->prev->next = d->next;
if (d->next != NULL)
d->next->prev = d->prev;
if (k->diplomacy == d)
k->diplomacy = d->next;
if (k->diplomacy_last == d)
k->diplomacy_last = d->prev;
d->next = diplomacy_free;
diplomacy_free = d;
}
/*
* Delete a member from the member list in the kingdom structure
*/
void del_member( MEMBER_DATA* m )
{
if( m == NULL ) return;
if( m->prev != NULL )
m->prev->next = m->next;
if( m->next != NULL )
m->next->prev = m->prev;
if( m->kingdom->members == m )
m->kingdom->members = m->next;
free_string( m->name );
m->next = member_free;
member_free = m;
}
/*
* Delete one kingdom and related information
*/
void del_kingdom( KINGDOM_DATA* k )
{
KINGDOM_DATA * kiter = NULL;
DIPLOMACY_DATA * dipl = NULL;
if( k == NULL ) return;
if( k->prev != NULL )
k->prev->next = k->next;
if( k->next != NULL )
k->next->prev = k->prev;
if( king_first == k )
king_first = k->next;
if( king_last == k )
king_last = k->prev;
k->pk_pd[0] = 0;
k->pk_pd[1] = 0;
free_string( k->name );
free_string( k->descr );
free_string( k->open );
free_string( k->close );
free_string( k->ranks[0] );
free_string( k->ranks[1] );
free_string( k->ranks[2] );
free_string( k->ranks[3] );
free_string( k->ranks[4] );
free_string( k->ranks[5] );
free_string( k->ranks[6] );
free_string( k->ranks[7] );
free_string( k->ranks[8] );
free_string( k->ranks[9] );
for( kiter = king_first; kiter != NULL; kiter = kiter->next )
{
bool stop = FALSE;
for( dipl = kiter->diplomacy; dipl != NULL && !stop; dipl = dipl->next )
{
if( dipl->kingdom == k )
{
del_diplomacy(dipl, kiter);
stop = TRUE;
}
}
}
while( k->members != NULL )
del_member(k->members);
while( k->diplomacy != NULL )
del_diplomacy(k->diplomacy,k);
k->next = kingdom_free;
kingdom_free = k;
}
void odel_kingdom (KINGDOM_DATA * k)
{
KINGDOM_DATA *kiter = NULL;
DIPLOMACY_DATA *dipl = NULL;
if (k == NULL)
return;
if (k->prev != NULL)
k->prev->next = k->next;
if (k->next != NULL)
k->next->prev = k->prev;
if (king_first == k)
king_first = k->next;
if (king_last == k)
king_last = k->prev;
free_string (k->name);
free_string (k->descr);
free_string (k->ranks[0]);
free_string (k->ranks[1]);
free_string (k->ranks[2]);
free_string (k->ranks[3]);
free_string (k->ranks[4]);
for (kiter = king_first; kiter != NULL; kiter = kiter->next)
{
bool stop = FALSE;
for (dipl = kiter->diplomacy; dipl != NULL && !stop; dipl = dipl->next)
{
if (dipl->kingdom == k)
{
del_diplomacy (dipl, kiter);
stop = TRUE;
}
}
}
while (k->members != NULL)
del_member (k->members);
get_min_kingdom_members();
k->memnum = 0;
k->pk_pd[0] = 0;
k->pk_pd[1] = 0;
k->next = kingdom_free;
kingdom_free = k;
}
//////////////////////////////////////////
// Kingdom related commands for members //
//////////////////////////////////////////
/*
* Descr: Add a player to a kingdom
* Ranks allowed: 1,2 and 3
* Requirements: Player must be clannable
*/
void do_kinduct (CHAR_DATA * ch, char *argument)
{
MEMBER_DATA *m;
CHAR_DATA *wch;
KINGDOM_DATA *k;
char buf[MAX_STRING_LENGTH];
if ((m = get_kingdom_char (ch->name)) == NULL || m->rank > m->kingdom->cmd[KCMD_INDUCT] )
{
send_to_char ("Huh?\n\r", ch);
return;
}
return;
k = m->kingdom;
if (argument[0] == '\0')
{
send_to_char ("Who do you wish to induct?\n\r", ch);
return;
}
if (k->helper == 1) {
send_to_char("You cannot induct any members.\n\r",ch); return; }
if (k->memnum >= min_kingdom_members + 5)
{
send_to_char
("You must wait until the kingdom with least members gets more.\n\r",
ch);
return;
}
if ((wch = get_char_room (ch, argument)) == NULL)
{
send_to_char
("You search for them but they are nowhere in the room.\n\r", ch);
return;
}
if (IS_NPC (wch))
return;
if ((m = get_kingdom_char (wch->name)) != NULL)
{
send_to_char ("They already have a kingdom.\n\r", ch);
return;
}
if (!IS_SET (wch->newbits, NEW_CLANNABLE))
{
send_to_char ("They are not willing to join your cause.\n\r", ch);
return;
}
/*
if (k->materials[MAT_QUEST] < ((k->memnum + 1) * 10000) )
{
stc("Your kingdom is not wealthy enough to induct them.\n\r", ch);
return;
}
*/
if (member_free == NULL)
m = alloc_perm (sizeof (*m));
else
{
m = member_free;
member_free = member_free->next;
}
m->rank = 5;
m->name = str_dup (wch->name);
m->sex = ch->sex;
m->kingdom = k;
m->next = NULL;
m->prev = NULL;
if (k->members == NULL)
k->members = m;
else
{
m->next = k->members;
k->members->prev = m;
k->members = m;
}
k->memnum++;
/*
if (k->materials[MAT_QUEST] < (k->memnum * 10000) )
{
stc("Your kingdom is not wealthy enough to induct them.\n\r", ch);
return;
}*/
// k->materials[MAT_QUEST] -= (k->memnum * 10000);
sprintf (buf, "#y%s #whas joined #c%s.", wch->name, k->descr);
// do_kinfo (ch, buf);
REMOVE_BIT (wch->newbits, NEW_CLANNABLE);
sprintf (buf, "I %s, hereby declare you %s a member of %s!",
ch->name, wch->name, k->descr);
do_say (ch, buf);
do_save_kings (ch, argument);
get_min_kingdom_members ();
}
/*
* Descr: Remove a player from a kingdom
* Ranks allowed: 1 and 2
* Requirements: none
*/
void do_koutcast (CHAR_DATA * ch, char *argument)
{
MEMBER_DATA *m1;
MEMBER_DATA *m2;
KINGDOM_DATA *k;
char buf[MAX_STRING_LENGTH];
m1 = get_kingdom_char (ch->name);
m2 = get_kingdom_char (argument);
if ((m1 == NULL || m1->rank > m1->kingdom->cmd[KCMD_OUTCAST]) && !IS_IMMORTAL (ch))
{
send_to_char ("Huh?\n\r", ch);
return;
}
return;
if (argument[0] == '\0')
{
send_to_char ("Who do you wish to outcast?\n\r", ch);
return;
}
if (m2 == NULL || (!IS_IMMORTAL (ch) && m2->kingdom != m1->kingdom))
{
send_to_char ("No one with that name in your kingdom.\n\r", ch);
return;
}
if (m2->rank == 1 || (!IS_IMMORTAL (ch) && m1->rank >= m2->rank))
{
send_to_char ("Their rank doesn't allow you to outcast them.\n\r", ch);
return;
}
k = m2->kingdom;
sprintf (buf, "#y%s #whas been #rOutcast from #c%s.",
capitalize (m2->name), k->descr);
// do_kinfo (ch, buf);
sprintf (buf, "You outcast %s from %s\n\r", m2->name, k->descr);
stc (buf, ch);
m2->kingdom->memnum--;
del_member (m2);
get_min_kingdom_members ();
do_save_kings (ch, argument);
}
/*
* Descr: increase the kingdom rank of a player
* Ranks allowed: 1 and 2
* Requirements: none
*/
void do_kpromote (CHAR_DATA * ch, char *argument)
{
MEMBER_DATA *m1;
MEMBER_DATA *m2;
char buf[MAX_STRING_LENGTH];
m1 = get_kingdom_char (ch->name);
m2 = get_kingdom_char (argument);
if (m1 == NULL || m1->rank > m1->kingdom->cmd[KCMD_PROMOTE])
{
send_to_char ("Huh?\n\r", ch);
return;
}
if (argument[0] == '\0')
{
send_to_char ("Who do you wish to promote?\n\r", ch);
return;
}
if (m2 == NULL || m2->kingdom != m1->kingdom)
{
send_to_char ("No one with that name in your kingdom.\n\r", ch);
return;
}
if (m2->rank <= m1->rank)
{
send_to_char ("Their rank doesn't allow you to do that.\n\r", ch);
return;
}
if (m2->rank <= m1->rank + 1)
{
send_to_char ("You can not promote someone to your own rank.\n\r", ch);
return;
}
if (m2->rank - 1 < 3
&& get_member_of_rank (m1->kingdom->members, 2) != NULL)
{
send_to_char ("That rank is already taken.\n\r", ch);
return;
}
m2->rank--;
sprintf (buf, "#y%s #7has been promoted to #C%s#7.",
capitalize (m2->name), m2->kingdom->ranks[m2->rank - 1]);
// do_kinfo (ch, buf);
do_save_kings (ch, "");
}
/*
* Descr: decrease the kingdom rank of a player
* Ranks allowed: 1 and 2
* Requirements: none
*/
void do_kdemote (CHAR_DATA * ch, char *argument)
{
MEMBER_DATA *m1;
MEMBER_DATA *m2;
char buf[MAX_STRING_LENGTH];
m1 = get_kingdom_char (ch->name);
m2 = get_kingdom_char (argument);
if (m1 == NULL || m1->rank > m1->kingdom->cmd[KCMD_DEMOTE])
{
send_to_char ("Huh?\n\r", ch);
return;
}
if (argument[0] == '\0')
{
send_to_char ("Who do you wish to demote?\n\r", ch);
return;
}
if (m2 == NULL || m2->kingdom != m1->kingdom)
{
send_to_char ("No one with that name in your kingdom.\n\r", ch);
return;
}
if (m2->rank <= m1->rank)
{
send_to_char ("Their rank doesn't allow you to do that.\n\r", ch);
return;
}
if (m2->rank == 5)
{
send_to_char ("They already have the lowest rank.\n\r", ch);
return;
}
m2->rank++;
sprintf (buf, "#y%s #7has been demoted to #C%s#7.",
capitalize (m2->name), m2->kingdom->ranks[m2->rank - 1]);
// do_kinfo (ch, buf);
do_save_kings (ch, "");
}
/*
* Descr: leave the kingdom
* Ranks allowed: 1,2,34 and 5
* Requirements: none
*/
void do_kdesert (CHAR_DATA * ch, char *argument)
{
MEMBER_DATA *m;
char buf[MAX_STRING_LENGTH];
char arg1[MAX_INPUT_LENGTH];
char *pArg;
char cEnd;
m = get_kingdom_char (ch->name);
if (m == NULL)
{
send_to_char ("Huh?\n\r", ch);
return;
}
if (m->rank == 1)
{
send_to_char ("Leaders may not desert.\n\r", ch);
return;
}
pArg = arg1;
while (isspace (*argument))
argument++;
cEnd = ' ';
if (*argument == '\'' || *argument == '"')
cEnd = *argument++;
while (*argument != '\0')
{
if (*argument == cEnd)
{
argument++;
break;
}
*pArg++ = *argument++;
}
*pArg = '\0';
if (arg1[0] == '\0')
{
send_to_char ("Are you sure you wish to leave your kingdom?\n\r", ch);
send_to_char
("Type desert <password> if you really wish to leave your kingdom.\n\r",
ch);
return;
}
if (strcmp (arg1, ch->pcdata->pwd)
&& strcmp (crypt (arg1, ch->pcdata->pwd), ch->pcdata->pwd))
{
WAIT_STATE (ch, 40);
send_to_char ("Wrong password. Wait 10 seconds.\n\r", ch);
return;
}
sprintf (buf, "#y%s #7has left #y%s#7.", ch->name, m->kingdom->descr);
// do_kinfo (ch, buf);
m->kingdom->memnum--;
get_min_kingdom_members ();
del_member (m);
char_from_room (ch);
char_to_room (ch, get_room_index (ROOM_VNUM_TEMPLE));
do_save_kings (ch, "");
}
/*
* Descr: Finish and delete a kingdom
* Ranks allowed: 1
* Requirements: king password
*/
void do_kdisband (CHAR_DATA * ch, char *argument)
{
MEMBER_DATA *m;
char buf[MAX_STRING_LENGTH];
char arg1[MAX_INPUT_LENGTH];
char *pArg;
char cEnd;
int refund = 0;
m = get_kingdom_char (ch->name);
if (m == NULL || m->rank > 1)
{
send_to_char ("Huh?\n\r", ch);
return;
}
pArg = arg1;
while (isspace (*argument))
argument++;
cEnd = ' ';
if (*argument == '\'' || *argument == '"')
cEnd = *argument++;
while (*argument != '\0')
{
if (*argument == cEnd)
{
argument++;
break;
}
*pArg++ = *argument++;
}
*pArg = '\0';
if (arg1[0] == '\0')
{
send_to_char ("Are you sure you wish to disband your kingdom?\n\r", ch);
send_to_char
("Type disband <password> if you really wish to disband your kingdom.\n\r",
ch);
return;
}
if (strcmp (arg1, ch->pcdata->pwd)
&& strcmp (crypt (arg1, ch->pcdata->pwd), ch->pcdata->pwd))
{
WAIT_STATE (ch, 40);
send_to_char ("Wrong password. Wait 10 seconds.\n\r", ch);
return;
}
sprintf (buf, "%s disbanded %s.", ch->name, m->kingdom->name);
log_string (buf, ch);
sprintf (buf, "#y%s #7has disbanded #y%s#7.", ch->name, m->kingdom->descr);
do_info (ch, buf);
if (m->kingdom->materials[MAT_QUEST] > 10000)
{
refund = (m->kingdom->materials[MAT_QUEST] / 2);
sprintf (buf, "You receive a refund of %d quest points\n\r", refund);
stc (buf, ch);
ch->pcdata->quest += refund;
}
m->kingdom->materials[MAT_QUEST] = 0;
del_kingdom (m->kingdom);
get_min_kingdom_members ();
do_save_kings (ch, "");
}
/*
* Descr: Pass the leadership the a rank 2 member
* Ranks allowed: 1
* Requirements: king password, there must be a rank 2 member
*/
void do_krenounce (CHAR_DATA * ch, char *argument)
{
MEMBER_DATA *m;
MEMBER_DATA *m2;
char buf[MAX_STRING_LENGTH];
char arg1[MAX_INPUT_LENGTH];
char *pArg;
char cEnd;
m = get_kingdom_char (ch->name);
if (m == NULL || m->rank > 1)
{
send_to_char ("Huh?\n\r", ch);
return;
}
if ((m2 = get_member_of_rank (m->kingdom->members, 2)) == NULL)
{
send_to_char
("First you must promote someone to second in command.\n\r", ch);
return;
}
pArg = arg1;
while (isspace (*argument))
argument++;
cEnd = ' ';
if (*argument == '\'' || *argument == '"')
cEnd = *argument++;
while (*argument != '\0')
{
if (*argument == cEnd)
{
argument++;
break;
}
*pArg++ = *argument++;
}
*pArg = '\0';
if (arg1[0] == '\0')
{
send_to_char ("Are you sure you wish to renounce?\n\r", ch);
send_to_char
("Type renounce <password> if you really wish to do it.\n\r", ch);
return;
}
if (strcmp (arg1, ch->pcdata->pwd)
&& strcmp (crypt (arg1, ch->pcdata->pwd), ch->pcdata->pwd))
{
WAIT_STATE (ch, 40);
send_to_char ("Wrong password. Wait 10 seconds.\n\r", ch);
return;
}
sprintf (buf, "%s renounced %s to %s.", ch->name, m->kingdom->name,
m2->name);
log_string (buf, ch);
sprintf (buf, "#y%s #7has renounced #y%s #7to #y%s#7.", ch->name,
m->kingdom->descr, m2->name);
// do_kinfo (ch, buf);
m2->rank = 1;
m->kingdom->memnum--;
get_min_kingdom_members ();
del_member (m);
do_save_kings (ch, "");
//load_kingdoms();
}
/*
* Descr: recall to kingdom recall room
* Ranks allowed: 1 and 2
* Requirements: no fight timer, no curse
*/
void do_krecall (CHAR_DATA * ch, char *argument)
{
char buf[MAX_STRING_LENGTH];
CHAR_DATA *victim;
CHAR_DATA *mount;
ROOM_INDEX_DATA *location;
MEMBER_DATA *m;
if (IS_NPC (ch) || (m = get_kingdom_char (ch->name)) == NULL)
{
send_to_char ("Huh?\n\r", ch);
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 (m->kingdom->materials[MAT_QUEST] == 0)
{
stc ("You have been evicted!!\n\r", ch);
return;
}
if (ch->fight_timer)
{
send_to_char ("Not with a fight timer.\n\r", ch);
return;
}
if (IS_AFFECTED (ch, AFF_WEBBED))
{
send_to_char
("You are unable to move with all this sticky webbing on.\n\r", ch);
return;
}
if (IS_SET (ch->affected_by, AFF_ENTRAILS))
{
send_to_char
("You are unable to move with these entrails entrapping you.\n\r",
ch);
return;
}
if (IS_SET (ch->flag2, AFF_TOTALBLIND))
{
stc ("You are unable to recall.\n\r", ch);
return;
}
act ("A look of concentration crosses $n's face.", ch, NULL, NULL,
TO_ROOM);
if ((location = get_room_index (m->kingdom->krecall)) == NULL)
{
send_to_char ("You are completely lost.\n\r", ch);
return;
}
if (ch->in_room == location)
return;
if ((victim = ch->fighting) != NULL)
{
if (number_bits (1) == 0)
{
WAIT_STATE (ch, 4);
sprintf (buf, "You failed!\n\r");
send_to_char (buf, ch);
return;
}
sprintf (buf, "You recall from combat!\n\r");
send_to_char (buf, 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;
}
////////////////////////////
// Information commands //
////////////////////////////
/*
* Deposit QPS into Kingdom Balance
*/
void do_depositqps (CHAR_DATA * ch, char *argument)
{
KINGDOM_DATA *k;
MEMBER_DATA *m;
char buf[MSL];
int amt;
if (IS_NPC (ch))
return;
amt = atoi (argument);
if ((m = get_kingdom_char (ch->name)) == NULL)
{
send_to_char
("How can you deposit QP when you are not in a KINGDOM???\n\r", ch);
return;
}
k = m->kingdom;
if (argument[0] == '\0')
{
stcprintf (ch, "Your kingdoms balance is %d quest points.\n\r",
k->materials[MAT_QUEST]);
send_to_char ("How much do you want to deposit?\n\r", ch);
return;
}
if (amt < 1)
{
send_to_char ("Im sorry but we dont give work on negatives here!", ch);
return;
}
if (amt > ch->pcdata->quest)
{
send_to_char ("You dont have that amount of QPS sorry!\n\r", ch);
return;
}
sprintf (buf,
"%s has deposited %d quest points into the kingdom treasury.",
ch->name, amt);
// do_kinfo (ch, buf);
ch->pcdata->quest -= amt;
k->materials[MAT_QUEST] += amt;
do_save_kings (ch, "");
stcprintf (ch, "Your kingdoms balance is now %d quest points.\n\r",
k->materials[MAT_QUEST]);
return;
}
/*
* Withdraw QPS from a Kingdom balance
*/
void do_withdrawqps (CHAR_DATA * ch, char *argument)
{
KINGDOM_DATA *k;
MEMBER_DATA *m;
char buf[MSL];
int amt;
if (IS_NPC (ch))
return;
amt = atoi (argument);
if ((m = get_kingdom_char (ch->name)) == NULL)
{
send_to_char
("How can you withdraw QP when you are not in a KINGDOM???\n\r", ch);
return;
}
k = m->kingdom;
if (argument[0] == '\0')
{
stcprintf (ch, "Your kingdoms balance is %d quest points.\n\r",
k->materials[MAT_QUEST]);
send_to_char ("How much do you want to withdraw?\n\r", ch);
return;
}
if (amt < 1 || amt > 100000)
{
send_to_char
("You can only withdraw a maximum of 100000 qps from your kingdoms balance",
ch);
return;
}
if (amt > k->materials[MAT_QUEST])
{
send_to_char ("Your Kingdom doesn't have enough qps\n\r", ch);
return;
}
sprintf (buf,
"You withdraw %d quest points from the kingdom treasury.\n\r",
amt);
send_to_char (buf, ch);
sprintf (buf,
"%s has withdrawn %d quest points from the kingdom treasury.",
ch->name, amt);
// do_kinfo (ch, buf);
k->materials[MAT_QUEST] -= amt;
ch->pcdata->quest += amt;
save_char_obj (ch);
do_save_kings (ch, "");
stcprintf (ch, "Your kingdoms balance is now %d quest points.\n\r",
k->materials[MAT_QUEST]);
return;
}
/*
* Display the members of a given kingdom and their ranks
*/
void do_kinginfo (CHAR_DATA * ch, char *argument)
{
KINGDOM_DATA *k;
KINGDOM_DATA *k2;
MEMBER_DATA *m;
MEMBER_DATA *member_list;
char buf[MAX_INPUT_LENGTH];
char nbuf[MAX_INPUT_LENGTH];
int rank;
int align = 0;
int col = 0;
argument = one_argument (argument, buf);
if (buf[0] == '\0')
{
stc ("Get info on which kingdom?\n\r\n\r", ch);
for (k2 = king_first; k2; k2 = k2->next)
{
sprintf (nbuf, "%s, ", k2->name);
stc (nbuf, ch);
if (++col % 4 == 0)
send_to_char ("\n\r", ch);
}
if (col % 4 != 0)
send_to_char ("\n\r", ch);
// do_kinglist (ch, "");
return;
}
for (k = king_first; k != NULL; k = k->next)
if (!str_prefix (buf, k->name))
break;
if (k == NULL)
{
send_to_char ("\n\r\n\rNo such Kingdom.\n\r\n\r", ch);
return;
}
stc ("#b------------------------------------------------------------#n\n\r", ch);
sprintf (buf, "#yThe Current statistics of the #r%s #yKingdom#n\n\r",
k->descr);
send_to_char (buf, ch);
stc ("#b------------------------------------------------------------#n\n\r", ch);
send_to_char ("#rRanks:\n\r", ch);
stc ("#b------------------------------------------------------------#n\n\r", ch);
m = get_member_of_rank (k->members, 1);
sprintf (buf, "#p%s#e:#w %s#n\n\r",
(m != NULL) ? k->ranks[(m->sex * 5) - 5] : k->ranks[0],
(m != NULL) ? m->name : "");
send_to_char (buf, ch);
m = get_member_of_rank (k->members, 2);
sprintf (buf, "%s#e:#w %s#n\n\r",
(m != NULL) ? k->ranks[(m->sex * 5) - 4] : k->ranks[1],
(m != NULL) ? m->name : "");
send_to_char (buf, ch);
for (rank = 3; rank < 6; rank++)
{
member_list = k->members;
align = 0;
if (k->ranks[4 + rank] == NULL ||
k->ranks[4 + rank][0] == '\0' ||
!str_cmp (k->ranks[rank - 1], k->ranks[4 + rank]))
{
sprintf (buf, "\n\r%s#e:#w\n\r ", k->ranks[rank - 1]);
}
else
{
sprintf (buf,
"\n\r%s#e/#n%s#e:#w\n\r ",
k->ranks[rank - 1], k->ranks[4 + rank]);
}
send_to_char (buf, ch);
while ((m = get_member_of_rank (member_list, rank)) != NULL)
{
align++;
if (align == 6)
{
send_to_char ("\n\r ", ch);
align = 0;
}
sprintf (buf, "#w%s", m->name);
put_spc (buf, 15, TRUE);
send_to_char (buf, ch);
member_list = m->next;
}
}
stc ("#b\n\r------------------------------------------------------------#n\n\r", ch);
sprintf (buf, "#wThe %s #wKingdom has a QP balance of #r%d#n\n\r",
k->descr, k->materials[MAT_QUEST]);
send_to_char (buf, ch);
stc ("#b------------------------------------------------------------#n\n\r", ch);
}
/*
* Immortal command to show kingdom info
*/
void do_kshow (CHAR_DATA * ch, char *argument)
{
int i;
KINGDOM_DATA *kingdom;
int value;
if (argument[0] == '\0' || !is_number (argument))
{
return;
}
value = atoi (argument);
for (i = 1, kingdom = king_first;
kingdom != NULL && i < value; i++, kingdom = kingdom->next);
if (kingdom == NULL)
{
return;
}
kshow (ch, kingdom);
}
/*
* Display the list of existing kingdoms
*/
void do_kinglist (CHAR_DATA * ch, char *argument)
{
char buf[MSL], buf2[MSL];
KINGDOM_DATA *k;
MEMBER_DATA *m;
int i = 1;
int pk_pd_ratio = 0;
buf[0] = '\0';
send_to_char ("\n\r", ch);
stc ("#wThe Kingdoms of Legend of Chrystancia..\n\r", ch);
stc ("#w[#rNUM#w] [#g NAME #w] [#y LEADER #w] [#b PKS#w ] [#p PDS #w] [#P RATIO #w] [#c MEMBERS #w]\n\r", ch);
for (k = king_first; k; k = k->next)
{
m = get_member_of_rank (k->members, 1);
if (k->pk_pd[1] > 0)
pk_pd_ratio = (k->pk_pd[0] * 100) / (k->pk_pd[1] + k->pk_pd[0]);
else if (k->pk_pd[0] < 1)
pk_pd_ratio = 0;
else
pk_pd_ratio = 100;
/*
if (k->pk_pd[0] == 0)
pk_pd_ratio = 0;
else if (k->pk_pd[1] == 0)
pk_pd_ratio = 100;
else
pk_pd_ratio = (k->pk_pd[0] / k->pk_pd[1]) * 100;
*/
sprintf (buf2,
"#w[#r%3d#w] [#g%-19s#w] [#y%-12s#w] [#b%7d#w] [#p%7d#w] [#P%6d#w%%] [#c%12d#w]#n\n\r",
i++, mal_align (k->descr, 19, TRUE),
((m != NULL) ? m->name : ""), k->pk_pd[0], k->pk_pd[1],
pk_pd_ratio, k->memnum);
strcat (buf, buf2);
}
stc (buf, ch);
}
/*
* Show what members of the player are on
*/
void do_kingdom (CHAR_DATA * ch, char *argument)
{
DESCRIPTOR_DATA *d;
char buf[MAX_STRING_LENGTH];
char buf2[MAX_STRING_LENGTH];
MEMBER_DATA *m1;
MEMBER_DATA *m2;
if ((m1 = get_kingdom_char (ch->name)) == NULL)
{
send_to_char ("Huh?\n\r", ch);
return;
}
sprintf (buf, "#wThe '#y%s#w' clan.\n\r", m1->kingdom->descr);
send_to_char (buf, ch);
send_to_char
("#g[ Name ] [ Hits ] [ HPmax ] [ Mana ] [ Move ] [ Status ] [ Rank ]#n\n\r",
ch);
for (d = first_descriptor; d != NULL; d = d->next)
{
CHAR_DATA *wch;
int rank;
if (d->connected != CON_PLAYING)
continue;
wch = (d->original != NULL) ? d->original : d->character;
m2 = get_kingdom_char (wch->name);
if (m2 == NULL || m2->kingdom != m1->kingdom)
continue;
rank = m2->rank;
if (wch->sex == SEX_MALE)
strcpy (buf2, m2->kingdom->ranks[rank - 1]);
else if (m2->kingdom->ranks[rank + 4][0] == '\0')
strcpy (buf2, m2->kingdom->ranks[rank - 1]);
else
strcpy (buf2, m2->kingdom->ranks[rank + 4]);
sprintf (buf,
"#g[#n%-12s#g] [#n%7d#g] [#n%7d#g] [#n%7d#g] [#n%7d#g] [#n %-3d #g] [ #n%-8s #g]#n\n\r",
wch->name, wch->hit, wch->max_hit, wch->mana, wch->move,
wch->race, put_spc (buf2, 8, TRUE));
send_to_char (buf, ch);
}
}
void do_kresources (CHAR_DATA * ch, char *argument)
{
KINGDOM_DATA *k;
MEMBER_DATA *m;
char buf[MAX_INPUT_LENGTH];
if ((m = get_kingdom_char (ch->name)) == NULL)
{
send_to_char ("But you have no kingdom.\n\r", ch);
return;
}
else
k = m->kingdom;
sprintf (buf, "Resources of the kingdom of %s#n:\n\r\n\r", k->descr);
send_to_char (buf, ch);
sprintf (buf, " #yQPS#n: #C%d.\n\r", k->materials[MAT_QUEST]);
send_to_char (buf, ch);
sprintf (buf, " #yGold#n: #C%d #npieces.\n\r", k->materials[MAT_GOLD]);
send_to_char (buf, ch);
sprintf (buf, " #nStone#n: #C%d #nslabs.\n\r", k->materials[MAT_STONE]);
send_to_char (buf, ch);
sprintf (buf, " #oWood#n: #C%d #nlogs.\n\r", k->materials[MAT_WOOD]);
send_to_char (buf, ch);
sprintf (buf, " #0Steel#n: #C%d #nslabs.\n\r", k->materials[MAT_STEEL]);
send_to_char (buf, ch);
}
void do_ktalk (CHAR_DATA * ch, char *argument)
{
DESCRIPTOR_DATA *d;
MEMBER_DATA *m1;
MEMBER_DATA *m2;
KINGDOM_DATA *k;
char buf[MAX_STRING_LENGTH];
char ibuf[MSL];
char king[MSL];
FILE *fp;
char *nstr;
char time_buf[MSL];
time_t nowtime;
struct tm *t;
char *strtime;
if ((m1 = get_kingdom_char (ch->name)) == NULL)
{
send_to_char ("Huh?\n\r", ch);
return;
}
k = m1->kingdom;
if (argument[0] == '\0')
{
send_to_char ("Ktalk what?\n\r", ch);
return;
}
if (IS_SET (ch->act, PLR_SILENCE))
{
sprintf (buf, "You can't ktalk because you are silenced.\n\r");
send_to_char (buf, ch);
return;
}
for (d = first_descriptor; d != NULL; d = d->next)
{
CHAR_DATA *wch;
bool CAN_VIEW = FALSE;
if (d->connected != CON_PLAYING)
continue;
wch = d->original ? d->original : d->character;
if (IS_SET (wch->deaf, CHANNEL_KTALK))
continue;
if (IS_JUDGE (wch))
CAN_VIEW = TRUE;
if (!CAN_VIEW)
{
if ((m2 = get_kingdom_char (wch->name)) == NULL)
continue;
}
if (!CAN_VIEW)
{
if (m1->kingdom != m2->kingdom)
continue;
}
if (IS_IMMORTAL (wch))
{
kingdom2 (ch, king);
sprintf (ibuf, "#w(#nKingdom #r%s#w)#n #y.x[#w%s#y]x. '#w%s#y'\n\r",
king, ch->name, argument);
send_to_char (ibuf, wch);
}
else
{
sprintf (buf, "#y.x[#w%s#y]x. '#w%s#y'\n\r", ch->name, argument);
send_to_char (buf, wch);
}
}
if (!(fp = fopen (KTALK_LOG_FILE, "a+")))
{
bug ("Cannot open KTALK_LOG_FILE!", 0);
}
else
{
char t_king[100];
/*
* We use this char in 'chatlog.dat' to represent start of line
* Thus we cannot use it in chat... so strip it out...
*/
nstr = switch_char (argument, '>', ' ');
argument = nstr;
nowtime = time (¤t_time);
t = localtime (&nowtime);
time_buf[0] = '\0';
strtime = asctime(gmtime(¤t_time));
strtime[strlen(strtime)-1] = '\0';
strcat(time_buf, datestring(strtime));
kingdom2 (ch, t_king);
fprintf (fp, ">#w[#r%s#w] #c%20s #w%15s: #y%s#n\r\n", time_buf,
bash_color (t_king), ch->name, argument);
fclose (fp);
}
}
void do_atalk (CHAR_DATA * ch, char *argument)
{
DESCRIPTOR_DATA *d;
DIPLOMACY_DATA *diplomacy;
MEMBER_DATA *m1;
MEMBER_DATA *m2 = NULL;
char buf[MAX_STRING_LENGTH];
if ((m1 = get_kingdom_char (ch->name)) == NULL)
{
send_to_char ("Huh?\n\r", ch);
return;
}
if (IS_SET (ch->act, PLR_SILENCE))
{
stc ("You can't Atalk.\n\r", ch);
return;
}
if (argument[0] == '\0')
{
send_to_char ("Atalk what?\n\r", ch);
return;
}
for (d = first_descriptor; d != NULL; d = d->next)
{
CHAR_DATA *wch;
diplomacy = NULL;
if (d->connected != CON_PLAYING)
continue;
wch = (d->original != NULL) ? d->original : d->character;
if (!IS_IMMORTAL (wch) && (m2 = get_kingdom_char (wch->name)) == NULL)
continue;
if (!IS_IMMORTAL (wch) && m1->kingdom != m2->kingdom)
for (diplomacy = m1->kingdom->diplomacy;
diplomacy->kingdom != m2->kingdom && diplomacy != NULL;
diplomacy = diplomacy->next);
if (!IS_IMMORTAL (wch) && m1->kingdom != m2->kingdom
&& (diplomacy == NULL || diplomacy->diplomacy != DIPL_ALLIANCE))
continue;
sprintf (buf, "#r.x[#w%s#r]x. '#w%s#r'\n\r", ch->name, argument);
send_to_char (buf, wch);
}
}
void do_clannable (CHAR_DATA * ch, char *argument)
{
char arg[MAX_INPUT_LENGTH];
argument = one_argument (argument, arg);
if (IS_NPC (ch))
return;
if (!IS_SET (ch->newbits, NEW_CLANNABLE))
{
send_to_char ("You are now clannable.\n\r", ch);
SET_BIT (ch->newbits, NEW_CLANNABLE);
return;
}
send_to_char ("You are no longer clannable.\n\r", ch);
REMOVE_BIT (ch->newbits, NEW_CLANNABLE);
return;
}
/* Diplomacy */
void do_kdeclare (CHAR_DATA * ch, char *argument)
{
MEMBER_DATA *m;
DIPLOMACY_DATA *d;
char info_str[1024];
char kingdom[128];
char target[128];
char diplomacy[128];
m = get_kingdom_char (ch->name);
if (m == NULL || m->rank > m->kingdom->cmd[KCMD_DECLARE])
{
send_to_char ("Huh?\n\r", ch);
return;
}
argument = one_argument (argument, kingdom);
argument = one_argument (argument, diplomacy);
if (kingdom[0] == '\0' || diplomacy[0] == '\0')
{
send_to_char
("Syntax: kdeclare <kingdom> neutral|war\n\r\n\r", ch);
// ("Syntax: kdeclare <kingdom> alliance|neutral|war\n\r\n\r", ch);
return;
}
for (d = m->kingdom->diplomacy; d != NULL; d = d->next)
if (!str_prefix (kingdom, d->kingdom->name))
break;
if (d == NULL)
{
send_to_char ("No such kingdom.\n\r\n\r", ch);
return;
}
if (d->kingdom == m->kingdom)
{
send_to_char ("Not on your own kingdom.\n\r\n\r", ch);
return;
}
sprintf (kingdom, "%s%s%s", m->kingdom->open, m->kingdom->descr,
m->kingdom->close);
sprintf (target, "%s%s%s", d->kingdom->open, d->kingdom->descr,
d->kingdom->close);
if (!str_prefix (diplomacy, "war"))
{
sprintf (info_str, "%s #Chas declared the state of %s #Con %s#C.",
kingdom, "#rWar", target);
do_info (ch, info_str);
d->diplomacy = -1;
}
else if (!str_prefix (diplomacy, "neutral"))
{
sprintf (info_str, "%s #Chas declared the state of %s #Con %s#C.",
kingdom, "#cNeutrality", target);
do_info (ch, info_str);
d->diplomacy = 0;
}
/* else if (!str_prefix (diplomacy, "alliance"))
{
sprintf (info_str, "%s #Chas declared the state of %s #Con %s#C.",
kingdom, "#7Alliance", target);
do_info (ch, info_str);
d->diplomacy = 1;
}*/
else
{
send_to_char ("That diplomatic state is not acceptable.\n\r\n\r", ch);
return;
}
do_save_kings (ch, "");
}
void do_kdiplomacy (CHAR_DATA * ch, char *argument)
{
MEMBER_DATA *m = NULL;
KINGDOM_DATA *kiter;
DIPLOMACY_DATA *diplomacy1;
DIPLOMACY_DATA *diplomacy2;
char buf[1024];
if (argument[0] == '\0' && (m = get_kingdom_char (ch->name)) == NULL)
{
send_to_char ("Please choose a kingdom.\n\r", ch);
return;
}
for (kiter = king_first; kiter != NULL; kiter = kiter->next)
{
if (argument[0] != '\0' && !str_prefix (argument, kiter->name))
break;
if (m != NULL && m->kingdom == kiter)
break;
}
if (kiter == NULL)
{
send_to_char ("That kingdom does not exist.\n\r", ch);
return;
}
sprintf (buf, "#CDiplomatic condition of #n%s%s%s#c:\n\r\n\r", kiter->open,
kiter->descr, kiter->close);
send_to_char (buf, ch);
send_to_char
(" #C+#c---------------------------------------------------------------------------#C+\n\r",
ch);
send_to_char
(" #c| #CK#7ingdom #c| #CC#7urrent #c| #CT#7his #CK#7ingdom #c| #CO#7ther #CK#7ingdom #c|\n\r",
ch);
send_to_char
(" #C+#c---------------------------------------------------------------------------#C+\n\r",
ch);
for (diplomacy1 = kiter->diplomacy; diplomacy1 != NULL;
diplomacy1 = diplomacy1->next)
{
char d1_str[32];;
char d2_str[32];;
char d3_str[32];;
int diplomacy;
char kingdom[128];
if (diplomacy1->kingdom == kiter)
continue;
for (diplomacy2 = diplomacy1->kingdom->diplomacy;
diplomacy2->kingdom != kiter; diplomacy2 = diplomacy2->next);
diplomacy = diplomacy2->diplomacy;
if (diplomacy1->diplomacy < diplomacy)
diplomacy = diplomacy1->diplomacy;
switch (diplomacy)
{
case DIPL_ALLIANCE:
sprintf (d1_str, "#7Alliance");
break;
case DIPL_NEUTRAL:
sprintf (d1_str, "#cNeutral");
break;
case DIPL_WAR:
sprintf (d1_str, "#rWar");
break;
}
put_spc (d1_str, 13, TRUE);
switch (diplomacy1->diplomacy)
{
case DIPL_ALLIANCE:
sprintf (d2_str, "#7Alliance");
break;
case DIPL_NEUTRAL:
sprintf (d2_str, "#cNeutral");
break;
case DIPL_WAR:
sprintf (d2_str, "#rWar");
break;
}
put_spc (d2_str, 13, TRUE);
switch (diplomacy2->diplomacy)
{
case DIPL_ALLIANCE:
sprintf (d3_str, "#7Alliance");
break;
case DIPL_NEUTRAL:
sprintf (d3_str, "#cNeutral");
break;
case DIPL_WAR:
sprintf (d3_str, "#rWar");
break;
}
put_spc (d3_str, 13, TRUE);
sprintf (kingdom, "%s%s%s", diplomacy1->kingdom->open,
diplomacy1->kingdom->descr, diplomacy1->kingdom->close);
put_spc (kingdom, 25, TRUE);
sprintf (buf, " #c| %s #c| %s #c| %s #c| %s #c|\n\r", kingdom, d1_str,
d2_str, d3_str);
send_to_char (buf, ch);
}
send_to_char
(" #C+#c---------------------------------------------------------------------------#C+\n\r\n\r",
ch);
}
void do_kcmdset( CHAR_DATA *ch, char* argument )
{
MEMBER_DATA *m;
KINGDOM_DATA *k;
char arg[MAX_INPUT_LENGTH];
char buf[MAX_STRING_LENGTH];
int i = 0;
if ((m = get_kingdom_char (ch->name)) == NULL || m->rank > 1 )
{
send_to_char ("Huh?\n\r", ch);
return;
}
k = m->kingdom;
argument = one_argument(argument, arg);
if( arg[0] == '\0' )
{
send_to_char ("Syntax: kcmdset [command] [rank]\n\r", ch);
send_to_char ("Rank goes from 1 to 5, being rank 1 the king.\n\r", ch);
sprintf(buf, "\n\r#wKingdom Commands:\n\r\n\r");
send_to_char(buf,ch);
for( i = 0; i < KCMD_MAX; i++ )
{
sprintf(buf, "#w%s: usable by rank%s #y%d#w%s.\n\r",
kcmd_table[i].command,
k->cmd[kcmd_table[i].pos] > 1 ? "s" : "",
k->cmd[kcmd_table[i].pos],
k->cmd[kcmd_table[i].pos] > 1 ? " and below" : "");
send_to_char(buf,ch);
}
return;
}
for( i = 0; kcmd_table[i].pos != KCMD_MAX; i++ )
{
if(str_prefix(arg, kcmd_table[i].command))
continue;
if(!is_number(argument))
{
send_to_char("Please insert a numeric rank.\n\r",ch);
return;
}
if( atoi(argument) < 0 || atoi(argument) > 5 )
{
send_to_char ("Rank goes from 1 to 5, being rank 1 the king.\n\r", ch);
return;
}
k->cmd[kcmd_table[i].pos] = atoi(argument);
send_to_char("Rank set for that command.\n\r",ch);
do_save_kings(ch,"");
return;
}
if( kcmd_table[i].pos == KCMD_MAX )
{
send_to_char("There is no such command.\n\r",ch);
return;
}
}