/*
* locations.c
*
* an attempt to have locations within the mud
*/
#include <sys/types.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <stdio.h>
#include <time.h>
#include <dirent.h>
#include <unistd.h>
/* include main header file */
#include "mud.h"
AREA_DATA *area_first;
void startup_areas()
{
log_string("*** AREAS *** Areas");
load_areas();
}
/*
* load_areas()
*
* load areas into the game
*/
void load_areas()
{
FILE *fp;
AREA_DATA *p;
char *name;
area_first = NULL;
fp = fopen (AREA_FILE, "r");
/* No Areas, no file */
if (!fp)
return;
name = strdup(fread_word(fp));
/* until end_marker is reached */
while (!compares(name, END_MARKER))
{
{
/* add new area */
p = malloc(sizeof(AREA_DATA));
p->name = strdup(name);
p->desc = fread_string(fp);
p->x = fread_number(fp);
p->y = fread_number(fp);
p->z = fread_number(fp);
p->x_size = fread_number(fp);
p->y_size = fread_number(fp);
p->next = area_first;
area_first = p;
/*log_string("Added area: %s", p->desc); */
}
name = strdup(fread_word(fp));
}
fclose (fp);
}
/*
* save_areas()
*
* saves all current locations
*/
void save_areas()
{
FILE *fp;
AREA_DATA *p;
if (!area_first)
{
unlink (AREA_FILE);
return;
}
fp = fopen (AREA_FILE, "w");
if (!fp)
{
bug ("Could not open " AREA_FILE " for writing",0);
return;
}
for (p = area_first; p ; p = p->next)
fprintf (fp, "%s\n%s~\n%d %d %d %d %d\n", p->name, p->desc, p->x, p->y, p->z, p->x_size, p->y_size);
fprintf (fp, "%s\n",END_MARKER);
fclose (fp);
}
void cmd_add_area (D_M * ch, char *arg)
{
char arg1[MAX_BUFFER];
char arg2[MAX_BUFFER];
char arg3[MAX_BUFFER];
char buf[MAX_BUFFER];
AREA_DATA *p;
arg = one_arg(arg, arg1);
arg = one_arg(arg, arg2);
arg = one_arg(arg, arg3);
if (arg1[0] == '\0' || arg2[0] == '\0' || arg3[0] == '\0')
{
stc("Syntax: addarea <name> <xsize> <ysize>\n\r", ch);
if (!area_first)
{
stc("There are no areas yet!\n\r", ch);
return;
}
stc(" ----------------- Current Areas -----------\n\r", ch);
stc(" Name Description X/Size Y/Size Z Plane\n\r", ch);
stc(" --------------------- -------------------- ------ ----- ---------\n\r", ch);
for (p = area_first; p; p = p->next)
{
sprintf (buf, " %-25s %-25s %-3d/%-3d %-3d/%-3d %-3d\n", p->name, p->desc, p->x, p->x_size, p->y, p->y_size, p->z);
stc (buf,ch);
}
return;
}
p = malloc (sizeof(AREA_DATA));
p->name = strdup(arg1);
p->desc = strdup(arg1);
p->x = ch->x;
p->y = ch->y;
p->z = ch->z;
p->x_size = atoi(arg2);
p->y_size = atoi(arg3);
p->next = area_first;
area_first = p;
stc("Area added\n\r", ch);
save_areas();
}
/*
* cmd_where()
*
* Displays Location you are currently in.
* Cycles through the area list to see
* if ch is in the area, if so, display
* it.
*/
void cmd_where (D_M * ch, char *arg)
{
char buf[MAX_BUFFER];
AREA_DATA *p;
bool found = FALSE;
return;
if (!area_first)
{
stc("No areas!\n\r", ch);
return;
}
for (p = area_first; p; p = p->next)
{
if ((ch->x >= (p->x) && (ch->x <= (p->x + p->x_size))) &&
(ch->y >= (p->y) && (ch->y <= (p->y + p->y_size)))
&& ch->z == p->z)
{
sprintf(buf, "You are at %s\n\r", p->desc);
stc(buf, ch);
found = TRUE;
}
}
if (found == FALSE)
{
stc("You are not in an area\n\r", ch);
}
}
/*
* return_area()
*
* Returns AREA_DATA of current
* location.
*/
AREA_DATA * return_area(D_M * ch)
{
AREA_DATA *p = NULL;
if (!area_first)
{
return NULL;
}
for (p = area_first; p; p = p->next)
{
if ((ch->x >= (p->x) && (ch->x <= (p->x + p->x_size))) &&
(ch->y >= (p->y) && (ch->y <= (p->y + p->y_size)))
&& ch->z == p->z)
{
return p;
}
}
return NULL;
}