alanthia/area/
alanthia/gods/
alanthia/player/
/***************************************************************************
 *  File: olc_act.c                                                        *
 *                                                                         *
 *  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.                                                  *
 *                                                                         *
 *  This code was freely distributed with the The Isles 1.1 source code,   *
 *  and has been used here for OLC - OLC would not be what it is without   *
 *  all the previous coders who released their source code.                *
 *                                                                         *
 ***************************************************************************/

#if defined(macintosh)
#include <types.h>
#else
#include <sys/types.h>
#endif
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "merc.h"
#include "utils.h"
#include "olc.h"
#include "tables.h"
#include "recycle.h"
#include "lookup.h"

/*
 * Area Editor Functions.
 */
AEDIT(aedit_show)
{
    AREA_DATA *pArea;
    char buf[MAX_STRING_LENGTH];

    EDIT_AREA(ch, pArea);

    sprintf(buf, "Name:     [%5ld] %s\n\r", pArea->vnum, pArea->name);
    send_to_char(buf, ch);

#if 0				/* ROM OLC */
    sprintf(buf, "Recall:   [%5d] %s\n\r", pArea->recall,
	    get_room_index(pArea->recall)
	    ? get_room_index(pArea->recall)->name : "none");
    send_to_char(buf, ch);
#endif				/* ROM */

    sprintf(buf, "File:     %s\n\r", pArea->file_name);
    send_to_char(buf, ch);

    sprintf(buf, "Vnums:    [%ld-%ld]\n\r", pArea->min_vnum,
	    pArea->max_vnum);
    send_to_char(buf, ch);

    sprintf(buf, "Age:      [%d]\n\r", pArea->age);
    send_to_char(buf, ch);

    sprintf(buf, "Players:  [%d]\n\r", pArea->nplayer);
    send_to_char(buf, ch);

    sprintf(buf, "Security: [%d]\n\r", pArea->security);
    send_to_char(buf, ch);

    sprintf(buf, "Builders: [%s]\n\r", pArea->builders);
    send_to_char(buf, ch);

    sprintf(buf, "Credits : [%s]\n\r", pArea->credits);
    send_to_char(buf, ch);

    sprintf(buf, "Flags:    [%s]\n\r",
	    flag_string(area_flags, pArea->area_flags));
    send_to_char(buf, ch);

    return FALSE;
}



AEDIT(aedit_reset)
{
    AREA_DATA *pArea;

    EDIT_AREA(ch, pArea);

    reset_area(pArea);
    send_to_char("Area reset.\n\r", ch);

    return FALSE;
}



AEDIT(aedit_create)
{
    AREA_DATA *pArea;

    pArea = new_area();
    area_last->next = pArea;
    area_last = pArea;		/* Thanks, Walker. */
    ch->desc->pEdit = (void *) pArea;

    SET_BIT(pArea->area_flags, AREA_ADDED);
    send_to_char("Area Created.\n\r", ch);
    return FALSE;
}



AEDIT(aedit_name)
{
    AREA_DATA *pArea;

    EDIT_AREA(ch, pArea);

    if (argument[0] == '\0') {
	send_to_char("Syntax:   name [$name]\n\r", ch);
	return FALSE;
    }
    free_string(pArea->name);
    pArea->name = str_dup(argument);

    send_to_char("Name set.\n\r", ch);
    return TRUE;
}

AEDIT(aedit_credits)
{
    AREA_DATA *pArea;

    EDIT_AREA(ch, pArea);

    if (argument[0] == '\0') {
	send_to_char("Syntax:   credits [$credits]\n\r", ch);
	return FALSE;
    }
    free_string(pArea->credits);
    pArea->credits = str_dup(argument);

    send_to_char("Credits set.\n\r", ch);
    return TRUE;
}


AEDIT(aedit_file)
{
    AREA_DATA *pArea;
    char file[MAX_STRING_LENGTH];
    int length;

    EDIT_AREA(ch, pArea);

    one_argument(argument, file);	/* Forces Lowercase */

    if (argument[0] == '\0') {
	send_to_char("Syntax:  filename [$file]\n\r", ch);
	return FALSE;
    }
    /*
     * Simple Syntax Check.
     */
    length = strlen(argument);
    if (length > 8) {
	send_to_char("No more than eight characters allowed.\n\r", ch);
	return FALSE;
    }
    free_string(pArea->file_name);
    strcat(file, ".are");
    pArea->file_name = str_dup(file);

    send_to_char("Filename set.\n\r", ch);
    return TRUE;
}



