📄 win32srv.c
字号:
}
#if defined(MSDOS)
break;
#endif
}
gettimeofday( &now_time, NULL );
delta = ( now_time.tv_sec - last_time.tv_sec ) * 1000 * 1000
+ ( now_time.tv_usec - last_time.tv_usec );
if ( delta >= 1000000 / PULSE_PER_SECOND )
break;
}
last_time = now_time;
current_time = (time_t) last_time.tv_sec;
fBackground--;
}
}
merc_done:
return(msg.wParam);
#else
while ( !merc_down )
{
/*
* Process input.
*/
for ( d = descriptor_list; d != NULL; d = d_next )
{
d_next = d->next;
d->fcommand = FALSE;
#if defined(MSDOS)
if ( kbhit( ) )
#endif
{
if ( d->character != NULL )
d->character->timer = 0;
if ( !read_from_descriptor( d ) )
{
if ( d->character != NULL )
save_char_obj( d->character );
d->outtop = 0;
close_socket( d );
continue;
}
}
if ( d->character != NULL && d->character->wait > 0 )
{
--d->character->wait;
continue;
}
read_from_buffer( d );
if ( d->incomm[0] != '\0' )
{
d->fcommand = TRUE;
stop_idling( d->character );
if ( d->connected == CON_PLAYING )
if ( d->showstr_point )
show_string( d, d->incomm );
else
interpret( d->character, d->incomm );
else
nanny( d, d->incomm );
d->incomm[0] = '\0';
}
}
/*
* Autonomous game motion.
*/
update_handler( );
/*
* Output.
*/
for ( d = descriptor_list; d != NULL; d = d_next )
{
d_next = d->next;
if ( ( d->fcommand || d->outtop > 0 ) )
{
if ( !process_output( d, TRUE ) )
{
if ( d->character != NULL )
save_char_obj( d->character );
d->outtop = 0;
close_socket( d );
}
}
}
/*
* Synchronize to a clock.
* Busy wait (blargh).
*/
now_time = last_time;
for ( ; ; )
{
int delta;
#if defined(MSDOS)
if ( kbhit( ) )
#endif
{
if ( dcon.character != NULL )
dcon.character->timer = 0;
if ( !read_from_descriptor( &dcon ) )
{
if ( dcon.character != NULL )
save_char_obj( d->character );
dcon.outtop = 0;
close_socket( &dcon );
}
#if defined(MSDOS)
break;
#endif
}
gettimeofday( &now_time, NULL );
delta = ( now_time.tv_sec - last_time.tv_sec ) * 1000 * 1000
+ ( now_time.tv_usec - last_time.tv_usec );
if ( delta >= 1000000 / PULSE_PER_SECOND )
break;
}
last_time = now_time;
current_time = (time_t) last_time.tv_sec;
}
return;
#endif
}
//int main( int argc, char **argv )
int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrev, LPSTR lpszCmdLine, int nCmdShow)
{
struct timeval now_time;
// int port;
#if defined(unix)
int control;
#endif
/*
* Memory debugging if needed.
*/
#if defined(MALLOC_DEBUG)
malloc_debug( 2 );
#endif
/*
* Init time.
*/
gettimeofday( &now_time, NULL );
current_time = (time_t) now_time.tv_sec;
strcpy( str_boot_time, ctime( ¤t_time ) );
/*
* Macintosh console initialization.
*/
#if defined(macintosh)
console_options.nrows = 31;
cshow( stdout );
csetmode( C_RAW, stdin );
cecho2file( "log file", 1, stderr );
#endif
#if 0
/*
* Reserve one channel for our use.
*/
if ( ( fpReserve = fopen( NULL_FILE, "r" ) ) == NULL )
{
perror( NULL_FILE );
return 1;
}
#endif
#if 0
/*
* Get the port number.
*/
port = 1234;
if ( lpszCmdLine[0] )
{
if ( !is_number( lpszCmdLine ) )
{
fprintf( stderr, "Usage: WinMerc [port #]\n" );
return 1;
}
else if ( ( port = atoi( lpszCmdLine ) ) <= 1024 )
{
fprintf( stderr, "Port number must be above 1024.\n" );
return 1;
}
}
#endif
#if 0
/*
* Run the game.
*/
#if defined(macintosh) || defined(MSDOS)
boot_db( );
log_string( "Merc is ready to rock." );
game_loop_mac_msdos( );
#endif
#if defined(unix)
control = init_socket( port );
boot_db( );
sprintf( log_buf, "Merc is ready to rock on port %d.", port );
log_string( log_buf );
game_loop_unix( control );
close( control );
#endif
#else
boot_db( );
// MessageBox(0, "Merc is ready to rock", "@@@", MB_ICONINFORMATION|MB_OK);
log_string( "Merc is ready to rock." );
game_loop_win32(hInstance, hPrev, nCmdShow);
#endif
/*
* That's all, folks.
*/
log_string( "Normal termination of game." );
return 0;
}
// @@@ Orig junk
/*
* 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;
}
/*
* Append onto an output buffer.
*/
void write_to_buffer( DESCRIPTOR_DATA *d, const char *txt, int length )
{
/*
* Find length in case caller didn't.
*/
if ( length <= 0 )
length = strlen(txt);
/*
* Initial \n\r if needed.
*/
if ( d->outtop == 0 && !d->fcommand )
{
d->outbuf[0] = '\n';
d->outbuf[1] = '\r';
d->outtop = 2;
}
/*
* Expand the buffer as needed.
*/
while ( d->outtop + length >= d->outsize )
{
char *outbuf;
outbuf = alloc_mem( 2 * d->outsize );
strncpy( outbuf, d->outbuf, d->outtop );
free_mem( d->outbuf, d->outsize );
d->outbuf = outbuf;
d->outsize *= 2;
}
/*
* Copy.
*/
strcpy( d->outbuf + d->outtop, txt );
d->outtop += length;
return;
}
void close_socket( DESCRIPTOR_DATA *dclose )
{
CHAR_DATA *ch;
if ( dclose->outtop > 0 )
process_output( dclose, FALSE );
if ( dclose->snoop_by != NULL )
{
write_to_buffer( dclose->snoop_by,
"Your victim has left the game.\n\r", 0 );
}
{
DESCRIPTOR_DATA *d;
for ( d = descriptor_list; d != NULL; d = d->next )
{
if ( d->snoop_by == dclose )
d->snoop_by = NULL;
}
}
if ( ( ch = dclose->character ) != NULL )
{
sprintf( log_buf, "Closing link to %s.", ch->name );
log_string( log_buf );
if ( dclose->connected == CON_PLAYING )
{
act( "$n has lost $s link.", ch, NULL, NULL, TO_ROOM );
ch->desc = NULL;
}
else
{
free_char( dclose->character );
}
}
if ( d_next == dclose )
d_next = d_next->next;
if ( dclose == descriptor_list )
{
descriptor_list = descriptor_list->next;
}
else
{
DESCRIPTOR_DATA *d;
for ( d = descriptor_list; d && d->next != dclose; d = d->next )
;
if ( d != NULL )
d->next = dclose->next;
else
bug( "Close_socket: dclose not found.", 0 );
}
// close( dclose->descriptor );
free_string( dclose->host );
dclose->next = descriptor_free;
descriptor_free = dclose;
//@@@#if defined(MSDOS) || defined(macintosh)
exit(1);
//@@@#endif
return;
}
/*
* Lowest level output function.
* Write a block of text to the file descriptor.
* If this gives errors on very long blocks (like 'ofind all'),
* try lowering the max block size.
*/
bool write_to_descriptor( int desc, char *txt, int length )
{
int iStart;
int nWrite;
int nBlock;
#if defined(macintosh) || defined(MSDOS)
if ( desc == 0 )
desc = 1;
#endif
char c;
if ( length <= 0 )
length = strlen(txt);
#if 0
for ( iStart = 0; iStart < length; iStart += nWrite )
{
nBlock = UMIN( length - iStart, 4096 );
if ( ( nWrite = write( desc, txt + iStart, nBlock ) ) < 0 )
{ perror( "Write_to_descriptor" ); return FALSE; }
}
#else
c = txt[length];
txt[length] = '\0';
// MessageBox(0, txt, "@@@", MB_ICONINFORMATION|MB_OK);
SendMessage(hWndOutput, WM_SETTEXT, 0, (LPARAM) txt);
txt[length] = c;
#endif
return TRUE;
}
/*
* Deal with sockets that haven't logged in yet.
*/
void nanny( DESCRIPTOR_DATA *d, char *argument )
{
char buf[MAX_STRING_LENGTH];
CHAR_DATA *ch;
NOTE_DATA *pnote;
char *pwdnew;
char *p;
int iClass;
int lines;
int notes;
bool fOld;
while ( isspace(*argument) )
argument++;
ch = d->character;
switch ( d->connected )
{
default:
bug( "Nanny: bad d->connected %d.", d->connected );
close_socket( d );
return;
case CON_GET_NAME:
if ( argument[0] == '\0' )
{
close_socket( d );
return;
}
argument[0] = UPPER(argument[0]);
if ( !check_parse_name( argument ) )
{
write_to_buffer( d, "Illegal name, try another.\n\rName: ", 0 );
return;
}
fOld = load_char_obj( d, argument );
ch = d->character;
if ( IS_SET(ch->act, PLR_DENY) )
{
sprintf( log_buf, "Denying access to %s@%s.", argument, d->host );
log_string( log_buf );
write_to_buffer( d, "You are denied access.\n\r", 0 );
close_socket( d );
return;
}
if ( check_reconnect( d, argument, FALSE ) )
{
fOld = TRUE;
}
else
{
if ( wizlock && !IS_HERO( ch ) && !ch->wizbit )
{
write_to_buffer( d, "The game is wizlocked.\n\r", 0 );
close_socket( d );
return;
}
}
if ( fOld )
{
/* Old player */
write_to_buffer( d, "Password: ", 0 );
write_to_buffer( d, echo_off_str, 0 );
d->connected = CON_GET_OLD_PASSWORD;
return;
}
else
{
/* New player */
/* New characters with same name fix by Salem's Lot */
if ( check_playing( d, ch->name ) )
return;
sprintf( buf, "Did I get that right, %s (Y/N)? ", argument );
write_to_buffer( d, buf, 0 );
d->connected = CON_CONFIRM_NEW_NAME;
return;
}
break;
case CON_GET_OLD_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, "Wrong password.\n\r", 0 );
close_socket( d );
return;
}
write_to_buffer( d, echo_on_str, 0 );
if ( check_reconnect( d, ch->name, TRUE ) )
return;
if ( check_playing( d, ch->name ) )
return;
sprintf( log_buf, "%s@%s has connected.", ch->name, d->host );
log_string( log_buf );
lines = ch->pcdata->pagelen;
ch->pcdata->pagelen = 20;
if ( IS_HERO(ch) )
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -