#include <ctype.h> #include <sys/types.h> #include <stdio.h> #include <stdlib.h> #include <syslog.h> #include "define.h" #include "struct.h" void press_return( link_data* link ) { send( link, "\n\rPress <return> to continue." ); return; } bool no_input( link_data* link, char* argument ) { if( *argument != '\0' ) return FALSE; send( link, "\n\r>> No input received - closing link <<\n\r" ); close_socket( link, TRUE ); return TRUE; } void set_playing( link_data* link ) { link_data* prev; link->connected = CON_PLAYING; remove( link_list, link ); if( link_list == NULL || ( link_list->connected == CON_PLAYING && strcmp( link_list->pfile->name, link->pfile->name ) > 0 ) ) { link->next = link_list; link_list = link; return; } for( prev = link_list; prev->next != NULL; prev = prev->next ) if( prev->next->connected == CON_PLAYING && strcmp( prev->next->pfile->name, link->pfile->name ) > 0 ) break; link->next = prev->next; prev->next = link; } bool game_wizlocked( link_data* link ) { if( !wizlock ) return FALSE; help_link( link, "Game_Wizlocked" ); close_socket( link, TRUE ); return TRUE; } /* * ENTERING GAME ROUTINE */ room_data* get_temple( char_data* ch ) { room_data* room = NULL; if( ch->shdata->race < MAX_PLYR_RACE ) room = get_room_index( plyr_race_table[ ch->shdata->race ].start_room[ ch->shdata->alignment%3 ] ); if( room == NULL ) room = get_room_index( ROOM_CHIIRON_TEMPLE ); return room; } room_data* get_portal( char_data* ch ) { room_data* room = NULL; if( ch->shdata->race < MAX_PLYR_RACE ) room = get_room_index( plyr_race_table[ ch->shdata->race ].portal ); if( room == NULL ) room = get_temple( ch ); return room; } void enter_room( char_data* ch ) { char_data* pet; room_data* room; int i; if( ( !is_set( ch->pcdata->pfile->flags, PLR_CRASH_QUIT ) && current_time-boot_time > 30*60 ) || ch->pcdata->pfile->last_on > boot_time || ch->shdata->level >= LEVEL_APPRENTICE || !is_set( ch->pcdata->pfile->flags, PLR_PORTAL ) ) { ch->To( ch->was_in_room == NULL ? get_temple( ch ) : ch->was_in_room ); return; } room = get_portal( ch ); for( i = 0; i < ch->followers.size; i++ ) { pet = ch->followers.list[i]; if( pet->was_in_room == ch->was_in_room ) pet->was_in_room = room; } ch->To( room ); } void enter_game( char_data* ch ) { char tmp1 [ TWO_LINES ]; char tmp2 [ TWO_LINES ]; char_data* pet; pfile_data* pfile = ch->pcdata->pfile; int i; if( ch->shdata->level == 0 ) new_player( player( ch ) ); else enter_room( ch ); if( ch->position == POS_FIGHTING ) ch->position = POS_STANDING; if( ch->shdata->race < MAX_PLYR_RACE ) { ch->affected_by[0] |= plyr_race_table[ch->shdata->race].affect[0]; ch->affected_by[1] |= plyr_race_table[ch->shdata->race].affect[1]; } sprintf( tmp1, "%s@%s has connected.", ch->descr->name, ch->link->host ); sprintf( tmp2, "%s has connected.", ch->descr->name ); info( tmp2, LEVEL_DEMIGOD, tmp1, IFLAG_LOGINS, 1, ch ); ch->was_in_room = NULL; send_seen( ch, "%s has entered the game.\n\r", ch ); clear_screen( ch ); do_look( ch, "" ); for( i = 0; i < ch->followers.size; i++ ) { pet = ch->followers.list[i]; if( pet->was_in_room == NULL ) pet->was_in_room = get_temple( ch ); pet->To( pet->was_in_room ); send_seen( pet, "%s comes out of the void.\n\r", pet ); pet->was_in_room = NULL; } send( "\n\r", ch ); send_centered( ch, "---==|==---" ); send( "\n\r", ch ); if( pfile->last_host[0] != '\0' ) { sprintf( tmp2, "Last login was %s from %s.", ltime( pfile->last_on ), pfile->last_host ); } else sprintf( tmp2, "Connection is from %s.", ch->link->host ); send_centered( ch, tmp2 ); if( pfile->guesses > 0 ) { send( ch, "\n\r" ); send_centered( ch, "INCORRECT PASSWORD ATTEMPTS: %d", pfile->guesses ); pfile->guesses = 0; } if( pfile->account != NULL ) pfile->account->last_login = current_time; if( strcasecmp( ch->link->host, pfile->last_host ) ) { remove_list( site_list, site_entries, pfile ); free_string( pfile->last_host, MEM_PFILE ); pfile->last_host = alloc_string( ch->link->host, MEM_PFILE ); add_list( site_list, site_entries, pfile ); } mail_message( ch ); auction_message( ch ); recent_notes( ch ); set_bit( pfile->flags, PLR_SAFE_KILL ); set_bit( pfile->flags, PLR_CRASH_QUIT ); set_bit( &ch->status, STAT_IN_GROUP ); remove_bit( &ch->status, STAT_BERSERK ); remove_bit( &ch->status, STAT_REPLY_LOCK ); remove_bit( &ch->status, STAT_FORCED ); ch->timer = current_time; reconcile_recognize( ch ); } /* * NANNY ROUTINES */ void nanny_intro( link_data* link, char* argument ) { bool suppress_echo; pfile_data* pfile; for( ; !isalnum( *argument ) && *argument != '+' && *argument != '-' && *argument != '\0'; argument++ ); switch( atoi( argument ) ) { case 1: help_link( link, "Acnt_Menu" ); send( link, " Choice: " ); link->connected = CON_ACNT_MENU; return; case 2: if( !game_wizlocked( link ) ) { help_link( link, "Enter_Acnt" ); send( link, "Account: " ); link->connected = CON_ACNT_ENTER; } return; case 3: help_link( link, "Features_1" ); link->connected = CON_FEATURES; return; case 4: help_link( link, "Policy_1" ); link->connected = CON_POLICIES; return; case 5: help_link( link, "Digitalnation_1" ); link->connected = CON_DIGITALNATION; return; case 6: help_link( link, "Problems" ); link->connected = CON_PAGE; return; } if( suppress_echo = ( *argument == '-' ) ) argument++; if( *argument == '\0' ) { send( link, "\n\r>> No choice made - closing link. <<\n\r" ); close_socket( link, TRUE ); return; } pfile = find_pfile_exact( argument ); link->pfile = pfile; if( pfile == NULL ) { help_link( link, "Unfound_Char" ); link->connected = CON_PAGE; return; } if( pfile->trust < LEVEL_APPRENTICE && game_wizlocked( link ) ) return; if( is_banned( pfile->account, link ) ) return; send( link, " Password: " ); if( !suppress_echo ) { send( link, echo_off_str ); link->connected = CON_PASSWORD_ECHO; } else { link->connected = CON_PASSWORD_NOECHO; } } /* * NAME/PASSWORD */ void nanny_old_password( link_data* link, char* argument ) { char buf [ ONE_LINE ]; player_data* ch = link->player; player_data* ch_old; link_data* link_old; send( link, "\n\r" ); if( link->connected == CON_PASSWORD_ECHO ) send( link, echo_on_str ); if( strcmp( argument, link->pfile->pwd ) ) { if( *argument != '\0' && link->pfile->guesses++ > 25 ) { bug( "Attempting to crack password for %s?", link->pfile->name ); bug( "-- Site: %s", link->host ); bug( "-- Attempts: %d", link->pfile->guesses ); bug( "-- Guess: %s", argument ); } help_link( link, "Wrong_Password" ); close_socket( link, TRUE ); return; } for( link_old = link_list; link_old != NULL; link_old = link_old->next ) if( link_old != link && link_old->player != NULL && link_old->pfile == link->pfile && past_password( link_old ) ) { send( link, "Already playing!\n\rDisconnect previous link? " ); link->connected = CON_DISC_OLD; return; } for( int i = 0; i < player_list; i++ ) { ch_old = player_list[i]; if( ch_old->Is_Valid( ) && ch_old->pcdata->pfile == link->pfile ) { link->character = ch_old; link->player = ch_old; ch_old->link = link; ch_old->timer = current_time; sprintf( buf, "%s@%s reconnected.", ch_old->descr->name, link->host ); info( "", LEVEL_DEMIGOD, buf, IFLAG_LOGINS ); set_playing( link ); setup_screen( ch_old ); send( ch_old, "Reconnecting.\n\r" ); send_seen( ch_old, "%s has reconnected.\n\r", ch_old ); return; } } if( !load_char( link, link->pfile->name, PLAYER_DIR ) ) { send( link, "\n\r+++ Error getting player file +++\n\r" ); bug( "Error finding player file" ); bug( "-- Player = '%s'", link->pfile->name ); close_socket( link ); return; } ch = link->player; if( get_trust( ch ) < LEVEL_APPRENTICE ) { nanny_imotd( link, "" ); return; } send( link, "\n\r" ); clear_screen( ch ); do_help( ch, "imotd" ); press_return( link ); link->connected = CON_READ_IMOTD; } /* * MESSAGE OF THE DAY ROUTINES */ void nanny_imotd( link_data* link, char* ) { send( link, "\n\r" ); clear_screen( link->character ); do_help( link->character, "motd" ); press_return( link ); link->connected = CON_READ_MOTD; return; } void nanny_motd( link_data* link, char* ) { char_data* ch = link->character; send( link, "\n\r" ); setup_screen( ch ); set_playing( link ); enter_game( ch ); return; } void nanny_disc_old( link_data* link, char* argument ) { link_data* link_prev = link; if( toupper( *argument ) != 'Y' ) { send( link, "Ok. Good Bye then.\n\r" ); close_socket( link, TRUE ); return; } for( ; link_prev != NULL; link_prev = link_prev->next ) if( link_prev != link && link_prev->pfile == link->pfile && past_password( link_prev ) ) break; if( link_prev == NULL ) { link->connected = CON_PASSWORD_NOECHO;; nanny( link, link->pfile->pwd ); return; } swap( link_prev->channel, link->channel ); swap( link_prev->host, link->host ); send( link, "\n\r\n\r+++ Link closed by new login +++\n\r" ); close_socket( link, TRUE ); switch( link_prev->connected ) { case CON_PLAYING : do_look( link_prev->character, "" ); break; case CON_READ_MOTD : case CON_READ_IMOTD : nanny_motd( link_prev, "" ); break; } }