/***************************************************************************
* 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;
}