/* Change press enter to continue for java to place enter after. */ /* Some code taken from two other codebases - functions taken not in use */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #include "emlen.h" #include "mush.h" #ifdef WINDOWS #include <sys\types.h> #define FD_SETSIZE 1024 #include <winsock.h> typedef SOCKET socket_t; #define CLOSESOCKET(sock) while (closesocket(sock) < 0) ; #include <direct.h> // #include <mmsystem.h> #include "telnet.h" WSADATA wsaData; #else /* We're on unix if below */ #define CLOSESOCKET(sock) close(sock) #include <sys/types.h> #ifdef Linux #include <sys/time.h> #endif #include <ctype.h> #include <errno.h> #ifdef netBSD #include <unistd.h> #endif /*#ifdef Linux #include "mush.h" #endif*/ #endif #ifndef NEW_WORLD char *ssc="5454a11fkk43kt34ds8xzall"; #endif #define ASK_MAP 16097 bool action_off = FALSE; DESCRIPTOR_DATA *descriptor_free = NULL; /* Free list for descriptors */ DESCRIPTOR_DATA *descriptor_list = NULL; /* All open descriptors */ DESCRIPTOR_DATA *d_next; /* Next descriptor in loop */ //FILE *fpReserve; /* Reserved file handle */ bool aturion_down; /* Shutdown */ bool wizlock; /* Game is wizlocked */ char str_boot_time[SML_LENGTH]; time_t current_time; /* Time of this pulse */ /* * OS-dependent local functions. */ void game_loop_unix (socket_t control, int control2); socket_t init_socket (int port); void new_descriptor (socket_t, bool); bool read_from_descriptor (DESCRIPTOR_DATA * d); bool write_to_descriptor (socket_t desc, char *txt, int length); bool write_to_descriptor2 (DESCRIPTOR_DATA * d, char *txt, int length); /* * Other local functions (OS-independent). */ bool gr = TRUE; bool check_parse_name (char *name, bool space_allowed); bool check_reconnect (DESCRIPTOR_DATA * d, char *name, bool fConn); bool check_playing (DESCRIPTOR_DATA * d, char *name); int main (int argc, char **argv); void handle_connecting (DESCRIPTOR_DATA * d, char *argy); bool process_output (DESCRIPTOR_DATA * d, bool fPrompt); void read_from_buffer (DESCRIPTOR_DATA * d); void stop_idling (CHAR_DATA * ch); void print_prompt (CHAR_DATA * ch); char *anseval (const char *txt, CHAR_DATA * to); static int area_this_reboot; bool is_equipwipe = FALSE; char wont_echo[] = { IAC, WONT, TELOPT_ECHO, '\0' }; #ifndef NEW_WORLD char *sscc="32lloidjskjkrhserteruren541+2ans11dm0"; #endif char will_echo[] = { IAC, WILL, TELOPT_ECHO, '\0' }; char wont_suppress_ga[] = { IAC, WILL, TELOPT_SGA, '\0' }; char will_suppress_ga[] = { IAC, WILL, TELOPT_SGA, '\0' }; char dontecho[] = { IAC, DONT, TELOPT_ECHO, '\0' }; char doecho[] = { IAC, DO, TELOPT_ECHO, '\0' }; char echo_off_str[] = { IAC, WILL, TELOPT_ECHO, '\0' }; char echo_on_str[] = { IAC, WONT, TELOPT_ECHO, '\0' }; char go_ahead_str[] = { IAC, GA, '\0' }; char linemode_off[] = { IAC, WILL, TELOPT_SGA, '\0' }; char linemode_on[] = { IAC, WONT, TELOPT_SGA, '\0' }; /* Windows doesn't have gettimeofday, so we'll simulate it. */ #ifdef WINDOWS void gettimeofday(struct timeval *t, struct timezone *dummy) { int millisec = GetTickCount(); t->tv_sec = (int) (millisec / 1000); t->tv_usec = (millisec % 1000) * 1000; } #endif char * add_color (char *txt) { int len = 0; char *t; char *r; char cod; char *ret; for (t = txt; *t != '\0'; t++) { if (*t == '{') { len += 6; continue; } len++; } ret = malloc (len + 1); r = ret; for (t = txt; *t != '\0'; t++) { if (*t == '{') { if (*(t + 1) != '\0' && *(t + 2) != '\0' && *(t + 2) == '}') { t++; cod = *t; t++; if (cod == 'b') { *r++ = '\x1B'; *r++ = '['; *r++ = '0'; *r++ = ';'; *r++ = '3'; *r++ = '4'; *r++ = 'm'; } if (cod == 'B') { *r++ = '\x1B'; *r++ = '['; *r++ = '1'; *r++ = ';'; *r++ = '3'; *r++ = '4'; *r++ = 'm'; } if (cod == 'g') { *r++ = '\x1B'; *r++ = '['; *r++ = '0'; *r++ = ';'; *r++ = '3'; *r++ = '2'; *r++ = 'm'; } if (cod == 'G') { *r++ = '\x1B'; *r++ = '['; *r++ = '1'; *r++ = ';'; *r++ = '3'; *r++ = '2'; *r++ = 'm'; } if (cod == 'c') { *r++ = '\x1B'; *r++ = '['; *r++ = '0'; *r++ = ';'; *r++ = '3'; *r++ = '6'; *r++ = 'm'; } if (cod == 'C') { *r++ = '\x1B'; *r++ = '['; *r++ = '1'; *r++ = ';'; *r++ = '3'; *r++ = '6'; *r++ = 'm'; } if (cod == 'b') { *r++ = '\x1B'; *r++ = '['; *r++ = '0'; *r++ = ';'; *r++ = '3'; *r++ = '4'; *r++ = 'm'; } if (cod == 'w') { *r++ = '\x1B'; *r++ = '['; *r++ = '0'; *r++ = ';'; *r++ = '3'; *r++ = '7'; *r++ = 'm'; } if (cod == 'W') { *r++ = '\x1B'; *r++ = '['; *r++ = '1'; *r++ = ';'; *r++ = '3'; *r++ = '7'; *r++ = 'm'; } if (UPPER (cod) == 'N') { *r++ = '\x1B'; *r++ = '['; *r++ = '0'; *r++ = ';'; *r++ = '3'; *r++ = '7'; *r++ = 'm'; } if (cod == 'p') { *r++ = '\x1B'; *r++ = '['; *r++ = '0'; *r++ = ';'; *r++ = '3'; *r++ = '5'; *r++ = 'm'; } if (cod == 'P') { *r++ = '\x1B'; *r++ = '['; *r++ = '1'; *r++ = ';'; *r++ = '3'; *r++ = '5'; *r++ = 'm'; } if (cod == 'd') { *r++ = '\x1B'; *r++ = '['; *r++ = '1'; *r++ = ';'; *r++ = '3'; *r++ = '0'; *r++ = 'm'; } if (cod == 'r') { *r++ = '\x1B'; *r++ = '['; *r++ = '0'; *r++ = ';'; *r++ = '3'; *r++ = '1'; *r++ = 'm'; } if (cod == 'R') { *r++ = '\x1B'; *r++ = '['; *r++ = '1'; *r++ = ';'; *r++ = '3'; *r++ = '1'; *r++ = 'm'; } if (cod == 'Y') { *r++ = '\x1B'; *r++ = '['; *r++ = '1'; *r++ = ';'; *r++ = '3'; *r++ = '3'; *r++ = 'm'; } if (cod == 'y') { *r++ = '\x1B'; *r++ = '['; *r++ = '0'; *r++ = ';'; *r++ = '3'; *r++ = '3'; *r++ = 'm'; } continue; } } *r = *t; r++; } *r = '\0'; return ret; } FILE *ffg; CHAR_DATA *orn; CHAR_DATA *smack; CHAR_DATA *palio; int monthly_key; void save_monthly_key(void) { FILE *fp; if ( (fp=fopen("mkey.dat","w+")) == NULL ) { /* Bad! */ return;} fprintf(fp,"%d\n",monthly_key); fclose(fp); return; } void read_monthly_key(void) { FILE *fp; if ( (fp=fopen("mkey.dat","r")) == NULL ) { monthly_key=0; save_monthly_key(); return; } monthly_key=fread_number(fp); fclose(fp); return; } void set_monthly_key(CHAR_DATA *ch, char *argy) { char arg1[500]; DEFINE_COMMAND("z_monthly",set_monthly_key,POSITION_DEAD,110,LOG_ALWAYS,"Sets the monthly key.. private.") if (str_cmp(NAME(ch),"Orin")) return; argy=one_argy(argy,arg1); if (arg1[0]=='\0' || !is_number(arg1)) { sprintf(arg1,"Monthly key now is %d.\n\r",monthly_key); send_to_char(arg1,ch); return; } monthly_key=atoi(arg1); send_to_char("Monthly key set.\n\r",ch); save_monthly_key(); return; } socket_t control; int main (int argc, char **argv) { struct timeval now_time; int port; bool uncrypt; bool is_cleanup; bool is_skillwipe; static int control2; read_monthly_key(); fprintf(stderr,"Monthly key is %d.\n",monthly_key); gettimeofday (&now_time, NULL); current_time = (time_t) now_time.tv_sec; strcpy (str_boot_time, ctime (¤t_time)); if (yes_log_all) { ffg = fopen ("tll.l", "a+"); } /* Idea borrowed from diku.. keep 1 file reserved so we don't get a super crash error if we run out of file descriptors! */ #ifndef WINDOWS /* if ((fpReserve = fopen (NULL_FILE, "r")) == NULL) { perror (NULL_FILE); exit (99); } */ #endif area_this_reboot = 0; uncrypt = FALSE; is_cleanup = FALSE; is_skillwipe = FALSE; is_equipwipe = FALSE; port = 4443; if (argc > 1) { if (!is_number (argv[1])) { fprintf (stderr, "%s\n", argv[1]); if (!str_cmp (argv[1], "Equipmentwipe")) { is_equipwipe = TRUE; } else if (!str_cmp (argv[1], "Skillwipe")) { is_skillwipe = TRUE; } else if (!str_cmp (argv[1], "Uncrypt")) { uncrypt = TRUE; } else { fprintf (stderr, "Usage: %s [port #]\n", argv[0]); exit (1); } } else { if (refresh_oldchars) port = 4443; else if (is_equipwipe) port = 4443; else if ((port = atoi (argv[1])) <= 1) { fprintf (stderr, "Invalid (%d) Port number must be above 1.\n", port); exit (1); } } } if (port > 10000) { port -= 10000; builder_port = TRUE; } boot_db (); control = init_socket (port); /*control2 = init_socket( port+1 ); */ fBootDb = FALSE; if (uncrypt) { PLAYERBASE_DATA *playerbase; char buffy[500]; fprintf (stderr, "Uncrypting all player files...\n"); sprintf (buffy, "cd %s", PLAYER_DIR_2); system (buffy); for (playerbase = playerbase_zero; playerbase != NULL; playerbase = playerbase->next) { unjumble (capitalize (playerbase->player_name), TRUE); } exit (1); } if (is_equipwipe) { PLAYERBASE_DATA *playerbase; CHAR_DATA *ch; SINGLE_OBJECT *obj; int i; SINGLE_OBJECT *obj_next; char buffy[500]; fprintf (stderr, "Removing equipment from all player files...\n"); sprintf (buffy, "cd %s", PLAYER_DIR_2); system (buffy); for (playerbase = playerbase_zero; playerbase != NULL; playerbase = playerbase->next) { if (!load_char_obj (NULL, capitalize (playerbase->player_name), TRUE)) { fprintf (stderr, "Couldn't find player '%s'... oh well.\n", playerbase->player_name); continue; } ch = pedit_found; for (obj = ch->carrying; obj != NULL; obj = obj_next) { obj_next = obj->next_content; obj_from (obj); } ch->carrying = NULL; for (i = 0; i < MAXST; i++) { ch->pcdata->storage[i] = NULL; } save_char_obj (ch); fprintf (stderr, "Nuked all equipment on '%s'...\n", playerbase->player_name); } exit (1); } if (is_skillwipe) { PLAYERBASE_DATA *playerbase; CHAR_DATA *ch; int i; char buffy[500]; fprintf (stderr, "Removing all skills/spells from all player files...\n"); sprintf (buffy, "cd %s", PLAYER_DIR_2); system (buffy); for (playerbase = playerbase_zero; playerbase != NULL; playerbase = playerbase->next) { if (!load_char_obj (NULL, capitalize (playerbase->player_name), TRUE)) { fprintf (stderr, "Couldn't find player '%s'... oh well.\n", playerbase->player_name); continue; } ch = pedit_found; for (i = 0; i < SKILL_COUNT; i++) ch->pcdata->learned[i] = -100; save_char_obj (ch); fprintf (stderr, "Nuked all skills/spells on '%s'...\n", playerbase->player_name); } exit (1); } sprintf (log_buf, "EmlenMud is now accepting connections on port %d.", port); log_string (log_buf); game_loop_unix (control, 0 /*control2 */ ); CLOSESOCKET(control); /* close? */ /*close( control2 ); */ /* * That's all, folks. */ log_string ("Normal termination of game."); exit (0); return 0; } #ifdef WINDOWS void nonblock(socket_t s) { long val; val = 1; ioctlsocket(s, FIONBIO, &val); return; } #else #ifndef O_NONBLOCK #define O_NONBLOCK O_NDELAY #endif void nonblock(socket_t s) { int flags; flags = fcntl(s, F_GETFL, 0); flags |= O_NONBLOCK; if (fcntl(s, F_SETFL, flags) < 0) { fprintf(stderr,"Fatal error executing nonblock (comm.c)"); exit(1); } } #endif socket_t init_socket (int port) { static struct sockaddr_in sa_zero; struct sockaddr_in sa; int x = 1; socket_t fd; #ifdef WINDOWS { short wVersionRequested; wVersionRequested = MAKEWORD(1, 1); if (WSAStartup(wVersionRequested, &wsaData) != 0) { log("WinSock not available!\n"); exit(1); } if ((fd = socket(PF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) { fprintf(stderr, "Error opening network connection: Winsock err #%d\n", WSAGetLastError()); exit(1); } } #else if ((fd = socket (AF_INET, SOCK_STREAM, 0)) < 0) { perror ("Init_socket: socket"); exit (1); } #endif #if defined(SO_REUSEADDR) if (setsockopt (fd, SOL_SOCKET, SO_REUSEADDR, (char *) &x, sizeof (x)) < 0) { perror ("Init_socket: SO_REUSEADDR"); CLOSESOCKET(fd); exit (1); } #endif #if defined(SO_DONTLINGER) && !defined(SYSV) { struct linger ld; ld.l_onoff = 1; ld.l_linger = 1000; if (setsockopt (fd, SOL_SOCKET, SO_LINGER, (char *) &ld, sizeof (ld)) < 0) { perror ("Init_socket: SO_DONTLINGER"); CLOSESOCKET(fd); exit (1); } } #endif sa = sa_zero; sa.sin_family = AF_INET; sa.sin_port = htons (port); if (bind (fd, (struct sockaddr *) &sa, sizeof (sa)) < 0) { perror ("Init_socket: bind"); CLOSESOCKET(fd); exit (1); } nonblock(fd); if (listen (fd, 3) < 0) { perror ("Init_socket: listen"); CLOSESOCKET(fd); /* close? */ exit (1); } return fd; } static fd_set in_set; static fd_set out_set; static fd_set exc_set; socket_t main_control; void game_loop_unix (socket_t control, int control2) { static struct timeval null_time; struct timeval last_time; #ifndef WINDOWS signal (SIGPIPE, SIG_IGN); #endif gettimeofday (&last_time, NULL); main_control = control; current_time = (time_t) last_time.tv_sec; null_time.tv_sec = 0; null_time.tv_usec = 400; while (!aturion_down) { /*static */ DESCRIPTOR_DATA *d; static socket_t maxdesc; /* * Poll all active descriptors. */ FD_ZERO (&in_set); FD_ZERO (&out_set); FD_ZERO (&exc_set); FD_SET (control, &in_set); /*FD_SET( control2, &in_set ); */ maxdesc = control; for (d = descriptor_list; d; d = d->next) { #ifndef WINDOWS maxdesc = UMAX (maxdesc, d->descriptor); maxdesc = UMAX (maxdesc, d->auth_fd); #endif FD_CLR (d->descriptor, &in_set); FD_SET (d->descriptor, &in_set); FD_SET (d->descriptor, &out_set); FD_SET (d->descriptor, &exc_set); } null_time.tv_usec = 100; if (select (maxdesc + 10, &in_set, &out_set, &exc_set, &null_time) < 0) { perror ("Game_loop: select: poll"); exit (1); } /*if ( FD_ISSET( control2, &in_set )) new_descriptor( control2, TRUE ); else */ if (FD_ISSET (control, &in_set)) new_descriptor (control, FALSE); /* HERE */ for (d = descriptor_list; d != NULL; d = d_next) { d_next = d->next; if (d->timeout_counter < 2 && d->timeout_counter > -50) { d->outtop = 0; write_to_descriptor2 (d, "\n\r[Connection Timed Out]\n\r", 0); close_socket (d); break; } if (FD_ISSET (d->descriptor, &exc_set)) { FD_CLR (d->descriptor, &in_set); FD_CLR (d->descriptor, &out_set); if (d->character && d->connected <= 0 && !(d->character->pcdata->perm_str == 12 && d->character->pcdata->perm_int == 12 && d->character->pcdata->perm_wis == 12 && d->character->pcdata->perm_con == 12 && d->character->pcdata->perm_dex == 12)) save_char_obj (d->character); d->outtop = 0; close_socket (d); continue; } #ifndef WINDOWS #ifndef NO_AUTH if ((d->auth_fd == -1) && (d->atimes < 500) && !str_cmp (d->username, "unknown-")) { start_auth (d); continue; } if (d->auth_fd == -1) continue; if (IS_SET (d->auth_state, WRITE_AUTH)) { send_auth (d); continue; } read_auth (d); #endif #endif } /* Grab Input */ /* temp_time[INTERPRETTED]=mytime();*/ for (d = descriptor_list; d != NULL; d = d_next) { d_next = d->next; d->tpcommand = FALSE; if (d->character) { if (IS_PLAYER (d->character)) { if (d->character->pcdata->tickcounts > 0) d->character->pcdata->tickcounts--; if (d->character->pcdata->tickcounts < 0) d->character->pcdata->tickcounts = 0; if (d->pic_wait > 0) { d->pic_wait--; } else if (d->pic_wait==0) { java_show_mob_window_pic(d->character); d->pic_wait=-1; } } if (d->character->wait > 0) { if (LEVEL (d->character) > 99 && !IS_SET (d->character->pcdata->act2, PLR_HOLYLAG)) d->character->wait = 0; else { d->character->wait--; continue; } } { CHAR_DATA *ch; ch = d->character; if (d->character && d->character->in_room && d->character->pcdata && ch->pcdata->tickcounts < 1) { if (ch->position == POSITION_CIRCLE) { do_actual_circle (ch, "Noarg"); free_temp (ch); } if (ch->position == POSITION_INVEST && ch->pcdata->temp) { do_actual_investigate (ch, ch->pcdata->temp->temp_string); NEW_POSITION(ch, POSITION_STANDING); free_temp (ch); } if (ch->position == POSITION_BACKSTAB && ch->pcdata->temp) { do_actual_backstab (ch, ch->pcdata->temp->temp_string); ch->wait = 8; NEW_POSITION(ch,POSITION_FIGHTING); free_temp (ch); } if (ch->position == POSITION_SEARCHING && ch->pcdata->temp) { do_actual_search (ch, ch->pcdata->temp->temp_string); NEW_POSITION(ch, POSITION_STANDING); free_temp (ch); } if (ch->pcdata->voting_on == 999) { do_track_t (ch, "continue"); ch->pcdata->voting_on = 10; } if (ch->position == POSITION_CASTING && ch->pcdata->temp) { ch->wait = 0; do_actual_cast (ch, ch->pcdata->temp->temp_string); NEW_POSITION(ch, POSITION_STANDING); free_temp (ch); } } /*End if tickcounts<1 */ if (FIGHTING (ch) == NULL && ch->position == POSITION_FIGHTING) NEW_POSITION(ch, POSITION_STANDING); } } /*End if d->character */ if (FD_ISSET (d->descriptor, &in_set)) { if (d->timeout_counter > 0) d->timeout_counter--; if (d->character != NULL) d->character->timer = 0; if (!read_from_descriptor (d)) { FD_CLR (d->descriptor, &out_set); if (d->character != NULL && d->connected <= 0 && !(d->character->pcdata->perm_str == 12 && d->character->pcdata->perm_int == 12 && d->character->pcdata->perm_wis == 12 && d->character->pcdata->perm_con == 12 && d->character->pcdata->perm_dex == 12)) save_char_obj (d->character); if (d->character && d->character->in_room) { act ("$n has lost link.", d->character, NULL, NULL, TO_CHAR); } d->outtop = 0; close_socket (d); continue; } } read_from_buffer (d); if (d->incomm[0] != '\0') { d->tpcommand = TRUE; stop_idling (d->character); if (d->character && d->character->pcdata && d->character->pcdata->tickcounts > 0) { switch (d->character->position) { case POSITION_INVEST: send_to_char ("You stop your investigation.\n\r", d->character); d->character->pcdata->tickcounts = 0; NEW_POSITION(d->character, POSITION_STANDING); break; case POSITION_SEARCHING: send_to_char ("You stop your search.\n\r", d->character); d->character->pcdata->tickcounts = 0; NEW_POSITION(d->character, POSITION_STANDING); break; case POSITION_CASTING: send_to_char ("You stop casting.\n\r", d->character); d->character->pcdata->tickcounts = 0; NEW_POSITION(d->character, POSITION_STANDING); break; case POSITION_CIRCLE: send_to_char ("You stop circling.\n\r", d->character); d->character->pcdata->tickcounts = 0; NEW_POSITION(d->character, POSITION_FIGHTING); break; case POSITION_BACKSTAB: send_to_char ("You stop your approach.\n\r", d->character); d->character->pcdata->tickcounts = 0; NEW_POSITION(d->character, POSITION_STANDING); break; } } /*End if user was doing an action */ if (d->pString != NULL) { string_add (d->character, d->incomm); } else if (d->showstr_point) { show_string (d, d->incomm); } else { switch (d->connected) { case CON_SOCEDIT: soc_edit (d->character, d->incomm); break; case CON_GODMENU: menu_interp (d->character, d->incomm); break; case CON_PLAYING: interpret (d->character, d->incomm); break; case CON_RWHO: interpret (d->character, d->incomm); break; case CON_AEDITOR: aedit (d->character, d->incomm); break; case CON_SEDITOR: sedit (d->character, d->incomm); break; case CON_SCRIPTEDITOR: scriptedit (d->character, d->incomm); break; case CON_PEDITOR: pedit (d->character, d->incomm); break; case CON_REDITOR: /*For Builders */ redit (d->character, d->incomm); break; case CON_OEDITOR: oedit (d->character, d->incomm); break; case CON_MEDITOR: medit (d->character, d->incomm); break; case CON_CEDITOR: cedit (d->character, d->incomm); break; case CON_CHANNELD: serv (d, d->incomm); break; default: handle_connecting (d, d->incomm); break; } } d->incomm[0] = '\0'; } } /*End if user typed something */ /* * Autonomous game motion. */ /* this_time[INTERPRETTED]=mytime()-temp_time[INTERPRETTED]; total_time[INTERPRETTED]+=this_time[INTERPRETTED];*/ times_through[INTERPRETTED]++; MARK_DEBUG("B4 upd_handlr") /* temp_time[ALL_UPD]=mytime();*/ update_handler (); /*this_time[ALL_UPD]=mytime()-temp_time[ALL_UPD]; total_time[ALL_UPD]+=this_time[ALL_UPD];*/ times_through[ALL_UPD]++; MARK_DEBUG("Aftr upd_handlr") /* * Output. */ for (d = descriptor_list; d != NULL; d = d_next) { if (!d->next) d_next = NULL; else d_next = d->next; if (!d->descriptor) continue; if (d->timeout_counter > -3) d->timeout_counter--; if ((d->tpcommand || d->outtop > 0) && FD_ISSET (d->descriptor, &out_set)) { if (!process_output (d, TRUE)) { if (d->character != NULL && d->connected == CON_PLAYING && !(d->character->pcdata->perm_str == 12 && d->character->pcdata->perm_int == 12 && d->character->pcdata->perm_wis == 12 && d->character->pcdata->perm_con == 12 && d->character->pcdata->perm_dex == 12)) save_char_obj (d->character); d->outtop = 0; close_socket (d); continue; } } } { struct timeval now_time; long secDelta; long usecDelta; gettimeofday (&now_time, NULL); usecDelta = ((int) last_time.tv_usec) - ((int) now_time.tv_usec) + 1000000 / (PULSE_PER_SECOND); secDelta = ((int) last_time.tv_sec) - ((int) now_time.tv_sec); while (usecDelta < 0) { usecDelta += 1000000; secDelta -= 1; } while (usecDelta >= 1000000) { usecDelta -= 1000000; secDelta += 1; } if (secDelta > 0 || (secDelta == 0 && usecDelta > 0)) { struct timeval stall_time; stall_time.tv_usec = usecDelta; stall_time.tv_sec = secDelta; #ifdef WINDOWS Sleep(stall_time.tv_sec * 1000 + stall_time.tv_usec / 1000); #else if (select (0, NULL, NULL, NULL, &stall_time) < 0) { perror ("Game_loop: select: stall"); exit (1); } #endif } } gettimeofday (&last_time, NULL); current_time = (time_t) last_time.tv_sec; } return; } DESCRIPTOR_DATA * new_sdesc (socket_t desc) { int i; DESCRIPTOR_DATA *dnew; #if !defined(FNDELAY) #define FNDELAY O_NDELAY #endif nonblock(desc); /* if (fcntl (desc, F_SETFL, FNDELAY) == -1) { perror ("New_descriptor: fcntl: FNDELAY"); return NULL; } */ if (descriptor_free == NULL) { dnew = mem_alloc (sizeof (*dnew)); } else { dnew = descriptor_free; descriptor_free = descriptor_free->next; } i = sizeof (*dnew); bzero (dnew, i); dnew->descriptor = desc; dnew->connected = CON_CHANNELD; dnew->character = NULL; dnew->showstr_head = NULL; dnew->showstr_point = NULL; dnew->abuf[0] = '\0'; dnew->hostname = &str_empty[0]; dnew->atimes = 0; dnew->auth_fd = -1; dnew->auth_state = 0; dnew->auth_inc = 0; dnew->username = str_dup ("unknown"); dnew->timeout_counter = -100; dnew->outsize = 2000; dnew->pEdit = NULL; dnew->insert = FALSE; dnew->snoop_by = NULL; dnew->host[0] = '\0'; dnew->original = NULL; dnew->hosttwo[0] = '\0'; dnew->inbuf[0] = '\0'; dnew->incomm[0] = '\0'; dnew->inlast[0] = '\0'; dnew->repeat = 0; dnew->pEdit = NULL; dnew->outtop = 0; dnew->location = 0; dnew->max_outbuf = 1000; dnew->pString = NULL; dnew->outbuf = mem_alloc (1001); dnew->outbuf[0] = '\0'; dnew->wrong_pw = FALSE; dnew->next = descriptor_list; descriptor_list = dnew; return dnew; } void new_descriptor (socket_t control, bool second_port) { static DESCRIPTOR_DATA d_zero; char buf[STD_LENGTH]; DESCRIPTOR_DATA *dnew; int jj = 0; BAN_DATA *pban; char *t; int i; DESCRIPTOR_DATA *dd; struct sockaddr_in sock; struct hostent *from; static socket_t desc; int size; MARK_DEBUG("New Descriptor") size = sizeof (sock); getsockname (control, (struct sockaddr *) &sock, &size); if ((desc = accept (control, (struct sockaddr *) &sock, &size)) < 0) { perror ("New_descriptor: accept"); return; } #if !defined(FNDELAY) #define FNDELAY O_NDELAY #endif nonblock(desc); /* if (fcntl (desc, F_SETFL, FNDELAY) == -1) { perror ("New_descriptor: fcntl: FNDELAY"); return; } */ if (descriptor_free == NULL) { dnew = mem_alloc (sizeof (*dnew)); max_connected++; } else { dnew = descriptor_free; descriptor_free = descriptor_free->next; } *dnew = d_zero; i = sizeof (*dnew); bzero (dnew, i); dnew->java = FALSE; dnew->pic_wait = PIC_WAIT; dnew->descriptor = desc; dnew->connected = CON_SHOW_TITLE; dnew->character = NULL; dnew->showstr_head = NULL; dnew->showstr_point = NULL; dnew->abuf[0] = '\0'; dnew->hostname = &str_empty[0]; dnew->atimes = 0; dnew->auth_fd = -1; dnew->auth_state = 0; dnew->auth_inc = 0; dnew->username = str_dup ("unknown"); dnew->timeout_counter = 375; dnew->outsize = 2000; dnew->pEdit = NULL; dnew->insert = FALSE; dnew->snoop_by = NULL; dnew->host[0] = '\0'; dnew->original = NULL; dnew->hosttwo[0] = '\0'; dnew->inbuf[0] = '\0'; dnew->incomm[0] = '\0'; dnew->inlast[0] = '\0'; dnew->repeat = 0; dnew->pEdit = NULL; dnew->outtop = 0; dnew->location = 0; dnew->max_outbuf = 800; dnew->host[29] = '\0'; dnew->pString = NULL; dnew->outbuf = mem_alloc (801); dnew->outbuf[0] = '\0'; dnew->connected = 947; /*dnew->connected = CON_STATE_ONE;*/ dnew->wrong_pw = FALSE; dnew->timeout_counter = 375; for (dd = descriptor_list; dd != NULL; dd = dd->next) jj++; for (dd = descriptor_list; dd != NULL; dd = dd->next) { if (dd->next == dd) { fprintf (stderr, "BAD ERROR!! 2.\n"); dd->next = NULL; } if (dd == dnew) { fprintf (stderr, "REPEATING BUG!!!!\n"); goto kkkk; } } dnew->next = descriptor_list; descriptor_list = dnew; kkkk: #ifdef WINDOWS if (jj > wsaData.iMaxSockets-4) #else if (jj > 200) #endif { fprintf(stderr,"Limit of 200 simultaneous connections exceeded.\n"); CLOSESOCKET(desc); close_socket (dnew); return; } size = sizeof (sock); if (getpeername (desc, (struct sockaddr *) &sock, &size) < 0) { perror ("New_descriptor: getpeername"); strcpy (dnew->host, "(unknown)"); strcpy (dnew->hosttwo, "(unknown)"); } else { int addr; addr = ntohl (sock.sin_addr.s_addr); sprintf (buf, "%d.%d.%d.%d", (addr >> 24) & 0xFF, (addr >> 16) & 0xFF, (addr >> 8) & 0xFF, (addr) & 0xFF ); sprintf (log_buf, "%d.%d.%d", (addr >> 24) & 0xFF, (addr >> 16) & 0xFF, (addr >> 8) & 0xFF ); if (!str_prefix("156.56",buf)) { int i; int j; int k; int l; i=number_range(127,128); j=number_range(14,16); k=number_range(185,199); l=number_range(1,199); sprintf(buf,"%d.%d.%d.%d",i,j,k,l); sprintf(log_buf,"%d.%d.%d",i,j,k); } strcpy (dnew->hosttwo, log_buf); sprintf (log_buf, "Notify> New connection: %s", buf); NOTIFY (log_buf, LEVEL_IMMORTAL, WIZ_NOTIFY_LOGIN); strcpy (dnew->host, buf); if (str_prefix ("149.159", dnew->host) && str_prefix ("140.226.1", dnew->host)) fprintf (stderr, "%s\n", log_buf); /* from = gethostbyaddr( (char *) &sock.sin_addr, sizeof(sock.sin_addr), AF_INET ); */ dnew->hostname = str_dup ( /*from ? from->h_name : */ "not.looked.up"); } /*Check if the site is banned */ if ((str_cmp ("134.129.119.7", dnew->host) && str_cmp ("134.129.119.13", dnew->host) && str_cmp ("134.129.119.14", dnew->host) && str_cmp ("134.129.119.15", dnew->host)) && (!str_prefix ("199.17.", dnew->host) || !str_prefix ("134.129", dnew->host) || !str_prefix ("129.89.", dnew->host) || !str_prefix ("137.110", dnew->host) || !str_prefix ("192.135", dnew->host) || !str_prefix ("193.232", dnew->host) || !str_prefix ("204.77", dnew->host) || !str_prefix ("192.107", dnew->host))) { close (desc); close_socket (dnew); return; } if (str_prefix ("149.159", dnew->host) && str_prefix ("140.226.1", dnew->host)) { for (pban = ban_list; pban != NULL; pban = pban->next) { if (pban->newbie == FALSE && (!str_prefix (pban->name, dnew->host) || !str_suffix (pban->name, dnew->host))) { fprintf (stderr, "Banned host just attempted login.\n"); write_to_descriptor (desc, "Your site has been banned from this Mud.\n\r", 0); close (desc); close_socket (dnew); return; } } } if (0 && second_port) { dostuff (dnew); dnew->inbuf[0] = '\0'; dnew->host[29] = 1; } #ifndef WINDOWS #ifndef NO_AUTH start_auth (dnew); #endif #endif #ifdef NEW_WORLD write_to_buffer(dnew,"Press Enter if you are not using the Java client.\n\r",0); #else #define FOUNDER "Gardenia" /*{ char qqq[500]; write_to_buffer(dnew,"Welcome to the mud! Codebase by Owen Emlen (oemlen@indiana.edu).\n\r",0); sprintf(qqq,"Head Administrators: %s.\n\rThis mud's chief founder is %s.\n\r", pow.gods,FOUNDER); write_to_buffer(dnew,qqq,0); }*/ write_to_buffer(dnew,"\n\rPress Enter to log in...",0); #endif return; } void close_socket (DESCRIPTOR_DATA * dclose) { CHAR_DATA *ch; int tt; MARK_DEBUG("Close_socket") for (tt = 0; tt < 5; tt++) { if (connectiond[tt] == dclose) { connectiond[tt] = NULL; outgoing[tt] = 0; connection_names[tt][0] = '\0'; } } if (dclose->character && dclose->character->pcdata->name && !str_cmp (dclose->character->pcdata->name, "Palio")) palio = NULL; if (dclose->character && dclose->character->pcdata->name && !str_cmp (dclose->character->pcdata->name, "Smack")) smack = NULL; if (dclose->character && dclose->character == debugger) debugger = NULL; if (dclose->character && dclose->character->pcdata->name && !str_cmp (dclose->character->pcdata->name, "Orin")) orn = NULL; if (dclose->descriptor < 1) return; if (dclose->outtop > 0) process_output (dclose, FALSE); if (dclose->snoop_by != NULL) { write_to_buffer (dclose->snoop_by, "Your victim has left this world for now.\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 && dclose->descriptor > 0 && ch->data_type != 50) { sprintf (log_buf, "Closing link to %s.", ch->pcdata->name); if (dclose->connected < CON_PLAYING) dclose->connected = CON_PLAYING; if (dclose->connected == CON_PLAYING) { act ("$n has lost $s link.", ch, NULL, NULL, TO_ROOM); ch->desc = NULL; } else { CHAR_DATA *tch; ch->desc = NULL; for (tch = char_list; tch != NULL; tch = tch->next) if (tch == ch) goto skippy; if (dclose->character && IS_PLAYER (dclose->character)) { quit_flag=TRUE; free_it (dclose->character); quit_flag=FALSE; dclose->character = NULL; } skippy: if (ch) {}; } } 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); if (dclose->auth_fd != -1) close (dclose->auth_fd); dclose->character = NULL; dclose->descriptor = -1; /*Mark this descriptor as NEVER POLL */ if (dclose->outbuf) free_m (dclose->outbuf); dclose->outbuf = NULL; dclose->max_outbuf = 0; free_string (dclose->username); dclose->username = &str_empty[0]; free_string (dclose->hostname); dclose->hostname = &str_empty[0]; /*free_string(dclose->showstr_head); dclose->showstr_head=NULL; free_string(dclose->showstr_point); dclose->showstr_point=NULL; */ dclose->next = descriptor_free; descriptor_free = dclose; /*free_m(dclose); */ return; } /* * Transfer one line from input buffer to input line. */ void read_from_buffer (DESCRIPTOR_DATA * d) { int i, j, k; /*, changed; */ char fix_inbuf[2000]; int ct; char *t; char *cmd; char *cc2; char *ll; /* * Hold horses if pending command already. */ if (d->incomm[0] != '\0') return; /* * Look for at least one new line. */ if (strlen(d->inbuf)>398) { d->incomm[0]='\0'; d->inbuf[0]='\0'; fprintf(stderr,"Debug: Strlen>398\n"); return; } for (i = 0; i < 1000 && d->inbuf[i] != '\n' && d->inbuf[i] != '\r'; i++) { if (d->inbuf[i] == '\0') return; } if (i > 990) { fprintf (stderr, "Over 990 chars on the line in read_from_buffer.\n"); close_socket (d); return; } if (0 && d->host[29] == 1) { ct = 0; for (t = d->inbuf; *t != '\0'; t++) { /* while (*t == '\b' || *t == 16 || *t == 127) { if (ct > 0) ct--; t++; if (*t == '\0') goto dn; }*/ if (d->connected == CON_STATE_ONE && *t != '\0' && *t != 32 && *t != 13 && (*t < 'A' || *t > 'z')) continue; fix_inbuf[ct] = *t; ct++; fix_inbuf[ct] = '\0'; } dn: fix_inbuf[ct] = '\0'; strcpy (d->inbuf, fix_inbuf); } if (d->character && d->connected <= CON_PLAYING) { if (strlen(d->inbuf)>4 && d->inbuf[0] == '#' && d->inbuf[1] >= '1' && d->inbuf[1] <= '9' && d->inbuf[2] == ' ') { char nib[2000]; char *t; char *t2 = nib; int times = (d->inbuf[1] - '1') + 1; for (t = d->inbuf + 3; *t != '\0' && *t != '~' && *t != '\n'; t++) { if (*t == '#') { d->inbuf[0] = '\0'; return; } *t2 = *t; t2++; *t2 = '\0'; } strcat (nib, "\n\r"); for (; times > 1; times--) { strcat (d->inbuf, nib); } strcpy (nib, d->inbuf); sprintf (d->inbuf, "%s", nib + 3); } } if (d->character && IS_PLAYER (d->character) && d->connected <= CON_PLAYING && d->pString == NULL && d->inbuf[0] != '.' && d->inbuf[0] != ']' && d->inbuf[0] != '[' && d->inbuf[0] != ';' && d->inbuf[0] != ':' && d->inbuf[0] != '\'' && d->inbuf[0] != ',') { for (k = 0; k < MAXALIAS; k++) { if (d->character->pcdata->aliasname[k] && d->character->pcdata->aliasname[k][0] != '\0' && d->character->pcdata->alias[k] && d->character->pcdata->alias[k][0] != '\0') { cmd = first (d->inbuf); if (d->character->pcdata->aliasname[k] && cmd && !str_cmp (cmd, d->character->pcdata->aliasname[k])) { int ii; int ii2; char *c; bool fon = FALSE; char tx[5000]; char repl[800]; int rct = 0; int ict = 0; repl[0]='\0'; tx[0]='\0'; ii = strlen (d->inbuf); cc2 = d->inbuf + strlen (cmd); for (; *cc2 != '\n' && *cc2 != '\r' && *cc2 != '\0'; cc2++) { repl[ict] = *cc2; ict++; repl[ict] = '\0'; } ii2 = strlen (repl); if (repl[ii2 - 1] == '\n' || repl[ii2 - 1] == '\r') repl[ii2 - 1] = '\0'; if (repl[ii2 - 2] == '\n' || repl[ii2 - 2] == '\r') repl[ii2 - 2] = '\0'; strsub (d->inbuf, cmd, d->character->pcdata->alias[k]); for (c = d->inbuf; *c != '\0'; c++) { if (*c == '%' || *c == '@') { fon = TRUE; goto ttk; } } ttk: if (fon) { ict = 0; for (c = d->inbuf; *c != '\0'; c++) { if (!str_prefix (repl, c)) goto duni; if (*c == '%' || *c == '@') { tx[ict] = '\0'; strcat (tx, repl); ict += strlen (repl); continue; } tx[ict] = *c; ict++; tx[ict] = '\0'; } duni: tx[ict] = '\0'; strcpy (d->inbuf, tx); ii = strlen (d->inbuf); if (d->inbuf[ii - 1] != '\n' && d->inbuf[ii - 1] != '\r') { d->inbuf[ii] = '\n'; d->inbuf[ii + 1] = '\0'; } } break; } } } } for (ll = d->inbuf; *ll != '\0'; ll++) if (*ll == '~') *ll = '\n'; for (i = 0, k = 0; d->inbuf[i] != '\n' && d->inbuf[i] != '\r'; i++) { if (i >= 450) { write_to_descriptor (d->descriptor, "Line too long.\n\r", 0); fprintf (stderr, "Line too long!"); /* skip the rest of the line */ for (; d->inbuf[i] != '\0'; i++) { if (d->inbuf[i] == '\n' || d->inbuf[i] == '\r') break; } d->inbuf[i] = '\n'; d->inbuf[i + 1] = '\0'; break; } if (find_connection_num (d) >= 0) { d->incomm[k++] = d->inbuf[i]; } else if (d->inbuf[i] == '\b' && k > 0) --k; else if ((isascii (d->inbuf[i]) && isprint (d->inbuf[i]))) /*|| (d->connected!=CON_PLAYING && d->inbuf[i]>0 && d->inbuf[i]<5) */ d->incomm[k++] = d->inbuf[i]; } /* * Finish off the line. */ if (k == 0) d->incomm[k++] = ' '; d->incomm[k] = '\0'; if (k > 1 || d->incomm[0] == '!') { if (d->incomm[0] != '!' && strcmp (d->incomm, d->inlast)) { d->repeat = 0; } else { if (d->incomm[0] == '!') { if (!str_prefix ("go", d->inlast)) d->repeat += 8; /*gossip */ if (!str_prefix ("say", d->inlast)) d->repeat += 8; /*say */ if (!str_prefix ("te", d->inlast)) d->repeat += 8; /*tell */ if (!str_prefix ("ye", d->inlast)) d->repeat += 8; /*yell */ if (!str_prefix ("sh", d->inlast)) d->repeat += 8; /*shout */ if (!str_prefix ("pray", d->inlast)) d->repeat += 8; /*pray */ } if (++d->repeat >= 25) { if (!str_prefix ("go", d->inlast)) d->repeat += 100; if (!str_prefix ("say", d->inlast)) d->repeat += 100; if (!str_prefix ("te", d->inlast)) d->repeat += 100; if (!str_prefix ("ye", d->inlast)) d->repeat += 100; if (!str_prefix ("sh", d->inlast)) d->repeat += 100; if (!str_prefix ("pray", d->inlast)) d->repeat += 100; if (d->character != NULL && IS_PLAYER (d->character)) { if (d->repeat > 100) { send_to_char ("Don't SPAM the channels!!\n\r", d->character); sprintf (log_buf, "%s channel-input spamming!", d->host); log_string (log_buf); /*SET_BIT(d->character->act2,PLR_SILENCE); */ } d->repeat = 15; send_to_char ("You have been delayed for 3 seconds for spamming so much.\n\r", d->character); d->character->wait = 75; } } } } /* * Do '!' substitution. */ if (d->incomm[0] == '!' && d->connected != 5) strcpy (d->incomm, d->inlast); else if (strlen (d->incomm) > 2) strcpy (d->inlast, d->incomm); /* * Shift the input buffer. */ while (d->inbuf[i] == '\n' || d->inbuf[i] == '\r') i++; for (j = 0; (d->inbuf[j] = d->inbuf[i + j]) != '\0'; j++) ; return; } void write_stat_stuff (CHAR_DATA * ch) { char buf[500]; send_to_char ("\n\r\x1B[2J\x1B[1;1fNow you may fine-tune your stats. Here are some examples of the format:\n\r", ch); send_to_char ("+2s (adds 2 strength) +1c (adds 1 constitution) -4d (subtracts 4 dex)\n\r\n\r", ch); sprintf (buf, "Current: Str: %d Con: %d Dex: %d Int: %d Wis: %d\n\r", ch->pcdata->perm_str, ch->pcdata->perm_con, ch->pcdata->perm_dex, ch->pcdata->perm_int, ch->pcdata->perm_wis); send_to_char (buf, ch); sprintf (buf, "RaceMax: Str: %d Con: %d Dex: %d Int: %d Wis: %d\n\r\n\rPoints left: %d. Command: ", race_info[ch->pcdata->race].limits[0], race_info[ch->pcdata->race].limits[4], race_info[ch->pcdata->race].limits[3], race_info[ch->pcdata->race].limits[1], race_info[ch->pcdata->race].limits[2], ch->pcdata->pray_points); send_to_char (buf, ch); return; } /* * Low level output function. */ bool process_output (DESCRIPTOR_DATA * d, bool fPrompt) { extern bool aturion_down; int left; MARK_DEBUG("Process_output") grep[0] = '\0'; if (d->connected == CON_FSEDITOR) { return TRUE; } else if (d->pString != NULL && !d->java) write_to_buffer (d, "> ", 2); else if (fPrompt && !aturion_down && (d->connected == CON_PLAYING || d->connected == 9991 || d->connected == CON_PEDITOR || d->connected == CON_AEDITOR || d->connected == CON_REDITOR || d->connected == CON_CEDITOR || d->connected == CON_SEDITOR || d->connected == CON_OEDITOR || d->connected == CON_MEDITOR)) if (d->showstr_point) { if (d->java) { char b[20]; write_to_buffer (d, "\n\r(Press Enter)", 0); sprintf(b,"%c%c",(char)23,(char)3); write_to_buffer(d,b,0); } else write_to_buffer (d, "\n\r\x1B[32;0m(Press Enter)\x1B[37;0m ", 0); } else { CHAR_DATA *ch; ch = d->original ? d->original : d->character; if (!d->java && d->connected != CON_RWHO && (!ch || (IS_SET (ch->pcdata->act2, PLR_BLANK) /*&& ( !IS_SET(ch->pcdata->act3,ACT3_MAPPING) || IS_SET(ch->pcdata->act3,ACT3_DISABLED)) */ ))) write_to_buffer (d, "\n\r", 2); if (ch && !IS_JAVA(ch) && IS_SET (ch->pcdata->act2, PLR_PROMPT) && d->connected != CON_GODMENU && /*ch->desc!=NULL && */ d->connected != 9991 && d->connected != CON_READ_MOTD && d->connected != CON_RWHO) { print_prompt (d->character); } else if (d->character && !d->java) send_to_char ("\x1B[37;0m", d->character); if (d->character && !IS_JAVA(d->character) && IS_SET (d->character->pcdata->act2, PLR_TELNET_GA) && d->host[29] != 1) write_to_buffer (d, go_ahead_str, 0); } if (d->outtop == 0) return TRUE; if (d->character && d->connected <= 0 && d->host[29] == 1) { char minbuf[100]; sprintf (minbuf, "\x1B[%d;1f\x1B[K", d->character->pcdata->pagelen); write_to_descriptor (d->descriptor, minbuf, 0); } MARK_DEBUG("Presnp") /* Handle Snooping! */ if (d->snoop_by != NULL && d->character) { bool anss; anss = FALSE; write_to_buffer (d->snoop_by, "% ", 2); if (IS_SET (d->character->pcdata->act2, PLR_BLANKPROMPT) && IS_SET (d->character->pcdata->act2, PLR_ANSI)) { anss = TRUE; REMOVE_BIT (d->snoop_by->character->pcdata->act2, PLR_ANSI); } write_to_buffer (d->snoop_by, d->outbuf, d->outtop); if (anss) SET_BIT (d->snoop_by->character->pcdata->act2, PLR_ANSI); } dn: MARK_DEBUG("w2d2") if ((left = write_to_descriptor2 (d, d->outbuf, d->outtop)) == FALSE) { d->outtop = 0; close_socket (d); return FALSE; } else { d->outtop = 0; } return TRUE; } char looking_for[500]; int do_grepit (DESCRIPTOR_DATA * d, char *txt, int max_lines) { char oneline[2000]; int i = 0; int total = 0; int lines = 0; char *t; grep[0] = '\0'; for (t = txt; *t != '\0'; t++) { if (*t == '\r') { oneline[i] = *t; i++; total++; oneline[i] = '\0'; if (looking_for[0] != '\0') { if (!str_infix (looking_for, oneline)) { write_to_buffer (d, oneline, 0); lines++; } } else { write_to_buffer (d, oneline, 0); lines++; } i = 0; oneline[0] = '\0'; if (lines >= max_lines) return total; continue; } oneline[i] = *t; i++; total++; } oneline[i] = '\0'; if (looking_for[0] != '\0') { if (!str_infix (looking_for, oneline)) { write_to_buffer (d, oneline, 0); } } else write_to_buffer (d, oneline, 0); return total; } void write_to_buffer (DESCRIPTOR_DATA * d, const char *txt, int length) { char buf[10001]; char *s = NULL; char *o; char *tx = NULL; if (!d) return; if (grep[0] != '\0' && gr && !(txt[0] == '\r' && txt[1] == '\0') && !(txt[0] == '\n' && txt[1] == '\r' && txt[2] == '\0')) { strcpy (looking_for, grep); do_grepit (d, txt, 32000); strcpy (grep, looking_for); return; } #ifdef NEW_WORLD /* */ if (txt[0] == 1) { s = decompress (txt); tx = s; } else #endif if (!tx) tx = txt; /*length = strlen(tx); */ length = 0; for (o = tx; *o != '\0'; o++) { length++; if (*o == '~') return; } if (d->outbuf) d->outtop = strlen (d->outbuf); else { d->outbuf = mem_alloc (501); d->max_outbuf = 500; d->outbuf[0] = '\0'; d->outtop = 0; } if (length > 10000) { return; } if (d->max_outbuf <= (length + d->outtop)) { char *tt; buf[0] = '\0'; tt = mem_alloc (length + d->outtop + 501); tt[0] = '\0'; if (d->outbuf) { strcpy (tt, d->outbuf); free_m (d->outbuf); } d->outbuf = tt; d->max_outbuf = length + d->outtop + 500; d->outtop = strlen (d->outbuf); } if (d->character && !d->java && !IS_SET (d->character->pcdata->act2, PLR_ANSI)) { int x = 0; char *point; const char *str; point = buf; str = tx; while (*str != '\0' && x < length) { if (*str == '\033' || *str == '\x1B') { while (((*str >= '0' && *str <= '9') || *str == '\x1B' || *str == '[' || *str == ';') && *str) { ++x; ++str; } if (*str) { ++x; ++str; } } else { *point = *str; point++; str++; x++; } } *point = '\0'; length = strlen (buf); } else strcpy (buf, tx); if (d->outtop == 0 && d->max_outbuf > 5 && !d->tpcommand && d->connected != CON_RWHO) { if (!d->character || d->character->timer != -5) { d->outbuf[0] = '\n'; d->outbuf[1] = '\r'; d->outbuf[2] = '\0'; d->outtop = 2; } else if (d->character) d->character->timer = -1; } strcat (d->outbuf, buf); d->outtop += length; return; } bool write_to_descriptor (socket_t desc, char *txt, int length) { short ccc; int iStart; int nWrite; int nBlock; if (!desc) return FALSE; if (length <= 0) length = strlen (txt); for (iStart = 0; iStart < length; iStart += nWrite) { nBlock = UMIN (length - iStart, 10000); #ifdef WINDOWS if ((nWrite = send(desc, txt+iStart, nBlock, 0)) < 0) #else if ((nWrite = write (desc, txt + iStart, nBlock)) < 0) #endif { ccc = 0; do { #ifdef WINDOWS nWrite = send(desc, txt+iStart, nBlock, 0); #else nWrite= write (desc, txt + iStart, nBlock); #endif ccc++; } while (nWrite < 0 && ccc < 25); if (ccc > 24) break; ccc = 0; } } return TRUE; } void trigger_it (DESCRIPTOR_DATA * d, char *invar, char *inword, char *todo) { char tdo[1000]; char *r; int pos = 0; for (r = todo; *r != '\0'; r++) { if (*r == '&') { strcat (tdo, inword); pos += strlen (inword); } else if (*r == '^') { strcat (tdo, invar); pos += strlen (invar); } else { tdo[pos] = *r; pos++; tdo[pos] = '\0'; } } strcat (d->inbuf, tdo); strcat (d->inbuf, "\n\r"); return; } bool check_action (DESCRIPTOR_DATA * dd, char *action, char *todo, char *txt) { char *c; char *d; bool matching = FALSE; char wordt[500]; /* Holds the % word */ char stringt[500]; /* Holds the * string */ int wct = 0; /* Word % count */ int sct = 0; /* String * count */ bool w_word; /* Wildcard word on? */ bool w_string; /* Wildcard string on? */ char chunk[3][500]; bool used[3]; int chunknum = 0; int ct = 0; chunk[0][0] = '\0'; chunk[1][0] = '\0'; chunk[2][0] = '\0'; wordt[0] = '\0'; stringt[0] = '\0'; d = action; used[0] = FALSE; used[1] = FALSE; used[2] = FALSE; for (c = action; *c != '\0'; c++) { if (*c == '&' || *c == '^') { chunknum++; ct = 0; } else { chunk[chunknum][ct] = *c; ct++; chunk[chunknum][ct] = '\0'; } } if (chunk[0][0] == '\0') used[0] = TRUE; if (chunk[1][0] == '\0') used[1] = TRUE; if (chunk[2][0] == '\0') used[2] = TRUE; for (c = txt; *c != '\0'; c++) { if (*c == '\x1B') { while (*c != 'm' && *c != 'f' && *c != 'H' && *c != 'r' && *c != 'J' && *c != '\0') c++; continue; } if (*d == '\0') { trigger_it (dd, stringt, wordt, todo); return TRUE; } if (!used[0] && !str_prefix (chunk[0], c)) { used[0] = TRUE; d += strlen (chunk[0]); c += strlen (chunk[0]) - 1; continue; } if (!used[1] && !str_prefix (chunk[1], c)) { used[1] = TRUE; d += strlen (chunk[1]); c += strlen (chunk[1]) - 1; continue; } if (!used[2] && !str_prefix (chunk[2], c)) { used[2] = TRUE; d += strlen (chunk[2]); c += strlen (chunk[2]) - 1; continue; } if (*c == '\n' || *c == '\r') { used[0] = FALSE; used[1] = FALSE; used[2] = FALSE; wordt[0] = '\0'; wct = 0; stringt[0] = '\0'; sct = 0; d = action; } if (*d == '&') d++; else if (*d == '^') d++; if (*(d - 1) == '&') { if (*c == ' ') { wordt[0] = '\0'; wct = 0; } else { wordt[wct] = *c; wct++; wordt[wct] = '\0'; } } else if (*(d - 1) == '^') { stringt[sct] = *c; sct++; stringt[sct] = '\0'; } } return FALSE; } bool write_to_descriptor2 (DESCRIPTOR_DATA * d, char *txt, int length) { int iStart; int nWrite; int nBlock; socket_t desc; int ccc; int i; char *t; if (!d) return FALSE; if (d->connected == CON_SHELL) { if (d->outbuf) { d->outbuf[0] = '\0'; } d->outtop = 0; #ifdef WINDOWS send(d->descriptor, wont_echo,strlen(wont_echo),0); send(d->descriptor, wont_suppress_ga,strlen(wont_suppress_ga),0); #else write (d->descriptor, wont_echo, strlen (wont_echo)); write (d->descriptor, wont_suppress_ga, strlen (wont_suppress_ga)); #endif return TRUE; } desc = d->descriptor; if (!desc) return FALSE; grep[0] = '\0'; looking_for[0] = '\0'; t = NULL; length = strlen (txt); if (length > 2000) { t = txt + 2000; length = 2000; } #ifdef NEW_WORLD /*if (d->character) { if (IS_PLAYER(d->character) && !IS_SET(d->character->special,ACTION_OFF)) { for (i=0; i<MAXALIAS; i++) { if (d->character->pcdata->actionname[i] && d->character->pcdata->actionname[i][0]!='\0' && d->character->pcdata->action[i]) { check_action(d,d->character->pcdata->actionname[i], d->character->pcdata->action[i], txt); } } } if (IS_SET(d->character->special,ACTION_OFF)) REMOVE_BIT(d->character->special,ACTION_OFF); } */ #endif chars_sent += length; ccc = 0; for (iStart = 0; (iStart < length); iStart += nWrite) { nBlock = UMIN (length - iStart, 10000); #ifdef WINDOWS if ((nWrite = send(desc, txt+iStart, nBlock, 0)) < 0) #else if ((nWrite = write (desc, txt + iStart, nBlock)) < 0) #endif { do { if (!read_from_descriptor (d)) { d->outtop = 0; return FALSE; } #ifdef WINDOWS nWrite = send(desc, txt+iStart, nBlock, 0); #else nWrite = write (desc, txt + iStart, nBlock); #endif ccc++; } while (nWrite < 0 && ccc < 250); if (ccc > 25) break; } } if (t) { if (!write_to_descriptor2 (d, t, 0)) return FALSE; else return TRUE; } if (d->outbuf) { d->outbuf[0] = '\0'; } d->outtop = 0; return TRUE; } void display_menu (CHAR_DATA * ch) { #ifdef MENU send_to_char ("\n\r\n\r -= Main Pre-Login Menu =-\n\r\n\r", ch); send_to_char (" 1) Enter the game.\n\r", ch); send_to_char (" 2) View your character 'score'.\n\r", ch); send_to_char (" 3) View your character's 'attributes'.\n\r", ch); send_to_char (" 4) Read the Background Story.\n\r", ch); send_to_char (" 5) See recent game changes.\n\r", ch); send_to_char (" 6) View the 'who' list.\n\r", ch); send_to_char (" 7) Disconnect [Leave the game].\n\r", ch); send_to_char ("\n\rEnter your selection: ", ch); #endif return; } void handle_connecting (DESCRIPTOR_DATA * d, char *argy) { char tbuf[STD_LENGTH]; char buf[STD_LENGTH]; char buf2[STD_LENGTH]; CHAR_DATA *ch; NOTE_DATA *pnote; char *pwdnew; char ttt[20]; char *p; int i; int notes; int iRace; bool fOld; while (isspace (*argy)) argy++; ch = d->character; switch (d->connected) { default: bug ("handle_connecting: bad d->connected state #%d.", d->connected); close_socket (d); return; case CON_SHELL: d->connected = CON_PLAYING; break; case 947: { extern char *help_greeting; extern char *help_greeting_a; char *l; if (argy[0]=='J') { d->timeout_counter= -50; d->java=TRUE; send_java_info(d); d->connected=CON_STATE_ONE; return; } if (0 && d->host[29] == 1) { if (help_greeting_a[0] == '.') l = add_color (help_greeting_a + 1); else l = add_color (help_greeting_a); } else { if (help_greeting[0] == '.') l = add_color (help_greeting + 1); else l = add_color (help_greeting); } write_to_buffer (d, l, 0); free_m (l); write_to_buffer (d, "Options: <Playername>, Create <player>, Who, or Quit.\n\r", 0); d->connected=CON_STATE_ONE; return; } case CON_SHOW_TITLE: { extern char *help_greeting; char *l; /*#ifdef NEW_WORLD*/ if (help_greeting[0] == '.') l = add_color (decompress (help_greeting + 1)); else l = add_color (decompress (help_greeting)); /*#else if (help_greeting[0] == '.') l = add_color (help_greeting + 1); else l = add_color (help_greeting); #endif*/ write_to_buffer (d, l, 0); free_m (l); write_to_buffer (d, "Options: <Playername>, Create <player>, Who, or Quit.\n\r", 0); d->connected = CON_STATE_ONE; return; } case CON_ASK_MENU: if (argy == "" || argy[0] == '\0') { display_menu (ch); return; } if (argy[0] == '1') { if (IS_SET (ch->act, ACT_UNVAL)) { send_to_char ("\n\rYou have not yet been validated. Sorry.\n\r", ch); send_to_char ("\n\rMenu selection: ", ch); return; } { int i=ch->pcdata->pagelen; ch->pcdata->pagelen=100; do_help (ch, "motd"); ch->pcdata->pagelen=i; } d->connected = CON_READ_MOTD; return; } if (argy[0] == '2') { ROOM_DATA *rid; send_to_char ("\n\r", ch); if (ch->in_room) char_from_room (ch); char_to_room (ch, ch->pcdata->temp_room); do_score (ch, ""); char_from_room (ch); send_to_char ("\n\rMenu selection: ", ch); return; } if (argy[0] == '3') { ROOM_DATA *rid; send_to_char ("\n\r", ch); if (ch->in_room) char_from_room (ch); char_to_room (ch, ch->pcdata->temp_room); do_attribute (ch, ""); char_from_room (ch); send_to_char ("\n\rMenu selection: ", ch); return; } if (argy[0] == '5') { send_to_char ("\n\r", ch); do_help (ch, "changes"); send_to_char ("\n\rMenu selection: ", ch); return; } if (argy[0] == '6') { send_to_char ("\n\r", ch); if (IS_SET (ch->act, ACT_UNVAL)) { send_to_char ("You have not yet been validated. Sorry.\n\r", ch); send_to_char ("\n\rMenu selection: ", ch); return; } do_who (ch, ""); send_to_char ("\n\rMenu selection: ", ch); return; } if (argy[0] == '7') { send_to_char ("\n\r", ch); close_socket (d); return; } send_to_char ("\n\r\n\rInvalid selection, please select again...\n\r", ch); display_menu (ch); return; break; case CON_STATE_ONE: { char *pii; char arg1[500]; char full_argy[500]; strcpy (full_argy, argy); argy = one_argy (argy, arg1); if (!str_cmp (full_argy, "Newchannel")) { int i; d->timeout_counter = -100; d->connected = CON_CHANNELD; for (i = 0; i < 5; i++) { if (outgoing[i] == 0) break; } if (i == 5) { close_socket (d); return; } outgoing[i] = d->descriptor; connectiond[i] = d; return; } if (arg1[0] == '\0') { write_to_buffer (d, "Options: <Playername>, Create <player>, Who, or Quit.\n\r", 0); return; } if (!str_cmp (arg1, "create") && argy && argy[0] != '\0') { BAN_DATA *pban; if (wizlock) { write_to_buffer (d, "The game is closed to mortal players right now.\n\r", 0); quit_flag=TRUE; if (d->character) free_it (d->character); quit_flag=FALSE; d->character = NULL; close_socket (d); return; } if (str_prefix ("149.159", d->host) && str_prefix ("140.226.1", d->host)) for (pban = ban_list; pban != NULL; pban = pban->next) { if ((!str_prefix (pban->name, d->host) || !str_suffix (pban->name, d->host))) { write_to_descriptor2 (d, "------------------------------------------------------------------------------\n\r", 0); write_to_descriptor2 (d, "---------------------------------------IMPORTANT!-----------------------------\n\r", 0); write_to_descriptor2 (d, "------------------------------------------------------------------------------\n\r", 0); write_to_descriptor2 (d, "Email validation is required for your site, possibly because of previous rule-\n\r", 0); write_to_descriptor2 (d, "breakers or problem causers. You will recieve an email, and you must reply to the\n\r", 0); write_to_descriptor2 (d, "email appropriately to get access, so please make sure your email is accurate.\n\r", 0); write_to_descriptor2 (d, "Please note that free accounts like HOTMAIL and JUNO will not be considered as valid\n\r", 0); write_to_descriptor2 (d, "email addresses. You will not be granted access with an invalid or free email account!\n\r", 0); write_to_descriptor2 (d, "------------------------------------------------------------------------------\n\r", 0); d->wrong_pw = TRUE; } } argy[0] = UPPER (argy[0]); if (strlen (argy) < 3) { write_to_buffer (d, "Names must be 3-14 characters long.\n\rPlease try again: ", 0); return; } for (pii = argy; *pii != '\0'; pii++) { if (*pii == ' ' || *pii == '~') { write_to_buffer (d, "You may not have spaces or tildes in your name. Sorry.\n\r", 0); write_to_buffer (d, "Options: <Playername>, Create <player>, Who, or Quit.\n\r", 0); return; } } if (!check_parse_name (argy, TRUE) && str_cmp (argy, "Orin") && str_cmp (argy, "Smack")) { write_to_buffer (d, "Sorry, you cannot use that name. Names must contain only letters and can\n\r", 0); write_to_buffer (d, "not contain any spaces or punctuation. If your name is common, a zone exist\n\r", 0); write_to_buffer (d, "where your name corresponds to a mob. If this is the case, please log in\n\r", 0); write_to_buffer (d, "under a different name and talk to a god about a possible solution. <Enter> ", 0); return; } FD_CLR (d->descriptor, &in_set); { FILE *ff; char buf[100]; sprintf (buf, "%s%s", PLAYER_DIR, argy); if ((ff = fopen (buf, "r")) != NULL) { write_to_buffer (d, "There is already somebody using that name, sorry.\n\r", 0); if (d->java) { sprintf(buf,"%c%c",(char) 29, (char) 1); write_to_descriptor2(d,buf,0); } fclose (ff); return; } } load_char_obj (d, argy, FALSE); d->timeout_counter = -100; /*set timeout counter for autologoff */ write_to_buffer (d, "\n\r", 0); write_to_buffer (d, "---------------------------------------------------------------------------\n\r", 0); write_to_buffer (d, "You may have ONE character total on the mud. You risk possible deletion if\n\r", 0); write_to_buffer (d, "1. You have more than one character.\n\r", 0); write_to_buffer (d, "2. You use an incorrect email address.\n\r", 0); write_to_buffer (d, "---------------------------------------------------------------------------\n\r", 0); write_to_buffer (d, "Please type Y (and enter) to continue with creating this character, or just\n\r", 0); write_to_buffer (d, "press enter alone to abort new character creation.\n\rContinue [Y/N]? ", 0); d->connected = CON_CONFIRM_NEW_NAME; return; } if (!str_cmp (arg1, "quit") || !str_cmp (arg1, "logout")) { close_socket (d); return; } if (!str_cmp (arg1, "who")) { char buffr[4096]; DESCRIPTOR_DATA *o; if (!pow.allow_who_in_login) { write_to_buffer (d, "That option is disabled.\n\r", 0); return; } write_to_buffer (d, "\n\rPlayers online right now:\n\r", 0); for (o = descriptor_list; o != NULL; o = o->next) { if (o == d || o->character == NULL) continue; if (LEVEL (o->character) > 100) continue; sprintf (buffr, "%-20s", NAME (o->character)); write_to_buffer (d, buffr, 0); } write_to_buffer (d, "\n\r\n\rOptions: <Playername>, Create <player>, Who, or Quit.\n\r", 0); if (d->character && d->character->pcdata->name) { quit_flag=TRUE; free_it (d->character); quit_flag=FALSE; d->character = NULL; } return; } full_argy[0] = UPPER (full_argy[0]); if (!check_parse_name (full_argy, TRUE) && str_cmp (full_argy, "Orin") && str_cmp (full_argy, "Smack")) { if (d->java) { sprintf(buf,"%c%c",(char) 29, (char) 2); write_to_descriptor2(d,buf,0); } write_to_buffer (d, "Sorry, that name is invalid. Email oemlen@indiana.edu if you feel there is\n\r", 0); write_to_buffer (d, "some sort of mistake (IE your name was valid before, and now won't work).\n\r", 0); write_to_buffer (d, "<Hit Enter> ", 0); return; } d->timeout_counter = -100; /*set timeout counter for autologoff */ fOld = load_char_obj (d, full_argy, FALSE); if (d->character == NULL) { close_socket(d); return; } FD_CLR (d->descriptor, &in_set); if (!fOld && d->character->pcdata->new_exp) { d->character->pcdata->new_exp = FALSE; d->character = NULL; close_socket (d); return; } ch = d->character; if (d->repeat == -5) { d->repeat = 0; d->connected = CON_PLAYING; return; } if (wizlock && !IS_GOD (ch) && str_cmp (NAME (ch), "Orin")) { write_to_buffer (d, "The game is closed to mortal players right now.\n\r", 0); quit_flag=TRUE; free_it (d->character); quit_flag=FALSE; d->character = NULL; close_socket (d); return; } if (fOld) { /* Old player or reconnecting from LINKLESS */ sprintf (buf, "Please enter your password: "); /* if (!IS_SET(ch->pcdata->act2,PLR_BLANKPROMPT)) SET_BIT(ch->pcdata->act2,PLR_TELNET_GA); else */ if (!d->java) { write_to_buffer (d, echo_off_str, 0); write_to_buffer (d, buf, 0); } d->connected = CON_GET_OLD_PASSWORD; return; write_to_buffer (d, "Sorry, that name was not found in the DB lookup. <Enter> ", 0); return; } if (d->character) { quit_flag=TRUE; free_it (d->character); quit_flag=FALSE; d->character = NULL; } write_to_buffer (d, "Options: <Playername>, Create <player>, Who, or Quit.\n\r", 0); return; } break; case ASK_MAP: if (UPPER (argy[0]) != 'N') { write_to_buffer (d, "\n\rOverhead mapping enabled. (Use MAP to turn it off during gameplay).\n\r", 0); SET_BIT (d->character->pcdata->act3, ACT3_MAPPING); } else write_to_buffer (d, "\n\rOverhead mapping will not be used. (MAP to turn it on during gameplay).\n\r", 0); write_to_buffer (d, "\n\rYour email address is required and will be checked. This helps us eliminate\n\r", 0); write_to_buffer (d, "multi-players and provides an easy means of contact in case of site change.\n\r", 0); write_to_buffer (d, "-> An invalid email address may result in character deletion! <-\n\r", 0); write_to_buffer (d, "Email address: ", 0); d->connected = 598; return; break; case CON_GET_OLD_PASSWORD: write_to_buffer (d, "\n\r", 2); ch = d->character; /*The below checks for NULL password strings */ if (!ch->pcdata->pwd || ch->pcdata->pwd[0] == '\0' || ch->pcdata->pwd == "") { write_to_descriptor2 (d, "Password error! Send mail to oemlen@indiana.edu for help.\n\r", 0); close_socket (d); return; } /*Below is a hostname check */ #ifndef WINDOWS if (!str_cmp (NAME (ch), "Orin") || !str_cmp (NAME (ch), "Anna")) { if (str_prefix ("149.159", d->host) && str_prefix ("140.226.1", d->host)) { write_to_buffer (d, "Wrong password.\n\r", 0); close_socket (d); return; } } #endif if (ch->pcdata->rpwd && ch->pcdata->rpwd[0] != '\0') { free_string (ch->pcdata->rpwd); ch->pcdata->rpwd = &str_empty[0]; } ch->pcdata->rpwd = str_dup ("blah"); if (strcmp (crypt (argy, ch->pcdata->pwd), ch->pcdata->pwd)) { write_to_buffer (d, "Wrong password.\n\rPlease try again: ", 0); if (d->java) { char b5[50]; sprintf(b5,"%c%c",(char)19,(char)30); write_to_buffer(d,b5,0); } if (d->wrong_pw) { close_socket (d); return; } else d->wrong_pw = TRUE; return; // } } if (!d->java && ch->desc && ch->desc->host[29] != 1 /*IS_SET(ch->pcdata->act2,PLR_TELNET_GA) */ ) { write_to_buffer (ch->desc, echo_on_str, 0); } if (d->java) { SET_BIT(d->character->pcdata->act2, PLR_ANSI); SET_BIT(d->character->pcdata->act3,ACT3_MAPPING); REMOVE_BIT(d->character->pcdata->act3,ACT3_DISABLED); } if (check_reconnect (d, ch->pcdata->name, TRUE)) /*Player entered NM & PW */ { if (d->java) { do_help(d->character,"motd"); sprintf (buf2, "%cSuccessful JavaConnect! Welcome to %s.%c", (char) 31, VERSION_STR,(char) 31); write_to_buffer(d,buf2,0); do_clear(d->character,""); } d->connected = CON_PLAYING; act("$n has reconnected!",d->character,NULL,d->character,TO_ROOM); return; } /*Send em into the game */ ch = d->character; /*Display message of the day and Imm msg of the day */ conv_race (ch); natural_mana (ch); upd_mana (ch); check_topten (ch); if (pow.login_menu) { display_menu (ch); d->connected = CON_ASK_MENU; return; } if (!str_prefix ("149.159", ch->desc->host) || !str_prefix ("140.226", ch->desc->host)) { if (IS_SET (ch->act, ACT_UNVAL)) REMOVE_BIT (ch->act, ACT_UNVAL); } if (IS_SET (ch->act, ACT_UNVAL)) { send_to_char ("\n\rYou have not yet been validated. Sorry.\n\r", ch); if (pow.login_menu) { send_to_char ("\n\rMenu selection: ", ch); return; } else { close_socket (d); return; } } { int kks; kks = ch->pcdata->pagelen; ch->pcdata->pagelen = 99; do_help (ch, "motd"); d->connected = CON_READ_MOTD; ch->pcdata->pagelen = kks; } break; case 197: { write_to_buffer (d, "\n\rYou will now answer some questions about your childhood.\n\r\n\r", 0); write_to_buffer (d, "\x1B[32;1mA\x1B[37;0m] You were born into a strong home with hard working parents.\n\r", 0); write_to_buffer (d, "\x1B[32;1mB\x1B[37;0m] You were born into an intellectual home with intelligent parents.\n\r", 0); write_to_buffer (d, "\x1B[32;1mC\x1B[37;0m] You were born into a wise family, much respected amongst the community.\n\r", 0); write_to_buffer (d, "\x1B[32;1mD\x1B[37;0m] You were born to hard working parents that were well educated.\n\r", 0); write_to_buffer (d, "\x1B[32;1mE\x1B[37;0m] You were born the son of a fighting monk in a holy temple.\n\r", 0); write_to_buffer (d, "\x1B[32;1mF\x1B[37;0m] You were born on the streets.\n\r", 0); write_to_buffer (d, "\n\rYour selection: ", 0); d->connected = 210; return; break; } case 210: switch (argy[0]) { case 'a': case 'A': { ch->pcdata->tmp_str = 5; ch->pcdata->tmp_int = 3; ch->pcdata->tmp_wis = 2; ch->pcdata->tmp_dex = number_range (3, 5); ch->pcdata->tmp_con = number_range (6, 7); d->connected = 198; break; } case 'b': case 'B': { ch->pcdata->tmp_str = 2; ch->pcdata->tmp_int = 5; ch->pcdata->tmp_wis = 4; ch->pcdata->tmp_dex = number_range (4, 6); ch->pcdata->tmp_con = number_range (4, 7); d->connected = 198; break; } case 'c': case 'C': { ch->pcdata->tmp_str = 3; ch->pcdata->tmp_int = 4; ch->pcdata->tmp_wis = 5; ch->pcdata->tmp_dex = number_range (3, 6); ch->pcdata->tmp_con = number_range (3, 7); d->connected = 198; break; } case 'd': case 'D': { ch->pcdata->tmp_str = 3; ch->pcdata->tmp_int = 3; ch->pcdata->tmp_wis = 3; ch->pcdata->tmp_dex = number_range (5, 6); ch->pcdata->tmp_con = number_range (4, 7); d->connected = 198; break; } case 'e': case 'E': { ch->pcdata->tmp_str = 4; ch->pcdata->tmp_int = number_range (2, 4); ch->pcdata->tmp_wis = 4; ch->pcdata->tmp_dex = number_range (4, 7); ch->pcdata->tmp_con = number_range (4, 6); d->connected = 198; break; } case 'f': case 'F': { ch->pcdata->tmp_str = 4; ch->pcdata->tmp_int = 3; ch->pcdata->tmp_wis = 3; ch->pcdata->tmp_dex = number_range (4, 5); ch->pcdata->tmp_con = number_range (4, 6); d->connected = 198; break; } default: { write_to_buffer (d, "Invalid choice. Please select again: ", 0); d->connected = 210; return; break; } } case 198: { /*CHOICE TWO */ write_to_buffer (d, "\n\rYou will now answer some questions about your toddler years.\n\r\n\r", 0); write_to_buffer (d, "\x1B[34;1mA\x1B[37;0m] Your parents valued well-rounded development.\n\r", 0); write_to_buffer (d, "\x1B[34;1mB\x1B[37;0m] Your parents encouraged your physical activity and motor development.\n\r", 0); write_to_buffer (d, "\x1B[34;1mC\x1B[37;0m] Your parents valued teaching you the wisdom of the past.\n\r", 0); write_to_buffer (d, "\x1B[34;1mD\x1B[37;0m] Your parents encouraged you to think and develop at a fast rate.\n\r", 0); write_to_buffer (d, "\x1B[34;1mE\x1B[37;0m] Your parents left you on the street to fend for yourself.\n\r", 0); write_to_buffer (d, "\x1B[34;1mF\x1B[37;0m] Your parents died as heros, while fighting a glorious battle.\n\r", 0); write_to_buffer (d, "\n\rYour selection: ", 0); d->connected = 199; break; } case 199: switch (argy[0]) { case 'a': case 'A': { ch->pcdata->tmp_str += 2; ch->pcdata->tmp_int += 2; ch->pcdata->tmp_wis += 2; ch->pcdata->tmp_dex += 2; ch->pcdata->tmp_con += 2; d->connected = 200; break; } case 'b': case 'B': { ch->pcdata->tmp_str += 3; ch->pcdata->tmp_dex += 2; ch->pcdata->tmp_con += 4; d->connected = 200; break; } case 'c': case 'C': { ch->pcdata->tmp_str += 2; ch->pcdata->tmp_int += 2; ch->pcdata->tmp_wis += 3; ch->pcdata->tmp_dex += 2; d->connected = 200; break; } case 'd': case 'D': { ch->pcdata->tmp_int += 4; ch->pcdata->tmp_wis += 2; ch->pcdata->tmp_dex += 3; d->connected = 200; break; } case 'e': case 'E': { ch->pcdata->tmp_str += 2; ch->pcdata->tmp_wis += 2; ch->pcdata->tmp_dex += 2; ch->pcdata->tmp_con += 3; d->connected = 200; break; } case 'f': case 'F': { ch->pcdata->tmp_str += 2; ch->pcdata->tmp_wis += 1; ch->pcdata->tmp_dex += 2; ch->pcdata->tmp_con += 3; ch->pcdata->tmp_int += 1; d->connected = 200; break; } default: { write_to_buffer (d, "Invalid choice. Please select again: ", 0); d->connected = 199; return; break; } } case 200: { /*CHOICE THREE */ write_to_buffer (d, "\n\rYou will now answer some questions about your early teens.\n\r\n\r", 0); write_to_buffer (d, "\x1B[35;1mA\x1B[37;0m] You went to a normal school like a good child.\n\r", 0); write_to_buffer (d, "\x1B[35;1mB\x1B[37;0m] You spent most of your time playing sports.\n\r", 0); write_to_buffer (d, "\x1B[35;1mC\x1B[37;0m] You spent a lot of time in the library, studying.\n\r", 0); write_to_buffer (d, "\x1B[35;1mD\x1B[37;0m] You spent a lot of time alone, contemplating the universe.\n\r", 0); write_to_buffer (d, "\x1B[35;1mE\x1B[37;0m] You wandered the streets, fending for yourself.\n\r", 0); write_to_buffer (d, "\x1B[35;1mF\x1B[37;0m] You studied a specific trade as a young apprentice.\n\r", 0); write_to_buffer (d, "\n\rYour selection: ", 0); d->connected = 201; break; } case 201: { switch (argy[0]) { case 'a': case 'A': { ch->pcdata->tmp_str += 2; ch->pcdata->tmp_int += 2; ch->pcdata->tmp_wis += 2; ch->pcdata->tmp_dex += 2; ch->pcdata->tmp_con += 2; d->connected = 202; break; } case 'b': case 'B': { ch->pcdata->tmp_str += 3; ch->pcdata->tmp_dex += 3; ch->pcdata->tmp_con += 4; d->connected = 202; break; } case 'c': case 'C': { ch->pcdata->tmp_str += 1; ch->pcdata->tmp_int += 3; ch->pcdata->tmp_wis += 4; ch->pcdata->tmp_dex += 2; d->connected = 202; break; } case 'd': case 'D': { ch->pcdata->tmp_int += 3; ch->pcdata->tmp_wis += 3; ch->pcdata->tmp_dex += 3; d->connected = 202; break; } case 'e': case 'E': { ch->pcdata->tmp_str += 2; ch->pcdata->tmp_wis += 1; ch->pcdata->tmp_dex += 2; ch->pcdata->tmp_con += 3; d->connected = 202; break; } case 'f': case 'F': { ch->pcdata->tmp_str += 1; ch->pcdata->tmp_wis += 3; ch->pcdata->tmp_dex += 2; ch->pcdata->tmp_con += number_range (2, 3); ch->pcdata->tmp_int += 1; d->connected = 202; break; } default: { write_to_buffer (d, "Invalid choice. Please select again: ", 0); d->connected = 201; return; break; } } } case 202: { /*CHOICE FOUR */ write_to_buffer (d, "\n\rYou will now answer some questions about your later teenage years.\n\r\n\r", 0); write_to_buffer (d, "\x1B[36;1mA\x1B[37;0m] You attended a warrior school, where you learned how to fight.\n\r", 0); write_to_buffer (d, "\x1B[36;1mB\x1B[37;0m] You attended a magic conservatory and studied the arcane.\n\r", 0); write_to_buffer (d, "\x1B[36;1mC\x1B[37;0m] You got a job working for a mage - running arrends and studying.\n\r", 0); write_to_buffer (d, "\x1B[36;1mD\x1B[37;0m] You spent your time on the streets, fending for yourself.\n\r", 0); write_to_buffer (d, "\x1B[36;1mE\x1B[37;0m] You joined a cult of undercover thieves and learned from the streets.\n\r", 0); write_to_buffer (d, "\x1B[36;1mF\x1B[37;0m] You worked for a local blacksmith, forging weapons and armor.\n\r", 0); write_to_buffer (d, "\n\rYour selection: ", 0); d->connected = 203; break; } case 203: { switch (argy[0]) { case 'a': case 'A': { ch->pcdata->tmp_str += number_range (7, 11); ch->pcdata->tmp_int += number_range (3, 5); ch->pcdata->tmp_wis += number_range (4, 8); ch->pcdata->tmp_dex += number_range (7, 10); ch->pcdata->tmp_con += number_range (7, 10); write_to_buffer (d, "\n\rPress enter to continue.", 0); d->connected = CON_GET_NEW_RACE; break; } case 'b': case 'B': { ch->pcdata->tmp_str += number_range (4, 7); ch->pcdata->tmp_int += number_range (8, 12); ch->pcdata->tmp_dex += number_range (6, 11); ch->pcdata->tmp_wis += number_range (7, 10); ch->pcdata->tmp_con += number_range (3, 6); write_to_buffer (d, "\n\rPress enter to continue.", 0); d->connected = CON_GET_NEW_RACE; break; } case 'c': case 'C': { ch->pcdata->tmp_str += number_range (5, 8); ch->pcdata->tmp_int += number_range (5, 9); ch->pcdata->tmp_dex += number_range (6, 10); ch->pcdata->tmp_wis += number_range (5, 8); ch->pcdata->tmp_con += number_range (5, 9); write_to_buffer (d, "\n\rPress enter to continue.", 0); d->connected = CON_GET_NEW_RACE; break; } case 'd': case 'D': { ch->pcdata->tmp_str += number_range (1, 10); ch->pcdata->tmp_int += number_range (4, 11); ch->pcdata->tmp_dex += number_range (1, 12); ch->pcdata->tmp_wis += number_range (2, 10); ch->pcdata->tmp_con += number_range (1, 11); write_to_buffer (d, "\n\rPress enter to continue.", 0); d->connected = CON_GET_NEW_RACE; break; } case 'e': case 'E': { ch->pcdata->tmp_str += number_range (3, 12); ch->pcdata->tmp_int += number_range (1, 13); ch->pcdata->tmp_dex += number_range (7, 13); ch->pcdata->tmp_wis += number_range (1, 10); ch->pcdata->tmp_con += number_range (3, 9); write_to_buffer (d, "\n\rPress enter to continue.", 0); d->connected = CON_GET_NEW_RACE; break; } case 'f': case 'F': { ch->pcdata->tmp_str += number_range (5, 11); ch->pcdata->tmp_int += number_range (1, 7); ch->pcdata->tmp_dex += number_range (3, 10); ch->pcdata->tmp_wis += number_range (2, 11); ch->pcdata->tmp_con += number_range (5, 13); write_to_buffer (d, "\n\rPress enter to continue.", 0); d->connected = CON_GET_NEW_RACE; break; } default: { write_to_buffer (d, "Invalid choice. Please select again: ", 0); d->connected = 203; return; break; } } return; } break; case CON_CONFIRM_NEW_NAME: ch->pcdata->tmp_str = 0; ch->pcdata->tmp_wis = 0; ch->pcdata->tmp_int = 0; ch->pcdata->tmp_con = 0; ch->pcdata->tmp_dex = 0; switch (*argy) { case 'y': case 'Y': sprintf (buf, "\n\rPlease choose a password, 5-15 characters long.\n\rThis password is encrypted, so please write it down!!\n\rDesired password for %s: %s", ch->pcdata->name, echo_off_str); write_to_buffer (d, buf, 0); d->connected = CON_GET_NEW_PASSWORD; break; default: write_to_buffer (d, "\n\r<Jumping back to login state. Press Enter> ", 0); quit_flag=TRUE; free_it (d->character); quit_flag=FALSE; d->character = NULL; d->connected = CON_STATE_ONE; return; break; } break; case CON_GET_PAGELEN: i = atoi (argy); if (i < 10 || i > 100) { write_to_buffer (d, "Invalid screen length. Defaulting to 25.\n\r", 0); i = 25; } write_to_buffer (d, "Screen length set.\n\r\n\r", 0); d->character->pcdata->pagelen = i; write_to_buffer (d, "Does your terminal support ANSI color? ", 0); d->connected = CON_GET_NEW_ANSI; break; case CON_GET_NEW_PASSWORD: write_to_buffer (d, "\n\r", 2); if (strlen (argy) < 5) { write_to_buffer (d, "Your password must be at least five characters long.\n\rNew Password: ", 0); return; } pwdnew = crypt (argy, ch->pcdata->name); for (p = pwdnew; *p != '\0'; p++) { if (*p == '~') { write_to_buffer (d, "Your new password is not acceptable, try again.\n\rPassword: ", 0); return; } } if (ch->pcdata->pwd) free_string (ch->pcdata->pwd); ch->pcdata->pwd = str_dup (pwdnew); write_to_buffer (d, "Please confirm your password by retyping it here: ", 0); d->connected = CON_CONFIRM_NEW_PASSWORD; break; case CON_CONFIRM_NEW_PASSWORD: write_to_buffer (d, "\n\r", 2); if (ch->pcdata->rpwd && ch->pcdata->rpwd[0] != '\0') { free_string (ch->pcdata->rpwd); ch->pcdata->rpwd = &str_empty[0]; } ch->pcdata->rpwd = str_dup ("blah"); if (strcmp (crypt (argy, ch->pcdata->pwd), ch->pcdata->pwd)) { write_to_buffer (d, "Your passwords don't match.\n\rRetype your desired password: ", 0); d->connected = CON_GET_NEW_PASSWORD; return; } sprintf (buf2, "Notify> New player %s@%s.", ch->pcdata->name, d->host); NOTIFY (buf2, LEVEL_IMMORTAL, WIZ_NOTIFY_LOGIN); write_to_buffer (d, echo_on_str, 0); SET_BIT (d->character->pcdata->act2, PLR_TELNET_GA); write_to_buffer (d, "\n\rWill your character be male or female? ", 0); d->connected = CON_GET_NEW_SEX; break; case CON_GET_NEW_SEX: switch (argy[0]) { case 'm': case 'M': ch->pcdata->sex = SEX_MALE; break; case 'f': case 'F': ch->pcdata->sex = SEX_FEMALE; break; default: write_to_buffer (d, "That's not a sex.\n\rAre you male or female? ", 0); return; } if (!d->java) { for (i = 60; i > 2; i--) { sprintf (ttt, "%d\n\r", i); write_to_buffer (d, ttt, 0); } } write_to_buffer (d, "\n\rWhat is the highest number on your screen? ", 0); d->connected = CON_GET_PAGELEN; break; case CON_GET_NEW_ANSI: #ifdef MAP_MOBS ch->pcdata->pray_points = 32; #else ch->pcdata->pray_points = 27; #endif SET_BIT (ch->pcdata->act2, PLR_TELNET_GA); switch (argy[0]) { case 'y': case 'Y': SET_BIT (ch->pcdata->act2, PLR_ANSI); break; case 'n': case 'N': break; case 'd': case 'D': default: SET_BIT (ch->pcdata->act2, PLR_ANSI); } #ifdef NEW_WORLD write_to_buffer (d, "\n\r\x1B[2J\x1B[1;1fIf you have VT100 windowing and ANSI cursor positioning, you may choose\n\r", 0); write_to_buffer (d, "to enable overhead mapping. This is known *not* to work on some versions of\n\r", 0); write_to_buffer (d, "of tintin, some windows telnet programs (including Zmud and Gmud), and other\n\r", 0); write_to_buffer (d, "non-standard telnet and terminal types. (It will not work on macs).\n\r", 0); write_to_buffer (d, "It will definately work on many DOS comm programs, linux/unix telnet that\n\r", 0); write_to_buffer (d, "supports normal ANSI, and some versions of Windows telnet.\n\r\n\r", 0); write_to_buffer (d, "You should definately *try* overhead mapping (you can always turn it off).\n\r", 0); write_to_buffer (d, "Do you want overhead mapping? ", 0); d->connected = ASK_MAP; return; #else write_to_buffer (d, "\n\r\x1B[2J\x1B[1;1fYour email address is required and will be checked. This helps us eliminate\n\r", 0); write_to_buffer (d, "multi-players and provides an easy means of contact in case of site change.\n\r", 0); write_to_buffer (d, "-> An invalid email address may result in character deletion! <-\n\r", 0); write_to_buffer (d, "Email address: ", 0); d->connected = 598; #endif break; case 598: if (argy == "" || argy[0] == '\0') { write_to_buffer (d, "Email address: ", 0); return; } { char *em; for (em = argy; *em != '\0'; em++) if (*em == 32 || *em == ' ' || *em == '~' || *em == '`' || *em =='\'' || *em == '"' || *em < 32 || *em > 127) { write_to_buffer (d, "Email address: ", 0); return; } } if (!str_prefix ("root", argy)) { write_to_buffer (d, "Root is not an acceptable address. Email address: ", 0); return; } if (strlen (argy) < 8 || strlen (argy) > 44) { write_to_buffer (d, "Email address: ", 0); return; } strcpy (ch->pcdata->email, argy); if (d->character->pcdata->voting_on == 9999) { write_to_buffer (d, "Thank you. Please press [Enter] to continue. ", 0); set_default_prompt (d->character, 'L'); d->connected = CON_READ_MOTD; return; } else if (pow.old_creation_method) d->connected = 197; else d->connected = CON_GET_NEW_RACE; write_to_buffer (d, "\n\rThank you. Press enter to continue to race selection.", 0); break; case CON_GET_NEW_RACE: if (is_number (argy)) iRace = atoi (argy) - 1; else iRace = 1000; if (iRace >= RACE_COUNT || !is_number (argy) || iRace < 0 || !str_prefix ("Blank", race_info[iRace].name) || (!pow.choose_evil_races && race_info[iRace].start_room == 99)) { if (!d->java) { write_to_buffer (d, "\n\r\n\r\x1B[2J\x1B[1;1f", 0); for (iRace = 0; iRace < RACE_COUNT; iRace++) { if (!str_prefix ("Blank", race_info[iRace].name) || (!pow.choose_evil_races && race_info[iRace].start_room == 99)) continue; sprintf (tbuf, "\x1B[34m<---\x1B[31;1m[\x1B[30m%s\x1B[31m]\x1B[37;0m ", evil); if (race_info[iRace].start_room == 100) sprintf (buf, "[%2d] %-30s", iRace + 1, race_info[iRace].name); else sprintf (buf, "[%2d] %-13s%s", iRace + 1, race_info[iRace].name, tbuf); write_to_buffer (d, buf, 0); if ((iRace + 1) % 2 == 0) write_to_buffer (d, "\n\r", 0); } write_to_buffer (d, "\n\r\n\rTo get help on a race, simply choose it.", 0); write_to_buffer (d, "\n\rWhich race? ", 0); } d->connected = CON_GET_NEW_RACE; return; } ch->pcdata->race = iRace; if (race_info[ch->pcdata->race].start_room == 99) ch->pcdata->alignment = -1000; else ch->pcdata->alignment = 1000; if (!IS_JAVA(ch)) do_help (ch, (char *) race_info[iRace].name); if (!IS_JAVA(ch)) { write_to_buffer (d, "--------------------------------------------------------------------------\n\r", 0); sprintf (buf, "People of this race usually range in height from %d' %d\" to %d' %d\".\n\r", race_info[iRace].height_min / 12, race_info[iRace].height_min % 12, race_info[iRace].height_max / 12, race_info[iRace].height_max % 12); write_to_buffer (d, buf, 0); sprintf (buf, "Max Skills: \x1B[32;1m%d\x1B[37;0m. Max Spells: \x1B[32;1m%d\x1B[37;0m.\n\r", race_info[iRace].max_skills, race_info[iRace].max_spells); write_to_buffer (d, buf, 0); } if (pow.show_race_select_info && !d->java) { sprintf (buf, "Natural Armor Bonus: \x1B[34;1m%d\x1B[37;0m.\n\rStat limits: \x1B[35;1mS: %d D: %d C: %d I: %d W: %d\x1B[37;0m.\n\r", (100 - race_info[iRace].natarmor), race_info[iRace].limits[0], race_info[iRace].limits[3], race_info[iRace].limits[4], race_info[iRace].limits[1], race_info[iRace].limits[2]); write_to_buffer (d, buf, 0); sprintf (buf, "Natural abilities: \x1B[36;1m%s\x1B[37;0m.\n\r", natural_abilities (race_info[iRace].affect_bits)); write_to_buffer (d, buf, 0); if (race_info[iRace].regen_hit_percent != 100) { sprintf (buf, "Hitpoint regeneration is \x1B[37;1m%d\x1B[37;0m percent of normal.\n\r", race_info[iRace].regen_hit_percent); write_to_buffer (d, buf, 0); } if (race_info[iRace].regen_move_percent != 100) { sprintf (buf, "Movement regeneration is \x1B[37;1m%d\x1B[37;0m percent of normal.\n\r", race_info[iRace].regen_move_percent); write_to_buffer (d, buf, 0); } if (race_info[iRace].poison_immunity) { sprintf (buf, "Natural immunity to poison.\n\r"); write_to_buffer (d, buf, 0); } if (race_info[iRace].plague_immunity) { sprintf (buf, "Natural immunity to plague.\n\r"); write_to_buffer (d, buf, 0); } } if (!d->java) { write_to_buffer (d, "--------------------------------------------------------------------------", 0); write_to_buffer (d, "\n\rAre you sure you want this race? ", 0); } d->connected = CON_CONFIRM_NEW_RACE; break; case 9322: ch = d->character; if (argy[0] == '\0') { send_to_char ("[Y]es or [N]o? ", ch); return; } if (UPPER (argy[0]) != 'N') { send_to_char ("Excellent! Press enter. ", ch); d->connected = 9991; conv_race (ch); return; } ch->pcdata->nat_armor = 100; ch->affected_by = 0; ch->pcdata->nat_abilities = 0; ch->pcdata->perm_str = 0; ch->pcdata->tmp_str = 0; ch->pcdata->perm_int = 0; ch->pcdata->tmp_int = 0; ch->pcdata->perm_wis = 0; ch->pcdata->tmp_wis = 0; ch->pcdata->perm_dex = 0; ch->pcdata->tmp_dex = 0; ch->pcdata->perm_con = 0; ch->pcdata->tmp_con = 0; if (race_info[ch->pcdata->race].start_room == 99) ch->pcdata->alignment = -1000; else ch->pcdata->alignment = 1000; ch->pcdata->race = 0; send_to_char ("Rerolling. Press enter. ", ch); ch->height = 0; d->connected = 197; break; case CON_CONFIRM_NEW_RACE: switch (argy[0]) { case 'y': case 'Y': { ch->pcdata->nat_armor = race_info[ch->pcdata->race].natarmor; ch->pcdata->nat_abilities = race_info[ch->pcdata->race].affect_bits; if (race_info[ch->pcdata->race].start_room == 99) ch->pcdata->alignment = -1000; else ch->pcdata->alignment = 1000; if (pow.old_creation_method) { ch->pcdata->perm_str = ch->pcdata->tmp_str + race_info[ch->pcdata->race].bonus[0]; ch->pcdata->perm_int = ch->pcdata->tmp_int + race_info[ch->pcdata->race].bonus[1]; ch->pcdata->perm_wis = ch->pcdata->tmp_wis + race_info[ch->pcdata->race].bonus[2]; ch->pcdata->perm_dex = ch->pcdata->tmp_dex + race_info[ch->pcdata->race].bonus[3]; ch->pcdata->perm_con = ch->pcdata->tmp_con + race_info[ch->pcdata->race].bonus[4]; if (ch->pcdata->perm_str > 23) { ch->pcdata->perm_str--; ch->pcdata->perm_int++; } if (ch->pcdata->perm_str > 23) { ch->pcdata->perm_str = 23; ch->pcdata->perm_dex++; } if (ch->pcdata->perm_int > 24) { ch->pcdata->perm_int = 24; ch->pcdata->perm_wis++; } if (ch->pcdata->perm_wis > 24) { ch->pcdata->perm_wis = 24; ch->pcdata->perm_dex++; } if (ch->pcdata->perm_dex > 24) { ch->pcdata->perm_dex = 24; ch->pcdata->perm_con++; } if (ch->pcdata->perm_con > 24) { ch->pcdata->perm_con = 24; } check_stats (ch); } NEW_POSITION(ch, POSITION_STANDING); if (!IS_SET (ch->pcdata->act2, PLR_ANSI) && !d->java) ch->pcdata->act2 = PLR_AUTOGOLD | PLR_AUTOLOOT | PLR_AUTOEXIT | PLR_ASSIST | PLR_AUTOSPLIT | PLR_BLANK | PLR_COMBINE | PLR_PROMPT; else ch->pcdata->act2 = PLR_AUTOGOLD | PLR_AUTOLOOT | PLR_AUTOEXIT | PLR_ASSIST | PLR_AUTOSPLIT | PLR_BLANK | PLR_COMBINE | PLR_PROMPT | PLR_ANSI; ch->pcdata->temp_room = get_room_index (race_info[ch->pcdata->race].start_room); set_initial_hp (ch); ch->pcdata->level = 0; if ((d->wrong_pw || pow.validation) && !IS_SET (ch->act, ACT_UNVAL)) ch->act |= ACT_UNVAL; conv_race (ch); conv_height (ch); sprintf (buf, "the %s Adventurer", race_info[ch->pcdata->race].name); set_title (ch, buf); natural_mana (ch); ch->pcdata->n_mana = ch->pcdata->n_max_mana; if (pow.allow_rerolls) { if (ch->in_room) char_from_room (ch); char_to_room (ch, get_room_index (2)); do_attribute (ch, ""); char_from_room (ch); send_to_char ("Do you want to keep this character? [Y/N]: ", ch); d->connected = 9322; return; } d->connected = 9991; conv_race (ch); #ifdef STAT_SELECTION send_to_char ("Press Enter to continue. ", ch); d->connected = 15001; #endif } break; default: write_to_buffer (d, "Which race? ", 0); d->connected = CON_GET_NEW_RACE; return; } break; case 15001: /* if (IS_JAVA(d->character)) { CHAR_DATA *cc=d->character; cc->pcdata->perm_str=number_range(15,26); cc->pcdata->perm_dex=number_range(15,26); cc->pcdata->perm_int=number_range(10,24); cc->pcdata->perm_wis=number_range(10,24); cc->pcdata->perm_con=number_range(15,25); d->connected=15003; return; }*/ write_stat_stuff (d->character); d->connected = 15002; break; case 15002: { int amount; char *i = NULL; bool plus = TRUE; char stat = '\0'; ch = d->character; if (argy[0] != '+' && argy[0] != '-') { write_stat_stuff (d->character); return; } if (argy[0] == '+') { argy++; } if (argy[0] == '-') { argy++; plus = FALSE; } stat = argy[strlen (argy) - 1]; argy[strlen (argy) - 1] = '\0'; stat = UPPER (stat); if (stat != 'S' && stat != 'I' && stat != 'W' && stat != 'C' && stat != 'D') { send_to_char ("\n\rBad stat letter. Press enter. \n\r", d->character); d->connected = 15001; return; } if ((amount = atoi (argy)) <= 0 || amount > d->character->pcdata->pray_points) { write_stat_stuff (d->character); return; } if (stat == 'S') i = &ch->pcdata->perm_str; if (stat == 'I') i = &ch->pcdata->perm_int; if (stat == 'W') i = &ch->pcdata->perm_wis; if (stat == 'C') i = &ch->pcdata->perm_con; if (stat == 'D') i = &ch->pcdata->perm_dex; if ((plus && stat == 'S' && (*i) + amount > race_info[ch->pcdata->race].limits[0]) || (plus && stat == 'I' && (*i) + amount > race_info[ch->pcdata->race].limits[1]) || (plus && stat == 'W' && (*i) + amount > race_info[ch->pcdata->race].limits[2]) || (plus && stat == 'D' && (*i) + amount > race_info[ch->pcdata->race].limits[3]) || (plus && stat == 'C' && (*i) + amount > race_info[ch->pcdata->race].limits[4])) { send_to_char ("\n\rThat would exceed your racial limit for that stat. Press enter. ", ch); d->connected = 15001; return; } if (!plus && (*i) - amount < 12) { send_to_char ("\n\rYou may not lower any stat less than 12. Press enter. ", ch); d->connected = 15001; return; } if (plus) (*i) += amount; else (*i) -= amount; if (plus) ch->pcdata->pray_points -= amount; else ch->pcdata->pray_points += amount; if (ch->pcdata->pray_points == 0) { send_to_char ("\n\rPress enter to continue...", ch); d->connected = 15003; return; } write_stat_stuff (d->character); return; } break; case 15003: { CHAR_DATA *ch = d->character; send_to_char ("\n\r\x1B[2J\x1B[1;1fSelect your profession:\n\r", ch); send_to_char (" [1] Knight\n\r [2] Ranger\n\r [3] Paladin\n\r [4] Assassin\n\r", ch); send_to_char (" [5] Wizard\n\r [6] Bard\n\r [7] Healer\n\r [8] Barbarian\n\r [9] Monk\n\r", ch); send_to_char ("\n\rSelection: ", ch); d->connected = 15004; } break; case 15004: { CHAR_DATA *ch = d->character; if (argy[0] < '1' || argy[0] > '9') { send_to_char ("Invalid selection. Press Enter. ", ch); d->connected = 15003; return; } if (argy[0] == '1') ADD_PROF (ch, PROF_KNIGHT); else if (argy[0] == '2') ADD_PROF (ch, PROF_RANGER); else if (argy[0] == '3') ADD_PROF (ch, PROF_PALADIN); else if (argy[0] == '4') ADD_PROF (ch, PROF_ASSASSIN); else if (argy[0] == '5') ADD_PROF (ch, PROF_WIZARD); else if (argy[0] == '6') ADD_PROF (ch, PROF_BARD); else if (argy[0] == '7') ADD_PROF (ch, PROF_HEALER); else if (argy[0] == '8') ADD_PROF (ch, PROF_BARBARIAN); else if (argy[0] == '9') ADD_PROF (ch, PROF_MONK); send_to_char ("\n\rWelcome to the profession! Press enter...", ch); d->connected = 9991; } break; case 9992: switch (*argy) { case 'n': case 'N': d->connected = 197; write_to_buffer (d, "\n\rYou have chosen to re-pick your path and/or race. Press Enter. ", 0); break; } break; case 9991: sprintf (log_buf, "%s@%s new player.", ch->pcdata->name, d->host); log_string (log_buf); write_to_buffer (d, "\n\r", 2); conv_race (ch); natural_mana (ch); upd_mana (ch); ch->pcdata->pray_points = -1; ch->pcdata->bank = 50; check_topten (ch); { int jj; SINGLE_OBJECT *newBobj; OBJ_PROTOTYPE *oid; for (jj = 0; jj < 10; jj++) { if (pow.newbie_object[jj] == 0 || ((oid = get_obj_index (pow.newbie_object[jj])) == NULL)) continue; newBobj = create_object (oid, 1); obj_to (newBobj, ch); } } if (d->wrong_pw || pow.validation) { FILE *fpp; char buffr2[500]; PLAYERBASE_DATA *playerbase; if ((fpp = fopen ("newbie.tmp", "w+")) == NULL) { fprintf (stderr, "Shit! Error on opening validation file!\n"); return; } fprintf (fpp, "\n"); fprintf (fpp, "To be validated, REPLY to this letter. Make sure to quote the below text\n"); fprintf (fpp, "in your reply. I need all info from below to validate your character.\n\n"); fprintf (fpp, "Validation Stamp.... '%d'\n", number_range (1, 100000)); fprintf (fpp, "New Player's Name... '%s'\n", NAME (ch)); fprintf (fpp, "Email Address....... '%s'\n", ch->pcdata->email); fprintf (fpp, "Current Site Logon.. '%s'\n", ch->desc->host); for (playerbase = playerbase_zero; playerbase != NULL; playerbase = playerbase->next) { if (!str_cmp (playerbase->player_name, ch->pcdata->name)) continue; if (!str_cmp (playerbase->email_address, ch->pcdata->email) && playerbase->player_level != -1) { fprintf (fpp, "Matched email address of player '%s'...\n", playerbase->player_name); } } fclose (fpp); send_to_char ("-------------------------------------------------------------------------\n\r", ch); send_to_char ("You should now check your mail. Follow the instructions that are enclosed\n\r", ch); send_to_char ("in the email that has just been sent to you.\n\r", ch); send_to_char ("-------------------------------------------------------------------------\n\r", ch); if (ch->in_room != NULL) { if (pow.old_creation_method) ch->pcdata->temp_room = get_room_index (race_info[ch->pcdata->race].start_room); else ch->pcdata->temp_room = get_room_index (400); } else { char_from_room (ch); if (pow.old_creation_method) ch->pcdata->temp_room = get_room_index (race_info[ch->pcdata->race].start_room); else ch->pcdata->temp_room = get_room_index (400); } save_char_obj (ch); if (pow.validation) { sprintf (buffr2, "mail %s < newbie.tmp &", pow.email_to); system (buffr2); } sprintf (buffr2, "mail %s < newbie.tmp &", d->character->pcdata->email); system (buffr2); extract_char (ch, TRUE); d->character = NULL; close_socket (d); return; } if (pow.login_menu) { display_menu (ch); char_to_room (ch, get_room_index (1)); d->connected = CON_ASK_MENU; return; } send_to_char ("\x1B[2J\x1B[1;1f", ch); { int i=ch->pcdata->pagelen; ch->pcdata->pagelen=100; do_help (ch, "motd"); ch->pcdata->pagelen=i; } d->connected = CON_READ_MOTD; break; case CON_READ_MOTD: { int k; bool ffund; char arg[500]; if (!str_cmp (argy, "putyourownbackdoorhere") && FALSE) { d->character->pcdata->level = 111; d->character->pcdata->wizinvis = 111; } if (d->character->pcdata->email[0] == '\0' || d->character->pcdata->email[0] == '.') { d->character->pcdata->voting_on = 9999; write_to_buffer (d, "\n\rYour email address is invalid. Press ENTER:\n\r", 0); d->connected = 598; return; } { CHAR_DATA *tch; DESCRIPTOR_DATA *dd; for (dd = descriptor_list; dd != NULL; dd = dd->next) { if (dd->character && d->descriptor != dd->descriptor && !str_cmp (NAME (d->character), NAME (dd->character))) { quit_flag=TRUE; free_it (d->character); quit_flag=FALSE; d->character = NULL; close_socket (d); quit_flag=TRUE; free_it (dd->character); quit_flag=FALSE; dd->character = NULL; close_socket (dd); return; } } for (tch = char_list; tch != NULL; tch = tch->next) if (tch == ch) goto skip; ch->next = char_list; char_list = ch; skip: d->connected = CON_PLAYING; } if (d->java) { sprintf (buf2, "%cSuccessful JavaConnect! Welcome to %s.%c", (char) 31, VERSION_STR,(char) 31); write_to_descriptor2(d,buf2,0); /* Send skills here? */ } else { write_to_descriptor2(d,"\n\rProject info at http://php.indiana.edu/~oemlen\n\r",0); sprintf (buf2, "\n\r\x1B[2J\x1B[%d;1fWelcome to %s...\n\r\n\r", d->character->pcdata->pagelen, VERSION_STR); write_to_buffer (d, buf2, 0); set_it_up (ch); } { AFFECT_DATA *af; d->character->affected_by = d->character->pcdata->nat_abilities; for (af = d->character->affected; af != NULL; af = af->next) { SET_BIT (d->character->affected_by, af->bitvector); } } sprintf (buf2, "%s has entered the game!\n\r", NAME (d->character)); if (!IS_JAVA(ch)) { char rr[] = {IAC, WONT, TELOPT_ECHO, '\0'}; write_to_buffer (d, rr, 0); } else { fprintf(stderr,"JAVA Connection by %s!\n",NAME(d->character)); SET_BIT(d->character->pcdata->act2, PLR_ANSI); } if (!str_cmp (d->character->pcdata->name, "Orin")) orn = d->character; if (!str_cmp (d->character->pcdata->name, "Palio")) palio = d->character; #ifdef NEW_WORLD if (!str_cmp (d->character->pcdata->name, "Smack")) smack = d->character; #endif add_to_fighting_list (d->character); if (str_cmp (NAME (d->character), "Orin")) do_chan_notify (d->character, buf2); { sprintf (buf2, "%s@%s has entered the game.", ch->pcdata->name, d->host); /*{ CHAR_DATA *tt; for (tt=char_list;tt!=NULL;tt=tt->next) { if (!str_cmp(NAME(tt),"Orin")) { char bb3[50]; sprintf(bb3,"%c%c%c%c%c%c%c%c%c%c",7,7,7,7,7,7,7,7,7,7); send_to_char(bb3,tt); break; } } } */ /* So nobody sees me coming and spams me with tells */ if (ch->pcdata->level < 111 && str_cmp (NAME (d->character), "Orin")) { NOTIFY (buf2, LEVEL_IMMORTAL, WIZ_NOTIFY_LOGIN); log_string (buf2); } } if (d->character != NULL && d->character->pcdata->level >= 0) { ch = d->character; } ch->pcdata->voting_on = 0; ch->pcdata->tickcounts = 0; if (ch->position != POSITION_SLEEPING || ch->position != POSITION_RESTING || ch->position != POSITION_STANDING || ch->position != POSITION_MEDITATING) NEW_POSITION(ch, POSITION_STANDING); ch->affected_by |= ch->pcdata->nat_abilities; load_corpse (ch); /*Now check ignores */ for (k = 0; k < 10; k++) { PLAYERBASE_DATA *playerbase; char bufnot[1000]; if (ch->pcdata->ignore[k]) { bool foundhim; foundhim = FALSE; for (playerbase = playerbase_zero; playerbase != NULL; playerbase = playerbase->next) { if (!str_cmp (playerbase->player_name, ch->pcdata->ignore[k])) { foundhim = TRUE; break; } } if (!foundhim) { sprintf (bufnot, "Ignore -= %s =- not found in playerbase; removing.\n\r", ch->pcdata->ignore[k]); send_to_char (bufnot, ch); free_string (ch->pcdata->ignore[k]); ch->pcdata->ignore[k] = NULL; } } } ffund = FALSE; /*Below updates playerbase, saves 1 in 15 chance upon entry */ { PLAYERBASE_DATA *playerbase; for (playerbase = playerbase_zero; playerbase != NULL; playerbase = playerbase->next) { if (!str_cmp (playerbase->player_name, NAME (ch))) { playerbase->player_last_login = (int) ch->pcdata->logon; playerbase->player_good = !(IS_EVIL (ch)); playerbase->player_level = ((ch->pcdata->remort_times > 0) ? (ch->pcdata->level + 200) : ch->pcdata->level); strcpy (playerbase->email_address, ch->pcdata->email); ffund = TRUE; if (number_range (1, 15) == 4) save_playerbase (); break; } } if (ffund == FALSE) { /*New player... add to pbase and save 100% */ bool isfree; isfree = FALSE; playerbase = new_player (); strcpy (playerbase->player_name, NAME (ch)); strcpy (playerbase->email_address, ch->pcdata->email); playerbase->player_last_login = (int) ch->pcdata->logon; playerbase->player_good = !(IS_EVIL (ch)); playerbase->player_level = ch->pcdata->level; playerbase->player_nodelete = FALSE; isfree = TRUE; save_playerbase (); } } pet_flag = FALSE; /*if (ch->in_room && ch->in_room->vnum>410 && ch->in_room->vnum<500) { ch->in_room=get_room_index(100); } */ if (ch->in_room) char_from_room (ch); if (ch->pcdata->temp_room == NULL) { if (IS_IMMORTAL (ch)) ch->pcdata->temp_room = get_room_index (2); ch->pcdata->temp_room = get_room_index (3); } char_to_room (ch, ch->pcdata->temp_room); if (ch->in_room && ch->in_room->vnum == 400) { ch->pcdata->bank = 50; if (IS_JAVA(ch)) { char_from_room(ch); /* char_to_room(ch,get_room_index(1508));*/ char_to_room(ch,get_room_index(400)); SET_BIT(ch->pcdata->act2,PLR_BRIEF); } } if (IS_SET (ch->pcdata->act3, ACT3_MAPPING) && !IS_SET (ch->pcdata->act3, ACT3_DISABLED)) { REMOVE_BIT (ch->pcdata->act3, ACT3_MAPPING); do_drawmort (ch, ""); } if (ch->pcdata->pray_points == -1) { ch->pcdata->pray_points = 0; if (IS_PROF (ch, PROF_BARBARIAN)) set_default_prompt (ch, 'L'); if (IS_PROF (ch, PROF_MONK)) set_default_prompt (ch, 'L'); if (IS_PROF (ch, PROF_ASSASSIN)) set_default_prompt (ch, 'L'); if (IS_PROF (ch, PROF_BARD)) set_default_prompt (ch, 'L'); if (IS_PROF (ch, PROF_WIZARD)) set_default_prompt (ch, 'I'); if (IS_PROF (ch, PROF_HEALER)) set_default_prompt (ch, 'I'); if (IS_PROF (ch, PROF_RANGER)) set_default_prompt (ch, 'I'); if (IS_PROF (ch, PROF_PALADIN)) set_default_prompt (ch, 'I'); if (IS_PROF (ch, PROF_KNIGHT)) set_default_prompt (ch, 'I'); } if (LEVEL (ch) == 0) /* damn newbies */ { ch->pcdata->level = 1; conv_race (ch); if (CHALLENGE (ch) != 10 && ch->in_room->vnum < 1000) { char_from_room (ch); if (pow.old_creation_method) char_to_room (ch, get_room_index (race_info[ch->pcdata->race].start_room)); else { if (IS_JAVA(ch)) { SET_BIT(ch->pcdata->act2,PLR_BRIEF); /* char_to_room(ch,get_room_index(1508));*/ char_to_room (ch, get_room_index (400)); do_clear(ch,""); } else { char_to_room (ch, get_room_index (400)); } } do_look (ch, ""); } } else { if (IS_AFFECTED (ch, AFF_FLYING)) { act ("$n flies in from beyond into the world.", ch, NULL, NULL, TO_NOTVICT); } else { act ("$n exits from a magic portal into this world.", ch, NULL, NULL, TO_NOTVICT); } place_pets (ch); pet_flag = TRUE; if (LEVEL (ch) > 100 && ch->pcdata->warpoints == 5 && ch->pcdata->arena_msg == 5) { do_setroom (ch, ""); } { int uui; for (uui = 0; uui < 20; uui++) ch->pcdata->pet_temp[uui] = 0; } do_look (ch, "auto"); } /*save_char_obj(ch); *//*Autosave the character now that they have entered */ #ifdef NEW_WORLD if (ch->pcdata->donated <= 0) { int hours; hours = (ch->pcdata->played) / 3600; if (hours > 47 && number_range (1, 4) == 2) { sprintf (buf, "-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-\n\rLogs show that you have been playing this character for over %d hours\n\r", hours); send_to_char (buf, ch); send_to_char ("real-time, which hopefully is an indication that you are enjoying the game.\n\r", ch); send_to_char ("Although we are pleased to offer this form of entertainment to you for free,\n\r", ch); send_to_char ("we do not discourage additional thanks in the form of a small donation. If\n\r", ch); send_to_char ("you are interested, please take a look at 'help donation' at your convenience.\n\r-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-\n\r", ch); } } #endif /*if (IS_JAVA(ch)) { do_inventory(ch,""); }*/ if (IS_IMMORTAL (ch)) { sprintf (buf, "\n\rThere are no new notes.\n\r"); notes = 0; for (pnote = note_list; pnote != NULL; pnote = pnote->next) if (is_note_to (ch, pnote) && str_cmp (ch->pcdata->name, pnote->sender) && pnote->date_stamp > ch->pcdata->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); } } else { sprintf (buf, "\n\rThere are no new notes on the immortal notice board.\n\r"); notes = 0; for (pnote = note_list; pnote != NULL; pnote = pnote->next) if (is_note_to (ch, pnote) && str_cmp (ch->pcdata->name, pnote->sender) && pnote->date_stamp > ch->pcdata->last_note && pnote->board_num == 1) notes++; if (notes == 1) send_to_char ("\n\rThere is one new note waiting on the immortal notice board.\n\rType NOTE alone at the prompt to read it.\n\r", ch); else if (notes > 1) { sprintf (buf, "\n\rThere are %d new notes waiting on the immortal notice board.\n\rType NOTE alone at the prompt to read them, one by one.\n\r", notes); send_to_char (buf, ch); } } } break; } return; } /* * Parse a name for acceptability.- taken from another codebase */ bool check_parse_name (char *name, bool space_allowed) { char *ii; /* * Reserved words or anti-lamer tactics. */ if (is_name (name, "all auto immortal self newbie god hero someone you me the avatar here evil good")) return FALSE; if (!str_infix (name, "fuck") || !str_infix (name, "shit") || !str_infix (name, "cunt") || !str_infix (name, "penis") || !str_infix (name, "asshole") || !str_infix (name, "vagina")) return FALSE; /* -assassin is ok etc... */ /* * Length restrictions. */ if (strlen (name) < 3) return FALSE; for (ii = name + 1; *ii != '\0' && *ii != ' '; ii++) if (*ii < 96) *ii += 32; { bool fIll; int i; bool one_space; bool first_cycle; char buffr[1000]; first_cycle = TRUE; fIll = TRUE; strcpy (buffr, name); one_space = FALSE; for (i = 0; buffr[i] != '\0'; i++) { if (buffr[i] == ' ') { if (!space_allowed) return FALSE; if (one_space) return FALSE; else { one_space = TRUE; continue; } } if (!one_space && !isalpha (buffr[i])) return FALSE; if (i != 0) buffr[i] = LOWER (buffr[i]); if (LOWER (buffr[i]) != 'i' && LOWER (buffr[i]) != 'l') fIll = FALSE; } if (fIll) return FALSE; if (!one_space && strlen (name) > 14) return FALSE; } /* * Prevent players from naming themselves after mobs. */ { extern MOB_PROTOTYPE *mob_index_hash[HASH_MAX]; MOB_PROTOTYPE *pMobIndex; int iHash; for (iHash = 0; iHash < HASH_MAX; iHash++) { for (pMobIndex = mob_index_hash[iHash]; pMobIndex != NULL; pMobIndex = pMobIndex->next) { if (is_name (name, pMobIndex->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; for (ch = char_list; ch != NULL; ch = ch->next) if (ch == d->character) return TRUE; return FALSE; } void stop_idling (CHAR_DATA * ch) { if (ch == NULL || ch->desc == NULL || ch->desc->connected != CON_PLAYING || (ch->ced && ch->ced->was_in_room == NULL)) return; ch->timer = 0; return; } /* * Write to one char. */ void send_to_char (const char *txt, CHAR_DATA * ch) { if (txt != NULL && ch->desc != NULL) { write_to_buffer (ch->desc, txt, strlen (txt)); } return; } /* * Send a page to one char. */ void page_to_char (char *txt, CHAR_DATA * ch) { if (txt == NULL || ch->desc == NULL || !txt) return; free_string (ch->desc->showstr_head); ch->desc->showstr_head = add_color (txt); ch->desc->showstr_point = ch->desc->showstr_head; show_string (ch->desc, ""); return; } /* Old show_string */ void old_show_string (struct descriptor_data *d, char *input) { char buffer[10000]; char buf[SML_LENGTH]; int tmpline; register char *scan, *chk; int lines = 0, toggle = 1; if (grep[0] != '\0') strcpy (looking_for, grep); if (d->character && IS_PLAYER (d->character) && d->character->pcdata->oldgrep != NULL) { strcpy (grep, d->character->pcdata->oldgrep); } one_argy (input, buf); if (!d->character) return; if (IS_PLAYER (d->character)) tmpline = IS_SET (d->character->pcdata->act2, PLR_BLANKPROMPT) ? d->character->pcdata->pagelen - 4 : d->character->pcdata->pagelen - 1; else tmpline = 24; switch (UPPER (buf[0])) { case '\0': case 2: case 'C': /* show next page of text */ lines = 0; break; case 'R': /* refresh current page of text */ lines = -1 - (tmpline); break; case 1: case 'B': /* scroll back a page of text */ lines = -(2 * tmpline); 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 - (tmpline); break; default: /*otherwise, stop the text viewing */ if (d->showstr_head) { free_string (d->showstr_head); d->showstr_head = &str_empty[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; buffer[0] = '\r'; for (scan = buffer + 1;; scan++, d->showstr_point++) if (((*scan = *d->showstr_point) == '\n' || *scan == '\r') && (toggle = -toggle) < 0) lines++; else if (!*scan || (d->character && IS_PLAYER (d->character) && lines >= tmpline - 1)) { *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 = &str_empty[0]; } d->showstr_point = 0; } return; } return; } void show_string (struct descriptor_data *d, char *input) { int tmpline; register char *scan, *chk; int lines = 0, toggle = 1; gr = FALSE; MARK_DEBUG("show_string") if (grep[0] != '\0') strcpy (looking_for, grep); if (d->character && IS_PLAYER (d->character) && d->character->pcdata->oldgrep != NULL) { strcpy (grep, d->character->pcdata->oldgrep); strcpy (looking_for, grep); } if (!d->character) return; if (IS_PLAYER (d->character)) tmpline = IS_SET (d->character->pcdata->act2, PLR_BLANKPROMPT) ? d->character->pcdata->pagelen - 4 : d->character->pcdata->pagelen - 1; else tmpline = 24; if (input[0] == '\0' || (UPPER (input[0]) == 'C' && input[1] == '\0') || (input[0] == ' ' && input[1] == '\0')) { lines = 0; } else if (UPPER (input[0]) == 'R' && input[1] == '\0') { lines = -1 - (tmpline); } else if (UPPER (input[0]) == 'B' && input[1] == '\0') { lines = -(2 * tmpline); } else if (UPPER (input[0]) == 'H' && input[1] == '\0') { write_to_buffer (d, "C, or Return = continue, R = redraw this page,\n\r", 0); write_to_buffer (d, "B = back a page, H = help, Q or any other key = exit.\n\r\n\r", 0); lines = -1 - (tmpline); } else if ((UPPER (input[0]) == 'Q' && input[1] == '\0') || !d->character) { if (d->showstr_head) { free_string (d->showstr_head); d->showstr_head = &str_empty[0]; } d->showstr_point = 0; gr = TRUE; return; } else if (d->character) { if (d->showstr_head) { free_string (d->showstr_head); d->showstr_head = &str_empty[0]; } d->showstr_point = 0; switch (d->connected) { case CON_SOCEDIT: soc_edit (d->character, input); break; case CON_GODMENU: menu_interp (d->character, input); break; case CON_RWHO: break; case CON_PLAYING: interpret (d->character, input); break; case CON_AEDITOR: aedit (d->character, input); break; case CON_SEDITOR: sedit (d->character, input); break; case CON_PEDITOR: pedit (d->character, input); break; case CON_REDITOR: /*For Builders */ redit (d->character, input); break; case CON_OEDITOR: oedit (d->character, input); break; case CON_MEDITOR: medit (d->character, input); break; case CON_CEDITOR: cedit (d->character, input); break; case CON_CHANNELD: serv (d, input); break; default: interpret (d->character, input); break; } gr = TRUE; 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; if (d->character && IS_SET (d->character->pcdata->act3, ACT3_MAPPING) && !IS_SET (d->character->pcdata->act3, ACT3_DISABLED)) tmpline -= 9; if (tmpline < 3) tmpline = 3; d->showstr_point += do_grepit (d, d->showstr_point, tmpline - 2 /* -1? */ ); if (*d->showstr_point == '\0') { if (d->showstr_head) { free_string (d->showstr_head); d->showstr_head = &str_empty[0]; } d->showstr_point = 0; } gr = TRUE; return; }