/*
 * 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;
}