AEDIT(aedit_age)
{
    AREA_DATA *pArea;
    char age[MAX_STRING_LENGTH];

    EDIT_AREA(ch, pArea);

    one_argument(argument, age);

    if (!is_number(age) || age[0] == '\0') {
	send_to_char("Syntax:  age [#xage]\n\r", ch);
	return FALSE;
    }
    pArea->age = atoi(age);

    send_to_char("Age set.\n\r", ch);
    return TRUE;
}


#if 0				/* ROM OLC */
AEDIT(aedit_recall)
{
    AREA_DATA *pArea;
    char room[MAX_STRING_LENGTH];
    int value;

    EDIT_AREA(ch, pArea);

    one_argument(argument, room);

    if (!is_number(argument) || argument[0] == '\0') {
	send_to_char("Syntax:  recall [#xrvnum]\n\r", ch);
	return FALSE;
    }
    value = atoi(room);

    if (!get_room_index(value)) {
	send_to_char("AEdit:  Room vnum does not exist.\n\r", ch);
	return FALSE;
    }
    pArea->recall = value;

    send_to_char("Recall set.\n\r", ch);
    return TRUE;
}
#endif				/* ROM OLC */


AEDIT(aedit_security)
{
    AREA_DATA *pArea;
    char sec[MAX_STRING_LENGTH];
    char buf[MAX_STRING_LENGTH];
    int value;

    EDIT_AREA(ch, pArea);

    one_argument(argument, sec);

    if (ch->pcdata->security < MAX_SECURITY) {
	send_to_char
	    ("You cannot set security without a security of 3.\n\r", ch);
	return FALSE;
    }
    if (!is_number(sec) || sec[0] == '\0') {
	send_to_char("Syntax:  security [#xlevel]\n\r", ch);
	return FALSE;
    }
    value = atoi(sec);

    if (value > ch->pcdata->security || value < 0) {
	if (ch->pcdata->security != 0) {
	    sprintf(buf, "Security is 0-%d.\n\r", ch->pcdata->security);
	    send_to_char(buf, ch);
	} else
	    send_to_char("You can't set security.\n\r", ch);
	return FALSE;
    }
    pArea->security = value;

    send_to_char("Security set.\n\r", ch);
    return TRUE;
}



AEDIT(aedit_builder)
{
    AREA_DATA *pArea;
    char name[MAX_STRING_LENGTH];
    char buf[MAX_STRING_LENGTH];

    EDIT_AREA(ch, pArea);

    one_argument(argument, name);

    if (ch->pcdata->security < MAX_SECURITY) {
	send_to_char("You must have a security of 3 to use this.\n\r", ch);
	return FALSE;
    }
    if (name[0] == '\0') {
	send_to_char("Syntax:  builder [$name]  -toggles builder\n\r", ch);
	send_to_char("Syntax:  builder All      -allows everyone\n\r", ch);
	return FALSE;
    }
    name[0] = UPPER(name[0]);

    if (!str_infix(name, pArea->builders)) {
	pArea->builders = string_replace(pArea->builders, name, "\0");
	pArea->builders = string_unpad(pArea->builders);

	if (pArea->builders[0] == '\0') {
	    free_string(pArea->builders);
	    pArea->builders = str_dup("None");
	}
	send_to_char("Builder removed.\n\r", ch);
	return TRUE;
    } else {
	buf[0] = '\0';

	if (!str_infix("None", pArea->builders)) {
	    pArea->builders =
		string_replace(pArea->builders, "None", "\0");
	    pArea->builders = string_unpad(pArea->builders);
	}
	if (pArea->builders[0] != '\0') {
	    strcat(buf, pArea->builders);
	    strcat(buf, " ");
	}
	strcat(buf, name);
	free_string(pArea->builders);
	pArea->builders = string_proper(str_dup(buf));

	send_to_char("Builder added.\n\r", ch);
	send_to_char(pArea->builders, ch);
	send_to_char("\n\r", ch);
	return TRUE;
    }

    return FALSE;
}



