#include <sys/types.h> #include <ctype.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #include "mud.h" char *check_obj_name(char *nm, CHAR_DATA *ch) { char *t=nm; nm[0]=LOWER(nm[0]); if (UPPER(*t)=='A' && *(t+1)==' ') { send_to_char("\x1b[1;31mWARNING!!!!\x1b[0;37m Name field should only contain keywords.\n\r", ch); return nm; } for (t=nm; *t!='\0'; t++) { if (*t==' ' && *(t+1)!='\0' && *(t+1)=='a' && *(t+2)==' ') { send_to_char("\x1b[1;31mWARNING!!!!\x1b[0;37m Name field should only contain keywords.\n\r", ch); return nm; } } return nm; } char *check_obj_short(char *nm,CHAR_DATA *ch) { if (nm[0]=='\0') return nm; if (strlen(nm) > 38) { send_to_char("\x1b[1;31mWARNING!!!!\x1b[0;37m You should keep the short description below 38 characters (with color codes).\n\r", ch); return nm; } return nm; } char *check_obj_long(char *nm, CHAR_DATA *ch) { char *t; if (nm[0]=='\0') return nm; nm[0]=UPPER(nm[0]); for (t = nm; *(t+3) != '\0'; t++) {}; if (*t != '.' && *t != '!') { send_to_char("\x1b[1;31mWARNING!!!!\x1b[0;37m The Long description must be a sentence ending with punctuation.\n\r", ch); return nm; } return nm; } void do_rcopy (CHAR_DATA * ch, char *argy) { char arg1[500]; int orig_v; int dest_v; ROOM_DATA *orig; ROOM_DATA *dest; DEFINE_COMMAND ("roomcopy", do_rcopy, POSITION_DEAD, MAX_LEVEL, LOG_ALWAYS, "Copies room vnum <orig> to vnum <dest>. Use with care!!") argy = one_argy (argy, arg1); if (!is_number (arg1) || !is_number (argy)) { send_to_char ("Syntax is: <original vnum> <destination vnum>.\n\r", ch); return; } orig_v = atoi (arg1); dest_v = atoi (argy); if ((orig = get_room_index (orig_v)) == NULL || (dest = get_room_index (dest_v)) == NULL) { send_to_char ("One of the rooms was not found.\n\r", ch); return; } dest->name = str_dup (orig->name); dest->description = str_dup (orig->description); dest->room_flags = orig->room_flags; dest->room_flags2 = orig->room_flags2; dest->sector_type = orig->sector_type; if (dest->area) SET_BIT (dest->area->area_flags, AREA_CHANGED); send_to_char ("Room copy completed.\n\r", ch); return; } void do_mcopy (CHAR_DATA * ch, char *argy) { char arg1[500]; int orig_v; int dest_v; MOB_PROTOTYPE *orig; MOB_PROTOTYPE *dest; DEFINE_COMMAND ("mobcopy", do_mcopy, POSITION_DEAD, MAX_LEVEL, LOG_ALWAYS, "Copies mob vnum <orig> to vnum <dest>. Use with care!!") argy = one_argy (argy, arg1); if (!is_number (arg1) || !is_number (argy)) { send_to_char ("Syntax is: <original vnum> <destination vnum>.\n\r", ch); return; } orig_v = atoi (arg1); dest_v = atoi (argy); if ((orig = get_mob_index (orig_v)) == NULL || (dest = get_mob_index (dest_v)) == NULL) { send_to_char ("One of the mob prototypes was not found.\n\r", ch); return; } if (dest->max_in_world != 5) { send_to_char ("It looks as if the destination vnum isn't unused!\n\r", ch); return; } dest->name = str_dup (orig->name); dest->short_descr = str_dup (orig->short_descr); dest->long_descr = str_dup (orig->long_descr); dest->sex = orig->sex; dest->level = orig->level; dest->act = orig->act; dest->act2 = orig->act2; dest->act3 = orig->act3; dest->act4 = orig->act4; dest->aff[0] = orig->aff[0]; dest->aff[1] = orig->aff[1]; dest->aff[2] = orig->aff[2]; dest->aff[3] = orig->aff[3]; dest->alignment = orig->alignment; dest->money = orig->money; dest->height = orig->height; dest->mobtype = orig->mobtype; dest->hpmult = orig->hpmult; dest->armcls = orig->armcls; dest->guard = orig->guard; dest->hitroll = orig->hitroll; dest->damroll = orig->damroll; if (dest->area) SET_BIT (dest->area->area_flags, AREA_CHANGED); send_to_char ("Mob copy completed. Don't forget to type in a NEW description for this mob.\n\r", ch); return; } void do_ocopy (CHAR_DATA * ch, char *argy) { char arg1[500]; int orig_v; int i; int dest_v; OBJ_PROTOTYPE *orig; OBJ_PROTOTYPE *dest; DEFINE_COMMAND ("objcopy", do_ocopy, POSITION_DEAD, MAX_LEVEL, LOG_ALWAYS, "Copies object vnum <orig> to vnum <dest>. Use with care!!") argy = one_argy (argy, arg1); if (!is_number (arg1) || !is_number (argy)) { send_to_char ("Syntax is: <original vnum> <destination vnum>.\n\r", ch); return; } orig_v = atoi (arg1); dest_v = atoi (argy); if ((orig = get_obj_index (orig_v)) == NULL || (dest = get_obj_index (dest_v)) == NULL) { send_to_char ("One of the object prototypes was not found.\n\r", ch); return; } if (dest->item_type != ITEM_TRASH || dest->value[3] != 0) { send_to_char ("There appears to be an object in the destination already!!\n\r", ch); return; } dest->name = str_dup (orig->name); dest->short_descr = str_dup (orig->short_descr); dest->long_descr = str_dup (orig->long_descr); dest->item_type = orig->item_type; dest->timer = orig->timer; dest->extra_flags = orig->extra_flags; dest->wear_flags = orig->wear_flags; dest->weight = orig->weight; for (i = 0; i < 10; i++) { dest->value[i] = orig->value[i]; } dest->cost = orig->cost; if (dest->area) SET_BIT (dest->area->area_flags, AREA_CHANGED); send_to_char ("Object copy completed.\n\r", ch); return; } void oedit (CHAR_DATA * ch, char *argy) { AREA_DATA *pArea; OBJ_PROTOTYPE *pObj; AFFECT_DATA *pAf; char arg[STD_LENGTH]; char arg1[STD_LENGTH]; char arg2[STD_LENGTH]; char buf[STD_LENGTH]; int value; int iHash; char str[STD_LENGTH + 5]; strcpy (arg, argy); smash_tilde (argy); argy = one_argy (argy, arg1); strcpy (arg2, argy); pObj = (OBJ_PROTOTYPE *) ch->desc->pEdit; pArea = pObj->area; hugebuf_o[0]='\0'; if (!str_cmp (arg1, "show") || arg1[0] == '\0') { sprintf (buf, "%d", pObj->vnum); do_oindex (ch, buf); return; } if (!str_cmp (arg1, "?")) { do_help (ch, "oedit"); return; } if (get_direction_number (arg1) == DIR_MAX) { switch (UPPER(arg1[0])) { case 'A': if (!str_cmp (arg1, "addaffect")) { char arg3[STD_LENGTH]; argy = one_argy (argy, arg1); argy = one_argy (argy, arg2); strcpy (arg3, argy); if (arg1[0] == '\0' || arg2[0] == '\0' || (!is_number (arg2) && atoi (arg2) * -1 == 0) || arg3[0] == '\0' || !is_number (arg3)) { send_to_char ("Syntax: addaffect|remaffect [what-affect-added] [modifier #] [1]\n\r", ch); return; } pAf = new_affect (); pAf->location = affect_name_loc (arg1); pAf->modifier = atoi (arg2); pAf->type = atoi (arg3); pAf->duration = 0; pAf->next = pObj->affected; pObj->affected = pAf; SET_BIT (pArea->area_flags, AREA_CHANGED); send_to_char ("Affect added.\n\r", ch); return; } break; case 'C': if (!str_cmp (arg1, "cost")) { if (arg2[0] == '\0' || !is_number (arg2)) { send_to_char ("Syntax: cost [number]\n\r", ch); return; } value = atoi (arg2); pObj->cost = value; SET_BIT (pArea->area_flags, AREA_CHANGED); send_to_char ("Cost set.\n\r", ch); return; } if (!str_cmp (arg1, "create")) { value = atoi (arg2); if (arg2[0] == '\0' || value == 0) { send_to_char ("Syntax: oedit create [vnum]\n\r", ch); return; } pArea = get_vnum_area (value); if (pArea == NULL) { send_to_char ("That vnum is not assigned an area.\n\r", ch); return; } if (!IS_BUILDER (ch, pArea)) { send_to_char ("Vnum in an area you can't build in.\n\r", ch); return; } if (get_obj_index (value) != NULL) { send_to_char ("Object vnum already exists.\n\r", ch); return; } pObj = new_obj_index (); pObj->vnum = value; pObj->area = pArea; if (value > top_vnum_obj) top_vnum_obj = value; iHash = value % HASH_MAX; pObj->next = obj_index_hash[iHash]; obj_index_hash[iHash] = pObj; ch->desc->pEdit = (void *) pObj; SET_BIT (pArea->area_flags, AREA_CHANGED); send_to_char ("Object Created.\n\r", ch); pArea->obj_count++; return; } break; case 'D': if (!str_cmp (arg1, "done")) { ch->desc->pEdit = NULL; ch->desc->connected = CON_PLAYING; return; } if (!str_cmp (arg1, "delaffect") || !str_cmp (arg1, "remaffect")) { pAf = pObj->affected; if (pAf == NULL) { send_to_char ("No affects on this object!\n\r", ch); return; } pObj->affected = pObj->affected->next; free_affect (pAf); SET_BIT (pArea->area_flags, AREA_CHANGED); send_to_char ("Affect removed.\n\r", ch); return; } if (!str_cmp (arg1, "desc") || !str_cmp (arg1, "description")) { char *s; if (pObj->description != NULL && pObj->description[0] == 1) { s = str_dup (pObj->description); free_string (pObj->description); pObj->description = s; } if (arg2[0] == '\0') { string_append (ch, &pObj->description); SET_BIT (pArea->area_flags, AREA_CHANGED); return; } if (arg2[0] == '+') { string_append (ch, &pObj->description); SET_BIT (pArea->area_flags, AREA_CHANGED); return; } send_to_char ("Syntax: desc - line edit\n\r", ch); send_to_char (" desc + - line append\n\r", ch); return; } break; case 'L': if (!str_cmp (arg1, "long")) { if (arg2[0] == '\0') { send_to_char ("Syntax: long [string]\n\r", ch); return; } strcat(str, "\n\r"); free_string (pObj->long_descr); sprintf(str ,"%s", anseval(str_dup(arg2), ch)); pObj->long_descr = str_dup (str); SET_BIT (pArea->area_flags, AREA_CHANGED); send_to_char ("Long description set.\n\r", ch); return; } break; case 'M': if (!str_cmp (arg1, "max")) { argy = one_argy (argy, arg1); if (!is_number (arg1)) { send_to_char ("Usage: max <number>\n\r", ch); return; } if (atoi (arg1) < 1 || atoi (arg1) > 50) { send_to_char ("Must be a range between 1 and 50.\n\r", ch); return; } pObj->max_in_room = atoi (arg1); send_to_char ("Max items concurrently in 1 room value Set :)\n\r", ch); SET_BIT (pArea->area_flags, AREA_CHANGED); return; } case 'N': if (!str_cmp (arg1, "name")) { if (arg2[0] == '\0') { send_to_char ("Syntax: name [string]\n\r", ch); return; } free_string (pObj->name); pObj->name = str_dup (arg2); /* pObj->name = str_dup (check_obj_name(arg2,ch));*/ SET_BIT (pArea->area_flags, AREA_CHANGED); send_to_char ("Name set.\n\r", ch); return; } break; case 'R': if (!str_cmp (arg1, "delaffect") || !str_cmp (arg1, "remaffect")) { pAf = pObj->affected; if (pAf == NULL) { send_to_char ("No affects on this object!\n\r", ch); return; } pObj->affected = pObj->affected->next; free_affect (pAf); SET_BIT (pArea->area_flags, AREA_CHANGED); send_to_char ("Affect removed.\n\r", ch); return; } break; case 'S': if (!str_cmp (arg1, "short")) { if (arg2[0] == '\0') { send_to_char ("Syntax: short [string]\n\r", ch); return; } free_string (pObj->short_descr); strcpy (str, anseval (str_dup (arg2), ch)); pObj->short_descr = str_dup (str); /* pObj->short_descr = str_dup (check_obj_short(str,ch));*/ SET_BIT (pArea->area_flags, AREA_CHANGED); send_to_char ("Short description set.\n\r", ch); return; } break; case 'T': if (!str_cmp (arg1, "timer")) { if (arg2[0] == '\0' || !is_number (arg2)) { send_to_char ("Syntax: timer [number]\n\r", ch); return; } pObj->timer = atoi (arg2); SET_BIT (pArea->area_flags, AREA_CHANGED); send_to_char ("Timer set.\n\r", ch); return; } break; case 'V': if (!str_cmp (arg1, "value0") || !str_cmp (arg1, "v0")) { if (arg2[0] == '\0' || (!is_number (arg2) && atoi (arg2) == 0)) { send_to_char ("Syntax: value0 [number]\n\r", ch); send_to_char ("or v0 [number]\n\r", ch); return; } value = atoi (arg2); pObj->value[0] = value; SET_BIT (pArea->area_flags, AREA_CHANGED); send_to_char ("Value 0 set.\n\r", ch); return; } if (!str_cmp (arg1, "value1") || !str_cmp (arg1, "v1")) { if (arg2[0] == '\0' || (!is_number (arg2) && atoi (arg2) == 0)) { send_to_char ("Syntax: value1 [number]\n\r", ch); send_to_char ("or v1 [number]\n\r", ch); return; } value = atoi (arg2); pObj->value[1] = value; SET_BIT (pArea->area_flags, AREA_CHANGED); send_to_char ("Value 1 set.\n\r", ch); return; } if (!str_cmp (arg1, "value2") || !str_cmp (arg1, "v2")) { if (arg2[0] != '\0' && !str_cmp (arg2, "-1")) { pObj->value[2] = -1; SET_BIT (pArea->area_flags, AREA_CHANGED); send_to_char ("Value 2 set (lampoil).\n\r", ch); return; } if (arg2[0] == '\0' || !is_number (arg2)) { send_to_char ("Syntax: value2 [number]\n\r", ch); send_to_char ("or v2 [number]\n\r", ch); return; } value = atoi (arg2); pObj->value[2] = value; SET_BIT (pArea->area_flags, AREA_CHANGED); send_to_char ("Value 2 set.\n\r", ch); return; } if (!str_cmp (arg1, "value3") || !str_cmp (arg1, "v3")) { if (arg2[0] == '\0' || !is_number (arg2)) { send_to_char ("Syntax: value3 [number]\n\r", ch); send_to_char ("or v3 [number]\n\r", ch); return; } value = atoi (arg2); pObj->value[3] = value; SET_BIT (pArea->area_flags, AREA_CHANGED); send_to_char ("Value 3 set.\n\r", ch); return; } if (!str_cmp (arg1, "value4") || !str_cmp (arg1, "v4")) { if (arg2[0] == '\0' || !is_number (arg2)) { send_to_char ("Syntax: value4 [number]\n\r", ch); send_to_char ("or v4 [number]\n\r", ch); return; } value = atoi (arg2); pObj->value[4] = value; SET_BIT (pArea->area_flags, AREA_CHANGED); send_to_char ("Value 4 set.\n\r", ch); return; } if (!str_cmp (arg1, "value5") || !str_cmp (arg1, "v5")) { if (arg2[0] == '\0' || !is_number (arg2)) { send_to_char ("Syntax: value5 [number]\n\r", ch); send_to_char ("or v5 [number]\n\r", ch); return; } value = atoi (arg2); pObj->value[5] = value; SET_BIT (pArea->area_flags, AREA_CHANGED); send_to_char ("Value 5 set.\n\r", ch); return; } if (!str_cmp (arg1, "value6") || !str_cmp (arg1, "v6")) { if (arg2[0] == '\0' || !is_number (arg2)) { send_to_char ("Syntax: value6 [number]\n\r", ch); send_to_char ("or v6 [number]\n\r", ch); return; } value = atoi (arg2); pObj->value[6] = value; SET_BIT (pArea->area_flags, AREA_CHANGED); send_to_char ("Value 6 set.\n\r", ch); return; } if (!str_cmp (arg1, "value7") || !str_cmp (arg1, "v7")) { if (arg2[0] == '\0' || !is_number (arg2)) { send_to_char ("Syntax: value7 [number]\n\r", ch); send_to_char ("or v7 [number]\n\r", ch); return; } value = atoi (arg2); pObj->value[7] = value; SET_BIT (pArea->area_flags, AREA_CHANGED); send_to_char ("Value 7 set.\n\r", ch); return; } if (!str_cmp (arg1, "value8") || !str_cmp (arg1, "v8")) { if (arg2[0] == '\0' || !is_number (arg2)) { send_to_char ("Syntax: value8 [number]\n\r", ch); send_to_char ("or v8 [number]\n\r", ch); return; } value = atoi (arg2); pObj->value[8] = value; SET_BIT (pArea->area_flags, AREA_CHANGED); send_to_char ("Value 8 set.\n\r", ch); return; } if (!str_cmp (arg1, "value9") || !str_cmp (arg1, "v9")) { if (arg2[0] == '\0' || !is_number (arg2)) { send_to_char ("Syntax: value9 [number]\n\r", ch); send_to_char ("or v9 [number]\n\r", ch); return; } value = atoi (arg2); pObj->value[9] = value; SET_BIT (pArea->area_flags, AREA_CHANGED); send_to_char ("Value 9 set.\n\r", ch); return; } break; case 'W': if (!str_cmp (arg1, "weight")) { if (arg2[0] == '\0' || !is_number (arg2)) { send_to_char ("Syntax: weight [number]\n\r", ch); return; } value = atoi (arg2); pObj->weight = value; SET_BIT (pArea->area_flags, AREA_CHANGED); send_to_char ("Weight set.\n\r", ch); return; } break; } if ((value = item_name_type (arg1)) != ITEM_NONE) { pObj->item_type = value; SET_BIT (pArea->area_flags, AREA_CHANGED); send_to_char ("Type set.\n\r", ch); return; } if ((value = extra_name_bit (arg1)) != EXTRA_NONE) { pObj->extra_flags ^= value; SET_BIT (pArea->area_flags, AREA_CHANGED); send_to_char ("Extra flag toggled.\n\r", ch); return; } if ((value = wear_name_bit (arg1)) != ITEM_WEAR_NONE) { pObj->wear_flags ^= value; SET_BIT (pArea->area_flags, AREA_CHANGED); send_to_char ("Wear flag toggled.\n\r", ch); return; } } if (hugebuf_o[0]!='\0') { page_to_char(hugebuf_o,ch); return; } interpret (ch, arg); return; }