#include <sys/types.h> #include <ctype.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #include "emlen.h" AREA_DATA *area_free; DESCRIPTION_DATA *extra_descr_free; ROOM_DATA *room_index_free; OBJ_PROTOTYPE *obj_index_free; SHOP_DATA *shop_free; MOB_PROTOTYPE *mob_index_free; RESET_DATA *reset_free; int find_next_obj(int cur) { int i; i=cur+1; while (i<top_vnum_obj && get_obj_index(i)==NULL) i++; if (i==top_obj_index) return 1; return i; } int find_next_mob(int cur) { int i; i=cur+1; while (i<top_vnum_mob && get_mob_index(i)==NULL) i++; if (i==top_mob_index) return 1; return i; } int find_prev_obj(int cur) { int i; i=cur-1; while (i>1 && get_obj_index(i)==NULL) i--; if (i==1) return 1; return i; } int find_prev_mob(int cur) { int i; i=cur-1; while (i>1 && get_mob_index(i)==NULL) i--; if (i==1) return 1; return i; } char *strip_enters(char *s) { char *t; int i; static char b[500]; strcpy(b,s); i=strlen(b); t=b+i; while (*t!='\n' && t>b) {t--;} *t='\0'; return b; } void send_edit_char (char *st, CHAR_DATA * ch) { char *t; int i = 0; hugebuf_o[0] = '\0'; for (t = st; *t != '\0'; t++) { if (*t == ':' && *(t + 1) >= '0' && *(t + 1) <= '9') { hugebuf_o[i] = '\n'; i++; hugebuf_o[i] = '\r'; i++; hugebuf_o[i] = ':'; i++; continue; } hugebuf_o[i] = *t; i++; } hugebuf_o[i] = '\0'; send_to_char (hugebuf_o, ch); return; } MOB_PROTOTYPE * new_mob_index (void) { MOB_PROTOTYPE *pMob; if (mob_index_free == NULL) { pMob = mem_alloc (sizeof (*pMob)); top_mob_index++; } else { pMob = mob_index_free; mob_index_free = mob_index_free->next; } pMob->next = NULL; pMob->spec_fun = NULL; pMob->clan_guard_1 = 0; pMob->clan_guard_2 = 0; pMob->spec_name = NULL; pMob->pShop = NULL; pMob->area = NULL; pMob->attackname = str_dup ("N/A"); pMob->name = str_dup ("no name"); pMob->short_descr = str_dup ("(none)"); pMob->long_descr = str_dup ("(none)\n\r"); pMob->description = str_dup (""); pMob->yeller_number = 0; pMob->max_in_world = 5; pMob->will_help = 0; pMob->vnum = 0; pMob->guard = 0; pMob->height = 0; pMob->count = 0; pMob->killed = 0; pMob->sex = 0; pMob->level = 0; pMob->act = 0; pMob->act3 = 0; pMob->act4 = 0; pMob->affected_by = 0; pMob->more_affected_by = 0; pMob->alignment = 0; pMob->alt_vnum = 0; pMob->money = 0; pMob->mobtype = -1; pMob->hpmult = 10; pMob->opt = NULL; pMob->race_hate = 0; pMob->armcls = 101; pMob->hitroll = 0; pMob->damroll = 0; pMob->dodge = 0; pMob->parry = 0; return pMob; } PLAYERBASE_DATA * new_player (void) { PLAYERBASE_DATA *play; play = mem_alloc (sizeof (*play)); play->player_name[0] = '\0'; play->email_address[0] = '\0'; play->next = playerbase_zero; playerbase_zero = play; return play; } void free_temp (CHAR_DATA * ch) { if (!ch->pcdata || !ch->pcdata->temp) return; ch->pcdata->temp->next = temp_free; temp_free = ch->pcdata->temp; ch->pcdata->temp = NULL; return; } void check_temp (CHAR_DATA * ch) { if (!ch || !ch->pcdata) return; if (ch->pcdata->temp == NULL) ch->pcdata->temp = new_temp (); return; } TEMP_STR * new_temp (void) { TEMP_STR *temp; if (temp_free == NULL) { temp = mem_alloc (sizeof (*temp)); top_temp++; } else { temp = temp_free; temp_free = temp_free->next; } temp->next = temp_first; temp_first = temp; temp->temp_string[0] = '\0'; return temp; } void free_ced (CHAR_DATA * ch) { CED_DATA *f; if (ch->ced == NULL) return; if (ced_first == ch->ced) { ced_first = ch->ced->next; } else for (f = ced_first; f != NULL; f = f->next) { if (f->next == ch->ced) { f->next = ch->ced->next; break; } } ch->ced->pnote = NULL; ch->ced->attackers[0] = NULL; ch->ced->attackers[1] = NULL; ch->ced->attackers[2] = NULL; ch->ced->attackers[3] = NULL; #ifndef NEW_WORLD ch->ced->in_boat = NULL; ch->ced->came_from_boat = NULL; #endif ch->ced->wasroom = 0; ch->ced->pnote = NULL; ch->ced->original = NULL; ch->ced->has_yelled = FALSE; ch->ced->scanning = FALSE; ch->ced->was_in_room = NULL; ch->ced->reply = NULL; ch->ced->fight_ops = 0xFFFFFFFF; ch->ced->ground_pos = 0; ch->ced->wimpy = 5; ch->ced->cur_line = 0; ch->ced->scr_wait = 0; ch->ced->wait_type = 0; ch->ced->next = ced_free; ced_free = ch->ced; ch->ced = NULL; return; } void check_ced (CHAR_DATA * ch) { if (!ch) return; if (ch->ced == NULL) ch->ced = new_ced (); return; } CED_DATA * new_ced (void) { CED_DATA *ced; if (ced_free == NULL) { ced = mem_alloc (sizeof (*ced)); top_ced++; } else { ced = ced_free; ced_free = ced_free->next; } ced->next = ced_first; ced_first = ced; ced->attackers[0] = NULL; ced->attackers[1] = NULL; ced->attackers[2] = NULL; ced->attackers[3] = NULL; #ifndef NEW_WORLD ced->in_boat = NULL; ced->came_from_boat = NULL; #endif ced->wasroom = 0; ced->pnote = NULL; ced->original = NULL; ced->has_yelled = FALSE; ced->scanning = FALSE; ced->was_in_room = NULL; ced->reply = NULL; ced->fight_ops = 0xFFFFFFFF; ced->ground_pos = 0; ced->wimpy = 5; ced->cur_line = 0; ced->scr_wait = 0; ced->wait_type = 0; return ced; } EXIT_DATA * new_exit (void) { EXIT_DATA *pExit; pExit = mem_alloc (sizeof (*pExit)); top_exit++; pExit->to_room = NULL; pExit->vnum = 0; pExit->d_info = NULL; /* pExit->exit_info = 0; pExit->key = 0; pExit->keyword = NULL; pExit->description = str_dup(""); pExit->rs_flags = 0; pExit->str = 30; pExit->maxstr = 30; */ return pExit; } ROOM_DATA * new_room_index (void) { ROOM_DATA *pRoom; int door; pRoom = new_room (); pRoom->next = NULL; pRoom->area = NULL; for (door = 0; door < MAX_DIR; door++) pRoom->exit[door] = NULL; pRoom->name = str_dup (""); pRoom->data_type = K_ROOM; pRoom->description = str_dup (""); pRoom->vnum = 0; pRoom->room_flags = 0; pRoom->room_flags2 = 0; pRoom->light = 0; pRoom->blood = 0; pRoom->minerals = 0; pRoom->sector_type = 1; for (door = 0; door < 4; door++) pRoom->mapexit[door] = NULL; pRoom->ibm[0] = '\0'; pRoom->ibm[1] = '\0'; pRoom->noibm[0] = '\0'; pRoom->noibm[1] = '\0'; pRoom->color = 0; return pRoom; } AREA_DATA * get_vnum_area (int vnum) { AREA_DATA *pArea; for (pArea = area_first; pArea != NULL; pArea = pArea->next) { if (vnum >= pArea->lvnum && vnum <= pArea->uvnum) return pArea; } return NULL; } void do_2forward (CHAR_DATA * ch, char *argy) { int tmp_vnum; char buffy[STD_LENGTH]; DEFINE_COMMAND ("f>", do_2forward, POSITION_DEAD, IMM_LEVEL, LOG_NORMAL, "Advances forward in medit or oedit, creating a mob/object if the next vnum is blank.") buffy[0] = '\0'; if (ch->desc->connected == CON_MEDITOR) { MOB_PROTOTYPE *pMob; MOB_PROTOTYPE *tMob; pMob = (MOB_PROTOTYPE *) ch->desc->pEdit; if (!pMob) return; tmp_vnum = pMob->vnum + 1; if ((tMob = get_mob_index (tmp_vnum)) != NULL) { do_forward (ch, ""); return; } sprintf (buffy, "create %d", tmp_vnum); do_medit (ch, buffy); do_forward (ch, ""); return; } if (ch->desc->connected == CON_OEDITOR) { OBJ_PROTOTYPE *pObj; OBJ_PROTOTYPE *tObj; pObj = (OBJ_PROTOTYPE *) ch->desc->pEdit; if (!pObj) return; tmp_vnum = pObj->vnum + 1; if ((tObj = get_obj_index (tmp_vnum)) != NULL) { do_forward (ch, ""); return; } sprintf (buffy, "create %d", tmp_vnum); do_oedit (ch, buffy); sprintf (buffy, "%d", tmp_vnum); do_oindex (ch, buffy); return; } return; } void do_2backward (CHAR_DATA * ch, char *argy) { int tmp_vnum; char buffy[STD_LENGTH]; DEFINE_COMMAND ("b<", do_2backward, POSITION_DEAD, IMM_LEVEL, LOG_NORMAL, "Goes backward in medit or oedit, creating a mob/object if the previous vnum is blank.") buffy[0] = '\0'; if (ch->desc->connected == CON_MEDITOR) { MOB_PROTOTYPE *pMob; MOB_PROTOTYPE *tMob; pMob = (MOB_PROTOTYPE *) ch->desc->pEdit; if (!pMob) return; tmp_vnum = pMob->vnum - 1; if ((tMob = get_mob_index (tmp_vnum)) != NULL) { do_backward (ch, ""); return; } sprintf (buffy, "create %d", tmp_vnum); do_medit (ch, buffy); do_backward (ch, ""); return; } if (ch->desc->connected == CON_OEDITOR) { OBJ_PROTOTYPE *pObj; OBJ_PROTOTYPE *tObj; pObj = (OBJ_PROTOTYPE *) ch->desc->pEdit; if (!pObj) return; tmp_vnum = pObj->vnum - 1; if ((tObj = get_obj_index (tmp_vnum)) != NULL) { do_backward (ch, ""); return; } sprintf (buffy, "create %d", tmp_vnum); do_oedit (ch, buffy); sprintf (buffy, "%d", tmp_vnum); do_oindex (ch, buffy); return; } return; } void do_forward (CHAR_DATA * ch, char *argy) { int tmp_vnum; char buffy[STD_LENGTH]; DEFINE_COMMAND (">", do_forward, POSITION_DEAD, IMM_LEVEL, LOG_NORMAL, "Advances 1 vnum forward in medit or oedit.") buffy[0] = '\0'; if (ch->desc->connected == CON_MEDITOR) { MOB_PROTOTYPE *pMob; pMob = (MOB_PROTOTYPE *) ch->desc->pEdit; if (!pMob) return; tmp_vnum = find_next_mob(pMob->vnum);/*1;*/ sprintf (buffy, "%d", tmp_vnum); do_medit (ch, buffy); return; } if (ch->desc->connected == CON_OEDITOR) { OBJ_PROTOTYPE *pObj; pObj = (OBJ_PROTOTYPE *) ch->desc->pEdit; if (!pObj) return; tmp_vnum = find_next_obj(pObj->vnum); /*1;*/ sprintf (buffy, "%d", tmp_vnum); do_oedit (ch, buffy); do_oindex (ch, buffy); return; } return; } void do_backward (CHAR_DATA * ch, char *argy) { int tmp_vnum; char buffy[STD_LENGTH]; DEFINE_COMMAND ("<", do_backward, POSITION_DEAD, IMM_LEVEL, LOG_NORMAL, "Goes backward 1 vnum forward in medit or oedit.") buffy[0] = '\0'; if (ch->desc->connected == CON_MEDITOR) { MOB_PROTOTYPE *pMob; pMob = (MOB_PROTOTYPE *) ch->desc->pEdit; if (!pMob) return; tmp_vnum = find_prev_mob(pMob->vnum); sprintf (buffy, "%d", tmp_vnum); do_medit (ch, buffy); return; } if (ch->desc->connected == CON_OEDITOR) { OBJ_PROTOTYPE *pObj; pObj = (OBJ_PROTOTYPE *) ch->desc->pEdit; if (!pObj) return; tmp_vnum = find_prev_obj(pObj->vnum); sprintf (buffy, "%d", tmp_vnum); do_oedit (ch, buffy); do_oindex (ch, buffy); return; } return; } RESET_DATA * new_reset_data (void) { RESET_DATA *pReset; if (reset_free == NULL) { pReset = mem_alloc (sizeof (*pReset)); top_reset++; } else { pReset = reset_free; reset_free = reset_free->next; } pReset->next = NULL; pReset->command = 'M'; pReset->loc = -1; pReset->percent = 0; pReset->rs_vnum = 0; pReset->vnum = 0; return pReset; } void free_reset_data (RESET_DATA * pReset) { pReset->next = reset_free; reset_free = pReset; return; } AREA_DATA * new_area (void) { AREA_DATA *pArea; char buf[SML_LENGTH]; if (area_free == NULL) { pArea = mem_alloc (sizeof (*pArea)); top_area++; } else { pArea = area_free; area_free = area_free->next; } pArea->next = NULL; pArea->name = str_dup ("New area"); pArea->repop = str_dup ("The area seems alive again!\n\r"); pArea->area_flags = AREA_CHANGED; /*pArea->area_flags = AREA_ADDED; */ pArea->open = 0; pArea->desc_rooms = 0; pArea->weather_change = 0; pArea->more_rainy = FALSE; pArea->more_dry = FALSE; pArea->more_fog = FALSE; pArea->homeland = FALSE; pArea->security = 1; pArea->builders = str_dup ("None"); pArea->lvnum = 0; pArea->has_popped_this_reboot = TRUE; pArea->uvnum = 0; pArea->nplayer = 0; sprintf (buf, "area%d.are", pArea->vnum); pArea->filename = str_dup (buf); pArea->vnum = top_area; /* -1 */ pArea->room_count = 0; pArea->mob_count = 0; pArea->obj_count = 0; pArea->repop_rate = 55; pArea->repop_counter = number_range (30, 55); return pArea; } void free_area (AREA_DATA * pArea) { free_string (pArea->name); free_string (pArea->filename); free_string (pArea->repop); free_string (pArea->builders); pArea->next = area_free->next; area_free = pArea; return; } DESCRIPTION_DATA * new_extra_descr (void) { DESCRIPTION_DATA *pExtra; if (extra_descr_free == NULL) { pExtra = mem_alloc (sizeof (*pExtra)); top_ed++; } else { pExtra = extra_descr_free; extra_descr_free = extra_descr_free->next; } pExtra->keyword = str_dup ("d"); /*TESTING IF THIS FIXES */ pExtra->description = str_dup (""); pExtra->next = NULL; return pExtra; } void free_extra_descr (DESCRIPTION_DATA * pExtra) { free_string (pExtra->keyword); free_string (pExtra->description); pExtra->next = extra_descr_free; extra_descr_free = pExtra; return; } void free_exit (EXIT_DATA * pExit) { if (pExit->d_info) { if (pExit->d_info->keyword) free_string (pExit->d_info->keyword); if (pExit->d_info->description) free_string (pExit->d_info->description); pExit->d_info = NULL; } /*free_m(pExit); */ return; } AFFECT_DATA * new_affect (void) { AFFECT_DATA *pAf; if (affect_free == NULL) { pAf = mem_alloc (sizeof (*pAf)); top_affect++; } else { pAf = affect_free; affect_free = affect_free->next; } pAf->next = NULL; pAf->location = 0; pAf->modifier = 0; pAf->type = 0; pAf->duration = 0; pAf->bitvector = 0; return pAf; } void free_affect (AFFECT_DATA * pAf) { pAf->next = affect_free; affect_free = pAf; return; } OBJ_PROTOTYPE * new_obj_index (void) { OBJ_PROTOTYPE *pObj; int value; if (obj_index_free == NULL) { pObj = mem_alloc (sizeof (*pObj)); top_obj_index++; } else { pObj = obj_index_free; obj_index_free = obj_index_free->next; } pObj->next = NULL; pObj->extra_descr = NULL; pObj->affected = NULL; pObj->area = NULL; pObj->name = str_dup ("no name"); pObj->short_descr = str_dup ("(none)"); pObj->description = str_dup ("(none)"); pObj->vnum = 0; pObj->item_type = ITEM_TRASH; pObj->max_in_room = 1; pObj->timer = 0; pObj->extra_flags = 0; pObj->guild_flags = 0; pObj->wear_flags = 0; pObj->count = 0; pObj->weight = 0; pObj->cost = 0; for (value = 0; value < 11; value++) pObj->value[value] = 0; return pObj; } OPTIONAL_DATA * new_optional (void) { OPTIONAL_DATA *optional; int i; optional = mem_alloc (sizeof (*optional)); for (i = 0; i < 30; i++) { optional->skltaught[i] = 0; } for (i = 0; i < 10; i++) { optional->cast_spells[i] = NULL; } optional->cast_percent = 0; optional->warrior_percent = 0; optional->summons = 0; optional->avenger = 0; return optional; } void new_shop (MOB_PROTOTYPE *m) { SHOP_DATA *pShop; int buy; if (shop_free == NULL) { pShop = mem_alloc (sizeof (*pShop)); top_shop++; } else { pShop = shop_free; shop_free = shop_free->next; } pShop->next = NULL; pShop->keeper = 0; for (buy = 0; buy < MAX_TRADE; buy++) pShop->buy_type[buy] = ITEM_NONE; pShop->decrease = 5; pShop->items_until_decrease = 4; pShop->profit_buy = 100; pShop->profit_sell = 100; pShop->open_hour = 0; pShop->close_hour = 23; pShop->creates_vnum = 0; pShop->creates_hours = 1; pShop->creates_message = NULL; m->pShop=pShop; pShop->keeper=m->vnum; if (shop_last) shop_last->next=pShop; else { shop_first=pShop; shop_last=pShop; } return; } void free_shop (SHOP_DATA * pShop) { pShop->next = shop_free; shop_free = pShop; return; } void free_mob_index (MOB_PROTOTYPE * pMob) { free_string (pMob->name); free_string (pMob->short_descr); free_string (pMob->long_descr); free_string (pMob->description); free_shop (pMob->pShop); pMob->next = mob_index_free; mob_index_free = pMob; return; } int arg_count (char *argy) { int total; char *s; total = 0; s = argy; while (*s != '\0') { if (*s != ' ') { total++; while (*s != ' ' && *s != '\0') s++; } else { s++; } } return total; } AREA_DATA * get_area_data (int vnum) { AREA_DATA *pArea; for (pArea = area_first; pArea != NULL; pArea = pArea->next) { if (pArea->vnum == vnum) return pArea; } return NULL; } char * area_bit_name (int area_flags) { static char buf[512]; buf[0] = '\0'; if (area_flags & AREA_CHANGED) strcat (buf, " CHANGED"); else strcat (buf, " changed"); if (area_flags & AREA_ADDED) strcat (buf, " ADDED"); else strcat (buf, " added"); return buf + 1; } int get_area_flags_number (char *argy) { if (!str_cmp (argy, "changed")) return AREA_CHANGED; if (!str_cmp (argy, "added")) return AREA_ADDED; return AREA_NONE; } int get_sector_number (char *argy) { int i; bool found = FALSE; for(i=0; i<SECT_MAX && !found; i++) { if (!str_cmp(argy, sectors[i].name_typed)) { return i; found = TRUE; } } return SECT_MAX; } int get_direction_number (char *arg) { if (!str_cmp (arg, "n") || !str_cmp (arg, "north")) return DIR_NORTH; if (!str_cmp (arg, "e") || !str_cmp (arg, "east")) return DIR_EAST; if (!str_cmp (arg, "s") || !str_cmp (arg, "south")) return DIR_SOUTH; if (!str_cmp (arg, "w") || !str_cmp (arg, "west")) return DIR_WEST; if (!str_cmp (arg, "u") || !str_cmp (arg, "up")) return DIR_UP; if (!str_cmp (arg, "d") || !str_cmp (arg, "down")) return DIR_DOWN; return DIR_MAX; } int get_exit_flag_number (char *arg) { if (!str_cmp (arg, "door")) return EX_ISDOOR; if (!str_cmp (arg, "closed")) return EX_CLOSED; if (!str_cmp (arg, "locked")) return EX_LOCKED; if (!str_cmp (arg, "pickproof")) return EX_PICKPROOF; if (!str_cmp (arg, "hidden")) return EX_HIDDEN; if (!str_cmp (arg, "bashproof")) return EX_BASHPROOF; if (!str_cmp (arg, "fixdoor")) return EX_RESET; if (!str_cmp (arg, "trapped")) return EX_HASTRAP; return EX_NONE; } int get_mob_sex_number (char *arg) { if (!str_cmp (arg, "neuter")) return SEX_NEUTRAL; if (!str_cmp (arg, "male")) return SEX_MALE; if (!str_cmp (arg, "female")) return SEX_FEMALE; return SEX_NONE; } SPEC_FUNCTION * get_mob_spec (char *arg) { char buf[STD_LENGTH]; buf[0] = '\0'; strcat (buf, "spec_"); strcat (buf, arg); return spec_lookup (buf); } void do_aedit (CHAR_DATA * ch, char *argy) { AREA_DATA *pArea; int value; DEFINE_COMMAND ("aedit", do_aedit, POSITION_DEAD, MAX_LEVEL, LOG_ALWAYS, "This command allows you to enter the area editor.") if (IS_MOB (ch)) return; pArea = ch->in_room->area; if (is_number (argy)) { value = atoi (argy); if ((pArea = get_area_data (value)) == NULL) { send_to_char ("That area vnum does not exist.\n\r", ch); return; } } else { if (!str_cmp (argy, "create")) { /* pArea = new_area(); area_last->next = pArea; SET_BIT( pArea->area_flags, AREA_ADDED ); */ pArea = new_area (); top_area++; area_sort (pArea); save_area_list (); } } ch->desc->pEdit = (void *) pArea; ch->desc->connected = CON_AEDITOR; return; } void do_soc_edit (CHAR_DATA * ch, char *argy) { SOCIAL *s; char arg1[STD_LENGTH]; DEFINE_COMMAND ("socedit", do_soc_edit, POSITION_DEAD, MAX_LEVEL-4, LOG_NORMAL,"This command allows you to modify/add socials") if (IS_MOB (ch)) return; if (!ch->desc) return; argy = one_argy (argy, arg1); if (arg1[0] == '\0') return; if (!str_cmp (arg1, "create")) { s = new_social (); strcpy (s->name, "none"); ch->desc->pEdit = s; ch->desc->connected = CON_SOCEDIT; send_to_char ("Social created. Entering social editor.\n\r", ch); return; } for (s = social_list; s != NULL; s = s->next) { if (!str_cmp (s->name, arg1)) { ch->desc->pEdit = s; ch->desc->connected = CON_SOCEDIT; send_to_char ("Social found. Entering social editor.\n\r", ch); return; } } send_to_char ("That social could not be found.\n\r", ch); return; } void do_redit (CHAR_DATA * ch, char *argy) { ROOM_DATA *pRoom; AREA_DATA *pArea; int value; int iHash; char arg1[STD_LENGTH]; DEFINE_COMMAND ("redit", do_redit, POSITION_DEAD, IMM_LEVEL, LOG_NORMAL, "This command allows you to enter the room editor.") if (IS_MOB (ch)) return; argy = one_argy (argy, arg1); pRoom = ch->in_room; if (is_number (arg1)) { value = atoi (arg1); if ((pRoom = get_room_index (value)) == NULL) { send_to_char ("REdit: That vnum does not exist.\n\r", ch); return; } } else { if (!str_cmp (arg1, "reset")) { reset_room (pRoom); send_to_char ("Room reset.\n\r", ch); return; } else if (!str_cmp (arg1, "create")) { value = atoi (argy); if (argy[0] == '\0' || value == 0) { send_to_char ("Syntax: redit create [vnum]\n\r", ch); return; } pArea = get_vnum_area (value); if (pArea == NULL) { send_to_char ("REdit: That vnum is not assigned an area.\n\r", ch); return; } if (!IS_BUILDER (ch, pArea)) { send_to_char ("REdit: Vnum in an area you can't build in.\n\r", ch); return; } if (get_room_index (value) != NULL) { send_to_char ("REdit: Room vnum already exists.\n\r", ch); return; } pRoom = new_room_index (); pRoom->area = pArea; pRoom->vnum = value; if (value > top_vnum_room) top_vnum_room = value; iHash = value % HASH_MAX; pRoom->next = room_hash[iHash]; room_hash[iHash] = pRoom; SET_BIT (pArea->area_flags, AREA_CHANGED); pArea->room_count++; char_from_room (ch); char_to_room (ch, pRoom); } } ch->desc->connected = CON_REDITOR; return; } void do_oedit (CHAR_DATA * ch, char *argy) { OBJ_PROTOTYPE *pObj; AREA_DATA *pArea; int value; int iHash; char arg1[STD_LENGTH]; DEFINE_COMMAND ("oedit", do_oedit, POSITION_DEAD, IMM_LEVEL, LOG_NORMAL, "This command allows you to enter the object editor.") argy = one_argy (argy, arg1); if (IS_MOB (ch)) return; if (is_number (arg1)) { value = atoi (arg1); if ((pObj = get_obj_index (value)) == NULL) { send_to_char ("OEdit: That vnum does not exist.\n\r", ch); return; } /*pArea=get_vnum_area(value); */ pArea = pObj->area; if (!IS_BUILDER (ch, pArea)) { send_to_char ("OEdit: It is not nice to edit other people's objects!\n\r", ch); return; } ch->desc->pEdit = (void *) pObj; ch->desc->connected = CON_OEDITOR; return; } else { if (!str_cmp (arg1, "create")) { value = atoi (argy); if (argy[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 ("OEdit: That vnum is not assigned an area.\n\r", ch); return; } if (!IS_BUILDER (ch, pArea)) { send_to_char ("OEdit: Vnum in an area you can't build in.\n\r", ch); return; } if (get_obj_index (value) != NULL) { char tmp[50]; send_to_char ("OEdit: Object vnum already exists.\n\r", ch); sprintf(tmp,"%d",value); do_oedit(ch,tmp); 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); pArea->obj_count++; ch->desc->connected = CON_OEDITOR; return; } } send_to_char ("OEdit: Syntax is OEDIT <vnum> or OEDIT CREATE <vnum>.\n\r", ch); return; } void do_medit (CHAR_DATA * ch, char *argy) { MOB_PROTOTYPE *pMob; AREA_DATA *pArea; int value; int iHash; char arg1[STD_LENGTH]; DEFINE_COMMAND ("medit", do_medit, POSITION_DEAD, IMM_LEVEL, LOG_NORMAL, "This command allows you to enter the mob editor.") if (IS_MOB (ch)) return; argy = one_argy (argy, arg1); if (is_number (arg1)) { value = atoi (arg1); if ((pMob = get_mob_index (value)) == NULL) { send_to_char ("MEdit: That vnum does not exist.\n\r", ch); return; } /*pArea = get_vnum_area( value ); */ pArea = pMob->area; if (pArea != NULL) if (!IS_BUILDER (ch, pArea)) { send_to_char ("MEdit: Vnum in an area you can't build in.\n\r", ch); return; } ch->desc->pEdit = (void *) pMob; ch->desc->connected = CON_MEDITOR; mindex_window (ch, pMob, -1); return; } else { if (!str_cmp (arg1, "create")) { value = atoi (argy); if (argy[0] == '\0' || value == 0) { send_to_char ("Syntax: medit create [vnum]\n\r", ch); return; } pArea = get_vnum_area (value); if (pArea == NULL) { send_to_char ("MEdit: That vnum is not assigned an area.\n\r", ch); return; } if (!IS_BUILDER (ch, pArea)) { send_to_char ("MEdit: Vnum in an area you can't build in.\n\r", ch); return; } if (get_mob_index (value) != NULL) { send_to_char ("MEdit: Mob vnum already exists.\n\r", ch); return; } pMob = new_mob_index (); pMob->vnum = value; pMob->area = pArea; if (value > top_vnum_mob) top_vnum_mob = value; iHash = value % HASH_MAX; pMob->next = mob_index_hash[iHash]; mob_index_hash[iHash] = pMob; ch->desc->pEdit = (void *) pMob; mindex_window (ch, pMob, -1); SET_BIT (pArea->area_flags, AREA_CHANGED); pArea->mob_count++; ch->desc->connected = CON_MEDITOR; return; } } send_to_char ("MEdit: Syntax is MEDIT <vnum> or MEDIT CREATE <vnum>.\n\r", ch); return; } void do_cedit (CHAR_DATA * ch, char *argy) { CLAN_DATA *ClanData; int value; int iHash; char arg1[STD_LENGTH]; DEFINE_COMMAND ("cedit", do_cedit, POSITION_DEAD, IMM_LEVEL, LOG_NORMAL, "This command allows you to enter the clan editor.") ch->fgt->attacker_turn = FALSE; if (IS_MOB (ch)) return; argy = one_argy (argy, arg1); if (is_number (arg1)) { value = atoi (arg1); if ((ClanData = get_clan_index (value)) == NULL) { send_to_char ("CEdit: That vnum does not exist.\n\r", ch); return; } ch->desc->pEdit = (void *) ClanData; ch->desc->connected = CON_CEDITOR; return; } else { if (!str_cmp (arg1, "create")) { value = atoi (argy); if (argy[0] == '\0' || value == 0) { send_to_char ("Syntax: cedit create [vnum]\n\r", ch); return; } if (get_clan_index (value) != NULL) { send_to_char ("CEdit: CLAN vnum already exists.\n\r", ch); return; } ClanData = new_clan_index (); ClanData->vnum = value; if (value > top_clan) top_clan = value; iHash = value % 20; ClanData->next = clan_index_hash[iHash]; clan_index_hash[iHash] = ClanData; ch->desc->pEdit = (void *) ClanData; ch->desc->connected = CON_CEDITOR; return; } } send_to_char ("CEdit: Syntax is CEDIT <vnum> or CEDIT CREATE <vnum>.\n\r", ch); return; } void do_cedit2 (CHAR_DATA * ch, char *argy) { CLAN_DATA *ClanData; int value; int iHash; char arg1[STD_LENGTH]; DEFINE_COMMAND ("cedit2", do_cedit2, POSITION_DEAD, IMM_LEVEL, LOG_NORMAL, "This command allows you to enter the clan editor for alternative 'clans'.") if (IS_MOB (ch)) return; ch->fgt->attacker_turn = TRUE; argy = one_argy (argy, arg1); if (is_number (arg1)) { value = atoi (arg1); if ((ClanData = get_clan_index_2 (value)) == NULL) { send_to_char ("CEdit2: That vnum does not exist.\n\r", ch); return; } ch->desc->pEdit = (void *) ClanData; ch->desc->connected = CON_CEDITOR; return; } else { if (!str_cmp (arg1, "create")) { value = atoi (argy); if (argy[0] == '\0' || value == 0) { send_to_char ("Syntax: cedit2 create [vnum]\n\r", ch); return; } if (get_clan_index_2 (value) != NULL) { send_to_char ("CEdit: CLAN vnum already exists.\n\r", ch); return; } ClanData = new_clan_index_2 (); ClanData->vnum = value; if (value > top_clan_2) top_clan_2 = value; iHash = value % 20; ClanData->next = clan_index_hash_2[iHash]; clan_index_hash_2[iHash] = ClanData; ch->desc->pEdit = (void *) ClanData; ch->desc->connected = CON_CEDITOR; return; } } send_to_char ("CEdit2: Syntax is CEDIT2 <vnum> or CEDIT2 CREATE <vnum>.\n\r", ch); return; } void do_mindex (CHAR_DATA * ch, char *argy) { DEFINE_COMMAND ("mindex", do_mindex, POSITION_DEAD, MAX_LEVEL, LOG_NORMAL, "This command shows a complete mob template.") do_mindexc (ch, argy, FALSE); return; } void mindex_window (CHAR_DATA * ch, MOB_PROTOTYPE * victim, int update) { static char buf[1024]; /* 1 Vnum [48374] Level: 114 Sex: Male Money: 4834 Hp: 2.4 Ktr: 484 J1 J2 2 Name 'eastern sentry gate large' Align: 9324 AC: Auto Area: 85 3 Short 'a large eastern gate sentry' Spec : Spec_warrior Alt: 39238 4 Act: sentinel 3guard_door_opp 4 Act: kevil kneutral Height: 56 (4' 8") 5 Aff: detect-invis detect-hidden 6 Guarding: -1 Yell#: 13 Willhelp: 1 in 0 Attack: punch [Human(oid)] 7 Long 'Joe blow stands here, guarding the eastern gate with his life!' ----------------------------------------------------------------------------- */ if (update == -1) { sprintf (buf, "\x1B[1;1f\x1B[K\x1B[2;1f\x1B[K\x1B[3;1f\x1B[K\x1B[4;1f\x1B[K\x1B[5;1f\x1B[K\x1B[6;1f\x1B[K\x1B[7;1f\x1B[K\x1B[8;1f\x1B[K\x1B[9;1f\x1B[K\x1B[10;%dr", ch->pcdata->pagelen); send_to_char (buf, ch); } /*Vnum [48374] Level: 114 Sex: Male Money: 4834 Hp: 2.4 Ktr: 484 */ if (update == -1 || update == 1) { sprintf (buf, "\x1B[1;1f\x1B[KVnum [\x1B[1;32m%d\x1B[37;0m] Level: \x1B[1m%-3d\x1B[0m Sex: %-7s Money: \x1B[1m%-5d\x1B[0m Hp: \x1B[1m%2.1f\x1B[0m Ktr: \x1B[1m%d\x1B[0m\n\r", victim->vnum, victim->level, (victim->sex == SEX_MALE ? "male" : victim->sex == SEX_FEMALE ? "female" : "neutral"), victim->money, ((double) victim->hpmult / (double) 10), victim->killed); send_to_char (buf, ch); if (update != -1) { sprintf (buf, "\x1B[%d;1f\x1B[K", ch->pcdata->pagelen); send_to_char (buf, ch); return; } } /*Name 'eastern sentry gate large' Align: 9324 AC: Auto Area: 85 */ if (update == -1 || update == 2) { char minibuf[100]; if (victim->armcls == 101) sprintf (minibuf, "Auto"); else sprintf (minibuf, "%d", victim->armcls); sprintf (buf, "\x1B[2;1f\x1B[KName '%s'\x1B[2;39f\x1B[K Align: \x1B[1m%-4d\x1B[0m AC: \x1B[1m%-4s\x1B[0m Area: %d\n\r", victim->name, victim->alignment, minibuf, victim->area->vnum); send_to_char (buf, ch); if (update != -1) { sprintf (buf, "\x1B[%d;1f\x1B[K", ch->pcdata->pagelen); send_to_char (buf, ch); return; } } /*Short 'a large eastern gate sentry' Spec : Spec_warrior Alt: 39238 */ if (update == -1 || update == 3) { sprintf (buf, "\x1B[3;1f\x1B[KShort '%s'\x1B[3;41f\x1B[KSpec : \x1B[1m%-15s\x1B[0m Alt: \x1B[1m%d\x1B[0m\n\r", victim->short_descr, (victim->spec_name == NULL ? "None" : victim->spec_name), victim->alt_vnum); send_to_char (buf, ch); if (update != -1) { sprintf (buf, "\x1B[%d;1f\x1B[K", ch->pcdata->pagelen); send_to_char (buf, ch); return; } } if (update == -1 || update == 4) { sprintf (buf, "\x1B[4;1f\x1B[KAct: \x1B[1;32m%s\x1B[5;1f\x1B[K\x1B[37;0mAct: \x1B[1;31m%s \x1B[37m%s \x1B[1;30m%s\x1B[37;0m", act_bit_name (victim->act), act3_bit_name (victim->act3), act4_bit_name (victim->act4), race_bit_name (victim->race_hate)); send_to_char (buf, ch); sprintf (buf, "\x1B[4;50fMaxIW: %d", victim->max_in_world); send_to_char (buf, ch); if (victim->height == -1) sprintf (buf, "\x1B[5;49fHeight: <Autocalc>"); else sprintf (buf, "\x1B[5;49fHeight: \x1B[1;37m%d\x1B[37;0m (%d' %d\")", victim->height, victim->height / 12, victim->height % 12); send_to_char (buf, ch); if (update != -1) { sprintf (buf, "\x1B[%d;1f\x1B[K", ch->pcdata->pagelen); send_to_char (buf, ch); return; } } /*Aff: detect-invis detect-hidden */ if (update == -1 || update == 5) { sprintf (buf, "\x1B[6;1f\x1B[KAff: \x1B[1m%s \x1B[1;33m%s\x1B[0m\n\r", affect_bit_name (victim->affected_by), affect_bit_name_two (victim->more_affected_by)); send_to_char (buf, ch); if (update != -1) { sprintf (buf, "\x1B[%d;1f\x1B[K", ch->pcdata->pagelen); send_to_char (buf, ch); return; } } /*Guarding: -1 Yell#: 13 Willhelp: 1 in 0 Attack: punch [Human(oid)] */ if (update == -1 || update == 6) { char minibuf[200]; if (victim->attackname && str_cmp ("N/A", victim->attackname)) sprintf (minibuf, "%s", victim->attackname); else sprintf (minibuf, "%s", mob_type_attack (victim->mobtype)); sprintf (buf, "\x1B[7;1f\x1B[KGuards: \x1B[1m%-2d\x1B[0m Yell:\x1B[1m%-2d\x1B[0m Helps: 1/\x1B[1m%-2d\x1B[0m Attack: \x1B[1m%s\x1B[0m[\x1B[1;34m%s\x1B[37;0m]", victim->guard, victim->yeller_number, victim->will_help, minibuf, mob_type_name (victim->mobtype)); send_to_char (buf, ch); if (update != -1) { sprintf (buf, "\x1B[%d;1f\x1B[K", ch->pcdata->pagelen); send_to_char (buf, ch); return; } } /*Long 'Joe blow stands here, guarding the eastern gate with his life!' */ if (update == -1 || update == 7) { sprintf (buf, "\x1B[8;1f\x1B[KLong: %s", victim->long_descr); send_to_char (buf, ch); if (update != -1) { sprintf (buf, "\x1B[%d;1f\x1B[K", ch->pcdata->pagelen); send_to_char (buf, ch); return; } } send_to_char ("\x1B[1;31m-----------------------------------------------------------------------------\x1B[37;0m\n\r", ch); sprintf (buf, "\x1B[%d;1f\x1B[K", ch->pcdata->pagelen); send_to_char (buf, ch); return; } void do_mindexc (CHAR_DATA * ch, char *argy, bool windowed) { bool f1 = FALSE; char buf[STD_LENGTH]; char arg[SML_LENGTH]; MOB_PROTOTYPE *victim; int cnt; int linect; one_argy (argy, arg); if (arg[0] == '\0') { send_to_char ("Mindex whom?\n\r", ch); return; } if ((victim = get_mob_index (atoi (arg))) == NULL) { send_to_char ("Invalid mob index VNUM.\n\r", ch); return; } if (LEVEL (ch) > IMM_LEVEL && LEVEL (ch) < MAX_LEVEL && victim->area->open != 0) { send_to_char ("Due to cheat reasons, you cannot mindex open areas' mobs.\n\r", ch); return; } linect = 0; sprintf (buf, "Name (Keywords): '\x1B[1m%s\x1B[0m' (%d)\n\r", victim->name,victim->points); send_to_char (buf, ch); linect++; if (!windowed) { sprintf (buf, "Area %d: '\x1B[1m%s\x1B[0m'\n\r", victim->area->vnum, victim->area->name); send_to_char (buf, ch); } if (victim->race_hate != 0) { sprintf (buf, "Race_hate: \x1B[1m%s\x1B[0m\n\r", race_bit_name (victim->race_hate)); send_to_char (buf, ch); linect++; } if (victim->yeller_number != 0) { if (windowed) sprintf (buf, "\x1B[sYell #: \x1B[1m%d\x1B[0m (Willhelp 1 in %d) 0=never.\x1B[u", victim->yeller_number, victim->will_help); else sprintf (buf, "Yeller_number: \x1B[1m%d\x1B[0m (Will_help chance: 1 in %d) <-- 0 means never.\n\r", victim->yeller_number, victim->will_help); send_to_char (buf, ch); linect++; } sprintf (buf, "Act: \x1B[1m%s\x1B[0m\n\r", act_bit_name (victim->act)); send_to_char (buf, ch); linect++; if (victim->act3 != 0) { if (victim->act4 == 0) sprintf (buf, "Act3: \x1B[1m%s\x1B[0m\n\r", act3_bit_name (victim->act3)); else sprintf (buf, "Act3: \x1B[1m%s\x1B[0m Act4: \x1B[1m%s\x1B[0m\n\r", act3_bit_name (victim->act3), act4_bit_name (victim->act4)); send_to_char (buf, ch); linect++; } if (victim->act4 != 0 && victim->act3 == 0) { sprintf (buf, "Act4: \x1B[1m%s\x1B[0m\n\r", act4_bit_name (victim->act4)); send_to_char (buf, ch); linect++; } if (victim->height == -1) sprintf (buf, "Height: <Autocalc>\n\r"); else sprintf (buf, "Height: \x1B[1;37m%d\x1B[37;0m (%d' %d\")", victim->height, victim->height / 12, victim->height % 12); send_to_char (buf, ch); if (victim->guard != -1) { if (str_cmp ("N/A", victim->attackname) && victim->attackname != NULL) sprintf (buf, "Guarding: \x1B[1m%d\x1B[0m Attack String: %s\n\r", victim->guard, victim->attackname); else sprintf (buf, "Guarding: \x1B[1m%d\x1B[0m\n\r", victim->guard); send_to_char (buf, ch); linect++; } if (victim->attackname && str_cmp ("N/A", victim->attackname) && victim->guard == -1) { sprintf (buf, "Attack String: %s\n\r", victim->attackname); send_to_char (buf, ch); } sprintf (buf, "Vnum: \x1B[1m%d\x1B[0m Kills this Reboot: \x1B[1m%d\x1B[0m Sex: \x1B[1m%s\x1B[0m\n\r", victim->vnum, victim->killed, victim->sex == SEX_MALE ? "male" : victim->sex == SEX_FEMALE ? "female" : "neutral"); send_to_char (buf, ch); linect++; sprintf (buf, "Level: \x1B[1m%d\x1B[0m Align: \x1B[1m%d\x1B[0m Money: \x1B[1m%d\x1B[0m\n\r", victim->level, victim->alignment, victim->money); send_to_char (buf, ch); linect++; if (victim->affected_by != 0) { sprintf (buf, "Affected by: \x1B[1m%s\x1B[0m\n\r", affect_bit_name (victim->affected_by)); send_to_char (buf, ch); linect++; } if (victim->more_affected_by != 0) { sprintf (buf, "Also affected by: \x1B[1m%s\x1B[0m\n\r", affect_bit_name_two (victim->more_affected_by)); send_to_char (buf, ch); linect++; } sprintf (buf, "Short description: \x1B[1m%s\x1B[0m\n\rLong description:\n\r\x1B[1m%s\x1B[0m", victim->short_descr, victim->long_descr); send_to_char (buf, ch); linect += 2; if (victim->clan_guard_1 != 0 || victim->clan_guard_2 != 0) { sprintf (buf, "ClanGuard #%d. Sect/Religion Guard #%d.\n\r", victim->clan_guard_1, victim->clan_guard_2); send_to_char (buf, ch); linect++; } if (victim->mobtype >= 0 && victim->mobtype < MAX_MOB_TYPE) { sprintf (buf, "Category: \x1B[1m%s.\x1B[0m\n\r", mob_type_name (victim->mobtype)); send_to_char (buf, ch); linect++; } if (victim->alt_vnum != 0 /*victim->mobtype == MOB_LYCAN */ ) { sprintf (buf, "This mob will transform into mob vnum %d\n\r", victim->alt_vnum); send_to_char (buf, ch); linect++; } if (victim->hpmult != 10) { if (victim->hpmult > 1000) { sprintf (buf, "This mob will have %d0%% norm exp and %2.1f times norm hp.\n\r", (victim->hpmult / 1000), ((double) (victim->hpmult % 1000) / (double) 10)); } else { sprintf (buf, "This mob will have %2.1f times its normal hp.\n\r", (double) victim->hpmult / (double) 10); } send_to_char (buf, ch); linect++; } if (victim->hitroll > 0) { sprintf (buf, "Hitroll: %d. ", victim->hitroll); send_to_char (buf, ch); f1 = TRUE; } if (victim->damroll != 0) { sprintf (buf, "Damroll: %d. ", victim->damroll); send_to_char (buf, ch); f1 = TRUE; } if (victim->dodge > 0) { sprintf (buf, "Dodge: %d. ", victim->dodge); send_to_char (buf, ch); f1 = TRUE; } if (victim->parry > 0) { sprintf (buf, "Parry: %d. ", victim->parry); send_to_char (buf, ch); f1 = TRUE; } if (f1) { send_to_char ("\n\r", ch); linect++; } if (victim->spec_fun != NULL) { sprintf (buf, "Spec fun: \x1B[1m%s\x1B[0m ", victim->spec_name); send_to_char (buf, ch); } /*send_to_char("ARMOR <num> changes armor class... ARMOR 101 means auto-calculate.\n\r",ch); */ if (victim->armcls == 101) { send_to_char ("Armor Class Automatically Calculated.\n\r", ch); linect++; } else { sprintf (buf, "Armor Class: (%d)\n\r", victim->armcls); send_to_char (buf, ch); linect++; } if(victim->opt) { sprintf(buf, "Summons: \x1b[1;31m%d\x1b[0;37m, Avenged by: \x1b[1;32m%d\x1b[0;37m.\n\r", victim->opt->summons, victim->opt->avenger); send_to_char(buf, ch); linect++; } if (IS_SET (victim->act, ACT_PRACTICE) && victim->opt) { SPELL_DATA *spell; send_to_char ("Skills Taught: ", ch); cnt = 0; while (victim->opt->skltaught[cnt] != 0) { if (victim->opt->skltaught[cnt] == 0) sprintf (buf, "None\n\r"); else { sprintf (buf, "%d: ", victim->opt->skltaught[cnt]); send_to_char (buf, ch); if ((spell = skill_lookup (NULL, victim->opt->skltaught[cnt])) == NULL) { send_to_char ("BAD SPELL/SKILL TAUGHT!!\n\r", ch); } else { sprintf (buf, "(%s) ", spell->spell_funky_name); send_to_char (buf, ch); } } cnt++; linect += 3; } send_to_char ("\n\r", ch); } if (victim->opt) { short i; short col = 1; char buff[100]; for (i = 0; i < 10; i++) { if (victim->opt->cast_spells[i] != NULL) { if (col == 3) { col = 1; send_to_char ("\n\r", ch); } sprintf (buff, "Casts %-30s", victim->opt->cast_spells[i]); send_to_char (buff, ch); col++; } } if (col != 1) send_to_char ("\n\r", ch); sprintf (buff, "Cast_P = %d. Warrior_P = %d. \n\r", victim->opt->cast_percent, victim->opt->warrior_percent); send_to_char (buff, ch); } if (victim->pShop != NULL) { SHOP_DATA *pShop; int iTrade; pShop = victim->pShop; sprintf (buf, "Shop data (for %d):\n\r People buy at %d%%, and sell at %d%%.\n\r", pShop->keeper, pShop->profit_buy, pShop->profit_sell); send_to_char (buf, ch); linect++; sprintf (buf, " Opens at %d, closes at %d (also closed at 12 noon).\n\r", pShop->open_hour, pShop->close_hour); send_to_char (buf, ch); linect++; sprintf (buf, " Decrease in amount paid for specific item by %d percent aftr %d items.\n\r", pShop->decrease, pShop->items_until_decrease); send_to_char (buf, ch); linect++; if (pShop->creates_vnum != 0) { sprintf (buf, " This shop creates item vnum %d every %d game hour%s.\n\r", pShop->creates_vnum, pShop->creates_hours, (pShop->creates_hours == 1 ? "" : "s")); send_to_char (buf, ch); linect++; sprintf (buf, " Message: %s\n\r", (pShop->creates_message == NULL ? "(No message)" : pShop->creates_message)); send_to_char (buf, ch); linect++; } for (iTrade = 0; iTrade < MAX_TRADE; iTrade++) { if (pShop->buy_type[iTrade] != ITEM_NONE) { sprintf (buf, " Buys %ss (#%d)\n\r", item_type_name (pShop->buy_type[iTrade]), iTrade); send_to_char (buf, ch); linect++; } } } return; } void do_oindex (CHAR_DATA * ch, char *argy) { char buf[STD_LENGTH]; char arg[SML_LENGTH]; char tmps[500]; AFFECT_DATA *paf; OBJ_PROTOTYPE *obj; DEFINE_COMMAND ("oindex", do_oindex, POSITION_DEAD, MAX_LEVEL, LOG_NORMAL, "This command allows you to view a complete object prototype.") one_argy (argy, arg); if (arg[0] == '\0') { send_to_char ("Oindex what?\n\r", ch); return; } if ((obj = get_obj_index (atoi (arg))) == NULL) { send_to_char ("Invalid VNUM reference.\n\r", ch); return; } if (LEVEL (ch) > IMM_LEVEL && LEVEL (ch) < MAX_LEVEL && obj->area->open != 0) { send_to_char ("Due to cheat reasons, you cannot oindex open areas' objects.\n\r", ch); return; } if (obj->made_of==0) { tmps[0]='\0'; } else { sprintf(tmps,"(%d : \x1B[1;37m%s\x1B[37;0m)",obj->made_of, materials[obj->made_of-1].name); } sprintf (buf, "Name: '%s' %s\n\rArea %d: '%s'\n\r", obj->name, tmps, obj->area->vnum, obj->area->name); send_to_char (buf, ch); sprintf (buf, "Vnum: %d\n\rType: %s\n\r", obj->vnum, item_type_name (obj->item_type)); send_to_char (buf, ch); sprintf (buf, "Short description: %s\x1B[0m\n\rLong description: %s\x1B[0m", obj->short_descr, obj->description); send_to_char (buf, ch); sprintf (buf, "Wear flags: %s\n\rExtra flags: %s\n\rGuild Flags: %s\n\r", wear_bit_name (obj->wear_flags), extra_bit_name (obj->extra_flags), item_guild_bit_name(obj->guild_flags)); send_to_char (buf, ch); sprintf (buf, "Weight: %d Cost: %d Timer: %d\n\r", obj->weight, obj->cost, obj->timer); send_to_char (buf, ch); if (obj->max_in_room != 1) { sprintf (buf, "Max of this object that pops in a room before no more pop: %d\n\r", obj->max_in_room); send_to_char (buf, ch); } if (obj->value[10] != 0) { int i; bool prev = FALSE; send_to_char ("Guild(s) Required:", ch); for (i=0;str_cmp(guild_data[i].what_you_type, "end_of_list");i++) { if (IS_SET(obj->value[10], guild_data[i].mob_guildmaster_bit)) { if (prev) send_to_char(",", ch); sprintf(buf, guild_data[i].what_you_see); send_to_char(buf, ch); prev = TRUE; } } send_to_char ("\n\r", ch); } sprintf (buf, "Values: %d %d %d %d %d %d %d %d %d %d.\n\r", obj->value[0], obj->value[1], obj->value[2], obj->value[3], obj->value[4], obj->value[5], obj->value[6], obj->value[7], obj->value[8], obj->value[9]); send_to_char (buf, ch); if (obj->item_type == ITEM_ARMOR) { send_to_char ("v0 - Leg AC, v1 - Body AC, v2 - Head AC, v3 - Arm AC,\n\r", ch); send_to_char ("v4 - Pound rating. 10 = normal, 15 = 1.5x protection against pound, etc.\n\r", ch); send_to_char (" 5 = .5x protection against pounding weapons. Same for slash/pierce.\n\r", ch); send_to_char ("v5 - Slash rating, v6 - Max condition, v7 - Condition Now, v8 - Pierce rating,\n\r", ch); send_to_char ("v9 - Warmth\n\r", ch); } if (obj->extra_descr != NULL) { DESCRIPTION_DATA *ed; send_to_char ("Extra description keywords: ", ch); for (ed = obj->extra_descr; ed != NULL; ed = ed->next) { send_to_char ("'", ch); send_to_char (ed->keyword, ch); send_to_char ("'", ch); } send_to_char ("\n\r", ch); } for (paf = obj->affected; paf != NULL; paf = paf->next) { sprintf (buf, "Affects %s by %d.\n\r", affect_loc_name (paf->location), paf->modifier); send_to_char (buf, ch); } return; } void display_resets (CHAR_DATA * ch) { char final[STD_LENGTH]; char buf[STD_LENGTH]; ROOM_DATA *pRoom = ch->in_room; RESET_DATA *pReset; MOB_PROTOTYPE *pMob = NULL; MOB_PROTOTYPE *LastMob = NULL; OBJ_PROTOTYPE *obj = NULL; OBJ_PROTOTYPE *LastObj = NULL; OBJ_PROTOTYPE *LastObjPrev = NULL; MOB_PROTOTYPE *pMobIndex; OBJ_PROTOTYPE *pObjIndex; bool last; int iReset = 0; int olevel = 2; if (pRoom == NULL) return; pMob = NULL; last = TRUE; final[0] = '\0'; if (!pRoom->more) { send_to_char ("No resets here.\n\r", ch); return; } for (pReset = pRoom->more->reset_first; pReset != NULL; pReset = pReset->next) { send_to_char (final, ch); final[0] = '\0'; sprintf (final, "\x1B[1m%2d\x1B[0m- ", ++iReset); switch (pReset->command) { default: strcat (final, "Invalid Reset Command\n\r"); break; case 'M': if ((pMobIndex = get_mob_index (pReset->rs_vnum)) == NULL) { sprintf (buf, "Load Mobile - Bad Vnum %d - DELETE ME!\n\r", pReset->rs_vnum); strcat (final, buf); continue; } pMob = pMobIndex; sprintf (buf, "Loads \x1B[1m%s\x1B[0m (\x1B[1;36m%d\x1B[0m) in room (max \x1B[1;32m%d\x1B[0m at \x1B[1;32m%d%%\x1B[0m chance)\n\r", pMob->short_descr, pReset->rs_vnum, pReset->loc, pReset->percent); strcat (final, buf); LastObj = NULL; LastObjPrev = NULL; LastMob = pMob; olevel = pMob->level; break; case 'O': if ((pObjIndex = get_obj_index (pReset->rs_vnum)) == NULL) { sprintf (buf, "Load Object - Bad Vnum %d - DELETE ME!\n\r", pReset->rs_vnum); strcat (final, buf); continue; } obj = pObjIndex; if (pReset->loc == RESET_LOC_INOBJ && LastObj != NULL) { sprintf (buf, " Loads \x1B[0m%s\x1B[0m (\x1B[1m%d\x1B[0m) inside %s\x1B[0m", obj->short_descr, pReset->rs_vnum, LastObj ? LastObj->short_descr : "!NO OBJ!"); strcat (final, buf); } else if (pReset->loc == RESET_LOC_PREVOBJ) { sprintf (buf, "Drops out to %s\x1B[0m\n\r", LastObjPrev ? LastObjPrev->short_descr : "!NO OBJ!"); strcat (final, buf); LastObj = LastObjPrev; LastObjPrev = NULL; } else if (pReset->loc == RESET_LOC_ONOBJ && LastObj != NULL) { sprintf (buf, " Loads %s\x1B[0m (\x1B[1m%d\x1B[0m) on top of %s\x1B[0m", obj->short_descr, pReset->rs_vnum, LastObj ? LastObj->short_descr : "!NO OBJ!"); strcat (final, buf); } else if (pReset->loc == RESET_LOC_INROOM) { sprintf (buf, " Loads %s\x1B[0m (\x1B[1m%d\x1B[0m) in room", obj->short_descr, pReset->rs_vnum); strcat (final, buf); } else if (LastMob != NULL) { if (LastMob->pShop == NULL) sprintf (buf, " Loads %s\x1B[0m (\x1B[1m%d\x1B[0m) on \x1B[1;36m%s\x1B[0m of \x1B[1m%s\x1B[0m", obj->short_descr, pReset->rs_vnum, wear_loc_name (pReset->loc), LastMob ? LastMob->short_descr : "!NO MOB!"); else sprintf (buf, " Loads %s\x1B[0m (\x1B[1m%d\x1B[0m) times \x1B[1;36m%d\x1B[0m of \x1B[1m%s\x1B[0m", obj->short_descr, pReset->rs_vnum, pReset->loc, LastMob ? LastMob->short_descr : "!NO MOB!"); strcat (final, buf); } else strcat (final, "Incorrect Assignment of Object\n\r"); if (!strstr (final, "Incorrect") && !strstr (final, "Drop")) { sprintf (buf, " \x1B[1;31m%d%%\x1B[0m chance\n\r", pReset->percent); strcat (final, buf); } if (LastObj == NULL || obj->item_type == ITEM_CONTAINER) { LastObjPrev = LastObj; LastObj = obj; } break; } } send_to_char (final, ch); final[0] = '\0'; return; } void check_reset (CHAR_DATA * ch, RESET_DATA * pReset) { return; } void add_reset (ROOM_DATA * room, RESET_DATA * pReset, int index) { RESET_DATA *reset; int iReset = 0; check_room_more (room); if (room->more->reset_first == NULL) { room->more->reset_first = pReset; room->more->reset_last = pReset; pReset->next = NULL; return; } index--; if (index == 0) { pReset->next = room->more->reset_first; room->more->reset_first = pReset; return; } for (reset = room->more->reset_first; reset->next != NULL; reset = reset->next) { if (++iReset == index) break; } pReset->next = reset->next; reset->next = pReset; if (pReset->next == NULL) room->more->reset_last = pReset; return; } void do_resets (CHAR_DATA * ch, char *argy) { char arg1[SML_LENGTH]; char arg2[SML_LENGTH]; char arg3[SML_LENGTH]; char arg4[SML_LENGTH]; char arg5[SML_LENGTH]; char arg6[SML_LENGTH]; char arg7[SML_LENGTH]; char arg8[SML_LENGTH]; char arg9[SML_LENGTH]; char arg10[SML_LENGTH]; RESET_DATA *pReset; AREA_DATA *pArea; int range1, range2, vnum; ROOM_DATA *oneroom; DEFINE_COMMAND ("resets", do_resets, POSITION_DEAD, IMM_LEVEL, LOG_NORMAL, "This command allows you to view or modify resets in the current room.") if (IS_MOB (ch)) return; if (LEVEL (ch) > IMM_LEVEL && !IS_REAL_GOD (ch) && ch->in_room->area->open == 1) return; pArea = ch->in_room->area; argy = one_argy (argy, arg1); argy = one_argy (argy, arg2); argy = one_argy (argy, arg3); if (is_number (arg1) && is_number (arg3) && !str_cmp (arg2, "objects")) { int pcnt = atoi (arg3); while (argy && argy[0] != '\0') { argy = one_argy (argy, arg4); pReset = new_reset_data (); pReset->command = 'O'; pReset->rs_vnum = atoi (arg4); pReset->loc = WEAR_NONE; pReset->percent = pcnt; add_reset (ch->in_room, pReset, atoi (arg1)); } send_to_char ("Resets added. Please check them.\n\r", ch); SET_BIT (pArea->area_flags, AREA_CHANGED); return; } argy = one_argy (argy, arg4); argy = one_argy (argy, arg5); argy = one_argy (argy, arg6); argy = one_argy (argy, arg7); argy = one_argy (argy, arg8); argy = one_argy (argy, arg9); argy = one_argy (argy, arg10); if (arg1[0] == '\0') { if (ch->in_room->more && ch->in_room->more->reset_first != NULL) { send_to_char ("Resets:\n\r", ch); display_resets (ch); } else send_to_char ("No resets in this room.\n\r", ch); } if (!IS_BUILDER (ch, ch->in_room->area)) { send_to_char ("Resets: Invalid security for editing this room.\n\r", ch); return; } if (!str_cmp (arg1, "area")) { if (!ch->in_room || !ch->in_room->area) return; range1 = ch->in_room->area->lvnum; range2 = ch->in_room->area->uvnum; for (vnum = range1; vnum <= range2; vnum++) if ((oneroom = get_room_index (vnum)) != NULL) reset_room (oneroom); send_to_char (ch->in_room->area->repop, ch); return; } if (!str_cmp (arg1, "room") && arg2[0] == '\0') { reset_room (ch->in_room); return; } if (is_number (arg1)) { ROOM_DATA *pRoom = ch->in_room; check_room_more (ch->in_room); if (!str_cmp (arg2, "delete")) { int insert_loc = atoi (arg1); if (ch->in_room->more->reset_first == NULL) { send_to_char ("No resets in this room.\n\r", ch); return; } if (insert_loc - 1 <= 0) { pReset = pRoom->more->reset_first; pRoom->more->reset_first = pRoom->more->reset_first->next; if (pRoom->more->reset_first == NULL) pRoom->more->reset_last = NULL; } else { int iReset = 0; RESET_DATA *prev = NULL; for (pReset = pRoom->more->reset_first; pReset != NULL; pReset = pReset->next) { if (++iReset == insert_loc) break; prev = pReset; } if (pReset == NULL) { send_to_char ("Reset not found.\n\r", ch); return; } if (prev != NULL) prev->next = prev->next->next; else pRoom->more->reset_first = pRoom->more->reset_first->next; for (pRoom->more->reset_last = pRoom->more->reset_first; pRoom->more->reset_last->next != NULL; pRoom->more->reset_last = pRoom->more->reset_last->next); } free_reset_data (pReset); SET_BIT (pArea->area_flags, AREA_CHANGED); send_to_char ("Reset deleted.\n\r", ch); } else if ((!str_cmp (arg2, "mob") && is_number (arg3)) || (!str_cmp (arg2, "obj") && is_number (arg3)) || !str_cmp (arg2, "back")) { pReset = new_reset_data (); if (!str_cmp (arg2, "mob")) { pReset->command = 'M'; pReset->rs_vnum = atoi (arg3); pReset->percent = is_number (arg4) ? atoi (arg4) : 75; pReset->loc = is_number (arg5) ? atoi (arg5) : 5; } else if (!str_cmp (arg2, "obj")) { pReset->command = 'O'; pReset->rs_vnum = atoi (arg3); if (!str_cmp (arg4, "inside") || !str_cmp (arg4, "in")) pReset->loc = RESET_LOC_INOBJ; else if (!str_cmp (arg4, "on")) pReset->loc = RESET_LOC_ONOBJ; else if (!str_cmp (arg4, "room")) pReset->loc = RESET_LOC_INROOM; else pReset->loc = wear_name_loc (arg4); pReset->percent = is_number (arg5) ? atoi (arg5) : 75; } else if (!str_cmp (arg2, "back")) { pReset->command = 'O'; pReset->vnum = 1; pReset->loc = RESET_LOC_PREVOBJ; pReset->percent = 100; } add_reset (ch->in_room, pReset, atoi (arg1)); SET_BIT (pArea->area_flags, AREA_CHANGED); send_to_char ("Reset added.\n\r", ch); } else { send_to_char ("Syntax: RESET <number> OBJ <vnum> <location> [chance]\n\r", ch); send_to_char (" RESET <number> MOB <vnum> [<chance ><max #>]\n\r", ch); send_to_char (" RESET <number> DELETE\n\r", ch); } } return; } void do_astat (CHAR_DATA * ch, char *argy) { char arg1[SML_LENGTH]; char buf[STD_LENGTH]; AREA_DATA *pArea; DEFINE_COMMAND ("astat", do_astat, POSITION_DEAD, MAX_LEVEL, LOG_NORMAL, "Shows the specified area's complete stats.") smash_tilde (argy); strcpy (arg1, argy); if (is_number (arg1)) pArea = get_area_data (atoi (arg1)); else pArea = ch->in_room->area; if (!pArea) pArea = ch->in_room->area; sprintf (buf, "Name: '%s'\n\r", pArea->name); send_to_char (buf, ch); sprintf (buf, "File: '%s'\n\r", pArea->filename); send_to_char (buf, ch); sprintf (buf, "Can_quit: %s\n\r", (pArea->can_quit == 1 ? "Players can quit anywhere in this area." : (pArea->can_quit == 2 ? "Players cannot quit in this area at all." : "Normal quit rules within this area."))); send_to_char (buf, ch); sprintf (buf, "Clan Zone? %s.\n\r", (pArea->clanzone ? "YES" : "NO")); send_to_char (buf, ch); sprintf (buf, "Players: %d\n\r", pArea->nplayer); send_to_char (buf, ch); sprintf (buf, "Descripted Rooms: %d Weather change: %d\n\r", pArea->desc_rooms, pArea->weather_change); send_to_char (buf, ch); sprintf (buf, "More_rainy: %s More_dry: %s More_foggy: %s Homeland: %s\n\r", (pArea->more_rainy ? "Yes" : "No"), (pArea->more_dry ? "Yes" : "No"), (pArea->more_fog ? "Yes" : "No"), (pArea->homeland? "Yes" : "No")); send_to_char (buf, ch); sprintf (buf, "Security: %d; Builders '%s'\n\r", pArea->security, pArea->builders); send_to_char (buf, ch); sprintf (buf, "Vnums: %d-%d\n\r", pArea->lvnum, pArea->uvnum); send_to_char (buf, ch); sprintf (buf, "Repop: %s\n\r", pArea->repop); send_to_char (buf, ch); sprintf (buf, "Flags: %s\n\r", area_bit_name (pArea->area_flags)); send_to_char (buf, ch); sprintf (buf, "Open: %s\n\r", (pArea->open ? "Yes" : "No")); send_to_char (buf, ch); sprintf (buf, "Room count: %d\n\r", pArea->room_count); send_to_char (buf, ch); sprintf (buf, "Mob count: %d\n\r", pArea->mob_count); send_to_char (buf, ch); sprintf (buf, "Obj count: %d\n\r", pArea->obj_count); send_to_char (buf, ch); sprintf (buf, "Repop: %d/%d\n\r", pArea->repop_counter, pArea->repop_rate); send_to_char (buf, ch); send_to_char(buf, ch); return; } void save_area_list () { FILE *fp; AREA_DATA *pArea; if ((fp = fopen ("playarea.lst", "w")) == NULL) { bug ("Save_area_list: fopen", 0); perror ("area.lst"); } else { fprintf (fp, "help.are\n"); for (pArea = area_first; pArea != NULL; pArea = pArea->next) { fprintf (fp, "%s\n", fix_string (pArea->filename)); } fprintf (fp, "$\n"); fclose (fp); } return; } char * fix_string (const char *str) { static char strfix[10000]; char *s = NULL; char *t; int i; int o; if (str == NULL) return '\0'; if (str[0] == 1) { s = decompress (str); } if (s) t = s; else t = str; for (o = i = 0; t[i + o] != '\0'; i++) { if (t[i + o] == '\r' || t[i + o] == '~') o++; strfix[i] = t[i + o]; } strfix[i] = '\0'; return strfix; } void save_mobiles (FILE * fp, AREA_DATA * pArea) { int iHash; MOB_PROTOTYPE *pMobIndex; int iTrade; int tmm; fprintf (fp, "#MOBDATA\n"); for (iHash = 0; iHash < HASH_MAX; iHash++) { for (pMobIndex = mob_index_hash[iHash]; pMobIndex != NULL; pMobIndex = pMobIndex->next) { if (pMobIndex != NULL && pMobIndex->area == pArea && pMobIndex->guard != -32000) { fprintf (fp, "#%d\n", pMobIndex->vnum); fprintf (fp, "Name %s~\n", fix_string (pMobIndex->name)); fprintf (fp, "Short %s~\n", fix_string (pMobIndex->short_descr)); fprintf (fp, "Long \n%s~\n", fix_string (pMobIndex->long_descr)); if(strlen(pMobIndex->description) > 20) fprintf (fp, "Descr\n%s~\n", fix_string (pMobIndex->description)); if (pMobIndex->attackname && str_cmp ("N/A", pMobIndex->attackname)) fprintf (fp, "Attackmsg %s~\n", fix_string (pMobIndex->attackname)); fprintf (fp, "AMax %d\n", pMobIndex->max_in_world); if (pMobIndex->points!=0) { fprintf(fp,"JPts %d\n",pMobIndex->points); } if (pMobIndex->yeller_number != 0) { fprintf (fp, "AYeller %d\n", pMobIndex->yeller_number); fprintf (fp, "AWillhelp %d\n", pMobIndex->will_help); } if (pMobIndex->height != -1) fprintf (fp, "NHeight %d\n", pMobIndex->height); if (pMobIndex->clan_guard_1 > 0) fprintf (fp, "AClan %d\n", pMobIndex->clan_guard_1); if (pMobIndex->clan_guard_2 > 0) fprintf (fp, "AClan2 %d\n", pMobIndex->clan_guard_2); if (pMobIndex->act != 0) fprintf (fp, "ActBits %d\n", pMobIndex->act); if (pMobIndex->act3 != 0) fprintf (fp, "ActBits3 %d\n", pMobIndex->act3); if (pMobIndex->act4 != 0) fprintf (fp, "ActBits4 %d\n", pMobIndex->act4); if (pMobIndex->affected_by != 0) fprintf (fp, "Affect_By %d\n", pMobIndex->affected_by); if (pMobIndex->more_affected_by != 0) fprintf (fp, "AffectTWO %d\n", pMobIndex->more_affected_by); if (pMobIndex->alignment != 0) fprintf (fp, "Alignment %d\n", pMobIndex->alignment); if (pMobIndex->money != 0) fprintf (fp, "Money %d\n", pMobIndex->money); fprintf (fp, "Level %d\n", pMobIndex->level); if (pMobIndex->sex != 0) fprintf (fp, "Sex %d\n", pMobIndex->sex); if (pMobIndex->mobtype != -1) fprintf (fp, "MobType %d\n", pMobIndex->mobtype); if (pMobIndex->alt_vnum != 0) fprintf (fp, "Alt_vnum %d\n", pMobIndex->alt_vnum); if (pMobIndex->hpmult != 10) fprintf (fp, "Hp %d\n", pMobIndex->hpmult); if (pMobIndex->guard != -1) fprintf (fp, "Guard %d\n", pMobIndex->guard); if (pMobIndex->hitroll != 0) fprintf (fp, "GHitR %d\n", pMobIndex->hitroll); if (pMobIndex->damroll != 0) fprintf (fp, "GDamR %d\n", pMobIndex->damroll); if (pMobIndex->dodge != 0) fprintf (fp, "GDod %d\n", pMobIndex->dodge); if (pMobIndex->parry != 0) fprintf (fp, "GPar %d\n", pMobIndex->parry); if (pMobIndex->spec_fun != NULL) fprintf (fp, "Spec %s\n", fix_string (pMobIndex->spec_name)); if (pMobIndex->pShop != NULL) { fprintf (fp, "Shop "); for (iTrade = 0; iTrade < MAX_TRADE; iTrade++) { fprintf (fp, "%4d", pMobIndex->pShop->buy_type[iTrade]); } fprintf (fp, " %d %d %d %d\n", pMobIndex->pShop->profit_buy, pMobIndex->pShop->profit_sell, pMobIndex->pShop->open_hour, pMobIndex->pShop->close_hour); fprintf (fp, "Shopd2 %d\n", pMobIndex->pShop->decrease); fprintf (fp, "Shopd3 %d\n", pMobIndex->pShop->items_until_decrease); if (pMobIndex->pShop->creates_vnum != 0) fprintf (fp, "ShopCr %d\n", pMobIndex->pShop->creates_vnum); if (pMobIndex->pShop->creates_message != NULL) fprintf (fp, "ShopCS %s~\n", fix_string (pMobIndex->pShop->creates_message)); if (pMobIndex->pShop->creates_hours != 1) fprintf (fp, "ShCrh %d\n", pMobIndex->pShop->creates_hours); } if (pMobIndex->race_hate != 0) fprintf (fp, "RaceHate %d\n", pMobIndex->race_hate); if (pMobIndex->armcls != 101) fprintf (fp, "ArmorClass %d\n", pMobIndex->armcls); if (pMobIndex->opt) { tmm = 0; while (tmm < 3) { if (pMobIndex->opt->cast_spells[tmm] != NULL) { fprintf (fp, "BCasts %s~\n", fix_string (pMobIndex->opt->cast_spells[tmm])); } tmm++; } if (pMobIndex->opt->cast_percent > 0) { fprintf (fp, "BCast_P %d\n", pMobIndex->opt->cast_percent); } if (pMobIndex->opt->avenger > 0) { fprintf(fp, "Avngr %d\n", pMobIndex->opt->avenger); } if (pMobIndex->opt->summons > 0) { fprintf(fp, "Smns %d\n", pMobIndex->opt->summons); } tmm = 0; while (tmm < 30) { if (pMobIndex->opt->skltaught[tmm] != 0) { fprintf (fp, "ASklTaught %d %d\n", tmm, pMobIndex->opt->skltaught[tmm]); } tmm++; } } fprintf (fp, "End\n\n"); } } } fprintf (fp, "#0\n\n\n\n"); return; } void save_objects (FILE * fp, AREA_DATA * pArea) { int iHash; OBJ_PROTOTYPE *pObjIndex; AFFECT_DATA *pAf; DESCRIPTION_DATA *pEd; int tmpi; bool fnd; fprintf (fp, "#OBJDATA\n"); for (iHash = 0; iHash < HASH_MAX; iHash++) { for (pObjIndex = obj_index_hash[iHash]; pObjIndex != NULL; pObjIndex = pObjIndex->next) { if (pObjIndex != NULL && pObjIndex->area == pArea && pObjIndex->item_type != 99999) { fprintf (fp, "#%d\n", pObjIndex->vnum); fprintf (fp, "Name %s~\n", fix_string (pObjIndex->name)); fprintf (fp, "Short %s~\n", fix_string (pObjIndex->short_descr)); if (pObjIndex->made_of!=0) { fprintf(fp,"DMat %d\n",pObjIndex->made_of); } fprintf (fp, "Descr\n%s~\n", fix_string (pObjIndex->description)); fprintf (fp, "Type %d\n", pObjIndex->item_type); if (pObjIndex->extra_flags != 0) fprintf (fp, "Extra %lld\n", pObjIndex->extra_flags); if (pObjIndex->guild_flags != 0) fprintf (fp, "Guild %d\n", pObjIndex->guild_flags); if (pObjIndex->max_in_room != 1) fprintf (fp, "Maxinroom %d\n", pObjIndex->max_in_room); fprintf (fp, "Wear %d\n", pObjIndex->wear_flags); if (pObjIndex->timer != 0) fprintf (fp, "Timer %d\n", pObjIndex->timer); fnd = FALSE; for (tmpi = 0; tmpi < 11; tmpi++) if (pObjIndex->value[tmpi] != 0) { fnd = TRUE; break; } if (fnd) { fprintf (fp, "Values %d %d %d %d %d %d %d %d %d %d %d\n", pObjIndex->value[0], pObjIndex->value[1], pObjIndex->value[2], pObjIndex->value[3], pObjIndex->value[4], pObjIndex->value[5], pObjIndex->value[6], pObjIndex->value[7], pObjIndex->value[8], pObjIndex->value[9], pObjIndex->value[10]); } /*end if fnd */ fprintf (fp, "Weight %d\n", pObjIndex->weight); fprintf (fp, "Cost %d\n", pObjIndex->cost); for (pAf = pObjIndex->affected; pAf != NULL; pAf = pAf->next) { fprintf (fp, "Affect %d %d %d %d %d\n", pAf->location, pAf->modifier, pAf->type, pAf->duration, pAf->bitvector); } for (pEd = pObjIndex->extra_descr; pEd != NULL; pEd = pEd->next) { fprintf (fp, "ExtraDescr %s~\n%s~\n", pEd->keyword, pEd->description); } fprintf (fp, "End\n\n"); } } } fprintf (fp, "#0\n\n\n\n"); return; } void save_rooms (FILE * fp, AREA_DATA * pArea) { int iHash; ROOM_DATA *oneroom; DESCRIPTION_DATA *pEd; RESET_DATA *pReset; EXIT_DATA *pExit; int door; fprintf (fp, "#ROOMDATA\n"); for (iHash = 0; iHash < HASH_MAX; iHash++) { for (oneroom = room_hash[iHash]; oneroom != NULL; oneroom = oneroom->next) { if ((!oneroom->more || (oneroom->more && oneroom->area != NULL)) && oneroom->area == pArea) { fprintf (fp, "#%d\n", oneroom->vnum); fprintf (fp, "Name %s~\n", fix_string (oneroom->name)); if (oneroom->a != '\0') fprintf (fp, "NAP %d\n", oneroom->a); if (oneroom->c != '\0') fprintf (fp, "NAC %d\n", oneroom->c); if (oneroom->description == NULL) oneroom->description = str_dup ("Blank Description."); if (oneroom->cvnumh != 0) fprintf (fp, "Cvnumh %d\n", oneroom->cvnumh); if (oneroom->cvnuml != 0) fprintf (fp, "Cvnuml %d\n", oneroom->cvnuml); if (oneroom->calign != 0) fprintf (fp, "Calign %d\n", oneroom->calign); if (oneroom->cbonusstr != NULL) fprintf (fp, "Cbonusstr %s~\n", oneroom->cbonusstr); fprintf (fp, "Descr\n%s~\n", fix_string (oneroom->description)); if (oneroom->room_flags2 != 0) fprintf (fp, "Flags2 %d\n", oneroom->room_flags2); if (oneroom->room_flags != 0) fprintf (fp, "Flags %d\n", oneroom->room_flags); if (oneroom->shade) fprintf (fp, "Shd %d\n", oneroom->shade); if (oneroom->sector_type != 1) fprintf (fp, "Sector %d\n", oneroom->sector_type); if (oneroom->more) for (pEd = oneroom->more->extra_descr; pEd != NULL; pEd = pEd->next) { fprintf (fp, "ExtraDescr %s~\n%s~\n", pEd->keyword, pEd->description); } if (oneroom->more) for (pReset = oneroom->more->reset_first; pReset != NULL; pReset = pReset->next) { if (pReset != NULL) { fprintf (fp, "Reset %c %d %d %d\n", pReset->command, pReset->rs_vnum, pReset->loc, pReset->percent); } } if (oneroom->more) { if (oneroom->more->move_dir != 0) fprintf (fp, "Move_dir %d\n", oneroom->more->move_dir); if (oneroom->more->move_message && str_cmp (oneroom->more->move_message, "None.") && oneroom->more->move_message[0] != '\0' && strlen(oneroom->more->move_message) > 5) fprintf (fp, "Movemess\n%s~\n", fix_string (oneroom->more->move_message)); } for (door = 0; door <= 5; door++) { if ((pExit = oneroom->exit[door]) != NULL /*&& pExit->vnum > 0 && get_room_index( pExit->vnum ) != NULL */ ) { fprintf (fp, "Door %d %d %d %d %d %d\n", door, (pExit->d_info ? pExit->d_info->rs_flags : 0), (pExit->d_info ? pExit->d_info->key : 0), (pExit->to_room == NULL ? 0 : ((ROOM_DATA *) pExit->to_room)->vnum), (pExit->d_info ? pExit->d_info->maxstr : 0), (pExit->d_info ? pExit->d_info->maxstr : 0)); if (pExit->d_info && pExit->d_info->description == NULL) pExit->d_info->description = str_dup (""); if (pExit->d_info) fprintf (fp, "%s~\n", fix_string (pExit->d_info->description)); else fprintf (fp, "~\n"); if (pExit->d_info) { if (pExit->d_info->keyword == NULL) fprintf (fp, "~\n"); else fprintf (fp, "%s~\n", fix_string (pExit->d_info->keyword)); } else fprintf (fp, "~\n"); } } fprintf (fp, "End\n\n"); } } } fprintf (fp, "#0\n\n\n\n"); return; } void save_area (AREA_DATA * pArea) { FILE *fp; if ((fp = fopen (pArea->filename, "w")) == NULL) { bug ("Open_area: fopen", 0); perror (pArea->filename); } fprintf (fp, "#AREADATA \n"); fprintf (fp, "Name %s~\n", pArea->name); fprintf (fp, "Repop %s~\n", fix_string (pArea->repop)); if (pArea->repop_rate != 55) fprintf (fp, "SRepop %d\n", pArea->repop_rate); fprintf (fp, "SCZone %d\n", pArea->clanzone); fprintf (fp, "Builders %s~\n", fix_string (pArea->builders)); fprintf (fp, "VNUMs %d %d\n", pArea->lvnum, pArea->uvnum); fprintf (fp, "NQuit %d\n", pArea->can_quit); fprintf (fp, "Open %d\n", pArea->open); fprintf(fp, "Homeland %d\n", pArea->homeland); fprintf (fp, "End\n\n\n\n"); save_mobiles (fp, pArea); save_objects (fp, pArea); save_rooms (fp, pArea); fprintf (fp, "#$\n"); fclose (fp); return; } void save_playerbase (void) { FILE *fp; PLAYERBASE_DATA *player; if ((fp = fopen ("pbase.dat", "w")) == NULL) { fprintf (stderr, "Error on playerbase write.\n"); exit (2); } for (player = playerbase_zero; player != NULL; player = player->next) { if (player->player_level == -1) continue; fprintf (fp, "%s\n", player->player_name); fprintf (fp, "%s\n", player->email_address); fprintf (fp, "%ld\n", player->player_last_login); fprintf (fp, "%d\n", player->player_align); fprintf (fp, "%d\n", player->player_level); fprintf (fp, "%d\n", player->player_nodelete); fprintf (fp, "%d\n", player->player_remort_times); fprintf(fp, "%ld\n", player->player_created); } fprintf (fp, "\nEND\n"); fclose (fp); return; } void save_topten (void) { FILE *fp; int k; if ((fp = fopen ("topten.dat", "w")) == NULL) { fprintf (stderr, "Error on topten write.\n"); exit (2); } for (k = 0; k < MAX_TOPTEN; k++) { fprintf (fp, "%s\n", topten.topten_name[k]); fprintf (fp, "%d\n", topten.topten_warpoints[k]); fprintf (fp, "%d\n", topten.topten_alignment[k]); } fprintf (fp, "\nEND\n"); fclose (fp); return; } void save_rating (void) { FILE *fp; int k; if ((fp = fopen ("rating.dat", "w")) == NULL) { fprintf (stderr, "Error on rating write.\n"); exit (2); } for (k = 0; k < MAX_RATING; k++) { fprintf (fp, "%s\n", ratingd.rating_name[k]); fprintf (fp, "%d\n", ratingd.rating_rating[k]); fprintf (fp, "%d\n", ratingd.rating_alignment[k]); } fprintf (fp, "\nEND\n"); fclose (fp); return; } void save_pkdata (void) { FILE *fp; int k, i; if ((fp = fopen ("pkdata.dat", "w")) == NULL) { fprintf (stderr, "Error on pkdata write.\n"); exit (2); } for (k = 0; k < MAX_PKDATA; k++) { for (i=0; i < PKN; i++) { int tempval; fprintf (fp, "%s\n", pkdata[k][i].name); tempval = (long) (10000*pkdata[k][i].value); fprintf (fp, "%ld\n", tempval); fprintf (fp, "%d\n", pkdata[k][i].alignment); } } fprintf (fp, "\nEND\n"); fclose (fp); return; } void save_banlist (void) { FILE *fp; BAN_DATA *pBan; if ((fp = fopen ("bansite.dat", "w")) == NULL) { fprintf (stderr, "Error on bansite write.\n"); exit (2); } for (pBan = ban_list; pBan != NULL; pBan = pBan->next) { fprintf (fp, "%s\n", pBan->name); fprintf (fp, "%d\n", pBan->newbie); } fprintf (fp, "\nEND\n"); fclose (fp); return; } void save_clans (void) { int iHash; CLAN_DATA *clan; int i; FILE *fp; if ((fp = fopen ("pclans.dat", "w")) == NULL) { bug ("Open_clans: fopen", 0); perror ("clans.dat"); } for (iHash = 0; iHash < 20; iHash++) { for (clan = clan_index_hash[iHash]; clan != NULL; clan = clan->next) { if (clan != NULL) { fprintf (fp, "#%d\n", clan->vnum); fprintf (fp, "Name %s~\n", fix_string (clan->name)); fprintf (fp, "Leader %s\n", clan->leader); fprintf (fp, "Minlev %d\n", clan->minlev); fprintf (fp, "MStartV %d\n", clan->start_vnum); fprintf (fp, "Alignment %d\n", clan->alignment); fprintf (fp, "Shitlist %d\n", clan->shitlist); for (i = 0; i < 100; i++) { if (clan->members[i] != NULL && clan->members[i][0] != ' ') { fprintf (fp, "CMember %s\n", clan->members[i]); } } fprintf (fp, "End\n\n"); } } } fprintf (fp, "#0\n\n\n\n"); fprintf (fp, "#$\n"); fclose (fp); return; } void save_clans_2 (void) { int iHash; CLAN_DATA *clan; int i; FILE *fp; if ((fp = fopen ("pclans2.dat", "w")) == NULL) { bug ("Open_clans_2: fopen", 0); perror ("pclans2.dat"); } for (iHash = 0; iHash < 20; iHash++) { for (clan = clan_index_hash_2[iHash]; clan != NULL; clan = clan->next) { if (clan != NULL) { fprintf (fp, "#%d\n", clan->vnum); fprintf (fp, "Name %s~\n", fix_string (clan->name)); fprintf (fp, "Leader %s\n", clan->leader); fprintf (fp, "Minlev %d\n", clan->minlev); fprintf (fp, "MStartV %d\n", clan->start_vnum); fprintf (fp, "Alignment %d\n", clan->alignment); for (i = 0; i < 100; i++) { if (clan->members[i] != NULL && clan->members[i][0] != ' ') { fprintf (fp, "CMember %s\n", clan->members[i]); } } fprintf (fp, "End\n\n"); } } } fprintf (fp, "#0\n\n\n\n"); fprintf (fp, "#$\n"); fclose (fp); return; } void do_asave (CHAR_DATA * ch, char *argy) { char arg1[SML_LENGTH]; AREA_DATA *pArea; FILE *fp; int value; DEFINE_COMMAND ("asave", do_asave, POSITION_DEAD, IMM_LEVEL, LOG_ALWAYS, "This command is used to save the world, or sections of it.") fp = NULL; if (saving != NULL) { send_to_char ("A world save is in progress. You may not save at this time.\n\r", ch); return; } if (ch == NULL) /* Do an autosave */ { save_area_list (); for (pArea = area_first; pArea != NULL; pArea = pArea->next) { save_area (pArea); REMOVE_BIT (pArea->area_flags, AREA_CHANGED); } return; } smash_tilde (argy); strcpy (arg1, argy); if (arg1[0] == '\0') { send_to_char ("Syntax:\n\r", ch); send_to_char (" asave changed - saves all changed zones\n\r", ch); send_to_char (" asave world - begins a background world save\n\r", ch); send_to_char (" asave rand - saves all random pops\n\r", ch); send_to_char (" asave triggers - saves all triggers\n\r", ch); send_to_char (" asave code - saves all code labels\n\r", ch); send_to_char (" asave clans - saves all clans\n\r", ch); send_to_char ("\n\r", ch); return; } /* * Snarf the value (which need not be numeric). */ value = atoi (arg1); if ((pArea = get_area_data (value)) == NULL && is_number (arg1)) { send_to_char ("That area does not exist.\n\r", ch); return; } if (is_number (arg1)) { save_area_list (); save_area (pArea); return; } if (!str_cmp ("code", arg1)) { save_code (); send_to_char ("Successfully saved all code labels.\n\r", ch); return; } if (!str_cmp ("triggers", arg1)) { save_triggers (); send_to_char ("Successfully saved all triggers.\n\r", ch); return; } if (!str_cmp ("world", arg1) || !str_cmp ("all", arg1)) { if (LEVEL (ch) < MAX_LEVEL) { send_to_char ("This command has been disabled.\n\r", ch); return; } save_area_list (); saving = area_first; /* for( pArea = area_first; pArea != NULL; pArea = pArea->next ) { save_area( pArea ); REMOVE_BIT( pArea->area_flags, AREA_CHANGED ); } send_to_char( "You saved the world.\n\r", ch ); */ do_global ("Full World/Database save has started... Please pardon any slight lag.\n\r", 0, 0); return; } if (!str_cmp ("complete", arg1)) { save_code (); save_triggers (); do_asave (ch, "clans"); if (changed_spells) { send_to_char (" -------> Spell Changes Have Now Been Saved.\n\r", ch); changed_spells = FALSE; write_spells (); } save_area_list (); for (pArea = area_first; pArea != NULL; pArea = pArea->next) { save_area (pArea); REMOVE_BIT (pArea->area_flags, AREA_CHANGED); } send_to_char ("World save complete.\n\r", ch); return; } if (!str_cmp ("clans", arg1)) { save_clans (); save_clans_2 (); send_to_char ("Okie Dokie. Done.\n\r", ch); return; } if (!str_cmp ("changed", arg1)) { char buf[SML_LENGTH]; /*save_area_list(); */ save_code (); save_triggers (); send_to_char ("Saved zones:\n\r", ch); if (changed_spells) { send_to_char (" -------> Spell Changes Have Now Been Saved.\n\r", ch); changed_spells = FALSE; write_spells (); } sprintf (buf, "None.\n\r"); for (pArea = area_first; pArea != NULL; pArea = pArea->next) { if (IS_SET (pArea->area_flags, AREA_CHANGED)) { save_area (pArea); sprintf (buf, "%24s - '%s'\n\r", pArea->name, pArea->filename); send_to_char (buf, ch); REMOVE_BIT (pArea->area_flags, AREA_CHANGED); } } if (!str_cmp (buf, "None.\n\r")) send_to_char (buf, ch); return; } if (!str_cmp (arg1, "list")) { save_area_list (); return; } if (!str_cmp (arg1, "zone")) { if (LEVEL (ch) < 109) { send_to_char ("Please use ASAVE CHANGED!\n\r", ch); return; } save_area_list (); save_area (ch->in_room->area); REMOVE_BIT (pArea->area_flags, AREA_CHANGED); send_to_char ("Zone saved.\n\r", ch); return; } do_asave (ch, ""); return; }