#include <sys/types.h> #include <stdio.h> #include <string.h> #include <time.h> #include "mud.h" PLANE_DATA *first_plane, *last_plane; void do_plist(CHAR_DATA *ch, char *argument) { PLANE_DATA *p; send_to_char("Planes:\n\r-------\n\r", ch); for (p = first_plane; p; p = p->next) ch_printf(ch, "%s\n\r", p->name); return; } void do_pstat(CHAR_DATA *ch, char *argument) { PLANE_DATA *p; char arg[MAX_INPUT_LENGTH]; argument = one_argument(argument, arg); if (!(p = plane_lookup(arg))) { send_to_char("Stat which plane?\n\r", ch); return; } ch_printf(ch, "Name: %s\n\r", p->name); return; } void do_pset(CHAR_DATA *ch, char *argument) { PLANE_DATA *p; char arg[MAX_INPUT_LENGTH]; char mod[MAX_INPUT_LENGTH]; argument = one_argument(argument, arg); if (!*arg) { send_to_char("Syntax: pset <plane> create\n\r", ch); send_to_char(" pset save\n\r", ch); send_to_char(" pset <plane> delete\n\r", ch); send_to_char(" pset <plane> <field> <value>\n\r", ch); send_to_char("\n\r", ch); send_to_char(" Where <field> is one of:\n\r", ch); send_to_char(" name\n\r", ch); return; } if (!str_cmp(arg, "save")) { save_planes(); send_to_char("Planes saved.\n\r", ch); return; } argument = one_argument(argument, mod); p = plane_lookup(arg); if (!str_prefix(mod, "create")) { if (p) { send_to_char("Plane already exists.\n\r", ch); return; } CREATE(p, PLANE_DATA, 1); p->name = STRALLOC(arg); LINK(p, first_plane, last_plane, next, prev); send_to_char("Plane created.\n\r", ch); return; } if (!p) { send_to_char("Plane doesn't exist.\n\r", ch); return; } if (!str_prefix(mod, "delete")) { UNLINK(p, first_plane, last_plane, next, prev); STRFREE(p->name); DISPOSE(p); check_planes(p); send_to_char("Plane deleted.\n\r", ch); return; } if (!str_prefix(mod, "name")) { if (plane_lookup(argument)) { send_to_char("Another plane has that name.\n\r", ch); return; } STRFREE(p->name); p->name = STRALLOC(argument); send_to_char("Name changed.\n\r", ch); return; } do_pset(ch, ""); return; } PLANE_DATA *plane_lookup(const char *name) { PLANE_DATA *p; for (p = first_plane; p; p = p->next) if (!str_cmp(name, p->name)) return p; for (p = first_plane; p; p = p->next) if (!str_prefix(name, p->name)) return p; return NULL; } void save_planes(void) { FILE *fp; PLANE_DATA *p; fclose(fpReserve); if (!(fp = fopen(PLANE_FILE, "w"))) { perror(PLANE_FILE); bug("save_planes: can't open plane file"); fpReserve = fopen(NULL_FILE, "r"); return; } for (p = first_plane; p; p = p->next) { fprintf(fp, "#PLANE\n"); fprintf(fp, "Name %s\n", p->name); fprintf(fp, "End\n\n"); } fprintf(fp, "#END\n"); fclose(fp); fpReserve = fopen(NULL_FILE, "r"); return; } #ifdef KEY #undef KEY #endif #define KEY( literal, field, value ) \ if ( !strcmp( word, literal ) ) \ { \ field = value; \ fMatch = TRUE; \ break; \ } void read_plane(FILE *fp) { PLANE_DATA *p; char *word; bool fMatch; CREATE(p, PLANE_DATA, 1); for (;;) { word = (feof(fp) ? "End" : fread_word(fp)); fMatch = FALSE; switch(UPPER(*word)) { case 'E': if (!str_cmp(word, "End")) { if (plane_lookup(p->name)) { bug("read_plane: duplicate plane name!"); STRFREE(p->name); DISPOSE(p); } else LINK(p, first_plane, last_plane, next, prev); return; } break; case 'N': KEY("Name", p->name, fread_string(fp)); break; } if (!fMatch) { bug("read_plane: unknown field '%s'", word); fread_to_eol(fp); } } return; } void load_planes(void) { extern FILE *fpArea; extern char strArea[]; char *word; if (!(fpArea = fopen(PLANE_FILE, "r"))) { perror(PLANE_FILE); bug("load_planes: can't open plane file for read."); return; } strcpy(strArea, PLANE_FILE); for (;!feof(fpArea);) { if (fread_letter(fpArea) != '#') { bug("load_planes: # not found."); break; } word = fread_word(fpArea); if (!str_cmp(word, "END")) break; else if (!str_cmp(word, "PLANE")) read_plane(fpArea); else { bug("load_planes: invalid section '%s'.", word); break; } } fclose(fpArea); fpArea = NULL; strcpy(strArea, "$"); return; } void build_prime_plane(void) { PLANE_DATA *p; CREATE(p, PLANE_DATA, 1); memset(p, 0, sizeof(*p)); p->name = STRALLOC("Prime Material"); LINK(p, first_plane, last_plane, next, prev); return; } void check_planes(PLANE_DATA *p) { extern ROOM_INDEX_DATA *room_index_hash[]; int vnum; ROOM_INDEX_DATA *r; if (!first_plane) build_prime_plane(); for (vnum = 0; vnum < MAX_KEY_HASH; ++vnum) for (r = room_index_hash[vnum]; r; r = r->next) if (!r->plane || r->plane == p) r->plane = first_plane; return; }