AEDIT(aedit_vnum)
{
    AREA_DATA *pArea;
    char lower[MAX_STRING_LENGTH];
    char upper[MAX_STRING_LENGTH];
    int ilower;
    int iupper;

    EDIT_AREA(ch, pArea);

    if (!IS_NPC(ch) && ch->pcdata->security < MAX_SECURITY) {
	send_to_char("You must have a security of 3 to change vnums.\n\r",
		     ch);
	return FALSE;
    }
    argument = one_argument(argument, lower);
    one_argument(argument, upper);

    if (!is_number(lower) || lower[0] == '\0'
	|| !is_number(upper) || upper[0] == '\0') {
	send_to_char("Syntax:  vnum [#xlower] [#xupper]\n\r", ch);
	return FALSE;
    }
    if ((ilower = atoi(lower)) > (iupper = atoi(upper))) {
	send_to_char("AEdit:  Upper must be larger then lower.\n\r", ch);
	return FALSE;
    }
    if (!check_range(atoi(lower), atoi(upper))) {
	send_to_char("AEdit:  Range must include only this area.\n\r", ch);
	return FALSE;
    }
    if (atoi(lower) <= 0 || atoi(upper) <= 0
	|| atoi(lower) >= 30000 || atoi(upper) >= 30000) {
	send_to_char("AEdit: Nice try!\n\r", ch);
	return FALSE;
    }
    if (get_vnum_area(ilower)
	&& get_vnum_area(ilower) != pArea) {
	send_to_char("AEdit:  Lower vnum already assigned.\n\r", ch);
	return FALSE;
    }
    pArea->min_vnum = ilower;
    send_to_char("Lower vnum set.\n\r", ch);

    if (get_vnum_area(iupper)
	&& get_vnum_area(iupper) != pArea) {
	send_to_char("AEdit:  Upper vnum already assigned.\n\r", ch);
	return TRUE;		/* The lower value has been set. */
    }
    pArea->max_vnum = iupper;
    send_to_char("Upper vnum set.\n\r", ch);

    return TRUE;
}



AEDIT(aedit_lvnum)
{
    AREA_DATA *pArea;
    char lower[MAX_STRING_LENGTH];
    int ilower;
    int iupper;

    EDIT_AREA(ch, pArea);

    one_argument(argument, lower);

    if (!is_number(lower) || lower[0] == '\0') {
	send_to_char("Syntax:  min_vnum [#xlower]\n\r", ch);
	return FALSE;
    }
    if ((ilower = atoi(lower)) > (iupper = pArea->max_vnum)) {
	send_to_char("AEdit:  Value must be less than the max_vnum.\n\r",
		     ch);
	return FALSE;
    }
    if (!check_range(ilower, iupper)) {
	send_to_char("AEdit:  Range must include only this area.\n\r", ch);
	return FALSE;
    }
    if (get_vnum_area(ilower)
	&& get_vnum_area(ilower) != pArea) {
	send_to_char("AEdit:  Lower vnum already assigned.\n\r", ch);
	return FALSE;
    }
    pArea->min_vnum = ilower;
    send_to_char("Lower vnum set.\n\r", ch);
    return TRUE;
}



AEDIT(aedit_uvnum)
{
    AREA_DATA *pArea;
    char upper[MAX_STRING_LENGTH];
    int ilower;
    int iupper;

    EDIT_AREA(ch, pArea);

    one_argument(argument, upper);

    if (!is_number(upper) || upper[0] == '\0') {
	send_to_char("Syntax:  max_vnum [#xupper]\n\r", ch);
	return FALSE;
    }
    if ((ilower = pArea->min_vnum) > (iupper = atoi(upper))) {
	send_to_char("AEdit:  Upper must be larger then lower.\n\r", ch);
	return FALSE;
    }
    if (!check_range(ilower, iupper)) {
	send_to_char("AEdit:  Range must include only this area.\n\r", ch);
	return FALSE;
    }
    if (get_vnum_area(iupper)
	&& get_vnum_area(iupper) != pArea) {
	send_to_char("AEdit:  Upper vnum already assigned.\n\r", ch);
	return FALSE;
    }
    pArea->max_vnum = iupper;
    send_to_char("Upper vnum set.\n\r", ch);

    return TRUE;
}