/***************************************************************************
* File: olc.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. *
* *
***************************************************************************/
#include "merc.h"
#include "clans.h"
#include "interp.h"
#include "recycle.h"
#include "tables.h"
#include "olc.h"
#include "staffcmds.h"
/*
* Local functions.
*/
AREA_DATA *get_area_data args( ( int vnum ) );
bool SOCIAL_CHANGED = FALSE;
bool PMUSIC_CHANGED = FALSE;
bool COMMAND_CHANGED = FALSE;
/* Executed from comm.c. Minimizes compiling when changes are made. */
bool run_olc_editor( DESCRIPTOR_DATA *d )
{
switch ( d->editor )
{
case ED_GUILD:
gedit(d->character, d->incomm);
break;
case ED_AREA:
aedit(d->character, d->incomm);
break;
case ED_ROOM:
redit(d->character, d->incomm);
break;
case ED_OBJECT:
oedit(d->character, d->incomm);
break;
case ED_MOBILE:
medit(d->character, d->incomm);
break;
case ED_MPCODE:
mpedit(d->character, d->incomm);
break;
case ED_HELP:
hedit(d->character, d->incomm);
break;
case ED_SOCIAL:
sedit(d->character, d->incomm);
break;
case ED_PMUSIC:
pedit(d->character, d->incomm);
break;
case ED_COMMAND:
cmdedit(d->character, d->incomm);
break;
default:
return FALSE;
}
return TRUE;
}
char *olc_ed_name( CHAR_DATA *ch )
{
static char buf[10];
buf[0] = '\0';
switch (ch->desc->editor)
{
case ED_AREA:
sprintf(buf, "AEdit");
break;
case ED_ROOM:
sprintf(buf, "REdit");
break;
case ED_OBJECT:
sprintf(buf, "OEdit");
break;
case ED_MOBILE:
sprintf(buf, "MEdit");
break;
case ED_MPCODE:
sprintf(buf, "MPEdit");
break;
case ED_HELP:
sprintf(buf, "HEdit");
break;
case ED_GUILD:
sprintf(buf, "GEdit");
break;
case ED_SOCIAL:
sprintf(buf, "SEdit");
break;
case ED_PMUSIC:
sprintf(buf, "PEdit");
break;
case ED_COMMAND:
sprintf(buf, "CEdit");
break;
default:
sprintf(buf, " ");
break;
}
return buf;
}
char *olc_ed_desc( CHAR_DATA *ch )
{
static char buf[256];
buf[0] = '\0';
switch (ch->desc->editor)
{
case ED_PMUSIC: {
PMUSIC_DATA *pMusic;
pMusic = (PMUSIC_DATA *)ch->desc->pEdit;
sprintf(buf, "%s", pMusic->name);
break;
}
case ED_SOCIAL: {
SOCIAL_DATA *pSocial;
pSocial = (SOCIAL_DATA *)ch->desc->pEdit;
sprintf(buf, "%s", pSocial->name);
break;
}
case ED_HELP: {
HELP_DATA *pHelp;
pHelp = (HELP_DATA *)ch->desc->pEdit;
sprintf(buf, "%s", pHelp->keyword);
break;
}
case ED_GUILD: {
CLAN_DATA *pClan;
pClan = (CLAN_DATA *)ch->desc->pEdit;
sprintf(buf, "%s", pClan->name);
break;
}
case ED_AREA: {
AREA_DATA *pArea;
pArea = (AREA_DATA *)ch->desc->pEdit;
sprintf(buf, "%s", pArea->name);
break;
}
case ED_ROOM: {
ROOM_INDEX_DATA *pRoom;
pRoom = IN_ROOM(ch);
sprintf(buf, "%s", pRoom->name);
break;
}
case ED_OBJECT: {
OBJ_INDEX_DATA *pObj;
pObj = (OBJ_INDEX_DATA *)ch->desc->pEdit;
sprintf(buf, "%s", pObj->short_descr);
break;
}
case ED_MOBILE: {
MOB_INDEX_DATA *pMob;
pMob = (MOB_INDEX_DATA *)ch->desc->pEdit;
sprintf(buf, "%s", pMob->short_descr);
break;
}
case ED_MPCODE: {
MPROG_CODE *pMprog;
pMprog = (MPROG_CODE *)ch->desc->pEdit;
sprintf(buf, "%s", pMprog->name);
break;
}
case ED_COMMAND: {
CMD_DATA *pCmd;
pCmd = (CMD_DATA *)ch->desc->pEdit;
sprintf(buf, "%s", pCmd->name);
break;
}
default:
sprintf(buf, "ERROR");
break;
}
return buf;
}
char *olc_ed_vnum( CHAR_DATA *ch )
{
static char buf[10];
buf[0] = '\0';
switch (ch->desc->editor)
{
case ED_COMMAND: {
CMD_DATA *pCmd;
int cmd_lookup(char *arg);
pCmd = (CMD_DATA *)ch->desc->pEdit;
sprintf(buf, "%d", cmd_lookup(pCmd->name));
break;
}
case ED_PMUSIC: {
PMUSIC_DATA *pMusic;
pMusic = (PMUSIC_DATA *)ch->desc->pEdit;
sprintf(buf, "%d", pmusic_lookup(pMusic->name));
break;
}
case ED_SOCIAL: {
SOCIAL_DATA *pSocial;
pSocial = (SOCIAL_DATA *)ch->desc->pEdit;
sprintf(buf, "%d", social_lookup(pSocial->name));
break;
}
case ED_HELP: {
HELP_DATA *pHelp;
pHelp = (HELP_DATA *)ch->desc->pEdit;
sprintf(buf, "%d", pHelp->level);
break;
}
case ED_GUILD: {
CLAN_DATA *pClan;
pClan = (CLAN_DATA *)ch->desc->pEdit;
sprintf(buf, "%d", pClan ? pClan->vnum : 0);
break;
}
case ED_AREA: {
AREA_DATA *pArea;
pArea = (AREA_DATA *)ch->desc->pEdit;
sprintf(buf, "%d", pArea ? pArea->vnum : 0);
break;
}
case ED_ROOM: {
ROOM_INDEX_DATA *pRoom;
pRoom = ch->in_room;
sprintf(buf, "%d", pRoom ? pRoom->vnum : 0);
break;
}
case ED_OBJECT: {
OBJ_INDEX_DATA *pObj;
pObj = (OBJ_INDEX_DATA *)ch->desc->pEdit;
sprintf(buf, "%d", pObj ? pObj->vnum : 0);
break;
}
case ED_MOBILE: {
MOB_INDEX_DATA *pMob;
pMob = (MOB_INDEX_DATA *)ch->desc->pEdit;
sprintf(buf, "%d", pMob ? pMob->vnum : 0);
break;
}
case ED_MPCODE: {
MPROG_CODE *pMprog;
pMprog = (MPROG_CODE *)ch->desc->pEdit;
sprintf(buf, "%d", pMprog ? pMprog->vnum : 0);
break;
}
default:
sprintf(buf, " ");
break;
}
return buf;
}
/*****************************************************************************
Name: show_olc_cmds
Purpose: Format up the commands from given table.
Called by: show_commands(olc_act.c).
****************************************************************************/
void show_olc_cmds( CHAR_DATA *ch, const struct olc_cmd_type *olc_table )
{
char buf [ MAX_STRING_LENGTH ];
char buf1 [ MAX_STRING_LENGTH ];
int cmd;
int col;
buf1[0] = '\0';
col = 0;
for (cmd = 0; olc_table[cmd].name != NULL; cmd++)
{
sprintf( buf, "%-15.15s", olc_table[cmd].name );
strcat( buf1, buf );
if ( ++col % 5 == 0 )
strcat( buf1, "\n\r" );
}
if ( col % 5 != 0 )
strcat( buf1, "\n\r" );
send_to_char( buf1, ch );
return;
}
/*****************************************************************************
Name: show_commands
Purpose: Display all olc commands.
Called by: olc interpreters.
****************************************************************************/
bool show_commands( CHAR_DATA *ch, char *argument )
{
switch (ch->desc->editor)
{
case ED_GUILD:
show_olc_cmds(ch, gedit_table);
break;
case ED_AREA:
show_olc_cmds(ch, aedit_table);
break;
case ED_ROOM:
show_olc_cmds(ch, redit_table);
break;
case ED_OBJECT:
show_olc_cmds(ch, oedit_table);
break;
case ED_MOBILE:
show_olc_cmds(ch, medit_table);
break;
case ED_MPCODE:
show_olc_cmds(ch, mpedit_table);
break;
case ED_HELP:
show_olc_cmds(ch, hedit_table);
break;
case ED_SOCIAL:
show_olc_cmds(ch, sedit_table);
break;
case ED_PMUSIC:
show_olc_cmds(ch, pedit_table);
break;
case ED_COMMAND:
show_olc_cmds(ch, cedit_table);
}
return FALSE;
}
/*****************************************************************************
* Interpreter Tables. *
*****************************************************************************/
/* Guild edit command table */
const struct olc_cmd_type gedit_table[] =
{
{ "commands", show_commands },
{ "create", gedit_create },
{ "desc", gedit_descript },
{ "name", gedit_name },
{ "members", gedit_members },
{ "morgue", gedit_morgue },
{ "owner", gedit_owner },
{ "recall", gedit_recall },
{ "show", gedit_show },
{ "?", show_help },
{ NULL, 0 }
};
const struct olc_cmd_type aedit_table[] =
{
/* { command function }, */
{ "age", aedit_age },
{ "builder", aedit_builder },
{ "commands", show_commands },
{ "create", aedit_create },
{ "filename", aedit_file },
{ "name", aedit_name },
{ "reset", aedit_reset },
{ "security", aedit_security },
{ "show", aedit_show },
{ "vnum", aedit_vnum },
{ "lvnum", aedit_lvnum },
{ "uvnum", aedit_uvnum },
{ "theme", aedit_theme },
{ "?", show_help },
{ "version", show_version },
{ NULL, 0, }
};
const struct olc_cmd_type redit_table[] =
{
/* { command function }, */
{ "commands", show_commands },
{ "create", redit_create },
{ "desc", redit_desc },
{ "ed", redit_ed },
{ "format", redit_format },
{ "name", redit_name },
{ "show", redit_show },
{ "heal", redit_heal },
{ "mana", redit_mana },
{ "clan", redit_clan },
{ "copy", redit_copy },
{ "north", redit_north },
{ "south", redit_south },
{ "east", redit_east },
{ "west", redit_west },
{ "up", redit_up },
{ "down", redit_down },
/* New reset commands. */
{ "mreset", redit_mreset },
{ "oreset", redit_oreset },
{ "mshow", redit_mshow },
{ "oshow", redit_oshow },
{ "owner", redit_owner },
{ "room", redit_room },
{ "sector", redit_sector },
{ "image", redit_image },
{ "?", show_help },
{ "version", show_version },
{ NULL, 0, }
};
const struct olc_cmd_type oedit_table[] =
{
/* { command function }, */
{ "addaffect", oedit_addaffect },
{ "addapply", oedit_addapply },
{ "commands", show_commands },
{ "cost", oedit_cost },
{ "create", oedit_create },
{ "delaffect", oedit_delaffect },
{ "ed", oedit_ed },
{ "long", oedit_long },
{ "name", oedit_name },
{ "short", oedit_short },
{ "show", oedit_show },
{ "v0", oedit_value0 },
{ "v1", oedit_value1 },
{ "v2", oedit_value2 },
{ "v3", oedit_value3 },
{ "v4", oedit_value4 }, /* ROM */
{ "weight", oedit_weight },
{ "extra", oedit_extra }, /* ROM */
{ "wear", oedit_wear }, /* ROM */
{ "type", oedit_type }, /* ROM */
{ "material", oedit_material }, /* ROM */
{ "level", oedit_level }, /* ROM */
{ "condition", oedit_condition }, /* ROM */
{ "copy", oedit_copy },
{ "autoweapon", oedit_autoweapon },
{ "autoarmor", oedit_autoarmor },
{ "ndesc", oedit_notedesc },
{ "?", show_help },
{ "version", show_version },
{ NULL, 0, }
};
const struct olc_cmd_type medit_table[] =
{
/* { command function }, */
{ "alignment", medit_align },
{ "commands", show_commands },
{ "create", medit_create },
{ "desc", medit_desc },
{ "level", medit_level },
{ "long", medit_long },
{ "name", medit_name },
{ "shop", medit_shop },
{ "short", medit_short },
{ "show", medit_show },
{ "spec", medit_spec },
{ "copy", medit_copy },
{ "sex", medit_sex }, /* ROM */
{ "act", medit_act }, /* ROM */
{ "affect", medit_affect }, /* ROM */
{ "armor", medit_ac }, /* ROM */
{ "form", medit_form }, /* ROM */
{ "part", medit_part }, /* ROM */
{ "imm", medit_imm }, /* ROM */
{ "res", medit_res }, /* ROM */
{ "vuln", medit_vuln }, /* ROM */
{ "material", medit_material }, /* ROM */
{ "off", medit_off }, /* ROM */
{ "size", medit_size }, /* ROM */
{ "hitdice", medit_hitdice }, /* ROM */
{ "manadice", medit_manadice }, /* ROM */
{ "damdice", medit_damdice }, /* ROM */
{ "race", medit_race }, /* ROM */
{ "position", medit_position }, /* ROM */
{ "wealth", medit_gold }, /* ROM */
{ "hitroll", medit_hitroll }, /* ROM */
{ "damtype", medit_damtype }, /* ROM */
{ "group", medit_group }, /* ROM */
{ "addmprog", medit_addmprog }, /* ROM */
{ "delmprog", medit_delmprog }, /* ROM */
{ "autoset", medit_autoset },
{ "autohard", medit_autohard },
{ "autoeasy", medit_autoeasy },
{ "?", show_help },
{ "version", show_version },
{ NULL, 0, }
};
// PMusic stuff...
const struct olc_cmd_type pedit_table[] =
{
{ "commands", show_commands },
{ "create", pedit_create },
{ "delete", pedit_delete },
{ "file", pedit_file },
{ "name", pedit_name },
{ "url", pedit_locurl },
{ "show", pedit_show },
{ "?", show_help },
{ NULL, 0 }
};
const struct olc_cmd_type cedit_table[] =
{
{ "commands", show_commands },
{ "show", cmdedit_show },
{ "name", cmdedit_name },
{ "sortas", cmdedit_sort_as },
{ "function", cmdedit_function },
{ "position", cmdedit_position },
{ "flags", cmdedit_stafflags },
{ "stafflags", cmdedit_stafflags },
{ "level", cmdedit_level },
{ "cansee", cmdedit_showcmd },
{ "log", cmdedit_logged },
{ "subcmd", cmdedit_subcmd },
{ "create", cmdedit_create },
{ "delete", cmdedit_delete },
{ "list", cmdedit_list },
{ "?", show_help },
{ NULL, 0 }
};
/* Social Editor - Mendanbar */
const struct olc_cmd_type sedit_table[] =
{
{ "commands", show_commands },
{ "cnoarg", sedit_cnoarg },
{ "onoarg", sedit_onoarg },
{ "cfound", sedit_cfound },
{ "ofound", sedit_ofound },
{ "vfound", sedit_vfound },
{ "cself", sedit_cself },
{ "oself", sedit_oself },
{ "cobj", sedit_cobj },
{ "oobj", sedit_oobj },
{ "position", sedit_position },
{ "create", sedit_create },
{ "delete", sedit_delete },
{ "show", sedit_show },
{ "?", show_help },
{ NULL, 0, }
};
/* Help Editor - kermit 1/98 */
const struct olc_cmd_type hedit_table[] =
{
{ "commands", show_commands },
{ "desc", hedit_desc },
{ "keywords", hedit_keywords },
{ "level", hedit_level },
{ "create", hedit_create },
{ "copy", hedit_copy },
{ "delete", hedit_delete },
{ "show", hedit_show },
{ "?", show_help },
{ NULL, 0, }
};
/*****************************************************************************
* End Interpreter Tables. *
*****************************************************************************/
/*****************************************************************************
Name: get_area_data
Purpose: Returns pointer to area with given vnum.
Called by: do_aedit(olc.c).
****************************************************************************/
AREA_DATA *get_area_data( int vnum )
{
AREA_DATA *pArea;
for (pArea = area_first; pArea; pArea = pArea->next )
{
if (pArea->vnum == vnum)
return pArea;
}
return 0;
}
/*****************************************************************************
Name: edit_done
Purpose: Resets builder information on completion.
Called by: aedit, redit, oedit, medit(olc.c)
****************************************************************************/
bool edit_done( CHAR_DATA *ch )
{
ch->desc->pEdit = NULL;
ch->desc->editor = 0;
return FALSE;
}
/*****************************************************************************
* Interpreters. *
*****************************************************************************/
void gedit(CHAR_DATA *ch, char *argument)
{
CLAN_DATA *pClan;
char command[MIL];
char arg[MIL];
int cmd;
EDIT_GUILD(ch, pClan);
smash_tilde(argument);
strcpy(arg, argument);
argument = one_argument(argument, command);
if (!STF_FLAGGED(ch, STAFF_CLANS)) {
send_to_char("Insuffecient security to modify guild data", ch);
edit_done(ch);
return;
}
if (!str_cmp(command, "done")) {
edit_done(ch);
return;
}
if (command[0] == '\0') {
gedit_show(ch, argument);
return;
}
/* Search Table and Dispatch Command. */
for (cmd = 0; gedit_table[cmd].name != NULL; cmd++) {
if (!str_prefix(command, gedit_table[cmd].name)) {
if ((*gedit_table[cmd].olc_fun) (ch, argument)) {
SET_BIT(pClan->flags, GUILD_CHANGED);
return;
}
else
return;
}
}
interpret(ch, arg);
return;
}
/* Area Interpreter, called by do_aedit. */
void aedit( CHAR_DATA *ch, char *argument )
{
AREA_DATA *pArea;
char command[MAX_INPUT_LENGTH];
char arg[MAX_INPUT_LENGTH];
int cmd;
int value;
EDIT_AREA(ch, pArea);
smash_tilde( argument );
strcpy( arg, argument );
argument = one_argument( argument, command );
if ( !IS_BUILDER( ch, pArea ) )
{
send_to_char( "AEdit: Insufficient security to modify area.\n\r", ch );
edit_done( ch );
return;
}
if ( !str_cmp(command, "done") )
{
edit_done( ch );
return;
}
if ( command[0] == '\0' )
{
aedit_show( ch, argument );
return;
}
if ( ( value = flag_value( area_flags, command ) ) != NO_FLAG )
{
TOGGLE_BIT(pArea->area_flags, value);
SET_BIT(AREA_FLAGS(pArea), AREA_CHANGED);
send_to_char( "Flag toggled.\n\r", ch );
return;
}
/* Search Table and Dispatch Command. */
for ( cmd = 0; aedit_table[cmd].name != NULL; cmd++ )
{
if ( !str_prefix( command, aedit_table[cmd].name ) )
{
if ( (*aedit_table[cmd].olc_fun) ( ch, argument ) )
{
SET_BIT( pArea->area_flags, AREA_CHANGED );
return;
}
else
return;
}
}
/* Default to Standard Interpreter. */
interpret( ch, arg );
return;
}
/* Room Interpreter, called by do_redit. */
void redit( CHAR_DATA *ch, char *argument )
{
AREA_DATA *pArea;
ROOM_INDEX_DATA *pRoom;
char arg[MAX_STRING_LENGTH];
char command[MAX_INPUT_LENGTH];
int cmd;
EDIT_ROOM(ch, pRoom);
pArea = pRoom->area;
smash_tilde( argument );
strcpy( arg, argument );
argument = one_argument( argument, command );
if ( !IS_BUILDER( ch, pArea ) )
{
send_to_char( "REdit: Insufficient security to modify room.\n\r", ch );
edit_done( ch );
return;
}
if ( !str_cmp(command, "done") )
{
edit_done( ch );
return;
}
if ( command[0] == '\0' )
{
redit_show( ch, argument );
return;
}
/* Search Table and Dispatch Command. */
for ( cmd = 0; redit_table[cmd].name != NULL; cmd++ )
{
if ( !str_prefix( command, redit_table[cmd].name ) )
{
if ( (*redit_table[cmd].olc_fun) ( ch, argument ) )
{
SET_BIT( pArea->area_flags, AREA_CHANGED );
return;
}
else
return;
}
}
/* Default to Standard Interpreter. */
interpret( ch, arg );
return;
}
/* Object Interpreter, called by do_oedit. */
void oedit( CHAR_DATA *ch, char *argument )
{
AREA_DATA *pArea;
OBJ_INDEX_DATA *pObj;
char arg[MAX_STRING_LENGTH];
char command[MAX_INPUT_LENGTH];
int cmd;
smash_tilde( argument );
strcpy( arg, argument );
argument = one_argument( argument, command );
EDIT_OBJ(ch, pObj);
pArea = pObj->area;
if ( !IS_BUILDER( ch, pArea ) )
{
send_to_char( "OEdit: Insufficient security to modify area.\n\r", ch );
edit_done( ch );
return;
}
if ( !str_cmp(command, "done") )
{
edit_done( ch );
return;
}
if ( command[0] == '\0' )
{
oedit_show( ch, argument );
return;
}
/* Search Table and Dispatch Command. */
for ( cmd = 0; oedit_table[cmd].name != NULL; cmd++ )
{
if ( !str_prefix( command, oedit_table[cmd].name ) )
{
if ( (*oedit_table[cmd].olc_fun) ( ch, argument ) )
{
SET_BIT( pArea->area_flags, AREA_CHANGED );
return;
}
else
return;
}
}
/* Default to Standard Interpreter. */
interpret( ch, arg );
return;
}
/* Mobile Interpreter, called by do_medit. */
void medit( CHAR_DATA *ch, char *argument )
{
AREA_DATA *pArea;
MOB_INDEX_DATA *pMob;
char command[MAX_INPUT_LENGTH];
char arg[MAX_STRING_LENGTH];
int cmd;
smash_tilde( argument );
strcpy( arg, argument );
argument = one_argument( argument, command );
EDIT_MOB(ch, pMob);
pArea = pMob->area;
if ( !IS_BUILDER( ch, pArea ) )
{
send_to_char( "MEdit: Insufficient security to modify area.\n\r", ch );
edit_done( ch );
return;
}
if ( !str_cmp(command, "done") )
{
edit_done( ch );
return;
}
if ( command[0] == '\0' )
{
medit_show( ch, argument );
return;
}
/* Search Table and Dispatch Command. */
for ( cmd = 0; medit_table[cmd].name != NULL; cmd++ )
{
if ( !str_prefix( command, medit_table[cmd].name ) )
{
if ( (*medit_table[cmd].olc_fun) ( ch, argument ) )
{
SET_BIT( pArea->area_flags, AREA_CHANGED );
return;
}
else
return;
}
}
/* Default to Standard Interpreter. */
interpret( ch, arg );
return;
}
/* PMusic Editor - Mendanbar */
void pedit(CHAR_DATA *ch, char *argument)
{
int cmd = 0;
char arg[MAX_INPUT_LENGTH], command[MAX_INPUT_LENGTH];
smash_tilde(argument);
strcpy(arg, argument);
argument = one_argument(argument, command);
if (!STF_FLAGGED(ch, STAFF_PMUSIC)) {
ch->Send("PEdit: Insufficient security to modify pueblo music.\n\r");
edit_done(ch);
}
if (!str_cmp(command, "done")) {
edit_done(ch);
return;
}
if (!*command) {
pedit_show(ch, argument);
return;
}
for (cmd = 0; pedit_table[cmd].name != NULL; cmd++) {
if (!str_prefix(command, pedit_table[cmd].name)) {
if ((*pedit_table[cmd].olc_fun) (ch, argument))
PMUSIC_CHANGED = TRUE;
return;
}
}
interpret(ch, arg);
return;
}
/* Social Editor - Mendanbar */
void sedit(CHAR_DATA *ch, char *argument)
{
int cmd = 0;
char arg[MAX_INPUT_LENGTH], command[MAX_INPUT_LENGTH];
smash_tilde(argument);
strcpy(arg, argument);
argument = one_argument(argument, command);
if (!STF_FLAGGED(ch, STAFF_SOCIALS)) {
send_to_char("SEdit: Insufficient security to modify socials.\n\r", ch);
edit_done(ch);
}
if (!str_cmp(command, "done")) {
edit_done(ch);
return;
}
if (command[0] == '\0') {
sedit_show(ch, argument);
return;
}
for (cmd = 0; sedit_table[cmd].name != NULL; cmd++) {
if (!str_prefix(command, sedit_table[cmd].name)) {
if ((*sedit_table[cmd].olc_fun) (ch, argument))
SOCIAL_CHANGED = TRUE;
return;
}
}
interpret(ch, arg);
return;
}
/* Help Editor - kermit 1/98 */
void hedit( CHAR_DATA *ch, char *argument)
{
char command[MIL];
char arg[MIL];
int cmd;
smash_tilde(argument);
strcpy(arg, argument);
argument = one_argument( argument, command);
if (!STF_FLAGGED(ch, STAFF_HELP))
{
send_to_char("HEdit: Insufficient security to modify code\n\r",ch);
edit_done(ch);
}
if ( !str_cmp(command, "done") )
{
edit_done( ch );
return;
}
if ( command[0] == '\0' )
{
hedit_show( ch, argument );
return;
}
for ( cmd = 0; hedit_table[cmd].name != NULL; cmd++ )
{
if ( !str_prefix( command, hedit_table[cmd].name ) )
{
(*hedit_table[cmd].olc_fun) ( ch, argument );
return;
}
}
interpret( ch, arg );
return;
}
void cmdedit(CHAR_DATA *ch, char *argument) {
int cmd = 0;
char arg[MAX_INPUT_LENGTH], command[MAX_INPUT_LENGTH];
smash_tilde(argument);
strcpy(arg, argument);
argument = one_argument(argument, command);
if (!STF_FLAGGED(ch, STAFF_OLCADMIN)) {
ch->Send("CEdit: Insufficient securety to modify commands.\n\r");
edit_done(ch);
}
if (!str_cmp(command, "done")) {
edit_done(ch);
return;
}
if (!*command) {
cmdedit_show(ch, argument);
return;
}
for (cmd = 0; cedit_table[cmd].name != NULL; cmd++) {
if (!str_prefix(command, cedit_table[cmd].name)) {
if ((*cedit_table[cmd].olc_fun) (ch, argument))
COMMAND_CHANGED = TRUE;
return;
}
}
interpret(ch, arg);
return;
}
const struct editor_cmd_type editor_table[] =
{
/* { command function }, */
{ "guild", do_gedit },
{ "area", do_aedit },
{ "room", do_redit },
{ "object", do_oedit },
{ "mobile", do_medit },
{ "mpcode", do_mpedit },
{ "help", do_hedit },
{ "social", do_sedit },
{ "pmusic", do_pedit },
{ "command", do_cmdedit },
{ NULL, 0, }
};
char *path_to_area(CHAR_DATA *ch, AREA_DATA *pArea) {
EXIT_DATA *pexit, *pexit2;
ROOM_INDEX_DATA *pRoomIndex, *queueIn, *queueOut, *source;
UInt32 iHash = 0, door, door2;
const char *shortdir_name[] = {"n","e","s","w","u","d"};
char buf[MAX_STRING_LENGTH], buf2[MAX_STRING_LENGTH];
extern ROOM_INDEX_DATA *room_index_hash[MAX_KEY_HASH];
if ((source = ch->in_room) == NULL)
return "Not accessable.";
if (!pArea) {
mudlogf(BRF, LVL_STAFF, TRUE, "SYSERR: path_to_area passing invalid area");
return "Ah this is an error.";
}
if (source->area == pArea)
return "You are here.";
for (iHash = 0; iHash < MAX_KEY_HASH; iHash++) {
for (pRoomIndex = room_index_hash[iHash];
pRoomIndex != NULL; pRoomIndex = pRoomIndex->next)
{
pRoomIndex->distance_from_source = 32765;
pRoomIndex->shortest_from_room = NULL;
pRoomIndex->shortest_next_room = NULL;
}
}
source->distance_from_source = 0;
queueIn = source;
for (queueOut = source; queueOut; queueOut = queueOut->shortest_next_room)
{
for (door = 0; door < MAX_DIR ; door++) {
if ((pexit = queueOut->exit[door]) != NULL && pexit->u1.to_room != NULL) {
if (pexit->u1.to_room->distance_from_source > queueOut->distance_from_source + 1) {
pexit->u1.to_room->distance_from_source = queueOut->distance_from_source + 1;
if (pexit->u1.to_room->area == pArea) {
int count = 1;
char buf3[3];
sprintf(buf3,"%s",shortdir_name[door]);
sprintf(buf2,"%s",buf3);
for (pRoomIndex = queueOut; pRoomIndex->shortest_from_room; pRoomIndex = pRoomIndex->shortest_from_room) {
for (door2 = 0; door2 < MAX_DIR ; door2++) {
if ((pexit2 = pRoomIndex->shortest_from_room->exit[door2]) != NULL
&& pexit2->u1.to_room == pRoomIndex) {
if (!str_cmp(shortdir_name[door2],buf3)) {
count++;
} else {
sprintf(buf,"%s",buf2);
if (count > 1) {
sprintf(buf2,"%s%d%s",shortdir_name[door2],count,buf);
} else {
sprintf(buf2,"%s%s",shortdir_name[door2],buf);
}
count = 1;
sprintf(buf3,"%s",shortdir_name[door2]);
}
}
}
}
if (count > 1) {
sprintf(buf,"%s",buf2);
sprintf(buf2,"%d%s",count,buf);
}
sprintf(buf,"%s.", buf2);
return str_dup(buf);
}
pexit->u1.to_room->shortest_from_room = queueOut;
queueIn->shortest_next_room = pexit->u1.to_room;
queueIn = pexit->u1.to_room;
}
}
}
}
return "Not accessable.";
}
ACMD(do_path) {
ROOM_INDEX_DATA *pRoomIndex, *queueIn, *queueOut, *source,
*destination = NULL;
extern ROOM_INDEX_DATA *room_index_hash[MAX_KEY_HASH];
extern ROOM_INDEX_DATA *find_location( CHAR_DATA *ch, char *arg );
int iHash, door, door2, fArea = 0;
AREA_DATA *pArea=NULL;
EXIT_DATA *pexit, *pexit2;
const char *shortdir_name[] = {"n","e","s","w","u","d"};
char buf[MAX_STRING_LENGTH], buf2[MAX_STRING_LENGTH];
//Use a breadth-first search to find shortest path.
if ( argument[0] == '\0' ) {
send_to_char( "Syntax: shortestpath <destination player, mob, or vnum>\n\r", ch );
send_to_char( " shortestpath area <area vnum>\n\r", ch );
return;
}
//First, find source and destination rooms:
if ( ( source = ch->in_room) == NULL ) {
send_to_char( "You must be somewhere to go anywhere.\n\r", ch );
return;
}
//Check if we're looking for area vnum
if (!str_prefix("area ",argument )) {
argument = one_argument(argument,buf); // strip "area" and discard buf
if ( is_number( argument ) ) {
fArea = atoi( argument );
if ( !( pArea = get_area_data( fArea ) ) ) {
send_to_char( "That area vnum does not exist.\n\r", ch );
return;
}
fArea++; // since vnums start at 0 this makes it nonzero.
}
} else if ( ( destination = find_location( ch, argument ) ) == NULL ) {
send_to_char( "No such destination.\n\r", ch );
return;
}
if ( (fArea && source->area == pArea) || source == destination ) {
send_to_char( "No need to walk to get there!\n\r", ch );
return;
}
/* Initialize: set distance of every room to a very large number,
* null links and queue */
for ( iHash = 0; iHash < MAX_KEY_HASH; iHash++ ) {
for ( pRoomIndex = room_index_hash[iHash];
pRoomIndex != NULL;
pRoomIndex = pRoomIndex->next ) {
pRoomIndex->distance_from_source = 32765;
pRoomIndex->shortest_from_room = NULL;
pRoomIndex->shortest_next_room = NULL;
}
}
//Now set source distance to 0 and put it on the "search" queue
source->distance_from_source = 0;
queueIn = source;
//Now, set distance for all adjacent rooms to search room + 1 until destination.
//If destination not found, put each unsearched adjacent room on queue and repeat
for ( queueOut = source; queueOut; queueOut = queueOut->shortest_next_room) {
//for each exit to search room:
for ( door = 0; door < MAX_DIR ; door++ ) {
if ( ( pexit = queueOut->exit[door] ) != NULL
&& pexit->u1.to_room != NULL ) {
//if we haven't looked here, set distance and add to search list
if (pexit->u1.to_room->distance_from_source >
queueOut->distance_from_source + 1) {
pexit->u1.to_room->distance_from_source =
queueOut->distance_from_source + 1;
//if we've found destination, we're done!
if ((fArea && pexit->u1.to_room->area == pArea) ||
pexit->u1.to_room == destination) {
int count = 1;
char buf3[3];
// print the directions in reverse order as we walk back
sprintf(buf3,"%s",shortdir_name[door]);
sprintf(buf2,"%s",buf3);
for (pRoomIndex = queueOut ; pRoomIndex->shortest_from_room;
pRoomIndex = pRoomIndex->shortest_from_room) {
for ( door2 = 0; door2 < MAX_DIR ; door2++ ) {
if ( ( pexit2 = pRoomIndex->shortest_from_room->exit[door2] ) != NULL
&& pexit2->u1.to_room == pRoomIndex ) {
if (!str_cmp(shortdir_name[door2],buf3)) {
count++;
} else {
sprintf(buf,"%s",buf2);
if (count > 1) {
sprintf(buf2,"%s, %d%s",shortdir_name[door2],count,buf);
} else {
sprintf(buf2,"%s, %s",shortdir_name[door2],buf);
}
count = 1;
sprintf(buf3,"%s",shortdir_name[door2]);
}
}
}
}
if (count > 1) {
sprintf(buf,"%s",buf2);
sprintf(buf2,"%d%s",count,buf);
}
if (fArea) {
sprintf(buf,"Shortest path to %s from %s is %d steps: %s.\n\r",
pArea->name, source->name,
pexit->u1.to_room->distance_from_source,buf2);
} else {
sprintf(buf,"Shortest path is %d steps: %s.\n\r",
pexit->u1.to_room->distance_from_source,buf2);
}
send_to_char( buf, ch );
return;
}
//Didn't find destination, add to queue
pexit->u1.to_room->shortest_from_room = queueOut;
queueIn->shortest_next_room = pexit->u1.to_room;
queueIn = pexit->u1.to_room;
}
}
}
}
send_to_char( "No path to destination.\n\r", ch );
return;
}
ACMD(do_olclist) {
AREA_DATA *pArea;
int count = 0;
char buf[MAX_STRING_LENGTH*2];
buf[0] = '\0';
for (pArea = area_first; pArea; pArea = pArea->next) {
if (IS_SET(pArea->area_flags, AREA_CHANGED)) {
sprintf(buf+strlen(buf), "[%5d] %-24s- %s\r\n",
pArea->vnum, pArea->name, pArea->file_name);
count++;
}
}
if (SOCIAL_CHANGED) {
strcat(buf, " - Socials\n\r");
count++;
}
if (PMUSIC_CHANGED) {
strcat(buf, " - Pueblo Music\n\r");
count++;
}
if (COMMAND_CHANGED) {
strcat(buf, " - Commands\n\r");
count++;
}
if (!count)
send_to_char("The database is up to date.\r\n", ch);
else {
send_to_char("The following Zones need saving:\r\n", ch);
send_to_char(buf, ch);
}
return;
}
ACMD(do_olc_delete) {
int which;
UInt32 iHash = 0;
char arg1[MAX_INPUT_LENGTH];
char arg2[MAX_INPUT_LENGTH];
if (!STF_FLAGGED(ch, STAFF_OLCADMIN)) {
ch->Send("You do not have permission to use olc delete.\n\r");
return;
}
argument = one_argument(argument, arg1);
argument = one_argument(argument, arg2);
if (arg1[0] == '\0' || arg2[0] == '\0' || (which = atoi(arg2)) <= 0) {
send_to_char("Usage: delete mob|obj|room|trigger <vnum>\n\r", ch);
return;
}
if (!str_prefix(arg1, "room")) {
RESET_DATA *pReset;
ROOM_INDEX_DATA *pRoom;
ROOM_INDEX_DATA *pToRoom;
UInt32 door = 0;
if ((pRoom = get_room_index(which)) == NULL) {
send_to_char("That room does not exist.\n\r", ch);
return;
}
SET_BIT(ROOM_FLAGS(pRoom), ROOM_DELETED);
SET_BIT(pRoom->area->area_flags, AREA_CHANGED);
for (pReset = pRoom->reset_first; pReset; pReset = pReset->next) {
free_reset_data(pReset);
}
pRoom->reset_first = NULL;
pRoom->reset_last = NULL;
for (iHash = 0; iHash < MAX_KEY_HASH; iHash++) {
for (pToRoom = room_index_hash[iHash];
pToRoom != NULL;
pToRoom = pToRoom->next)
{
for (door = 0; door <= MAX_DIR; door++) {
if (pToRoom->exit[door] &&
pToRoom->exit[door]->u1.to_room == pRoom) {
free_exit(pToRoom->exit[door]);
pToRoom->exit[door] = NULL;
SET_BIT(pToRoom->area->area_flags, AREA_CHANGED);
}
}
}
}
send_to_char("Room deleted.\n\r", ch);
return;
} else if (!str_prefix(arg1, "object")) {
OBJ_INDEX_DATA *pObj;
if ((pObj = get_obj_index(which)) == NULL) {
send_to_char("That object does not exist.\n\r", ch);
return;
}
SET_BIT(OBJ_FLAGS(pObj), ITEM_DELETED);
SET_BIT(pObj->area->area_flags, AREA_CHANGED);
send_to_char("Object deleted.\n\r", ch);
return;
} else if (!str_prefix(arg1, "mobile")) {
MOB_INDEX_DATA *pMob;
if ((pMob = get_mob_index(which)) == NULL) {
send_to_char("That mobile does not exist.\n\r", ch);
return;
}
SET_BIT(MOB_FLAGS(pMob), MOB_DELETED);
SET_BIT(pMob->area->area_flags, AREA_CHANGED);
send_to_char("Mobile deleted.\n\r", ch);
return;
} else if (!str_prefix(arg1, "trigger") || !str_prefix(arg1, "mprog")) {
send_to_char("That function has not been created.\n\r", ch);
return;
} else {
send_to_char("Usage: delete mob|obj|room|trigger <vnum>\n\r", ch);
}
return;
}
/* Entry point for all editors. */
ACMD(do_olc) {
char command[MAX_INPUT_LENGTH];
int cmd;
if ( IS_NPC(ch) )
return;
argument = one_argument( argument, command );
if ( command[0] == '\0' )
{
do_help( ch, "olc", 0);
return;
}
/* Search Table and Dispatch Command. */
for ( cmd = 0; editor_table[cmd].name != NULL; cmd++ )
{
if ( !str_prefix( command, editor_table[cmd].name ) )
{
(*editor_table[cmd].do_fun) ( ch, argument, 0 );
return;
}
}
/* Invalid command, send help. */
do_help( ch, "olc", 0);
return;
}
ACMD(do_gedit) {
CLAN_DATA *pClan;
int value;
char arg[MAX_STRING_LENGTH];
if (IS_NPC(ch))
return;
pClan = &clan_table[1]; /* set default */
argument = one_argument(argument,arg);
value = atoi(arg);
if (is_number(arg) && (pClan = get_clan_data(value)) == NULL) {
send_to_char( "That guild does not exist.\n\r", ch );
return;
}
if (!str_cmp(arg, "create")) {
if (!*argument)
ch->Send("Syntax: gedit create <clan #>\n\r");
else if (gedit_create(ch, argument))
ch->desc->editor = ED_GUILD;
return;
}
if (!STF_FLAGGED(ch, STAFF_CLANS))
{
send_to_char("Insuffecient security to edit guilds.\n\r",ch);
return;
}
ch->desc->pEdit = pClan;
ch->desc->editor = ED_GUILD;
return;
}
/* Entry point for editing area_data. */
ACMD(do_aedit) {
AREA_DATA *pArea;
int value;
char arg[MAX_STRING_LENGTH];
if ( IS_NPC(ch) )
return;
pArea = ch->in_room->area;
argument = one_argument(argument,arg);
if ( is_number( arg ) )
{
value = atoi( arg );
if ( !( pArea = get_area_data( value ) ) )
{
send_to_char( "That area vnum does not exist.\n\r", ch );
return;
}
}
else
if (!str_cmp(arg, "reset" ) )
{
reset_area(pArea);
send_to_char("Area reset.\r\n", ch);
return;
}
else
if ( !str_cmp( arg, "create" ) )
{
if (!STF_FLAGGED(ch, STAFF_OLCADMIN))
{
send_to_char( "AEdit : Insuficient security to edit area.\r\n",ch);
return;
}
if (aedit_create(ch, ""))
ch->desc->editor = ED_AREA;
return;
}
if (!IS_BUILDER(ch,pArea))
{
send_to_char("Insuficient security to edit area.\r\n",ch);
return;
}
ch->desc->pEdit = (void *)pArea;
ch->desc->editor = ED_AREA;
return;
}
/* Entry point for editing room_index_data. */
ACMD(do_redit) {
ROOM_INDEX_DATA *pRoom;
char arg1[MAX_STRING_LENGTH];
if ( IS_NPC(ch) )
return;
argument = one_argument( argument, arg1 );
pRoom = ch->in_room;
if (!str_cmp(arg1, "format" ) ) /* format without editing */
{
pRoom->description = format_string( pRoom->description );
send_to_char("Room formatted.\r\n",ch);
return;
}
else
if ( !str_cmp( arg1, "reset" ) ) /* redit reset */
{
if ( !IS_BUILDER( ch, pRoom->area ) )
{
send_to_char("Insufficient security to modify zone.\r\n",ch);
return;
}
reset_room( pRoom );
send_to_char( "Room reset.\n\r", ch );
return;
}
else
if ( !str_cmp( arg1, "create" ) ) /* redit create <vnum> */
{
if ( argument[0] == '\0' || atoi( argument ) == 0 )
{
send_to_char( "Syntax: edit room create [vnum]\n\r", ch );
return;
}
if ( redit_create( ch, argument ) ) /* pEdit == nuevo cuarto */
{
ch->desc->editor = ED_ROOM;
char_from_room( ch );
char_to_room( ch, (ROOM_INDEX_DATA *)ch->desc->pEdit);
SET_BIT(((ROOM_INDEX_DATA *)ch->desc->pEdit)->area->area_flags, AREA_CHANGED);
}
return;
}
else if ( !IS_NULLSTR(arg1) ) /* redit <vnum> */
{
pRoom = get_room_index(atoi(arg1));
if ( !pRoom )
{
send_to_char( "REdit : cuarto inexistente.\n\r", ch );
return;
}
if ( !IS_BUILDER(ch, pRoom->area) )
{
send_to_char( "REdit : Insuficient security to modify area\r\n",ch);
return;
}
char_from_room( ch );
char_to_room( ch, pRoom );
}
if ( !IS_BUILDER(ch, pRoom->area) )
{
send_to_char( "REdit : Insuficient security to edit room.\r\n",ch);
return;
}
ch->desc->pEdit = (void *) pRoom;
ch->desc->editor = ED_ROOM;
return;
}
/* Entry point for editing obj_index_data. */
ACMD(do_oedit) {
OBJ_INDEX_DATA *pObj;
AREA_DATA *pArea;
char arg1[MAX_STRING_LENGTH];
int value;
if ( IS_NPC(ch) )
return;
argument = one_argument( argument, arg1 );
if ( is_number( arg1 ) )
{
value = atoi( arg1 );
if ( !( pObj = get_obj_index( value ) ) )
{
send_to_char( "OEdit: That vnum does not exist.\n\r", ch );
return;
}
if ( !IS_BUILDER( ch, pObj->area ) )
{
send_to_char( "Insuficient security to modify object.\r\n",ch);
return;
}
ch->desc->pEdit = (void *)pObj;
ch->desc->editor = ED_OBJECT;
return;
}
else
{
if ( !str_cmp( arg1, "create" ) )
{
value = atoi( argument );
if ( argument[0] == '\0' || value == 0 )
{
send_to_char( "Syntax: edit object create [vnum]\n\r", ch );
return;
}
pArea = get_vnum_area( value );
if ( !pArea )
{
send_to_char( "OEdit: That vnum is not assigned an area.\n\r", ch );
return;
}
if ( !IS_BUILDER( ch, pArea ) )
{
send_to_char( "Insuficient security to modify object.\r\n",ch);
return;
}
if ( oedit_create( ch, argument ) )
{
SET_BIT( pArea->area_flags, AREA_CHANGED );
ch->desc->editor = ED_OBJECT;
}
return;
}
}
send_to_char( "OEdit: There is no default object to edit.\n\r", ch );
return;
}
/* Entry point for editing mob_index_data. */
ACMD(do_medit) {
MOB_INDEX_DATA *pMob;
AREA_DATA *pArea;
int value;
char arg1[MAX_STRING_LENGTH];
argument = one_argument( argument, arg1 );
if ( IS_NPC(ch) )
return;
if ( is_number( arg1 ) )
{
value = atoi( arg1 );
if ( !( pMob = get_mob_index( value ) ))
{
send_to_char( "MEdit: That vnum does not exist.\n\r", ch );
return;
}
if ( !IS_BUILDER( ch, pMob->area ) )
{
send_to_char( "Insuficient security to modify mob.\r\n",ch);
return;
}
ch->desc->pEdit = (void *)pMob;
ch->desc->editor = ED_MOBILE;
return;
}
else
{
if ( !str_cmp( arg1, "create" ) )
{
value = atoi( argument );
if ( arg1[0] == '\0' || value == 0 )
{
send_to_char( "Syntax: edit mobile create [vnum]\n\r", ch );
return;
}
pArea = get_vnum_area( value );
if ( !pArea )
{
send_to_char( "OEdit: That vnum is not assigned an area.\n\r", ch );
return;
}
if ( !IS_BUILDER( ch, pArea ) )
{
send_to_char( "Insuficient security to modify mob.\r\n",ch);
return;
}
if ( medit_create( ch, argument ) )
{
SET_BIT( pArea->area_flags, AREA_CHANGED );
ch->desc->editor = ED_MOBILE;
}
return;
}
}
send_to_char( "MEdit: There is no default mobile to edit.\n\r", ch );
return;
}
/* PMusic Editor - Mendanbar */
ACMD(do_pedit) {
PMUSIC_DATA *pMusic;
char arg1[MAX_INPUT_LENGTH];
argument = one_argument(argument, arg1);
if (IS_NPC(ch))
return;
if (!STF_FLAGGED(ch, STAFF_PMUSIC)) {
ch->Send("Insuficient security to edit socials.\n\r");
return;
}
if (!str_cmp(arg1, "show")) {
if (argument[0] == '\0') {
ch->Send("Syntax: pedit show [song]\n\r");
return;
}
pedit_show(ch, argument);
return;
}
if (!str_cmp(arg1, "create")) {
if (!*argument) {
ch->Send("Syntax: pedit create [song]\n\r");
return;
}
if (pedit_create(ch, argument)) {
PMUSIC_CHANGED = TRUE;
ch->desc->editor = ED_PMUSIC;
}
return;
}
if (!str_cmp(arg1, "delete")) {
if (!*argument) {
ch->Send("Syntax: pedit delete [song]\n\r");
return;
}
if (pedit_delete(ch, argument))
PMUSIC_CHANGED = TRUE;
return;
}
if ((pMusic = get_pmusic_data(arg1)) != NULL) {
ch->desc->pEdit = (void *)pMusic;
ch->desc->editor= ED_PMUSIC;
return;
}
if (pMusic == NULL && arg1[0] != '\0') {
ch->Send("That song does not exist!\n\r");
return;
}
ch->Send("PEdit: There is no default song to edit.\n\r");
return;
}
ACMD(do_cmdedit) {
CMD_DATA *pCmd;
char arg[MAX_INPUT_LENGTH];
argument = one_argument(argument, arg);
if (IS_NPC(ch))
return;
if (!STF_FLAGGED(ch, STAFF_OLCADMIN)) {
ch->Send("Insufficient securit to edit commands.\n\r");
return;
}
if (!str_cmp(arg, "show")) {
if (!*argument) {
ch->Send("Syntax: cedit show <command>\n\r");
return;
}
cmdedit_show(ch, argument);
return;
}
if (!str_cmp(arg, "list")) {
cmdedit_list(ch, argument);
return;
}
if (!str_cmp(arg, "save")) {
save_cmd_table();
COMMAND_CHANGED = FALSE;
ch->Send("Command table saved.\n\r");
return;
}
if (!str_cmp(arg, "create")) {
if (!*argument)
ch->Send("Syntax: cedit create <command>\n\r");
else if (cmdedit_create(ch, argument)) {
COMMAND_CHANGED = TRUE;
ch->desc->editor = ED_COMMAND;
}
return;
}
if (!str_cmp(arg, "delete")) {
if (!*argument)
ch->Send("Syntax: cedit delete <command>\n\r");
else if (cmdedit_delete(ch, argument))
COMMAND_CHANGED = TRUE;
return;
}
if ((pCmd = get_command_data(arg)) != NULL) {
ch->desc->pEdit = (void *)pCmd;
ch->desc->editor = ED_COMMAND;
return;
}
if (pCmd == NULL && *arg) {
ch->Send("That command does not exist.\n\r");
return;
}
ch->Send("CEdit: There is no default command to edit.\n\r");
return;
}
/* Social Editor - Mendanbar */
ACMD(do_sedit) {
SOCIAL_DATA *pSocial;
char arg1[MAX_INPUT_LENGTH];
argument = one_argument(argument, arg1);
if (IS_NPC(ch))
return;
if (!STF_FLAGGED(ch, STAFF_SOCIALS)) {
send_to_char("Insuficient security to edit socials.\n\r", ch);
return;
}
if (!str_cmp(arg1, "show")) {
if (argument[0] == '\0') {
send_to_char("Syntax: sedit show [social]\n\r", ch);
return;
}
sedit_show(ch, argument);
return;
}
if (!str_cmp(arg1, "create")) {
if (argument[0] == '\0') {
send_to_char("Syntax: sedit create [social]\n\r", ch);
return;
}
if (sedit_create(ch, argument)) {
SOCIAL_CHANGED = TRUE;
ch->desc->editor = ED_SOCIAL;
}
return;
}
if (!str_cmp(arg1, "delete")) {
if (argument[0] == '\0') {
send_to_char("Syntax: sedit delete [social]\n\r", ch);
return;
}
if (sedit_delete(ch, argument))
SOCIAL_CHANGED = TRUE;
return;
}
if ((pSocial = get_social_data(arg1)) != NULL) {
ch->desc->pEdit = (void *)pSocial;
ch->desc->editor = ED_SOCIAL;
return;
}
if (pSocial == NULL && arg1[0] != '\0') {
send_to_char("That social does not exist.\n\r", ch);
return;
}
send_to_char("SEdit: There is no default social to edit.\n\r", ch);
return;
}
/* Help Editor - kermit 1/98 */
ACMD(do_hedit) {
HELP_DATA *pHelp;
char arg1[MIL];
char argall[MAX_INPUT_LENGTH],argone[MAX_INPUT_LENGTH];
bool found = FALSE;
strcpy(arg1,argument);
if(argument != '\0')
{
/* Taken from do_help */
argall[0] = '\0';
while (argument[0] != '\0' )
{
argument = one_argument(argument,argone);
if (argall[0] != '\0')
strcat(argall," ");
strcat(argall,argone);
}
for ( pHelp = help_first; pHelp != NULL; pHelp = pHelp->next )
{
if ( is_name( argall, pHelp->keyword ) )
{
ch->desc->pEdit=(void *)pHelp;
ch->desc->editor= ED_HELP;
found = TRUE;
return;
}
}
}
if(!found)
{
argument = one_argument(arg1, arg1);
if(!str_cmp(arg1,"create"))
{
if (argument[0] == '\0')
{
send_to_char("Syntax: hedit create [topic]\n\r",ch);
return;
}
if (hedit_create(ch, argument) )
ch->desc->editor = ED_HELP;
return;
}
}
send_to_char( "HEdit: There is no default help to edit.\n\r", ch );
return;
}
void display_resets( CHAR_DATA *ch )
{
ROOM_INDEX_DATA *pRoom;
RESET_DATA *pReset;
MOB_INDEX_DATA *pMob = NULL;
char buf [ MAX_STRING_LENGTH ];
char final [ MAX_STRING_LENGTH ];
int iReset = 0;
EDIT_ROOM(ch, pRoom);
final[0] = '\0';
send_to_char (
" No. Loads Description Location Vnum Mx Mn Description"
"\n\r"
"==== ======== ============= =================== ======== ===== ==========="
"\n\r", ch );
for ( pReset = pRoom->reset_first; pReset; pReset = pReset->next )
{
OBJ_INDEX_DATA *pObj;
MOB_INDEX_DATA *pMobIndex;
OBJ_INDEX_DATA *pObjIndex;
OBJ_INDEX_DATA *pObjToIndex;
ROOM_INDEX_DATA *pRoomIndex;
final[0] = '\0';
sprintf( final, "[%2d] ", ++iReset );
switch ( pReset->command )
{
default:
sprintf( buf, "Bad reset command: %c.", pReset->command );
strcat( final, buf );
break;
case 'M':
if ( !( pMobIndex = get_mob_index( pReset->arg1 ) ) )
{
sprintf( buf, "Load Mobile - Bad Mob %d\n\r", pReset->arg1 );
strcat( final, buf );
continue;
}
if ( !( pRoomIndex = get_room_index( pReset->arg3 ) ) )
{
sprintf( buf, "Load Mobile - Bad Room %d\n\r", pReset->arg3 );
strcat( final, buf );
continue;
}
pMob = pMobIndex;
sprintf( buf, "M[%5d] %-13.13s in room R[%5d] %2d-%2d %-15.15s`n\n\r",
pReset->arg1, pMob->short_descr, pReset->arg3,
pReset->arg2, pReset->arg4, pRoomIndex->name );
strcat( final, buf );
/*
* Check for pet shop.
* -------------------
*/
{
ROOM_INDEX_DATA *pRoomIndexPrev;
pRoomIndexPrev = get_room_index( pRoomIndex->vnum - 1 );
if ( pRoomIndexPrev
&& IS_SET( pRoomIndexPrev->room_flags, ROOM_PET_SHOP ) )
final[5] = 'P';
}
break;
case 'O':
if ( !( pObjIndex = get_obj_index( pReset->arg1 ) ) )
{
sprintf( buf, "Load Object - Bad Object %d\n\r",
pReset->arg1 );
strcat( final, buf );
continue;
}
pObj = pObjIndex;
if ( !( pRoomIndex = get_room_index( pReset->arg3 ) ) )
{
sprintf( buf, "Load Object - Bad Room %d\n\r", pReset->arg3 );
strcat( final, buf );
continue;
}
sprintf( buf, "O[%5d] %-13.13s in room "
"R[%5d] %-15.15s`n\n\r",
pReset->arg1, pObj->short_descr,
pReset->arg3, pRoomIndex->name );
strcat( final, buf );
break;
case 'P':
if ( !( pObjIndex = get_obj_index( pReset->arg1 ) ) )
{
sprintf( buf, "Put Object - Bad Object %d\n\r",
pReset->arg1 );
strcat( final, buf );
continue;
}
pObj = pObjIndex;
if ( !( pObjToIndex = get_obj_index( pReset->arg3 ) ) )
{
sprintf( buf, "Put Object - Bad To Object %d\n\r",
pReset->arg3 );
strcat( final, buf );
continue;
}
sprintf( buf,
"O[%5d] %-13.13s inside O[%5d] %2d-%2d %-15.15s`n\n\r",
pReset->arg1,
pObj->short_descr,
pReset->arg3,
pReset->arg2,
pReset->arg4,
pObjToIndex->short_descr );
strcat( final, buf );
break;
case 'G':
case 'E':
if ( !( pObjIndex = get_obj_index( pReset->arg1 ) ) )
{
sprintf( buf, "Give/Equip Object - Bad Object %d\n\r",
pReset->arg1 );
strcat( final, buf );
continue;
}
pObj = pObjIndex;
if ( !pMob )
{
sprintf( buf, "Give/Equip Object - No Previous Mobile\n\r" );
strcat( final, buf );
break;
}
if ( pMob->pShop )
{
sprintf( buf,
"O[%5d] %-13.13s in the inventory of S[%5d] %-15.15s`n\n\r",
pReset->arg1,
pObj->short_descr,
pMob->vnum,
pMob->short_descr );
}
else
sprintf( buf,
"O[%5d] %-13.13s %-19.19s M[%5d] %-15.15s`n\n\r",
pReset->arg1,
pObj->short_descr,
(pReset->command == 'G') ?
flag_string( wear_loc_strings, WEAR_NONE )
: flag_string( wear_loc_strings, pReset->arg3 ),
pMob->vnum,
pMob->short_descr );
strcat( final, buf );
break;
/*
* Doors are set in rs_flags don't need to be displayed.
* If you want to display them then uncomment the new_reset
* line in the case 'D' in load_resets in db.c and here.
*/
case 'D':
pRoomIndex = get_room_index( pReset->arg1 );
sprintf( buf, "R[%5d] %s door of %-19.19s reset to %s`n\n\r",
pReset->arg1,
capitalize( dir_name[ pReset->arg2 ] ),
pRoomIndex->name,
flag_string( door_resets, pReset->arg3 ) );
strcat( final, buf );
break;
/*
* End Doors Comment.
*/
case 'R':
if ( !( pRoomIndex = get_room_index( pReset->arg1 ) ) )
{
sprintf( buf, "Randomize Exits - Bad Room %d\n\r",
pReset->arg1 );
strcat( final, buf );
continue;
}
sprintf( buf, "R[%5d] Exits are randomized in %s`n\n\r",
pReset->arg1, pRoomIndex->name );
strcat( final, buf );
break;
}
send_to_char( final, ch );
}
return;
}
/*****************************************************************************
Name: add_reset
Purpose: Inserts a new reset in the given index slot.
****************************************************************************/
void add_reset(ROOM_INDEX_DATA *room, RESET_DATA *pReset, int index) {
RESET_DATA *reset;
int iReset = 0;
if (!room->reset_first) {
room->reset_first = pReset;
room->reset_last = pReset;
pReset->next = NULL;
return;
}
index--;
if (index == 0) {
pReset->next = room->reset_first;
room->reset_first = pReset;
return;
}
/*
* If negative slot( <= 0 selected) then this will find the last.
*/
for (reset = room->reset_first; reset->next; reset = reset->next) {
if (++iReset == index)
break;
}
pReset->next = reset->next;
reset->next = pReset;
if (!pReset->next)
room->reset_last = pReset;
return;
}
ACMD(do_resets) {
char arg1[MAX_INPUT_LENGTH];
char arg2[MAX_INPUT_LENGTH];
char arg3[MAX_INPUT_LENGTH];
char arg4[MAX_INPUT_LENGTH];
char arg5[MAX_INPUT_LENGTH];
char arg6[MAX_INPUT_LENGTH];
char arg7[MAX_INPUT_LENGTH];
RESET_DATA *pReset = NULL;
argument = one_argument(argument, arg1);
argument = one_argument(argument, arg2);
argument = one_argument(argument, arg3);
argument = one_argument(argument, arg4);
argument = one_argument(argument, arg5);
argument = one_argument(argument, arg6);
argument = one_argument(argument, arg7);
if (!IS_BUILDER(ch, ch->in_room->area)) {
send_to_char("Resets: Invalid security for editing this area.\n\r", ch);
return;
}
/*
* Display resets in current room.
* -------------------------------
*/
if ( arg1[0] == '\0' )
{
if ( ch->in_room->reset_first )
display_resets( ch );
else
send_to_char( "No resets in this room.\n\r", ch );
}
/*
* Take index number and search for commands.
* ------------------------------------------
*/
if ( is_number( arg1 ) )
{
ROOM_INDEX_DATA *pRoom = ch->in_room;
/*
* Delete a reset.
* ---------------
*/
if ( !str_cmp( arg2, "delete" ) )
{
int insert_loc = atoi( arg1 );
if ( !ch->in_room->reset_first )
{
send_to_char( "No resets in this area.\n\r", ch );
return;
}
if ( insert_loc-1 <= 0 )
{
pReset = pRoom->reset_first;
pRoom->reset_first = pRoom->reset_first->next;
if ( !pRoom->reset_first )
pRoom->reset_last = NULL;
}
else
{
int iReset = 0;
RESET_DATA *prev = NULL;
for ( pReset = pRoom->reset_first;
pReset;
pReset = pReset->next )
{
if ( ++iReset == insert_loc )
break;
prev = pReset;
}
if ( !pReset )
{
send_to_char( "Reset not found.\n\r", ch );
return;
}
if ( prev )
prev->next = prev->next->next;
else
pRoom->reset_first = pRoom->reset_first->next;
for ( pRoom->reset_last = pRoom->reset_first;
pRoom->reset_last->next;
pRoom->reset_last = pRoom->reset_last->next );
}
free_reset_data( pReset );
SET_BIT(AREA_FLAGS(pRoom->area), AREA_CHANGED);
send_to_char( "Reset deleted.\n\r", ch );
}
else
/*
* Add a reset.
* ------------
*/
if ( (!str_cmp( arg2, "mob" ) && is_number( arg3 ))
|| (!str_cmp( arg2, "obj" ) && is_number( arg3 )) )
{
/*
* Check for Mobile reset.
* -----------------------
*/
if (!str_cmp(arg2, "mob"))
{
if (get_mob_index(is_number(arg3) ? atoi(arg3) : 1) == NULL) {
send_to_char("That mob does not exist.\n\r", ch);
return;
}
pReset = new_reset_data();
pReset->command = 'M';
pReset->arg1 = atoi( arg3 );
pReset->arg2 = is_number( arg4 ) ? atoi( arg4 ) : 1; /* Max # */
pReset->arg3 = ch->in_room->vnum;
pReset->arg4 = is_number( arg5 ) ? atoi( arg5 ) : 1; /* Min # */
}
else
/*
* Check for Object reset.
* -----------------------
*/
if ( !str_cmp( arg2, "obj" ) )
{
// pReset = new_reset_data();
// pReset->arg1 = atoi( arg3 );
/*
* Inside another object.
* ----------------------
*/
if ( !str_prefix( arg4, "inside" ) )
{
OBJ_INDEX_DATA *temp;
temp = get_obj_index(is_number(arg5) ? atoi(arg5) : 1);
if ((temp->item_type != ITEM_CONTAINER) &&
(temp->item_type != ITEM_CORPSE_NPC)) {
send_to_char("Object 2 is not a container.\n\r", ch);
return;
}
pReset = new_reset_data();
pReset->command = 'P';
pReset->arg1 = atoi(arg3);
pReset->arg2 = is_number(arg6) ? atoi(arg6) : 1;
pReset->arg3 = is_number(arg5) ? atoi(arg5) : 1;
pReset->arg4 = is_number(arg7) ? atoi(arg7) : 1;
}
else
/*
* Inside the room.
* ----------------
*/
if ( !str_cmp( arg4, "room" ) )
{
if (get_obj_index(atoi(arg3)) == NULL) {
send_to_char("Vnum does not exist.\n\r", ch);
return;
}
pReset = new_reset_data();
pReset->command = 'O';
pReset->arg1 = atoi(arg3);
pReset->arg2 = 0;
pReset->arg3 = ch->in_room->vnum;
pReset->arg4 = 0;
}
else
/*
* Into a Mobile's inventory.
* --------------------------
*/
{
int flags = 0;
if ((flags = flag_value(wear_loc_flags, arg4)) == NO_FLAG) {
send_to_char("Resets: '? wear-loc'\n\r", ch);
return;
}
if (get_obj_index(atoi(arg3)) == NULL) {
send_to_char("Vnum does not exist.\n\r", ch);
return;
}
pReset = new_reset_data();
pReset->arg1 = atoi(arg3);
pReset->arg3 = flags;
if (pReset->arg3 == WEAR_NONE)
pReset->command = 'G';
else
pReset->command = 'E';
}
}
add_reset(ch->in_room, pReset, atoi(arg1));
SET_BIT(ch->in_room->area->area_flags, AREA_CHANGED);
send_to_char("Reset added.\n\r", ch);
}
else if (!str_cmp(arg2, "random") && is_number(arg3)) {
if (atoi(arg3) < 1 || atoi(arg3) > 6) {
send_to_char("Invalid argument.\n\r", ch);
return;
}
pReset = new_reset_data ();
pReset->command = 'R';
pReset->arg1 = ch->in_room->vnum;
pReset->arg2 = atoi(arg3);
add_reset(ch->in_room, pReset, atoi(arg1));
SET_BIT(ch->in_room->area->area_flags, AREA_CHANGED);
send_to_char("Random exits reset added.\n\r", ch);
} else {
send_to_char( "Syntax: RESET <number> OBJ <vnum> <wear_loc>\n\r", ch );
send_to_char( " RESET <number> OBJ <vnum> inside <vnum> [limit] [count]\n\r", ch );
send_to_char( " RESET <number> OBJ <vnum> room\n\r", ch );
send_to_char( " RESET <number> MOB <vnum> [max #x area] [max #x room]\n\r", ch );
send_to_char( " RESET <number> DELETE\n\r", ch );
send_to_char( " RESET <number> RANDOM [#x exits]\n\r", ch);
}
}
return;
}
ACMD(do_zallow) {
AREA_DATA *pArea;
char name[MAX_STRING_LENGTH];
char zone[MAX_STRING_LENGTH];
char buf1[MAX_STRING_LENGTH];
argument = one_argument(argument, name);
argument = one_argument(argument, zone);
if (!*name || !*zone || !is_number(zone)) {
ch->Send("Usage: %s <player> <zone>\n\r",
subcmd == SCMD_ZALLOW ? "zallow" : "zdeny");
return;
}
name[0] = UPPER(name[0]);
buf1[0] = '\0';
if ((pArea = get_area_data(atoi(zone))) == NULL) {
send_to_char("That zone doesn't seem to exist.\n\r", ch);
return;
}
if (subcmd == SCMD_ZALLOW) {
if (strstr(pArea->builders, name) != '\0') {
send_to_char("That person already has access to that zone.\n\r", ch);
return;
}
if (strstr(pArea->builders, "None") != '\0') {
pArea->builders = string_replace(pArea->builders, "None", "\0");
pArea->builders = string_unpad(pArea->builders);
}
if (pArea->builders[0] != '\0') {
strcat(buf1, pArea->builders);
strcat(buf1, " ");
}
strcat(buf1, name);
free_string(pArea->builders);
pArea->builders = string_proper(str_dup(buf1));
send_to_char("Builder added.\n\r", ch);
} else if (subcmd == SCMD_ZDENY) {
if (strstr(pArea->builders, name) == '\0') {
send_to_char("That person doesn't have access to that zone.\n\r", ch);
return;
}
pArea->builders = string_replace(pArea->builders, name, "\0");
pArea->builders = string_unpad(pArea->builders);
if (pArea->builders[0] == '\0') {
free_string(pArea->builders);
pArea->builders = str_dup("None");
}
send_to_char("Builder removed.\n\r", ch);
} else {
mudlogf(BRF, LVL_STAFF, TRUE, "SYSERR: Invalid subcmd passed to do_zallow (SCMD %d)", subcmd);
return;
}
SET_BIT(AREA_FLAGS(pArea), AREA_CHANGED);
send_to_char("Zone file edited.\n\r", ch);
mudlogf(BRF, LVL_STAFF, TRUE, "OLC: %s %s %s%s zone #%d builder access.",
RealName(ch), subcmd == SCMD_ZALLOW ? "gives" : "removes",
name, subcmd == SCMD_ZALLOW ? "" : "'s", pArea->vnum);
return;
}
ACMD(do_areas) {
char buf[MAX_STRING_LENGTH];
BUFFER *buffer = new_buf();
AREA_DATA *pArea;
sprintf(buf, "[%-23.23s] [%-23.23s] [%-23.23s]\n\r"
"------------------------- ------------------------- -------------------------\n\r",
"Area Name", "Area Theme", "Shortest Path");
add_buf(buffer, buf);
for (pArea = area_first; pArea; pArea = pArea->next) {
if (AREA_FLAGGED(pArea, AREA_UNLINKED))
continue;
sprintf(buf, "[%-23.23s] [%-23.23s] [%-23.23s]\n\r",
pArea->name, pArea->theme, path_to_area(ch, pArea));
add_buf(buffer, buf);
}
page_to_char(buf_string(buffer), ch);
free_buf(buffer);
return;
}
ACMD(do_alist) {
char buf[MAX_STRING_LENGTH];
BUFFER *result = new_buf();
AREA_DATA *pArea;
sprintf(buf, "[%3s] [%-28s] (%-5s-%5s) [%-10s] %3s [%-10s]\n\r"
"----- ------------------------------ ------------- ------------ --- ------------\n\r",
"Num", "Area Name", "lvnum", "uvnum", "Filename", "Sec", "Builder");
add_buf(result, buf);
for ( pArea = area_first; pArea; pArea = pArea->next )
{
sprintf(buf, "[%3d] [%s%-26.26s ] (%-5d-%5d) %-12.12s [%d] [%-10.10s]\n\r",
pArea->vnum,
AREA_FLAGGED(pArea, AREA_UNLINKED) ? "`y*`n" : " ",
pArea->name,
pArea->min_vnum, pArea->max_vnum,
pArea->file_name, pArea->security,
pArea->builders);
add_buf(result, buf);
}
page_to_char(buf_string(result), ch);
free_buf(result);
return;
}