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