/*************************************************************************** * File: olc_act.c * * * * Much time and thought has gone into this software and you are * * benefitting. We hope that you share your changes too. What goes * * around, comes around. * * * * This code was freely distributed with the The Isles 1.1 source code, * * and has been used here for OLC - OLC would not be what it is without * * all the previous coders who released their source code. * * * ***************************************************************************/ #if defined(macintosh) #include <types.h> #else #include <sys/types.h> #endif #include <ctype.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #include "merc.h" #include "utils.h" #include "olc.h" #include "tables.h" #include "recycle.h" #include "lookup.h" REDIT(redit_rlist) { ROOM_INDEX_DATA *pRoomIndex; AREA_DATA *pArea; char buf[MAX_STRING_LENGTH]; BUFFER *buf1; char arg[MAX_INPUT_LENGTH]; bool found; long vnum; int col = 0; one_argument(argument, arg); pArea = ch->in_room->area; buf1 = new_buf(); /* buf1[0] = '\0'; */ found = FALSE; for (vnum = pArea->min_vnum; vnum <= pArea->max_vnum; vnum++) { if ((pRoomIndex = get_room_index(vnum))) { found = TRUE; sprintf(buf, "[%5ld] %-17.16s", vnum, capitalize(pRoomIndex->name)); add_buf(buf1, buf); if (++col % 3 == 0) add_buf(buf1, "\n\r"); } } if (!found) { send_to_char("Room(s) not found in this area.\n\r", ch); return FALSE; } if (col % 3 != 0) add_buf(buf1, "\n\r"); page_to_char(buf_string(buf1), ch); free_buf(buf1); return FALSE; } REDIT(redit_mlist) { MOB_INDEX_DATA *pMobIndex; AREA_DATA *pArea; char buf[MAX_STRING_LENGTH]; BUFFER *buf1; char arg[MAX_INPUT_LENGTH]; bool fAll, found; long vnum; int col = 0; one_argument(argument, arg); if (arg[0] == '\0') { send_to_char("Syntax: mlist <all/name>\n\r", ch); return FALSE; } buf1 = new_buf(); pArea = ch->in_room->area; /* buf1[0] = '\0'; */ fAll = !str_cmp(arg, "all"); found = FALSE; for (vnum = pArea->min_vnum; vnum <= pArea->max_vnum; vnum++) { if ((pMobIndex = get_mob_index(vnum)) != NULL) { if (fAll || is_name(arg, pMobIndex->player_name)) { found = TRUE; sprintf(buf, "[%5ld] %-17.16s", pMobIndex->vnum, capitalize(pMobIndex->short_descr)); add_buf(buf1, buf); if (++col % 3 == 0) add_buf(buf1, "\n\r"); } } } if (!found) { send_to_char("Mobile(s) not found in this area.\n\r", ch); return FALSE; } if (col % 3 != 0) add_buf(buf1, "\n\r"); page_to_char(buf_string(buf1), ch); free_buf(buf1); return FALSE; } REDIT(redit_olist) { OBJ_INDEX_DATA *pObjIndex; AREA_DATA *pArea; char buf[MAX_STRING_LENGTH]; BUFFER *buf1; char arg[MAX_INPUT_LENGTH]; bool fAll, found; long vnum; int col = 0; one_argument(argument, arg); if (arg[0] == '\0') { send_to_char("Syntax: olist <all/name/item_type>\n\r", ch); return FALSE; } pArea = ch->in_room->area; buf1 = new_buf(); /* buf1[0] = '\0'; */ fAll = !str_cmp(arg, "all"); found = FALSE; for (vnum = pArea->min_vnum; vnum <= pArea->max_vnum; vnum++) { if ((pObjIndex = get_obj_index(vnum))) { if (fAll || is_name(arg, pObjIndex->name) || flag_value(type_flags, arg) == pObjIndex->item_type) { found = TRUE; sprintf(buf, "[%5ld] %-17.16s", pObjIndex->vnum, capitalize(pObjIndex->short_descr)); add_buf(buf1, buf); if (++col % 3 == 0) add_buf(buf1, "\n\r"); } } } if (!found) { send_to_char("Object(s) not found in this area.\n\r", ch); return FALSE; } if (col % 3 != 0) add_buf(buf1, "\n\r"); page_to_char(buf_string(buf1), ch); free_buf(buf1); return FALSE; } REDIT(redit_mshow) { MOB_INDEX_DATA *pMob; int value; if (argument[0] == '\0') { send_to_char("Syntax: mshow <vnum>\n\r", ch); return FALSE; } if (!is_number(argument)) { send_to_char("REdit: That's not a number!\n\r", ch); return FALSE; } if (is_number(argument)) { value = atoi(argument); if (!(pMob = get_mob_index(value))) { send_to_char("REdit: That mobile does not exist.\n\r", ch); return FALSE; } ch->desc->pEdit = (void *) pMob; } medit_show(ch, argument); ch->desc->pEdit = (void *) ch->in_room; return FALSE; } REDIT(redit_oshow) { OBJ_INDEX_DATA *pObj; int value; if (argument[0] == '\0') { send_to_char("Syntax: oshow <vnum>\n\r", ch); return FALSE; } if (!is_number(argument)) { send_to_char("REdit: That's not a number!\n\r", ch); return FALSE; } if (is_number(argument)) { value = atoi(argument); if (!(pObj = get_obj_index(value))) { send_to_char("REdit: That object does not exist.\n\r", ch); return FALSE; } ch->desc->pEdit = (void *) pObj; } oedit_show(ch, argument); ch->desc->pEdit = (void *) ch->in_room; return FALSE; } /* * Room Editor Functions. */ REDIT(redit_show) { ROOM_INDEX_DATA *pRoom; char buf[MAX_STRING_LENGTH]; char buf1[2 * MAX_STRING_LENGTH]; OBJ_DATA *obj; CHAR_DATA *rch; int door; bool fcnt; EDIT_ROOM(ch, pRoom); buf1[0] = '\0'; sprintf(buf, "Description:\n\r%s", pRoom->description); strcat(buf1, buf); sprintf(buf, "Name: [%s]\n\rArea: [%5ld] %s\n\r", pRoom->name, pRoom->area->vnum, pRoom->area->name); strcat(buf1, buf); sprintf(buf, "Vnum: [%5ld]\n\rSector: [%s]\n\r", pRoom->vnum, flag_string(sector_flags, pRoom->sector_type)); strcat(buf1, buf); sprintf(buf, "Room flags: [%s]\n\r", flag_string(room_flags, pRoom->room_flags)); strcat(buf1, buf); sprintf(buf, "Health recovery:[%d]\n\rMana recovery :[%d]\n\r", pRoom->heal_rate, pRoom->mana_rate); strcat(buf1, buf); sprintf(buf, "Clan : [%d] %s\n\r", pRoom->clan, ((pRoom->clan > 0) ? clan_table[pRoom->clan].name : "none")); strcat(buf1, buf); if (pRoom->extra_descr) { EXTRA_DESCR_DATA *ed; strcat(buf1, "Desc Kwds: ["); for (ed = pRoom->extra_descr; ed; ed = ed->next) { strcat(buf1, ed->keyword); if (ed->next) strcat(buf1, " "); } strcat(buf1, "]\n\r"); } strcat(buf1, "Characters: ["); fcnt = FALSE; for (rch = pRoom->people; rch; rch = rch->next_in_room) { one_argument(rch->name, buf); strcat(buf1, buf); strcat(buf1, " "); fcnt = TRUE; } if (fcnt) { int end; end = strlen(buf1) - 1; buf1[end] = ']'; strcat(buf1, "\n\r"); } else strcat(buf1, "none]\n\r"); strcat(buf1, "Objects: ["); fcnt = FALSE; for (obj = pRoom->contents; obj; obj = obj->next_content) { one_argument(obj->name, buf); strcat(buf1, buf); strcat(buf1, " "); fcnt = TRUE; } if (fcnt) { int end; end = strlen(buf1) - 1; buf1[end] = ']'; strcat(buf1, "\n\r"); } else strcat(buf1, "none]\n\r"); for (door = 0; door < MAX_DIR; door++) { EXIT_DATA *pexit; if ((pexit = pRoom->exit[door])) { char word[MAX_INPUT_LENGTH]; char reset_state[MAX_STRING_LENGTH]; char *state; int i, length; sprintf(buf, "-%-5s to [%5ld] Key: [%5d] ", capitalize(dir_name[door]), pexit->u1.to_room ? pexit->u1.to_room->vnum : 0, /* ROM OLC */ pexit->key); strcat(buf1, buf); /* * Format up the exit info. * Capitalize all flags that are not part of the reset info. */ strcpy(reset_state, flag_string(exit_flags, pexit->rs_flags)); state = flag_string(exit_flags, pexit->exit_info); strcat(buf1, " Exit flags: ["); for (;;) { state = one_argument(state, word); if (word[0] == '\0') { int end; end = strlen(buf1) - 1; buf1[end] = ']'; strcat(buf1, "\n\r"); break; } if (str_infix(word, reset_state)) { length = strlen(word); for (i = 0; i < length; i++) word[i] = UPPER(word[i]); } strcat(buf1, word); strcat(buf1, " "); } if (pexit->keyword && pexit->keyword[0] != '\0') { sprintf(buf, "Kwds: [%s]\n\r", pexit->keyword); strcat(buf1, buf); } if (pexit->description && pexit->description[0] != '\0') { sprintf(buf, "%s", pexit->description); strcat(buf1, buf); } } } if (pRoom->deleted) { strcat(buf1, "\r\n{RTHIS ROOM IS MARKED FOR DELETION AND WILL NOT BE SAVED.{x\n\r\r\n"); } send_to_char(buf1, ch); return FALSE; } /* Local function. */ bool change_exit(CHAR_DATA * ch, char *argument, int door) { ROOM_INDEX_DATA *pRoom; char command[MAX_INPUT_LENGTH]; char arg[MAX_INPUT_LENGTH]; int value; EDIT_ROOM(ch, pRoom); /* * Now parse the arguments. */ argument = one_argument(argument, command); one_argument(argument, arg); if (command[0] == '\0' && argument[0] == '\0') { /* Move command. */ move_char(ch, door, TRUE, FALSE); /* ROM OLC */ return FALSE; } if (command[0] == '?') { do_help(ch, "EXIT"); return FALSE; } if (!str_cmp(command, "delete")) { ROOM_INDEX_DATA *pToRoom; sh_int rev; /* ROM OLC */ if (!pRoom->exit[door]) { send_to_char ("REdit: Cannot delete an exit that doesn't exist.\n\r", ch); return FALSE; } /* * Remove ToRoom Exit. */ rev = rev_dir[door]; pToRoom = pRoom->exit[door]->u1.to_room; /* ROM OLC */ if (pToRoom->exit[rev]) { free_exit(pToRoom->exit[rev]); pToRoom->exit[rev] = NULL; } /* * Remove this exit. */ free_exit(pRoom->exit[door]); pRoom->exit[door] = NULL; send_to_char("Exit unlinked.\n\r", ch); return TRUE; } if (!str_cmp(command, "link")) { EXIT_DATA *pExit; if (arg[0] == '\0' || !is_number(arg)) { send_to_char("Syntax: [direction] link [vnum]\n\r", ch); return FALSE; } value = atoi(arg); if (!get_room_index(value)) { send_to_char("REdit: Cannot link to non-existant room.\n\r", ch); return FALSE; } if (!IS_BUILDER(ch, get_room_index(value)->area)) { send_to_char("REdit: Cannot link to that area.\n\r", ch); return FALSE; } if (get_room_index(value)->exit[rev_dir[door]]) { send_to_char("REdit: Remote side's exit already exists.\n\r", ch); return FALSE; } if (!pRoom->exit[door]) { pRoom->exit[door] = new_exit(); } pRoom->exit[door]->u1.to_room = get_room_index(value); /* ROM OLC */ pRoom->exit[door]->orig_door = door; /* pRoom->exit[door]->vnum = value; Can't set vnum in ROM */ pRoom = get_room_index(value); door = rev_dir[door]; pExit = new_exit(); pExit->u1.to_room = ch->in_room; /* pExit->vnum = ch->in_room->vnum; Can't set vnum in ROM */ pExit->orig_door = door; pRoom->exit[door] = pExit; send_to_char("Two-way link established.\n\r", ch); return TRUE; } if (!str_cmp(command, "dig")) { char buf[MAX_STRING_LENGTH]; if (arg[0] == '\0' || !is_number(arg)) { send_to_char("Syntax: [direction] dig <vnum>\n\r", ch); return FALSE; } redit_create(ch, arg); sprintf(buf, "link %s", arg); change_exit(ch, buf, door); return TRUE; } if (!str_cmp(command, "room")) { if (arg[0] == '\0' || !is_number(arg)) { send_to_char("Syntax: [direction] room [vnum]\n\r", ch); return FALSE; } if (!pRoom->exit[door]) { pRoom->exit[door] = new_exit(); } value = atoi(arg); if (!get_room_index(value)) { send_to_char("REdit: Cannot link to non-existant room.\n\r", ch); return FALSE; } if (get_room_index(value)->exit[rev_dir[door]]) { send_to_char("REdit: Remote side's exit already exists.\n\r", ch); return FALSE; } pRoom->exit[door]->u1.to_room = get_room_index(value); /* ROM OLC */ pRoom->exit[door]->orig_door = door; send_to_char("One-way link established.\n\r", ch); return TRUE; } if (!str_cmp(command, "key")) { if (arg[0] == '\0' || !is_number(arg)) { send_to_char("Syntax: [direction] key [vnum]\n\r", ch); return FALSE; } if (!pRoom->exit[door]) { send_to_char("That exit doesn't exist.\n\r", ch); return FALSE; } /* if ( !pRoom->exit[door] ) { pRoom->exit[door] = new_exit(); } */ value = atoi(arg); if (!get_obj_index(value)) { send_to_char("REdit: Item doesn't exist.\n\r", ch); return FALSE; } if (get_obj_index(atoi(argument))->item_type != ITEM_KEY) { send_to_char("REdit: Key doesn't exist.\n\r", ch); return FALSE; } pRoom->exit[door]->key = value; send_to_char("Exit key set.\n\r", ch); return TRUE; } if (!str_cmp(command, "name")) { if (arg[0] == '\0') { send_to_char("Syntax: [direction] name [string]\n\r", ch); return FALSE; } if (!pRoom->exit[door]) { send_to_char("That exit doesn't exist.\n\r", ch); return FALSE; } /* if ( !pRoom->exit[door] ) { pRoom->exit[door] = new_exit(); } */ free_string(pRoom->exit[door]->keyword); pRoom->exit[door]->keyword = str_dup(arg); send_to_char("Exit name set.\n\r", ch); return TRUE; } if (!str_prefix(command, "description")) { if (arg[0] == '\0') { if (!pRoom->exit[door]) { send_to_char("That exit doesn't exist.\n\r", ch); return FALSE; } /* if ( !pRoom->exit[door] ) { pRoom->exit[door] = new_exit(); } */ string_append(ch, &pRoom->exit[door]->description); return TRUE; } send_to_char("Syntax: [direction] desc\n\r", ch); return FALSE; } /* * Set the exit flags, needs full argument. * ---------------------------------------- */ if ((value = flag_value(exit_flags, argument)) != NO_FLAG) { ROOM_INDEX_DATA *pToRoom; sh_int rev; /* ROM OLC */ if (!pRoom->exit[door]) { send_to_char("That exit doesn't exist.\n\r", ch); return FALSE; } /* pRoom->exit[door] = new_exit(); */ /* * This room. */ TOGGLE_BIT(pRoom->exit[door]->rs_flags, value); /* Don't toggle exit_info because it can be changed by players. */ pRoom->exit[door]->exit_info = pRoom->exit[door]->rs_flags; /* * Connected room. */ pToRoom = pRoom->exit[door]->u1.to_room; /* ROM OLC */ rev = rev_dir[door]; if (pToRoom->exit[rev] != NULL) { TOGGLE_BIT(pToRoom->exit[rev]->rs_flags, value); TOGGLE_BIT(pToRoom->exit[rev]->exit_info, value); } send_to_char("Exit flag toggled.\n\r", ch); return TRUE; } return FALSE; } REDIT(redit_north) { if (change_exit(ch, argument, DIR_NORTH)) return TRUE; return FALSE; } REDIT(redit_south) { if (change_exit(ch, argument, DIR_SOUTH)) return TRUE; return FALSE; } REDIT(redit_east) { if (change_exit(ch, argument, DIR_EAST)) return TRUE; return FALSE; } REDIT(redit_west) { if (change_exit(ch, argument, DIR_WEST)) return TRUE; return FALSE; } REDIT(redit_up) { if (change_exit(ch, argument, DIR_UP)) return TRUE; return FALSE; } REDIT(redit_down) { if (change_exit(ch, argument, DIR_DOWN)) return TRUE; return FALSE; } REDIT(redit_ed) { ROOM_INDEX_DATA *pRoom; EXTRA_DESCR_DATA *ed; char command[MAX_INPUT_LENGTH]; char keyword[MAX_INPUT_LENGTH]; EDIT_ROOM(ch, pRoom); argument = one_argument(argument, command); /* one_argument( argument, keyword ); */ strcpy(keyword, argument); if (command[0] == '\0' || keyword[0] == '\0') { send_to_char("Syntax: ed add [keyword]\n\r", ch); send_to_char(" ed edit [keyword]\n\r", ch); send_to_char(" ed delete [keyword]\n\r", ch); send_to_char(" ed format [keyword]\n\r", ch); return FALSE; } if (!str_cmp(command, "add")) { if (keyword[0] == '\0') { send_to_char("Syntax: ed add [keyword]\n\r", ch); return FALSE; } ed = new_extra_descr(); ed->keyword = str_dup(keyword); ed->description = str_dup(""); ed->next = pRoom->extra_descr; pRoom->extra_descr = ed; string_append(ch, &ed->description); return TRUE; } if (!str_cmp(command, "edit")) { if (keyword[0] == '\0') { send_to_char("Syntax: ed edit [keyword]\n\r", ch); return FALSE; } for (ed = pRoom->extra_descr; ed; ed = ed->next) { if (is_name(keyword, ed->keyword)) break; } if (!ed) { send_to_char ("REdit: Extra description keyword not found.\n\r", ch); return FALSE; } string_append(ch, &ed->description); return TRUE; } if (!str_cmp(command, "delete")) { EXTRA_DESCR_DATA *ped = NULL; if (keyword[0] == '\0') { send_to_char("Syntax: ed delete [keyword]\n\r", ch); return FALSE; } for (ed = pRoom->extra_descr; ed; ed = ed->next) { if (is_name(keyword, ed->keyword)) break; ped = ed; } if (!ed) { send_to_char ("REdit: Extra description keyword not found.\n\r", ch); return FALSE; } if (!ped) pRoom->extra_descr = ed->next; else ped->next = ed->next; free_extra_descr(ed); send_to_char("Extra description deleted.\n\r", ch); return TRUE; } if (!str_cmp(command, "format")) { if (keyword[0] == '\0') { send_to_char("Syntax: ed format [keyword]\n\r", ch); return FALSE; } for (ed = pRoom->extra_descr; ed; ed = ed->next) { if (is_name(keyword, ed->keyword)) break; } if (!ed) { send_to_char ("REdit: Extra description keyword not found.\n\r", ch); return FALSE; } ed->description = format_string(ed->description); send_to_char("Extra description formatted.\n\r", ch); return TRUE; } redit_ed(ch, ""); return FALSE; } REDIT(redit_create) { AREA_DATA *pArea; ROOM_INDEX_DATA *pRoom; int value; int iHash; EDIT_ROOM(ch, pRoom); value = atoi(argument); if (argument[0] == '\0' || value == 0) { if ((value = get_next_room_vnum_area( ch->in_room->area )) == 0) { send_to_char("This area is out of vnums for rooms.\r\n", ch); return FALSE; } } pArea = get_vnum_area(value); if (!pArea) { send_to_char("REdit: That vnum is not assigned an area.\n\r", ch); return FALSE; } if (!IS_BUILDER(ch, pArea)) { send_to_char("REdit: Vnum in an area you cannot build in.\n\r", ch); return FALSE; } if (get_room_index(value)) { send_to_char("REdit: Room vnum already exists.\n\r", ch); return FALSE; } pRoom = new_room_index(); pRoom->area = pArea; pRoom->vnum = value; if (value > top_vnum_room) top_vnum_room = value; iHash = value % MAX_KEY_HASH; pRoom->next = room_index_hash[iHash]; room_index_hash[iHash] = pRoom; ch->desc->pEdit = (void *) pRoom; send_to_char("Room created.\n\r", ch); return TRUE; } REDIT(redit_name) { ROOM_INDEX_DATA *pRoom; EDIT_ROOM(ch, pRoom); if (argument[0] == '\0') { send_to_char("Syntax: name [name]\n\r", ch); return FALSE; } free_string(pRoom->name); pRoom->name = str_dup(argument); send_to_char("Name set.\n\r", ch); return TRUE; } REDIT(redit_desc) { ROOM_INDEX_DATA *pRoom; EDIT_ROOM(ch, pRoom); if (argument[0] == '\0') { string_append(ch, &pRoom->description); return TRUE; } send_to_char("Syntax: desc\n\r", ch); return FALSE; } REDIT(redit_heal) { ROOM_INDEX_DATA *pRoom; EDIT_ROOM(ch, pRoom); if (is_number(argument)) { pRoom->heal_rate = atoi(argument); send_to_char("Heal rate set.\n\r", ch); return TRUE; } send_to_char("Syntax : heal <#xnumber>\n\r", ch); return FALSE; } REDIT(redit_mana) { ROOM_INDEX_DATA *pRoom; EDIT_ROOM(ch, pRoom); if (is_number(argument)) { pRoom->mana_rate = atoi(argument); send_to_char("Mana rate set.\n\r", ch); return TRUE; } send_to_char("Syntax : mana <#xnumber>\n\r", ch); return FALSE; } REDIT(redit_clan) { ROOM_INDEX_DATA *pRoom; EDIT_ROOM(ch, pRoom); pRoom->clan = clan_lookup(argument); send_to_char("Clan set.\n\r", ch); return TRUE; } REDIT(redit_format) { ROOM_INDEX_DATA *pRoom; EDIT_ROOM(ch, pRoom); pRoom->description = format_string(pRoom->description); send_to_char("String formatted.\n\r", ch); return TRUE; } REDIT(redit_mreset) { ROOM_INDEX_DATA *pRoom; MOB_INDEX_DATA *pMobIndex; CHAR_DATA *newmob; char arg[MAX_INPUT_LENGTH]; char arg2[MAX_INPUT_LENGTH]; RESET_DATA *pReset; char output[MAX_STRING_LENGTH]; EDIT_ROOM(ch, pRoom); argument = one_argument(argument, arg); argument = one_argument(argument, arg2); if (arg[0] == '\0' || !is_number(arg)) { send_to_char("Syntax: mreset <vnum> <max #x> <mix #x>\n\r", ch); return FALSE; } if (!(pMobIndex = get_mob_index(atoi(arg)))) { send_to_char("REdit: No mobile has that vnum.\n\r", ch); return FALSE; } if (pMobIndex->area != pRoom->area) { send_to_char("REdit: No such mobile in this area.\n\r", ch); return FALSE; } /* * Create the mobile reset. */ pReset = new_reset_data(); pReset->command = 'M'; pReset->arg1 = pMobIndex->vnum; pReset->arg2 = is_number(arg2) ? atoi(arg2) : MAX_MOB; pReset->arg3 = pRoom->vnum; pReset->arg4 = is_number(argument) ? atoi(argument) : 1; add_reset(pRoom, pReset, 0 /* Last slot */ ); /* * Create the mobile. */ newmob = create_mobile(pMobIndex); char_to_room(newmob, pRoom); sprintf(output, "%s (%ld) has been loaded and added to resets.\n\r" "There will be a maximum of %d loaded to this room.\n\r", capitalize(pMobIndex->short_descr), pMobIndex->vnum, pReset->arg2); send_to_char(output, ch); act("$n has created $N!", ch, NULL, newmob, TO_ROOM); return TRUE; } REDIT(redit_oreset) { ROOM_INDEX_DATA *pRoom; OBJ_INDEX_DATA *pObjIndex; OBJ_DATA *newobj; OBJ_DATA *to_obj; CHAR_DATA *to_mob; char arg1[MAX_INPUT_LENGTH]; char arg2[MAX_INPUT_LENGTH]; int olevel = 0; RESET_DATA *pReset; char output[MAX_STRING_LENGTH]; EDIT_ROOM(ch, pRoom); argument = one_argument(argument, arg1); argument = one_argument(argument, arg2); if (arg1[0] == '\0' || !is_number(arg1)) { send_to_char("Syntax: oreset <vnum> <args>\n\r", ch); send_to_char(" -no_args = into room\n\r", ch); send_to_char(" -<obj_name> = into obj\n\r", ch); send_to_char(" -<mob_name> <wear_loc> = into mob\n\r", ch); return FALSE; } if (!(pObjIndex = get_obj_index(atoi(arg1)))) { send_to_char("REdit: No object has that vnum.\n\r", ch); return FALSE; } if (pObjIndex->area != pRoom->area) { send_to_char("REdit: No such object in this area.\n\r", ch); return FALSE; } /* * Load into room. */ if (arg2[0] == '\0') { pReset = new_reset_data(); pReset->command = 'O'; pReset->arg1 = pObjIndex->vnum; pReset->arg2 = 0; pReset->arg3 = pRoom->vnum; pReset->arg4 = 0; add_reset(pRoom, pReset, 0 /* Last slot */ ); newobj = create_object(pObjIndex, number_fuzzy(olevel)); obj_to_room(newobj, pRoom); sprintf(output, "%s (%ld) has been loaded and added to resets.\n\r", capitalize(pObjIndex->short_descr), pObjIndex->vnum); send_to_char(output, ch); } else /* * Load into object's inventory. */ if (argument[0] == '\0' && ((to_obj = get_obj_list(ch, arg2, pRoom->contents)) != NULL)) { pReset = new_reset_data(); pReset->command = 'P'; pReset->arg1 = pObjIndex->vnum; pReset->arg2 = 0; pReset->arg3 = to_obj->pIndexData->vnum; pReset->arg4 = 1; add_reset(pRoom, pReset, 0 /* Last slot */ ); newobj = create_object(pObjIndex, number_fuzzy(olevel)); newobj->cost = 0; obj_to_obj(newobj, to_obj); sprintf(output, "%s (%ld) has been loaded into " "%s (%ld) and added to resets.\n\r", capitalize(newobj->short_descr), newobj->pIndexData->vnum, to_obj->short_descr, to_obj->pIndexData->vnum); send_to_char(output, ch); } else /* * Load into mobile's inventory. */ if ((to_mob = get_char_room(ch, arg2)) != NULL) { int wear_loc; /* * Make sure the location on mobile is valid. */ if ((wear_loc = flag_value(wear_loc_flags, argument)) == NO_FLAG) { send_to_char("REdit: Invalid wear_loc. '? wear-loc'\n\r", ch); return FALSE; } /* * Disallow loading a sword(WEAR_WIELD) into WEAR_HEAD. */ if (!IS_SET(pObjIndex->wear_flags, wear_bit(wear_loc))) { sprintf(output, "%s (%ld) has wear flags: [%s]\n\r", capitalize(pObjIndex->short_descr), pObjIndex->vnum, flag_string(wear_flags, pObjIndex->wear_flags)); send_to_char(output, ch); return FALSE; } /* * Can't load into same position. */ if (get_eq_char(to_mob, wear_loc)) { send_to_char("REdit: Object already equipped.\n\r", ch); return FALSE; } pReset = new_reset_data(); pReset->arg1 = pObjIndex->vnum; pReset->arg2 = wear_loc; if (pReset->arg2 == WEAR_NONE) pReset->command = 'G'; else pReset->command = 'E'; pReset->arg3 = wear_loc; add_reset(pRoom, pReset, 0 /* Last slot */ ); olevel = URANGE(0, to_mob->level - 2, LEVEL_HERO); newobj = create_object(pObjIndex, number_fuzzy(olevel)); if (to_mob->pIndexData->pShop) { /* Shop-keeper? */ switch (pObjIndex->item_type) { default: olevel = 0; break; case ITEM_PILL: olevel = number_range(0, 10); break; case ITEM_POTION: olevel = number_range(0, 10); break; case ITEM_SCROLL: olevel = number_range(5, 15); break; case ITEM_WAND: olevel = number_range(10, 20); break; case ITEM_STAFF: olevel = number_range(15, 25); break; case ITEM_ARMOR: olevel = number_range(5, 15); break; case ITEM_WEAPON: if (pReset->command == 'G') olevel = number_range(5, 15); else olevel = number_fuzzy(olevel); break; } newobj = create_object(pObjIndex, olevel); if (pReset->arg2 == WEAR_NONE) SET_BIT(newobj->extra_flags, ITEM_INVENTORY); } else newobj = create_object(pObjIndex, number_fuzzy(olevel)); obj_to_char(newobj, to_mob); if (pReset->command == 'E') equip_char(to_mob, newobj, pReset->arg3); sprintf(output, "%s (%ld) has been loaded " "%s of %s (%ld) and added to resets.\n\r", capitalize(pObjIndex->short_descr), pObjIndex->vnum, flag_string(wear_loc_strings, pReset->arg3), to_mob->short_descr, to_mob->pIndexData->vnum); send_to_char(output, ch); } else { /* Display Syntax */ send_to_char("REdit: That mobile isn't here.\n\r", ch); return FALSE; } act("$n has created $p!", ch, newobj, NULL, TO_ROOM); return TRUE; }