📄 comm.c
字号:
strcat( buf, "]: " );
write_to_buffer( d, buf, 0 );
d->connected = CON_GET_NEW_CLASS;
break;
case CON_GET_NEW_CLASS:
for ( iClass = 0; iClass < MAX_CLASS; iClass++ )
{
if ( !str_cmp( argument, class_table[iClass].who_name ) )
{
ch->class = iClass;
break;
}
}
if ( iClass == MAX_CLASS )
{
write_to_buffer( d,
"That's not a class.\n\rWhat IS your class? ", 0 );
return;
}
sprintf( log_buf, "%s@%s new player.", ch->name, d->host );
log_string( log_buf );
write_to_buffer( d, "\n\r", 2 );
ch->pcdata->pagelen = 20;
ch->prompt = "<%hhp %mm %vmv> ";
do_help( ch, "motd" );
d->connected = CON_READ_MOTD;
break;
case CON_READ_MOTD:
ch->next = char_list;
char_list = ch;
d->connected = CON_PLAYING;
send_to_char(
"\n\rWelcome to Merc Diku Mud. May your visit here be ... Mercenary.\n\r",
ch );
if ( ch->level == 0 )
{
OBJ_DATA *obj;
switch ( class_table[ch->class].attr_prime )
{
case APPLY_STR: ch->pcdata->perm_str = 16; break;
case APPLY_INT: ch->pcdata->perm_int = 16; break;
case APPLY_WIS: ch->pcdata->perm_wis = 16; break;
case APPLY_DEX: ch->pcdata->perm_dex = 16; break;
case APPLY_CON: ch->pcdata->perm_con = 16; break;
}
ch->level = 1;
ch->exp = 1000;
ch->hit = ch->max_hit;
ch->mana = ch->max_mana;
ch->move = ch->max_move;
sprintf( buf, "the %s",
title_table [ch->class] [ch->level]
[ch->sex == SEX_FEMALE ? 1 : 0] );
set_title( ch, buf );
obj = create_object( get_obj_index(OBJ_VNUM_SCHOOL_BANNER), 0 );
obj_to_char( obj, ch );
equip_char( ch, obj, WEAR_LIGHT );
obj = create_object( get_obj_index(OBJ_VNUM_SCHOOL_VEST), 0 );
obj_to_char( obj, ch );
equip_char( ch, obj, WEAR_BODY );
obj = create_object( get_obj_index(OBJ_VNUM_SCHOOL_SHIELD), 0 );
obj_to_char( obj, ch );
equip_char( ch, obj, WEAR_SHIELD );
obj = create_object( get_obj_index(class_table[ch->class].weapon),
0 );
obj_to_char( obj, ch );
equip_char( ch, obj, WEAR_WIELD );
char_to_room( ch, get_room_index( ROOM_VNUM_SCHOOL ) );
}
else if ( ch->in_room != NULL )
{
char_to_room( ch, ch->in_room );
}
else if ( IS_IMMORTAL(ch) )
{
char_to_room( ch, get_room_index( ROOM_VNUM_CHAT ) );
}
else
{
char_to_room( ch, get_room_index( ROOM_VNUM_TEMPLE ) );
}
act( "$n has entered the game.", ch, NULL, NULL, TO_ROOM );
do_look( ch, "auto" );
/* check for new notes */
notes = 0;
for ( pnote = note_list; pnote != NULL; pnote = pnote->next )
if ( is_note_to( ch, pnote ) && str_cmp( ch->name, pnote->sender )
&& pnote->date_stamp > ch->last_note )
notes++;
if ( notes == 1 )
send_to_char( "\n\rYou have one new note waiting.\n\r", ch );
else
if ( notes > 1 )
{
sprintf( buf, "\n\rYou have %d new notes waiting.\n\r",
notes );
send_to_char( buf, ch );
}
break;
}
return;
}
/*
* Parse a name for acceptability.
*/
bool check_parse_name( char *name )
{
/*
* Reserved words.
*/
if ( is_name( name, "all auto immortal self someone" ) )
return FALSE;
/*
* Length restrictions.
*/
if ( strlen(name) < 3 )
return FALSE;
#if defined(MSDOS)
if ( strlen(name) > 8 )
return FALSE;
#endif
#if defined(macintosh) || defined(unix)
if ( strlen(name) > 12 )
return FALSE;
#endif
/*
* Alphanumerics only.
* Lock out IllIll twits.
*/
{
char *pc;
bool fIll;
fIll = TRUE;
for ( pc = name; *pc != '\0'; pc++ )
{
if ( !isalpha(*pc) )
return FALSE;
if ( LOWER(*pc) != 'i' && LOWER(*pc) != 'l' )
fIll = FALSE;
}
if ( fIll )
return FALSE;
}
/*
* Prevent players from naming themselves after mobs.
*/
{
extern MOB_INDEX_DATA *mob_index_hash[MAX_KEY_HASH];
MOB_INDEX_DATA *pMobIndex;
int iHash;
for ( iHash = 0; iHash < MAX_KEY_HASH; iHash++ )
{
for ( pMobIndex = mob_index_hash[iHash];
pMobIndex != NULL;
pMobIndex = pMobIndex->next )
{
if ( is_name( name, pMobIndex->player_name ) )
return FALSE;
}
}
}
return TRUE;
}
/*
* Look for link-dead player to reconnect.
*/
bool check_reconnect( DESCRIPTOR_DATA *d, char *name, bool fConn )
{
CHAR_DATA *ch;
OBJ_DATA *obj;
for ( ch = char_list; ch != NULL; ch = ch->next )
{
if ( !IS_NPC(ch)
&& ( !fConn || ch->desc == NULL )
&& !str_cmp( d->character->name, ch->name ) )
{
if ( fConn == FALSE )
{
free_string( d->character->pcdata->pwd );
d->character->pcdata->pwd = str_dup( ch->pcdata->pwd );
}
else
{
free_char( d->character );
d->character = ch;
ch->desc = d;
ch->timer = 0;
send_to_char( "Reconnecting.\n\r", ch );
act( "$n has reconnected.", ch, NULL, NULL, TO_ROOM );
sprintf( log_buf, "%s@%s reconnected.", ch->name, d->host );
log_string( log_buf );
d->connected = CON_PLAYING;
/*
* Contributed by Gene Choi
*/
if ( ( obj = get_eq_char( ch, WEAR_LIGHT ) ) != NULL
&& obj->item_type == ITEM_LIGHT
&& obj->value[2] != 0
&& ch->in_room != NULL )
++ch->in_room->light;
}
return TRUE;
}
}
return FALSE;
}
/*
* Check if already playing.
*/
bool check_playing( DESCRIPTOR_DATA *d, char *name )
{
DESCRIPTOR_DATA *dold;
for ( dold = descriptor_list; dold; dold = dold->next )
{
if ( dold != d
&& dold->character != NULL
&& dold->connected != CON_GET_NAME
&& dold->connected != CON_GET_OLD_PASSWORD
&& !str_cmp( name, dold->original
? dold->original->name : dold->character->name ) )
{
write_to_buffer( d, "Already playing.\n\rName: ", 0 );
d->connected = CON_GET_NAME;
if ( d->character != NULL )
{
free_char( d->character );
d->character = NULL;
}
return TRUE;
}
}
return FALSE;
}
void stop_idling( CHAR_DATA *ch )
{
if ( ch == NULL
|| ch->desc == NULL
|| ch->desc->connected != CON_PLAYING
|| ch->was_in_room == NULL
|| ch->in_room != get_room_index( ROOM_VNUM_LIMBO ) )
return;
ch->timer = 0;
char_from_room( ch );
char_to_room( ch, ch->was_in_room );
ch->was_in_room = NULL;
act( "$n has returned from the void.", ch, NULL, NULL, TO_ROOM );
return;
}
/*
* Write to one char.
*/
void send_to_char( const char *txt, CHAR_DATA *ch )
{
if ( txt == NULL || ch->desc == NULL )
return;
ch->desc->showstr_head = alloc_mem( strlen( txt ) + 1 );
strcpy( ch->desc->showstr_head, txt );
ch->desc->showstr_point = ch->desc->showstr_head;
show_string( ch->desc, "" );
}
/* The heart of the pager. Thanks to N'Atas-Ha, ThePrincedom
for porting this SillyMud code for MERC 2.0 and laying down the groundwork.
Thanks to Blackstar, hopper.cs.uiowa.edu 4000 for which
the improvements to the pager was modeled from. - Kahn */
void show_string(struct descriptor_data *d, char *input)
{
char buffer[ MAX_STRING_LENGTH ];
char buf[ MAX_INPUT_LENGTH ];
register char *scan, *chk;
int lines = 0, toggle=1;
one_argument(input, buf);
switch( UPPER( buf[0] ) )
{
case '\0':
case 'C': /* show next page of text */
lines = 0;
break;
case 'R': /* refresh current page of text */
lines = - 1 - (d->character->pcdata->pagelen);
break;
case 'B': /* scroll back a page of text */
lines = -(2*d->character->pcdata->pagelen);
break;
case 'H': /* Show some help */
write_to_buffer( d,
"C, or Return = continue, R = redraw this page,\n\r", 0 );
write_to_buffer( d,
"B = back one page, H = this help, Q or other keys = exit.\n\r\n\r",
0 );
lines = - 1 - (d->character->pcdata->pagelen);
break;
default: /*otherwise, stop the text viewing */
if ( d->showstr_head )
{
free_string( d->showstr_head );
d->showstr_head = 0;
}
d->showstr_point = 0;
return;
}
/* do any backing up necessary */
if (lines < 0)
{
for ( scan = d->showstr_point; scan > d->showstr_head; scan-- )
if ( ( *scan == '\n' ) || ( *scan == '\r' ) )
{
toggle = -toggle;
if ( toggle < 0 )
if ( !( ++lines ) )
break;
}
d->showstr_point = scan;
}
/* show a chunk */
lines = 0;
toggle = 1;
for ( scan = buffer; ; scan++, d->showstr_point++ )
if ( ( ( *scan = *d->showstr_point ) == '\n' || *scan == '\r' )
&& ( toggle = -toggle ) < 0 )
lines++;
else
if ( !*scan || ( d->character && !IS_NPC( d->character )
&& lines >= d->character->pcdata->pagelen) )
{
*scan = '\0';
write_to_buffer( d, buffer, strlen( buffer ) );
/* See if this is the end (or near the end) of the string */
for ( chk = d->showstr_point; isspace( *chk ); chk++ );
if ( !*chk )
{
if ( d->showstr_head )
{
free_string( d->showstr_head );
d->showstr_head = 0;
}
d->showstr_point = 0;
}
return;
}
return;
}
/*
* The primary output interface for formatted output.
*/
void act( const char *format, CHAR_DATA *ch, const void *arg1,
const void *arg2, int type )
{
static char * const he_she [] = { "it", "he", "she" };
static char * const him_her [] = { "it", "him", "her" };
static char * const his_her [] = { "its", "his", "her" };
char buf[MAX_STRING_LENGTH];
char fname[MAX_INPUT_LENGTH];
CHAR_DATA *to;
CHAR_DATA *vch = (CHAR_DATA *) arg2;
OBJ_DATA *obj1 = (OBJ_DATA *) arg1;
OBJ_DATA *obj2 = (OBJ_DATA *) arg2;
const char *str;
const char *i;
char *point;
/*
* Discard null and zero-length messages.
*/
if ( format == NULL || format[0] == '\0' )
return;
to = ch->in_room->people;
if ( type == TO_VICT )
{
if ( vch == NULL )
{
bug( "Act: null vch with TO_VICT.", 0 );
return;
}
to = vch->in_room->people;
}
for ( ; to != NULL; to = to->next_in_room )
{
if ( ( to->desc == NULL
&& ( IS_NPC( to ) && !(to->pIndexData->progtypes & ACT_PROG ) ) )
|| !IS_AWAKE(to) )
continue;
if ( type == TO_CHAR && to != ch )
continue;
if ( type == TO_VICT && ( to != vch || to == ch ) )
continue;
if ( type == TO_ROOM && to == ch )
continue;
if ( type == TO_NOTVICT && (to == ch || to == vch) )
continue;
point = buf;
str = format;
while ( *str != '\0' )
{
if ( *str != '$' )
{
*point++ = *str++;
continue;
}
++str;
if ( arg2 == NULL && *str >= 'A' && *str <= 'Z' )
{
bug( "Act: missing arg2 for code %d.", *str );
i = " <@@@> ";
}
else
{
switch ( *str )
{
default: bug( "Act: bad code %d.", *str );
i = " <@@@> "; break;
/* Thx alex for 't' idea */
case 't': i = (char *) arg1; break;
case 'T': i = (char *) arg2; break;
case 'n': i = PERS( ch, to ); break;
case 'N': i = PERS( vch, to ); break;
case 'e': i = he_she [URANGE(0, ch ->sex, 2)]; break;
case 'E': i = he_she [URANGE(0, vch ->sex, 2)]; break;
case 'm': i = him_her [URANGE(0, ch ->sex, 2)]; break;
case 'M': i = him_her [URANGE(0, vch ->sex, 2)]; break;
case 's': i = his_her [URANGE(0, ch ->sex, 2)]; break;
case 'S': i = his_her [URANGE(0, vch ->sex, 2)]; break;
case 'p':
i = can_see_obj( to, obj1 )
? obj1->short_descr
: "something";
break;
case 'P':
i = can_see_obj( to, obj2 )
? obj2->short_descr
: "something";
break;
case 'd':
if ( arg2 == NULL || ((char *) arg2)[0] == '\0' )
{
i = "door";
}
else
{
one_argument( (char *) arg2, fname );
i = fname;
}
break;
}
}
++str;
while ( ( *point = *i ) != '\0' )
++point, ++i;
}
*point++ = '\n';
*point++ = '\r';
buf[0] = UPPER(buf[0]);
if (to->desc)
write_to_buffer( to->desc, buf, point - buf );
if (MOBtrigger)
mprog_act_trigger( buf, to, ch, obj1, vch );
/* Added by Kahn */
}
MOBtrigger = TRUE;
return;
}
/*
* Macintosh support functions.
*/
#if defined(macintosh)
int gettimeofday( struct timeval *tp, void *tzp )
{
tp->tv_sec = time( NULL );
tp->tv_usec = 0;
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -