#include <sys/types.h>
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "emlen.h"
#ifdef WINDOWS
void bzero(char *spot, int len) {
while (len>0) {*spot='\0'; len--; spot++;}
return;
}
void dostuff(int sk) {return;}
#endif
void do_repop (CHAR_DATA * ch, char *argy)
{
AREA_DATA *a;
char buf[STD_LENGTH];
DEFINE_COMMAND ("repop", do_repop, POSITION_DEAD, MAX_LEVEL, LOG_NORMAL, "Shows you the state of zone repops.")
hugebuf_o[0] = '\0';
for (a = area_first; a != NULL; a = a->next)
{
sprintf (buf, "[%3d] %-30s \x1B[1;37m%3d\x1B[37;0m/\x1B[1;37m%-3d\x1B[37;0m\n\r",
a->vnum, a->name, a->repop_counter, a->repop_rate);
strcat (hugebuf_o, buf);
}
page_to_char (hugebuf_o, ch);
return;
}
/* ------------------------------------------------------------------------ */
/* This function adds extra 'commands' to the user when in the area editor,
aedit. It is called from comm.c if the user is in the area editor. */
/* ------------------------------------------------------------------------ */
void aedit (CHAR_DATA * ch, char *argy)
{
AREA_DATA *pArea;
char arg[STD_LENGTH];
char arg1[STD_LENGTH];
char arg2[STD_LENGTH];
char buf[STD_LENGTH];
int value;
pArea = (AREA_DATA *) ch->desc->pEdit;
strcpy (arg, argy);
smash_tilde (argy);
argy = one_argy (argy, arg1);
strcpy (arg2, argy);
/* pArea is the area being edited, arg is the full argument typed,
arg1 is the first argument, arg2 is the second argument */
if (!IS_BUILDER (ch, pArea))
{
send_to_char ("You are not a builder in this area!\n\r", ch);
}
if (!str_cmp (arg1, "show") || arg_count (arg) == 0)
{
sprintf (buf, "%d", pArea->vnum);
do_astat (ch, buf);
return;
}
/* ---------------------------------------------------------------------------- */
/* Exit the area editor, set the user's connected state back to PLAYING */
/* ---------------------------------------------------------------------------- */
if (!str_cmp (arg1, "done"))
{
ch->desc->pEdit = NULL;
ch->desc->connected = CON_PLAYING;
return;
}
if (!str_cmp (arg1, "?"))
{
do_help (ch, "aedit");
return;
}
/* ------------------------------------------------------------------------ */
/* If the user isn't a builder, just interpret his/her command as if he/she
was not in area editor. */
/* ------------------------------------------------------------------------ */
if (!IS_BUILDER (ch, pArea))
{
interpret (ch, arg);
return;
}
/* ---------------------------------------------------------------------------- */
/* CAN_QUIT toggles between 3 quit rules for this area: quit allowed if inside,
quit anywhere, or cannot quit. */
/* ---------------------------------------------------------------------------- */
if (!str_cmp (arg1, "can_quit"))
{
if (pArea->can_quit == 2)
{
send_to_char ("This area is now a normal quit zone.\n\r", ch);
pArea->can_quit = 0;
}
else if (pArea->can_quit == 0)
{
send_to_char ("Players may now quit anywhere in this area.\n\r", ch);
pArea->can_quit = 1;
}
else if (pArea->can_quit == 1)
{
send_to_char ("Players may now NOT quit anywhere in this zone.\n\r", ch);
pArea->can_quit = 2;
}
SET_BIT (pArea->area_flags, AREA_CHANGED);
return;
}
/* ---------------------------------------------------------- */
/* Homelands do not have the pkill groupsize limits.......... */
/* ---------------------------------------------------------- */
if (!str_cmp(arg1, "homeland"))
{
if (pArea->homeland)
{
send_to_char("This area is no longer a homeland!\n\r", ch);
pArea->homeland = FALSE;
}
else
{
send_to_char("This area is now a homeland with no limits on the sizes of pkill groups that can get exp in there!\n\r", ch);
pArea->homeland = TRUE;;
}
SET_BIT(pArea->area_flags, AREA_CHANGED);
return;
}
/* ---------------------------------------------------------- */
/* Rate sets the repop rate, in hours, for this current zone. */
/* ---------------------------------------------------------- */
if (!str_cmp (arg1, "rate") && is_number (arg2))
{
int i;
i = atoi (arg2);
pArea->repop_rate = i;
if (pArea->repop_counter > pArea->repop_rate)
pArea->repop_counter = pArea->repop_rate;
send_to_char ("Area repop rate set.\n\r", ch);
SET_BIT (pArea->area_flags, AREA_CHANGED);
return;
}
/* ------------------------------------------------------------------------ */
/* Open the area to mortals. Must be defined in IS_REAL_GOD for permission */
/* ------------------------------------------------------------------------ */
if (!str_cmp (arg1, "open"))
{
if (!IS_REAL_GOD (ch))
return;
send_to_char ("This area is now open to mortals!\n\r", ch);
pArea->open = TRUE;
SET_BIT (pArea->area_flags, AREA_CHANGED);
return;
}
/* ------------------------------------------------------------------------- */
/* Close the area to mortals. Must be defined in IS_REAL_GOD for permission */
/* ------------------------------------------------------------------------- */
if (!str_cmp (arg1, "closed"))
{
if (!IS_REAL_GOD (ch))
return;
send_to_char ("This area is now closed to mortals!\n\r", ch);
pArea->open = FALSE;
SET_BIT (pArea->area_flags, AREA_CHANGED);
return;
}
/* -------------------------------------------------------------- */
/* Check for area flags. If command was an area flag, toggle it. */
/* -------------------------------------------------------------- */
if ((value = get_area_flags_number (arg1)) != AREA_NONE)
{
pArea->area_flags ^= value;
send_to_char ("Flag toggled.\n\r", ch);
return;
}
/* -------------------------------------------------------------------------- */
/* Create a new area, and enter the area editor using it as the current area. */
/* -------------------------------------------------------------------------- */
if ((!str_cmp (arg1, "create")) && (LEVEL (ch) == MAX_LEVEL))
{
pArea = new_area ();
top_area++;
area_sort (pArea);
ch->desc->pEdit = (void *) pArea;
send_to_char ("Area Created.\n\r", ch);
save_area_list ();
return;
}
/* ------------------- */
/* Set the area's name */
/* ------------------- */
if (!str_cmp (arg1, "name"))
{
if (arg2[0] == '\0')
{
send_to_char ("Syntax: name <name>\n\r", ch);
return;
}
free_string (pArea->name);
pArea->name = str_dup (arg2);
SET_BIT (pArea->area_flags, AREA_CHANGED);
send_to_char ("Name set.\n\r", ch);
return;
}
/* ----------------------- */
/* Set the area's filename */
/* ----------------------- */
if (!str_cmp (arg1, "filename") || !str_cmp (arg1, "file"))
{
if (argy[0] == '\0')
{
send_to_char ("Syntax: filename <file>\n\r", ch);
return;
}
free_string (pArea->filename);
pArea->filename = str_dup (arg2);
SET_BIT (pArea->area_flags, AREA_CHANGED);
send_to_char ("Filename set.\n\r", ch);
save_area_list ();
return;
}
/* ------------------------------------------------------------------- */
/* Toggles if this area is a clanhouse zone. Currently has no effect. */
/* ------------------------------------------------------------------- */
if (!str_cmp (arg1, "clanzone"))
{
if (pArea->clanzone)
{
pArea->open = 0;
send_to_char ("This area is no longer a CLAN ZONE.\n\r", ch);
pArea->clanzone = FALSE;
SET_BIT (pArea->area_flags, AREA_CHANGED);
return;
}
if (!pArea->clanzone)
{
if (pArea->open == 0)
pArea->open = 1;
send_to_char ("This area is now a designated CLAN ZONE.\n\r", ch);
pArea->clanzone = TRUE;
SET_BIT (pArea->area_flags, AREA_CHANGED);
return;
}
}
/* ---------------------------------------------------------- */
/* Set the repop string, shown to users when the zone resets. */
/* ---------------------------------------------------------- */
if (!str_cmp (arg1, "repop"))
{
string_append (ch, &pArea->repop);
SET_BIT (pArea->area_flags, AREA_CHANGED);
return;
}
/* -------------------------------------------------- */
/* Set the area's security level. Currently useless. */
/* -------------------------------------------------- */
if (!str_cmp (arg1, "security"))
{
if (!is_number (arg2) || arg2[0] == '\0')
{
send_to_char ("Syntax: security <level>\n\r", ch);
return;
}
value = atoi (arg2);
pArea->security = value;
SET_BIT (pArea->area_flags, AREA_CHANGED);
send_to_char ("Security set.\n\r", ch);
return;
}
/* ---------------------------------------------------------------------------- */
/* Adds or removes builders who have access to this area from the builder list. */
/* ---------------------------------------------------------------------------- */
if (!str_cmp (arg1, "builder"))
{
argy = one_argy (argy, arg2);
if (arg2[0] == '\0')
{
send_to_char ("Syntax: builder <name toggle>\n\r", ch);
return;
}
arg2[0] = UPPER (arg2[0]);
if (strstr (pArea->builders, arg2) != NULL)
{
pArea->builders = string_replace (pArea->builders, arg2, "\0");
pArea->builders = string_unpad (pArea->builders);
SET_BIT (pArea->area_flags, AREA_CHANGED);
send_to_char ("Builder removed.\n\r", ch);
return;
}
else
{
buf[0] = '\0';
if (pArea->builders[0] != '\0')
{
strcat (buf, pArea->builders);
strcat (buf, " ");
}
strcat (buf, arg2);
free_string (pArea->builders);
pArea->builders = string_proper (str_dup (buf));
SET_BIT (pArea->area_flags, AREA_CHANGED);
send_to_char ("Builder added.\n\r", ch);
return;
}
}
/* ------------------------------------------------------------------- */
/* Sets the vnum range of the area. Syntax is 'vnum <lower> <upper>'. */
/* ------------------------------------------------------------------- */
if (!str_cmp (arg1, "vnum"))
{
argy = one_argy (argy, arg1);
strcpy (arg2, argy);
if (!is_number (arg1) || arg1[0] == '\0'
|| !is_number (arg2) || arg2[0] == '\0')
{
send_to_char ("Syntax: vnum <lower> <upper>\n\r", ch);
return;
}
value = atoi (arg1);
if (get_vnum_area (value) != NULL
&& get_vnum_area (value) != pArea)
{
send_to_char ("Lower vnum already assigned.\n\r", ch);
return;
}
pArea->lvnum = value;
send_to_char ("Lower vnum set.\n\r", ch);
value = atoi (arg2);
if (get_vnum_area (value) != NULL
&& get_vnum_area (value) != pArea)
{
send_to_char ("Upper vnum already assigned.\n\r", ch);
return;
}
pArea->uvnum = value;
send_to_char ("Upper vnum set.\n\r", ch);
SET_BIT (pArea->area_flags, AREA_CHANGED);
return;
}
/* -------------------------------------------------------------------- */
/* If none of the other commands were recognized, interpret the command
as if it was typed while playing the game */
/* -------------------------------------------------------------------- */
interpret (ch, arg);
return;
}
/* ------------------ */
/* The social editor. */
/* ------------------ */
void
soc_edit (CHAR_DATA * ch, char *argy)
{
SOCIAL *s;
char arg[STD_LENGTH];
char arg1[STD_LENGTH];
char arg2[STD_LENGTH];
s = (SOCIAL *) ch->desc->pEdit;
strcpy (arg, argy);
smash_tilde (argy);
argy = one_argy (argy, arg1);
strcpy (arg2, argy);
if (!str_cmp (arg1, "show") || arg_count (arg) == 0)
{
show_social (s, ch);
return;
}
if (!str_cmp (arg1, "done"))
{
ch->desc->pEdit = NULL;
ch->desc->connected = CON_PLAYING;
social_update_hash ();
save_new_socials ();
return;
}
if (!str_cmp (arg1, "create"))
{
social_update_hash ();
s = new_social ();
strcpy (s->name, "none");
ch->desc->pEdit = s;
send_to_char ("Social created.\n\r", ch);
return;
}
/* ---------------------------------------------------------------------- */
/* Social's name. Corresponds to what people type to trigger this social */
/* ---------------------------------------------------------------------- */
if (!str_cmp (arg1, "name"))
{
if (strlen (arg2) < 20)
{
send_to_char ("Name set.\n\r", ch);
strcpy (s->name, arg2);
}
return;
}
/* -------------------------------------------------------------- */
/* What is displayed to the character when no arguments are used. */
/* -------------------------------------------------------------- */
if (!str_cmp (arg1, "to_char"))
{
if (arg2[0] == '\0')
{
free_string (s->char_no_arg);
s->char_no_arg = NULL;
send_to_char ("Field cleared.\n\r", ch);
return;
}
free_string (s->char_no_arg);
s->char_no_arg = str_dup (arg2);
send_to_char ("Field set.\n\r", ch);
return;
}
/* -------------------------------------------------------------- */
/* What is displayed to others in the room when no args are used. */
/* -------------------------------------------------------------- */
if (!str_cmp (arg1, "to_others"))
{
if (arg2[0] == '\0')
{
free_string (s->others_no_arg);
s->others_no_arg = NULL;
send_to_char ("Field cleared.\n\r", ch);
return;
}
free_string (s->others_no_arg);
s->others_no_arg = str_dup (arg2);
send_to_char ("Field set.\n\r", ch);
return;
}
/* ----------------------------------------------------------------- */
/* If another character is specified, this is shown to the character
performing the social. */
/* ----------------------------------------------------------------- */
if (!str_cmp (arg1, "char_found"))
{
if (arg2[0] == '\0')
{
free_string (s->char_found);
s->char_found = NULL;
send_to_char ("Field cleared.\n\r", ch);
return;
}
free_string (s->char_found);
s->char_found = str_dup (arg2);
send_to_char ("Field set.\n\r", ch);
return;
}
/* --------------------------------------------------------------------- */
/* This is shown to others if a character performs the social on another
character. */
/* --------------------------------------------------------------------- */
if (!str_cmp (arg1, "others"))
{
if (arg2[0] == '\0')
{
free_string (s->others_found);
s->others_found = NULL;
send_to_char ("Field cleared.\n\r", ch);
return;
}
free_string (s->others_found);
s->others_found = str_dup (arg2);
send_to_char ("Field set.\n\r", ch);
return;
}
/* ------------------------------------------------------------ */
/* This is shown to the 'target' of the social, when specified. */
/* ------------------------------------------------------------ */
if (!str_cmp (arg1, "to_vict"))
{
if (arg2[0] == '\0')
{
free_string (s->vict_found);
s->vict_found = NULL;
send_to_char ("Field cleared.\n\r", ch);
return;
}
free_string (s->vict_found);
s->vict_found = str_dup (arg2);
send_to_char ("Field set.\n\r", ch);
return;
}
/* ----------------------------------------------------------------------- */
/* Displayed when person specifies a target for the social but that target
is not found. */
/* ----------------------------------------------------------------------- */
if (!str_cmp (arg1, "char_not"))
{
if (arg2[0] == '\0')
{
free_string (s->char_not_found);
s->char_not_found = NULL;
send_to_char ("Field cleared.\n\r", ch);
return;
}
free_string (s->char_not_found);
s->char_not_found = str_dup (arg2);
send_to_char ("Field set.\n\r", ch);
return;
}
/* ---------------------------------------------- */
/* Shown to character if performed on him/herself */
/* ---------------------------------------------- */
if (!str_cmp (arg1, "char_self"))
{
if (arg2[0] == '\0')
{
free_string (s->char_auto);
s->char_auto = NULL;
send_to_char ("Field cleared.\n\r", ch);
return;
}
free_string (s->char_auto);
s->char_auto = str_dup (arg2);
send_to_char ("Field set.\n\r", ch);
return;
}
/* ------------------------------------------------------------------------------ */
/* Shown to others in the room when character performs the social on him/herself. */
/* ------------------------------------------------------------------------------ */
if (!str_cmp (arg1, "others_self"))
{
if (arg2[0] == '\0')
{
free_string (s->others_auto);
s->others_auto = NULL;
send_to_char ("Field cleared.\n\r", ch);
return;
}
free_string (s->others_auto);
s->others_auto = str_dup (arg2);
send_to_char ("Field set.\n\r", ch);
return;
}
/* --------------------------------------------------------------------- */
/* Command not a social editor command, interpret as if playing the game */
/* --------------------------------------------------------------------- */
interpret (ch, arg);
return;
}