/**************************************************************************
* Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer, *
* Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe. *
* *
* Merc Diku Mud improvements copyright (C) 1992, 1993 by Michael *
* Chastain, Michael Quan, and Mitchell Tse. *
* *
* In order to use any part of this Merc Diku Mud, you must comply with *
* both the original Diku license in 'license.doc' as well the Merc *
* license in 'license.txt'. In particular, you may not remove either of *
* these copyright notices. *
* *
* Much time and thought has gone into this software and you are *
* benefiting. We hope that you share your changes too. What goes *
* around, comes around. *
***************************************************************************
* ROM 2.4 is copyright 1993-1998 Russ Taylor *
* ROM has been brought to you by the ROM consortium *
* Russ Taylor (rtaylor@hypercube.org) *
* Gabrielle Taylor (gtaylor@hypercube.org) *
* Brian Moore (zump@rom.org) *
* By using this code, you have agreed to follow the terms of the *
* ROM license, in the file Rom24/doc/rom.license *
***************************************************************************
* 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. *
***************************************************************************
* 1stMud ROM Derivative (c) 2001-2004 by Markanth *
* http://www.firstmud.com/ <markanth@firstmud.com> *
* By using this code you have agreed to follow the term of *
* the 1stMud license in ../doc/1stMud/LICENSE *
***************************************************************************/
#include "merc.h"
#include "tables.h"
#include "olc.h"
#include "recycle.h"
#include "interp.h"
#include "magic.h"
#include "vnums.h"
#include "special.h"
#define ALT_FLAGVALUE_SET( _blargh, _table, _arg ) \
{ \
flag_t blah = flag_value( _table, _arg ); \
_blargh = Max(0, blah); \
}
#define ALT_FLAGVALUE_TOGGLE( _blargh, _table, _arg ) \
{ \
flag_t blah = flag_value( _table, _arg ); \
ToggleBit(_blargh, Max(0, blah)); \
}
const char *OLC_VERSION[] = {
"ILAB Online Creation [Beta 1.0, ROM 2.3 modified]",
"Port a ROM 2.4 v1.8",
"Port to 1stMud v2.7" NEWLINE,
"By Jason(jdinkel@mines.colorado.edu)",
"Modified for use with ROM 2.3",
"By Hans Birkeland (hansbi@ifi.uio.no)",
"Modificado para uso en ROM 2.4b6",
"Por Ivan Toledo (itoledo@ctcreuna.cl)",
"Modified for 1stMud by Markanth (markanth@firstmud.com)" NEWLINE,
"(Apr. 7, 1995 - ROM mod, Apr 16, 1995)",
"(Port a ROM 2.4 - Nov 2, 1996)",
"Version actual : 1.8 - Sep 8, 1998",
"1stMud version - Nov 6, 2003" NEWLINE,
"Original by Surreality(cxw197@psu.edu) and Locke(locke@lm.com)",
NULL
};
Olc_Fun (show_olc_version)
{
int i;
for (i = 0; OLC_VERSION[i] != NULL; i++)
olc_msg (ch, n_fun, OLC_VERSION[i]);
return false;
}
void
show_flag_cmds (CharData * ch, FlagTable * flag_table)
{
int flag;
Column Cd;
set_cols (&Cd, ch, 4, COLS_CHAR, ch);
for (flag = 0; flag_table[flag].name != NULL; flag++)
{
if (flag_table[flag].settable)
{
print_cols (&Cd, flag_table[flag].name);
}
}
cols_nl (&Cd);
return;
}
void
show_skill_cmds (CharData * ch, tar_t tar)
{
int sn;
Column Cd;
set_cols (&Cd, ch, 4, COLS_CHAR, ch);
for (sn = 0; sn < top_skill; sn++)
{
if (!skill_table[sn].name)
break;
if (!str_cmp (skill_table[sn].name, "reserved") ||
skill_table[sn].spell_fun == spell_null)
continue;
if (tar == TAR_NONE || skill_table[sn].target == tar)
{
print_cols (&Cd, skill_table[sn].name);
}
}
cols_nl (&Cd);
return;
}
void
show_spec_cmds (CharData * ch)
{
int spec;
Column Cd;
set_cols (&Cd, ch, 4, COLS_CHAR, ch);
chprintln (ch, "Preceed special functions with 'spec_'");
for (spec = 0; spec_table[spec].function != NULL; spec++)
{
print_cols (&Cd, &spec_table[spec].name[5]);
}
cols_nl (&Cd);
return;
}
bool
show_help_structure (CharData * ch, const void *structure,
const char *spell, const char *n_fun)
{
if (structure == spec_table)
{
show_spec_cmds (ch);
return false;
}
else if (structure == liq_table)
{
show_liqlist (ch);
return false;
}
else if (structure == attack_table)
{
show_damlist (ch);
return false;
}
else if (structure == skill_table)
{
tar_t type;
int i;
if (NullStr (spell))
{
cmd_syntax (ch, NULL, n_fun, "target_type:", NULL);
for (i = 0; target_flags[i].name != NULL; i++)
chprintlnf (ch, "\t%s", target_flags[i].name);
return false;
}
type = (tar_t) flag_value (target_flags, spell);
show_skill_cmds (ch, type);
return false;
}
else if (structure)
{
show_flag_cmds (ch, (FlagTable *) structure);
return false;
}
return false;
}
Olc_Fun (show_olc_help)
{
char arg[MIL];
char spell[MIL];
int cnt;
argument = one_argument (argument, arg);
one_argument (argument, spell);
if (NullStr (arg))
{
Column Cd;
set_cols (&Cd, ch, 4, COLS_CHAR, ch);
cmd_syntax (ch, NULL, n_fun, "<command>", NULL);
cols_header (&Cd, "[Command]");
for (cnt = 0; flag_stat_table[cnt].name != NULL; cnt++)
{
print_cols (&Cd, capitalize (flag_stat_table[cnt].name));
}
cols_nl (&Cd);
return false;
}
for (cnt = 0; flag_stat_table[cnt].name != NULL; cnt++)
{
if (toupper (arg[0]) == toupper (flag_stat_table[cnt].name[0])
&& !str_prefix (arg, flag_stat_table[cnt].name))
{
show_help_structure (ch, flag_stat_table[cnt].structure, spell,
n_fun);
return false;
}
}
show_olc_help (n_fun, ch, "");
return false;
}
Olc_Fun (mudedit_reset)
{
mud_info.stats.logins = 0;
mud_info.stats.quests = 0;
mud_info.stats.qcomplete = 0;
mud_info.stats.levels = 0;
mud_info.stats.newbies = 0;
mud_info.stats.deletions = 0;
mud_info.stats.mobdeaths = 0;
mud_info.stats.auctions = 0;
mud_info.stats.aucsold = 0;
mud_info.stats.pdied = 0;
mud_info.stats.pkill = 0;
mud_info.stats.notes = 0;
mud_info.stats.remorts = 0;
mud_info.stats.wars = 0;
mud_info.stats.gquests = 0;
mud_info.stats.connections = 0;
mud_info.stats.web_requests = 0;
mud_info.stats.chan_msgs = 0;
mud_info.stats.lastupdate = current_time;
mud_info.stats.version++;
chprintln (ch, "Gamestats reset.");
return true;
}
Olc_Fun (redit_format)
{
RoomIndex *pRoom;
EditRoom (ch, pRoom);
pRoom->description = format_string (pRoom->description);
olc_msg (ch, n_fun, "String formatted.");
return true;
}
Olc_Fun (redit_mshow)
{
CharIndex *pMob;
vnum_t value;
if (NullStr (argument))
{
cmd_syntax (ch, NULL, n_fun, "<vnum>", NULL);
return false;
}
if (!is_number (argument))
{
olc_msg (ch, n_fun, "Is not a number.");
return false;
}
value = atov (argument);
if (!(pMob = get_char_index (value)))
{
olc_msg (ch, n_fun, "That mobile does not exist.");
return false;
}
ch->desc->pEdit = (void *) pMob;
olc_show (ch, olc_lookup (ED_MOBILE));
ch->desc->pEdit = (void *) ch->in_room;
return false;
}
Olc_Fun (redit_oshow)
{
ObjIndex *pObj;
vnum_t value;
if (NullStr (argument))
{
cmd_syntax (ch, NULL, n_fun, "<vnum>", NULL);
return false;
}
if (!is_number (argument))
{
olc_msg (ch, n_fun, "That is not a number.");
return false;
}
value = atov (argument);
if (!(pObj = get_obj_index (value)))
{
olc_msg (ch, n_fun, "That object does not exist.");
return false;
}
ch->desc->pEdit = (void *) pObj;
olc_show (ch, olc_lookup (ED_OBJECT));
ch->desc->pEdit = (void *) ch->in_room;
return false;
}
bool
check_range (vnum_t lower, vnum_t upper)
{
AreaData *pArea;
int cnt = 0;
for (pArea = area_first; pArea; pArea = pArea->next)
{
if ((lower <= pArea->min_vnum && pArea->min_vnum <= upper) ||
(lower <= pArea->max_vnum && pArea->max_vnum <= upper))
++cnt;
if (cnt > 1)
return false;
}
return true;
}
AreaData *
get_vnum_area (vnum_t vnum)
{
AreaData *pArea;
for (pArea = area_first; pArea; pArea = pArea->next)
{
if (vnum >= pArea->min_vnum && vnum <= pArea->max_vnum)
return pArea;
}
return 0;
}
Olc_Fun (aedit_reset)
{
AreaData *pArea;
GetEdit (ch, AreaData, pArea);
reset_area (pArea);
chprintln (ch, "Area reset.");
return false;
}
Olc_Fun (aedit_file)
{
AreaData *pArea;
AreaData *cArea;
char file[MAX_STRING_LENGTH];
int i, length;
GetEdit (ch, AreaData, pArea);
one_argument (argument, file);
if (NullStr (argument))
{
cmd_syntax (ch, NULL, n_fun, "[$file]", NULL);
return false;
}
length = strlen (argument);
if (length > 8)
{
chprintln (ch, "No more than eight characters allowed.");
return false;
}
for (i = 0; i < length; i++)
{
if (!isalnum (file[i]))
{
chprintln (ch, "Only letters and numbers are valid.");
return false;
}
}
strcat (file, ".are");
for (cArea = area_first; cArea; cArea = cArea->next)
{
if (cArea == pArea)
continue;
if (!str_cmp (cArea->file_name, file))
{
chprintln (ch, "There is a file with the same name!!");
return false;
}
}
unlink (pArea->file_name);
replace_str (&pArea->file_name, file);
chprintln (ch, "Filename set.");
return true;
}
Olc_Fun (aedit_builder)
{
AreaData *pArea;
char name[MAX_STRING_LENGTH];
char buf[MAX_STRING_LENGTH];
GetEdit (ch, AreaData, pArea);
one_argument (argument, name);
if (NullStr (name))
{
cmd_syntax (ch, NULL, n_fun, "<name>", "All", NULL);
return false;
}
name[0] = toupper (name[0]);
if (strstr (pArea->builders, name) != '\0')
{
pArea->builders = string_replace (pArea->builders, name, "\0");
pArea->builders = string_unpad (pArea->builders);
if (NullStr (pArea->builders))
{
replace_str (&pArea->builders, "None");
}
olc_msg (ch, n_fun, "Builder removed.");
return true;
}
else
{
buf[0] = '\0';
if (strstr (pArea->builders, "None") != '\0')
{
pArea->builders = string_replace (pArea->builders, "None", "\0");
pArea->builders = string_unpad (pArea->builders);
}
if (!NullStr (pArea->builders))
{
strcat (buf, pArea->builders);
strcat (buf, " ");
}
strcat (buf, name);
free_string (pArea->builders);
pArea->builders = string_proper (str_dup (buf));
olc_msg (ch, n_fun, "Builder added.");
return true;
}
return false;
}
Olc_Fun (aedit_vnum)
{
AreaData *pArea;
char lower[MAX_STRING_LENGTH];
char upper[MAX_STRING_LENGTH];
vnum_t ilower;
vnum_t iupper;
GetEdit (ch, AreaData, pArea);
argument = one_argument (argument, lower);
one_argument (argument, upper);
if (!is_number (lower) || NullStr (lower) || !is_number (upper) ||
NullStr (upper))
{
cmd_syntax (ch, NULL, n_fun, "<lower> <upper>", NULL);
return false;
}
if ((ilower = atov (lower)) > (iupper = atov (upper)))
{
olc_msg (ch, n_fun, "Upper must be larger then lower.");
return false;
}
if (!check_range (ilower, iupper))
{
olc_msg (ch, n_fun, "Range must include only this area.");
return false;
}
if (get_vnum_area (ilower) && get_vnum_area (ilower) != pArea)
{
olc_msg (ch, n_fun, "Lower vnum already assigned.");
return false;
}
pArea->min_vnum = ilower;
olc_msg (ch, n_fun, "Lower vnum set.");
if (get_vnum_area (iupper) && get_vnum_area (iupper) != pArea)
{
olc_msg (ch, n_fun, "Upper vnum already assigned.");
return true;
}
if (iupper > MAX_VNUM)
{
olc_msg (ch, n_fun, "Vnum can't be higher than %d.", MAX_VNUM);
return false;
}
pArea->max_vnum = iupper;
olc_msg (ch, n_fun, "Upper vnum set.");
return true;
}
Olc_Fun (aedit_lvnum)
{
AreaData *pArea;
char lower[MAX_STRING_LENGTH];
vnum_t ilower;
vnum_t iupper;
GetEdit (ch, AreaData, pArea);
one_argument (argument, lower);
if (!is_number (lower) || NullStr (lower))
{
cmd_syntax (ch, NULL, n_fun, "<vnum>", NULL);
return false;
}
if ((ilower = atov (lower)) > (iupper = pArea->max_vnum))
{
olc_msg (ch, n_fun, "Value must be less than the max_vnum.");
return false;
}
if (!check_range (ilower, iupper))
{
olc_msg (ch, n_fun, "Range must include only this area.");
return false;
}
if (get_vnum_area (ilower) && get_vnum_area (ilower) != pArea)
{
olc_msg (ch, n_fun, "Lower vnum already assigned.");
return false;
}
if (ilower > MAX_VNUM)
{
olc_msg (ch, n_fun, "Vnum can't be higher than %d", MAX_VNUM);
return false;
}
pArea->min_vnum = ilower;
olc_msg (ch, n_fun, "Lower vnum set.");
return true;
}
Olc_Fun (aedit_uvnum)
{
AreaData *pArea;
char upper[MAX_STRING_LENGTH];
vnum_t ilower;
vnum_t iupper;
GetEdit (ch, AreaData, pArea);
one_argument (argument, upper);
if (!is_number (upper) || NullStr (upper))
{
cmd_syntax (ch, NULL, n_fun, "<vnum>", NULL);
return false;
}
if ((ilower = pArea->min_vnum) > (iupper = atov (upper)))
{
olc_msg (ch, n_fun, "Upper must be larger then lower.");
return false;
}
if (!check_range (ilower, iupper))
{
olc_msg (ch, n_fun, "Range must include only this area.");
return false;
}
if (get_vnum_area (iupper) && get_vnum_area (iupper) != pArea)
{
olc_msg (ch, n_fun, "Upper vnum already assigned.");
return false;
}
pArea->max_vnum = iupper;
olc_msg (ch, n_fun, "Upper vnum set.");
return true;
}
bool
check_reset_exit (RoomIndex * pRoom, int door)
{
ResetData *pReset;
for (pReset = pRoom->reset_first; pReset; pReset = pReset->next)
{
if (reset_door (pReset, false) == door)
return true;
}
return false;
}
bool
change_exit (const char *n_fun, CharData * ch, const char *argument, int door)
{
RoomIndex *pRoom;
char command[MAX_INPUT_LENGTH];
char arg[MAX_INPUT_LENGTH];
flag_t value;
int rev;
EditRoom (ch, pRoom);
if ((value = flag_value (exit_flags, argument)) != NO_FLAG)
{
RoomIndex *pToRoom;
if (!pRoom->exit[door])
{
olc_msg (ch, n_fun, "Door doesn't exist.");
return false;
}
ToggleBit (pRoom->exit[door]->rs_flags, value);
pRoom->exit[door]->exit_info = pRoom->exit[door]->rs_flags;
pToRoom = pRoom->exit[door]->u1.to_room;
rev = rev_dir[door];
if (pToRoom->exit[rev] != NULL)
{
pToRoom->exit[rev]->rs_flags = pRoom->exit[door]->rs_flags;
pToRoom->exit[rev]->exit_info = pRoom->exit[door]->exit_info;
}
olc_msg (ch, n_fun, "Exit flag toggled.");
return true;
}
argument = one_argument (argument, command);
one_argument (argument, arg);
if (NullStr (command) && NullStr (argument))
{
move_char (ch, door, true);
do_function (ch, &do_redit, "");
return false;
}
if (command[0] == '?')
{
do_function (ch, &do_oldhelp, "EXIT");
return false;
}
if (!str_cmp (command, "delete"))
{
RoomIndex *pToRoom;
if (!pRoom->exit[door])
{
olc_msg (ch, n_fun, "Cannot delete a null exit.");
return false;
}
rev = rev_dir[door];
pToRoom = pRoom->exit[door]->u1.to_room;
if (pToRoom->exit[rev])
{
free_exit (pToRoom->exit[rev]);
pToRoom->exit[rev] = NULL;
}
free_exit (pRoom->exit[door]);
pRoom->exit[door] = NULL;
if (pToRoom->area != pRoom->area)
SetBit (pToRoom->area->area_flags, AREA_CHANGED);
olc_msg (ch, n_fun, "Exit unlinked.");
return true;
}
if (!str_cmp (command, "link"))
{
RoomIndex *toRoom;
if (check_reset_exit (pRoom, door))
{
olc_msg (ch, n_fun,
"There is a random exit reset already using that direction.");
return false;
}
if (NullStr (arg) || !is_number (arg))
{
cmd_syntax (ch, NULL, n_fun, "link [vnum]", NULL);
return false;
}
value = atov (arg);
if (!(toRoom = get_room_index (value)))
{
olc_msg (ch, n_fun, "Cannot link to non-existant room.");
return false;
}
if (!IsBuilder (ch, toRoom->area))
{
olc_msg (ch, n_fun, "Cannot link to that area.");
return false;
}
rev = rev_dir[door];
if (toRoom->exit[rev])
{
olc_msg (ch, n_fun, "Remote side's exit already exists.");
return false;
}
if (!pRoom->exit[door])
pRoom->exit[door] = new_exit ();
pRoom->exit[door]->u1.to_room = toRoom;
pRoom->exit[door]->orig_door = door;
if (toRoom->area != pRoom->area)
SetBit (toRoom->area->area_flags, AREA_CHANGED);
toRoom->exit[rev] = new_exit ();
toRoom->exit[rev]->u1.to_room = pRoom;
toRoom->exit[rev]->orig_door = rev;
olc_msg (ch, n_fun, "Two-way link established.");
return true;
}
if (!str_cmp (command, "dig"))
{
char buf[MAX_STRING_LENGTH];
if (check_reset_exit (pRoom, door))
{
olc_msg (ch, n_fun,
"There is a random exit reset already using that direction.");
return false;
}
if (NullStr (arg))
{
vnum_t newvnum;
bool foundopen = false;
AreaData *pArea = pRoom->area;
newvnum = pArea->min_vnum;
while (foundopen != true && newvnum < top_vnum_room)
{
newvnum++;
if (get_room_index (newvnum))
foundopen = false;
else
foundopen = true;
}
if (newvnum > pArea->max_vnum)
{
olc_msg (ch, n_fun, "Dig Error: No more free vnums in area.");
return false;
}
sprintf (buf, "%ld", newvnum);
redit_create (command, ch, buf);
sprintf (buf, "link %ld", pRoom->vnum);
change_exit (n_fun, ch, buf, rev_dir[door]);
return true;
}
else
{
if (!is_number (arg))
{
cmd_syntax (ch, NULL, n_fun, "dig <vnum>", NULL);
return false;
}
redit_create (command, ch, arg);
sprintf (buf, "link %ld", pRoom->vnum);
change_exit (n_fun, ch, buf, rev_dir[door]);
return true;
}
}
if (!str_cmp (command, "room"))
{
RoomIndex *toRoom;
if (check_reset_exit (pRoom, door))
{
olc_msg (ch, n_fun,
"There is a random exit reset already using that direction.");
return false;
}
if (NullStr (arg) || !is_number (arg))
{
cmd_syntax (ch, NULL, n_fun, "room [vnum]", NULL);
return false;
}
value = atov (arg);
if (!(toRoom = get_room_index (value)))
{
olc_msg (ch, n_fun, "Cannot link to non-existant room.");
return false;
}
if (!pRoom->exit[door])
pRoom->exit[door] = new_exit ();
pRoom->exit[door]->u1.to_room = toRoom;
pRoom->exit[door]->orig_door = door;
olc_msg (ch, n_fun, "One-way link established.");
return true;
}
if (!str_cmp (command, "key"))
{
ObjIndex *key;
if (NullStr (arg) || !is_number (arg))
{
cmd_syntax (ch, NULL, n_fun, "key [vnum]", NULL);
return false;
}
if (!pRoom->exit[door])
{
olc_msg (ch, n_fun, "Door doesn't exist.");
return false;
}
value = atov (arg);
if (!(key = get_obj_index (value)))
{
olc_msg (ch, n_fun, "Key doesn't exist.");
return false;
}
if (key->item_type != ITEM_KEY)
{
olc_msg (ch, n_fun, "Object is not a key.");
return false;
}
pRoom->exit[door]->key = value;
olc_msg (ch, n_fun, "Exit key set.");
return true;
}
if (!str_cmp (command, "name"))
{
if (NullStr (arg))
{
cmd_syntax (ch, NULL, n_fun, "name [string]", "name none", NULL);
return false;
}
if (!pRoom->exit[door])
{
olc_msg (ch, n_fun, "Door doesn't exist.");
return false;
}
if (str_cmp (arg, "none"))
replace_str (&pRoom->exit[door]->keyword, arg);
else
replace_str (&pRoom->exit[door]->keyword, "");
olc_msg (ch, n_fun, "Exit name set.");
return true;
}
if (!str_prefix (command, "description"))
{
if (NullStr (arg))
{
if (!pRoom->exit[door])
{
olc_msg (ch, n_fun, "Door doesn't exist.");
return false;
}
string_append (ch, &pRoom->exit[door]->description);
return true;
}
cmd_syntax (ch, NULL, n_fun, "desc", NULL);
return false;
}
return false;
}
Olc_Fun (redit_mreset)
{
RoomIndex *pRoom;
CharIndex *pMobIndex;
CharData *newmob;
char arg[MAX_INPUT_LENGTH];
char arg2[MAX_INPUT_LENGTH];
ResetData *pReset;
EditRoom (ch, pRoom);
argument = one_argument (argument, arg);
argument = one_argument (argument, arg2);
if (NullStr (arg) || !is_number (arg))
{
cmd_syntax (ch, NULL, n_fun, "<vnum> <max #> <min #>", NULL);
return false;
}
if (!(pMobIndex = get_char_index (atov (arg))))
{
olc_msg (ch, n_fun, "No mobile has that vnum.");
return false;
}
if (pMobIndex->area != pRoom->area)
{
olc_msg (ch, n_fun, "No such mobile in this area.");
return false;
}
pReset = new_reset ();
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);
newmob = create_mobile (pMobIndex);
char_to_room (newmob, pRoom);
olc_msg (ch, n_fun,
"%s (%ld) has been loaded and added to resets." NEWLINE
"There will be a maximum of %d loaded to this room.",
capitalize (pMobIndex->short_descr), pMobIndex->vnum,
pReset->arg2);
act ("$n has created $N!", ch, NULL, newmob, TO_ROOM);
return true;
}
wloc_t
wear_loc (flag_t bits, int count)
{
int flag;
for (flag = 0; wear_table[flag].wear_bit != -2; flag++)
{
if (IsSet (bits, wear_table[flag].wear_bit) && --count < 1)
return (wloc_t) wear_table[flag].wear_loc;
}
return WEAR_NONE;
}
flag_t
wear_bit (wloc_t loc)
{
int flag;
for (flag = 0; wear_table[flag].wear_loc != -2; flag++)
{
if (loc == wear_table[flag].wear_loc)
return wear_table[flag].wear_bit;
}
return 0;
}
Olc_Fun (redit_oreset)
{
RoomIndex *pRoom;
ObjIndex *pObjIndex;
ObjData *newobj;
ObjData *to_obj;
CharData *to_mob;
char arg1[MAX_INPUT_LENGTH];
char arg2[MAX_INPUT_LENGTH];
int olevel = 0;
ResetData *pReset;
EditRoom (ch, pRoom);
argument = one_argument (argument, arg1);
argument = one_argument (argument, arg2);
if (NullStr (arg1) || !is_number (arg1))
{
cmd_syntax (ch, NULL, n_fun, "<vnum> <args>",
"-no_args = into room", "-<obj> = into obj",
"-<mob> <wear_loc> = into mob", NULL);
return false;
}
if (!(pObjIndex = get_obj_index (atov (arg1))))
{
olc_msg (ch, n_fun, "No object has that vnum.");
return false;
}
if (pObjIndex->area != pRoom->area)
{
olc_msg (ch, n_fun, "No such object in this area.");
return false;
}
if (NullStr (arg2))
{
pReset = new_reset ();
pReset->command = 'O';
pReset->arg1 = pObjIndex->vnum;
pReset->arg2 = 0;
pReset->arg3 = pRoom->vnum;
pReset->arg4 = 0;
add_reset (pRoom, pReset, 0);
newobj = create_object (pObjIndex, number_fuzzy (olevel));
obj_to_room (newobj, pRoom);
olc_msg (ch, n_fun,
"%s (%ld) has been loaded and added to resets.",
capitalize (pObjIndex->short_descr), pObjIndex->vnum);
}
else
if (NullStr (argument) &&
((to_obj = get_obj_list (ch, arg2, pRoom->content_first)) != NULL))
{
pReset = new_reset ();
pReset->command = 'P';
pReset->arg1 = pObjIndex->vnum;
pReset->arg2 = 0;
pReset->arg3 = to_obj->pIndexData->vnum;
pReset->arg4 = 1;
add_reset (pRoom, pReset, 0);
newobj = create_object (pObjIndex, number_fuzzy (olevel));
newobj->cost = 0;
obj_to_obj (newobj, to_obj);
olc_msg (ch, n_fun,
"%s (%ld) has been loaded into "
"%s (%ld) and added to resets.",
capitalize (newobj->short_descr),
newobj->pIndexData->vnum, to_obj->short_descr,
to_obj->pIndexData->vnum);
}
else if ((to_mob = get_char_room (ch, NULL, arg2)) != NULL)
{
wloc_t pwear_loc = WEAR_NONE;
if ((pwear_loc = (wloc_t) flag_value (wear_loc_flags, argument)) ==
NO_FLAG)
{
olc_msg (ch, n_fun, "Invalid wear_loc.");
return false;
}
if (!IsSet (pObjIndex->wear_flags, wear_bit (pwear_loc)))
{
olc_msg (ch, n_fun, "%s (%ld) has wear flags: [%s]",
capitalize (pObjIndex->short_descr),
pObjIndex->vnum, flag_string (wear_flags,
pObjIndex->wear_flags));
return false;
}
if (get_eq_char (to_mob, pwear_loc))
{
olc_msg (ch, n_fun, "Object already equipped.");
return false;
}
pReset = new_reset ();
pReset->arg1 = pObjIndex->vnum;
pReset->arg2 = pwear_loc;
pReset->arg3 = pwear_loc;
if (pReset->arg2 == WEAR_NONE)
pReset->command = 'G';
else
pReset->command = 'E';
add_reset (pRoom, pReset, 0);
olevel = Range (0, to_mob->level - 2, MAX_MORTAL_LEVEL);
newobj = create_object (pObjIndex, number_fuzzy (olevel));
if (to_mob->pIndexData->pShop)
{
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)
SetBit (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, (wloc_t) pReset->arg3);
olc_msg (ch, n_fun,
"%s (%ld) has been loaded "
"%s of %s (%ld) and added to resets.",
capitalize (pObjIndex->short_descr), pObjIndex->vnum,
flag_string (wear_loc_strings, pReset->arg3),
to_mob->short_descr, to_mob->pIndexData->vnum);
}
else
{
olc_msg (ch, n_fun, "That mobile isn't here.");
return false;
}
act ("$n has created $p!", ch, newobj, NULL, TO_ROOM);
return true;
}
const char *
show_obj_values (ObjIndex * obj)
{
static char buf_new[5][MSL * 2];
static int i;
char *buf;
i++;
i %= 5;
buf = buf_new[i];
switch (obj->item_type)
{
default:
break;
case ITEM_LIGHT:
if (obj->value[2] == -1 || obj->value[2] == 999)
strcpy (buf, "[v2] Light: Infinite[-1]");
else
sprintf (buf, "[v2] Light: [%ld]", obj->value[2]);
break;
case ITEM_WAND:
case ITEM_STAFF:
sprintf (buf,
"[v0] Level: [%ld]" NEWLINE
"[v1] Charges Total: [%ld]" NEWLINE
"[v2] Charges Left: [%ld]" NEWLINE
"[v3] Spell: %s", obj->value[0],
obj->value[1], obj->value[2],
obj->value[3] !=
-1 ? skill_table[obj->value[3]].name : "none");
break;
case ITEM_PORTAL:
sprintf (buf,
"[v0] Charges: [%ld]" NEWLINE
"[v1] Exit Flags: %s" NEWLINE
"[v2] Portal Flags: %s" NEWLINE
"[v3] Goes to (vnum): [%ld]", obj->value[0],
flag_string (exit_flags, obj->value[1]),
flag_string (portal_flags, obj->value[2]), obj->value[3]);
break;
case ITEM_FURNITURE:
sprintf (buf,
"[v0] Max people: [%ld]" NEWLINE
"[v1] Max weight: [%ld]" NEWLINE
"[v2] Furniture Flags: %s" NEWLINE
"[v3] Heal bonus: [%ld]" NEWLINE
"[v4] Mana bonus: [%ld]", obj->value[0],
obj->value[1], flag_string (furniture_flags,
obj->value[2]),
obj->value[3], obj->value[4]);
break;
case ITEM_SCROLL:
case ITEM_POTION:
case ITEM_PILL:
sprintf (buf,
"[v0] Level: [%ld]" NEWLINE
"[v1] Spell: %s" NEWLINE
"[v2] Spell: %s" NEWLINE
"[v3] Spell: %s" NEWLINE
"[v4] Spell: %s", obj->value[0],
obj->value[1] !=
-1 ? skill_table[obj->value[1]].name : "none",
obj->value[2] !=
-1 ? skill_table[obj->value[2]].name : "none",
obj->value[3] !=
-1 ? skill_table[obj->value[3]].name : "none",
obj->value[4] !=
-1 ? skill_table[obj->value[4]].name : "none");
break;
case ITEM_ARMOR:
sprintf (buf,
"[v0] Ac pierce [%ld]" NEWLINE
"[v1] Ac bash [%ld]" NEWLINE
"[v2] Ac slash [%ld]" NEWLINE
"[v3] Ac exotic [%ld]", obj->value[0],
obj->value[1], obj->value[2], obj->value[3]);
break;
case ITEM_WEAPON:
sprintf (buf, "[v0] Weapon class: %s" NEWLINE
"[v1] Number of dice: [%ld]" NEWLINE
"[v2] Type of dice: [%ld]" NEWLINE
"[v3] Type: %s" NEWLINE
"[v4] Special type: %s",
flag_string (weapon_types, obj->value[0]),
obj->value[1], obj->value[2],
attack_table[obj->value[3]].name,
flag_string (weapon_flags, obj->value[4]));
break;
case ITEM_CONTAINER:
sprintf (buf,
"[v0] Weight: [%ld kg]" NEWLINE
"[v1] Flags: [%s]" NEWLINE
"[v2] Key: %s [%ld]" NEWLINE
"[v3] Capacity [%ld]" NEWLINE
"[v4] Weight Mult [%ld]", obj->value[0],
flag_string (container_flags, obj->value[1]),
get_obj_index (obj->value[2]) ? get_obj_index (obj->value
[2])->
short_descr : "none", obj->value[2], obj->value[3],
obj->value[4]);
break;
case ITEM_DRINK_CON:
sprintf (buf,
"[v0] Liquid Total: [%ld]" NEWLINE
"[v1] Liquid Left: [%ld]" NEWLINE
"[v2] Liquid: %s" NEWLINE
"[v3] Poisoned: %s",
obj->value[0], obj->value[1],
liq_table[obj->value[2]].liq_name,
obj->value[3] != 0 ? "Yes" : "No");
break;
case ITEM_FOUNTAIN:
sprintf (buf,
"[v0] Liquid Total: [%ld]" NEWLINE
"[v1] Liquid Left: [%ld]" NEWLINE
"[v2] Liquid: %s", obj->value[0],
obj->value[1], liq_table[obj->value[2]].liq_name);
break;
case ITEM_FOOD:
sprintf (buf,
"[v0] Food hours: [%ld]" NEWLINE
"[v1] Full hours: [%ld]" NEWLINE
"[v3] Poisoned: %s",
obj->value[0], obj->value[1],
obj->value[3] != 0 ? "Yes" : "No");
break;
case ITEM_MONEY:
sprintf (buf, "[v0] Gold: [%ld]", obj->value[0]);
break;
}
return buf;
}
bool
set_obj_values (CharData * ch, ObjIndex * pObj, int value_num,
const char *argument)
{
switch (pObj->item_type)
{
default:
break;
case ITEM_LIGHT:
switch (value_num)
{
default:
do_function (ch, &do_oldhelp, "ITEM_LIGHT");
return false;
case 2:
chprintln (ch, "HOURS OF LIGHT SET.");
pObj->value[2] = atol (argument);
break;
}
break;
case ITEM_WAND:
case ITEM_STAFF:
switch (value_num)
{
default:
do_function (ch, &do_oldhelp, "ITEM_STAFF_WAND");
return false;
case 0:
chprintln (ch, "SPELL LEVEL SET.");
pObj->value[0] = atol (argument);
break;
case 1:
chprintln (ch, "TOTAL NUMBER OF CHARGES SET.");
pObj->value[1] = atol (argument);
break;
case 2:
chprintln (ch, "CURRENT NUMBER OF CHARGES SET.");
pObj->value[2] = atol (argument);
break;
case 3:
chprintln (ch, "SPELL TYPE SET.");
pObj->value[3] = skill_lookup (argument);
break;
}
break;
case ITEM_SCROLL:
case ITEM_POTION:
case ITEM_PILL:
switch (value_num)
{
default:
do_function (ch, &do_oldhelp, "ITEM_SCROLL_POTION_PILL");
return false;
case 0:
chprintln (ch, "SPELL LEVEL SET.");
pObj->value[0] = atol (argument);
break;
case 1:
chprintln (ch, "SPELL TYPE 1 SET.");
pObj->value[1] = skill_lookup (argument);
break;
case 2:
chprintln (ch, "SPELL TYPE 2 SET.");
pObj->value[2] = skill_lookup (argument);
break;
case 3:
chprintln (ch, "SPELL TYPE 3 SET.");
pObj->value[3] = skill_lookup (argument);
break;
case 4:
chprintln (ch, "SPELL TYPE 4 SET.");
pObj->value[4] = skill_lookup (argument);
break;
}
break;
case ITEM_ARMOR:
switch (value_num)
{
default:
do_function (ch, &do_oldhelp, "ITEM_ARMOR");
return false;
case 0:
chprintln (ch, "AC PIERCE SET.");
pObj->value[0] = atol (argument);
break;
case 1:
chprintln (ch, "AC BASH SET.");
pObj->value[1] = atol (argument);
break;
case 2:
chprintln (ch, "AC SLASH SET.");
pObj->value[2] = atol (argument);
break;
case 3:
chprintln (ch, "AC EXOTIC SET.");
pObj->value[3] = atol (argument);
break;
}
break;
case ITEM_WEAPON:
switch (value_num)
{
default:
do_function (ch, &do_oldhelp, "ITEM_WEAPON");
return false;
case 0:
chprintln (ch, "WEAPON CLASS SET.");
ALT_FLAGVALUE_SET (pObj->value[0], weapon_types, argument);
break;
case 1:
chprintln (ch, "NUMBER OF DICE SET.");
pObj->value[1] = atol (argument);
break;
case 2:
chprintln (ch, "TYPE OF DICE SET.");
pObj->value[2] = atol (argument);
break;
case 3:
chprintln (ch, "WEAPON TYPE SET.");
pObj->value[3] = attack_lookup (argument);
break;
case 4:
chprintln (ch, "SPECIAL WEAPON TYPE TOGGLED.");
ALT_FLAGVALUE_TOGGLE (pObj->value[4], weapon_flags, argument);
break;
}
break;
case ITEM_PORTAL:
switch (value_num)
{
default:
do_function (ch, &do_oldhelp, "ITEM_PORTAL");
return false;
case 0:
chprintln (ch, "CHARGES SET.");
pObj->value[0] = atol (argument);
break;
case 1:
chprintln (ch, "EXIT FLAGS SET.");
ALT_FLAGVALUE_SET (pObj->value[1], exit_flags, argument);
break;
case 2:
chprintln (ch, "PORTAL FLAGS SET.");
ALT_FLAGVALUE_SET (pObj->value[2], portal_flags, argument);
break;
case 3:
chprintln (ch, "EXIT vnum_t SET.");
pObj->value[3] = atol (argument);
break;
}
break;
case ITEM_FURNITURE:
switch (value_num)
{
default:
do_function (ch, &do_oldhelp, "ITEM_FURNITURE");
return false;
case 0:
chprintln (ch, "NUMBER OF PEOPLE SET.");
pObj->value[0] = atol (argument);
break;
case 1:
chprintln (ch, "MAX WEIGHT SET.");
pObj->value[1] = atol (argument);
break;
case 2:
chprintln (ch, "FURNITURE FLAGS TOGGLED.");
ALT_FLAGVALUE_TOGGLE (pObj->value[2], furniture_flags, argument);
break;
case 3:
chprintln (ch, "HEAL BONUS SET.");
pObj->value[3] = atol (argument);
break;
case 4:
chprintln (ch, "MANA BONUS SET.");
pObj->value[4] = atol (argument);
break;
}
break;
case ITEM_CONTAINER:
switch (value_num)
{
flag_t value;
default:
do_function (ch, &do_oldhelp, "ITEM_CONTAINER");
return false;
case 0:
chprintln (ch, "WEIGHT CAPACITY SET.");
pObj->value[0] = atol (argument);
break;
case 1:
if ((value = flag_value (container_flags, argument)) != NO_FLAG)
ToggleBit (pObj->value[1], value);
else
{
do_function (ch, &do_oldhelp, "ITEM_CONTAINER");
return false;
}
chprintln (ch, "CONTAINER TYPE SET.");
break;
case 2:
if (atol (argument) != 0)
{
if (!get_obj_index (atov (argument)))
{
chprintln (ch, "THERE IS NO SUCH ITEM.");
return false;
}
if (get_obj_index (atov (argument))->item_type != ITEM_KEY)
{
chprintln (ch, "THAT ITEM IS NOT A Key.");
return false;
}
}
chprintln (ch, "CONTAINER Key SET.");
pObj->value[2] = atol (argument);
break;
case 3:
chprintln (ch, "CONTAINER MAX WEIGHT SET.");
pObj->value[3] = atol (argument);
break;
case 4:
chprintln (ch, "WEIGHT MULTIPLIER SET.");
pObj->value[4] = atol (argument);
break;
}
break;
case ITEM_DRINK_CON:
switch (value_num)
{
default:
do_function (ch, &do_oldhelp, "ITEM_DRINK");
return false;
case 0:
chprintln (ch, "MAXIMUM AMOUT OF LIQUID HOURS SET.");
pObj->value[0] = atol (argument);
break;
case 1:
chprintln (ch, "CURRENT AMOUNT OF LIQUID HOURS SET.");
pObj->value[1] = atol (argument);
break;
case 2:
chprintln (ch, "LIQUID TYPE SET.");
pObj->value[2] =
(liq_lookup (argument) != -1 ? liq_lookup (argument) : 0);
break;
case 3:
chprintln (ch, "POISON VALUE TOGGLED.");
pObj->value[3] = (pObj->value[3] == 0) ? 1 : 0;
break;
}
break;
case ITEM_FOUNTAIN:
switch (value_num)
{
default:
do_function (ch, &do_oldhelp, "ITEM_FOUNTAIN");
return false;
case 0:
chprintln (ch, "MAXIMUM AMOUT OF LIQUID HOURS SET.");
pObj->value[0] = atol (argument);
break;
case 1:
chprintln (ch, "CURRENT AMOUNT OF LIQUID HOURS SET.");
pObj->value[1] = atol (argument);
break;
case 2:
chprintln (ch, "LIQUID TYPE SET.");
pObj->value[2] =
(liq_lookup (argument) != -1 ? liq_lookup (argument) : 0);
break;
}
break;
case ITEM_FOOD:
switch (value_num)
{
default:
do_function (ch, &do_oldhelp, "ITEM_FOOD");
return false;
case 0:
chprintln (ch, "HOURS OF FOOD SET.");
pObj->value[0] = atol (argument);
break;
case 1:
chprintln (ch, "HOURS OF FULL SET.");
pObj->value[1] = atol (argument);
break;
case 3:
chprintln (ch, "POISON VALUE TOGGLED.");
pObj->value[3] = (pObj->value[3] == 0) ? 1 : 0;
break;
}
break;
case ITEM_MONEY:
switch (value_num)
{
default:
do_function (ch, &do_oldhelp, "ITEM_MONEY");
return false;
case 0:
chprintln (ch, "GOLD AMOUNT SET.");
pObj->value[0] = atol (argument);
break;
case 1:
chprintln (ch, "SILVER AMOUNT SET.");
pObj->value[1] = atol (argument);
break;
}
break;
}
chprintln (ch, show_obj_values (pObj));
return true;
}
bool
set_value (CharData * ch, ObjIndex * pObj, const char *argument, int value)
{
if (NullStr (argument))
{
set_obj_values (ch, pObj, -1, "");
return false;
}
if (set_obj_values (ch, pObj, value, argument))
return true;
return false;
}
bool
oedit_values (CharData * ch, const char *argument, int value)
{
ObjIndex *pObj;
GetEdit (ch, ObjIndex, pObj);
if (set_value (ch, pObj, argument, value))
return true;
return false;
}
void
show_liqlist (CharData * ch)
{
int liq;
Buffer *buffer;
buffer = new_buf ();
for (liq = 0; liq_table[liq].liq_name != NULL; liq++)
{
if ((liq % 21) == 0)
bprintln (buffer,
"Name Color Proof Full Thirst Food Ssize");
bprintlnf (buffer, "%-20s %-14s %5d %4d %6d %4d %5d",
liq_table[liq].liq_name, liq_table[liq].liq_color,
liq_table[liq].liq_affect[0],
liq_table[liq].liq_affect[1],
liq_table[liq].liq_affect[2],
liq_table[liq].liq_affect[3], liq_table[liq].liq_affect[4]);
}
sendpage (ch, buf_string (buffer));
free_buf (buffer);
return;
}
void
show_damlist (CharData * ch)
{
int att;
Buffer *buffer;
buffer = new_buf ();
for (att = 0; attack_table[att].name != NULL; att++)
{
if ((att % 21) == 0)
bprintln (buffer, "Name Noun");
bprintlnf (buffer, "%-20s %-20s", attack_table[att].name,
attack_table[att].noun);
}
sendpage (ch, buf_string (buffer));
free_buf (buffer);
return;
}
Olc_Fun (medit_group)
{
CharIndex *pMob;
CharIndex *pMTemp;
char arg[MAX_STRING_LENGTH];
int temp;
Buffer *buffer;
bool found = false;
GetEdit (ch, CharIndex, pMob);
if (NullStr (argument))
{
cmd_syntax (ch, NULL, n_fun, "<number>", "show <number>", NULL);
return false;
}
if (is_number (argument))
{
pMob->group = atov (argument);
olc_msg (ch, n_fun, "Group set.");
return true;
}
argument = one_argument (argument, arg);
if (!str_cmp (arg, "show") && is_number (argument))
{
if (atov (argument) == 0)
{
olc_msg (ch, n_fun, "Are you crazy?");
return false;
}
buffer = new_buf ();
for (temp = 0; temp < MAX_KEY_HASH; temp++)
{
for (pMTemp = char_index_hash[temp]; pMTemp; pMTemp = pMTemp->next)
if (pMTemp && (pMTemp->group == atov (argument)))
{
found = true;
bprintlnf (buffer, "[%5ld] %s", pMTemp->vnum,
pMTemp->player_name);
}
}
if (found)
sendpage (ch, buf_string (buffer));
else
olc_msg (ch, n_fun, "No mobs in that group.");
free_buf (buffer);
return false;
}
return false;
}
Olc_Fun (cledit_skill)
{
int sn;
ClassData *pClass;
int Class;
int value;
bool pLevel;
char arg1[MIL], arg2[MIL], arg3[MIL];
GetEdit (ch, ClassData, pClass);
argument = one_argument (argument, arg1);
argument = one_argument (argument, arg2);
argument = one_argument (argument, arg3);
if (NullStr (arg1) || NullStr (arg2) || NullStr (arg3))
{
cmd_syntax (ch, NULL, n_fun, "<skill> rating|level <value>", NULL);
return false;
}
if ((sn = skill_lookup (arg1)) < 0 || sn >= top_skill)
{
olc_msg (ch, n_fun, "Thats not a valid skill.");
return false;
}
if (!str_cmp (arg2, "rating"))
pLevel = false;
else if (!str_cmp (arg2, "level"))
pLevel = true;
else
{
olc_msg (ch, n_fun,
"Please choose either a skill 'rating' or 'level'.");
return false;
}
value = atoi (arg3);
if (pLevel && (value < 1 || value > MAX_LEVEL))
{
olc_msg (ch, n_fun, "Please choose a level between 1 and %d.",
MAX_LEVEL);
return false;
}
Class = class_lookup (pClass->name[0]);
if (pLevel)
{
skill_table[sn].skill_level[Class] = value;
olc_msg (ch, n_fun, "Class skill level set.");
}
else
{
skill_table[sn].rating[Class] = value;
olc_msg (ch, n_fun, "Class rating set.");
}
return true;
}
Olc_Fun (cledit_index)
{
ClassData *pClass;
Column Cd;
int i;
GetEdit (ch, ClassData, pClass);
if (NullStr (argument))
{
cmd_syntax (ch, NULL, n_fun, "<index name>", NULL);
return false;
}
if (is_name (argument, "clear reset none"))
{
pClass->index = &class_null;
olc_msg (ch, n_fun, "Index cleared.");
return true;
}
for (i = 0; class_index[i].name != NULL; i++)
{
if (!str_cmp (argument, class_index[i].name))
{
if (class_index[i].index != &class_null
&& (!class_index[i].index || !*(int *) class_index[i].index))
{
int tmp;
for (tmp = 0; tmp < top_class; tmp++)
if (&class_table[tmp] == pClass)
break;
*(int *) class_index[i].index = tmp;
}
pClass->index = (int *) class_index[i].index;
olc_msg (ch, n_fun, "%s now uses global skill pointer '%s'.",
pClass->name, class_index[i].name);
return true;
}
}
set_cols (&Cd, ch, 4, COLS_CHAR, ch);
for (i = 0; class_index[i].name != NULL; i++)
print_cols (&Cd, class_index[i].name);
cols_nl (&Cd);
olc_msg (ch, n_fun, "That class hasn't been coded in yet.");
return false;
}
Olc_Fun (cmdedit_dofun)
{
CmdData *pCmd;
Do_F *fun;
GetEdit (ch, CmdData, pCmd);
if (NullStr (argument))
{
cmd_syntax (ch, NULL, n_fun, "<do_function>", NULL);
return false;
}
if (is_name (argument, "none clear reset"))
{
pCmd->do_fun = do_null;
olc_msg (ch, n_fun, "Function entry reset.");
return true;
}
if ((fun = (Do_F *) index_lookup (argument, dofun_index, NULL)) == NULL)
{
olc_msg (ch, n_fun,
"That is not a valid function (probably not coded in yet)");
return false;
}
pCmd->do_fun = fun;
olc_msg (ch, n_fun, "%s now points to the %s function.", pCmd->name,
argument);
return true;
}
Olc_Fun (cmdedit_rearrange)
{
CmdData *pCmd, *iCmd, *tmp;
bool found = false;
GetEdit (ch, CmdData, pCmd);
if (NullStr (argument))
{
cmd_syntax (ch, NULL, n_fun, "<cmd to place before>", NULL);
return false;
}
if ((iCmd = cmd_lookup (argument)) == NULL)
{
olc_msg (ch, n_fun, "That is not a command.");
return false;
}
if (iCmd == pCmd)
{
olc_msg (ch, n_fun, "Can't rearrange the same command.");
return false;
}
for (tmp = cmd_first; tmp; tmp = tmp->next)
{
if (tmp == pCmd)
{
found = true;
continue;
}
if (tmp == iCmd)
{
if (found)
{
olc_msg (ch, n_fun,
"Error: command %s is already above %s.",
pCmd->name, iCmd->name);
return false;
}
else
break;
}
}
UnLink (pCmd, cmd, next, prev);
Insert (pCmd, iCmd, cmd, next, prev);
for (tmp = cmd_first; tmp; tmp = tmp->next)
unhash_command (tmp);
for (tmp = cmd_first; tmp; tmp = tmp->next)
hash_command (tmp);
olc_msg (ch, n_fun, "Command moved.");
return true;
}
Olc_Fun (cmdedit_name)
{
bool relocate;
CmdData *pCmd;
char arg1[MIL];
GetEdit (ch, CmdData, pCmd);
one_argument (argument, arg1);
if (NullStr (arg1))
{
chprintln (ch, "Cannot clear name field!");
return false;
}
if (arg1[0] != pCmd->name[0])
{
unhash_command (pCmd);
relocate = true;
}
else
relocate = false;
replace_str (&pCmd->name, arg1);
if (relocate)
hash_command (pCmd);
chprintln (ch, "Name set.");
return true;
}
Olc_Fun (gredit_ratings)
{
GroupData *pGroup;
int pClass, value;
char arg1[MIL], arg2[MIL];
GetEdit (ch, GroupData, pGroup);
argument = one_argument (argument, arg1);
one_argument (argument, arg2);
if (NullStr (arg1) || NullStr (arg2))
{
cmd_syntax (ch, NULL, n_fun, "<class> <value>", NULL);
return false;
}
if ((pClass = class_lookup (arg1)) == -1)
{
olc_msg (ch, n_fun, "That is not a valid class.");
return false;
}
if (!is_number (arg2))
{
olc_msg (ch, n_fun, "That is not a valid value.");
return false;
}
else
value = atoi (arg2);
pGroup->rating[pClass] = value;
olc_msg (ch, n_fun, "%s's rating for %s changed to %d.", pGroup->name,
class_table[pClass].name[0], value);
return true;
}
Olc_Fun (cledit_name)
{
ClassData *pClass;
int i, j;
char arg[MIL], name[MIL];
GetEdit (ch, ClassData, pClass);
argument = one_argument (argument, arg);
one_argument (argument, name);
if (NullStr (arg) || NullStr (argument))
{
cmd_syntax (ch, NULL, n_fun, "<#remort> <name>", NULL);
return false;
}
if ((i = atoi (arg)) < 1 || i > MAX_REMORT)
{
olc_msg (ch, n_fun, "Remort number must be between 1 and %d.",
MAX_REMORT);
return false;
}
i--;
if (strlen (name) > 25)
{
olc_msg (ch, n_fun, "Name too long.");
return false;
}
if ((j = class_lookup (name)) != -1)
{
olc_msg (ch, n_fun, "A class with that name exists.");
return false;
}
replace_str (&pClass->name[i], Upper (name));
olc_msg (ch, n_fun, "Name set.");
return true;
}
Olc_Fun (gredit_spells)
{
GroupData *pGroup;
int i;
bool found = false;
GetEdit (ch, GroupData, pGroup);
if (NullStr (argument))
{
cmd_syntax (ch, NULL, n_fun, "<spell-name>", NULL);
return false;
}
for (i = 0; pGroup->spells[i] != NULL; i++)
{
if (found)
{
pGroup->spells[i - 1] = pGroup->spells[i];
pGroup->spells[i] = NULL;
continue;
}
if (!str_cmp (argument, pGroup->spells[i]))
{
olc_msg (ch, n_fun, "%s spell removed.", pGroup->spells[i]);
free_string (pGroup->spells[i]);
pGroup->spells[i] = NULL;
found = true;
}
}
if (found)
return true;
if (i >= MAX_IN_GROUP)
{
olc_msg (ch, n_fun, "Too many spells already in group.");
return false;
}
if (skill_lookup (argument) == -1)
chprintln (ch, "WARNING: that skill does not exist.");
replace_str (&pGroup->spells[i], argument);
olc_msg (ch, n_fun, "%s skill/spell added to %s.", argument, pGroup->name);
return true;
}
Olc_Fun (raedit_classx)
{
char clas[MSL];
char value[MSL];
RaceData *pRace;
GetEdit (ch, RaceData, pRace);
if (!pRace->pc_race)
{
olc_msg (ch, n_fun, "Race must be a PC race first.");
return false;
}
if (!NullStr (argument))
{
argument = one_argument (argument, clas);
argument = one_argument (argument, value);
if (class_lookup (clas) < 0)
{
olc_msg (ch, n_fun, "That class does not exist.");
return false;
}
if (!is_number (value))
{
olc_msg (ch, n_fun, "Second argument must be numeric.");
return false;
}
if (atoi (value) < 75)
{
olc_msg (ch, n_fun,
"{RWARNING!{x Class modifier should be at least 75.");
}
pRace->class_mult[class_lookup (clas)] = atoi (value);
olc_msg (ch, n_fun, "Race modifier for class %s is set to %d.",
clas, atoi (value));
return true;
}
cmd_syntax (ch, NULL, n_fun, "<class> <value>", NULL);
return false;
}
Olc_Fun (raedit_skills)
{
int x;
RaceData *pRace;
bool found = false;
GetEdit (ch, RaceData, pRace);
if (!pRace->pc_race)
{
olc_msg (ch, n_fun, "Race must be a PC race first.");
return false;
}
if (skill_lookup (argument) != -1)
{
for (x = 0; x < MAX_RACE_SKILL; x++)
{
if (found)
{
replace_str (&pRace->skills[x - 1], pRace->skills[x]);
continue;
}
if (!str_cmp (pRace->skills[x], argument))
{
free_string (pRace->skills[x]);
pRace->skills[x] = NULL;
olc_msg (ch, n_fun, "Skill %s deleted.", argument);
found = true;
continue;
}
if (pRace->skills[x] == NULL)
{
replace_str (&pRace->skills[x], argument);
olc_msg (ch, n_fun, "Skill %s set.", argument);
return true;
}
}
if (found)
return true;
if (x == MAX_RACE_SKILL)
{
chprintln (ch, "No available spaces for skill.");
return false;
}
}
cmd_syntax (ch, NULL, n_fun, "<skill>", NULL);
return false;
}
Olc_Fun (raedit_name)
{
RaceData *pRace;
CharIndex *pMob;
int ihash;
char arg[MIL];
GetEdit (ch, RaceData, pRace);
first_arg (argument, arg, false);
if (NullStr (arg))
{
olc_msg (ch, n_fun, "Change name to what?");
return false;
}
if (race_lookup (arg) != NULL)
{
olc_msg (ch, n_fun, "A race with that name already exists.");
return false;
}
if (str_cmp (arg, pRace->name))
{
for (ihash = 0; ihash < MAX_KEY_HASH; ihash++)
{
for (pMob = char_index_hash[ihash]; pMob; pMob = pMob->next)
{
if (pMob->race == pRace)
SetBit (pMob->area->area_flags, AREA_CHANGED);
}
}
}
replace_str (&pRace->name, arg);
olc_msg (ch, n_fun, "Name set.");
return true;
}
Olc_Fun (skedit_levels)
{
SkillData *pSkill;
char arg1[MIL], arg2[MIL];
int pClass;
int lev;
argument = one_argument (argument, arg1);
one_argument (argument, arg2);
GetEdit (ch, SkillData, pSkill);
if (NullStr (arg1) || NullStr (arg2))
{
cmd_syntax (ch, NULL, n_fun, "<class> <level>", NULL);
return false;
}
if ((pClass = class_lookup (arg1)) == -1)
{
olc_msg (ch, n_fun, "That is not a valid class.");
return false;
}
if (!is_number (arg2) || (lev = atoi (arg2)) < 0 || lev > MAX_LEVEL)
{
olc_msg (ch, n_fun, "That is not a valid level.");
return false;
}
pSkill->skill_level[pClass] = lev;
olc_msg (ch, n_fun, "Skill level for %s set to %d.",
class_table[pClass].name[0], lev);
return true;
}
Olc_Fun (skedit_ratings)
{
SkillData *pSkill;
int pClass, lev;
char arg1[MIL], arg2[MIL];
GetEdit (ch, SkillData, pSkill);
argument = one_argument (argument, arg1);
one_argument (argument, arg2);
if (NullStr (arg1) || NullStr (arg2))
{
cmd_syntax (ch, NULL, n_fun, "<class> <rating>", NULL);
return false;
}
if ((pClass = class_lookup (arg1)) == -1)
{
olc_msg (ch, n_fun, "That is not a valid class.");
return false;
}
if (!is_number (arg2))
{
olc_msg (ch, n_fun, "That is not a valid rating.");
return false;
}
else
lev = atoi (arg2);
pSkill->rating[pClass] = lev;
olc_msg (ch, n_fun, "Skill rating for %s set to %d.",
class_table[pClass].name[0], lev);
return true;
}
Olc_Fun (skedit_spellfun)
{
SkillData *pSkill;
int i;
GetEdit (ch, SkillData, pSkill);
if (NullStr (argument))
{
cmd_syntax (ch, NULL, n_fun, "<spell_function>", NULL);
return false;
}
if (is_name (argument, "none clear reset"))
{
pSkill->spell_fun = spell_null;
olc_msg (ch, n_fun, "Spell value reset.");
return true;
}
for (i = 0; spell_index[i].name != NULL; i++)
{
if (!str_cmp (argument, spell_index[i].name))
{
pSkill->spell_fun = (Spell_F *) spell_index[i].index;
olc_msg (ch, n_fun, "%s now uses spell function '%s'.",
pSkill->name, spell_index[i].name);
return true;
}
}
olc_msg (ch, n_fun, "That spell function hasn't been coded into the mud.");
return false;
}
Olc_Fun (skedit_gsn)
{
SkillData *pSkill;
Column Cd;
int i;
GetEdit (ch, SkillData, pSkill);
if (NullStr (argument))
{
cmd_syntax (ch, NULL, n_fun, "<gsn-name>", NULL);
return false;
}
if (is_name (argument, "clear reset none"))
{
pSkill->pgsn = &gsn_null;
olc_msg (ch, n_fun, "GSN Entry cleared.");
return true;
}
for (i = 0; gsn_index[i].name != NULL; i++)
{
if (!str_cmp (argument, gsn_index[i].name))
{
if (gsn_index[i].index != &gsn_null
&& (!gsn_index[i].index || !*(int *) gsn_index[i].index))
{
int tmp;
for (tmp = 0; tmp < top_skill; tmp++)
if (&skill_table[tmp] == pSkill)
break;
*(int *) gsn_index[i].index = tmp;
}
pSkill->pgsn = (int *) gsn_index[i].index;
olc_msg (ch, n_fun, "%s now uses global skill pointer '%s'.",
pSkill->name, gsn_index[i].name);
return true;
}
}
set_cols (&Cd, ch, 4, COLS_CHAR, ch);
for (i = 0; gsn_index[i].name != NULL; i++)
print_cols (&Cd, gsn_index[i].name);
cols_nl (&Cd);
olc_msg (ch, n_fun, "That GSN hasn't been coded in yet.");
return false;
}
Olc_Fun (sedit_name)
{
bool relocate;
SocialData *psocial;
char arg1[MIL];
GetEdit (ch, SocialData, psocial);
one_argument (argument, arg1);
if (NullStr (arg1))
{
olc_msg (ch, n_fun, "Cannot clear name field!");
return false;
}
if (arg1[0] != psocial->name[0])
{
unhash_social (psocial);
relocate = true;
}
else
relocate = false;
replace_str (&psocial->name, arg1);
if (relocate)
hash_social (psocial);
olc_msg (ch, n_fun, "Name set.");
return true;
}
Olc_Fun (songedit_lyrics)
{
char arg[MIL];
SongData *pSong;
GetEdit (ch, SongData, pSong);
argument = one_argument (argument, arg);
if (NullStr (arg))
{
cmd_syntax (ch, NULL, n_fun, "+ <string>", "-", NULL);
return false;
}
if (!str_cmp (arg, "+"))
{
if (NullStr (argument))
{
olc_msg (ch, n_fun, "No Blank Lines.");
return false;
}
if (pSong->lines >= MAX_LINES)
{
olc_msg (ch, n_fun, "I'm afraid you can't add any more lines.");
return false;
}
replace_str (&pSong->lyrics[pSong->lines], argument);
pSong->lines += 1;
olc_msg (ch, n_fun, "Line added.");
return true;
}
if (!str_cmp (arg, "-"))
{
pSong->lines -= 1;
if (pSong->lines < 0)
{
pSong->lines = 0;
olc_msg (ch, n_fun, "Lyrics Cleared.");
return false;
}
replace_str (&pSong->lyrics[pSong->lines], " ");
olc_msg (ch, n_fun, "Line deleted.");
return true;
}
cmd_syntax (ch, NULL, n_fun, "+ <string>", "-", NULL);
return false;
}
Olc_Fun (cedit_rank)
{
ClanData *pClan;
char str1[MIL];
GetEdit (ch, ClanData, pClan);
argument = one_argument (argument, str1);
if (is_number (str1) && atoi (str1) <= MAX_RANK && atoi (str1) > 0)
{
int value;
value = atoi (str1) - 1;
if (!NullStr (argument))
{
replace_str (&pClan->rank[value].rankname, argument);
olc_msg (ch, n_fun, "Rank name changed.");
return true;
}
}
cmd_syntax (ch, NULL, n_fun, "<#> <rank-name>", NULL);
return false;
}
Olc_Fun (oedit_autoweapon)
{
ObjIndex *pObj;
GetEdit (ch, ObjIndex, pObj);
if (pObj->item_type != ITEM_WEAPON)
{
olc_msg (ch, n_fun, "Only works on weapons...");
return false;
}
if (pObj->level < 1)
{
olc_msg (ch, n_fun,
"Requires a level to be set on the weapon first(vnum %ld).",
pObj->vnum);
return false;
}
if (IsObjStat (pObj, ITEM_QUEST))
{
olc_msg (ch, n_fun, "This weapon cannot be autoset.");
return false;
}
autoweapon (pObj);
olc_msg (ch, n_fun, "Weapon set to default values, check for accuracy.");
return true;
}
Olc_Fun (oedit_autoarmor)
{
ObjIndex *pObj;
GetEdit (ch, ObjIndex, pObj);
if (pObj->item_type != ITEM_ARMOR)
{
olc_msg (ch, n_fun, "Item is not armor.");
return false;
}
if (pObj->level < 1)
{
olc_msg (ch, n_fun,
"A level must be set on the armor first. (vnum %ld)",
pObj->vnum);
return false;
}
if (IsObjStat (pObj, ITEM_QUEST))
{
olc_msg (ch, n_fun, "This weapon cannot be autoset.");
return false;
}
autoarmor (pObj);
olc_msg (ch, n_fun, "Experimental values for AC set.");
return true;
}
Olc_Fun (medit_autoset)
{
CharIndex *pMob;
GetEdit (ch, CharIndex, pMob);
if (pMob->level < 1)
{
olc_msg (ch, n_fun, "Set a level on the mob first!!!(vnum %ld)",
pMob->vnum);
return false;
}
autoset (pMob);
olc_msg (ch, n_fun, "Values set, check for accuracy.");
return true;
}
Olc_Fun (medit_autohard)
{
CharIndex *pMob;
GetEdit (ch, CharIndex, pMob);
if (pMob->level < 1)
{
olc_msg (ch, n_fun, "Set a level on the mob first!!!(vnum %ld)",
pMob->vnum);
return false;
}
autohard (pMob);
olc_msg (ch, n_fun, "Hard values set, check for accuracy.");
return true;
}
Olc_Fun (medit_autoeasy)
{
CharIndex *pMob;
GetEdit (ch, CharIndex, pMob);
if (pMob->level < 1)
{
olc_msg (ch, n_fun, "Set a level on the mob first!!!(vnum %ld)",
pMob->vnum);
return false;
}
autoeasy (pMob);
olc_msg (ch, n_fun, "Easy values set, check for accuracy.");
return true;
}
Olc_Fun (cmdedit_level)
{
CmdData *pCmd;
int lvl;
GetEdit (ch, CmdData, pCmd);
if (NullStr (argument))
{
cmd_syntax (NULL, n_fun, "<level>", NULL);
return false;
}
if ((lvl = atoi (argument)) < 0 || lvl > MAX_LEVEL)
{
olc_msg (ch, n_fun, "Please keep level between 0 and %d.", MAX_LEVEL);
return false;
}
if (pCmd->level < LEVEL_IMMORTAL && lvl >= LEVEL_IMMORTAL)
pCmd->category = CMDCAT_IMMORTAL;
else if (pCmd->level >= LEVEL_IMMORTAL && lvl < LEVEL_IMMORTAL)
pCmd->category = CMDCAT_NONE;
pCmd->level = lvl;
olc_msg (ch, n_fun, "Level set.");
return true;
}
Olc_Fun (hedit_addkeywd)
{
HelpData *pHelp;
char buf[MSL];
GetEdit (ch, HelpData, pHelp);
if (NullStr (argument))
{
cmd_syntax (ch, NULL, n_fun, "<keyword>", NULL);
return false;
}
if (is_exact_name (argument, pHelp->keyword))
{
olc_msg (ch, n_fun, "Keyword already exists.");
return false;
}
sprintf (buf, "%s %s", pHelp->keyword, strupper (argument));
replace_str (&pHelp->keyword, buf);
olc_msg (ch, n_fun, "Keyword added.");
return true;
}
Olc_Fun (hedit_copy)
{
HelpData *pHelp, *oHelp;
GetEdit (ch, HelpData, pHelp);
if (NullStr (argument))
{
cmd_syntax (ch, NULL, n_fun, "<keywords>", NULL);
return false;
}
if ((oHelp = help_lookup (argument)) == NULL)
{
olc_msg (ch, n_fun, "No such help!");
return false;
}
replace_str (&pHelp->keyword, oHelp->keyword);
replace_str (&pHelp->text, oHelp->text);
pHelp->level = oHelp->level;
pHelp->category = oHelp->category;
olc_msg (ch, n_fun, "Help info copied.");
return true;
}
Olc_Fun (redit_copy)
{
RoomIndex *pRoom, *oRoom;
ExDescrData *ed;
vnum_t vn;
EditRoom (ch, pRoom);
if (NullStr (argument))
{
cmd_syntax (ch, NULL, n_fun, "<vnum>", NULL);
return false;
}
vn = atov (argument);
if ((oRoom = get_room_index (vn)) == NULL)
{
olc_msg (ch, n_fun, "No such room!");
return false;
}
replace_str (&pRoom->name, oRoom->name);
replace_str (&pRoom->description, oRoom->description);
replace_str (&pRoom->owner, oRoom->owner);
pRoom->room_flags = oRoom->room_flags;
pRoom->sector_type = oRoom->sector_type;
pRoom->guild = oRoom->guild;
pRoom->heal_rate = oRoom->heal_rate;
pRoom->mana_rate = oRoom->mana_rate;
for (ed = oRoom->ed_first; ed; ed = ed->next)
{
ExDescrData *nEd;
nEd = new_ed ();
nEd->keyword = str_dup (ed->keyword);
nEd->description = str_dup (ed->description);
Link (nEd, pRoom->ed, next, prev);
}
return true;
}
Olc_Fun (medit_copy)
{
return false;
}
Olc_Fun (oedit_copy)
{
return false;
}
Olc_Fun (mpedit_copy)
{
return false;
}
Olc_Fun (opedit_copy)
{
return false;
}
Olc_Fun (rpedit_copy)
{
return false;
}
Olc_Fun (raedit_copy)
{
return false;
}
Olc_Fun (aedit_copy)
{
return false;
}
Olc_Fun (redit_snake)
{
RoomIndex *in_room, *tracer;
char holder[MAX_DIR], *ptr;
int count = 0;
in_room = ch->in_room;
if (NullStr (argument))
{
cmd_syntax (ch, NULL, n_fun, "<directions>", NULL);
chprintlnf (ch, NEWLINE "Example: %s 2n2e 2s2w", n_fun);
chprintln (ch,
"This will create a path of rooms 2 north and then 2 east, then create"
NEWLINE "a second path 2 south and 2 west.");
return false;
}
tracer = ch->in_room;
ptr = holder;
for (; *argument;)
{
char_from_room (ch);
char_to_room (ch, tracer);
switch (*argument)
{
default:
if (*argument < '0' || *argument > '9')
{
olc_msg (ch, n_fun, "Error in syntax.");
return false;
}
while (*argument >= '0' && *argument <= '9')
{
*ptr = *argument;
*(ptr + 1) = 0;
++argument;
}
count = atoi (holder);
break;
case ' ':
tracer = in_room;
break;
case 'n':
case 'N':
change_exit (n_fun, ch, "dig", DIR_NORTH);
tracer = ch->in_room->exit[0]->u1.to_room;
break;
case 'e':
case 'E':
change_exit (n_fun, ch, "dig", DIR_EAST);
tracer = ch->in_room->exit[1]->u1.to_room;
break;
case 's':
case 'S':
change_exit (n_fun, ch, "dig", DIR_SOUTH);
tracer = ch->in_room->exit[2]->u1.to_room;
break;
case 'w':
case 'W':
change_exit (n_fun, ch, "dig", DIR_WEST);
tracer = ch->in_room->exit[3]->u1.to_room;
break;
case 'u':
case 'U':
change_exit (n_fun, ch, "dig", DIR_UP);
tracer = ch->in_room->exit[4]->u1.to_room;
break;
case 'd':
case 'D':
change_exit (n_fun, ch, "dig", DIR_DOWN);
tracer = ch->in_room->exit[5]->u1.to_room;
break;
}
if (count == 0)
++argument;
else
--count;
}
char_from_room (ch);
char_to_room (ch, in_room);
return true;
}
#include "olc_delete.h"
#include "olc_create.h"
#include "olc_list.h"
#include "olc_validate.h"
#include "olc_ed.h"