📄 win32srv.c
字号:
do_help( ch, "imotd" );
do_help( ch, "motd" );
ch->pcdata->pagelen = lines;
d->connected = CON_READ_MOTD;
break;
case CON_CONFIRM_NEW_NAME:
switch ( *argument )
{
case 'y': case 'Y':
sprintf( buf, "New character.\n\rGive me a password for %s: %s",
ch->name, echo_off_str );
write_to_buffer( d, buf, 0 );
d->connected = CON_GET_NEW_PASSWORD;
break;
case 'n': case 'N':
write_to_buffer( d, "Ok, what IS it, then? ", 0 );
free_char( d->character );
d->character = NULL;
d->connected = CON_GET_NAME;
break;
default:
write_to_buffer( d, "Please type Yes or No? ", 0 );
break;
}
break;
case CON_GET_NEW_PASSWORD:
#if defined(unix)
write_to_buffer( d, "\n\r", 2 );
#endif
if ( strlen(argument) < 3 )
{
write_to_buffer( d,
"Password must be at least three characters long.\n\rPassword: ",
0 );
return;
}
pwdnew = crypt( argument, ch->name );
for ( p = pwdnew; *p != '\0'; p++ )
{
if ( *p == '~' )
{
write_to_buffer( d,
"New password not acceptable, try again.\n\rPassword: ",
0 );
return;
}
}
free_string( ch->pcdata->pwd );
ch->pcdata->pwd = str_dup( pwdnew );
write_to_buffer( d, "Please retype password: ", 0 );
d->connected = CON_CONFIRM_NEW_PASSWORD;
break;
case CON_CONFIRM_NEW_PASSWORD:
#if defined(unix)
write_to_buffer( d, "\n\r", 2 );
#endif
if ( strcmp( crypt( argument, ch->pcdata->pwd ), ch->pcdata->pwd ) )
{
write_to_buffer( d, "Passwords don't match.\n\rRetype password: ",
0 );
d->connected = CON_GET_NEW_PASSWORD;
return;
}
write_to_buffer( d, echo_on_str, 0 );
write_to_buffer( d, "What is your sex (M/F/N)? ", 0 );
d->connected = CON_GET_NEW_SEX;
break;
case CON_GET_NEW_SEX:
switch ( argument[0] )
{
case 'm': case 'M': ch->sex = SEX_MALE; break;
case 'f': case 'F': ch->sex = SEX_FEMALE; break;
case 'n': case 'N': ch->sex = SEX_NEUTRAL; break;
default:
write_to_buffer( d, "That's not a sex.\n\rWhat IS your sex? ", 0 );
return;
}
strcpy( buf, "Select a class [" );
for ( iClass = 0; iClass < MAX_CLASS; iClass++ )
{
if ( iClass > 0 )
strcat( buf, " " );
strcat( buf, class_table[iClass].who_name );
}
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;
}
/*
* Low level output function.
*/
bool process_output( DESCRIPTOR_DATA *d, bool fPrompt )
{
extern bool merc_down;
/*
* Bust a prompt.
*/
if ( fPrompt && !merc_down && d->connected == CON_PLAYING )
if ( d->showstr_point )
write_to_buffer( d,
"[Please type (c)ontinue, (r)efresh, (b)ack, (h)elp, (q)uit, or RETURN]: ",
0 );
else
{
CHAR_DATA *ch;
ch = d->original ? d->original : d->character;
if ( IS_SET(ch->act, PLR_BLANK) )
write_to_buffer( d, "\n\r", 2 );
if ( IS_SET(ch->act, PLR_PROMPT) )
bust_a_prompt( ch );
if ( IS_SET(ch->act, PLR_TELNET_GA) )
write_to_buffer( d, go_ahead_str, 0 );
}
/*
* Short-circuit if nothing to write.
*/
if ( d->outtop == 0 )
return TRUE;
/*
* Snoop-o-rama.
*/
if ( d->snoop_by != NULL )
{
write_to_buffer( d->snoop_by, "% ", 2 );
write_to_buffer( d->snoop_by, d->outbuf, d->outtop );
}
/*
* OS-dependent output.
*/
if ( !write_to_descriptor( d->descriptor, d->outbuf, d->outtop ) )
{
d->outtop = 0;
return FALSE;
}
else
{
d->outtop = 0;
return TRUE;
}
}
/*
* Bust a prompt (player settable prompt)
* coded by Morgenes for Aldara Mud
*/
void bust_a_prompt( CHAR_DATA *ch )
{
char buf[MAX_STRING_LENGTH];
char buf2[MAX_STRING_LENGTH];
const char *str;
const char *i;
char *point;
if( ch->prompt == NULL || ch->prompt[0] == '\0' )
{
send_to_char( "\n\r\n\r", ch );
return;
}
point = buf;
str = ch->prompt;
while( *str != '\0' )
{
if( *str != '%' )
{
*point++ = *str++;
continue;
}
++str;
switch( *str )
{
default :
i = " "; break;
case 'h' :
sprintf( buf2, "%d", ch->hit );
i = buf2; break;
case 'H' :
sprintf( buf2, "%d", ch->max_hit );
i = buf2; break;
case 'm' :
sprintf( buf2, "%d", ch->mana );
i = buf2; break;
case 'M' :
sprintf( buf2, "%d", ch->max_mana );
i = buf2; break;
case 'v' :
sprintf( buf2, "%d", ch->move );
i = buf2; break;
case 'V' :
sprintf( buf2, "%d", ch->max_move );
i = buf2; break;
case 'x' :
sprintf( buf2, "%d", ch->exp );
i = buf2; break;
case 'g' :
sprintf( buf2, "%d", ch->gold);
i = buf2; break;
case 'a' :
if( ch->level < 5 )
sprintf( buf2, "%d", ch->alignment );
else
sprintf( buf2, "%s", IS_GOOD(ch) ? "good" : IS_EVIL(ch) ?
"evil" : "neutral" );
i = buf2; break;
case 'r' :
if( ch->in_room != NULL )
sprintf( buf2, "%s", ch->in_room->name );
else
sprintf( buf2, " " );
i = buf2; break;
case 'R' :
if( IS_IMMORTAL( ch ) && ch->in_room != NULL )
sprintf( buf2, "%d", ch->in_room->vnum );
else
sprintf( buf2, " " );
i = buf2; break;
case 'z' :
if( IS_IMMORTAL( ch ) && ch->in_room != NULL )
sprintf( buf2, "%s", ch->in_room->area->name );
else
sprintf( buf2, " " );
i = buf2; break;
case '%' :
sprintf( buf2, "%%" );
i = buf2; break;
}
++str;
while( (*point = *i) != '\0' )
++point, ++i;
}
write_to_buffer( ch->desc, buf, point - buf );
return;
}
/* 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;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -