/*___________________________________________________________________________*
)()( DalekenMUD 1.12 (C) 2000 )()(
`][' by Martin Thomson, Lee Brooks, `]['
|| Ken Herbert and David Jacques ||
|| ----------------------------------------------------------------- ||
|| Envy Diku Mud improvements copyright (C) 1994 by Michael Quan, ||
|| David Love, Guilherme 'Willie' Arnold, and Mitchell Tse. ||
|| Merc Diku Mud improvments copyright (C) 1992, 1993 by Michael ||
|| Chastain, Michael Quan, and Mitchell Tse. ||
|| Original Diku Mud copyright (C) 1990, 1991 ||
|| by Sebastian Hammer, Michael Seifert, Hans Henrik St{rfeldt, ||
|| Tom Madsen, and Katja Nyboe. ||
|| ----------------------------------------------------------------- ||
|| Any use of this software must follow the licenses of the ||
|| creators. 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. ||
|| ----------------------------------------------------------------- ||
|| act_wiz.c ||
|| Immortal commands. ||
*_/<>\_________________________________________________________________/<>\_*/
#if defined( WIN32 )
# include <process.h>
#else
# include <sys/stat.h>
# include <unistd.h>
# include <fcntl.h>
# include <errno.h>
#endif
#include "mud.h"
#include "olc.h"
#include "event.h"
int battle_min, battle_max;
BAN_DATA *ban_list;
/* Special atoi thingy, allows functions to be used in place of
* integers, destructive to the string so be careful not to reuse the
* string.
*/
int atoi_functions( char *str )
{
char *p;
char *arg;
int i;
if( is_number( str ) )
return atoi( str );
p = strchr( str, '(' );
if( !p ) /* not a function */
{
return atoi_special( str );
}
*p++ = '\0';
arg = p;
p = strchr( p, ')' );
if( !p )
return -1;
*p = '\0';
while( isspace( *str ) )
str++;
if( !str_cmp( str, "strlen" ) )
return strlen( arg );
if( !str_cmp( str, "speclookup" ) )
return spec_lookup( arg );
if( !str_cmp( str, "slookup" ) )
return skill_lookup( arg );
if( !str_cmp( str, "race" ) )
return race_lookup( arg );
for( i = 0; bit_table[i].structure; ++i )
{
if( !str_cmp( str, bit_table[i].command ) )
return flag_value( NULL, bit_table[i].structure, arg );
}
if( !str_cmp( str, "day" ) )
{
for( i = 0; day_name[i] != NULL; ++i )
{
if( !str_cmp( day_name[i], arg ) )
return i;
}
}
if( !str_cmp( str, "month" ) )
{
for( i = 0; month_name[i] != NULL; ++i )
{
if( !str_cmp( month_name[i], arg ) )
return i;
}
}
return -1;
}
/*
* Conversion of Immortal powers to Immortal skills done by Thelonius
*/
void do_wizhelp( CHAR_DATA *ch, const char *argument )
{
CHAR_DATA *rch;
char buf[MAX_STRING_LENGTH];
char buf1[MAX_STRING_LENGTH];
int cmd;
int col;
rch = get_char( ch );
if( !authorized( rch, "wizhelp" ) )
return;
buf1[0] = '\0';
col = 0;
for( cmd = 0; cmd_table[cmd].name[0] != '\0'; cmd++ )
{
if( cmd_table[cmd].level < LEVEL_HERO
|| str_infix( cmd_table[cmd].name, rch->pcdata->immskll ) )
continue;
sprintf( buf, "%-11s", cmd_table[cmd].name );
strcat( buf1, buf );
if( ++col % 7 == 0 )
strcat( buf1, "\n\r" );
}
if( col % 7 != 0 )
strcat( buf1, "\n\r" );
send_to_char( buf1, ch );
return;
}
void do_immname( CHAR_DATA *ch, const char *argument )
{
CHAR_DATA *rch, *victim;
char arg[MAX_INPUT_LENGTH];
rch = get_char( ch );
if( !authorized( rch, "immname" ) )
return;
argument = one_argument( argument, arg );
if( ( victim = get_char_world( ch, arg ) )
&& ( ( !IS_NPC( victim ) && get_trust( victim ) < get_trust( ch ) )
|| victim == rch ) )
{
if( colour_strlen( argument ) > 12 )
{
send_to_char( "That might be a little too long.\n\r", ch );
return;
}
if( !str_cmp( argument, "clear" )
|| !str_cmp( argument, "reset" )
|| !str_cmp( argument, "none" ) )
{
free_string( victim->pcdata->immname );
victim->pcdata->immname = &str_empty[0];
send_to_char( "Immname cleared.\n\r", ch );
return;
}
else if( argument[0] != '\0' )
{
free_string( victim->pcdata->immname );
victim->pcdata->immname = str_dup( argument );
}
act( "$O immname is set to:", ch, NULL, victim, TO_CHAR );
charprintf( ch, " %s.\n\r",
( victim->pcdata->immname
&& victim->pcdata->immname[0] != '\0' )
? victim->pcdata->immname : "Nothing" );
}
else
{
send_to_char( "That person can't get an immname.\n\r", ch );
}
return;
}
void do_bamfin( CHAR_DATA *ch, const char *argument )
{
CHAR_DATA *rch;
char mesg[MAX_INPUT_LENGTH];
const char *punct;
rch = get_char( ch );
if( IS_NPC( ch ) || !authorized( rch, "bamfin" ) )
return;
if( longstring( ch, argument ) )
return;
if( !str_cmp( argument, "clear" )
|| !str_cmp( argument, "reset" )
|| !str_cmp( argument, "none" ) )
{
free_string( ch->pcdata->bamfin );
ch->pcdata->bamfin = &str_empty[0];
}
else if( argument[0] != '\0' )
{
free_string( ch->pcdata->bamfin );
ch->pcdata->bamfin = str_dup( argument );
}
if( ch->pcdata && ch->pcdata->bamfin[0] != '\0' )
strcpy( mesg, ch->pcdata->bamfin );
else
strcpy( mesg, "appears in a swirling mist" );
punct = mesg + strlen( mesg ) - 1;
if( isalnum( *punct ) || isspace( *punct ) )
punct = ".";
else
punct = "";
send_to_char( "Your bamfin is now set as:\n\r", ch );
charprintf( ch, " %s %s%s\n\r", ch->name, mesg, punct );
return;
}
void do_bamfout( CHAR_DATA *ch, const char *argument )
{
CHAR_DATA *rch;
char mesg[MAX_INPUT_LENGTH];
const char *punct;
rch = get_char( ch );
if( !authorized( rch, "bamfout" ) )
return;
if( !IS_NPC( ch ) )
{
if( longstring( ch, argument ) )
return;
if( !str_cmp( argument, "clear" )
|| !str_cmp( argument, "reset" )
|| !str_cmp( argument, "none" ) )
{
free_string( ch->pcdata->bamfout );
ch->pcdata->bamfout = &str_empty[0];
}
else if( argument[0] != '\0' )
{
free_string( ch->pcdata->bamfout );
ch->pcdata->bamfout = str_dup( argument );
}
if( ch->pcdata && ch->pcdata->bamfout[0] != '\0' )
strcpy( mesg, ch->pcdata->bamfout );
else
strcpy( mesg, "leaves in a swirling mist" );
punct = mesg + strlen( mesg ) - 1;
if( isalnum( *punct ) || isspace( *punct ) )
punct = ".";
else
punct = "";
send_to_char( "Your bamfout is now set as:\n\r", ch );
charprintf( ch, " %s %s%s\n\r", ch->name, mesg, punct );
}
return;
}
void do_deny( CHAR_DATA *ch, const char *argument )
{
CHAR_DATA *rch;
CHAR_DATA *victim;
rch = get_char( ch );
if( !authorized( rch, "deny" ) )
return;
if( argument[0] == '\0' )
{
send_to_char( "Deny whom?\n\r", ch );
return;
}
if( !( victim = get_char_world( ch, argument ) ) )
{
send_to_char( "They aren't here.\n\r", ch );
return;
}
if( IS_NPC( victim ) )
{
send_to_char( "Not on NPC's.\n\r", ch );
return;
}
if( get_trust( victim ) >= get_trust( ch ) )
{
send_to_char( "You failed.\n\r", ch );
return;
}
wiznetf( ch, WIZ_MISC, get_trust( ch ), "%s has denied %s!",
ch->name, victim->name );
xSET_BIT( victim->act, PLR_DENY );
send_to_char( "You are denied access!\n\r", victim );
send_to_char( "OK.\n\r", ch );
if( victim->level < 2 )
victim->level = 2;
do_quit( victim, "" );
return;
}
void do_disconnect( CHAR_DATA *ch, const char *argument )
{
CHAR_DATA *rch;
CHAR_DATA *victim = NULL;
DESCRIPTOR_DATA *d;
unsigned int desc_num = 0;
rch = get_char( ch );
if( !authorized( rch, "disconnect" ) )
return;
if( argument[0] == '\0' )
{
send_to_char( "Disconnect whom?\n\r", ch );
return;
}
if( is_number( argument ) )
{
desc_num = atoi( argument );
}
if( desc_num <= 0 )
{
if( !( victim = get_char_world( ch, argument ) ) )
{
send_to_char( "They aren't here.\n\r", ch );
return;
}
if( !victim->desc )
{
act( "$N doesn't have a descriptor.", ch, NULL, victim, TO_CHAR );
return;
}
}
for( d = descriptor_list; d; d = d->next )
{
if( d->descriptor == desc_num || ( victim && d == victim->desc ) )
{
wiznetf( ch, WIZ_MISC, get_trust( ch ), "%s closing link to %s.",
ch->name, CH( d ) ? CH( d )->name : "*Anonymous*" );
close_socket( d );
send_to_char( "Ok.\n\r", ch );
return;
}
}
if( desc_num > 0 )
{
send_to_char( "No-one has that descriptor.\n\r", ch );
}
else
{
bug( "Do_disconnect: desc not found." );
send_to_char( "Descriptor not found!\n\r", ch );
}
return;
}
void do_pardon( CHAR_DATA *ch, const char *argument )
{
CHAR_DATA *rch;
CHAR_DATA *victim;
rch = get_char( ch );
if( !authorized( rch, "pardon" ) )
return;
if( argument[0] == '\0' )
{
send_to_char( "Syntax: pardon <character>.\n\r", ch );
return;
}
if( !( victim = get_char_world( ch, argument ) ) )
{
send_to_char( "They aren't here.\n\r", ch );
return;
}
if( IS_NPC( victim ) )
{
send_to_char( "Not on NPC's.\n\r", ch );
return;
}
if( xIS_SET( victim->act, PLR_OUTLAW ) )
{
xREMOVE_BIT( victim->act, PLR_OUTLAW );
send_to_char( "OUTLAW flag removed.\n\r", ch );
send_to_char( "You are no longer an OUTLAW.\n\r", victim );
return;
}
send_to_char( "Syntax: pardon <character>.\n\r", ch );
return;
}
void do_echo( CHAR_DATA *ch, const char *argument )
{
CHAR_DATA *rch;
char arg[MAX_INPUT_LENGTH + 2];
rch = get_char( ch );
if( !authorized( rch, "echo" ) )
return;
if( argument[0] == '\0' )
{
send_to_char( "Echo what?\n\r", ch );
return;
}
strcpy( arg, argument );
strcat( arg, "\n\r" );
send_to_all_char( arg );
return;
}
void do_recho( CHAR_DATA *ch, const char *argument )
{
CHAR_DATA *rch;
DESCRIPTOR_DATA *d;
rch = get_char( ch );
if( !authorized( rch, "recho" ) )
return;
if( argument[0] == '\0' )
{
send_to_char( "Recho what?\n\r", ch );
return;
}
for( d = descriptor_list; d; d = d->next )
{
if( !IS_SET( d->interpreter->flags, INTERPRETER_NOMESSAGE )
&& d->character->in_room == ch->in_room )
{
send_to_char( argument, d->character );
send_to_char( "\n\r", d->character );
}
}
return;
}
ROOM_INDEX_DATA *find_location( CHAR_DATA *ch, const char *arg )
{
OBJ_DATA *obj;
CHAR_DATA *victim;
if( is_number( arg ) )
return get_room_index( atoi( arg ) );
if( ( victim = get_char_world( ch, arg ) ) )
return victim->in_room;
if( ( obj = get_obj_world( ch, arg ) ) )
return obj->in_room;
return NULL;
}
void do_transfer( CHAR_DATA *ch, const char *argument )
{
CHAR_DATA *rch;
CHAR_DATA *victim;
DESCRIPTOR_DATA *d;
ROOM_INDEX_DATA *location;
char arg1[MAX_INPUT_LENGTH];
char arg2[MAX_INPUT_LENGTH];
rch = get_char( ch );
if( !authorized( rch, "transfer" ) )
return;
argument = one_argument( argument, arg1 );
one_argument( argument, arg2 );
if( arg1[0] == '\0' )
{
send_to_char( "Transfer whom (and where)?\n\r", ch );
return;
}
if( !str_cmp( arg1, "all" ) )
{
for( d = descriptor_list; d; d = d->next )
{
if( !IS_SET( d->interpreter->flags, INTERPRETER_SAFE )
&& d->character != ch && d->character->in_room
&& can_see( ch, d->character ) )
{
char buf[MAX_STRING_LENGTH];
sprintf( buf, "%s %s", d->character->name, arg2 );
do_transfer( ch, buf );
}
}
return;
}
/*
* Thanks to Grodyn for the optional location parameter.
*/
if( arg2[0] == '\0' )
{
location = ch->in_room;
}
else
{
if( !( location = find_location( ch, arg2 ) ) )
{
send_to_char( "No such location.\n\r", ch );
return;
}
if( room_is_private( location ) )
{
send_to_char( "That room is private right now.\n\r", ch );
return;
}
}
if( !( victim = get_char_world( ch, arg1 ) ) )
{
send_to_char( "They aren't here.\n\r", ch );
return;
}
if( !victim->in_room )
{
send_to_char( "They are in limbo.\n\r", ch );
return;
}
if( victim->fighting )
stop_fighting( victim, TRUE );
act( "$n disappears in a mushroom cloud.", victim, NULL, NULL, TO_ROOM );
char_from_room( victim );
char_to_room( victim, location );
act( "$n arrives from a puff of smoke.", victim, NULL, NULL, TO_ROOM );
if( ch != victim )
act( "$n has transferred you.", ch, NULL, victim, TO_VICT );
do_look( victim, AUTOLOOK );
send_to_char( "Ok.\n\r", ch );
}
void do_at( CHAR_DATA *ch, const char *argument )
{
CHAR_DATA *rch;
CHAR_DATA *wch;
ROOM_INDEX_DATA *location;
ROOM_INDEX_DATA *original;
OBJ_DATA *orig_on;
char arg[MAX_INPUT_LENGTH];
rch = get_char( ch );
if( !authorized( rch, "at" ) )
return;
argument = one_argument( argument, arg );
if( arg[0] == '\0' || argument[0] == '\0' )
{
send_to_char( "At where what?\n\r", ch );
return;
}
if( !( location = find_location( ch, arg ) ) )
{
send_to_char( "No such location.\n\r", ch );
return;
}
if( room_is_private( location ) )
{
send_to_char( "That room is private right now.\n\r", ch );
return;
}
original = ch->in_room;
orig_on = ch->on;
char_from_room( ch );
char_to_room( ch, location );
interpret( ch, argument );
/*
* See if 'ch' still exists before continuing!
* Handles 'at XXXX quit' case.
*/
for( wch = char_list; wch; wch = wch->next )
{
if( wch == ch )
{
char_from_room( ch );
char_to_room( ch, original );
ch->on = orig_on;
break;
}
}
return;
}
void do_goto( CHAR_DATA *ch, const char *argument )
{
CHAR_DATA *rch;
ROOM_INDEX_DATA *location;
char mesg[MAX_INPUT_LENGTH];
const char *punct;
rch = get_char( ch );
if( !authorized( rch, "goto" ) )
return;
if( argument[0] == '\0' )
{
send_to_char( "Goto where?\n\r", ch );
return;
}
if( !( location = find_location( ch, argument ) ) )
{
send_to_char( "No such location.\n\r", ch );
return;
}
if( get_trust( ch ) < L_APP && !IS_BUILDER( ch, location->area ) )
{
send_to_char( "You can't go to that area.\n\r", ch );
return;
}
if( room_is_private( location ) )
{
send_to_char( "That room is private right now.\n\r", ch );
return;
}
if( ch->fighting )
stop_fighting( ch, TRUE );
if( !xIS_SET( ch->act, PLR_WIZINVIS ) )
{
if( ch->pcdata && ch->pcdata->bamfout[0] != '\0' )
strcpy( mesg, ch->pcdata->bamfout );
else
strcpy( mesg, "leaves in a swirling mist" );
punct = mesg + strlen( mesg ) - 1;
if( isalnum( *punct ) || isspace( *punct ) )
punct = ".";
else
punct = "";
act( "$n $t$T", ch, mesg, punct, TO_ROOM );
}
char_from_room( ch );
char_to_room( ch, location );
if( !xIS_SET( ch->act, PLR_WIZINVIS ) )
{
if( ch->pcdata && ch->pcdata->bamfin[0] != '\0' )
strcpy( mesg, ch->pcdata->bamfin );
else
strcpy( mesg, "appears in a swirling mist" );
punct = mesg + strlen( mesg ) - 1;
if( isalnum( *punct ) || isspace( *punct ) )
punct = ".";
else
punct = "";
act( "$n $t$T", ch, mesg, punct, TO_ROOM );
}
do_look( ch, AUTOLOOK );
return;
}
void do_rstat( CHAR_DATA *ch, const char *argument )
{
CHAR_DATA *rch;
ROOM_INDEX_DATA *location;
rch = get_char( ch );
if( !authorized( rch, "rstat" ) )
return;
location = ( argument[0] == '\0' ) ? ch->in_room
: find_location( ch, argument );
if( !location )
{
send_to_char( "No such location.\n\r", ch );
return;
}
if( ch->in_room != location && room_is_private( location ) )
{
send_to_char( "That room is private right now.\n\r", ch );
return;
}
show_room( ch, location );
return;
}
void do_ostat( CHAR_DATA *ch, const char *argument )
{
OBJ_DATA *obj;
CHAR_DATA *rch;
AFFECT_DATA *paf;
BUFFER *buf;
char buf1[MAX_STRING_LENGTH];
char *p;
int t1, t2;
rch = get_char( ch );
if( !authorized( rch, "ostat" ) )
return;
if( argument[0] == '\0' )
{
send_to_char( "Ostat what?\n\r", ch );
return;
}
if( !( obj = get_obj_world( ch, argument ) ) )
{
send_to_char( "Nothing like that in hell, earth, or heaven.\n\r", ch );
return;
}
buf = buffer_new( MAX_STRING_LENGTH );
bprintf( buf, "&b[&w%6.6d&b]&g Name: &w%s&g.&n\n\r",
obj->unique_key, obj->name );
bprintf( buf, "&gShort description:&w %s&n&g.&n\n\r"
"&gLong description: &w%s&n\n\r",
obj->short_descr, obj->description );
while( ( p = strstr( buf->data, "&x" ) ) )
*( p + 1 ) = 'w';
if( obj->action && *obj->action )
bprintf( buf, "&gAction description:&n %s", obj->action );
buffer_strcat( buf, LINE_SEPARATOR );
bprintf( buf, "&gVnum: &b[&r%5d&b]&g Level: &c%6d"
"&g Cost: &y%s&n\n\r",
obj->pIndexData->vnum, obj->level,
int_to_str_special( obj->cost ) );
if( ( t1 = get_time_left( obj->events, evn_obj_decay ) ) < 0 )
t1 = -1;
else
t1 /= PULSE_PER_SECOND;
if( ( t2 = get_time_left( obj->events, evn_imp_grab ) ) < 0 )
t2 = -1;
else
t2 /= PULSE_PER_SECOND;
bprintf( buf, "&gType: &c%-16s&g Timer: &c%4d&b:&c%3d"
"&g Weight: &c%d&g/&c%d&n\n\r",
flag_string( type_flags, &obj->item_type ),
t1, t2, obj->weight, get_obj_weight( obj ) );
bprintf( buf, "&gCarried By: &y%-10.10s&g In Room &b[&r%5d&b]"
"&g In Object: &g%s&n\n\r",
!obj->carried_by ? "(none)" : obj->carried_by->name,
!obj->in_room ? 0 : obj->in_room->vnum,
!obj->in_obj ? "(none)" : obj->in_obj->short_descr );
bprintf( buf, "&gCondition: &c%8d.%1.1d%%&g &gMaterial: &c%s&n\n\r",
obj->condition / 10, obj->condition % 10,
flag_string( material_flags, &obj->pIndexData->material ) );
bprintf( buf, "&gWear Loc: &c%12s",
flag_string( wear_loc_flags, &obj->wear_loc ) );
bprintf( buf, "&g Wear Flags: &c%s&n\n\r",
flag_string( wear_flags, &obj->wear_flags ) );
bprintf( buf, "&gExtra Flags: &c%s&n\n\r",
flag_string( extra_flags, &obj->extra_flags ) );
if( obj->extra_descr || obj->pIndexData->extra_descr )
{
EXTRA_DESCR_DATA *ed;
buffer_strcat( buf, "&gExtra description keywords: &c'" );
for( ed = obj->extra_descr; ed; ed = ed->next )
{
buffer_strcat( buf, ed->keyword );
if( ed->next )
buffer_strcat( buf, " " );
}
for( ed = obj->pIndexData->extra_descr; ed; ed = ed->next )
{
buffer_strcat( buf, ed->keyword );
if( ed->next )
buffer_strcat( buf, " " );
}
buffer_strcat( buf, "'&g.&n\n\r" );
}
bprintf( buf, "&gValues: &c%d %d %d %d&n\n\r",
obj->value[0], obj->value[1],
obj->value[2], obj->value[3] );
show_obj_values( obj->item_type, obj->value, buf );
buffer_strcat( buf, LINE_SEPARATOR );
for( paf = obj->affected; paf; paf = paf->next )
{
buffer_strcat( buf, show_affect( buf1, paf, TRUE, TRUE ) );
}
for( paf = obj->pIndexData->affected; paf; paf = paf->next )
{
buffer_strcat( buf, show_affect( buf1, paf, TRUE, TRUE ) );
}
send_to_char( buf->data, ch );
buffer_free( buf );
return;
}
/*
* sstat by Garion
* Modified for Daleken.
*/
void do_sstat( CHAR_DATA *ch, const char *argument )
{
CHAR_DATA *rch;
CHAR_DATA *victim;
BUFFER *outbuf = buffer_new( MAX_STRING_LENGTH );
int sn;
int col = 0;
rch = get_char( ch );
if( !authorized( rch, "sstat" ) )
return;
if( argument[0] == '\0' )
{
send_to_char( "Sstat whom\n\r?", ch );
return;
}
if( ( victim = get_char_world( ch, argument ) ) == NULL )
{
send_to_char( "That person isn't logged on.\n\r", ch );
return;
}
if( IS_NPC( victim ) )
{
send_to_char( "Not on NPC's.\n\r", ch );
return;
}
bprintf( outbuf, "&cSkill/Spell Name Cost % | ...\n\r" );
buffer_strcat( outbuf, LINE_SEPARATOR );
for( sn = 1; sn < MAX_SKILL; sn++ )
{
if( !skill_table[sn].name )
break;
if( victim->pcdata->learned[sn] > 0 )
{
bprintf( outbuf, "&g%-28.28s &y%4d %3d%%",
skill_table[sn].name,
total_mana_cost( victim, sn ),
victim->pcdata->learned[sn] );
if( ++col % 2 == 0 )
buffer_strcat( outbuf, "&n\n\r" );
else
buffer_strcat( outbuf, " &n| " );
}
}
if( col % 2 != 0 )
buffer_strcat( outbuf, "&n\n\r" );
buffer_strcat( outbuf, LINE_SEPARATOR );
bprintf( outbuf, "&g%s has &c%d&g practice sessions left.&n\n\r",
victim->name, victim->practice );
send_to_char( outbuf->data, ch );
buffer_free( outbuf );
}
void do_mstat( CHAR_DATA *ch, const char *argument )
{
CHAR_DATA *rch;
CHAR_DATA *victim;
AFFECT_DATA *paf;
BUFFER *buf = buffer_new( MAX_STRING_LENGTH );
char tmp[MAX_STRING_LENGTH];
char tmp2[MAX_STRING_LENGTH];
int cc;
rch = get_char( ch );
if( !authorized( rch, "mstat" ) )
return;
if( argument[0] == '\0' )
{
send_to_char( "Mstat whom?\n\r", ch );
return;
}
if( !( victim = get_char_world( ch, argument ) ) )
{
send_to_char( "They aren't here.\n\r", ch );
return;
}
bprintf( buf, "&b[&w%6.6d&b]&g &g%s: &c%s&g, &ma%s %s %s&n\n\r",
victim->unique_key,
IS_NPC( victim ) ? "Mobile" : "Player",
victim->name,
isvowel( *race_table[victim->race].name ) ? "n" : "",
race_table[victim->race].name,
victim->class >= 0 ? class_table[victim->class].name : "Mob" );
bprintf( buf, "&gShort descr: &w%s&n\n\r",
( victim->short_descr && *victim->short_descr )
? victim->short_descr : "(none)" );
bprintf( buf, "&gLong descr: &w%s&n",
( victim->long_descr && *victim->long_descr )
? victim->long_descr : "(none)\n\r" );
bprintf( buf, "&gVnum: &b[&r%10d&b]&g Number: &c%5d"
"&g Room: &b[&r%4d&b]&n\n\r",
IS_NPC( victim ) ? victim->pIndexData->vnum : 0,
IS_NPC( victim ) ? victim->pIndexData->count : 1,
victim->in_room ? victim->in_room->vnum : 0 );
bprintf( buf, "&gLevel: &c%5d&g(&c%4d&g)"
" Tnl: &c%4d.%2.2d&g/&c%4d&n\n\r",
victim->level, victim->sublevel,
victim->exp / 100, victim->exp % 100, get_tnl( victim ) / 100 );
bprintf( buf, "&gAge: &c%3d&g Played: &c%-7d"
"&g Timer: &c%d&n\n\r",
get_age( victim ), (int)victim->played,
victim->pcdata ? victim->pcdata->timer : -1 );
buffer_strcat( buf, LINE_SEPARATOR );
bprintf( buf, "&bStr: &c%7d&b(&c%4d&b)&g Hitroll: &c%4d"
"&g Hits: &c%d&b/&c%d&n\n\r",
IS_NPC( victim ) ? 15 + race_table[victim->race].str_mod
: victim->pcdata->perm_str,
get_curr_str( victim ),
get_hitroll( victim ),
victim->hit, victim->max_hit );
bprintf( buf, "&bInt: &c%7d&b(&c%4d&b)&g Damroll: &c%4d"
"&g Mana: &c%d&b/&c%d&n\n\r",
IS_NPC( victim ) ? 15 + race_table[victim->race].int_mod
: victim->pcdata->perm_int,
get_curr_int( victim ),
get_damroll( victim ),
total_mana( victim->mana ), total_mana( victim->max_mana ) );
bprintf( buf, "&bWis: &c%7d&b(&c%4d&b)&g Speed: &c%6d"
"&g Move: &c%d&b/&c%d&n\n\r",
IS_NPC( victim ) ? 15 + race_table[victim->race].wis_mod
: victim->pcdata->perm_wis,
get_curr_wis( victim ),
get_speed( victim ),
victim->move, victim->max_move );
bprintf( buf, "&bDex: &c%7d&b(&c%4d&b)&g AC: &c%9d"
"&g Wimpy: &c%d&n\n\r",
IS_NPC( victim ) ? 15 + race_table[victim->race].dex_mod
: victim->pcdata->perm_dex,
get_curr_dex( victim ),
GET_AC( victim ), victim->wimpy );
bprintf( buf, "&bCon: &c%7d&b(&c%4d&b)&g Save: &c%7d"
"&g Gold: &y%d&r/&y%d&n\n\r",
IS_NPC( victim ) ? 15 + race_table[victim->race].con_mod
: victim->pcdata->perm_con,
get_curr_con( victim ),
victim->saving_throw, victim->gold,
IS_NPC( victim ) ? 0 : victim->pcdata->banked );
bprintf( buf, "&rResil: &y%5d&r(&y%4d&r)&g &gAlign: &c%6d"
"&g Pracs: &c%d&n\n\r",
race_table[victim->race].resil, get_curr_resil( victim ),
victim->alignment, victim->practice );
cc = 0;
bprintf( buf, "%s%-8s %3d(%4d) %9d/%5d&g Carried: &c%-3d&b/&c%d&n\n\r",
magic_colour[cc], magic_name[cc],
IS_NPC( victim ) ? 2 + race_table[victim->race].mana_gain[cc]
: victim->pcdata->perm_magic[cc], get_magic( victim, cc ),
victim->mana[cc], victim->max_mana[cc],
victim->carry_number, can_carry_n( victim ) );
++cc;
bprintf( buf, "%s%-8s %3d(%4d) %9d/%5d&g Weight: &c%-3d&b/&c%d&n\n\r",
magic_colour[cc], magic_name[cc],
IS_NPC( victim ) ? 2 + race_table[victim->race].mana_gain[cc]
: victim->pcdata->perm_magic[cc], get_magic( victim, cc ),
victim->mana[cc], victim->max_mana[cc],
victim->carry_weight, can_carry_w( victim ) );
++cc;
bprintf( buf, "%s%-8s %3d(%4d) %9d/%5d&g Position: &c%d&n\n\r",
magic_colour[cc], magic_name[cc],
IS_NPC( victim ) ? 2 + race_table[victim->race].mana_gain[cc]
: victim->pcdata->perm_magic[cc], get_magic( victim, cc ),
victim->mana[cc], victim->max_mana[cc],
victim->position );
++cc;
bprintf( buf, "%s%-8s %3d(%4d) %9d/%5d&g Sex: &c%s&n\n\r",
magic_colour[cc], magic_name[cc],
IS_NPC( victim ) ? 2 + race_table[victim->race].mana_gain[cc]
: victim->pcdata->perm_magic[cc], get_magic( victim, cc ),
victim->mana[cc], victim->max_mana[cc],
flag_string( sex_flags, &victim->sex ) );
++cc;
bprintf( buf, "%s%-8s %3d(%4d) %9d/%5d&r Size: &y%4d&r(&y%4d&r)&n\n\r",
magic_colour[cc], magic_name[cc],
IS_NPC( victim ) ? 2 + race_table[victim->race].mana_gain[cc]
: victim->pcdata->perm_magic[cc], get_magic( victim, cc ),
victim->mana[cc], victim->max_mana[cc],
race_table[victim->race].size, get_size( victim ) );
bprintf( buf, "&gTotal ----(----) %9d/%5d"
"&r Temp: &y%4d&r(&y%4d&r)&n\n\r",
total_mana( victim->mana ), total_mana( victim->max_mana ),
race_table[victim->race].body_temp + 37,
get_curr_temp( victim ) + 37 );
if( !IS_NPC( victim ) )
bprintf( buf, "&mFull: &c%6d&m Thirst: &c%5d"
"&m Drunk: &c%d&n\n\r",
( victim->pcdata->condition[COND_FULL] + 5 ) / 10,
( victim->pcdata->condition[COND_THIRST] + 5 ) / 10,
( victim->pcdata->condition[COND_DRUNK] + 5 ) / 10 );
buffer_strcat( buf, LINE_SEPARATOR );
cc = 0;
if( victim->on )
{
bprintf( buf, "&rOn: &y%s", victim->on->short_descr );
cc = 1;
}
if( victim->fighting )
{
bprintf( buf, "&rFighting: &y%s ", victim->fighting->name );
cc = 1;
}
if( victim->leader )
{
bprintf( buf, "&rLeader: &y%s ", victim->leader->name );
cc = 1;
}
if( victim->master )
{
bprintf( buf, "&rMaster: &y%s", victim->master->name );
cc = 1;
}
if( victim->tracking )
{
bprintf( buf, "&rHunting: &y%s", victim->tracking->name );
cc = 1;
}
if( victim->fearing )
{
bprintf( buf, "&rFearing: &y%s", victim->fearing->name );
cc = 1;
}
if( cc )
buffer_strcat( buf, "&n\n\r" );
if( is_clan( victim ) )
bprintf( buf, "&rClan: &y%s &rRank: &y%s&n\n\r",
victim->pcdata->clan->name,
rank_name( victim->pcdata->clan_rank,
victim->pcdata->clan->clan_type ) );
if( victim->pcdata && victim->pcdata->religion )
bprintf( buf, "&bReligion: &c%s&n\n\r",
victim->pcdata->religion->name );
sprintf( tmp, "&gAct: &b[&c%s&b]&n\n\r",
IS_NPC( victim )
? flag_string( act_flags, victim->act )
: flag_string( pc_act_flags, victim->act ) );
buffer_strcat( buf, multi_line( tmp2, tmp, 79, 16 ) );
if( IS_NPC( victim ) && victim->spec_fun > 0 )
bprintf( buf, "&gSpec: &b[&c%s&b]&n\n\r",
spec_table[victim->spec_fun].spec_name );
sprintf( tmp, "&gBody Parts: &b[&c%s&b]&n\n\r",
flag_string( body_part_flags, &victim->body_parts ) );
buffer_strcat( buf, multi_line( tmp2, tmp, 79, 16 ) );
sprintf( tmp, "&gAffected Bits: &b[&c%s&b]&n\n\r",
flag_string( affect_flags, victim->affected_by ) );
buffer_strcat( buf, multi_line( tmp2, tmp, 79, 16 ) );
for( paf = victim->affected; paf; paf = paf->next )
{
if( paf->deleted
|| IS_SET( skill_table[paf->type].skill_type, SKILL_TYPE_ENCHANTMENT ) )
continue;
buffer_strcat( buf, show_affect( tmp, paf, TRUE, TRUE ) );
}
send_to_char( buf->data, ch );
buffer_free( buf );
return;
}
void do_mfind( CHAR_DATA *ch, const char *argument )
{
CHAR_DATA *rch;
MOB_INDEX_DATA *pMobIndex;
BUFFER *buf = buffer_new( MAX_STRING_LENGTH );
int vnum;
int nMatch;
bool fAll;
bool found;
rch = get_char( ch );
if( !authorized( rch, "mfind" ) )
{
buffer_free( buf );
return;
}
if( argument[0] == '\0' )
{
send_to_char( "Mfind whom?\n\r", ch );
buffer_free( buf );
return;
}
else if( strlen( argument ) < 2 )
{
send_to_char( "That name is too short, try a longer one.\n\r", ch );
buffer_free( buf );
return;
}
fAll = !str_cmp( argument, "all" );
found = FALSE;
nMatch = 0;
/*
* Yeah, so iterating over all vnum's takes 10,000 loops.
* Get_mob_index is fast, and I don't feel like threading another link.
* Do you?
* -- Furey
*/
for( vnum = 0; nMatch < top_mob_index && vnum < top_vnum_mob; vnum++ )
{
if( ( pMobIndex = get_mob_index( vnum ) ) )
{
nMatch++;
if( fAll || is_name( argument, pMobIndex->name ) )
{
found = TRUE;
bprintf( buf, "&b[&r%5d&b] &g%s&n\n\r",
pMobIndex->vnum, capitalize( pMobIndex->short_descr ) );
}
}
}
if( !found )
send_to_char( "Nothing like that in hell, earth, or heaven.\n\r", ch );
else
send_to_char( buf->data, ch );
buffer_free( buf );
return;
}
void do_ofind( CHAR_DATA *ch, const char *argument )
{
CHAR_DATA *rch;
OBJ_INDEX_DATA *pObjIndex;
BUFFER *buf = buffer_new( MAX_STRING_LENGTH );
char arg[MAX_INPUT_LENGTH];
int vnum;
int nMatch;
bool fAll;
bool found;
rch = get_char( ch );
if( !authorized( rch, "ofind" ) )
{
buffer_free( buf );
return;
}
if( argument[0] == '\0' )
{
send_to_char( "Ofind what?\n\r", ch );
buffer_free( buf );
return;
}
else if( strlen( argument ) < 2 )
{
send_to_char( "That name is too short, try a longer one.\n\r", ch );
buffer_free( buf );
return;
}
fAll = !str_cmp( arg, "all" );
found = FALSE;
nMatch = 0;
for( vnum = 0; nMatch < top_obj_index && vnum < top_vnum_obj; vnum++ )
{
if( ( pObjIndex = get_obj_index( vnum ) ) )
{
nMatch++;
if( fAll || is_name( argument, pObjIndex->name ) )
{
found = TRUE;
bprintf( buf, "&b[&r%5d&b] &g%s&n\n\r",
pObjIndex->vnum, capitalize( pObjIndex->short_descr ) );
}
}
}
if( !found )
send_to_char( "Nothing like that in hell, earth, or heaven.\n\r", ch );
else
send_to_char( buf->data, ch );
buffer_free( buf );
return;
}
void do_mwhere( CHAR_DATA *ch, const char *argument )
{
CHAR_DATA *rch;
CHAR_DATA *victim;
BUFFER *buf;
char arg[MAX_INPUT_LENGTH];
int count;
int mob_count = 0;
bool found;
rch = get_char( ch );
if( !authorized( rch, "mwhere" ) )
return;
if( argument[0] == '\0' )
{
send_to_char( "Mwhere whom?\n\r", ch );
return;
}
else if( strlen( argument ) < 3 )
{
send_to_char( "That name is too short, try a longer one.\n\r", ch );
return;
}
buf = buffer_new( MAX_STRING_LENGTH );
count = number_argument( argument, arg );
found = FALSE;
for( victim = char_list; victim; victim = victim->next )
{
if( !IS_NPC( victim ) || !victim->in_room
|| !is_char_name( victim, arg ) )
continue;
if( ++mob_count > 100 )
break;
if( --count <= 0 )
{
char tmp[MAX_INPUT_LENGTH];
found = TRUE;
bprintf( buf, "&b[&r%5d&b] &g%s &b[&r%5d&b] &y%s&n\n\r",
victim->pIndexData->vnum,
colour_strpad( tmp, victim->short_descr, 28 ),
victim->in_room->vnum,
victim->in_room->name );
}
}
if( !found )
act( "You didn't find any $T.", ch, NULL, argument, TO_CHAR );
else
{
bprintf( buf, "%d mobiles found.\n\r", mob_count );
send_to_char( buf->data, ch );
}
buffer_free( buf );
return;
}
void do_reboo( CHAR_DATA *ch, const char *argument )
{
CHAR_DATA *rch;
rch = get_char( ch );
if( !authorized( rch, "reboot" ) )
return;
send_to_char( "If you want to REBOOT, spell it out.\n\r", ch );
return;
}
void do_reboot( CHAR_DATA *ch, const char *argument )
{
CHAR_DATA *rch;
char buf[MAX_STRING_LENGTH];
rch = get_char( ch );
if( !authorized( rch, "reboot" ) )
return;
sprintf( buf, "Reboot by %s.", ch->name );
do_echo( ch, buf );
end_of_game( );
merc_down = TRUE;
return;
}
void do_shutdow( CHAR_DATA *ch, const char *argument )
{
CHAR_DATA *rch;
rch = get_char( ch );
if( !authorized( rch, "shutdown" ) )
return;
send_to_char( "If you want to SHUTDOWN, spell it out.\n\r", ch );
return;
}
void do_shutdown( CHAR_DATA *ch, const char *argument )
{
CHAR_DATA *rch;
char buf[MAX_STRING_LENGTH];
FILE *fp;
rch = get_char( ch );
if( !authorized( rch, "shutdown" ) )
return;
sprintf( buf, "Shutdown by %s.", ch->name );
if( !( fp = open_file( SHUTDOWN_FILE, "a", FALSE ) ) )
{
perror( SHUTDOWN_FILE );
send_to_char( "Could not open the file!\n\r", ch );
}
else
{
fprintf( fp, buf );
close_file( fp );
}
strcat( buf, "\n\r" );
do_echo( ch, buf );
end_of_game( );
merc_down = TRUE;
return;
}
void do_snoop( CHAR_DATA *ch, const char *argument )
{
CHAR_DATA *rch;
CHAR_DATA *victim;
DESCRIPTOR_DATA *d;
char arg[MAX_INPUT_LENGTH];
rch = get_char( ch );
if( !authorized( rch, "snoop" ) )
return;
one_argument( argument, arg );
if( arg[0] == '\0' )
{
send_to_char( "Snoop whom?\n\r", ch );
return;
}
if( !( victim = get_char_world( ch, arg ) ) )
{
send_to_char( "They aren't here.\n\r", ch );
return;
}
if( !victim->desc )
{
send_to_char( "No descriptor to snoop.\n\r", ch );
return;
}
if( victim == ch )
{
send_to_char( "Cancelling all snoops.\n\r", ch );
for( d = descriptor_list; d; d = d->next )
{
if( d->snoop_by == ch->desc )
d->snoop_by = NULL;
}
return;
}
if( victim->desc->snoop_by )
{
send_to_char( "Busy already.\n\r", ch );
return;
}
if( get_trust( victim ) >= get_trust( ch ) )
{
send_to_char( "You failed.\n\r", ch );
return;
}
if( ch->desc )
{
for( d = ch->desc->snoop_by; d; d = d->snoop_by )
{
if( d->character == victim || d->original == victim )
{
send_to_char( "No snoop loops.\n\r", ch );
return;
}
}
}
wiznetf( ch, WIZ_MISC, get_trust( ch ), "%s snooping %s.",
ch->name, victim->name );
victim->desc->snoop_by = ch->desc;
send_to_char( "Ok.\n\r", ch );
return;
}
void do_switch( CHAR_DATA *ch, const char *argument )
{
CHAR_DATA *rch;
CHAR_DATA *victim;
rch = get_char( ch );
if( !authorized( rch, "switch" ) )
return;
if( argument[0] == '\0' )
{
send_to_char( "Switch into whom?\n\r", ch );
return;
}
if( !ch->desc )
return;
if( ch->desc->original )
{
send_to_char( "You are already switched.\n\r", ch );
return;
}
if( !( victim = get_char_world( ch, argument ) ) )
{
send_to_char( "They aren't here.\n\r", ch );
return;
}
if( victim == ch )
{
send_to_char( "Ok.\n\r", ch );
return;
}
/*
* Pointed out by Da Pub (What Mud)
* If taking this out causes crashes I don't know why.
*
if( !IS_NPC( victim ) )
{
send_to_char( "You cannot switch into a player!\n\r", ch );
return;
}
*/
if( !IS_NPC( victim ) && ch->pcdata->switched )
{
send_to_char( "Not switched immortals, they might return.\n\r", ch );
return;
}
if( victim->desc )
{
send_to_char( "Character in use.\n\r", ch );
return;
}
ch->pcdata->switched = TRUE;
ch->desc->character = victim;
ch->desc->original = ch;
victim->desc = ch->desc;
ch->desc = NULL;
wiznetf( ch, WIZ_MISC, get_trust( ch ), "%s switched to %s.",
ch->name, victim->name );
send_to_char( "Ok.\n\r", victim );
return;
}
void do_return( CHAR_DATA *ch, const char *argument )
{
if( !ch->desc )
return;
if( !ch->desc->original )
{
send_to_char( "You aren't switched.\n\r", ch );
return;
}
/* Note that we dont check for immortal ability to have return here.
* We assume we will automatically allow immortals with switch to return.
* Don't want to have our immortals stuck in a mobile's body do we? :)
* -Kahn
*/
wiznetf( ch, WIZ_MISC, get_trust( ch ), "%s returned to their body.",
ch->name );
send_to_char( "You return to your original body.\n\r", ch );
ch->desc->original->pcdata->switched = FALSE;
ch->desc->character = ch->desc->original;
ch->desc->original = NULL;
ch->desc->character->desc = ch->desc;
ch->desc = NULL;
return;
}
void do_mload( CHAR_DATA *ch, const char *argument )
{
CHAR_DATA *rch;
CHAR_DATA *victim;
MOB_INDEX_DATA *pMobIndex;
char arg[MAX_INPUT_LENGTH];
rch = get_char( ch );
if( !authorized( rch, "mload" ) )
return;
one_argument( argument, arg );
if( arg[0] == '\0' || !is_number( arg ) )
{
send_to_char( "Syntax: mload <vnum>.\n\r", ch );
return;
}
if( !( pMobIndex = get_mob_index( atoi( arg ) ) ) )
{
send_to_char( "No mob has that vnum.\n\r", ch );
return;
}
victim = create_mobile( pMobIndex );
char_to_room( victim, ch->in_room );
wiznetf( ch, WIZ_CREATE, get_trust( ch ), "%s has created mobile %s&g (%d).",
ch->name, victim->short_descr, pMobIndex->vnum );
send_to_char( "Ok.\n\r", ch );
act( "$n has created $N!", ch, NULL, victim, TO_ROOM );
return;
}
void do_oload( CHAR_DATA *ch, const char *argument )
{
OBJ_DATA *obj;
CHAR_DATA *rch;
OBJ_INDEX_DATA *pObjIndex;
char arg1[MAX_INPUT_LENGTH];
char arg2[MAX_INPUT_LENGTH];
int level;
rch = get_char( ch );
if( !authorized( rch, "oload" ) )
return;
argument = one_argument( argument, arg1 );
one_argument( argument, arg2 );
if( arg1[0] == '\0' || !is_number( arg1 ) )
{
send_to_char( "Syntax: oload <vnum> <level>.\n\r", ch );
return;
}
if( arg2[0] == '\0' )
{
level = 0;
}
else
{
/*
* New feature from Alander.
*/
if( !is_number( arg2 ) )
{
send_to_char( "Syntax: oload <vnum> <level>.\n\r", ch );
return;
}
level = atoi_special( arg2 );
if( level < 0 || level > get_trust( ch ) )
{
send_to_char( "Limited to your trust level.\n\r", ch );
return;
}
}
if( !( pObjIndex = get_obj_index( atoi( arg1 ) ) ) )
{
send_to_char( "No object has that vnum.\n\r", ch );
return;
}
obj = create_object( pObjIndex, level );
if( CAN_WEAR( obj, ITEM_TAKE ) )
{
obj_to_char( obj, ch );
}
else
{
obj_to_room( obj, ch->in_room );
strip_events( &obj->events, evn_imp_grab );
act( "$n has created $p!", ch, obj, NULL, TO_ROOM );
}
wiznetf( ch, WIZ_CREATE, get_trust( ch ), "%s has created object %s&g (%d).",
ch->name, obj->short_descr, pObjIndex->vnum );
send_to_char( "Ok.\n\r", ch );
return;
}
void purge_room( CHAR_DATA *ch, const char *argument )
{
OBJ_DATA *obj;
CHAR_DATA *victim;
if( argument[0] == '\0' || !str_cmp( argument, "all" )
|| !str_prefix( "all.", argument )
|| !str_cmp( "mob", argument )
|| !str_cmp( "obj", argument ) )
{
/*
* 'purge'
*/
OBJ_DATA *obj_next;
CHAR_DATA *vnext;
for( victim = ch->in_room->people; victim; victim = vnext )
{
vnext = victim->next_in_room;
if( victim->deleted || !str_cmp( "obj", argument ) )
continue;
if( argument[0] != '\0' && argument[3] != '\0'
&& !is_char_name( victim, &argument[4] ) )
continue;
if( IS_NPC( victim ) && victim != ch )
extract_char( victim, TRUE );
}
for( obj = ch->in_room->contents; obj; obj = obj_next )
{
obj_next = obj->next_content;
if( obj->deleted || !str_cmp( "mob", argument ) )
continue;
if( argument[0] != '\0' && argument[3] != '\0'
&& !is_obj_name( obj, &argument[4] ) )
continue;
if( obj->item_type == ITEM_CORPSE_PC )
send_to_char( "Make sure of purging pc corpses, "
"purge them individually.\n\r", ch );
else
extract_obj( obj );
}
send_to_char( "Ok.\n\r", ch );
if( !IS_NPC( ch ) )
act( "$n purges the room!", ch, NULL, NULL, TO_ROOM );
return;
}
if( !( victim = get_char_room( ch, argument ) ) )
{
if( ( obj = get_obj_list( ch, argument, ch->in_room->contents ) ) )
{
if( !IS_NPC( ch ) )
act( "$n purges $p!", ch, obj, NULL, TO_ROOM );
send_to_char( "Ok.\n\r", ch );
extract_obj( obj );
}
else
{
send_to_char( "That isn't here.\n\r", ch );
}
return;
}
if( !IS_NPC( victim ) )
{
send_to_char( "Not on PC's.\n\r", ch );
return;
}
if( !IS_NPC( ch ) )
act( "$n purges $N.", ch, NULL, victim, TO_NOTVICT );
send_to_char( "Ok.\n\r", ch );
extract_char( victim, TRUE );
return;
}
void do_purge( CHAR_DATA *ch, const char *argument )
{
CHAR_DATA *rch;
rch = get_char( ch );
if( !authorized( rch, "purge" ) )
return;
purge_room( ch, argument );
return;
}
void do_advance( CHAR_DATA *ch, const char *argument )
{
CHAR_DATA *rch;
CHAR_DATA *victim;
char arg1[MAX_INPUT_LENGTH];
bool sublevel = FALSE;
int level;
int iLevel;
int hp, mana[MAGIC_MAX], move, prac;
int sn;
rch = get_char( ch );
if( !authorized( rch, "advance" ) )
return;
argument = one_argument( argument, arg1 );
if( arg1[0] == '\0' || argument[0] == '\0' )
{
send_to_char( "Syntax: advance <char> <level>\n\r", ch );
return;
}
if( !( victim = get_char_room( ch, arg1 ) ) )
{
send_to_char( "That player is not here.\n\r", ch );
return;
}
if( IS_NPC( victim ) )
{
send_to_char( "Not on NPC's.\n\r", ch );
return;
}
if( victim->sublevel )
{
argument = one_argument( argument, arg1 );
if( argument[0] == '\0' || !is_number( argument )
|| ( str_cmp( arg1, "level" ) && str_cmp( arg1, "sublevel" ) ) )
{
send_to_char( "For victims that are multiclassing, "
"please specify level or sublevel.\n\r", ch );
return;
}
if( !str_cmp( arg1, "sublevel" ) )
sublevel = TRUE;
}
if( !is_number( argument ) )
{
send_to_char( "Usage: advance <character> [sublevel|level] <level>\n\r",
ch );
return;
}
level = atoi( argument );
if( level <= 0 || level > LEVEL_HERO )
{
charprintf( ch, "Advance within range 1 to %d.\n\r", LEVEL_HERO );
return;
}
if( victim->sublevel && ( level > victim->level
|| ( sublevel && level <= victim->sublevel ) ) )
{
send_to_char(
"For multiclassing characters, you may only demote them to a\n\r"
"lower level, or promote them sublevels.\n\r", ch );
return;
}
/*
* Lower level:
* Reset to level 1.
* Then raise again.
* Currently, an imp can lower another imp.
* -- Swiftest
*/
if( !sublevel && level <= victim->level )
{
send_to_char( "Lowering a player's level!\n\r", ch );
send_to_char( "&R**** OOOOHHHHHHHHHH NNNNOOOO ****&n\n\r", victim );
victim->level = 1;
victim->sublevel = 0;
victim->exp = get_tnl( victim );
victim->max_hit = 20;
victim->hit = victim->max_hit;
for( sn = 0; sn < MAGIC_MAX; ++sn )
{
victim->max_mana[sn] = 10 + class_table[victim->class].fMana;
victim->mana[sn] = victim->max_mana[sn];
}
victim->max_move = 100;
victim->move = victim->max_move;
for( sn = 0; sn < MAX_SKILL; sn++ )
victim->pcdata->learned[sn] = 0;
if( get_first_class( victim ) != CLASS_NONE )
victim->class = get_first_class( victim );
for( sn = 0; sn < NUM_MULTI_CLASS; sn++ )
victim->pcdata->multi_class[sn] = CLASS_UNKNOWN;
victim->practice = 300;
advance_level( victim, TRUE );
wiznetf( victim, WIZ_LEVELS, get_trust( rch ),
"%s has been demoted to level %d by %s",
victim->name, level, ch->name );
}
else
{
send_to_char( "Raising a player's level!\n\r", ch );
send_to_char( "&B**** OOOOHHHHHHHHHH YYYYEEEESSS ****&n\n\r",
victim );
wiznetf( victim, WIZ_LEVELS, get_trust( rch ),
"%s has been advanced to %slevel %d by %s",
victim->name, sublevel ? "sub" : "", level, ch->name );
}
hp = victim->max_hit;
for( sn = 0; sn < MAGIC_MAX; ++sn )
mana[sn] = victim->max_mana[sn];
move = victim->max_move;
prac = victim->practice;
if( victim->sublevel > 0 )
{
for( iLevel = victim->sublevel; iLevel < level; iLevel++ )
{
victim->sublevel += 1;
advance_level( victim, TRUE );
}
}
else
{
for( iLevel = victim->level; iLevel < level; iLevel++ )
{
victim->level += 1;
advance_level( victim, TRUE );
}
}
charprintf( victim, "&GYou raise some levels!!! "
"&mYour gain is %d/%dhp %d/%dmv %d/%d practices.\n\r&gMana: ",
victim->max_hit - hp, victim->max_hit,
victim->max_move - move, victim->max_move,
victim->practice - prac, victim->practice );
for( sn = 0; sn < MAGIC_MAX; ++sn )
charprintf( victim, "%s%d/%d %s%s", magic_colour[sn],
victim->max_mana[sn] - mana[sn],
get_max_mana( victim, sn ), magic_name[sn],
( sn < MAGIC_MAX - 1 ) ? ", " : "&g.&n\n\r" );
victim->trust = 0;
return;
}
void do_trust( CHAR_DATA *ch, const char *argument )
{
CHAR_DATA *rch;
CHAR_DATA *victim;
char arg1[MAX_INPUT_LENGTH];
char arg2[MAX_INPUT_LENGTH];
int level, max_level;
rch = get_char( ch );
if( !authorized( rch, "trust" ) )
return;
argument = one_argument( argument, arg1 );
one_argument( argument, arg2 );
if( arg1[0] == '\0' || arg2[0] == '\0' || !is_number( arg2 ) )
{
send_to_char( "Syntax: trust <char> <level>.\n\r", ch );
return;
}
if( !( victim = get_char_room( ch, arg1 ) ) )
{
send_to_char( "That player is not here.\n\r", ch );
return;
}
level = atoi( arg2 );
max_level = UMIN( MAX_LEVEL, ( get_trust( ch ) - 800 ) * 8 );
if( level < 1 || level > max_level )
{
char buf[MAX_STRING_LENGTH];
sprintf( buf, "Trust within range 1 to %d.\n\r", max_level );
send_to_char( buf, ch );
return;
}
sprintf( arg1, "%s has been trusted at level %d by %s", victim->name,
level, ch->name );
wiznet( ch, WIZ_LEVELS, get_trust( rch ), arg1 );
victim->trust = level;
return;
}
void do_restore( CHAR_DATA *ch, const char *argument )
{
CHAR_DATA *rch;
CHAR_DATA *victim;
char arg[MAX_INPUT_LENGTH];
char buf[MAX_INPUT_LENGTH];
bool parts = FALSE;
bool mobs = FALSE;
bool mesg = FALSE;
rch = get_char( ch );
if( !authorized( rch, "restore" ) )
return;
argument = one_argument( argument, arg );
if( arg[0] == '\0' )
{
send_to_char( "Syntax: restore <char|all> [mobs|parts]\n\r", ch );
send_to_char( "also: restore <...> [...] message <message>\n\r", ch );
return;
}
while( argument[0] != '\0' )
{
argument = one_argument( argument, buf );
if( !str_cmp( buf, "mobs" ) )
mobs = TRUE;
if( !str_cmp( buf, "parts" ) )
parts = TRUE;
if( !str_cmp( buf, "message" ) || !str_cmp( buf, "mesg" ) )
{
mesg = TRUE;
if( argument[0] == '\0' )
{
send_to_char( "You need to put a message here.\n\r", ch );
return;
}
break;
}
}
/*
* Restore All feature coded by Katrina
*/
if( !str_cmp( arg, "all" ) )
{
for( victim = char_list; victim; victim = victim->next )
{
int i;
if( victim->deleted )
continue;
if( IS_NPC( victim ) && !mobs )
continue;
victim->hit = victim->max_hit;
for( i = 0; i < MAGIC_MAX; ++i )
victim->mana[i] = victim->max_mana[i];
victim->move = victim->max_move;
xREMOVE_BIT( victim->affected_by, AFF_BLEEDING );
if( parts )
victim->body_parts = race_table[victim->race].body_parts;
if( !IS_NPC( victim ) )
{
victim->pcdata->condition[COND_FULL] =
race_table[victim->race].hunger_mod * 10;
victim->pcdata->condition[COND_THIRST] =
race_table[victim->race].thirst_mod * 10;
}
update_pos( victim );
if( mesg )
{
sprintf( buf, "&g%s has restored you.&n\n\r", argument );
send_to_char( buf, victim );
}
else
act( "&g$n has restored you.&n", ch, NULL, victim, TO_VICT );
}
send_to_char( "&bAww...how sweet &Y:)&b . . . Done.&n\n\r", ch );
}
else
{
int i;
if( !( victim = get_char_world( ch, arg ) ) )
{
send_to_char( "They aren't here.\n\r", ch );
return;
}
victim->hit = victim->max_hit;
for( i = 0; i < MAGIC_MAX; ++i )
victim->mana[i] = victim->max_mana[i];
victim->move = victim->max_move;
xREMOVE_BIT( victim->affected_by, AFF_BLEEDING );
if( parts )
victim->body_parts = race_table[victim->race].body_parts;
if( !IS_NPC( victim ) )
{
victim->pcdata->condition[COND_FULL] =
race_table[victim->race].hunger_mod * 10;
victim->pcdata->condition[COND_THIRST] =
race_table[victim->race].thirst_mod * 10;
}
update_pos( victim );
if( mesg )
{
sprintf( buf, "&g%s has restored you.&n\n\r", argument );
send_to_char( buf, victim );
}
else
act( "&g$n has restored you.", ch, NULL, victim, TO_VICT );
send_to_char( "Ok.\n\r", ch );
}
return;
}
void do_toad( CHAR_DATA *ch, const char *argument )
{
CHAR_DATA *rch;
CHAR_DATA *victim;
char arg[MAX_INPUT_LENGTH];
MOB_INDEX_DATA *pMobIndex;
CHAR_DATA *pMob;
rch = get_char( ch );
if( !authorized( rch, "toad" ) )
return;
if( argument[0] == '\0' )
{
send_to_char( "Usage: TOAD <char> <mob-vnum>\n\r", ch );
return;
}
argument = one_argument( argument, arg );
if( !( victim = get_char_world( ch, arg ) ) || !victim->in_room )
{
send_to_char( "They aren't here.\n\r", ch );
return;
}
if( IS_NPC( victim ) || !victim->desc )
{
send_to_char( "Not on NPC's or those without descriptors.\n\r", ch );
return;
}
if( get_trust( victim ) >= get_trust( ch ) )
{
send_to_char( "You failed.\n\r", ch );
return;
}
if( !( pMobIndex = get_mob_index( atoi( argument ) ) ) )
{
send_to_char( "You can't find that mob.\n\r", ch );
return;
}
pMob = create_mobile( pMobIndex );
pMob->gold = 0;
victim->pcdata->switched = TRUE;
victim->desc->character = pMob;
victim->desc->original = victim;
pMob->desc = victim->desc;
victim->desc = NULL;
char_to_room( pMob, victim->in_room );
char_from_room( victim );
char_to_room( victim, get_room_index( ROOM_VNUM_TEMPLE ) );
charprintf( pMob, "&r%s has turned you into %s!\n\r",
ch->name, pMob->short_descr );
charprintf( ch, "&gYou have turned %s into %s!\n\r",
victim->name, pMob->short_descr );
wiznetf( ch, WIZ_MISC, get_trust( ch ), "%s has turned %s into %s.",
rch->name, victim->name, pMob->short_descr );
return;
}
void do_freeze( CHAR_DATA *ch, const char *argument )
{
CHAR_DATA *rch;
CHAR_DATA *victim;
rch = get_char( ch );
if( !authorized( rch, "freeze" ) )
return;
if( argument[0] == '\0' )
{
send_to_char( "Freeze whom?\n\r", ch );
return;
}
if( !( victim = get_char_world( ch, argument ) ) )
{
send_to_char( "They aren't here.\n\r", ch );
return;
}
if( IS_NPC( victim ) )
{
send_to_char( "Not on NPC's.\n\r", ch );
return;
}
if( get_trust( victim ) >= get_trust( ch ) )
{
send_to_char( "You failed.\n\r", ch );
return;
}
if( xIS_SET( victim->act, PLR_FREEZE ) )
{
xREMOVE_BIT( victim->act, PLR_FREEZE );
send_to_char( "&CFREEZE&g removed.&n\n\r", ch );
send_to_char( "&gYou can play again.&n\n\r", victim );
wiznetf( ch, WIZ_MISC, get_trust( ch ),
"%s has thawed %s.", rch->name, victim->name );
}
else
{
xSET_BIT( victim->act, PLR_FREEZE );
send_to_char( "&CFREEZE&r set.&n\n\r", ch );
send_to_char( "&rYou can't do &RANYthing!&n\n\r", victim );
wiznetf( ch, WIZ_MISC, get_trust( ch ),
"%s has frozen %s.", rch->name, victim->name );
}
save_char_obj( victim );
return;
}
void do_log( CHAR_DATA *ch, const char *argument )
{
CHAR_DATA *rch;
CHAR_DATA *victim;
rch = get_char( ch );
if( !authorized( rch, "log" ) )
return;
if( argument[0] == '\0' )
{
send_to_char( "Log whom?\n\r", ch );
return;
}
if( !str_cmp( argument, "all" ) )
{
TOGGLE_BIT( SysInfo->flags, SYSINFO_LOGALL );
if( IS_SET( SysInfo->flags, SYSINFO_LOGALL ) )
{
send_to_char( "Log ALL on.\n\r", ch );
wiznetf( ch, WIZ_MISC, get_trust( ch ),
"%s has set log for the entire MUD.", rch->name );
}
else
{
send_to_char( "Log ALL off.\n\r", ch );
wiznetf( ch, WIZ_MISC, get_trust( ch ),
"%s has removed log for the entire MUD.", rch->name );
}
return;
}
if( !( victim = get_char_world( ch, argument ) ) )
{
send_to_char( "They aren't here.\n\r", ch );
return;
}
if( IS_NPC( victim ) )
{
send_to_char( "Not on NPC's.\n\r", ch );
return;
}
/*
* No level check, gods can log anyone.
*/
if( xIS_SET( victim->act, PLR_LOG ) )
{
xREMOVE_BIT( victim->act, PLR_LOG );
send_to_char( "LOG removed.\n\r", ch );
wiznetf( ch, WIZ_MISC, get_trust( ch ),
"%s has removed log for %s.", rch->name, victim->name );
}
else
{
xSET_BIT( victim->act, PLR_LOG );
send_to_char( "LOG set.\n\r", ch );
wiznetf( ch, WIZ_MISC, get_trust( ch ),
"%s has set log for %s.", rch->name, victim->name );
}
return;
}
void do_noemote( CHAR_DATA *ch, const char *argument )
{
CHAR_DATA *rch;
CHAR_DATA *victim;
rch = get_char( ch );
if( !authorized( rch, "noemote" ) )
return;
if( argument[0] == '\0' )
{
send_to_char( "Noemote whom?\n\r", ch );
return;
}
if( !( victim = get_char_world( ch, argument ) ) )
{
send_to_char( "They aren't here.\n\r", ch );
return;
}
if( IS_NPC( victim ) )
{
send_to_char( "Not on NPC's.\n\r", ch );
return;
}
if( get_trust( victim ) >= get_trust( ch ) )
{
send_to_char( "You failed.\n\r", ch );
return;
}
if( xIS_SET( victim->act, PLR_NO_EMOTE ) )
{
xREMOVE_BIT( victim->act, PLR_NO_EMOTE );
send_to_char( "NO_EMOTE removed.\n\r", ch );
send_to_char( "You can emote again.\n\r", victim );
wiznetf( ch, WIZ_MISC, get_trust( ch ),
"%s has removed noemote for %s.", rch->name, victim->name );
}
else
{
xSET_BIT( victim->act, PLR_NO_EMOTE );
send_to_char( "You can't emote!\n\r", victim );
send_to_char( "NO_EMOTE set.\n\r", ch );
wiznetf( ch, WIZ_MISC, get_trust( ch ),
"%s has set noemote for %s.", rch->name, victim->name );
}
return;
}
void do_notell( CHAR_DATA *ch, const char *argument )
{
CHAR_DATA *rch;
CHAR_DATA *victim;
rch = get_char( ch );
if( !authorized( rch, "notell" ) )
return;
if( argument[0] == '\0' )
{
send_to_char( "Notell whom?", ch );
return;
}
if( !( victim = get_char_world( ch, argument ) ) )
{
send_to_char( "They aren't here.\n\r", ch );
return;
}
if( IS_NPC( victim ) )
{
send_to_char( "Not on NPC's.\n\r", ch );
return;
}
if( get_trust( victim ) >= get_trust( ch ) )
{
send_to_char( "You failed.\n\r", ch );
return;
}
if( xIS_SET( victim->act, PLR_NO_TELL ) )
{
xREMOVE_BIT( victim->act, PLR_NO_TELL );
send_to_char( "NO_TELL removed.\n\r", ch );
send_to_char( "You can tell again.\n\r", victim );
wiznetf( ch, WIZ_MISC, get_trust( ch ),
"%s has removed notell for %s.", rch->name, victim->name );
}
else
{
xSET_BIT( victim->act, PLR_NO_TELL );
send_to_char( "NO_TELL set.\n\r", ch );
send_to_char( "You can't tell!\n\r", victim );
wiznetf( ch, WIZ_MISC, get_trust( ch ),
"%s has set notell for %s.", rch->name, victim->name );
}
return;
}
void do_silence( CHAR_DATA *ch, const char *argument )
{
CHAR_DATA *rch;
CHAR_DATA *victim;
rch = get_char( ch );
if( !authorized( rch, "silence" ) )
return;
if( argument[0] == '\0' )
{
send_to_char( "Silence whom?\n\r", ch );
return;
}
if( !( victim = get_char_world( ch, argument ) ) )
{
send_to_char( "They aren't here.\n\r", ch );
return;
}
if( IS_NPC( victim ) )
{
send_to_char( "Not on NPC's.\n\r", ch );
return;
}
if( get_trust( victim ) >= get_trust( ch ) )
{
send_to_char( "You failed.\n\r", ch );
return;
}
if( xIS_SET( victim->act, PLR_SILENCE ) )
{
xREMOVE_BIT( victim->act, PLR_SILENCE );
send_to_char( "You can use channels again.\n\r", victim );
send_to_char( "SILENCE removed.\n\r", ch );
wiznetf( ch, WIZ_MISC, get_trust( ch ),
"%s has unsilenced %s.", rch->name, victim->name );
}
else
{
xSET_BIT( victim->act, PLR_SILENCE );
send_to_char( "You can't use channels!\n\r", victim );
send_to_char( "SILENCE set.\n\r", ch );
wiznetf( ch, WIZ_MISC, get_trust( ch ),
"%s has silenced %s.", rch->name, victim->name );
}
return;
}
void do_peace( CHAR_DATA *ch, const char *argument )
{
CHAR_DATA *rch;
rch = get_char( ch );
if( !authorized( rch, "peace" ) )
return;
/*
* Yes, we are reusing rch. -Kahn
* --
* Removal of aggressive flag from ROM
*/
for( rch = ch->in_room->people; rch; rch = rch->next_in_room )
{
if( rch->fighting )
stop_fighting( rch, TRUE );
if( IS_NPC( rch ) && xIS_SET( rch->act, ACT_AGGRESSIVE ) )
xREMOVE_BIT( rch->act, ACT_AGGRESSIVE );
}
send_to_char( "Ok.\n\r", ch );
return;
}
void do_badname( CHAR_DATA *ch, const char *argument )
{
BAN_DATA *pbad;
CHAR_DATA *rch;
char buf[MAX_STRING_LENGTH];
char arg[MAX_INPUT_LENGTH];
int col = 0;
if( IS_NPC( ch ) )
return;
rch = get_char( ch );
if( !authorized( rch, "badname" ) )
return;
argument = one_argument( argument, arg );
if( arg[0] == '\0' )
{
strcpy( buf, "Banned character names:\n\r" );
for( pbad = badname_list; pbad; pbad = pbad->next )
{
sprintf( buf + strlen( buf ), "%-15s", pbad->name );
if( ++col % 5 == 0 )
strcat( buf, "\n\r" );
else
strcat( buf, " " );
}
if( col % 5 != 0 )
strcat( buf, "\n\r" );
send_to_char( buf, ch );
return;
}
if( !str_cmp( arg, "remove" ) )
{
BAN_DATA *prev, *curr;
char arg2[MAX_INPUT_LENGTH];
one_argument( argument, arg2 );
prev = NULL;
for( curr = badname_list; curr; prev = curr, curr = curr->next )
{
if( !str_cmp( arg2, curr->name ) )
{
if( !prev )
badname_list = badname_list->next;
else
prev->next = curr->next;
free_string( curr->name );
curr->next = ban_free;
ban_free = curr;
charprintf( ch, "Unbanned the name %s.\n\r", arg2 );
wiznetf( ch, WIZ_MISC, get_trust( ch ),
"%s removing the ban on the name %s.",
ch->name, arg2 );
return;
}
}
charprintf( ch, "The name %s isn't banned.\n\r", arg2 );
return;
}
for( pbad = badname_list; pbad; pbad = pbad->next )
{
if( !str_cmp( arg, pbad->name ) )
{
send_to_char( "That name is already banned!\n\r", ch );
return;
}
}
if( !ban_free )
{
pbad = alloc_perm( sizeof( *pbad ) );
}
else
{
pbad = ban_free;
ban_free = ban_free->next;
}
pbad->name = str_dup( arg );
pbad->next = badname_list;
badname_list = pbad;
wiznetf( ch, WIZ_MISC, get_trust( ch ), "%s banning the name %s",
ch->name, arg );
charprintf( ch, "Banned the name %s.\n\r", arg );
return;
}
void do_ban( CHAR_DATA *ch, const char *argument )
{
BAN_DATA *pban;
CHAR_DATA *rch;
char buf[MAX_STRING_LENGTH];
char arg[MAX_INPUT_LENGTH];
if( IS_NPC( ch ) )
return;
rch = get_char( ch );
if( !authorized( rch, "ban" ) )
return;
one_argument( argument, arg );
if( arg[0] == '\0' )
{
strcpy( buf, "Banned sites:\n\r" );
for( pban = ban_list; pban; pban = pban->next )
{
strcat( buf, pban->name );
strcat( buf, "\n\r" );
}
send_to_char( buf, ch );
return;
}
for( pban = ban_list; pban; pban = pban->next )
{
if( !str_cmp( arg, pban->name ) )
{
send_to_char( "That site is already banned!\n\r", ch );
return;
}
}
if( !ban_free )
{
pban = alloc_perm( sizeof( *pban ) );
}
else
{
pban = ban_free;
ban_free = ban_free->next;
}
pban->name = str_dup( arg );
pban->next = ban_list;
ban_list = pban;
wiznetf( ch, WIZ_MISC, get_trust( ch ), "%s setting siteban on %s",
ch->name, arg );
send_to_char( "Ok.\n\r", ch );
ban_update( );
return;
}
void do_allow( CHAR_DATA *ch, const char *argument )
{
BAN_DATA *prev;
BAN_DATA *curr;
CHAR_DATA *rch;
char arg[MAX_INPUT_LENGTH];
rch = get_char( ch );
if( !authorized( rch, "allow" ) )
return;
one_argument( argument, arg );
if( arg[0] == '\0' )
{
send_to_char( "Remove which site from the ban list?\n\r", ch );
return;
}
prev = NULL;
for( curr = ban_list; curr; prev = curr, curr = curr->next )
{
if( !str_cmp( arg, curr->name ) )
{
if( !prev )
ban_list = ban_list->next;
else
prev->next = curr->next;
free_string( curr->name );
curr->next = ban_free;
ban_free = curr;
send_to_char( "Ok.\n\r", ch );
ban_update( );
wiznetf( ch, WIZ_MISC, get_trust( ch ), "%s allowing site %s.",
ch->name, arg );
return;
}
}
send_to_char( "Site is not banned.\n\r", ch );
return;
}
void do_wizlock( CHAR_DATA *ch, const char *argument )
{
CHAR_DATA *rch;
rch = get_char( ch );
if( !authorized( rch, "wizlock" ) )
return;
TOGGLE_BIT( SysInfo->flags, SYSINFO_WIZLOCK );
if( IS_SET( SysInfo->flags, SYSINFO_WIZLOCK ) )
send_to_char( "Game wizlocked.\n\r", ch );
else
send_to_char( "Game un-wizlocked.\n\r", ch );
return;
}
void do_slookup( CHAR_DATA *ch, const char *argument )
{
CHAR_DATA *rch;
BUFFER *buf;
int sn, i, k, j;
const char *ptr;
rch = get_char( ch );
if( !authorized( rch, "slookup" ) )
return;
if( argument[0] == '\0' )
{
send_to_char( "Slookup what?\n\r", ch );
return;
}
if( !str_cmp( argument, "all" ) )
{
buf = buffer_new( MAX_STRING_LENGTH );
for( sn = 0; sn < MAX_SKILL; sn++ )
{
if( !skill_table[sn].name )
break;
bprintf( buf, "Sn: %4d Skill/spell: '%s'\n\r",
sn, skill_table[sn].name );
}
}
else
{
if( is_number( argument ) )
{
sn = atoi( argument );
if( sn < 0 || sn >= MAX_SKILL || !skill_table[sn].name )
{
send_to_char( "I can't find that skill.\n\r", ch );
return;
}
}
else if( ( sn = skill_lookup( argument ) ) < 0 )
{
send_to_char( "No such skill or spell.\n\r", ch );
return;
}
buf = buffer_new( MAX_STRING_LENGTH );
bprintf( buf, "&gSn: &b[&r%5d&b] &gSkill/spell: &c'%s'&n\n\r",
sn, skill_table[sn].name );
switch( skill_table[sn].target )
{
case TAR_CHAR_DEFENSIVE:
ptr = "defensive"; break;
case TAR_CHAR_SELF:
ptr = "self only"; break;
case TAR_CHAR_OFFENSIVE:
ptr = "offensive"; break;
case TAR_OBJ_INV:
ptr = "object"; break;
default:
case TAR_IGNORE:
ptr = "generic"; break;
}
bprintf( buf, "&gTarget type: &b[&c%-10s&b] ", ptr );
i = skill_table[sn].minimum_position;
bprintf( buf, "&gPosition: &b[&c%s&b]&n\n\r",
flag_string( position_flags, &i ) );
bprintf( buf, "&gSpell Func.: &b[&c%-3s&b] ",
( skill_table[sn].spell_fun
&& skill_table[sn].spell_fun != spell_null )
? "yes" : "no" );
bprintf( buf, "&gGSN: &b[&c%-3s&b]&n\n\r",
skill_table[sn].pgsn ? "yes" : "no" );
bprintf( buf, "&gDelay: &b[&c%5ds&b] ",
(int)( skill_table[sn].beats / PULSE_PER_SECOND ) );
buffer_strcat( buf, "&gMana: " );
for( i = 0; i < MAGIC_MAX; ++i )
bprintf( buf, "%s%d&g/", magic_colour[i],
skill_table[sn].min_mana[i] );
bprintf( buf, "%d&n\n\r", skill_table[sn].min_mana[MAGIC_MAX] );
i = skill_table[sn].skill_type;
bprintf( buf, "&gType: &b[&c%s&b]&n\n\r",
flag_string( skill_type_flags, &i ) );
if( skill_table[sn].noun_damage && skill_table[sn].noun_damage[0] )
bprintf( buf, "&gDamage Verb: &w%s&n\n\r",
skill_table[sn].noun_damage );
if( skill_table[sn].msg_off && skill_table[sn].msg_off[0] )
bprintf( buf, "&gWear Off Msg: &w%s&n\n\r",
skill_table[sn].msg_off );
/* Format the level information like in const.c */
k = 0;
for( i = 0; i < MAX_CLASS; )
{
if( k >= AVAIL_CLASS )
k = MAX_CLASS - i - 1;
for( j = 0; j < k; ++j )
bprintf( buf, " " );
for( ; j < AVAIL_CLASS; ++j )
{
bprintf( buf, "&g%s: &c%3d&r%c ",
class_table[i].who_name,
skill_table[sn].skill_level[i],
(skill_table[sn].skill_level[i] > LEVEL_HERO) ? ' ' : '*' );
++i;
}
buffer_strcat( buf, "&n\n\r" );
if( i > AVAIL_CLASS )
k++;
}
}
send_to_char( buf->data, ch );
buffer_free( buf );
return;
}
void do_sset( CHAR_DATA *ch, const char *argument )
{
CHAR_DATA *rch;
CHAR_DATA *victim;
char arg1[MAX_INPUT_LENGTH];
char arg2[MAX_INPUT_LENGTH];
char arg3[MAX_INPUT_LENGTH];
int value;
int sn;
bool fAll;
rch = get_char( ch );
if( !authorized( rch, "sset" ) )
return;
argument = one_argument( argument, arg1 );
argument = one_argument( argument, arg2 );
one_argument( argument, arg3 );
if( arg1[0] == '\0' || arg2[0] == '\0' || arg3[0] == '\0' )
{
send_to_char( "Syntax: sset <victim> <skill> <value>\n\r", ch );
send_to_char( "or: sset <victim> all <value>\n\r", ch );
send_to_char( "Skill being any skill or spell.\n\r", ch );
return;
}
if( !( victim = get_char_world( ch, arg1 ) ) )
{
send_to_char( "They aren't here.\n\r", ch );
return;
}
if( IS_NPC( victim ) )
{
send_to_char( "Not on NPC's.\n\r", ch );
return;
}
if( ch->level <= victim->level && ch != victim )
{
send_to_char( "You may not sset your peer nor your superior.\n\r",
ch );
return;
}
fAll = !str_cmp( arg2, "all" );
sn = 0;
if( !fAll && ( sn = skill_lookup( arg2 ) ) < 0 )
{
send_to_char( "No such skill or spell.\n\r", ch );
return;
}
/*
* Snarf the value.
*/
if( !is_number( arg3 ) )
{
send_to_char( "Value must be numeric.\n\r", ch );
return;
}
value = atoi( arg3 );
if( value < 0 || value > ( get_trust( ch ) - 750 ) )
{
send_to_char( "Value range is 0 to 100.\n\r", ch );
return;
}
if( fAll )
{
if( get_trust( ch ) < L_MAS )
{
send_to_char( "Only Masters may sset all.\n\r", ch );
return;
}
for( sn = 0; sn < MAX_SKILL; sn++ )
{
if( skill_table[sn].name )
{
if( can_prac( victim, sn ) )
victim->pcdata->learned[sn] = value;
else
victim->pcdata->learned[sn] = 1;
}
}
}
else
{
victim->pcdata->learned[sn] = value;
}
return;
}
void do_mset( CHAR_DATA *ch, const char *argument )
{
CHAR_DATA *rch;
CHAR_DATA *victim;
char arg1[MAX_INPUT_LENGTH];
char arg2[MAX_INPUT_LENGTH];
char arg3[MAX_INPUT_LENGTH];
int value;
int max;
rch = get_char( ch );
if( !authorized( rch, "mset" ) )
return;
argument = one_argument( argument, arg1 );
argument = one_argument( argument, arg2 );
strcpy( arg3, argument );
if( arg1[0] == '\0' || arg2[0] == '\0' || arg3[0] == '\0' )
{
send_to_char( "Syntax: mset <victim> <field> <value>\n\r"
"or: mset <victim> <string> <value>\n\r\n\r"
"Field being one of:\n\r"
" str int wis dex con class sex race gold hp\n\r"
" move practice align thirst drunk full\n\r"
" level sublevel security qscore qtime multi\n\r"
" religion clan clanrank\n\r"
" magic<sphere> mana<sphere>\n\r"
"String being one of:\n\r"
" name short long title spec\n\r", ch );
return;
}
if( !( victim = get_char_world( ch, arg1 ) ) )
{
send_to_char( "They aren't here.\n\r", ch );
return;
}
/*
* Snarf the value (which need not be numeric).
*/
value = atoi_functions( arg3 );
/*
* Set something.
*/
if( !str_cmp( arg2, "class" ) )
{
if( value < 0 || value >= MAX_CLASS )
{
for( value = 0; value < MAX_CLASS; value++ )
{
if( !str_cmp( arg3, class_table[value].who_name )
|| !str_cmp( arg3, class_table[value].name ) )
break;
}
if( value >= MAX_CLASS )
{
send_to_char( "That isn't a class.\n\r", ch );
return;
}
victim->class = value;
return;
}
if( value == -1 && !IS_NPC( ch ) )
{
send_to_char( "-1 only on mobiles.\n\r", ch );
return;
}
victim->class = value;
return;
}
if( !str_cmp( arg2, "sex" ) )
{
if( IS_AFFECTED( victim, AFF_POLYMORPH ) )
{
send_to_char( "This person is affect by polymorph.n\r", ch );
send_to_char( "Try again later.\n\r", ch );
return;
}
if( value < 0 || value > 2 )
{
if( !str_cmp( arg3, "male" ) )
victim->sex = SEX_MALE;
else if( !str_cmp( arg3, "female" ) )
victim->sex = SEX_FEMALE;
else if( !str_cmp( arg3, "neuter" ) )
victim->sex = SEX_NEUTRAL;
else
send_to_char( "Sex range is 0 to 2.\n\r", ch );
return;
}
victim->sex = value;
return;
}
if( !str_cmp( arg2, "race" ) )
{
OBJ_DATA *wield;
OBJ_DATA *wield2;
int race;
if( IS_AFFECTED( victim, AFF_POLYMORPH ) )
{
send_to_char( "This person is affected by polymorph other.\n\r",
ch );
send_to_char( "Try again later.\n\r", ch );
return;
}
race = race_lookup( arg3 );
if( race < 0 )
{
send_to_char( "Invalid race.\n\r", ch );
return;
}
if( IS_SET( race_table[race].race_abilities, RACE_NPC_ONLY )
&& get_trust( ch ) < L_OVL )
{
send_to_char( "You may not set a race not available to PC's.\n\r",
ch );
return;
}
victim->race = race;
if( ( wield = get_eq_char( victim, WEAR_WIELD_R ) )
&& IS_SET( race_table[victim->race].race_abilities,
RACE_NO_WEAPON_WIELD ) )
{
act( "You drop $p.", victim, wield, NULL, TO_CHAR );
act( "$n drops $p.", victim, wield, NULL, TO_ROOM );
obj_from_char( wield );
obj_to_room( wield, victim->in_room );
}
if( ( wield2 = get_eq_char( victim, WEAR_WIELD_L ) )
&& IS_SET( race_table[victim->race].race_abilities,
RACE_NO_WEAPON_WIELD ) )
{
act( "You drop $p.", victim, wield2, NULL, TO_CHAR );
act( "$n drops $p.", victim, wield2, NULL, TO_ROOM );
obj_from_char( wield2 );
obj_to_room( wield2, victim->in_room );
}
return;
}
if( !str_cmp( arg2, "sublevel" ) )
{
if( value < 0 || value > victim->level )
{
send_to_char( "Sublevel range is 0 to victim's level.\n\r", ch );
return;
}
victim->sublevel = value;
return;
}
if( !str_cmp( arg2, "gold" ) )
{
victim->gold = value;
return;
}
if( !str_cmp( arg2, "hp" ) )
{
if( value < -10 || value > 1000000 )
{
send_to_char( "Hp range is -10 to 1 million hit points.\n\r", ch );
return;
}
if( victim->fighting && value < 0 )
{
send_to_char( "You cannot set a fighting person's hp below 0.\n\r",
ch );
return;
}
victim->max_hit = value;
return;
}
if( !str_prefix( "mana", arg2 ) )
{
int which;
if( value < 0 || value > 1000000 )
{
send_to_char( "Mana range is 0 to 1 million mana points.\n\r", ch );
return;
}
argument = &arg2[4];
while( isspace( *argument ) )
argument++;
if( !str_cmp( argument, "air" ) )
which = MAGIC_AIR;
else if( !str_cmp( argument, "earth" ) )
which = MAGIC_EARTH;
else if( !str_cmp( argument, "fire" ) )
which = MAGIC_FIRE;
else if( !str_cmp( argument, "spirit" ) )
which = MAGIC_SPIRIT;
else if( !str_cmp( argument, "water" ) )
which = MAGIC_WATER;
else
{
send_to_char( "Please specify which sphere, ie 'mana air'.\n\r", ch );
return;
}
victim->max_mana[which] = value;
return;
}
if( !str_cmp( arg2, "move" ) )
{
if( value < 0 || value > 1000000 )
{
send_to_char( "Move range is 0 to 1 million move points.\n\r", ch );
return;
}
victim->max_move = value;
return;
}
if( !str_cmp( arg2, "practice" ) )
{
if( value < 0 || value > 10000 )
{
send_to_char( "Practice range is 0 to 10,000 sessions.\n\r", ch );
return;
}
victim->practice = value;
return;
}
if( !str_cmp( arg2, "align" ) )
{
if( value < -1000 || value > 1000 )
{
send_to_char( "Alignment range is -1000 to 1000.\n\r", ch );
return;
}
victim->alignment = value;
return;
}
if( !IS_NPC( victim ) )
{
if( !str_cmp( arg2, "str" ) )
{
if( class_table[victim->class].attr_prime == APPLY_STR )
max = 50;
else
max = 40;
if( value < 3 || value > max )
{
charprintf( ch, "Strength range is 3 to %d.\n\r", max );
return;
}
victim->pcdata->perm_str = value;
return;
}
if( !str_cmp( arg2, "int" ) )
{
if( class_table[victim->class].attr_prime == APPLY_INT )
max = 50;
else
max = 40;
if( value < 3 || value > max )
{
charprintf( ch, "Intelligence range is 3 to %d.\n\r", max );
return;
}
victim->pcdata->perm_int = value;
return;
}
if( !str_cmp( arg2, "wis" ) )
{
if( class_table[victim->class].attr_prime == APPLY_WIS )
max = 50;
else
max = 40;
if( value < 3 || value > max )
{
charprintf( ch, "Wisdom range is 3 to %d.\n\r", max );
return;
}
victim->pcdata->perm_wis = value;
return;
}
if( !str_cmp( arg2, "dex" ) )
{
if( class_table[victim->class].attr_prime == APPLY_DEX )
max = 50;
else
max = 40;
if( value < 3 || value > max )
{
charprintf( ch, "Dexterity range is 3 to %d.\n\r", max );
return;
}
victim->pcdata->perm_dex = value;
return;
}
if( !str_cmp( arg2, "con" ) )
{
if( class_table[victim->class].attr_prime == APPLY_CON )
max = 50;
else
max = 40;
if( value < 3 || value > max )
{
charprintf( ch, "Constitution range is 3 to %d.\n\r", max );
return;
}
victim->pcdata->perm_con = value;
return;
}
if( !str_cmp( arg2, "multi" ) )
{
char classbuf[ MAX_INPUT_LENGTH ];
if( !str_cmp( argument, "all clear" ) )
{
victim->class = get_first_class( victim );
for( value = 0; value < AVAIL_CLASS; value++ )
victim->pcdata->multi_class[value] = CLASS_UNKNOWN;
send_to_char( "All multiclassing cleared.\n\r", ch );
return;
}
argument = one_argument( argument, classbuf );
for( value = 0; value < AVAIL_CLASS; value++ )
if( !str_cmp( classbuf, class_table[value].who_name )
|| !str_cmp( classbuf, class_table[value].name ) )
break;
if( value >= AVAIL_CLASS )
{
send_to_char( "You can't set multiclass for that class.\n\r", ch );
send_to_char( "mset multi all clear - clear all multiclassing.\n\r"
"mset multi [class] [level] - set class multiclass level.\n\r"
"[level] can be 'clear', 'aspire' or 'adept'.\n\r",
ch );
return;
}
if( !str_cmp( argument, "clear" ) )
{
if( victim->pcdata->multi_class[value] > CLASS_ADEPT )
{
send_to_char( "You can't clear first or second classes\n\r"
" use 'all clear' instead.\n\r", ch );
return;
}
victim->pcdata->multi_class[value] = CLASS_UNKNOWN;
if( victim->sublevel )
victim->sublevel = 0;
send_to_char( "Multi-class cleared.\n\r", ch );
return;
}
if( !str_cmp( argument, "aspire" ) )
{
if( get_aspire_class( victim ) >= 0 )
{
send_to_char( "You can't set that now.\n\r", ch );
return;
}
victim->pcdata->multi_class[value] = CLASS_ASPIRING;
send_to_char( "Aspiring set.\n\r", ch );
return;
}
if( !str_cmp( argument, "adept" ) )
{
if( victim->pcdata->multi_class[value] > CLASS_ADEPT )
{
send_to_char( "They are more than adept at that now.\n\r", ch );
return;
}
victim->pcdata->multi_class[value] = CLASS_ADEPT;
send_to_char( "Adept set.\n\r", ch );
return;
}
send_to_char( "You can only set clear, aspire or adept.\n\r", ch );
send_to_char( "'all clear' clears all classes.\n\r", ch );
return;
}
if( !str_cmp( arg2, "security" ) )
{
if( value < 0 || value > get_trust( ch ) / 20 - 40 )
{
send_to_char( "That is too high a trust for you to set.\n\r", ch );
return;
}
victim->pcdata->security = value;
return;
}
if( !str_cmp( arg2, "qscore" ) )
{
if( value < 0 || value > 10000 )
{
send_to_char( "Quest points between 0 and 10000 only.\n\r", ch );
return;
}
victim->pcdata->quest->score = value;
return;
}
if( !str_cmp( arg2, "qtime" ) )
{
if( value < 0 || value > 60 )
{
send_to_char( "Time only from 0 to 60 minutes.\n\r", ch );
return;
}
victim->pcdata->quest->time = value;
return;
}
if( !str_prefix( "magic", arg2 ) )
{
int which;
if( value < 0 || value > 100 )
{
send_to_char( "Magic range is 0 to 100 points.\n\r", ch );
return;
}
argument = &arg2[5];
while( isspace( *argument ) )
argument++;
if( !str_cmp( argument, "air" ) )
which = MAGIC_AIR;
else if( !str_cmp( argument, "earth" ) )
which = MAGIC_EARTH;
else if( !str_cmp( argument, "fire" ) )
which = MAGIC_FIRE;
else if( !str_cmp( argument, "spirit" ) )
which = MAGIC_SPIRIT;
else if( !str_cmp( argument, "water" ) )
which = MAGIC_WATER;
else
{
send_to_char( "Please specify which sphere, ie 'mana air'.\n\r", ch );
return;
}
victim->pcdata->perm_magic[which] = value;
return;
}
if( !str_cmp( arg2, "thirst" ) )
{
if( ( value < 0 || value > 250 )
&& get_trust( victim ) < LEVEL_IMMORTAL )
{
send_to_char( "Thirst range is 0 to 250.\n\r", ch );
return;
}
else if( value < -1 || value > 250 )
{
send_to_char( "Thirst range is -1 to 250.\n\r", ch );
return;
}
victim->pcdata->condition[COND_THIRST] = value * 10;
return;
}
if( !str_cmp( arg2, "drunk" ) )
{
if( value < 0 || value > 100 )
{
send_to_char( "Drunk range is 0 to 100.\n\r", ch );
return;
}
victim->pcdata->condition[COND_DRUNK] = value * 10;
return;
}
if( !str_cmp( arg2, "full" ) )
{
if( ( value < 0 || value > 250 )
&& get_trust( victim ) < LEVEL_IMMORTAL )
{
send_to_char( "Full range is 0 to 250.\n\r", ch );
return;
}
else if( value < -1 || value > 250 )
{
send_to_char( "Full range is -1 to 250.\n\r", ch );
return;
}
victim->pcdata->condition[COND_FULL] = value * 10;
return;
}
if( !str_cmp( arg2, "clan" ) )
{
CLAN_DATA *clan;
if( !str_cmp( arg3, "none" ) )
{
if( is_clan( victim ) )
remove_from_clan( victim );
send_to_char( "Victim removed from clan, Ok.\n\r", ch );
return;
}
if( !( clan = clan_lookup( arg3 ) ) )
{
send_to_char( "That clan doesn't exist.\n\r", ch );
return;
}
if( victim->pcdata->clan == clan )
return;
if( is_clan( victim ) )
remove_from_clan( victim );
add_to_clan( victim, clan, RANK_CLANSMAN );
send_to_char( "Clan set.\n\r", ch );
return;
}
if( !str_cmp( arg2, "religion" ) )
{
RELIGION_DATA *religion;
if ( !( religion = religion_lookup( arg3 ) ) )
{
send_to_char( "That religion doesn't exist.\n\r", ch );
return;
}
victim->pcdata->religion = religion;
send_to_char( "Religion set.\n\r", ch );
return;
}
if( !str_cmp( arg2, "clanrank" ) )
{
CLAN_DATA *clan;
if( !( clan = victim->pcdata->clan ) )
{
send_to_char( "They don't belong to a clan.\n\r", ch );
return;
}
if( value < RANK_EXILED )
{
remove_from_clan( victim );
send_to_char( "Ok.\n\r", ch );
return;
}
if( value > RANK_OVERLORD )
{
charprintf( ch, "Range is from %d to %d.\n\r",
RANK_NONE, RANK_OVERLORD );
return;
}
if( victim->pcdata->clan_rank == value )
{
send_to_char( "You can't change that person's rank.\n\r", ch );
return;
}
switch( value )
{
default:
break;
case RANK_CLANHERO:
if( clan->clanheros >= clan->members / 3 )
{
charprintf(
ch, "You may have only 1 %s per 3 %s.\n\r",
rank_name( RANK_CLANHERO, clan->clan_type ),
rank_name( RANK_CLANSMAN, clan->clan_type ) );
return;
}
break;
case RANK_CHIEFTAIN:
if( clan->members < 10 )
{
charprintf(
ch, "You need to have 9 %ss before you can have a %s.\n\r",
rank_name( RANK_CLANHERO, clan->clan_type ),
rank_name( RANK_CHIEFTAIN, clan->clan_type ) );
return;
}
break;
case RANK_OVERLORD:
if( clan->overlord != NULL && clan->overlord[0] != '\0' )
{
send_to_char( "The clan already has a leader.\n\r", ch );
return;
}
break;
}
remove_from_clan( victim );
add_to_clan( victim, clan, value );
send_to_char( "Clan rank set.\n\r", ch );
return;
}
if( !str_cmp( arg2, "title" ) )
{
set_title( victim, arg3 );
return;
}
}
else /* Mobiles only */
{
if( !str_cmp( arg2, "level" ) )
{
if( value < 0 || value > MAX_LEVEL )
{
send_to_char( "Level range is 0 to hero.\n\r", ch );
return;
}
victim->level = value;
return;
}
if( !str_cmp( arg2, "name" ) )
{
if( longstring( ch, arg3 ) )
return;
free_string( victim->name );
victim->name = str_dup( arg3 );
return;
}
if( !str_cmp( arg2, "spec" ) )
{
if( ( victim->spec_fun = spec_lookup( arg3 ) ) == 0 )
{
send_to_char( "No such spec fun.\n\r", ch );
return;
}
return;
}
}
if( !str_cmp( arg2, "short" ) )
{
if( longstring( ch, arg3 ) )
return;
free_string( victim->short_descr );
victim->short_descr = str_dup( arg3 );
return;
}
if( !str_cmp( arg2, "long" ) )
{
if( longstring( ch, arg3 ) )
return;
free_string( victim->long_descr );
if( str_cmp( arg3, "clear" ) )
{
strcat( arg3, "\n\r" );
victim->long_descr = str_dup( arg3 );
}
else
victim->long_descr = str_dup( "" );
return;
}
/*
* Generate usage message.
*/
do_mset( ch, "" );
return;
}
void do_oset( CHAR_DATA *ch, const char *argument )
{
OBJ_DATA *obj;
CHAR_DATA *rch;
char arg1[MAX_INPUT_LENGTH];
char arg2[MAX_INPUT_LENGTH];
char arg3[MAX_INPUT_LENGTH];
int value;
rch = get_char( ch );
if( !authorized( rch, "oset" ) )
return;
argument = one_argument( argument, arg1 );
argument = one_argument( argument, arg2 );
strcpy( arg3, argument );
if( arg1[0] == '\0' || arg2[0] == '\0' || arg3[0] == '\0' )
{
send_to_char( "Syntax: oset <object> <field> <value>\n\r", ch );
send_to_char( "or: oset <object> <string> <value>\n\r", ch );
send_to_char( "\n\r", ch );
send_to_char( "Field being one of:\n\r", ch );
send_to_char( " value0 value1 value2 value3 required\n\r", ch );
send_to_char( " extra wear level weight cost timer\n\r", ch );
send_to_char( " imptimer condition\n\r", ch );
send_to_char( "\n\r", ch );
send_to_char( "String being one of:\n\r", ch );
send_to_char( " name short long ed action\n\r", ch );
return;
}
if( !( obj = get_obj_world( ch, arg1 ) ) )
{
send_to_char( "Nothing like that in hell, earth, or heaven.\n\r", ch );
return;
}
/*
* Snarf the value ( which need not be numeric ).
*/
value = atoi_functions( arg3 );
/*
* Set something.
*/
if( !str_cmp( arg2, "value0" ) || !str_cmp( arg2, "v0" ) )
{
obj->value[0] = value;
return;
}
if( !str_cmp( arg2, "value1" ) || !str_cmp( arg2, "v1" ) )
{
obj->value[1] = value;
return;
}
if( !str_cmp( arg2, "value2" ) || !str_cmp( arg2, "v2" ) )
{
obj->value[2] = value;
return;
}
if( !str_cmp( arg2, "value3" ) || !str_cmp( arg2, "v3" ) )
{
obj->value[3] = value;
return;
}
if( !str_cmp( arg2, "extra" ) )
{
if( !str_cmp( arg3, "clear" ) )
{
obj->extra_flags = 0;
send_to_char( "Object extra flags cleared.\n\r", ch );
}
else if( flag_value( NULL, extra_flags, arg3 ) != NO_FLAG )
{
TOGGLE_BIT( obj->extra_flags, flag_value( NULL, extra_flags, arg3 ) );
send_to_char( "Object extra flag toggled.\n\r", ch );
}
else
{
obj->extra_flags = value;
send_to_char( "Object extra flags set.\n\r", ch );
}
return;
}
if( !str_cmp( arg2, "wear" ) )
{
if( !str_cmp( arg3, "clear" ) )
{
obj->wear_flags = 0;
send_to_char( "Object wear flags cleared.\n\r", ch );
}
else if( flag_value( NULL, wear_flags, arg3 ) != NO_FLAG )
{
TOGGLE_BIT( obj->wear_flags, flag_value( NULL, wear_flags, arg3 ) );
send_to_char( "Object wear flag toggled.\n\r", ch );
}
else
{
obj->wear_flags = value;
send_to_char( "Object wear flags set.\n\r", ch );
}
return;
}
if( !str_cmp( arg2, "level" ) )
{
obj->level = value;
return;
}
if( !str_cmp( arg2, "weight" ) )
{
weight_change_object( obj, obj->weight - value );
return;
}
if( !str_cmp( arg2, "cost" ) )
{
obj->cost = value;
send_to_char( "Cost set.\n\r", ch );
return;
}
if( !str_cmp( arg2, "timer" ) )
{
if( value <= 0 )
strip_events( &obj->events, evn_obj_decay );
else
set_timer( obj, value * PULSE_PER_SECOND );
send_to_char( "Timer set.\n\r", ch );
return;
}
if( !str_cmp( arg2, "imptimer" ) )
{
if( value <= 0 )
strip_events( &obj->events, evn_imp_grab );
else
create_obj_event( obj, evn_imp_grab,
value * PULSE_PER_SECOND );
send_to_char( "Imp timer set.\n\r", ch );
return;
}
if( !str_cmp( arg2, "required" ) )
{
if( ( value <= 0 || value >= MAX_SKILL )
&& skill_lookup( arg3 ) <= 0 )
{
send_to_char( "Invalid skill no.\n\r", ch );
return;
}
obj->required_skill = ( value <= 0 || value >= MAX_SKILL )
? skill_lookup( arg3 ) : value;
send_to_char( "Required skill set.\n\r", ch );
return;
}
if( !str_cmp( arg2, "condition" ) )
{
if( value <= 0 || value > 200 )
{
send_to_char( "Invalid condition.\n\r", ch );
return;
}
obj->condition = value * 10;
send_to_char( "Item condition set.\n\r", ch );
return;
}
if( !str_cmp( arg2, "name" ) )
{
if( longstring( ch, arg3 ) )
return;
free_string( obj->name );
obj->name = str_dup( arg3 );
send_to_char( "Object name set.\n\r", ch );
return;
}
if( !str_cmp( arg2, "short" ) )
{
if( longstring( ch, arg3 ) )
return;
free_string( obj->short_descr );
obj->short_descr = str_dup( arg3 );
send_to_char( "Object short set.\n\r", ch );
return;
}
if( !str_cmp( arg2, "long" ) )
{
if( longstring( ch, arg3 ) )
return;
strcat( arg3, "\n\r" );
free_string( obj->description );
obj->description = str_dup( arg3 );
send_to_char( "Object long description set.\n\r", ch );
return;
}
if( !str_cmp( arg2, "action" ) )
{
if( longstring( ch, arg3 ) )
return;
strcat( arg3, "\n\r" );
free_string( obj->action );
obj->action = str_dup( arg3 );
send_to_char( "Object action description set.\n\r", ch );
return;
}
if( !str_cmp( arg2, "ed" ) )
{
EXTRA_DESCR_DATA *ed;
for( ed = obj->extra_descr; ed; ed = ed->next )
{
if( is_name( arg3, ed->keyword ) )
break;
}
if( !ed )
{
ed = new_extra_descr( );
ed->keyword = str_dup( arg3 );
ed->description = &str_empty[0];
ed->next = obj->extra_descr;
obj->extra_descr = ed;
}
string_edit( ch, &ed->description );
return;
}
/*
* Generate usage message.
*/
do_oset( ch, "" );
return;
}
void do_users( CHAR_DATA *ch, const char *argument )
{
CHAR_DATA *rch;
DESCRIPTOR_DATA *d;
char buf[MAX_STRING_LENGTH * 2];
char buf2[MAX_STRING_LENGTH];
int count;
rch = get_char( ch );
if( !authorized( rch, "users" ) )
return;
count = 0;
buf[0] = '\0';
buf2[0] = '\0';
for( d = descriptor_list; d; d = d->next )
{
if( d->character && can_see( ch, d->character ) )
{
count++;
sprintf( buf + strlen( buf ), "[%3d : %-10.10s] %12s : %s\n\r",
d->descriptor, d->interpreter->name,
d->original ? d->original->name :
d->character ? d->character->name : "(none)",
d->host );
}
else if( !d->character )
{
count++;
sprintf( buf + strlen( buf ),
"[%3d : %-10.10s] *Anonymous* : %s\n\r",
d->descriptor, d->interpreter->name,
d->host );
}
}
sprintf( buf2, "%d user%s\n\r", count, count == 1 ? "" : "s" );
strcat( buf, buf2 );
send_to_char( buf, ch );
return;
}
/*
* Thanks to Grodyn for pointing out bugs in this function.
*/
void do_force( CHAR_DATA *ch, const char *argument )
{
CHAR_DATA *rch;
char arg[MAX_INPUT_LENGTH];
int trust;
int cmd;
rch = get_char( ch );
if( !authorized( rch, "force" ) )
return;
argument = one_argument( argument, arg );
if( arg[0] == '\0' || argument[0] == '\0' )
{
send_to_char( "Force whom to do what?\n\r", ch );
return;
}
/*
* Look for command in command table.
*/
trust = get_trust( ch );
for( cmd = 0; cmd_table[cmd].name[0] != '\0'; cmd++ )
{
if( argument[0] == cmd_table[cmd].name[0]
&& !str_prefix( argument, cmd_table[cmd].name )
&& ( cmd_table[cmd].level > trust ) )
{
send_to_char( "You can't even do that yourself!\n\r", ch );
return;
}
}
if( !str_cmp( arg, "all" ) )
{
CHAR_DATA *vch;
for( vch = char_list; vch; vch = vch->next )
{
if( vch->deleted )
continue;
if( !IS_NPC( vch ) && get_trust( vch ) < get_trust( ch ) )
{
act( "$n forces you to '$t'.", ch, argument, vch, TO_VICT );
interpret( vch, argument );
}
}
}
else
{
CHAR_DATA *victim;
if( !( victim = get_char_world( ch, arg ) ) )
{
send_to_char( "They aren't here.\n\r", ch );
return;
}
if( victim == ch )
{
send_to_char( "Feeling a little out of control?\n\r", ch );
return;
}
if( get_trust( victim ) >= get_trust( ch ) )
{
send_to_char( "Maybe if you asked nicely...\n\r", ch );
return;
}
act( "$n forces you to '$t'.", ch, argument, victim, TO_VICT );
interpret( victim, argument );
}
send_to_char( "Ok.\n\r", ch );
return;
}
/*
* Thanks to Grodyn for pointing out bugs in this function.
*/
void do_doas( CHAR_DATA *ch, const char *argument )
{
CHAR_DATA *rch;
CHAR_DATA *victim;
DESCRIPTOR_DATA *orig;
char arg[MAX_INPUT_LENGTH];
int trust;
int cmd;
rch = get_char( ch );
if( !authorized( rch, "doas" ) )
return;
argument = one_argument( argument, arg );
if( arg[0] == '\0' || argument[0] == '\0' )
{
send_to_char( "Doas who exactly what?\n\r", ch );
return;
}
if( !( victim = get_char_world( ch, arg ) ) )
{
send_to_char( "They aren't here.\n\r", ch );
return;
}
if( victim == ch )
{
send_to_char( "Aye aye, right away!\n\r", ch );
return;
}
if( get_trust( victim ) >= get_trust( ch ) )
{
send_to_char( "Do it yourself!\n\r", ch );
return;
}
one_argument( argument, arg );
if( !str_cmp( arg, "quit" ) )
{
send_to_char( "Sorry, no can do, that is _bad_.\n\r", ch );
return;
}
/*
* Look for command in command table.
*/
trust = get_trust( ch );
for( cmd = 0; cmd_table[cmd].name[0] != '\0'; cmd++ )
{
if( arg[0] == cmd_table[cmd].name[0]
&& !str_prefix( arg, cmd_table[cmd].name )
&& ( cmd_table[cmd].level > trust ) )
{
send_to_char( "You can't even do that yourself!\n\r", ch );
return;
}
}
act( "$n assumes control, you type '$t'.", ch, argument, victim, TO_VICT );
orig = victim->desc;
victim->desc = ch->desc;
ch->desc = NULL;
interpret( victim, argument );
ch->desc = victim->desc;
victim->desc = orig;
return;
}
/*
* New routines by Dionysos.
*
* Security fix (low priority) by Symposium.
*
* Wizinvissed immortals would show their presence by the light that they
* leave in a room, as well as the change in the nplayer count. This could
* be used by some to detect them, hence wizinvis is applied while the
* immortal is not in any room, wizinvissed immortals do not affect light.
* Changes in char_to_room, char_from_room and do_visible.
*/
void do_invis( CHAR_DATA *ch, const char *argument )
{
ROOM_INDEX_DATA *room = ch->in_room;
if( IS_NPC( ch ) )
return;
if( !authorized( ch, "wizinvis" ) )
return;
if( xIS_SET( ch->act, PLR_WIZINVIS ) )
{
char_from_room( ch );
xREMOVE_BIT( ch->act, PLR_WIZINVIS );
char_to_room( ch, room );
send_to_char( "You slowly fade back into existence.\n\r", ch );
act( "$n slowly fades into existence.", ch, NULL, NULL, TO_ROOM );
}
else
{
char_from_room( ch );
xSET_BIT( ch->act, PLR_WIZINVIS );
char_to_room( ch, room );
send_to_char( "You slowly vanish into thin air.\n\r", ch );
act( "$n slowly fades into thin air.", ch, NULL, NULL, TO_ROOM );
}
return;
}
void do_holylight( CHAR_DATA *ch, const char *argument )
{
if( IS_NPC( ch ) )
return;
if( !authorized( ch, "holylight" ) )
return;
if( xIS_SET( ch->act, PLR_HOLYLIGHT ) )
{
xREMOVE_BIT( ch->act, PLR_HOLYLIGHT );
send_to_char( "Holy light mode off.\n\r", ch );
}
else
{
xSET_BIT( ch->act, PLR_HOLYLIGHT );
send_to_char( "Holy light mode on.\n\r", ch );
}
return;
}
/*
* Wizify and Wizbit sent in by M. B. King
*/
void do_wizify( CHAR_DATA *ch, const char *argument )
{
CHAR_DATA *rch;
CHAR_DATA *victim;
char arg1[MAX_INPUT_LENGTH];
rch = get_char( ch );
if( !authorized( rch, "wizify" ) )
return;
one_argument( argument, arg1 );
if( arg1[0] == '\0' )
{
send_to_char( "Syntax: wizify <name>\n\r", ch );
return;
}
if( !( victim = get_char_world( ch, arg1 ) ) )
{
send_to_char( "They aren't here.\n\r", ch );
return;
}
if( IS_NPC( victim ) )
{
send_to_char( "Not on mobs.\n\r", ch );
return;
}
if( !xIS_SET( victim->act, PLR_WIZBIT ) )
{
xSET_BIT( victim->act, PLR_WIZBIT );
act( "$N wizified.", ch, NULL, victim, TO_CHAR );
act( "$n has wizified you!", ch, NULL, victim, TO_VICT );
wiznetf( ch, WIZ_MISC, get_trust( ch ), "%s has wizified %s.",
rch->name, victim->name );
}
else
{
xREMOVE_BIT( victim->act, PLR_WIZBIT );
act( "$N dewizzed.", ch, NULL, victim, TO_CHAR );
act( "$n has dewizzed you!", ch, NULL, victim, TO_VICT );
wiznetf( ch, WIZ_MISC, get_trust( ch ), "%s has dewizzed %s.",
rch->name, victim->name );
}
do_save( victim, "" );
return;
}
/*
* Idea from Talen of Vego's do_where command
*/
void do_owhere( CHAR_DATA *ch, const char *argument )
{
OBJ_DATA *obj;
OBJ_DATA *in_obj;
CHAR_DATA *rch;
char arg[MAX_INPUT_LENGTH];
int count;
BUFFER *buf;
int obj_counter = 1;
bool found = FALSE;
rch = get_char( ch );
if( !authorized( rch, "owhere" ) )
return;
if( argument[0] == '\0' )
{
send_to_char( "Syntax: owhere <object>.\n\r", ch );
return;
}
buf = buffer_new( MAX_STRING_LENGTH );
count = number_argument( argument, arg );
for( obj = object_list; obj; obj = obj->next )
{
if( !can_see_obj( ch, obj ) || !is_obj_name( obj, arg ) )
continue;
obj_counter++;
if( --count > 0 )
continue;
found = TRUE;
for( in_obj = obj; in_obj->in_obj;
in_obj = in_obj->in_obj )
;
if( in_obj->carried_by )
{
if( !can_see( ch, in_obj->carried_by ) )
continue;
bprintf( buf, "&b[&r%2d&b] &g%s&n&w carried by "
"&g%s&n&w at &b[&r%4d&b]&n&w.&n\n\r",
obj_counter, obj->short_descr,
PERS( in_obj->carried_by, ch ),
in_obj->carried_by->in_room->vnum );
}
else
{
bprintf( buf, "&b[&r%2d&b] &g%s&n&w in "
"&g%s&n&w at &b[&r%4d&b]&n&w.&n\n\r", obj_counter,
obj->short_descr, ( !in_obj->in_room ) ?
"somewhere" : in_obj->in_room->name,
( !in_obj->in_room ) ?
0 : in_obj->in_room->vnum );
}
/*
* Only see the first 101
*/
if( obj_counter > 100 )
break;
}
if( !found )
send_to_char( "Nothing like that in hell, earth, or heaven.\n\r", ch );
else
send_to_char( buf->data, ch );
buffer_free( buf );
return;
}
void do_numlock( CHAR_DATA *ch, const char *argument ) /* By Globi */
{
CHAR_DATA *rch;
char buf[MAX_STRING_LENGTH];
int temp;
rch = get_char( ch );
if( !authorized( rch, "numlock" ) )
return;
temp = atoi( argument );
if( argument[0] == '\0' ) /* Prints out the current value */
{
sprintf( buf, "Current numlock setting is: %d.\n\r", SysInfo->numlock );
send_to_char( buf, ch );
return;
}
if( ( temp < 0 ) || ( temp > LEVEL_HERO ) )
{
sprintf( buf, "Level must be between 0 and %d.\n\r", LEVEL_HERO );
send_to_char( buf, ch );
return;
}
/* Only set SysInfo->numlock if arg supplied and within range */
SysInfo->numlock = temp;
if( SysInfo->numlock != 0 )
{
sprintf( buf, "Game numlocked to levels %d and below.\n\r", SysInfo->numlock );
send_to_char( buf, ch );
}
else
send_to_char( "Game now open to all levels.\n\r", ch );
wiznetf( ch, WIZ_MISC, get_trust( ch ), "%s has set numlock to %d.",
rch->name, SysInfo->numlock );
return;
}
void do_newlock( CHAR_DATA *ch, const char *argument )
{
CHAR_DATA *rch;
char buf[MAX_STRING_LENGTH];
rch = get_char( ch );
if( !authorized( rch, "newlock" ) )
return;
if( SysInfo->numlock != 0 && get_trust( ch ) < L_SEN )
{
send_to_char( "You may not change the current numlock setting\n\r",
ch );
sprintf( buf, "Game numlocked to levels %d and below.\n\r", SysInfo->numlock );
send_to_char( buf, ch );
return;
}
if( SysInfo->numlock != 0 )
{
sprintf( buf, "Game numlocked to levels %d and below.\n\r", SysInfo->numlock );
send_to_char( buf, ch );
send_to_char( "Changing to: ", ch );
}
SysInfo->numlock = 1;
send_to_char( "Game locked to new characters.\n\r", ch );
wiznetf( ch, WIZ_MISC, get_trust( ch ), "%s has set numlock to %d.",
rch->name, SysInfo->numlock );
return;
}
void do_sstime( CHAR_DATA *ch, const char *argument )
{
CHAR_DATA *rch;
int number;
rch = get_char( ch );
if( !authorized( rch, "sstime" ) )
return;
if( !str_cmp( argument, "reboot" ) )
{
TOGGLE_BIT( SysInfo->flags, SYSINFO_REBOOT );
charprintf( ch, "Reboot is %s.\n\r",
IS_SET( SysInfo->flags, SYSINFO_REBOOT ) ? "on" : "off" );
wiznetf( ch, WIZ_MISC, get_trust( ch ),
"%s has just changed autoreboot settings.", rch->name );
return;
}
number = atoi_special( argument );
if( argument[0] == '\0' || number < 0 )
{
if( SysInfo->down_time > 0 )
{
charprintf( ch, "1st warning: %d minutes (%d seconds).\n\r",
UMAX( ( (int)SysInfo->down_time - (int)current_time - 225 ) / 60, 0 ),
UMAX( ( (int)SysInfo->down_time - (int)current_time - 225 ), 0 ) );
charprintf( ch, "2nd warning: %d minutes (%d seconds).\n\r",
UMAX( ( (int)SysInfo->down_time - (int)current_time - 150 ) / 60, 0 ),
UMAX( ( (int)SysInfo->down_time - (int)current_time - 150 ), 0 ) );
charprintf( ch, "%s%d minutes (%d seconds).\n\r",
IS_SET( SysInfo->flags, SYSINFO_REBOOT )
? "Reboot: " : "Shutdown: ",
UMAX( ( (int)SysInfo->down_time - (int)current_time ) / 60, 0 ),
UMAX( ( (int)SysInfo->down_time - (int)current_time ), 0 ) );
}
else
send_to_char( "Automatic reboot/shutdown: off.\n\r", ch );
return;
}
/*
Set something
*/
if( number > 0 )
{
SysInfo->down_time = current_time + ( number * 60 );
charprintf( ch, "1st warning: %d minutes (%d seconds).\n\r",
UMAX( ( (int)SysInfo->down_time - (int)current_time - 225 ) / 60, 0 ),
UMAX( ( (int)SysInfo->down_time - (int)current_time - 225 ), 0 ) );
charprintf( ch, "2nd warning: %d minutes (%d seconds).\n\r",
UMAX( ( (int)SysInfo->down_time - (int)current_time - 150 ) / 60, 0 ),
UMAX( ( (int)SysInfo->down_time - (int)current_time - 150 ), 0 ) );
charprintf( ch, "%s%d minutes (%d seconds).\n\r",
IS_SET( SysInfo->flags, SYSINFO_REBOOT )
? "Reboot: " : "Shutdown: ",
UMAX( ( (int)SysInfo->down_time - (int)current_time ) / 60, 0 ),
UMAX( ( (int)SysInfo->down_time - (int)current_time ), 0 ) );
wiznetf( ch, WIZ_MISC, get_trust( ch ),
"%s has changed reboot/shutdown time.", rch->name );
}
else
{
SysInfo->down_time = 0;
charprintf( ch, "Auto%s is now off.\n\r",
IS_SET( SysInfo->flags, SYSINFO_REBOOT )
? "reboot" : "shutdown" );
wiznetf( ch, WIZ_MISC, get_trust( ch ),
"%s removed autoreboot/shutdown.", rch->name );
}
return;
}
/*
* Modifications contributed by
* Canth (phule@xs4all.nl)
* Maniac (v942346@si.hhs.nl)
* Vego (v942429@si.hhs.nl)
*/
void do_imtlset( CHAR_DATA *ch, const char *argument )
{
CHAR_DATA *rch;
CHAR_DATA *victim;
char arg1[MAX_INPUT_LENGTH];
char buf[MAX_STRING_LENGTH];
char buf1[MAX_STRING_LENGTH];
bool fAll = FALSE;
int cmd;
int col = 0;
rch = get_char( ch );
if( !authorized( rch, "imtlset" ) )
return;
argument = one_argument( argument, arg1 );
if( arg1[0] == '\0' )
{
send_to_char( "Syntax: imtlset <victim> +|- <immortal skill>\n\r", ch );
send_to_char( "or: imtlset <victim> +|- all\n\r", ch );
send_to_char( "or: imtlset <victim>\n\r", ch );
return;
}
if( !( victim = get_char_world( rch, arg1 ) ) )
{
send_to_char( "They aren't here.\n\r", ch );
return;
}
if( IS_NPC( victim ) )
{
send_to_char( "Not on NPC's.\n\r", ch );
return;
}
if( rch->level <= victim->level && rch != victim )
{
send_to_char( "You may not imtlset your peer nor your superior.\n\r",
ch );
return;
}
if( argument[0] == '+' || argument[0] == '-' )
{
buf[0] = '\0';
argument = one_argument( argument, arg1 );
if( !str_cmp( argument, "all" ) )
{
fAll = TRUE;
}
if( arg1[0] == '+' )
{
if( !fAll )
{
if( victim->pcdata->immskll )
sprintf( buf, "%s", victim->pcdata->immskll );
if( is_name( argument, victim->pcdata->immskll ) )
{
send_to_char( "That skill has already been set.\n\r", ch );
return;
}
}
for( cmd = 0; cmd_table[cmd].name[0] != '\0'; cmd++ )
{
if( cmd_table[cmd].level > get_trust( rch ) )
continue;
if( fAll )
{
if( cmd_table[cmd].level <= get_trust( victim )
&& cmd_table[cmd].level >= LEVEL_HERO
&& str_infix(
cmd_table[cmd].name,
"reboo sla shutdow copyove punload : ] ? <" ) )
{
strcat( buf, cmd_table[cmd].name );
strcat( buf, " " );
}
}
else /* Add only one skill */
{
if( !str_cmp( argument, cmd_table[cmd].name ) )
break;
}
}
if( !fAll )
{
if( cmd_table[cmd].name[0] == '\0'
|| is_name( argument, "reboo sla shutdow copyove punload : ] ? <" ) )
{
send_to_char( "That is not an immskill.\n\r", ch );
return;
}
strcat( buf, argument );
strcat( buf, " " ); /* This line is really not needed but
* makes pfile look nice - Kahn */
}
}
else /* arg1[0] == '-' */
{
if( fAll )
{
free_string( victim->pcdata->immskll );
victim->pcdata->immskll = str_dup( "" );
send_to_char( "All Immskills have been deleted.\n\r", ch );
return;
}
else /* Remove one skill */
{
const char *buf2 = &buf1[0];
char arg3[MAX_INPUT_LENGTH];
char arg2[MAX_INPUT_LENGTH];
one_argument( argument, arg2 );
strcpy( buf1, victim->pcdata->immskll );
if( !is_name( arg2, victim->pcdata->immskll ) )
{
send_to_char( "That Immskill is not set.\n\r", ch );
return;
}
while( buf2[0] != '\0' )
{
buf2 = one_argument( buf2, arg3 );
if( str_cmp( arg3, arg2 ) )
{
strcat( buf, arg3 );
strcat( buf, " " );
}
}
}
}
free_string( victim->pcdata->immskll );
victim->pcdata->immskll = str_dup( buf );
wiznetf( ch, WIZ_MISC, get_trust( ch ),
"%s has set/removed some imm skills for %s.",
rch->name, victim->name );
}
sprintf( buf, "Immortal skills set for %s:\n\r", victim->name );
send_to_char( buf, ch );
buf1[0] = '\0';
for( cmd = 0; cmd_table[cmd].name[0] != '\0'; cmd++ )
{
if( cmd_table[cmd].level < LEVEL_HERO
|| !is_name( cmd_table[cmd].name, victim->pcdata->immskll ) )
continue;
sprintf( buf, "%-12s", cmd_table[cmd].name );
strcat( buf1, buf );
if( ++col % 6 == 0 )
strcat( buf1, "\n\r" );
}
if( col % 6 != 0 )
strcat( buf1, "\n\r" );
send_to_char( buf1, ch );
return;
}
void do_grant( CHAR_DATA *ch, const char *argument )
{
char arg1[MAX_INPUT_LENGTH];
CHAR_DATA *victim;
CHAR_DATA *rch;
int num;
rch = get_char( ch );
if( !authorized( rch, "grant" ) )
return;
argument = one_argument( argument, arg1 );
if( argument[0] == '\0' || !is_number( argument ) )
{
send_to_char( "Usage: grant <character> <experience>\n\r", ch );
return;
}
if( !( victim = get_char_world( ch, arg1 ) ) )
{
send_to_char( "You can't find that person.\n\r", ch );
return;
}
num = atoi_special( argument ) * 100;
sprintf( arg1, "%s has granted you %d experience!\n\r",
ch->name, num / 100 );
send_to_char( arg1, victim );
send_to_char( "Ok.\n\r", ch );
gain_exp( victim, num );
wiznetf( ch, WIZ_LEVELS, get_trust( ch ),
"%s has just granted %s %d experience.",
rch->name, victim->name, num / 100 );
return;
}
void do_avatar( CHAR_DATA *ch, const char *argument )
{
CHAR_DATA *rch;
char buf[MAX_INPUT_LENGTH];
int num;
char arg[MAX_INPUT_LENGTH];
rch = get_char( ch );
if( !authorized( rch, "avatar" ) )
return;
argument = one_argument( argument, arg );
if( arg[0] != '\0' && !is_number( arg ) )
{
send_to_char( "Usage: avatar <level> [special]\n\r", ch );
return;
}
if( arg[0] == '\0' )
{
if( ch->level == get_trust( ch ) )
num = LEVEL_HERO;
else
num = get_trust( ch );
}
else
num = URANGE( 1, atoi( arg ), get_trust( ch ) );
sprintf( buf, "You are now level %d!\n\r", num );
send_to_char( buf, ch );
if( num != atoi( arg ) )
{
send_to_char( " (Note: the range is 1 to your trust level)\n\r", ch );
}
ch->level = num;
if( !str_cmp( argument, "special" ) )
{
int i;
ch->max_hit -= get_max_hit( ch ) - 20;
for( i = 0; i < MAGIC_MAX; ++i )
ch->max_mana[i] -= get_max_mana( ch, i ) - 50
- class_table[ch->class].fMana;
ch->max_move -= get_max_move( ch ) - 100;
ch->practice = 0;
for( ; num > 1; num-- )
{
advance_level( ch, TRUE );
}
ch->hit = ch->max_hit;
for( i = 0; i < MAGIC_MAX; ++i )
ch->mana[i] = ch->max_mana[i];
ch->move = ch->max_move;
}
wiznetf( ch, WIZ_MISC, get_trust( ch ), "%s has avatarred to level %d.",
ch->name, ch->level );
return;
}
void do_unaffect( CHAR_DATA *ch, const char *argument )
{
AFFECT_DATA *paf;
OBJ_DATA *obj;
CHAR_DATA *victim;
CHAR_DATA *rch;
rch = get_char( ch );
if( !authorized( rch, "unaffect" ) )
return;
if( argument[0] == '\0' )
{
send_to_char( "Usage: unaffect <character>\n\r", rch );
return;
}
victim = get_char_world( rch, argument );
if( !victim || IS_NPC( victim ) )
{
send_to_char( "They aren't here.\n\r", rch );
return;
}
for( obj = victim->carrying; obj; obj = obj->next_content )
{
if( obj->wear_loc != WEAR_NONE )
unequip_char( victim, obj );
}
for( paf = victim->affected; paf; paf = paf->next )
{
if( paf->deleted )
continue;
affect_remove( victim, paf );
}
clean_char( victim );
victim->body_parts = race_table[victim->race].body_parts;
wiznetf( ch, WIZ_MISC, get_trust( ch ), "%s has cleared %s's affects.",
ch->name, victim->name );
send_to_char( "Your affects have been cleared.\n\r", victim );
send_to_char( "Ok.\n\r", rch );
return;
}
void do_masscast( CHAR_DATA *ch, const char *argument )
{
DESCRIPTOR_DATA *d;
CHAR_DATA *vch, *rch;
ROOM_INDEX_DATA *room;
int sn;
rch = get_char( ch );
if( !authorized( rch, "masscast" ) )
return;
sn = skill_lookup( argument );
if( argument[0] == '\0' || sn <= 0 )
{
send_to_char( "What spell was that?", ch );
return;
}
if( skill_table[sn].target != TAR_CHAR_DEFENSIVE &&
skill_table[sn].target != TAR_CHAR_SELF )
{
send_to_char( "Defensive spells only please.\n\r", ch );
return;
}
room = ch->in_room;
char_from_room( ch );
for( d = descriptor_list; d; d = d->next )
{
if( IS_SET( d->interpreter->flags, INTERPRETER_SAFE ) )
continue;
vch = d->character;
if( vch->deleted || IS_NPC( vch ) || ch == vch )
continue;
if( vch->in_room )
{
char_to_room( ch, vch->in_room );
say_spell( ch, sn );
char_from_room( ch );
}
/* so character doesn't get spammed, the victim casts it on
themselves. --Symposium */
SET_BIT( vch->pcdata->pc_bits, PC_BIT_RACIAL );
( *skill_table[sn].spell_fun )
( sn, rch->level, vch, ( void * )vch );
REMOVE_BIT( vch->pcdata->pc_bits, PC_BIT_RACIAL );
}
char_to_room( ch, room );
send_to_char( "&gOk.&n\n\r", ch );
wiznetf( ch, WIZ_MISC, get_trust( ch ), "%s masscast the spell %s.",
rch->name, skill_table[sn].name );
return;
}
void bamf( CHAR_DATA *ch )
{
ROOM_INDEX_DATA *room;
for( ;; )
{
room = get_room_index( number_range( 100, 65536 ) );
if( room && !IS_SET( room->room_flags, ROOM_PRIVATE )
&& !IS_SET( room->room_flags, ROOM_SOLITARY )
&& !IS_SET( room->room_flags, ROOM_NO_PORTAL )
&& get_trust( ch ) + 5 >= room->area->min
&& !IS_SET( room->area->area_flags, AREA_HIDE )
&& room->area->plane == ch->in_room->area->plane )
break;
}
char_from_room( ch );
char_to_room( ch, room );
return;
}
void do_battle( CHAR_DATA *ch, const char *argument )
{
CHAR_DATA *rch;
CHAR_DATA *bob;
ROOM_INDEX_DATA *prep_room = get_room_index( ROOM_VNUM_PREP_ROOM );
char arg1[MAX_INPUT_LENGTH];
rch = get_char( ch );
if( argument[0] == '\0' || !authorized( rch, "battle" ) )
{
if( ( battle_min == 0 && battle_max == 0 )
|| rch->level < battle_min || rch->level > battle_max )
{
send_to_char( "Sorry you cannot currently join a battle.\n\r",
rch );
return;
}
char_from_room( rch );
char_to_room( rch, prep_room );
do_look( rch, AUTOLOOK );
return;
}
if( !str_cmp( argument, "start" ) )
{
if( !prep_room->people || !prep_room->people->next_in_room )
{
send_to_char( "There aren't enough people for a battle.\n\r", ch );
if( ( bob = prep_room->people ) )
char_from_room( bob );
char_to_room( bob, get_room_index( ROOM_VNUM_TEMPLE ) );
return;
}
send_to_all_char( "&gBATTLE started!&n\n\r" );
for( bob = prep_room->people; bob; bob = prep_room->people )
{
bamf( bob );
xSET_BIT( bob->act, PLR_BATTLE );
}
return;
}
if( IS_SET( SysInfo->flags, SYSINFO_HOLYWAR ) )
{
send_to_char( "A Holy War rages at the moment, leave it for a bit.\n\r",
ch );
return;
}
argument = one_argument( argument, arg1 );
if( !is_number( arg1 ) || !is_number( argument ) )
{
send_to_char(
"Maybe you should specify level limits for the battle.\n\r", ch );
return;
}
battle_min = atoi( arg1 );
battle_max = atoi( argument );
if( battle_min > 0 && battle_max > 0 && battle_min < LEVEL_IMMORTAL
&& battle_max < LEVEL_IMMORTAL )
{
sprintf( arg1, "&Y%s has opened a battle for levels %d to %d!&n\n\r",
rch->name, battle_min, battle_max );
send_to_all_char( arg1 );
}
else
send_to_char( "Please make these positive integers!", ch );
return;
}
/* Copyover - Original idea: Fusion of MUD++
* Adapted to Diku by Erwin S. Andreasen, <erwin@pip.dknet.dk>
* http://pip.dknet.dk/~pip1773
*/
void do_copyover( CHAR_DATA *ch, const char *argument )
{
FILE *fp;
DESCRIPTOR_DATA *d, *d_next;
char buf[100], buf2[100];
CHAR_DATA *rch;
rch = get_char( ch );
if( !authorized( rch, "copyover" ) )
return;
#if defined( WIN32 )
if( str_cmp( argument, "force" ) )
{
send_to_char( "Under windoze, copyover doesn't really work.\n\r", ch );
send_to_char( "If you want to copyover anyway type: copyover force\n\r", ch );
return;
}
#endif
fp = open_file( COPYOVER_FILE, "w", FALSE );
if( !fp )
{
send_to_char( "Copyover file not writeable, aborted.\n\r", ch );
log_string( "Could not write to copyover file: %s", COPYOVER_FILE );
perror( "do_copyover: open_file" );
return;
}
/* save all changed areas, and buried items */
db_dump( );
#if defined( unix ) && !defined( CYGWIN32 )
ispell_done( );
#endif
sprintf( buf, "\n\r <-+| COPYOVER by %s - please remain seated! |+->\n\r",
ch->name );
/* For each playing descriptor, save its state */
for( d = descriptor_list; d; d = d_next )
{
CHAR_DATA *och = CH( d );
d_next = d->next;
#if defined( MCCP )
compress_end( d, d->mccp_version );
#endif
if( !d->character
|| IS_SET( d->interpreter->flags, INTERPRETER_SAFE ) )
/* drop those logging on */
{
write_to_descriptor( d->descriptor,
"\n\rSorry, we are rebooting. "
"Come back in a few minutes.\n\r", 0 );
close_socket( d );
}
else
{
fprintf( fp, "%d %s %s\n", d->descriptor, och->name, d->host );
if( och->level == 1 )
{
write_to_descriptor(
d->descriptor,
"Since you are level one, and level one characters do "
"not save...\n\r\tYou gain a free level!\n\r", 0 );
advance_level( och, TRUE );
och->level++;
}
save_char_obj( och );
write_to_descriptor( d->descriptor, buf, 0 );
}
}
fprintf( fp, "-1\n" );
close_file( fp );
/* Close reserve and other always-open files and release other resources */
fclose( fpReserve );
fpReserve = NULL;
/* "copyover" put the new file in so it will execute, save the old one */
#if defined( EXE_COPYOVER ) && !defined( WIN32 )
{
struct stat tmp;
if( stat( NEW_EXE_FILE, &tmp ) == 0 )
{
log_string( "Copying the code over." );
if( ( unlink( OLD_EXE_FILE ) && errno != ENOENT )
|| rename( EXE_FILE, OLD_EXE_FILE )
|| rename( NEW_EXE_FILE, EXE_FILE ) )
{
bug( "Couldn't rename binaries." );
}
}
}
#endif
/* execl - descriptors are inherited */
fflush( stderr );
sprintf( buf, "%hu", port );
sprintf( buf2, "%d", control );
execl( EXE_FILE, "daleken", buf, "copyover", buf2, (char *)NULL );
/* Failed - sucessful exec will mean this no longer exists */
perror( "do_copyover: execl" );
send_to_char( "&RCopyover FAILED!&n\n\r", ch );
/* Here you might want to reopen fpReserve */
fpReserve = fopen( NULL_FILE, "r" );
return;
}
void do_copyove( CHAR_DATA *ch, const char *argument )
{
send_to_char( "If you want to COPYOVER, spell it out.\n\r", ch );
return;
}
void do_nolag( CHAR_DATA *ch, const char *argument )
{
CHAR_DATA *rch;
CHAR_DATA *victim;
char arg[MAX_INPUT_LENGTH];
bool on;
rch = get_char( ch );
if( !authorized( rch, "nolag" ) )
return;
argument = one_argument( argument, arg );
if( argument[0] == '\0' )
{
victim = ch;
}
else if( !( victim = get_char_world( ch, argument ) ) )
{
send_to_char( "Usage: nolag <on/off> <victim>\n\r", ch );
return;
}
if( IS_NPC( victim ) )
return;
if( !str_cmp( arg, "on" ) )
on = TRUE;
else if( !str_cmp( arg, "off" ) )
on = FALSE;
else if( xIS_SET( victim->act, PLR_NO_LAG ) )
on = FALSE;
else
on = TRUE;
if( on )
{
xSET_BIT( victim->act, PLR_NO_LAG );
if( victim == ch )
send_to_char( "You no longer get lagged.\n\r", ch );
else
send_to_char( "They no longer get lagged.\n\r", ch );
}
else
{
xREMOVE_BIT( victim->act, PLR_NO_LAG );
if( victim == ch )
send_to_char( "You now lag normally.\n\r", ch );
else
send_to_char( "They now lag normally.\n\r", ch );
}
return;
}
void do_send( CHAR_DATA *ch, const char *argument )
{
char arg1[MAX_INPUT_LENGTH];
CHAR_DATA *victim = NULL;
CHAR_DATA *rch;
DESCRIPTOR_DATA *d;
SOCKET desc_num = 0;
rch = get_char( ch );
if( !authorized( rch, "send" ) )
return;
if( argument[0] == '\0' )
{
send_to_char( "Usage: send <character> <message>\n\r", ch );
return;
}
argument = one_argument( argument, arg1 );
if( is_number( arg1 ) )
{
desc_num = (SOCKET)atoi( arg1 );
}
else
{
if( !( victim = get_char_world( ch, arg1 ) ) )
{
send_to_char( "You can't find that person.\n\r", ch );
return;
}
}
for( d = descriptor_list; d; d = d->next )
{
if( d->descriptor == desc_num || ( victim && d == victim->desc ) )
{
if( victim && get_trust( victim ) >= get_trust( ch ) )
act( "&b$N has just sent you the message:",
victim, NULL, ch, TO_CHAR );
write_to_buffer( d, argument );
write_to_buffer( d, "\n\r" );
return;
}
}
return;
}
void do_keylock( CHAR_DATA *ch, const char *argument )
{
CHAR_DATA *rch;
rch = get_char( ch );
if( !authorized( rch, "keylock" ) )
return;
send_to_char( "Ok, keylocking your character.\n\r", ch );
send_to_char( "You will have to enter your password to unlock input.\n\r", ch );
xSET_BIT( rch->act, PLR_KEYLOCK );
return;
}
/*
* This is a _very_ expensive function in terms of time.
* Luckily we don't use it too often, I hope!
* -- Symposium
*/
void do_dupefind( CHAR_DATA *ch, const char *argument )
{
CHAR_DATA *rch;
OBJ_DATA *obj, *dobj, *in_obj;
int count = 0;
char buf[ 40 ];
if( ch )
rch = get_char( ch );
if( ch && !authorized( rch, "dupefind" ) )
return;
/* Turn of the CPU time alarm for this function. */
SET_BIT( SysInfo->flags, SYSINFO_NOCPULIMIT );
for( obj = object_list; obj; obj = obj->next )
{
if( obj->deleted )
continue;
for( dobj = obj->next; dobj; dobj = dobj->next )
{
if( obj->unique_key == dobj->unique_key
&& obj->pIndexData == dobj->pIndexData
&& !dobj->deleted )
{
count++;
log_string( "Item duplication (key %d):", obj->unique_key );
for( in_obj = obj; in_obj && in_obj->in_obj;
in_obj = in_obj->in_obj )
;
if( in_obj->carried_by )
log_string( "-- %s&n carried by %s.",
obj->short_descr, in_obj->carried_by->name );
else
log_string( "-- %s&n in %s&n.",
obj->short_descr, !in_obj->in_room
? "somewhere" : in_obj->in_room->name );
for( in_obj = dobj; in_obj && in_obj->in_obj;
in_obj = in_obj->in_obj )
;
if( in_obj->carried_by )
log_string( "-- %s&n carried by %s&n.",
dobj->short_descr, in_obj->carried_by->name );
else
log_string( "-- %s&n in %s&n.",
dobj->short_descr, !in_obj->in_room
? "somewhere" : in_obj->in_room->name );
}
}
}
if( ch )
{
sprintf( buf, "%d duplications found.\n\r", count );
send_to_char( buf, ch );
}
/* Turn of the CPU time alarm for this function. */
REMOVE_BIT( SysInfo->flags, SYSINFO_NOCPULIMIT );
return;
}
void do_info( CHAR_DATA *ch, const char *argument )
{
CHAR_DATA *rch;
rch = get_char( ch );
if( !authorized( rch, "info" ) )
return;
if( !str_cmp( argument, "on" ) || !xIS_SET( rch->act, PLR_INFO ) )
xSET_BIT( rch->act, PLR_INFO );
else
xREMOVE_BIT( rch->act, PLR_INFO );
if( xIS_SET( rch->act, PLR_INFO ) )
send_to_char( "You will now see additional game info.\n\r", ch );
else
send_to_char( "You now wont see additional info.\n\r", ch );
return;
}
void do_nofight( CHAR_DATA *ch, const char *argument )
{
CHAR_DATA *rch;
rch = get_char( ch );
if( !authorized( rch, "nofight" ) )
return;
TOGGLE_BIT( SysInfo->flags, SYSINFO_NOFIGHT );
if( IS_SET( SysInfo->flags, SYSINFO_NOFIGHT ) )
send_to_char( "Game no_fighted.\n\r", ch );
else
send_to_char( "Game un-no_fighted.\n\r", ch );
wiznetf( ch, WIZ_MISC, get_trust( ch ), "%s setting nofight to %sE.",
ch->name, IS_SET( SysInfo->flags, SYSINFO_NOFIGHT )
? "TRU" : "FALS" );
return;
}
#ifndef INT_MAX
#define INT_MAX 65536
#endif
void do_builder( CHAR_DATA *ch, const char *argument )
{
CHAR_DATA *rch;
CHAR_DATA *victim;
AREA_DATA *pArea;
char arg1[MAX_INPUT_LENGTH];
char arg2[MAX_INPUT_LENGTH];
int lower, upper;
rch = get_char( ch );
if( !authorized( rch, "builder" ) )
return;
argument = one_argument( argument, arg1 );
argument = one_argument( argument, arg2 );
if( !( victim = get_char_room( ch, arg1 ) ) || IS_NPC( victim ) )
{
send_to_char( "They aren't here.\n\r", ch );
return;
}
if( get_trust( victim ) > L_HER )
{
send_to_char( "They are too high level for you to make builder.\n\r",
ch );
return;
}
if( !str_cmp( arg2, "newarea" ) )
{
if( rch->pcdata->security < 2 )
{
send_to_char( "You can't create an area.\n\r", ch );
return;
}
argument = one_argument( argument, arg1 );
one_argument( argument, arg2 );
if( arg1[0] == '\0' || arg2[0] == '\0'
|| !is_number( arg1 ) || !is_number( arg2 ) )
{
send_to_char( "<lvnum> and <uvnum> must be numbers.\n\r", ch );
return;
}
lower = atoi( arg1 );
upper = atoi( arg2 );
if( lower > upper || lower <= 0 || lower >= INT_MAX
|| upper <= 0 || upper >= INT_MAX )
{
send_to_char( "Invalid number range.\n\r", ch );
return;
}
if( get_vnum_area( lower ) || get_vnum_area( upper ) )
{
send_to_char( "Range includes another area.\n\r", ch );
return;
}
pArea = new_area( );
area_last->next = pArea;
area_last = pArea;
SET_BIT( pArea->area_flags, AREA_ADDED );
pArea->security = rch->pcdata->security;
pArea->lvnum = lower;
pArea->uvnum = upper;
pArea->builders = str_dup( victim->name );
pArea->plane = plane_lookup( "unfinished" );
send_to_char( "Area Created.\n\r", ch );
}
victim->class = CLASS_BUILDER;
victim->trust = L_BLD;
victim->pcdata->immskll = str_dup( "aedit redit medit oedit resets "
"alist asave goto purge wizhelp "
"holylight immtalk flagloookup" );
victim->pcdata->security = 1;
send_to_char( "Ok.\n\r", ch );
return;
}
/*
* Wiznet 0.1 improvements copyright (C) 1996 by The Maniac.
* Written by The Maniac from Mythran Mud.
*/
void do_wiznet( CHAR_DATA* ch, const char *argument )
{
char arg[ MAX_STRING_LENGTH ];
CHAR_DATA * rch;
int trust;
rch = get_char( ch );
if( !authorized( rch, "wiznet" ) )
return;
one_argument( argument, arg );
trust = get_trust( ch );
if( arg[0] == '\0' )
{
send_to_char( "[ Keyword ] Option\n\r", ch );
send_to_char( IS_SET( rch->deaf, WIZ_ON )
? "[+WIZNET ] Wiznet is on.\n\r"
: "[-wiznet ] Wiznet is off.\n\r"
, ch );
if( trust >= L_OVL )
send_to_char( IS_SET( rch->deaf, WIZ_LOG )
? "[+LOGS ] You see logged strings.\n\r"
: "[-logs ] You don't see logged strings.\n\r"
, ch );
send_to_char( IS_SET( rch->deaf, WIZ_LOGINS )
? "[+LOGINS ] You are notified of logins.\n\r"
: "[-logins ] You aren't notified of logins.\n\r"
, ch );
send_to_char( IS_SET( rch->deaf, WIZ_DEATHS )
? "[+DEATHS ] You are notified of deaths.\n\r"
: "[-deaths ] You aren't notified of deaths.\n\r"
, ch );
send_to_char( IS_SET( rch->deaf, WIZ_LEVELS )
? "[+LEVELS ] You are notified when a player levels.\n\r"
: "[-levels ] You aren't notified when a player levels.\n\r"
, ch );
send_to_char( IS_SET( rch->deaf, WIZ_TICKS )
? "[+TICKS ] You see are notified of ticks.\n\r"
: "[-ticks ] You aren't notified of ticks.\n\r"
, ch );
if( trust >= L_SEN )
send_to_char( IS_SET( rch->deaf, WIZ_COMMANDS )
? "[+COMMANDS ] You see logged commands.\n\r"
: "[-commands ] You don't see logged commands.\n\r"
, ch );
if( trust >= L_JUN )
send_to_char( IS_SET( rch->deaf, WIZ_MISC )
? "[+MISC ] Wiznet miscellaneous info is on.\n\r"
: "[-misc ] Wiznet miscellaneous info is off.\n\r"
, ch );
if( trust >= L_JUN )
send_to_char( IS_SET( rch->deaf, WIZ_CLAN )
? "[+CLAN ] Clan/religion messages are on.\n\r"
: "[-clan ] Clan/religion messages are off.\n\r"
, ch );
if( trust >= L_SEN )
send_to_char( IS_SET( rch->deaf, WIZ_CREATE )
? "[+CREATE ] Wiznet on creation is on.\n\r"
: "[-create ] Wiznet on creation is off.\n\r"
, ch );
if( trust >= L_MAS )
send_to_char( IS_SET( rch->deaf, WIZ_DEBUG )
? "[+DEBUG ] Wiznet debug is on.\n\r"
: "[-debug ] Wiznet debug is off.\n\r"
, ch );
}
else
{
char buf [ MAX_INPUT_LENGTH ];
int bit;
bool fSet;
if( arg[0] == '+' ) fSet = TRUE;
else if( arg[0] == '-' ) fSet = FALSE;
else
{
send_to_char( "Wiznet: config -option or +option?\n\r", ch );
return;
}
if( !str_cmp( arg+1, "wiznet" ) ) bit = WIZ_ON;
else if( !str_cmp( arg+1, "logs" ) ) bit = WIZ_LOG;
else if( !str_cmp( arg+1, "logins" ) ) bit = WIZ_LOGINS;
else if( !str_cmp( arg+1, "deaths" ) ) bit = WIZ_DEATHS;
else if( !str_cmp( arg+1, "levels" ) ) bit = WIZ_LEVELS;
else if( !str_cmp( arg+1, "ticks" ) ) bit = WIZ_TICKS;
else if( !str_cmp( arg+1, "commands" ) ) bit = WIZ_COMMANDS;
else if( !str_cmp( arg+1, "misc" ) ) bit = WIZ_MISC;
else if( !str_cmp( arg+1, "create" ) ) bit = WIZ_CREATE;
else if( !str_cmp( arg+1, "clan" ) ) bit = WIZ_CLAN;
else if( !str_cmp( arg+1, "debug" ) ) bit = WIZ_DEBUG;
else if( !str_cmp( arg+1, "ALL" ) )
{
bit = WIZ_ON | WIZ_LOG | WIZ_LOGINS | WIZ_DEATHS | WIZ_LEVELS
| WIZ_COMMANDS | WIZ_MISC | WIZ_CREATE | WIZ_CLAN
| WIZ_DEBUG;
}
else
{
send_to_char( "Wiznet: config which option?\n\r", ch );
return;
}
if( fSet )
{
SET_BIT( rch->deaf, bit );
sprintf( buf, "%s is now ON.\n\r", arg+1 );
buf[0] = UPPER( buf[0] );
send_to_char( buf, ch );
}
else
{
REMOVE_BIT( rch->deaf, bit );
sprintf( buf, "%s is now OFF.\n\r", arg+1 );
buf[0] = UPPER( buf[0] );
send_to_char( buf, ch );
}
}
return;
}
/*
* Pload by Erwin Andreasen.
*/
void do_pload( CHAR_DATA *ch, const char *argument )
{
DESCRIPTOR_DATA d;
CHAR_DATA *ch_on;
CHAR_DATA *rch = get_char( ch );
bool isChar;
char name[MAX_INPUT_LENGTH];
if( !authorized( rch, "pload" ) )
return;
if( argument[0] == '\0' )
{
send_to_char( "Load who?\n\r", ch );
return;
}
argument = one_argument( argument, name );
name[0] = UPPER( name[0] );
/* Don't want to load a second copy of a player who's already online! */
for( ch_on = char_list; ch_on; ch_on = ch_on->next )
{
if( !ch_on->deleted && !IS_NPC( ch_on )
&& !str_cmp( ch_on->name, name ) )
{
send_to_char( "That person is already connected!\n\r", ch );
return;
}
}
memset( &d, 0, sizeof( DESCRIPTOR_DATA ) );
isChar = load_char_obj( &d, name ); /* char pfile exists? */
if( !isChar )
{
send_to_char( "Load Who? Are you sure? I can't seem to find them.\n\r", ch );
return;
}
d.character->desc = NULL;
d.character->next = char_list;
char_list = d.character;
d.interpreter = get_interpreter( "" );
/* bring player to imm */
if( d.character->in_room != NULL )
{
if( d.character->was_in_room == NULL )
d.character->was_in_room = d.character->in_room;
d.character->in_room = NULL;
char_to_room( d.character, ch->in_room);
}
charprintf( ch, "You have pulled %s from the pattern!\n\r",
d.character->name );
act( "$n has pulled $N from the pattern!",
ch, NULL, d.character, TO_ROOM );
if( !str_cmp( argument, "nosave" ) )
xSET_BIT( d.character->act, PLR_NOSAVE );
return;
}
void do_punload( CHAR_DATA *ch, const char *argument )
{
CHAR_DATA *victim;
CHAR_DATA *rch = get_char( ch );
if( !authorized( rch, "pload" ) )
return;
if( ( victim = get_char_world( ch, argument ) ) == NULL )
{
send_to_char( "They aren't here.\n\r", ch );
return;
}
/** Person is legitimately logged on... was not ploaded.
*/
if( victim->desc != NULL )
{
send_to_char( "I don't think that would be a good idea...\n\r", ch );
return;
}
if( victim->was_in_room != NULL ) /* return player to orig room */
{
char_from_room( victim );
char_to_room( victim, victim->was_in_room );
ch->was_in_room = NULL;
}
act( "You have released $N back to the Pattern.",
ch, NULL, victim, TO_CHAR );
act( "$n has released $N back to the Pattern.",
ch, NULL, victim, TO_ROOM );
do_quit( victim, "" );
return;
}
/*
* Send command output to a file.
* Known problem: if there are too many people logged on to the MUD
* and there are no descriptors left this wont work, I didn't consider
* that to be a significant problem as this command isn't critical.
* -- Symposium
*/
#if !defined( WIN32 )
void do_fileoutput( CHAR_DATA *ch, const char *argument )
{
CHAR_DATA *rch;
char *p;
char file[MAX_INPUT_LENGTH];
int fd;
bool colour = FALSE;
int pagelen;
rch = get_char( ch );
if( !ch->desc || !authorized( rch, "fileoutput" ) )
return;
argument = one_argument( argument, file );
for( p = &file[0]; p && *p; ++p )
if( !isalnum( *p ) )
{
send_to_char( "You can't use shell characters, try again.\n\r",
ch );
return;
}
if( ( fd = open( file, O_RDWR | O_CREAT | O_APPEND | O_NDELAY,
S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH ) ) < 0 )
{
perror( "FileOutput: couldn't open file" );
send_to_char( "Couldn't open the file, sorry.\n\r", ch );
return;
}
pagelen = rch->pcdata->pagelen;
rch->pcdata->pagelen = -99;
if( xIS_SET( rch->act, PLR_COLOUR ) )
{
colour = TRUE;
xREMOVE_BIT( rch->act, PLR_COLOUR );
}
interpret( ch, argument );
if( !write_to_descriptor( fd, ch->desc->outbuf, ch->desc->outtop ) )
{
perror( "FileOutput: writing to descriptor" );
send_to_char( "Error writing file.\n\r", ch );
}
/*
* maybe someone will write the win32 code for this,
* all it needs is the file open line to work.
*/
#if !defined( WIN32 )
if( close( fd ) < 0 )
#else
if( closesocket( fd ) < 0 )
#endif
perror( "FileOutput: closing descriptor" );
rch->pcdata->pagelen = pagelen;
if( colour )
xSET_BIT( rch->act, PLR_COLOUR );
return;
}
#else
void do_fileoutput( CHAR_DATA *ch, const char *argument )
{
send_to_char( "Fileoutput isn't available on this platform.\n\r", ch );
return;
}
#endif
/* Expand the name of a character into a string that identifies THAT
character within a room. E.g. the second 'guard' -> 2. guard */
const char *name_expand( char *outbuf, CHAR_DATA *ch )
{
int count = 1;
CHAR_DATA *rch;
char name[MAX_INPUT_LENGTH]; /* HOPEFULLY no mob has a name longer than THAT */
if( !IS_NPC( ch ) )
return ch->name;
one_argument( ch->name, name ); /* copy the first word into name */
if( !name[0] ) /* weird mob .. no keywords */
{
strcpy( outbuf, "" ); /* Do not return NULL, just an empty buffer */
return outbuf;
}
for( rch = ch->in_room->people; rch && ( rch != ch );
rch = rch->next_in_room )
if( is_char_name( rch, name ) )
count++;
sprintf( outbuf, "%d.%s", count, name );
return outbuf;
}
/*
* For/Repeat by Erwin S. Andreasen (4u2@aabc.dk)
* renamed to repeat to avoid name pollution
*/
void do_repeat( CHAR_DATA *ch, const char *argument )
{
char range[MAX_INPUT_LENGTH];
char buf[MAX_STRING_LENGTH];
bool
fGods = FALSE,
fMortals = FALSE,
fMobs = FALSE,
fEverywhere = FALSE,
found;
ROOM_INDEX_DATA *room, *old_room;
CHAR_DATA *p, *p_next;
int i;
if( !authorized( ch, "repeat" ) )
return;
argument = one_argument( argument, range );
if( !range[0] || !argument[0] ) /* invalid usage? */
{
do_help( ch, "repeat" );
return;
}
if( !str_prefix( "quit", argument ) )
{
send_to_char( "Are you trying to crash the MUD or something?\n\r",ch );
return;
}
if( !str_cmp( range, "all" ) )
{
fMortals = TRUE;
fGods = TRUE;
}
else if( !str_cmp( range, "gods" ) )
fGods = TRUE;
else if( !str_cmp( range, "mortals" ) )
fMortals = TRUE;
else if( !str_cmp( range, "mobs" ) )
fMobs = TRUE;
else if( !str_cmp( range, "everywhere" ) )
fEverywhere = TRUE;
else
{
do_help( ch, "repeat" );
return;
}
/* do not allow # to make it easier */
/* Don't allow it, it causes crashes on 'for mobs tell # hi' Maniac */
if( fEverywhere && strchr( argument, '#' ) )
{
send_to_char( "Cannot use FOR EVERYWHERE with the # thingie.\n\r",ch );
return;
}
if( fMobs && strchr( argument, '#' ) )
{
send_to_char( "Cannot use FOR MOBS with the # thingie.\n\r",ch );
return;
}
if( strchr( argument, '#' ) ) /* replace # ? */
{
for( p = char_list; p; p = p_next )
{
p_next = p->next; /* In case someone DOES try to AT MOBS SLAY # */
if( !( p->in_room ) || room_is_private( p->in_room )
|| ( p == ch ) )
continue;
if( IS_NPC( p ) && fMobs )
found = TRUE;
else if( !IS_NPC( p ) && fGods
&& get_trust( p ) >= LEVEL_IMMORTAL )
found = TRUE;
else if( !IS_NPC( p ) && fMortals
&& get_trust( p ) < LEVEL_IMMORTAL )
found = TRUE;
else
found = FALSE;
/* It looks ugly to me.. but it works : ) */
if( found )
{
const char *pSource = argument; /* buffer to be parsed */
char *pDest = buf; /* parse into this */
while( *pSource )
{
if( *pSource == '#' ) /* Replace # with name of target */
{
char tmp[MAX_INPUT_LENGTH];
const char *namebuf = name_expand( tmp, p );
if( namebuf )
while( *namebuf ) /* copy name over */
*pDest++ = *namebuf++;
pSource++;
}
else
*pDest++ = *pSource++;
}
*pDest = '\0';
/* Execute */
old_room = ch->in_room;
char_from_room( ch );
char_to_room( ch, p->in_room );
interpret( ch, buf );
char_from_room( ch );
char_to_room( ch, old_room );
}
}
}
else /* just for every room with the appropriate people in it */
{
for( i = 0; i < MAX_KEY_HASH; i++ )
for( room = room_index_hash[i] ; room ; room = room->next )
{
found = FALSE;
if( fEverywhere ) /* Everywhere executes always */
found = TRUE;
else if( !room->people ) /* Skip it if room is empty */
continue;
/* Check if there is anyone here of the requried type
* Stop as soon as a match is found or there are no more
* ppl in room
*/
for( p = room->people; p && !found; p = p->next_in_room )
{
if( p == ch ) /* do not execute on oneself */
continue;
if( IS_NPC( p ) && fMobs )
found = TRUE;
else if( !IS_NPC( p ) && fGods
&& get_trust( p ) >= LEVEL_IMMORTAL )
found = TRUE;
else if( !IS_NPC( p ) && fMortals
&& get_trust( p ) < LEVEL_IMMORTAL )
found = TRUE;
}
/* Any of the required type here AND room not private? */
if( found && !room_is_private( room ) )
{
/* This may be ineffective. Consider moving character out
* of old_room once at beginning of command then moving
* back at the end.
* This however, is more safe?
*/
old_room = ch->in_room;
char_from_room( ch );
char_to_room( ch, room );
interpret( ch, argument );
char_from_room( ch );
char_to_room( ch, old_room );
}
} /* for every room in a bucket */
}
return;
}
void do_wsave( CHAR_DATA *ch, const char *argument )
{
CHAR_DATA *rch;
rch = get_char( ch );
if( !authorized( rch, "wsave" ) )
return;
send_to_char( "Saving all game databases.\n\r", ch );
db_dump();
send_to_char( "Done.\n\r", ch );
return;
}
/*
* Confiscate an item from a character, whether they are wearing it or not.
*/
void do_confiscate( CHAR_DATA *ch, const char *argument )
{
CHAR_DATA *rch;
CHAR_DATA *victim;
OBJ_DATA *obj;
char arg[MAX_INPUT_LENGTH];
rch = get_char( ch );
if( !authorized( rch, "confiscate" ) )
return;
argument = one_argument( argument, arg );
if( arg[0] == '\0' || argument[0] == '\0' )
{
send_to_char( "Confiscate what from whom?\n\r", ch );
return;
}
if( !( victim = get_char_world( ch, argument ) ) )
{
send_to_char( "They aren't here.\n\r", ch );
return;
}
if( victim == ch )
{
send_to_char( "Why bother, feel you aren't in control?\n\r", ch );
return;
}
if( get_trust( victim ) >= get_trust( ch ) )
{
send_to_char( "Maybe if you asked nicely...\n\r", ch );
return;
}
if( !( obj = get_obj_list( ch, arg, victim->carrying ) ) )
{
send_to_char( "They aren't carrying such an item.\n\r", ch );
return;
}
if( can_see( victim, ch ) )
act( "$p has been confiscated by $N!", victim, obj, ch, TO_CHAR );
obj_from_char( obj );
obj_to_char( obj, ch );
send_to_char( "Yoink!\n\r", ch );
return;
}
/*
* Debugging function, put stuff here.
*/
void do_test( CHAR_DATA *ch, const char *argument )
{
CHAR_DATA *rch;
rch = get_char( ch );
if( !authorized( rch, "test" ) )
return;
send_to_char( "You test the MUD code.\n\r", ch );
rch = get_char_room( ch, argument );
damage( rch, ch, 0, TYPE_HIT, WEAR_WIELD_R );
return;
}