/***************************************************************************
* Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer, *
* Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe. *
* *
* Merc Diku Mud improvments copyright (C) 1992, 1993 by Michael *
* Chastain, Michael Quan, and Mitchell Tse. *
* *
* Envy Diku Mud improvements copyright (C) 1994 by Michael Quan, David *
* Love, Guilherme 'Willie' Arnold, and Mitchell Tse. *
* *
* EnvyMud 2.0 improvements copyright (C) 1995 by Michael Quan and *
* Mitchell Tse. *
* *
* EnvyMud 2.2 improvements copyright (C) 1996, 1997 by Michael Quan. *
* *
* GreedMud 0.99.3 improvements copyright (C) 1997, 1998, 1999 *
* by Vasco Costa. *
* *
* In order to use any part of this Envy Diku Mud, you must comply with *
* the original Diku license in 'license.doc', the Merc license in *
* 'license.txt', as well as the Envy license in 'license.nvy'. *
* In particular, you may not remove either of these copyright notices. *
* *
* Much time and thought has gone into this software and you are *
* benefitting. We hope that you share your changes too. What goes *
* around, comes around. *
* *
* This code was freely distributed with the The Isles 1.1 source code, *
* and has been used here for OLC - OLC would not be what it is without *
* all the previous coders who released their source code. *
***************************************************************************/
#if defined( macintosh )
#include <types.h>
#else
#include <sys/types.h>
#endif
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "merc.h"
#include "olc.h"
/*
* Local functions.
*/
AREA_DATA *get_area_data args( ( int vnum ) );
/*
*
*/
void show_version( CHAR_DATA *ch, char *argument )
{
send_to_char( VERSION, ch );
send_to_char( "\n\r", ch );
send_to_char( AUTHOR, ch );
send_to_char( "\n\r", ch );
send_to_char( DATE, ch );
send_to_char( "\n\r", ch );
send_to_char( CREDITS, ch );
send_to_char( "\n\r", ch );
return;
}
/*
* Added by Zen. Substitutes the C macros they were making a do_switch bug!
* Return pointers to what is being edited.
*/
bool is_builder( CHAR_DATA *ch, AREA_DATA *area )
{
CHAR_DATA *rch;
if ( !ch->desc || !( rch = get_char( ch ) ) )
return FALSE;
if ( ( rch->pcdata->security >= area->security
|| is_name( rch->name, area->builders )
|| is_name( "All", area->builders ) ) )
return TRUE;
return FALSE;
}
void edit_done( CHAR_DATA *ch, char *argument )
{
ch->desc->olc_editing = NULL;
ch->desc->connected = CON_PLAYING;
return;
}
bool check_range( int lower, int upper )
{
AREA_DATA *pArea;
int cnt = 0;
for ( pArea = area_first; pArea; pArea = pArea->next )
{
if ( ( lower <= pArea->lvnum && upper >= pArea->lvnum )
|| ( upper >= pArea->uvnum && lower <= pArea->uvnum ) )
cnt++;
if ( cnt > 1 )
return FALSE;
}
return TRUE;
}
AREA_DATA *get_vnum_area( int vnum )
{
AREA_DATA *pArea;
for ( pArea = area_first; pArea; pArea = pArea->next )
if ( vnum >= pArea->lvnum && vnum <= pArea->uvnum )
return pArea;
return 0;
}
const struct olc_help_type help_table [ ] =
{
{ "area", area_flags, "area flags" },
{ "act", act_flags, "ACT_ bits" },
{ "affect", affect_flags, "AFF_ bits" },
{ "container", container_flags, "container flags" },
{ "exit", exit_flags, "exit types" },
{ "extra", extra_flags, "obj attributes" },
{ "game", game_table, "gambling progs" },
{ "liquid", liquid_flags, "liquids types" },
/* { "mobprogs", mprog_type_flags, "mobprog types" },*/
{ "portal", portal_flags, "portal attributes" },
{ "portal_door", portal_door_flags, "portal door flags" },
{ "race", race_table, "race types" },
{ "room", room_flags, "room attributes" },
{ "sector", sector_flags, "sector types" },
{ "sex", sex_flags, "sexes" },
{ "spec_mob", spec_mob_table, "mob spec procs" },
{ "spec_obj", spec_obj_table, "obj spec procs" },
{ "spells", skill_table, "spell names" },
{ "type", type_flags, "types of objects" },
{ "weapon", weapon_flags, "weapon type" },
{ "wear", wear_flags, "obj wear location" },
{ "wear_loc", wear_loc_flags, "eq wear location" },
{ "", 0, "" }
};
void show_flag_cmds( CHAR_DATA *ch, const struct flag_type *flag_table )
{
char buf [ MAX_STRING_LENGTH ];
char buf1 [ MAX_STRING_LENGTH ];
int flag;
int col;
buf1[0] = '\0';
col = 0;
for ( flag = 0; *flag_table[flag].name; flag++ )
{
if ( flag_table[flag].settable )
{
sprintf( buf, "%-19.18s", flag_table[flag].name );
strcat( buf1, buf );
if ( ++col % 4 == 0 )
strcat( buf1, "\n\r" );
}
}
if ( col % 4 != 0 )
strcat( buf1, "\n\r" );
send_to_char( buf1, ch );
return;
}
void show_skill_cmds( CHAR_DATA *ch, int tar )
{
char buf [ MAX_STRING_LENGTH ];
char buf1 [ MAX_STRING_LENGTH*2 ];
int sn;
int col;
buf1[0] = '\0';
col = 0;
for ( sn = 0; sn < MAX_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 == -1 || skill_table[sn].target == tar )
{
sprintf( buf, "%-19.18s", skill_table[sn].name );
strcat( buf1, buf );
if ( ++col % 4 == 0 )
strcat( buf1, "\n\r" );
}
}
if ( col % 4 != 0 )
strcat( buf1, "\n\r" );
send_to_char( buf1, ch );
return;
}
void show_spec_mob_cmds( CHAR_DATA *ch )
{
char buf [ MAX_STRING_LENGTH ];
char buf1 [ MAX_STRING_LENGTH ];
int spec;
int col;
buf1[0] = '\0';
col = 0;
send_to_char( "SPEC MOB FUN's (preceed with spec_):\n\r\n\r", ch );
for ( spec = 0; *spec_mob_table[spec].spec_fun; spec++ )
{
sprintf( buf, "%-19.18s", &spec_mob_table[spec].spec_name[5] );
strcat( buf1, buf );
if ( ++col % 4 == 0 )
strcat( buf1, "\n\r" );
}
if ( col % 4 != 0 )
strcat( buf1, "\n\r" );
send_to_char( buf1, ch );
return;
}
void show_spec_obj_cmds( CHAR_DATA *ch )
{
char buf [ MAX_STRING_LENGTH ];
char buf1 [ MAX_STRING_LENGTH ];
int spec;
int col;
buf1[0] = '\0';
col = 0;
send_to_char( "SPEC OBJ FUN's (preceed with spec_):\n\r\n\r", ch );
for ( spec = 0; *spec_obj_table[spec].spec_fun; spec++ )
{
sprintf( buf, "%-19.18s", &spec_obj_table[spec].spec_name[5] );
strcat( buf1, buf );
if ( ++col % 4 == 0 )
strcat( buf1, "\n\r" );
}
if ( col % 4 != 0 )
strcat( buf1, "\n\r" );
send_to_char( buf1, ch );
return;
}
void show_game_cmds( CHAR_DATA *ch )
{
char buf [ MAX_STRING_LENGTH ];
char buf1 [ MAX_STRING_LENGTH ];
int game;
int col;
buf1[0] = '\0';
col = 0;
send_to_char( "GAME FUN's (preceed with game_):\n\r", ch );
for ( game = 0; *game_table[game].game_fun; game++ )
{
sprintf( buf, "%-19.18s", &game_table[game].game_name[5] );
strcat( buf1, buf );
if ( ++col % 4 == 0 )
strcat( buf1, "\n\r" );
}
if ( col % 4 != 0 )
strcat( buf1, "\n\r" );
send_to_char( buf1, ch );
return;
}
void show_race_types( CHAR_DATA *ch )
{
char buf [ MAX_STRING_LENGTH ];
char buf1 [ MAX_STRING_LENGTH ];
int race;
int col;
buf1[0] = '\0';
col = 0;
for ( race = 0; race < MAX_RACE; race++ )
{
sprintf( buf, "%-19.18s", race_table[race].name );
strcat( buf1, buf );
if ( ++col % 4 == 0 )
strcat( buf1, "\n\r" );
}
if ( col % 4 != 0 )
strcat( buf1, "\n\r" );
send_to_char( buf1, ch );
return;
}
void do_qhelp( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *rch;
char buf [ MAX_STRING_LENGTH ];
char arg [ MAX_STRING_LENGTH ];
char spell [ MAX_INPUT_LENGTH ];
int cnt;
rch = get_char( ch );
if ( !authorized( rch, "qhelp" ) )
return;
argument = one_argument( argument, arg );
one_argument( argument, spell );
if ( arg[0] == '\0' )
{
send_to_char( "Syntax: qhelp <command>\n\r", ch );
send_to_char( "\n\r", ch );
send_to_char( "Command being one of:\n\r", ch );
for ( cnt = 0; help_table[cnt].command[0] != '\0'; cnt++ )
{
sprintf( buf, " %-14.14s %s\n\r",
capitalize( help_table[cnt].command ),
help_table[cnt].desc );
send_to_char( buf, ch );
}
return;
}
for ( cnt = 0; *help_table[cnt].command; cnt++ )
{
if ( arg[0] == help_table[cnt].command[0]
&& !str_prefix( arg, help_table[cnt].command ) )
{
if ( help_table[cnt].structure == spec_mob_table )
{
show_spec_mob_cmds( ch );
return;
}
else if ( help_table[cnt].structure == spec_obj_table )
{
show_spec_obj_cmds( ch );
return;
}
else if ( help_table[cnt].structure == game_table )
{
show_game_cmds( ch );
return;
}
else if ( help_table[cnt].structure == race_table )
{
show_race_types( ch );
return;
}
else if ( help_table[cnt].structure == skill_table )
{
if ( spell[0] == '\0' )
{
send_to_char( "Syntax: qhelp spells <option>\n\r", ch );
send_to_char( "Option being one of:\n\r", ch );
send_to_char( " ignore attack defend self object all\n\r",
ch );
return;
}
if ( !str_prefix( spell, "all" ) )
show_skill_cmds( ch, -1 );
else if ( !str_prefix( spell, "ignore" ) )
show_skill_cmds( ch, TAR_IGNORE );
else if ( !str_prefix( spell, "attack" ) )
show_skill_cmds( ch, TAR_CHAR_OFFENSIVE );
else if ( !str_prefix( spell, "defend" ) )
show_skill_cmds( ch, TAR_CHAR_DEFENSIVE );
else if ( !str_prefix( spell, "self" ) )
show_skill_cmds( ch, TAR_CHAR_SELF );
else if ( !str_prefix( spell, "object" ) )
show_skill_cmds( ch, TAR_OBJ_INV );
else
{
send_to_char( "Syntax: qhelp spells <option>\n\r", ch );
send_to_char( "Option being one of:\n\r", ch );
send_to_char( " ignore attack defend self object all\n\r",
ch );
}
return;
}
else
{
show_flag_cmds( ch,
(const struct flag_type *) help_table[cnt].structure );
return;
}
}
}
return;
}
bool aedit_create( CHAR_DATA *ch, char *argument )
{
AREA_DATA *pArea;
pArea = new_area( );
area_last->next = pArea;
area_last = pArea;
ch->desc->olc_editing = (void *) pArea;
SET_BIT( pArea->act, AREA_ADDED );
send_to_char( "Area created.\n\r", ch );
return TRUE;
}
void aedit( CHAR_DATA *ch, char *argument )
{
AREA_DATA *pArea;
char arg [ MAX_STRING_LENGTH ];
char arg1 [ MAX_STRING_LENGTH ];
char arg2 [ MAX_STRING_LENGTH ];
char buf [ MAX_STRING_LENGTH ];
int value;
pArea = ( AREA_DATA *) ch->desc->olc_editing;
strcpy( arg, argument );
smash_tilde( argument );
argument = one_argument( argument, arg1 );
strcpy( arg2, argument );
if ( !str_prefix( arg1, "show" ) )
{
sprintf( buf, "%d", pArea->vnum );
do_astat( ch, buf );
return;
}
if ( !str_prefix( arg1, "version" ) )
{
show_version( ch, "" );
return;
}
if ( !str_prefix( arg1, "done" ) )
{
edit_done( ch, "" );
return;
}
if ( !is_builder( ch, pArea ) )
{
send_to_char( "Insufficient security to modify area.\n\r", ch );
edit_done( ch, "" );
return;
}
if ( ( value = flag_value( area_flags, arg1 ) ) != NO_FLAG )
{
TOGGLE_BIT( pArea->act, value );
send_to_char( "Flag toggled.\n\r", ch );
return;
}
if ( !str_prefix( arg1, "create" ) )
{
aedit_create( ch, "" );
return;
}
if ( !str_prefix( arg1, "name" ) )
{
if ( arg2[0] == '\0' )
{
send_to_char( "Syntax: name <name>\n\r", ch );
return;
}
free_string( pArea->name );
pArea->name = str_dup( arg2 );
SET_BIT( pArea->act, AREA_CHANGED );
send_to_char( "Name set.\n\r", ch );
return;
}
if ( !str_prefix( arg1, "filename" ) )
{
if ( argument[0] == '\0' )
{
send_to_char( "Syntax: filename <filename>\n\r", ch );
return;
}
free_string( pArea->filename );
pArea->filename = str_dup( arg2 );
SET_BIT( pArea->act, AREA_CHANGED );
send_to_char( "Filename set.\n\r", ch );
return;
}
if ( !str_prefix( arg1, "age" ) )
{
if ( !is_number( arg2 ) || arg2[0] == '\0' )
{
send_to_char( "Syntax: age <age>\n\r", ch );
return;
}
pArea->age = atoi( arg2 );
SET_BIT( pArea->act, AREA_CHANGED );
send_to_char( "Age set.\n\r", ch );
return;
}
if ( !str_prefix( arg1, "recall" ) )
{
if ( !is_number( arg2 ) || arg2[0] == '\0' )
{
send_to_char( "Syntax: recall <vnum>\n\r", ch );
return;
}
value = atoi( arg2 );
if ( !get_room_index( value ) && value != 0 )
{
send_to_char( "Room vnum does not exist.\n\r", ch );
return;
}
pArea->recall = value;
SET_BIT( pArea->act, AREA_CHANGED );
send_to_char( "Recall set.\n\r", ch );
return;
}
if ( !str_prefix( arg1, "security" ) )
{
if ( !is_number( arg2 ) || arg2[0] == '\0' )
{
send_to_char( "Syntax: security <level>\n\r", ch );
return;
}
value = atoi( arg2 );
if ( value > ch->pcdata->security || value < 0 )
{
if ( ch->pcdata->security != 0 )
{
sprintf( buf, "Security is 0-%d.\n\r", ch->pcdata->security );
send_to_char( buf, ch );
}
else
send_to_char( "Security is 0 only.\n\r", ch );
return;
}
pArea->security = value;
SET_BIT( pArea->act, AREA_CHANGED );
send_to_char( "Security set.\n\r", ch );
return;
}
if ( !str_prefix( arg1, "builder" ) )
{
argument = one_argument( argument, arg2 );
if ( arg2[0] == '\0' )
{
send_to_char( "Syntax: builder <name>\n\r", ch );
return;
}
arg2[0] = UPPER( arg2[0] );
if ( is_name( arg2, pArea->builders ) )
{
pArea->builders = string_replace( pArea->builders, arg2, "\0" );
pArea->builders = string_unpad( pArea->builders );
SET_BIT( pArea->act, AREA_CHANGED );
send_to_char( "Builder removed.\n\r", ch );
return;
}
else
{
buf[0] = '\0';
if ( pArea->builders[0] != '\0' )
{
strcat( buf, pArea->builders );
strcat( buf, " " );
}
strcat( buf, arg2 );
free_string( pArea->builders );
pArea->builders = string_proper( str_dup( buf ) );
SET_BIT( pArea->act, AREA_CHANGED );
send_to_char( "Builder added.\n\r", ch );
return;
}
}
if ( !str_prefix( arg1, "lvnum" ) )
{
if ( !is_number( arg2 ) || arg2[0] == '\0' )
{
send_to_char( "Syntax: lvnum <lower>\n\r", ch );
return;
}
value = atoi( arg2 );
if ( get_vnum_area( value )
&& get_vnum_area( value ) != pArea )
{
send_to_char( "Vnum range already assigned.\n\r", ch );
return;
}
pArea->lvnum = value;
SET_BIT( pArea->act, AREA_CHANGED );
send_to_char( "Lower vnum set.\n\r", ch );
return;
}
if ( !str_prefix( arg1, "uvnum" ) )
{
if ( !is_number( arg2 ) || arg2[0] == '\0' )
{
send_to_char( "Syntax: uvnum <upper>\n\r", ch );
return;
}
value = atoi( arg2 );
if ( get_vnum_area( value )
&& get_vnum_area( value ) != pArea )
{
send_to_char( "Vnum range already assigned.\n\r", ch );
return;
}
pArea->uvnum = value;
SET_BIT( pArea->act, AREA_CHANGED );
send_to_char( "Upper vnum set.\n\r", ch );
return;
}
if ( !str_prefix( arg1, "vnum" ) )
{
argument = one_argument( argument, arg1 );
strcpy( arg2, argument );
if ( !is_number( arg1 ) || arg1[0] == '\0'
|| !is_number( arg2 ) || arg2[0] == '\0' )
{
send_to_char( "Syntax: vnum <lower> <upper>\n\r", ch );
return;
}
value = atoi( arg1 );
if ( get_vnum_area( value )
&& get_vnum_area( value ) != pArea )
{
send_to_char( "Lower vnum already assigned.\n\r", ch );
return;
}
pArea->lvnum = value;
send_to_char( "Lower vnum set.\n\r", ch );
value = atoi( arg2 );
if ( get_vnum_area( value )
&& get_vnum_area( value ) != pArea )
{
send_to_char( "Upper vnum already assigned.\n\r", ch );
return;
}
pArea->uvnum = value;
send_to_char( "Upper vnum set.\n\r", ch );
SET_BIT( pArea->act, AREA_CHANGED );
return;
}
if ( !str_prefix( arg1, "range" ) )
{
argument = one_argument( argument, arg1 );
strcpy( arg2, argument );
if ( !is_number( arg1 ) || arg1[0] == '\0'
|| !is_number( arg2 ) || arg2[0] == '\0' )
{
send_to_char( "Syntax: range <lower> <upper>\n\r", ch );
return;
}
value = atoi( arg1 );
pArea->llv = value;
send_to_char( "Lower level set.\n\r", ch );
value = atoi( arg2 );
pArea->ulv = value;
send_to_char( "Upper level set.\n\r", ch );
SET_BIT( pArea->act, AREA_CHANGED );
return;
}
if ( !str_prefix( arg1, "reset" ) )
{
if ( argument[0] == '\0' )
{
send_to_char( "Syntax: reset <string>\n\r", ch );
return;
}
free_string( pArea->resetmsg );
pArea->resetmsg = str_dup( arg2 );
SET_BIT( pArea->act, AREA_CHANGED );
send_to_char( "Reset message set.\n\r", ch );
return;
}
if ( !str_prefix( arg1, "author" ) )
{
if ( argument[0] == '\0' )
{
send_to_char( "Syntax: author <name>\n\r", ch );
return;
}
free_string( pArea->author );
pArea->author = str_dup( arg2 );
SET_BIT( pArea->act, AREA_CHANGED );
send_to_char( "Author name set.\n\r", ch );
return;
}
interpret( ch, arg );
return;
}
bool redit_create( CHAR_DATA *ch, char *argument )
{
AREA_DATA *pArea;
ROOM_INDEX_DATA *pRoom;
int value;
int iHash;
value = atoi( argument );
if ( argument[0] == '\0' || value == 0 )
{
send_to_char( "Syntax: create <vnum>\n\r", ch );
return FALSE;
}
pArea = get_vnum_area( value );
if ( !pArea )
{
send_to_char( "That vnum is not assigned an area.\n\r", ch );
return FALSE;
}
if ( !is_builder( ch, pArea ) )
{
send_to_char( "Vnum in an area you cannot build in.\n\r", ch );
return FALSE;
}
if ( get_room_index( value ) )
{
send_to_char( "Room vnum already exists.\n\r", ch );
return FALSE;
}
pRoom = new_room_index( );
pRoom->area = pArea;
pRoom->vnum = value;
if ( value > top_vnum_room ) top_vnum_room = value;
if ( value > pArea->hi_r_vnum ) pArea->hi_r_vnum = value;
iHash = value % MAX_KEY_HASH;
pRoom->next = room_index_hash[iHash];
room_index_hash[iHash] = pRoom;
ch->desc->olc_editing = (void *)pRoom;
SET_BIT( pArea->act, AREA_CHANGED );
send_to_char( "Room created.\n\r", ch );
return TRUE;
}
void redit( CHAR_DATA *ch, char *argument )
{
AREA_DATA *pArea;
ROOM_INDEX_DATA *pRoom;
EXIT_DATA *pExit;
EXTRA_DESCR_DATA *ed;
char arg [ MAX_STRING_LENGTH ];
char arg1 [ MAX_STRING_LENGTH ];
char arg2 [ MAX_STRING_LENGTH ];
char buf [ MAX_STRING_LENGTH ];
int value;
int door;
strcpy( arg, argument );
smash_tilde( argument );
argument = one_argument( argument, arg1 );
strcpy( arg2, argument );
pRoom = ch->in_room;
pArea = pRoom->area;
if ( !str_prefix( arg1, "show" ) )
{
sprintf( buf, "%d", pRoom->vnum );
do_rstat( ch, buf );
return;
}
if ( !str_prefix( arg1, "version" ) )
{
show_version( ch, "" );
return;
}
if ( !str_prefix( arg1, "done" ) )
{
edit_done( ch, "" );
return;
}
if ( !is_builder( ch, pArea ) )
{
send_to_char( "Insufficient security to modify room.\n\r", ch );
edit_done( ch, "" );
return;
}
if ( ( value = flag_value( room_flags, arg1 ) ) != NO_FLAG )
{
TOGGLE_BIT( pRoom->orig_room_flags, value );
SET_BIT( pArea->act, AREA_CHANGED );
send_to_char( "Room flag toggled.\n\r", ch );
return;
}
if ( ( value = flag_value( sector_flags, arg1 ) ) != NO_FLAG )
{
pRoom->sector_type = value;
SET_BIT( pArea->act, AREA_CHANGED );
send_to_char( "Sector type set.\n\r", ch );
return;
}
for ( door = 0; door < MAX_DIR; door++ )
{
if ( !str_prefix( arg1, dir_name[door] ) )
break;
}
if ( door != MAX_DIR && arg2[0] != '\0' )
{
argument = one_argument( argument, arg1 );
strcpy( arg2, argument );
if ( !str_cmp( arg1, "help" ) )
{
do_help( ch, "EXITEDIT" );
return;
}
if ( !str_cmp( arg1, "delete" ) )
{
if ( !pRoom->exit[door] )
{
send_to_char( "Cannot delete a non-existant exit.\n\r", ch );
return;
}
if ( pRoom->exit[door]->to_room->exit[rev_dir[door]] )
{
free_exit( pRoom->exit[door]->to_room->exit[rev_dir[door]] );
pRoom->exit[door]->to_room->exit[rev_dir[door]] = NULL;
}
free_exit( pRoom->exit[door] );
pRoom->exit[door] = NULL;
SET_BIT( pArea->act, AREA_CHANGED );
send_to_char( "Exit unlinked.\n\r", ch );
return;
}
if ( !str_cmp( arg1, "link" ) )
{
if ( arg2[0] == '\0' || !is_number( arg2 ) )
{
send_to_char( "Syntax: [direction] link <vnum>\n\r", ch );
return;
}
value = atoi( arg2 );
if ( !get_room_index( value ) )
{
send_to_char( "Cannot link to non-existant room.\n\r", ch );
return;
}
if ( !is_builder( ch, get_room_index( value )->area ) )
{
send_to_char( "Remote side not created, not a builder there.\n\r",
ch );
return;
}
if ( get_room_index( value )->exit[rev_dir[door]] )
{
send_to_char( "Remote side's exit already exists.\n\r", ch );
return;
}
if ( !pRoom->exit[door] )
pRoom->exit[door] = new_exit( );
pRoom->exit[door]->to_room = get_room_index( value );
pRoom->exit[door]->vnum = value;
pRoom = get_room_index( value );
door = rev_dir[door];
pExit = new_exit( );
pExit->to_room = ch->in_room;
pExit->vnum = ch->in_room->vnum;
pRoom->exit[door] = pExit;
SET_BIT( pArea->act, AREA_CHANGED );
send_to_char( "Exit linked.\n\r", ch );
return;
}
if ( !str_cmp( arg1, "dig" ) )
{
if ( arg2[0] == '\0' || !is_number( arg2 ) )
{
send_to_char( "Syntax: [direction] dig <vnum>\n\r", ch );
return;
}
sprintf( buf, "create %s", arg2 );
redit( ch, buf );
sprintf( buf, "%s link %s", dir_name[door], arg2 );
redit( ch, buf );
return;
}
if ( !str_cmp( arg1, "room" ) )
{
if ( arg2[0] == '\0' || !is_number( arg2 ) )
{
send_to_char( "Syntax: [direction] room <vnum>\n\r", ch );
return;
}
if ( !pRoom->exit[door] )
pRoom->exit[door] = new_exit( );
value = atoi( arg2 );
if ( !get_room_index( value ) )
{
send_to_char( "Cannot link to non-existant room.\n\r", ch );
return;
}
pRoom->exit[door]->to_room = get_room_index( value );
pRoom->exit[door]->vnum = value;
SET_BIT( pArea->act, AREA_CHANGED );
send_to_char( "Exit set.\n\r", ch );
return;
}
if ( !str_cmp( arg1, "key" ) )
{
if ( arg2[0] == '\0' || !is_number( arg2 ) )
{
send_to_char( "Syntax: [direction] key <vnum>\n\r", ch );
return;
}
if ( !pRoom->exit[door] )
pRoom->exit[door] = new_exit( );
value = atoi( arg2 );
if ( !get_obj_index( value ) )
{
send_to_char( "Cannot use a non-existant object as a key.\n\r",
ch );
return;
}
pRoom->exit[door]->key = value;
SET_BIT( pArea->act, AREA_CHANGED );
send_to_char( "Exit key set.\n\r", ch );
return;
}
if ( !str_cmp( arg1, "name" ) )
{
if ( arg2[0] == '\0' )
{
send_to_char( "Syntax: [direction] name <string>\n\r", ch );
return;
}
if ( !pRoom->exit[door] )
pRoom->exit[door] = new_exit( );
free_string( pRoom->exit[door]->keyword );
pRoom->exit[door]->keyword = str_dup( arg2 );
SET_BIT( pArea->act, AREA_CHANGED );
send_to_char( "Exit name set.\n\r", ch );
return;
}
if ( !str_cmp( arg1, "desc" ) || !str_cmp( arg1, "description" ) )
{
if ( !pRoom->exit[door] )
pRoom->exit[door] = new_exit( );
if ( arg2[0] == '\0' )
{
string_append( ch, &pRoom->exit[door]->description );
SET_BIT( pArea->act, AREA_CHANGED );
return;
}
send_to_char( "Syntax: [direction] desc - line edit\n\r", ch );
return;
}
if ( ( value = flag_value( exit_flags, arg1 ) ) != NO_FLAG )
{
ROOM_INDEX_DATA *pToRoom;
if ( !pRoom->exit[door] )
pRoom->exit[door] = new_exit( );
TOGGLE_BIT( pRoom->exit[door]->rs_flags, value );
pRoom->exit[door]->exit_info = pRoom->exit[door]->rs_flags;
if ( ( pToRoom = pRoom->exit[door]->to_room )
&& pToRoom->exit[rev_dir[door]] )
{
TOGGLE_BIT( pToRoom->exit[rev_dir[door]]->rs_flags, value );
pToRoom->exit[rev_dir[door]]->exit_info =
pToRoom->exit[rev_dir[door]]->rs_flags;
}
SET_BIT( pArea->act, AREA_CHANGED );
send_to_char( "Exit flag toggled.\n\r", ch );
return;
}
}
if ( !str_prefix( arg1, "ed" ) )
{
if ( arg2[0] == '\0' )
{
send_to_char( "Syntax: ed add <keyword>\n\r", ch );
send_to_char( " ed delete <keyword>\n\r", ch );
send_to_char( " ed edit <keyword>\n\r", ch );
return;
}
argument = one_argument( argument, arg1 );
strcpy( arg2, argument );
if ( !str_cmp( arg1, "add" ) )
{
if ( arg2[0] == '\0' )
{
send_to_char( "Syntax: ed add <keyword>\n\r", ch );
return;
}
ed = new_extra_descr();
ed->keyword = str_dup( arg2 );
ed->description = str_dup( "" );
ed->next = pRoom->extra_descr;
pRoom->extra_descr = ed;
string_append( ch, &ed->description );
SET_BIT( pArea->act, AREA_CHANGED );
return;
}
if ( !str_cmp( arg1, "edit" ) )
{
if ( arg2[0] == '\0' )
{
send_to_char( "Syntax: ed edit <keyword>\n\r", ch );
return;
}
for ( ed = pRoom->extra_descr; ed; ed = ed->next )
{
if ( is_name( arg2, ed->keyword ) )
break;
}
if ( !ed )
{
send_to_char( "Extra description keyword not found.\n\r", ch );
return;
}
string_append( ch, &ed->description );
SET_BIT( pArea->act, AREA_CHANGED );
return;
}
if ( !str_cmp( arg1, "delete" ) )
{
EXTRA_DESCR_DATA *ped;
if ( arg2[0] == '\0' )
{
send_to_char( "Syntax: ed delete <keyword>\n\r", ch );
return;
}
ped = NULL;
for ( ed = pRoom->extra_descr; ed; ed = ed->next )
{
if ( is_name( arg2, ed->keyword ) )
break;
ped = ed;
}
if ( !ed )
{
send_to_char( "Extra description keyword not found.\n\r", ch );
return;
}
if ( !ped )
pRoom->extra_descr = ed->next;
else
ped->next = ed->next;
free_extra_descr( ed );
send_to_char( "Extra description deleted.\n\r", ch );
SET_BIT( pArea->act, AREA_CHANGED );
return;
}
}
if ( !str_prefix( arg1, "create" ) )
{
redit_create( ch, arg2 );
return;
}
if ( !str_prefix( arg1, "name" ) )
{
if ( arg2[0] == '\0' )
{
send_to_char( "Syntax: name <name>\n\r", ch );
return;
}
free_string( pRoom->name );
pRoom->name = str_dup( arg2 );
SET_BIT( pArea->act, AREA_CHANGED );
send_to_char( "Name set.\n\r", ch );
return;
}
if ( !str_prefix( arg1, "description" ) )
{
if ( arg2[0] == '\0' )
{
string_append( ch, &pRoom->description );
SET_BIT( pArea->act, AREA_CHANGED );
return;
}
send_to_char( "Syntax: desc - line edit\n\r", ch );
return;
}
if ( !str_prefix( arg1, "light" ) )
{
if ( arg2[0] == '\0' || !is_number( arg2 ) )
{
send_to_char( "Syntax: light <number>\n\r", ch );
return;
}
value = atoi( arg2 );
pRoom->light = value;
SET_BIT( pArea->act, AREA_CHANGED );
send_to_char( "Light set.\n\r", ch);
return;
}
if ( !str_prefix( arg1, "regen" ) )
{
argument = one_argument( argument, arg1 );
strcpy( arg2, argument );
if ( !is_number( arg1 ) || arg1[0] == '\0'
|| !is_number( arg2 ) || arg2[0] == '\0' )
{
send_to_char( "Syntax: regen <heal> <mana>\n\r", ch );
return;
}
value = atoi( arg1 );
pRoom->heal_rate = value;
value = atoi( arg2 );
pRoom->mana_rate = value;
send_to_char( "Regenation fields changed.\n\r", ch );
SET_BIT( pArea->act, AREA_CHANGED );
return;
}
interpret( ch, arg );
return;
}
void show_obj_values( CHAR_DATA *ch, OBJ_INDEX_DATA *obj )
{
char buf [ MAX_STRING_LENGTH ];
buf[0] = '\0';
switch ( obj->item_type )
{
default: break;
case ITEM_LIGHT:
if ( obj->value[2] == -1 )
sprintf( buf, "value[2]{c light {xinfinite{c. {x-1{c,{x\n\r" );
else
sprintf( buf, "value[2]{c light {x%d{c.{x\n\r", obj->value[2] );
break;
case ITEM_WAND:
case ITEM_STAFF:
sprintf( buf,
"value[0]{c level {x%d{c.{x\n\r"
"value[1]{c charges total {x%d{c.{x\n\r"
"value[2]{c charges left {x%d{c.{x\n\r"
"value[3]{c spell {x%s{c.{x\n\r",
obj->value[0],
obj->value[1],
obj->value[2],
obj->value[3] != -1
? skill_table[obj->value[3]].name : "none" );
break;
case ITEM_SCROLL:
case ITEM_POTION:
case ITEM_PILL:
sprintf( buf,
"value[0]{c level {x%d{c.{x\n\r"
"value[1]{c spell {x%s{c.{x\n\r"
"value[2]{c spell {x%s{c.{x\n\r"
"value[3]{c spell {x%s{c.{x\n\r"
"value[4]{c spell {x%s{c.{x\n\r",
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_WEAPON:
sprintf( buf,
"value[1]{c damage minimum {x%d{c.{x\n\r"
"value[2]{c damage maximum {x%d{c.{x\n\r"
"value[3]{c type {x%s{c.{x\n\r",
obj->value[1],
obj->value[2],
flag_string( weapon_flags, obj->value[3] ) );
break;
case ITEM_CONTAINER:
sprintf( buf,
"value[0]{c weight {x%d{c kg.{x\n\r"
"value[1]{c flags {x%s{c.{x\n\r"
"value[2]{c key {x%s{c. {x%d{c.{x\n\r",
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] );
break;
case ITEM_DRINK_CON:
sprintf( buf,
"value[0]{c liquid total {x%d{c.{x\n\r"
"value[1]{c liquid left {x%d{c.{x\n\r"
"value[2]{c liquid {x%s{c.{x\n\r"
"value[3]{c poisoned {x%s{c.{x\n\r",
obj->value[0],
obj->value[1],
flag_string( liquid_flags, obj->value[2] ),
obj->value[3] != 0 ? "yes" : "no" );
break;
case ITEM_FOOD:
sprintf( buf,
"value[0]{c food hours {x%d{c.{x\n\r"
"value[3]{c poisoned {x%s{c.{x\n\r",
obj->value[0],
obj->value[3] != 0 ? "yes" : "no" );
break;
case ITEM_MONEY:
sprintf( buf, "value[0]{c gold {x%d{c.{x\n\r", obj->value[0] );
break;
case ITEM_PORTAL:
sprintf( buf,
"value[0]{c charges {x%d{c.{x\n\r"
"value[1]{c flags {x%s{c.{x\n\r"
"value[2]{c key {x%s{c. {x%d{c.{x\n\r"
"value[3]{c flags {x%s{c.{x\n\r"
"value[4]{c destiny {x%d{c.{x\n\r",
obj->value[0],
flag_string( portal_door_flags, obj->value[1] ),
get_obj_index( obj->value[2] )
? get_obj_index( obj->value[2] )->short_descr
: "none", obj->value[2],
flag_string( portal_flags, obj->value[3] ),
obj->value[4] );
break;
case ITEM_GEM:
sprintf( buf,
"value[0]{c flags {x%s{c.{x\n\r"
"value[1]{c mana {x%d{c.{x\n\r"
"value[2]{c max_mana {x%d{c.{x\n\r",
flag_string( mana_flags, obj->value[0] ),
obj->value[1],
obj->value[2] );
break;
}
send_to_char( buf, ch );
return;
}
bool set_obj_values( CHAR_DATA *ch, OBJ_INDEX_DATA *pObj, int value_num,
char *argument )
{
char buf [ MAX_STRING_LENGTH ];
int value;
switch ( pObj->item_type )
{
default: break;
case ITEM_LIGHT:
switch ( value_num )
{
default:
do_help( ch, "ITEM_LIGHT" );
return FALSE;
case 2:
send_to_char( "Hours of light set.\n\r\n\r", ch );
pObj->value[2] = atoi( argument );
break;
}
break;
case ITEM_WAND:
case ITEM_STAFF:
switch ( value_num )
{
default:
do_help( ch, "ITEM_STAFF_WAND" );
return FALSE;
case 0:
send_to_char( "Spell level set.\n\r\n\r", ch );
pObj->value[0] = atoi( argument );
break;
case 1:
send_to_char( "Total number of charges set.\n\r\n\r", ch );
pObj->value[1] = atoi( argument );
break;
case 2:
send_to_char( "Current number of charges set.\n\r\n\r", ch );
pObj->value[2] = atoi( argument );
break;
case 3:
send_to_char( "Spell type set.\n\r", ch );
pObj->value[3] = skill_blookup( argument, 0, MAX_SPELL );
break;
}
break;
case ITEM_SCROLL:
case ITEM_POTION:
case ITEM_PILL:
switch ( value_num )
{
default:
do_help( ch, "ITEM_SCROLL_POTION_PILL" );
return FALSE;
case 0:
send_to_char( "Spell level set.\n\r\n\r", ch );
pObj->value[0] = atoi( argument );
break;
case 1:
case 2:
case 3:
case 4:
sprintf( buf, "Spell type %d set.\n\r\n\r", value_num );
send_to_char( buf, ch );
pObj->value[value_num] = skill_blookup( argument, 0, MAX_SPELL );
break;
}
break;
case ITEM_WEAPON:
switch ( value_num )
{
default:
do_help( ch, "ITEM_WEAPON" );
return FALSE;
case 1:
send_to_char( "Minimum damage set.\n\r\n\r", ch );
pObj->value[1] = atoi( argument );
break;
case 2:
send_to_char( "Maximum damage set.\n\r\n\r", ch );
pObj->value[2] = atoi( argument );
break;
case 3:
send_to_char( "Weapon type set.\n\r\n\r", ch );
pObj->value[3] = flag_value( weapon_flags, argument );
break;
}
break;
case ITEM_CONTAINER:
switch ( value_num )
{
default:
do_help( ch, "ITEM_CONTAINER" );
return FALSE;
case 0:
send_to_char( "Weight capacity set.\n\r\n\r", ch );
pObj->value[0] = atoi( argument );
break;
case 1:
if ((value = flag_value( container_flags, argument )) != NO_FLAG)
TOGGLE_BIT( pObj->value[1], value );
else
{
do_help( ch, "ITEM_CONTAINER" );
return FALSE;
}
send_to_char( "Container type set.\n\r\n\r", ch );
break;
case 2:
if ( atoi( argument ) != 0 )
{
if ( !get_obj_index( atoi( argument ) ) )
{
send_to_char( "There is no such item.\n\r\n\r", ch );
return FALSE;
}
if ( get_obj_index( atoi( argument ) )->item_type != ITEM_KEY )
{
send_to_char( "That item is not a key.\n\r\n\r", ch );
return FALSE;
}
}
send_to_char( "Container key set.\n\r\n\r", ch );
pObj->value[2] = atoi( argument );
break;
}
break;
case ITEM_DRINK_CON:
switch ( value_num )
{
default:
do_help( ch, "ITEM_DRINK_CON" );
return FALSE;
case 0:
send_to_char( "Maximum amout of liquid hours set.\n\r\n\r", ch );
pObj->value[0] = atoi( argument );
break;
case 1:
send_to_char( "Current amount of liquid hours set.\n\r\n\r", ch );
pObj->value[1] = atoi( argument );
break;
case 2:
send_to_char( "Liquid type set.\n\r\n\r", ch );
pObj->value[2] = flag_value( liquid_flags, argument );
break;
case 3:
send_to_char( "Poison value toggled.\n\r\n\r", ch );
pObj->value[3] = ( pObj->value[3] == 0 ) ? 1 : 0;
break;
}
break;
case ITEM_FOOD:
switch ( value_num )
{
default:
do_help( ch, "ITEM_FOOD" );
return FALSE;
case 0:
send_to_char( "Hours of food set.\n\r\n\r", ch );
pObj->value[0] = atoi( argument );
break;
case 3:
send_to_char( "Poison value toggled.\n\r\n\r", ch );
pObj->value[3] = ( pObj->value[3] == 0 ) ? 1 : 0;
break;
}
break;
case ITEM_MONEY:
switch ( value_num )
{
default:
do_help( ch, "ITEM_MONEY" );
return FALSE;
case 0:
send_to_char( "Gold amount set.\n\r\n\r", ch );
pObj->value[0] = atoi( argument );
break;
}
break;
case ITEM_PORTAL:
switch ( value_num )
{
default:
do_help( ch, "ITEM_PORTAL" );
return FALSE;
case 0:
send_to_char( "Number of charges set.\n\r\n\r", ch );
pObj->value[0] = atoi( argument );
break;
case 1:
if ((value = flag_value( portal_door_flags, argument )) != NO_FLAG)
TOGGLE_BIT( pObj->value[1], value );
else
{
do_help( ch, "ITEM_PORTAL" );
return FALSE;
}
send_to_char( "Portal door type set.\n\r\n\r", ch );
break;
case 2:
if ( atoi( argument ) )
{
if ( !get_obj_index( atoi( argument ) ) )
{
send_to_char( "There is no such item.\n\r\n\r", ch );
return FALSE;
}
if ( get_obj_index( atoi( argument ) )->item_type != ITEM_KEY )
{
send_to_char( "That item is not a key.\n\r\n\r", ch );
return FALSE;
}
}
send_to_char( "Portal key set.\n\r\n\r", ch );
pObj->value[2] = atoi( argument );
break;
case 3:
if ((value = flag_value( portal_flags, argument )) != NO_FLAG)
TOGGLE_BIT( pObj->value[3], value );
else
{
do_help( ch, "ITEM_PORTAL" );
return FALSE;
}
send_to_char( "Portal type set.\n\r\n\r", ch );
break;
case 4:
send_to_char( "Portal destiny room vnum set.\n\r\n\r", ch );
pObj->value[4] = atoi( argument );
break;
}
break;
case ITEM_GEM:
switch ( value_num )
{
default:
do_help( ch, "ITEM_GEM" );
return FALSE;
case 0:
if ((value = flag_value( mana_flags, argument )) != NO_FLAG)
TOGGLE_BIT( pObj->value[0], value );
else
{
do_help( ch, "ITEM_GEM" );
return FALSE;
}
send_to_char( "Gem mana type flag toggled.\n\r\n\r", ch );
break;
case 1:
send_to_char( "Mana amount set.\n\r\n\r", ch );
pObj->value[1] = atoi( argument );
break;
case 2:
send_to_char( "Max mana amount set.\n\r\n\r", ch );
pObj->value[2] = atoi( argument );
break;
}
break;
}
show_obj_values( ch, pObj );
return TRUE;
}
bool set_value( CHAR_DATA * ch, OBJ_INDEX_DATA * pObj, char *argument,
int value )
{
if ( argument[0] == '\0' )
{
set_obj_values( ch, pObj, -1, '\0' );
return FALSE;
}
if ( set_obj_values( ch, pObj, value, argument ) )
return TRUE;
return FALSE;
}
bool oedit_create( CHAR_DATA *ch, char *argument )
{
AREA_DATA *pArea;
OBJ_INDEX_DATA *pObj;
int value;
int iHash;
value = atoi( argument );
if ( argument[0] == '\0' || value == 0 )
{
send_to_char( "Syntax: create <vnum>\n\r", ch );
return FALSE;
}
pArea = get_vnum_area( value );
if ( !pArea )
{
send_to_char( "That vnum is not assigned an area.\n\r", ch );
return FALSE;
}
if ( !is_builder( ch, pArea ) )
{
send_to_char( "Vnum in an area you cannot build in.\n\r", ch );
return FALSE;
}
if ( get_obj_index( value ) )
{
send_to_char( "Object vnum already exists.\n\r", ch );
return FALSE;
}
pObj = new_obj_index( );
pObj->vnum = value;
pObj->area = pArea;
if ( value > top_vnum_obj ) top_vnum_obj = value;
if ( value > pArea->hi_o_vnum ) pArea->hi_o_vnum = value;
iHash = value % MAX_KEY_HASH;
pObj->next = obj_index_hash[iHash];
obj_index_hash[iHash] = pObj;
ch->desc->olc_editing = (void *) pObj;
SET_BIT( pArea->act, AREA_CHANGED );
send_to_char( "Object created.\n\r", ch );
return TRUE;
}
void do_oindex( CHAR_DATA *ch, char *argument )
{
OBJ_INDEX_DATA *obj;
AFFECT_DATA *paf;
char buf [ MAX_STRING_LENGTH ];
char buf1 [ MAX_STRING_LENGTH ];
char arg [ MAX_INPUT_LENGTH ];
int cnt;
one_argument( argument, arg );
if ( arg[0] == '\0' )
{
send_to_char( "Oindex what?\n\r", ch );
return;
}
buf1[0] = '\0';
if ( !( obj = get_obj_index( atoi( arg ) ) ) )
{
send_to_char( "Invalid obj index vnum.\n\r", ch );
return;
}
sprintf( buf, "{cArea: {x%s{c. |{x%d{c|{x\n\r",
obj->area ? obj->area->name : "(no area)",
obj->area ? obj->area->vnum : -1 );
strcat( buf1, buf );
sprintf( buf, "{cName:{x %s{c.{x\n\r",
obj->name );
strcat( buf1, buf );
sprintf( buf, "{cVnum: {x%d{c. Type: {x%s{c.{x\n\r",
obj->vnum, flag_string( type_flags, obj->item_type ) );
strcat( buf1, buf );
sprintf( buf, "{cShort description: {x%s{c.{x\n\r{cLong description: {x%s\n\r",
obj->short_descr, obj->description );
strcat( buf1, buf );
sprintf( buf, "{cWear flags: {x%s{c.{x ",
flag_string( wear_flags, obj->wear_flags ) );
strcat( buf1, buf );
sprintf( buf, "{cExtra flags: {x%s{c.{x\n\r",
act_xbv( extra_flags, obj->extra_flags ) );
strcat( buf1, buf );
sprintf( buf, "{cWeight: {x%d{c.{x\n\r", obj->weight );
strcat( buf1, buf );
if ( obj->extra_descr )
{
EXTRA_DESCR_DATA *ed;
strcat( buf1, "{cExtra description keywords: '{x" );
for ( ed = obj->extra_descr; ed; ed = ed->next )
{
strcat( buf1, ed->keyword );
if ( ed->next )
strcat( buf1, " " );
}
strcat( buf1, "{c'.{x\n\r" );
}
if ( obj->spec_fun != 0 )
{
sprintf( buf, "{cObject has {x%s{c.{x\n\r",
spec_obj_string( obj->spec_fun ) );
strcat( buf1, buf );
}
for ( cnt = 0, paf = obj->affected; paf; paf = paf->next, cnt++ )
{
if ( cnt == 0 )
{
strcat( buf1, "\n\r" );
strcat( buf1, "{o{c{B| Number | Location | Modifier | Bitvector {x\n\r" );
strcat( buf1, "{o{c{B+--------+--------------+----------+-----------------------{x\n\r" );
}
sprintf( buf, "{o{c{B| %-4d | %-12.12s | %-8d | ",
cnt,
flag_string( apply_flags, paf->location ),
paf->modifier );
strcat( buf1, buf );
sprintf( buf, "%-22.22s{x\n\r",
act_xbv( affect_flags, paf->bitvector ) );
strcat( buf1, buf );
}
strcat( buf1, "\n\r" );
send_to_char( buf1, ch );
show_obj_values( ch, obj );
return;
}
void oedit( CHAR_DATA *ch, char *argument )
{
AREA_DATA *pArea;
OBJ_INDEX_DATA *pObj;
EXTRA_DESCR_DATA *ed;
AFFECT_DATA *pAf;
AFFECT_DATA *pAf_next;
char arg [ MAX_STRING_LENGTH ];
char arg1 [ MAX_STRING_LENGTH ];
char arg2 [ MAX_STRING_LENGTH ];
char buf [ MAX_STRING_LENGTH ];
int value;
strcpy( arg, argument );
smash_tilde( argument );
argument = one_argument( argument, arg1 );
strcpy( arg2, argument );
pObj = ( OBJ_INDEX_DATA * ) ch->desc->olc_editing;
pArea = pObj->area;
if ( !str_prefix( arg1, "show" ) )
{
sprintf( buf, "%d", pObj->vnum );
do_oindex( ch, buf );
return;
}
if ( !str_prefix( arg1, "version" ) )
{
show_version( ch, "" );
return;
}
if ( !str_prefix( arg1, "done" ) )
{
edit_done( ch, "" );
return;
}
if ( !is_builder( ch, pArea ) )
{
send_to_char( "Insufficient security to modify object.\n\r", ch );
edit_done( ch, "" );
return;
}
if ( !str_prefix( arg1, "addaffect" ) )
{
char arg3 [MAX_STRING_LENGTH];
int bit;
argument = one_argument( argument, arg1 );
argument = one_argument( argument, arg2 );
strcpy( arg3, argument );
if ( arg1[0] == '\0' || arg2[0] == '\0' || arg3[0] == '\0'
|| !is_number( arg2 ) )
{
send_to_char( "Syntax: addaffect <location> <mod> <bitvector>\n\r", ch );
return;
}
if ( flag_value( apply_flags, arg1 ) == NO_FLAG )
{
send_to_char( "Affect location doesn't exist!\n\r", ch );
return;
}
if ( ( bit = flag_value( affect_flags, arg3 ) ) == NO_FLAG )
{
send_to_char( "Affect bitvector doesn't exist!\n\r", ch );
return;
}
pAf = new_affect( );
pAf->location = flag_value( apply_flags, arg1 );
pAf->modifier = atoi( arg2 );
pAf->type = -1;
pAf->duration = -1;
if ( bit >= 0 )
xSET_BIT( pAf->bitvector, bit );
pAf->next = pObj->affected;
pObj->affected = pAf;
SET_BIT( pArea->act, AREA_CHANGED );
send_to_char( "Affect added.\n\r", ch);
return;
}
if ( !str_prefix( arg1, "delaffect" ) )
{
int cnt = 0;
strcpy( arg1, argument );
if ( arg1[0] == '\0' || !is_number( arg1 ) )
{
send_to_char( "Syntax: delaffect <affect>\n\r", ch );
return;
}
value = atoi( arg1 );
if ( value < 0 )
{
send_to_char( "Only non-negative affect-numbers allowed.\n\r", ch );
return;
}
if ( !( pAf = pObj->affected ) )
{
send_to_char( "Non-existant affect.\n\r", ch );
return;
}
if ( value == 0 )
{
pAf = pObj->affected;
pObj->affected = pAf->next;
free_affect( pAf );
}
else
{
while ( ( pAf_next = pAf->next ) && ( ++cnt < value ) )
pAf = pAf_next;
if ( pAf_next )
{
pAf->next = pAf_next->next;
free_affect( pAf_next );
}
else
{
send_to_char( "No such affect.\n\r", ch );
return;
}
}
SET_BIT( pArea->act, AREA_CHANGED );
send_to_char( "Affect removed.\n\r", ch );
return;
}
if ( ( value = flag_value( type_flags, arg1 ) ) != NO_FLAG )
{
pObj->item_type = value;
SET_BIT( pArea->act, AREA_CHANGED );
send_to_char( "Type set.\n\r", ch );
pObj->value[0] = 0;
pObj->value[1] = 0;
pObj->value[2] = 0;
pObj->value[3] = 0;
pObj->value[4] = 0;
return;
}
if ( ( value = flag_value( extra_flags, arg1 ) ) != NO_FLAG )
{
xTOGGLE_BIT( pObj->extra_flags, value );
SET_BIT( pArea->act, AREA_CHANGED );
send_to_char( "Extra flag toggled.\n\r", ch );
return;
}
if ( ( value = flag_value( wear_flags, arg1 ) ) != NO_FLAG )
{
TOGGLE_BIT( pObj->wear_flags, value );
SET_BIT( pArea->act, AREA_CHANGED );
send_to_char( "Wear flag toggled.\n\r", ch );
return;
}
if ( !str_prefix( arg1, "name" ) )
{
if ( arg2[0] == '\0' )
{
send_to_char( "Syntax: name <string>\n\r", ch );
return;
}
free_string( pObj->name );
pObj->name = str_dup( arg2 );
SET_BIT( pArea->act, AREA_CHANGED );
send_to_char( "Name set.\n\r", ch );
return;
}
if ( !str_prefix( arg1, "short" ) )
{
if ( arg2[0] == '\0' )
{
send_to_char( "Syntax: short <string>\n\r", ch );
return;
}
free_string( pObj->short_descr );
pObj->short_descr = str_dup( arg2 );
pObj->short_descr[0] = LOWER( pObj->short_descr[0] );
SET_BIT( pArea->act, AREA_CHANGED );
send_to_char( "Short description set.\n\r", ch );
return;
}
if ( !str_prefix( arg1, "long" ) )
{
if ( arg2[0] == '\0' )
{
send_to_char( "Syntax: long <string>\n\r", ch );
return;
}
free_string( pObj->description );
pObj->description = str_dup( arg2 );
pObj->description[0] = UPPER( pObj->description[0] );
SET_BIT( pArea->act, AREA_CHANGED );
send_to_char( "Long description set.\n\r", ch );
return;
}
if ( !str_cmp( arg1, "value0" ) || !str_cmp( arg1, "v0" ) )
{
if ( set_value( ch, pObj, argument, 0 ) )
SET_BIT( pArea->act, AREA_CHANGED );
return;
}
if ( !str_cmp( arg1, "value1" ) || !str_cmp( arg1, "v1" ) )
{
if ( set_value( ch, pObj, argument, 1 ) )
SET_BIT( pArea->act, AREA_CHANGED );
return;
}
if ( !str_cmp( arg1, "value2" ) || !str_cmp( arg1, "v2" ) )
{
if ( set_value( ch, pObj, argument, 2 ) )
SET_BIT( pArea->act, AREA_CHANGED );
return;
}
if ( !str_cmp( arg1, "value3" ) || !str_cmp( arg1, "v3" ) )
{
if ( set_value( ch, pObj, argument, 3 ) )
SET_BIT( pArea->act, AREA_CHANGED );
return;
}
if ( !str_cmp( arg1, "value4" ) || !str_cmp( arg1, "v4" ) )
{
if ( set_value( ch, pObj, argument, 4 ) )
SET_BIT( pArea->act, AREA_CHANGED );
return;
}
if ( !str_prefix( arg1, "weight" ) )
{
if ( arg2[0] == '\0' || !is_number( arg2 ) )
{
send_to_char( "Syntax: weight <number>\n\r", ch );
return;
}
value = atoi( arg2 );
if ( value < 0 )
{
send_to_char( "You may not set negative weight.\n\r", ch );
return;
}
pObj->weight = value;
SET_BIT( pArea->act, AREA_CHANGED );
send_to_char( "Weight set.\n\r", ch );
return;
}
if ( !str_prefix( arg1, "create" ) )
{
oedit_create( ch, arg2 );
return;
}
if ( !str_prefix( arg1, "spec" ) )
{
if ( arg2[0] == '\0' )
{
send_to_char( "Syntax: spec <special function>\n\r", ch );
return;
}
if ( spec_obj_lookup( arg2 ) )
{
pObj->spec_fun = spec_obj_lookup( argument );
SET_BIT( pArea->act, AREA_CHANGED );
send_to_char( "Spec set.\n\r", ch );
return;
}
if ( !str_cmp( arg2, "none" ) )
{
pObj->spec_fun = NULL;
SET_BIT( pArea->act, AREA_CHANGED );
send_to_char( "Spec removed.\n\r", ch );
return;
}
}
if ( !str_prefix( arg1, "ed" ) )
{
if ( arg2[0] == '\0' )
{
send_to_char( "Syntax: ed add <keyword>\n\r", ch );
send_to_char( " ed delete <keyword>\n\r", ch );
send_to_char( " ed edit <keyword>\n\r", ch );
return;
}
argument = one_argument( argument, arg1 );
strcpy( arg2, argument );
if ( !str_cmp( arg1, "add" ) )
{
if ( arg2[0] == '\0' )
{
send_to_char( "Syntax: ed add <keyword>\n\r", ch );
return;
}
ed = new_extra_descr( );
ed->keyword = str_dup( arg2 );
ed->next = pObj->extra_descr;
pObj->extra_descr = ed;
string_append( ch, &ed->description );
SET_BIT( pArea->act, AREA_CHANGED );
return;
}
if ( !str_cmp( arg1, "edit" ) )
{
if ( arg2[0] == '\0' )
{
send_to_char( "Syntax: ed edit <keyword>\n\r", ch );
return;
}
for ( ed = pObj->extra_descr; ed; ed = ed->next )
{
if ( is_name( arg2, ed->keyword ) )
break;
}
if ( !ed )
{
send_to_char( "Extra description keyword not found.\n\r", ch );
return;
}
string_append( ch, &ed->description );
SET_BIT( pArea->act, AREA_CHANGED );
return;
}
if ( !str_cmp( arg1, "delete" ) )
{
EXTRA_DESCR_DATA *ped = NULL;
if ( arg2[0] == '\0' )
{
send_to_char( "Syntax: ed delete <keyword>\n\r", ch );
return;
}
for ( ed = pObj->extra_descr; ed; ed = ed->next )
{
if ( is_name( arg2, ed->keyword ) )
break;
ped = ed;
}
if ( !ed )
{
send_to_char( "Extra description keyword not found.\n\r", ch );
return;
}
if ( !ped )
pObj->extra_descr = ed->next;
else
ped->next = ed->next;
free_extra_descr( ed );
send_to_char( "Extra description deleted.\n\r", ch );
SET_BIT( pArea->act, AREA_CHANGED );
return;
}
}
interpret( ch, arg );
return;
}
bool medit_create( CHAR_DATA *ch, char *argument )
{
AREA_DATA *pArea;
MOB_INDEX_DATA *pMob;
int value;
int iHash;
value = atoi( argument );
if ( argument[0] == '\0' || value == 0 )
{
send_to_char( "Syntax: create <vnum>\n\r", ch );
return FALSE;
}
pArea = get_vnum_area( value );
if ( !pArea )
{
send_to_char( "That vnum is not assigned an area.\n\r", ch );
return FALSE;
}
if ( !is_builder( ch, pArea ) )
{
send_to_char( "Vnum in an area you cannot build in.\n\r", ch );
return FALSE;
}
if ( get_mob_index( value ) )
{
send_to_char( "Mobile vnum already exists.\n\r", ch );
return FALSE;
}
pMob = new_mob_index( );
pMob->vnum = value;
pMob->area = pArea;
if ( value > top_vnum_mob ) top_vnum_mob = value;
if ( value > pArea->hi_m_vnum ) pArea->hi_m_vnum = value;
pMob->act = new_xbv ( ACT_IS_NPC, -1 );
iHash = value % MAX_KEY_HASH;
pMob->next = mob_index_hash[iHash];
mob_index_hash[iHash] = pMob;
ch->desc->olc_editing = (void *) pMob;
SET_BIT( pArea->act, AREA_CHANGED );
send_to_char( "Mobile created.\n\r", ch );
return TRUE;
}
void do_mindex( CHAR_DATA *ch, char *argument )
{
MOB_INDEX_DATA *mob;
char buf [ MAX_STRING_LENGTH ];
char buf1 [ MAX_STRING_LENGTH ];
char arg [ MAX_INPUT_LENGTH ];
one_argument( argument, arg );
if ( arg[0] == '\0' )
{
send_to_char( "Mindex whom?\n\r", ch );
return;
}
buf1[0] = '\0';
if ( !( mob = get_mob_index( atoi( arg ) ) ) )
{
send_to_char( "Invalid mob index vnum.\n\r", ch );
return;
}
sprintf( buf, "{cArea: {x%s{c. |{x%d{c|{x\n\r",
mob->area ? mob->area->name : "(no area)",
mob->area ? mob->area->vnum : -1 );
strcat( buf1, buf );
sprintf( buf, "{cName:{x %s{c.{x\n\r",
mob->player_name );
strcat( buf1, buf );
sprintf( buf, "{cRace: {x%s{c.{x\n\r", race_table[mob->race].name );
strcat( buf1, buf );
sprintf( buf, "{cVnum: {x%d{c. Sex: {x%s{c.{x ",
mob->vnum,
mob->sex == SEX_MALE ? "male" :
mob->sex == SEX_FEMALE ? "female" : "neutral" );
strcat( buf1, buf );
sprintf( buf, "{cLevel: {x%d{c. Align: {x%d{c.{x\n\r",
mob->level, mob->alignment );
strcat( buf1, buf );
sprintf( buf, "{cAffected by: {x%s{c.{x\n\r",
act_xbv( affect_flags, mob->affected_by ) );
strcat( buf1, buf );
sprintf( buf, "{cAct: {x%s{c.{x\n\r",
act_xbv( act_flags, mob->act ) );
strcat( buf1, buf );
sprintf( buf, "{cShort description: {x%s{c.{x\n\r{cLong description: {x%s",
mob->short_descr,
mob->long_descr[0] != '\0' ? mob->long_descr
: "(none).\n\r" );
strcat( buf1, buf );
if ( mob->spec_fun != 0 )
{
sprintf( buf, "{cMobile has {x%s{c.{x\n\r",
spec_mob_string( mob->spec_fun ) );
strcat( buf1, buf );
}
sprintf( buf, "{cDescription:{x\n\r%s", mob->description );
strcat( buf1, buf );
if ( mob->pGame )
{
strcat( buf1, "\n\r" );
sprintf( buf, "{cGame fun: {x%s{c. Bankroll: {x%d{c.{x ",
game_string( mob->pGame->game_fun ),
mob->pGame->bankroll );
strcat( buf1, buf );
sprintf( buf, "{cMaxwait: {x%d{c. Cheat: {x%s{c.{x\n\r",
mob->pGame->max_wait,
mob->pGame->cheat ? "TRUE" : "FALSE" );
strcat( buf1, buf );
}
if ( mob->pShop )
{
SHOP_DATA *pShop;
int iTrade;
pShop = mob->pShop;
strcat( buf1, "\n\r" );
sprintf( buf, "{cShop data for {x%d{c.{x ",
pShop->keeper );
strcat( buf1, buf );
sprintf( buf, "{cProfit buy: {x%d%%{c. Profit sell: {x%d%%{c.{x ",
pShop->profit_buy, pShop->profit_sell );
strcat( buf1, buf );
sprintf( buf, "{cHours: {x%d{c to {x%d{c.{x\n\r",
pShop->open_hour, pShop->close_hour );
strcat( buf1, buf );
for ( iTrade = 0; iTrade < MAX_TRADE; iTrade++ )
{
if ( pShop->buy_type[iTrade] == 0 )
continue;
if ( iTrade == 0 )
{
strcat( buf1, "\n\r" );
strcat( buf1, "{o{c{B| Number | Trade Type {x\n\r" );
strcat( buf1, "{o{c{B+--------+------------------{x\n\r" );
}
sprintf( buf, "{o{c{B| %-4d | %-16.16s {x\n\r",
iTrade,
flag_string( type_flags, pShop->buy_type[iTrade] ) );
strcat( buf1, buf );
}
}
send_to_char( buf1, ch );
return;
}
void medit( CHAR_DATA *ch, char *argument )
{
AREA_DATA *pArea;
MOB_INDEX_DATA *pMob;
char arg [ MAX_STRING_LENGTH ];
char arg1 [ MAX_STRING_LENGTH ];
char arg2 [ MAX_STRING_LENGTH ];
char buf [ MAX_STRING_LENGTH ];
int value;
strcpy( arg, argument );
smash_tilde( argument );
argument = one_argument( argument, arg1 );
strcpy( arg2, argument );
value = atoi( arg2 );
pMob = ( MOB_INDEX_DATA * ) ch->desc->olc_editing;
pArea = pMob->area;
if ( !str_prefix( arg1, "show" ) )
{
sprintf( buf, "%d %s", pMob->vnum, arg2 );
do_mindex( ch, buf );
return;
}
if ( !str_prefix( arg1, "version" ) )
{
show_version( ch, "" );
return;
}
if ( !str_prefix( arg1, "done" ) )
{
edit_done( ch, "" );
return;
}
if ( !is_builder( ch, pArea ) )
{
send_to_char( "Insufficient security to modify mobile.\n\r", ch );
edit_done( ch, "" );
return;
}
if ( !str_prefix( arg1, "game" ) )
{
argument = one_argument( argument, arg1 );
strcpy( arg2, argument );
if ( arg1[0] == '\0' )
{
send_to_char( "Syntax: game fun <game function>\n\r", ch );
send_to_char( " game bankroll <num>\n\r", ch );
send_to_char( " game maxwait <pulse>\n\r", ch );
send_to_char( " game cheat <bool>\n\r", ch );
send_to_char( " game delete\n\r", ch );
return;
}
if ( !str_cmp( arg1, "fun" ) )
{
argument = one_argument( argument, arg1 );
strcpy( arg2, argument );
if ( arg1[0] == '\0' )
{
send_to_char( "Syntax: game fun <game function>\n\r", ch );
return;
}
if ( !pMob->pGame )
{
pMob->pGame = new_game( );
pMob->pGame->croupier = pMob->vnum;
if ( game_last )
game_last->next = pMob->pGame;
else
game_last = pMob->pGame;
}
if ( game_lookup( arg1 ) )
{
pMob->pGame->game_fun = game_lookup( arg1 );
SET_BIT( pArea->act, AREA_CHANGED );
send_to_char( "Game set.\n\r", ch );
return;
}
send_to_char( "No such game function.\n\r", ch );
return;
}
if ( !str_cmp( arg1, "bankroll" ) )
{
argument = one_argument( argument, arg1 );
strcpy( arg2, argument );
if ( arg1[0] == '\0' || !is_number( arg1 ) )
{
send_to_char( "Syntax: game bankroll <num>\n\r", ch );
return;
}
if ( !pMob->pGame )
{
pMob->pGame = new_game( );
pMob->pGame->croupier = pMob->vnum;
if ( game_last )
game_last->next = pMob->pGame;
else
game_last = pMob->pGame;
}
pMob->pGame->bankroll = atoi( arg1 );
SET_BIT( pArea->act, AREA_CHANGED );
send_to_char( "Game bankroll set.\n\r", ch );
return;
}
if ( !str_cmp( arg1, "maxwait" ) )
{
argument = one_argument( argument, arg1 );
strcpy( arg2, argument );
if ( arg1[0] == '\0' || !is_number( arg1 ) )
{
send_to_char( "Syntax: game maxwait <pulse>\n\r", ch );
return;
}
if ( !pMob->pGame )
{
pMob->pGame = new_game( );
pMob->pGame->croupier = pMob->vnum;
if ( game_last )
game_last->next = pMob->pGame;
else
game_last = pMob->pGame;
}
pMob->pGame->max_wait = atoi( arg1 );
SET_BIT( pArea->act, AREA_CHANGED );
send_to_char( "Game maxwait pulses set.\n\r", ch );
return;
}
if ( !str_cmp( arg1, "cheat" ) )
{
argument = one_argument( argument, arg1 );
strcpy( arg2, argument );
if ( arg1[0] == '\0' || !is_number( arg1 ) )
{
send_to_char( "Syntax: game cheat <bool>\n\r", ch );
return;
}
if ( !pMob->pGame )
{
pMob->pGame = new_game( );
pMob->pGame->croupier = pMob->vnum;
if ( game_last )
game_last->next = pMob->pGame;
else
game_last = pMob->pGame;
}
pMob->pGame->cheat = atoi( arg1 );
SET_BIT( pArea->act, AREA_CHANGED );
send_to_char( "Game cheat set.\n\r", ch );
return;
}
if ( !str_cmp( arg1, "delete" ) )
{
if ( !pMob->pGame )
{
send_to_char( "Non-existant game.\n\r", ch );
return;
}
free_game( pMob->pGame );
pMob->pGame = NULL;
SET_BIT( pArea->act, AREA_CHANGED );
send_to_char( "Game deleted.\n\r", ch );
return;
}
send_to_char( "Syntax: game fun <game function>\n\r", ch );
send_to_char( " game bankroll <num>\n\r", ch );
send_to_char( " game maxwait <pulse>\n\r", ch );
send_to_char( " game cheat <bool>\n\r", ch );
send_to_char( " game delete\n\r", ch );
return;
}
if ( !str_prefix( arg1, "shop" ) )
{
argument = one_argument( argument, arg1 );
strcpy( arg2, argument );
if ( arg1[0] == '\0' )
{
send_to_char( "Syntax: shop hours <opening> <closing>\n\r", ch );
send_to_char( " shop profit <buying> <selling>\n\r", ch );
send_to_char( " shop type <0-4> <item type>\n\r", ch );
send_to_char( " shop delete\n\r", ch );
return;
}
if ( !str_cmp( arg1, "hours" ) )
{
argument = one_argument( argument, arg1 );
strcpy( arg2, argument );
if ( arg1[0] == '\0' || !is_number( arg1 )
|| arg2[0] == '\0' || !is_number( arg2 ) )
{
send_to_char( "Syntax: shop hours <opening> <closing>\n\r",
ch );
return;
}
if ( !pMob->pShop )
{
pMob->pShop = new_shop( );
pMob->pShop->keeper = pMob->vnum;
shop_last->next = pMob->pShop;
}
pMob->pShop->open_hour = atoi( arg1 );
pMob->pShop->close_hour = atoi( arg2 );
SET_BIT( pArea->act, AREA_CHANGED );
send_to_char( "Shop hours set.\n\r", ch );
return;
}
if ( !str_cmp( arg1, "profit" ) )
{
argument = one_argument( argument, arg1 );
strcpy( arg2, argument );
if ( arg1[0] == '\0' || !is_number( arg1 )
|| arg2[0] == '\0' || !is_number( arg2 ) )
{
send_to_char( "Syntax: shop profit <buying> <selling>\n\r",
ch );
return;
}
if ( !pMob->pShop )
{
pMob->pShop = new_shop( );
pMob->pShop->keeper = pMob->vnum;
shop_last->next = pMob->pShop;
}
pMob->pShop->profit_buy = atoi( arg1 );
pMob->pShop->profit_sell = atoi( arg2 );
SET_BIT( pArea->act, AREA_CHANGED );
send_to_char( "Shop profit set.\n\r", ch );
return;
}
if ( !str_cmp( arg1, "type" ) )
{
argument = one_argument( argument, arg1 );
strcpy( arg2, argument );
if ( arg1[0] == '\0' || !is_number( arg1 )
|| arg2[0] == '\0' )
{
send_to_char( "Syntax: shop type <0-4> <item type>\n\r", ch );
return;
}
if ( atoi( arg1 ) >= MAX_TRADE )
{
sprintf( buf, "May sell %d items max.\n\r", MAX_TRADE );
send_to_char( buf, ch );
return;
}
if ( ( value = flag_value( type_flags, argument ) ) == NO_FLAG )
{
send_to_char( "That type of item is not known.\n\r", ch );
return;
}
if ( !pMob->pShop )
{
pMob->pShop = new_shop( );
pMob->pShop->keeper = pMob->vnum;
shop_last->next = pMob->pShop;
}
pMob->pShop->buy_type[atoi( arg1 )] = value;
SET_BIT( pArea->act, AREA_CHANGED );
send_to_char( "Shop type set.\n\r", ch );
return;
}
if ( !str_cmp( arg1, "delete" ) )
{
if ( !pMob->pShop )
{
send_to_char( "Cannot delete a shop that is non-existant.\n\r",
ch );
return;
}
free_shop( pMob->pShop );
pMob->pShop = NULL;
SET_BIT( pArea->act, AREA_CHANGED );
send_to_char( "Shop deleted.\n\r", ch );
return;
}
send_to_char( "Syntax: shop hours <opening> <closing>\n\r", ch );
send_to_char( " shop profit <buying> <selling>\n\r", ch );
send_to_char( " shop type <0-4> <item type>\n\r", ch );
send_to_char( " shop delete\n\r", ch );
return;
}
if ( !str_prefix( arg1, "name" ) )
{
if ( arg2[0] == '\0' )
{
send_to_char( "Syntax: name <string>\n\r", ch );
return;
}
free_string( pMob->player_name );
pMob->player_name = str_dup( arg2 );
SET_BIT( pArea->act, AREA_CHANGED );
send_to_char( "Name set.\n\r", ch );
return;
}
if ( !str_prefix( arg1, "short" ) )
{
if ( arg2[0] == '\0' )
{
send_to_char( "Syntax: short <string>\n\r", ch );
return;
}
free_string( pMob->short_descr );
pMob->short_descr = str_dup( arg2 );
SET_BIT( pArea->act, AREA_CHANGED );
send_to_char( "Short description set.\n\r", ch );
return;
}
if ( !str_prefix( arg1, "long" ) )
{
if ( arg2[0] == '\0' )
{
send_to_char( "Syntax: long <string>\n\r", ch );
return;
}
free_string( pMob->long_descr );
strcat( arg2, "\n\r" );
pMob->long_descr = str_dup( arg2 );
pMob->long_descr[0] = UPPER( pMob->long_descr[0] );
SET_BIT( pArea->act, AREA_CHANGED );
send_to_char( "Long description set.\n\r", ch );
return;
}
if ( !str_prefix( arg1, "description" ) )
{
if ( arg2[0] == '\0' )
{
string_append( ch, &pMob->description );
SET_BIT( pArea->act, AREA_CHANGED );
return;
}
send_to_char( "Syntax: desc - line edit\n\r", ch );
return;
}
if ( ( value = flag_value( sex_flags, arg ) ) != NO_FLAG )
{
pMob->sex = value;
SET_BIT( pArea->act, AREA_CHANGED );
send_to_char( "Sex set.\n\r", ch );
return;
}
if ( ( value = race_full_lookup( arg ) ) != NO_FLAG )
{
pMob->race = value;
SET_BIT( pArea->act, AREA_CHANGED );
send_to_char( "Race set.\n\r", ch );
return;
}
if ( ( value = flag_value( act_flags, arg ) ) != NO_FLAG )
{
xTOGGLE_BIT( pMob->act, value );
SET_BIT( pArea->act, AREA_CHANGED );
send_to_char( "Act flag toggled.\n\r", ch );
return;
}
if ( ( value = flag_value( affect_flags, arg ) ) != NO_FLAG && value >= 0 )
{
xTOGGLE_BIT( pMob->affected_by, value );
SET_BIT( pArea->act, AREA_CHANGED );
send_to_char( "Affect flag toggled.\n\r", ch );
return;
}
if ( !str_prefix( arg1, "level" ) )
{
if ( arg2[0] == '\0' || !is_number( arg2 ) )
{
send_to_char( "Syntax: level <number>\n\r", ch );
return;
}
pMob->level = atoi( arg2 );
SET_BIT( pArea->act, AREA_CHANGED );
send_to_char( "Level set.\n\r", ch );
return;
}
if ( !str_prefix( arg1, "alignment" ) )
{
if ( arg2[0] == '\0' || !is_number( arg2 ) )
{
send_to_char( "Syntax: alignment <number>\n\r", ch );
return;
}
pMob->alignment = atoi( arg2 );
SET_BIT( pArea->act, AREA_CHANGED );
send_to_char( "Alignment set.\n\r", ch );
return;
}
if ( !str_prefix( arg1, "spec" ) )
{
if ( arg2[0] == '\0' )
{
send_to_char( "Syntax: spec <special function>\n\r", ch );
return;
}
if ( spec_mob_lookup( arg2 ) )
{
pMob->spec_fun = spec_mob_lookup( argument );
SET_BIT( pArea->act, AREA_CHANGED );
send_to_char( "Spec set.\n\r", ch );
return;
}
if ( !str_cmp( arg2, "none" ) )
{
pMob->spec_fun = NULL;
SET_BIT( pArea->act, AREA_CHANGED );
send_to_char( "Spec removed.\n\r", ch );
return;
}
}
if ( !str_prefix( arg1, "create" ) )
{
medit_create( ch, arg2 );
return;
}
interpret( ch, arg );
return;
}
bool mpedit_create( CHAR_DATA *ch, char *argument )
{
AREA_DATA *pArea;
MPROG_CODE *prog;
int value;
value = atoi( argument );
if ( argument[0] == '\0' || value == 0 )
{
send_to_char( "Syntax: create <vnum>\n\r", ch );
return FALSE;
}
pArea = get_vnum_area( value );
if ( !pArea )
{
send_to_char( "That vnum is not assigned an area.\n\r", ch );
return FALSE;
}
if ( !is_builder( ch, pArea ) )
{
send_to_char( "Vnum in an area you cannot build in.\n\r", ch );
return FALSE;
}
if ( get_mprog_index( value ) )
{
send_to_char( "Mobprogram vnum already exists.\n\r", ch );
return FALSE;
}
prog = (MPROG_CODE *) alloc_perm( sizeof( *prog ) );
prog->vnum = value;
prog->area = pArea;
prog->code = NULL;
if ( !mprog_list )
mprog_list = prog;
else
{
prog->next = mprog_list;
mprog_list = prog;
}
if ( !pArea->low_mp_vnum )
pArea->low_mp_vnum = value;
if ( value > pArea->hi_mp_vnum )
pArea->hi_mp_vnum = value;
ch->desc->olc_editing = (void *)prog;
SET_BIT( pArea->act, AREA_CHANGED );
send_to_char( "Mobprogram created.\n\r", ch );
return TRUE;
}
void do_mpindex( CHAR_DATA *ch, char *argument )
{
MPROG_CODE *prog;
char buf [ MAX_STRING_LENGTH ];
char buf1 [ MAX_STRING_LENGTH ];
char arg [ MAX_INPUT_LENGTH ];
one_argument( argument, arg );
if ( arg[0] == '\0' )
{
send_to_char( "MPindex what?\n\r", ch );
return;
}
buf1[0] = '\0';
if ( !( prog = get_mprog_index( atoi( arg ) ) ) )
{
send_to_char( "Invalid mobprog index vnum.\n\r", ch );
return;
}
sprintf( buf, "{cArea: {x%s{c. |{x%d{c|{x\n\r",
prog->area ? prog->area->name : "(no area)",
prog->area ? prog->area->vnum : -1 );
strcat( buf1, buf );
sprintf( buf, "{cVnum: {x%d{c.{x\n\r",
prog->vnum );
strcat( buf1, buf );
sprintf( buf, "{cCode:{x\n\r%s", prog->code );
strcat( buf1, buf );
send_to_char( buf1, ch );
return;
}
void mpedit( CHAR_DATA *ch, char *argument )
{
AREA_DATA *pArea;
MPROG_CODE *prog;
char arg [ MAX_STRING_LENGTH ];
char arg1 [ MAX_STRING_LENGTH ];
char arg2 [ MAX_STRING_LENGTH ];
char buf [ MAX_STRING_LENGTH ];
strcpy( arg, argument );
smash_tilde( argument );
argument = one_argument( argument, arg1 );
strcpy( arg2, argument );
prog = (MPROG_CODE *) ch->desc->olc_editing;
pArea = prog->area;
if ( !str_prefix( arg1, "show" ) )
{
sprintf( buf, "%d", prog->vnum );
do_mpindex( ch, buf );
return;
}
if ( !str_prefix( arg1, "version" ) )
{
show_version( ch, "" );
return;
}
if ( !str_prefix( arg1, "done" ) )
{
edit_done( ch, "" );
return;
}
if ( !is_builder( ch, pArea ) )
{
send_to_char( "Insufficient security to modify mobprogram.\n\r", ch );
edit_done( ch, "" );
return;
}
if ( !str_prefix( arg1, "code" ) )
{
string_append( ch, &prog->code );
SET_BIT( pArea->act, AREA_CHANGED );
return;
}
if ( !str_prefix( arg1, "create" ) )
{
mpedit_create( ch, arg2 );
return;
}
interpret( ch, arg );
return;
}
char *olc_ed_name( CHAR_DATA *ch )
{
static char buf [10];
buf[0] = '\0';
if ( !ch->desc )
return &buf[0];
switch ( ch->desc->connected )
{
case CON_AEDITOR:
sprintf( buf, "AEditor" );
break;
case CON_REDITOR:
sprintf( buf, "REditor" );
break;
case CON_OEDITOR:
sprintf( buf, "OEditor" );
break;
case CON_MEDITOR:
sprintf( buf, "MEditor" );
break;
case CON_MPEDITOR:
sprintf( buf, "MPEditor" );
break;
default:
sprintf( buf, " " );
break;
}
return buf;
}
char *olc_ed_vnum( CHAR_DATA *ch )
{
AREA_DATA *pArea;
ROOM_INDEX_DATA *pRoom;
OBJ_INDEX_DATA *pObj;
MOB_INDEX_DATA *pMob;
MPROG_CODE *pMpc;
static char buf [10];
buf[0] = '\0';
if ( !ch->desc )
return &buf[0];
switch ( ch->desc->connected )
{
case CON_AEDITOR:
pArea = (AREA_DATA *) ch->desc->olc_editing;
sprintf( buf, "%d", pArea ? pArea->vnum : 0 );
break;
case CON_REDITOR:
pRoom = ch->in_room;
sprintf( buf, "%d", pRoom ? pRoom->vnum : 0 );
break;
case CON_OEDITOR:
pObj = (OBJ_INDEX_DATA *) ch->desc->olc_editing;
sprintf( buf, "%d", pObj ? pObj->vnum : 0 );
break;
case CON_MEDITOR:
pMob = (MOB_INDEX_DATA *) ch->desc->olc_editing;
sprintf( buf, "%d", pMob ? pMob->vnum : 0 );
break;
case CON_MPEDITOR:
pMpc = (MPROG_CODE *) ch->desc->olc_editing;
sprintf( buf, "%d", pMpc ? pMpc->vnum : 0 );
break;
default:
sprintf( buf, " " );
break;
}
return buf;
}
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;
}
void do_aedit( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *rch;
AREA_DATA *pArea;
int value;
rch = get_char( ch );
if ( !authorized( rch, "aedit" ) )
return;
pArea = ch->in_room->area;
if ( is_number( argument ) )
{
value = atoi( argument );
if ( !( pArea = get_area_data( value ) ) )
{
send_to_char( "That area vnum does not exist.\n\r", ch );
return;
}
}
else
{
if ( !str_cmp( argument, "reset" ) )
{
reset_area( pArea );
send_to_char( "Area reset.\n\r", ch );
return;
}
else
{
if ( !str_cmp( argument, "create" ) )
{
if ( aedit_create( ch, "" ) )
{
}
else
return;
}
}
}
ch->desc->olc_editing = (void *) pArea;
ch->desc->connected = CON_AEDITOR;
return;
}
void do_redit( CHAR_DATA* ch, char *argument )
{
CHAR_DATA *rch;
ROOM_INDEX_DATA *pRoom;
int value;
char arg1 [MAX_STRING_LENGTH];
rch = get_char( ch );
if ( !authorized( rch, "redit" ) )
return;
argument = one_argument( argument, arg1 );
pRoom = ch->in_room;
if ( is_number( arg1 ) )
{
value = atoi( arg1 );
if ( !( pRoom = get_room_index( value ) ) )
{
send_to_char( "That vnum does not exist.\n\r", ch );
return;
}
}
else
{
if ( !str_cmp( arg1, "reset" ) )
{
reset_room( pRoom );
send_to_char( "Room reset.\n\r", ch );
return;
}
else
if ( !str_cmp( arg1, "create" ) )
{
if ( redit_create( ch, argument ) )
{
char_from_room( ch );
char_to_room( ch, pRoom );
}
else
return;
}
}
ch->desc->olc_editing = (void *) pRoom;
ch->desc->connected = CON_REDITOR;
return;
}
void do_oedit( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *rch;
OBJ_INDEX_DATA *pObj;
char arg1 [MAX_STRING_LENGTH];
rch = get_char( ch );
if ( !authorized( rch, "oedit" ) )
return;
argument = one_argument( argument, arg1 );
if ( is_number( arg1 ) )
{
if ( !( pObj = get_obj_index( atoi( arg1 ) ) ) )
{
send_to_char( "That vnum does not exist.\n\r", ch );
return;
}
ch->desc->olc_editing = (void *) pObj;
ch->desc->connected = CON_OEDITOR;
return;
}
else
{
if ( !str_cmp( arg1, "create" ) )
{
if ( oedit_create( ch, argument ) )
ch->desc->connected = CON_OEDITOR;
return;
}
}
send_to_char( "Syntax: oedit <vnum>.\n\r", ch );
return;
}
void do_medit( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *rch;
MOB_INDEX_DATA *pMob;
char arg1 [MAX_STRING_LENGTH];
rch = get_char( ch );
if ( !authorized( rch, "medit" ) )
return;
argument = one_argument( argument, arg1 );
if ( is_number( arg1 ) )
{
if ( !( pMob = get_mob_index( atoi( arg1 ) ) ) )
{
send_to_char( "That vnum does not exist.\n\r", ch );
return;
}
ch->desc->olc_editing = (void *) pMob;
ch->desc->connected = CON_MEDITOR;
return;
}
else
{
if ( !str_cmp( arg1, "create" ) )
{
if ( medit_create( ch, argument ) )
ch->desc->connected = CON_MEDITOR;
return;
}
}
send_to_char( "Syntax: medit <vnum>.\n\r", ch );
return;
}
void do_mpedit( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *rch;
MPROG_CODE *prog;
char arg1 [MAX_STRING_LENGTH];
rch = get_char( ch );
if ( !authorized( rch, "mpedit" ) )
return;
argument = one_argument( argument, arg1 );
if ( is_number( arg1 ) )
{
if ( !( prog = get_mprog_index( atoi( arg1 ) ) ) )
{
send_to_char( "That vnum does not exist.\n\r", ch );
return;
}
ch->desc->olc_editing = (void *)prog;
ch->desc->connected = CON_MPEDITOR;
return;
}
else
{
if ( !str_cmp( arg1, "create" ) )
{
if ( mpedit_create( ch, argument ) )
ch->desc->connected = CON_MPEDITOR;
return;
}
}
send_to_char( "Syntax: mpedit <vnum>.\n\r", ch );
return;
}
void display_resets( CHAR_DATA *ch )
{
ROOM_INDEX_DATA *pRoom;
MOB_INDEX_DATA *pMob = NULL;
RESET_DATA *pReset;
char final [MAX_STRING_LENGTH];
char buf [MAX_STRING_LENGTH];
int iReset = 0;
if ( ch->desc->connected != CON_REDITOR
|| !( pRoom = (ROOM_INDEX_DATA *) ch->desc->olc_editing ) )
pRoom = ch->in_room;
final[0] = '\0';
send_to_char( "{o{c----------------------------------------------------------------------------{x\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;
final[0] = '\0';
sprintf( final, "{o{c%2d: {x", ++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->rs_vnum ) ) )
{
sprintf( buf, "Load mobile - bad mob %d.\n\r", pReset->rs_vnum );
strcat( final, buf );
continue;
}
pMob = pMobIndex;
sprintf( buf, "{o{rM %5d %5d %3d * %s{x\n\r",
pReset->rs_vnum,
pReset->loc,
pReset->percent,
pMob->short_descr );
strcat( final, buf );
/* check for pet shop */
{
ROOM_INDEX_DATA *pRoomIndexPrev;
pRoomIndexPrev = get_room_index( pRoom->vnum - 1 );
if ( pRoomIndexPrev
&& IS_SET( pRoomIndexPrev->orig_room_flags, ROOM_PET_SHOP ) )
final[14] = 'P';
}
break;
case 'O':
if ( !( pObjIndex = get_obj_index( pReset->rs_vnum ) ) )
{
sprintf( buf, "Load object - bad object %d.\n\r",
pReset->rs_vnum );
strcat( final, buf );
continue;
}
pObj = pObjIndex;
sprintf( buf, "{o{gO %5d %5d %3d * %s{x\n\r",
pReset->rs_vnum,
pReset->loc,
pReset->percent,
capitalize( pObj->short_descr ) );
strcat( final, buf );
break;
case 'P':
if ( !( pObjIndex = get_obj_index( pReset->rs_vnum ) ) )
{
sprintf( buf, "Put object - bad object %d.\n\r",
pReset->rs_vnum );
strcat( final, buf );
continue;
}
pObj = pObjIndex;
if ( !( pObjToIndex = get_obj_index( pReset->loc ) ) )
{
sprintf( buf, "Put object - bad to object %d.\n\r",
pReset->loc );
strcat( final, buf );
continue;
}
sprintf( buf,"{gP %5d %5d %3d * %s inside %s{x\n\r",
pReset->rs_vnum,
pReset->loc,
pReset->percent,
capitalize( get_obj_index( pReset->rs_vnum )->short_descr ),
pObjToIndex->short_descr );
strcat( final, buf );
break;
case 'E':
if ( !( pObjIndex = get_obj_index( pReset->rs_vnum ) ) )
{
sprintf( buf, "Equip object - bad object %d.\n\r",
pReset->rs_vnum );
strcat( final, buf );
continue;
}
pObj = pObjIndex;
if ( !pMob )
{
sprintf( buf, "Equip object - no previous mobile.\n\r" );
strcat( final, buf );
break;
}
sprintf( buf, "{rE %5d %5d %3d * %s %s{x\n\r",
pReset->rs_vnum,
pReset->loc,
pReset->percent,
capitalize( get_obj_index( pReset->rs_vnum )->short_descr ),
flag_string( wear_loc_strings, pReset->loc ) );
strcat( final, buf );
break;
case 'R':
sprintf( buf, "{o{yR %5d %5d %3d * Randomize{x\n\r",
pReset->rs_vnum,
pReset->loc,
pReset->percent );
strcat( final, buf );
break;
}
send_to_char( final, ch );
}
return;
}
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;
}
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;
}
void do_resets( CHAR_DATA * ch, char *argument )
{
ROOM_INDEX_DATA *pRoom;
AREA_DATA *pArea;
RESET_DATA *pReset;
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 ];
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 );
pReset = NULL;
pRoom = ch->in_room;
pArea = pRoom->area;
if ( !is_builder( ch, pArea ) )
{
send_to_char( "Invalid security for editing this area.\n\r", ch );
return;
}
if ( arg1[0] == '\0' )
{
if ( pRoom->reset_first )
{
send_to_char( "{c{oResets: M = mobile, R = room, ", ch );
send_to_char( "O = object, P = pet, S = shopkeeper{x\n\r", ch );
display_resets( ch );
}
else
send_to_char( "There are no resets in this room.\n\r", ch );
return;
}
if ( !is_number( arg1 ) )
{
send_to_char( "Syntax: reset <number> obj <vnum> <wearloc> \n\r", ch );
send_to_char( "or: reset <number> obj <vnum> room \n\r", ch );
send_to_char( "or: reset <number> obj <vnum> in <vnum>\n\r", ch );
send_to_char( "or: reset <number> mob <vnum> \n\r", ch );
send_to_char( "or: reset <number> mob <vnum> <max num> \n\r", ch );
send_to_char( "or: reset <number> delete \n\r", ch );
return;
}
if ( !str_cmp( arg2, "delete" ) )
{
int insert_loc = atoi( arg1 );
if ( !pRoom->reset_first )
{
send_to_char( "There are 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
{
RESET_DATA *prev = NULL;
int iReset = 0;
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( pArea->act, AREA_CHANGED );
send_to_char( "Reset deleted.\n\r", ch );
return;
}
if ( ( !str_cmp( arg2, "mob" ) || !str_cmp( arg2, "obj" ) )
&& is_number( arg3 ) )
{
if ( !str_cmp( arg2, "mob" ) )
{
pReset = new_reset_data( );
pReset->command = 'M';
pReset->rs_vnum = atoi( arg3 );
pReset->loc = is_number( arg4 ) ? atoi( arg4 ) : 1;
}
else
if ( !str_cmp( arg2, "obj" ) )
{
pReset = new_reset_data( );
pReset->rs_vnum = atoi( arg3 );
if ( !str_prefix( arg4, "inside" ) )
{
pReset->command = 'P';
pReset->loc = is_number( arg5 ) ? atoi( arg5 ) : 1;
}
else
if ( !str_cmp( arg4, "room" ) )
{
pReset->command = 'O';
pReset->rs_vnum = atoi( arg3 );
}
else
{
if ( flag_value( wear_loc_flags, arg4 ) == NO_FLAG )
{
send_to_char( "Resets: '? wear-loc'\n\r", ch );
return;
}
pReset->loc = flag_value( wear_loc_flags, arg4 );
pReset->command = 'E';
}
}
add_reset( pRoom, pReset, atoi( arg1 ) );
SET_BIT( pArea->act, AREA_CHANGED );
send_to_char( "Reset added.\n\r", ch );
}
return;
}
void do_alist( CHAR_DATA * ch, char *argument )
{
AREA_DATA *pArea;
char buf [MAX_STRING_LENGTH];
char buf1 [MAX_STRING_LENGTH*2];
buf1[0] = '\0';
sprintf( buf, "{c[%3s] [%-27s] [%-5s/%5s] [%-10s] %3s [%-10s]{x\n\r",
"Num", "Area Name", "lvnum", "uvnum", "Filename", "Sec", "Builders" );
strcat( buf1, buf );
for ( pArea = area_first; pArea; pArea = pArea->next )
{
sprintf( buf, "{c[%3d] {g%-7.7s %-21.21s {c[{x%5d{c/{x%-5d{c] {c%-12.12s [{x%1.1d{c] [{x%-10.10s{c]{x\n\r",
pArea->vnum,
pArea->author,
pArea->name,
pArea->lvnum,
pArea->uvnum,
pArea->filename,
pArea->security,
pArea->builders );
strcat( buf1, buf );
}
send_to_char( buf1, ch );
return;
}