#include <stdio.h> #include "structs.h" #include "interpreter.h" #include "comm.h" #include "utils.h" #include "db.h" #include <ctype.h> #include <stdlib.h> extern struct obj_data *obj_proto; extern struct room_data *world; extern int top_of_zone_table; extern struct zone_data *zone_table; /* * the redit ACMD function */ ACMD (do_redit) { int number; int room_num; struct descriptor_data *d; char arg1[MAX_INPUT_LENGTH]; struct room_data *room; int counter, found = 0; one_argument (argument, arg1); if (!arg1) { send_to_char ("Specify a room number to edit.\r\n", ch); return; } if (!isdigit (*arg1)) { send_to_char ("Please supply a valid number.\r\n", ch); return; } number = atoi (arg1); room_num = real_room (number); for (counter = 0; counter <= top_of_zone_table; counter++) { if ((number >= (zone_table[counter].number * 100)) && (number <= (zone_table[counter].top))) { ch->desc->edit_zone = counter; found = 1; break; } } if (!found) { send_to_char ("Sorry, that number is not part of any zone!\r\n", ch); return; } SET_BIT (PLR_FLAGS (ch), PLR_EDITING); d = ch->desc; STATE (d) = CON_REDIT; d->edit_number = number; if (room_num >= 0) { send_to_char ("A room already exists at that number. Do you wish to edit it?\r\n", ch); CREATE (room, struct room_data, 1); *room = world[room_num]; /* allocate space for all strings */ if (world[room_num].name) room->name = str_dup (world[room_num].name); if (world[room_num].description) room->description = str_dup (world[room_num].description); /* exits - alloc only if necessary */ for (counter = 0; counter < NUM_OF_DIRS; counter++) { if (world[room_num].dir_option[counter]) { CREATE(room->dir_option[counter], struct room_direction_data, 1); /* copy numbers over */ *room->dir_option[counter] = *world[room_num].dir_option[counter]; /* malloc strings */ if (world[room_num].dir_option[counter]->general_description) room->dir_option[counter]->general_description = str_dup(world[room_num].dir_option[counter]->general_description); if (world[room_num].dir_option[counter]->keyword) room->dir_option[counter]->keyword = str_dup(world[room_num].dir_option[counter]->keyword); } } if (world[room_num].ex_description) { struct extra_descr_data *this, *temp, *temp2; CREATE (temp, struct extra_descr_data, 1); room->ex_description = temp; for (this = world[room_num].ex_description; this; this = this->next) { if (this->keyword) temp->keyword = str_dup (this->keyword); if (this->description) temp->description = str_dup (this->description); if (this->next) { CREATE (temp2, struct extra_descr_data, 1); temp->next = temp2; temp = temp2; } else temp->next = NULL; } } d->edit_room = room; d->edit_mode = REDIT_CONFIRM_EDIT; return; } else { send_to_char ("That room does not exist, create it?\r\n", ch); /* * create dummy room */ CREATE(d->edit_room, struct room_data, 1); d->edit_room->name = str_dup("An unfinished room"); d->edit_room->description = str_dup("You are in an unfinished room.\r\n"); d->edit_mode = REDIT_CONFIRM_EDIT; return; } } /* * the iedit ACMD function */ ACMD (do_iedit) { int number; int obj_num; struct descriptor_data *d; char arg1[MAX_INPUT_LENGTH]; struct obj_data *obj; int counter, found = 0; one_argument (argument, arg1); /* * if no argument */ if (!arg1) { send_to_char ("Specify an object number to edit.\r\n", ch); return; } /* * is argument a number? */ if (!isdigit (*arg1)) { send_to_char ("Please supply a valid number.\r\n", ch); return; } /* * check if number already exists */ number = atoi (arg1); obj_num = real_object (number); /* * check zone numbers */ for (counter = 0; counter <= top_of_zone_table; counter++) { if ((number >= (zone_table[counter].number * 100)) && (number <= (zone_table[counter].top))) { ch->desc->edit_zone = counter; found = 1; break; } } if (!found) { send_to_char ("Sorry, that number is not part of any zone.\r\n", ch); return; } /* * put guy into editing mode */ SET_BIT (PLR_FLAGS (ch), PLR_EDITING); /* * now start playing with the descriptor */ d = ch->desc; STATE (d) = CON_IEDIT; d->edit_number = number; /* * the VNUM not the REAL NUMBER */ if (obj_num >= 0) { struct extra_descr_data *this, *temp, *temp2; send_to_char ("An object already exists at that number. Do you wish to edit it?\r\n", ch); /* * allocate object */ CREATE (obj, struct obj_data, 1); clear_object (obj); *obj = obj_proto[obj_num]; /* * the RNUM */ /* * copy all strings over */ if (obj_proto[obj_num].name) obj->name = str_dup (obj_proto[obj_num].name); if (obj_proto[obj_num].short_description) obj->short_description = str_dup (obj_proto[obj_num].short_description); if (obj_proto[obj_num].description) obj->description = str_dup (obj_proto[obj_num].description); if (obj_proto[obj_num].action_description) obj->action_description = str_dup (obj_proto[obj_num].description); if (obj_proto[obj_num].ex_description) { /* * temp is for obj being edited */ CREATE (temp, struct extra_descr_data, 1); obj->ex_description = temp; for (this = obj_proto[obj_num].ex_description; this; this = this->next) { if (this->keyword) temp->keyword = str_dup (this->keyword); if (this->description) temp->description = str_dup (this->description); if (this->next) { CREATE (temp2, struct extra_descr_data, 1); temp->next = temp2; temp = temp2; } else temp->next = NULL; } } d->edit_obj = obj; d->edit_mode = IEDIT_CONFIRM_EDIT; return; } else { send_to_char ("That object does not exist, create it?\r\n", ch); /* * create dummy object! */ CREATE (d->edit_obj, struct obj_data, 1); clear_object (d->edit_obj); d->edit_obj->name = str_dup ("unfinished object"); d->edit_obj->description = str_dup ("An unfinished object is lying here."); d->edit_obj->short_description = str_dup ("an unfinished object"); GET_OBJ_WEAR (d->edit_obj) = ITEM_WEAR_TAKE; d->edit_mode = IEDIT_CONFIRM_EDIT; return; } }