#include <sys/types.h> #include <sys/time.h> #include <ctype.h> #include <errno.h> #include <stdio.h> #include <string.h> #include <crypt.h> #include <stdlib.h> #include <time.h> #include <signal.h> #include <sys/resource.h> #include <unistd.h> #include "merc.h" #include "recycle.h" #include "olc.h" #include "tables.h" #include "interp.h" #include "clans/new_clans.h" #include "clans/new_clans_comm.h" #include "clans/new_clans_io.h" #include "clans/new_clans_util.h" #include "obj_trig.h" #define ANSI_CLSHOME "[2J[1;1H" void multiclass args ((DESCRIPTOR_DATA * d, char *argument)); void cardgame_menu args ((CHAR_DATA *ch, char* argument)); void card_game_prompt args ((CHAR_DATA *ch)); void friend_poof args (( CHAR_DATA *ch )); extern AREA_DATA *area_first; extern bool keepincomm; extern int max_on; void do_auto_shutdown args ((int signo)); extern const struct cmd_type cmd_table[]; extern char *color_table[]; extern char *center_text (char *txtstr, int txtnum); extern long int level_cost (int level); struct creating_type *char_creating = NULL; extern bool nodam_message; extern bool isorder; void backcalc_totalsouls args((CHAR_DATA *ch)); OBJ_DATA *get_obj_vnum_string_char args((CHAR_DATA *ch, int vnum, char* arg)); OBJ_DATA *get_obj_vnum_char args((CHAR_DATA* ch, int vnum)); void friend_poof args((CHAR_DATA *ch)); extern int top_area; extern int top_room; extern int top_vnum_room; extern ROOM_INDEX_DATA *room_index_hash[MAX_KEY_HASH]; extern AREA_DATA *area_first; extern AREA_DATA *area_last; /* * Global boolean for determining if name services should be used */ bool slowns = FALSE; /* * Global boolean for determining if half experience is toggled */ bool half = FALSE; /* * Global boolean for determining if quad experience is toggled */ bool quad = FALSE; /* * Global boolean for determining if double experience is toggled */ bool doub = FALSE; /* * * Global boolean for determining if Battle Royale is toggled * */ bool battle_royale = FALSE; inline void format_color args ((char *new, char *str, int length)); void init_signals args ((void)); void do_auto_shutdown args ((int signo)); //IBLIS 6/20/03 - Needed to update count at logon (from act_info.c) void update_count (); //Iblis 1/18/04 - Needed for litans void spell_haste args((int sn, int level, CHAR_DATA * ch, void *vo, int target)); /* command procedures needed */ DECLARE_DO_FUN (do_help); DECLARE_DO_FUN (do_look); DECLARE_DO_FUN (do_skills); DECLARE_DO_FUN (do_outfit); DECLARE_DO_FUN (do_unread); char *bad_names[] = { "bitch", "whore", "fuck", "nigger", NULL }; struct cstats { short str_min; short str_max; short int_min; short int_max; short wis_min; short wis_max; short dex_min; short dex_max; short con_min; short con_max; short cha_min; short cha_max; short align_min; short align_max; }; long genraces[MAX_PC_RACE] = { /* Reserved */ CLASS_MAGE | CLASS_CLERIC | CLASS_THIEF | CLASS_WARRIOR | CLASS_RANGER | CLASS_BARD | CLASS_PALADIN | CLASS_ASSASSIN | CLASS_REAVER | CLASS_MONK, /* Human */ CLASS_MAGE | CLASS_CLERIC | CLASS_THIEF | CLASS_WARRIOR | CLASS_RANGER | CLASS_BARD | CLASS_PALADIN | CLASS_ASSASSIN | CLASS_REAVER | CLASS_MONK, /* Elf */ CLASS_MAGE | CLASS_CLERIC | CLASS_THIEF | CLASS_WARRIOR | CLASS_RANGER | CLASS_BARD | CLASS_PALADIN | CLASS_ASSASSIN | CLASS_REAVER | CLASS_MONK, /* Dwarf */ CLASS_MAGE | CLASS_CLERIC | CLASS_THIEF | CLASS_WARRIOR | CLASS_RANGER | CLASS_BARD | CLASS_PALADIN | CLASS_ASSASSIN | CLASS_REAVER, CLASS_MONK, /* Canthi */ CLASS_MAGE | CLASS_CLERIC | CLASS_THIEF | CLASS_WARRIOR | CLASS_RANGER | CLASS_BARD | CLASS_PALADIN | CLASS_ASSASSIN | CLASS_REAVER | CLASS_MONK, /* Vroath */ CLASS_MAGE | CLASS_CLERIC | CLASS_THIEF | CLASS_WARRIOR | CLASS_RANGER | CLASS_BARD | CLASS_ASSASSIN | CLASS_REAVER | CLASS_MONK, /* Syvin */ CLASS_MAGE | CLASS_CLERIC | CLASS_THIEF | CLASS_WARRIOR | CLASS_RANGER | CLASS_BARD | CLASS_PALADIN | CLASS_ASSASSIN | CLASS_REAVER | CLASS_MONK, /* Sidhe */ CLASS_MAGE | CLASS_CLERIC | CLASS_THIEF | CLASS_WARRIOR | CLASS_RANGER | CLASS_BARD | CLASS_ASSASSIN | CLASS_REAVER | CLASS_MONK, /* Avatar */ CLASS_MAGE | CLASS_CLERIC | CLASS_THIEF | CLASS_WARRIOR | CLASS_RANGER | CLASS_BARD | CLASS_PALADIN | CLASS_ASSASSIN | CLASS_REAVER | CLASS_MONK, /* Litan */ CLASS_MAGE | CLASS_CLERIC | CLASS_THIEF | CLASS_WARRIOR | CLASS_RANGER | CLASS_BARD | CLASS_PALADIN | CLASS_ASSASSIN | CLASS_REAVER | CLASS_MONK, /* Kalian */ CLASS_MAGE | CLASS_CLERIC | CLASS_THIEF | CLASS_WARRIOR | CLASS_RANGER | CLASS_BARD | CLASS_PALADIN | CLASS_ASSASSIN | CLASS_REAVER | CLASS_MONK, /* Lich */ CLASS_MAGE | CLASS_CLERIC | CLASS_THIEF | CLASS_WARRIOR | CLASS_RANGER | CLASS_BARD | CLASS_ASSASSIN | CLASS_REAVER | CLASS_MONK, /* Nerix */ CLASS_MAGE | CLASS_CLERIC | CLASS_THIEF | CLASS_WARRIOR | CLASS_BARD | CLASS_MONK, /* Swarm */ CLASS_MONK, /* Nidae */ CLASS_MAGE | CLASS_CLERIC | CLASS_WARRIOR | CLASS_RANGER | CLASS_BARD | CLASS_MONK, }; struct calign { int align_min; int align_max; }; struct calign class_align[MAX_CLASS] = { /* Mage */ {-1000, 1000}, /* Cleric */ {-1000, 1000}, /* Thief */ {-1000, 1000}, /* Warrior */ {-1000, 1000}, /* Ranger */ {-1000, 1000}, /* Bard */ {-1000, 1000}, /* Paladin */ {300, 1000}, /* Assassin*/ {-1000, 1000}, /* Reaver */ {-1000, -100}, /* Monk */ {-1000, 1000}, /* Necro */ {-1000, 1000}, {-1000, 1000},{-1000, 1000},{-1000, 1000},{-1000, 1000}, }; struct cstats genstats[MAX_PC_RACE] = { /* Str Int Wis Dex Con Cha Align */ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1000, 1000}, /* Hum */ {6, 18, 6, 18, 6, 18, 6, 18, 6, 18, 6, 18, -1000, 1000}, /* Elf */ {5, 14, 13, 22, 6, 18, 10, 19, 6, 15, 6, 19, -1000, 1000}, /* Dwa */ {13, 21, 6, 15, 6, 18, 5, 13, 7, 20, 5, 15, -1000, 1000}, /* Can */ {5, 17, 7, 19, 8, 19, 9, 19, 6, 18, 6, 18, -1000, 1000}, /* Vro */ {14, 22, 4, 12, 4, 14, 5, 13, 12, 21, 3, 12, -1000, 100}, /* Syv */ {7, 18, 6, 18, 7, 19, 11, 21, 7, 18, 6, 18, -1000, 1000}, /* Sid */ {4, 13, 15, 22, 6, 18, 11, 19, 5, 14, 14, 20, -1000, -1000}, /* Ava */ {6, 18, 6, 18, 6, 18, 6, 18, 6, 18, 6, 18, -1000, 1000}, /* Lit */ {9, 17, 3, 10, 5, 13, 14, 22, 9, 17, 3, 12, -1000, 1000}, /* Kal */ {10, 23, 10, 23, 6, 16, 10, 23, 4, 10, 6, 16, -1000, 1000}, /* Lic */ {6, 21, 6, 21, 6, 16, 6, 16, 6, 21, 6, 14, -1000, -1000}, /* Ner */ {8, 21, 5, 15, 5, 16, 9, 22, 6, 18, 6, 18, 1000, 1000}, /* Swa */ {8, 21, 5, 15, 5, 16, 9, 22, 6, 18, 6, 18, -1000, 1000}, //Ignored for swarms. They can't reroll /* Nid */ {6, 18, 6, 18, 6, 18, 6, 16, 6, 18, 6, 16, -1000, 1000}, }; void roll_stats (CHAR_DATA * ch) { short total = 0, i, count; total += ch->perm_stat[STAT_STR] = number_range (genstats[ch->race].str_min, genstats[ch->race].str_max); total += ch->perm_stat[STAT_INT] = number_range (genstats[ch->race].int_min, genstats[ch->race].int_max); total += ch->perm_stat[STAT_WIS] = number_range (genstats[ch->race].wis_min, genstats[ch->race].wis_max); total += ch->perm_stat[STAT_DEX] = number_range (genstats[ch->race].dex_min, genstats[ch->race].dex_max); total += ch->perm_stat[STAT_CON] = number_range (genstats[ch->race].con_min, genstats[ch->race].con_max); total += ch->perm_stat[STAT_CHA] = number_range (genstats[ch->race].cha_min, genstats[ch->race].cha_max); count = 0; if (total < 70) { while (total < 70 && count < 70) { count++; i = number_range (STAT_STR, STAT_CHA); switch (i) { case STAT_STR: if (ch->perm_stat[i] < genstats[ch->race].str_max) { ch->perm_stat[i] += 1; total++; } break; case STAT_INT: if (ch->perm_stat[i] < genstats[ch->race].int_max) { ch->perm_stat[i] += 1; total++; } break; case STAT_WIS: if (ch->perm_stat[i] < genstats[ch->race].wis_max) { ch->perm_stat[i] += 1; total++; } break; case STAT_DEX: if (ch->perm_stat[i] < genstats[ch->race].dex_max) { ch->perm_stat[i] += 1; total++; } break; case STAT_CON: if (ch->perm_stat[i] < genstats[ch->race].con_max) { ch->perm_stat[i] += 1; total++; } break; case STAT_CHA: if (ch->perm_stat[i] < genstats[ch->race].cha_max) { ch->perm_stat[i] += 1; total++; } break; } } } else if (total > 70) { count = 0; while (total > 70 && count < 70) { count++; i = number_range (0, 5); switch (i) { default: case STAT_STR: if (ch->perm_stat[i] > genstats[ch->race].str_min) { ch->perm_stat[i] -= 1; total--; } break; case STAT_INT: if (ch->perm_stat[i] > genstats[ch->race].int_min) { ch->perm_stat[i] -= 1; total--; } break; case STAT_WIS: if (ch->perm_stat[i] > genstats[ch->race].wis_min) { ch->perm_stat[i] -= 1; total--; } break; case STAT_DEX: if (ch->perm_stat[i] > genstats[ch->race].dex_min) { ch->perm_stat[i] -= 1; total--; } break; case STAT_CON: if (ch->perm_stat[i] > genstats[ch->race].con_min) { ch->perm_stat[i] -= 1; total--; } break; case STAT_CHA: if (ch->perm_stat[i] > genstats[ch->race].cha_min) { ch->perm_stat[i] -= 1; total--; } break; } } } } void add_new_create (char *name) { struct creating_type *new_creator; new_creator = malloc (sizeof (struct creating_type)); new_creator->name = str_dup (name); new_creator->next = char_creating; char_creating = new_creator; } bool check_twolinks (DESCRIPTOR_DATA *d) { return FALSE; /* CHAR_DATA *vch; if (!d || !d->host) { bug("d is null in check_twolinks.",0); return FALSE; } for (vch = char_list; vch != NULL; vch = vch->next) { if (!IS_NPC(vch) && vch->pcdata) { if ((vch != d->character) && (!strcmp (vch->pcdata->ldhost, d->host))) { sprintf (log_buf, "WARNING: %s is already logged in as %s.", d->host, vch->name); log_string (log_buf); wiznet (log_buf, NULL, NULL, WIZ_SITES, 0, 0); return TRUE; } continue; } } return FALSE;*/ } void remove_create (char *name) { struct creating_type *create_dele, *dele_next; if (char_creating == NULL) return; if (!strcmp (char_creating->name, name)) { dele_next = char_creating->next; free_string (char_creating->name); free (char_creating); char_creating = dele_next; } else for (create_dele = char_creating; create_dele; create_dele = create_dele->next) { if (create_dele->next != NULL) if (!strcmp (create_dele->next->name, name)) { dele_next = create_dele->next; create_dele->next = create_dele->next->next; free_string (dele_next->name); free (dele_next); } } } int check_create (char *name) { struct creating_type *create_walk; for (create_walk = char_creating; create_walk; create_walk = create_walk->next) if (!str_cmp (create_walk->name, name)) return (1); return (0); } /* * Malloc debugging stuff. */ #if defined(sun) #undef MALLOC_DEBUG #endif /* */ #if defined(MALLOC_DEBUG) #include <malloc.h> extern int malloc_debug args ((int)); extern int malloc_verify args ((void)); #endif /* */ /* * Signal handling. * Apollo has a problem with __attribute(atomic) in signal.h, * I dance around it. */ #if defined(apollo) #define __attribute(x) #endif /* */ #if defined(unix) #include <signal.h> #endif /* */ #if defined(apollo) #undef __attribute #endif /* */ /* * Socket and TCP/IP stuff. */ #if defined(macintosh) || defined(MSDOS) const char echo_off_str[] = { '\0' }; const char echo_on_str[] = { '\0' }; const char go_ahead_str[] = { '\0' }; #endif /* */ #if defined(unix) #include <fcntl.h> #include <netdb.h> #include <netinet/in.h> #include <sys/socket.h> #include "telnet.h" const char echo_off_str[] = { IAC, WILL, TELOPT_ECHO, '\0' }; const char echo_on_str[] = { IAC, WONT, TELOPT_ECHO, '\0' }; char go_ahead_str[] = { IAC, GA, '\0' }; #endif /* */ /* * OS-dependent declarations. */ #if defined(_AIX) #include <sys/select.h> int accept args ((int s, struct sockaddr * addr, int *addrlen)); int bind args ((int s, struct sockaddr * name, int namelen)); void bzero args ((char *b, int length)); int getpeername args ((int s, struct sockaddr * name, int *namelen)); int getsockname args ((int s, struct sockaddr * name, int *namelen)); int gettimeofday args ((struct timeval * tp, struct timezone * tzp)); int listen args ((int s, int backlog)); int setsockopt args ((int s, int level, int optname, void *optval, int optlen)); int socket args ((int domain, int type, int protocol)); #endif /* */ #if defined(apollo) #include <unistd.h> void bzero args ((char *b, int length)); #endif /* */ #if defined(__hpux) int accept args ((int s, void *addr, int *addrlen)); int bind args ((int s, const void *addr, int addrlen)); void bzero args ((char *b, int length)); int getpeername args ((int s, void *addr, int *addrlen)); int getsockname args ((int s, void *name, int *addrlen)); int gettimeofday args ((struct timeval * tp, struct timezone * tzp)); int listen args ((int s, int backlog)); int setsockopt args ((int s, int level, int optname, const void *optval, int optlen)); int socket args ((int domain, int type, int protocol)); #endif /* */ #if defined(interactive) #include <net/errno.h> #include <sys/fnctl.h> #endif /* */ /* #if defined(linux) #include <signal.h> int accept args((int s, struct sockaddr * addr, int *addrlen)); int bind args((int s, struct sockaddr * name, int namelen)); int close args((int fd)); int getpeername args((int s, struct sockaddr * name, int *namelen)); int getsockname args((int s, struct sockaddr * name, int *namelen)); int gettimeofday args((struct timeval * tp, struct timezone * tzp)); int listen args((int s, int backlog)); int read args((int fd, char *buf, int nbyte)); int select args((int width, fd_set * readfds, fd_set * writefds, fd_set * exceptfds, struct timeval * timeout)); int socket args((int domain, int type, int protocol)); int write args((int fd, char *buf, int nbyte)); #endif */ #if defined(macintosh) #include <console.h> #include <fcntl.h> #include <unix.h> struct timeval { time_t tv_sec; time_t tv_usec; }; #if !defined(isascii) #define isascii(c) ( (c) < 0200 ) #endif /* */ static long theKeys[4]; int gettimeofday args ((struct timeval * tp, void *tzp)); #endif /* */ #if defined(MIPS_OS) extern int errno; #endif /* */ #if defined(MSDOS) int gettimeofday args ((struct timeval * tp, void *tzp)); int kbhit args ((void)); #endif /* */ #if defined(NeXT) int close args ((int fd)); int fcntl args ((int fd, int cmd, int arg)); #if !defined(htons) u_short htons args ((u_short hostshort)); #endif /* */ #if !defined(ntohl) u_long ntohl args ((u_long hostlong)); #endif /* */ int read args ((int fd, char *buf, int nbyte)); int select args ((int width, fd_set * readfds, fd_set * writefds, fd_set * exceptfds, struct timeval * timeout)); int write args ((int fd, char *buf, int nbyte)); #endif /* */ #if defined(sequent) int accept args ((int s, struct sockaddr * addr, int *addrlen)); int bind args ((int s, struct sockaddr * name, int namelen)); int close args ((int fd)); int fcntl args ((int fd, int cmd, int arg)); int getpeername args ((int s, struct sockaddr * name, int *namelen)); int getsockname args ((int s, struct sockaddr * name, int *namelen)); int gettimeofday args ((struct timeval * tp, struct timezone * tzp)); #if !defined(htons) u_short htons args ((u_short hostshort)); #endif /* */ int listen args ((int s, int backlog)); #if !defined(ntohl) u_long ntohl args ((u_long hostlong)); #endif /* */ int read args ((int fd, char *buf, int nbyte)); int select args ((int width, fd_set * readfds, fd_set * writefds, fd_set * exceptfds, struct timeval * timeout)); int setsockopt args ((int s, int level, int optname, caddr_t optval, int optlen)); int socket args ((int domain, int type, int protocol)); int write args ((int fd, char *buf, int nbyte)); #endif /* */ /* This includes Solaris Sys V as well */ #if defined(sun) int accept args ((int s, struct sockaddr * addr, int *addrlen)); int bind args ((int s, struct sockaddr * name, int namelen)); void bzero args ((char *b, int length)); int close args ((int fd)); int getpeername args ((int s, struct sockaddr * name, int *namelen)); int getsockname args ((int s, struct sockaddr * name, int *namelen)); #ifndef _SYS_TIME_H int gettimeofday args ((struct timeval * tp, struct timezone * tzp)); #endif /* */ int listen args ((int s, int backlog)); int select args ((int width, fd_set * readfds, fd_set * writefds, fd_set * exceptfds, struct timeval * timeout)); #if defined(SYSV) /*Nint setsockopt args( ( int s, int level, int optname, const char *optval, int optlen ) ); */ #else /* */ /* int setsockopt args( ( int s, int level, int optname, void *optval, int optlen ) ); */ #endif /* */ int socket args ((int domain, int type, int protocol)); #endif /* */ #if defined(ultrix) int accept args ((int s, struct sockaddr * addr, int *addrlen)); int bind args ((int s, struct sockaddr * name, int namelen)); void bzero args ((char *b, int length)); int close args ((int fd)); int getpeername args ((int s, struct sockaddr * name, int *namelen)); int getsockname args ((int s, struct sockaddr * name, int *namelen)); int gettimeofday args ((struct timeval * tp, struct timezone * tzp)); int listen args ((int s, int backlog)); int read args ((int fd, char *buf, int nbyte)); int select args ((int width, fd_set * readfds, fd_set * writefds, fd_set * exceptfds, struct timeval * timeout)); int setsockopt args ((int s, int level, int optname, void *optval, int optlen)); int socket args ((int domain, int type, int protocol)); int write args ((int fd, char *buf, int nbyte)); #endif /* */ /* * Global variables. */ DESCRIPTOR_DATA *descriptor_list; /* All open descriptors */ DESCRIPTOR_DATA *d_next; /* Next descriptor in loop */ FILE *fpReserve; /* Reserved file handle */ bool god; /* All new chars are gods! */ bool merc_down; /* Shutdown */ long shutdown_time = -1; /* The time for a shutdown */ long shutdown_severity = 7; /* The starting severity */ bool wizlock; /* Game is wizlocked */ bool newlock; /* Game is newlocked */ char str_boot_time[MAX_INPUT_LENGTH]; time_t current_time; /* time of this pulse */ /* * OS-dependent local functions. */ #if defined(macintosh) || defined(MSDOS) void game_loop_mac_msdos args ((void)); bool read_from_descriptor args ((DESCRIPTOR_DATA * d)); bool write_to_descriptor args ((int desc, char *txt, int length)); #endif /* */ #if defined(unix) void game_loop_unix args ((int control, int whosock, int areasock)); int init_socket args ((int port)); void init_descriptor args ((int control)); bool read_from_descriptor args ((DESCRIPTOR_DATA * d)); bool write_to_descriptor args ((int desc, char *txt, int length)); #endif /* */ /* * Other local functions (OS-independent). */ bool check_parse_name args ((char *name)); bool check_reconnect args ((DESCRIPTOR_DATA * d, char *name, bool fConn)); bool check_playing args ((DESCRIPTOR_DATA * d, char *name)); int main args ((int argc, char **argv)); void nanny args ((DESCRIPTOR_DATA * d, char *argument)); bool process_output args ((DESCRIPTOR_DATA * d, bool fPrompt)); void read_from_buffer args ((DESCRIPTOR_DATA * d)); void stop_idling args ((CHAR_DATA * ch)); void bust_a_prompt args ((CHAR_DATA * ch)); static void machine_reboot (int signo) { DESCRIPTOR_DATA *d, *d_next; FILE *sfp; if ((sfp = fopen ("shutdown.txt", "a")) != NULL) { fprintf (sfp, "Machine-Reboot Shutdown"); fclose (sfp); } merc_down = TRUE; for (d = descriptor_list; d != NULL; d = d_next) { d_next = d->next; if (d->connected == CON_PLAYING && d->character != NULL) { send_to_char ("Sorry, the mud is going down NOW due to a machine reboot.\n\r", d->character); /* save_char_obj(d->character); */ } close_socket (d); } } int fdsize; // // Akamai 01/24/00 - This function writes the process id of the Exodus // main code to a file. Useful for special shutdown scripts. // // prototype void exodus_pid (); // function void exodus_pid () { char buf[MAX_INPUT_LENGTH]; char pidf[MAX_INPUT_LENGTH]; FILE *fp; long pid = 0; pid = (long) getpid (); // sprintf(buf,"Exodus PID: %ld",pid); sprintf (buf, "%ld", pid); sprintf (pidf, "%s%s", BIN_DIR, EXODUS_PID); if ((fp = fopen (pidf, "w")) != NULL) { fprintf (fp, "%s", buf); fclose (fp); log_string ("boot_db() - wrote exodus.pid"); // log_string (buf); } else { bug ("Couldn't open exodus.pid file.", 0); log_string (buf); } } int main (int argc, char **argv) { struct rlimit fd_limit; //, stack_limit; struct timeval now_time; int port; int control, whosock, areasock; #if defined(MALLOC_DEBUG) malloc_debug (2); #endif /* */ /*Edits for creating default area here --Dither*/ /*{ CHAR_DATA *ch; if ((fpReserve = fopen (NULL_FILE, "r")) == NULL) { perror (NULL_FILE); exit (1); } ch = new_char (); ch->pcdata = new_pcdata (); ch->name=str_dup("Dither"); ch->id=get_pc_id(); ch->race=race_lookup("human"); ch->act=PLR_NOSUMMON; ch->act2 = 0; ch->blocks_exit = -1; ch->sink_timer = -1; ch->comm2 = COMM_NORANT; ch->contaminator = NULL; ch->comm = COMM_COMBINE | COMM_PROMPT; //| COMM_NOGOSSIP | COMM_NOGRATS | COMM_NOMUSIC | //COMM_NOQUESTION; ch->prompt = str_dup ("`a<`lHP`a:`F%h `lMA`a:`I%m `lMV`a:`J%v`a>`` %S"); //Shinowlan - 3/2/99 //used by do_kai to determine lag to apply to kai user. ch->pcdata->last_kai = current_time; ch->pcdata->last_pkdeath = 0; ch->pcdata->confirm_delete = FALSE; ch->pcdata->last_fight = 0; // ch->pcdata->last_loot = 0; ch->pcdata->events_won[BR_WON] = 0; ch->pcdata->events_won[BR_IN] = 0; ch->pcdata->events_won[SD_WON] = 0; ch->pcdata->events_won[SD_IN] = 0; ch->pcdata->events_won[TEAM_SD_WON] = 0; ch->pcdata->events_won[TEAM_SD_IN] = 0; ch->pcdata->other_deaths = 0; ch->pcdata->been_killed[PLAYER_KILL] = 0; ch->pcdata->been_killed[MOB_KILL] = 0; ch->pcdata->been_killed[BR_KILL] = 0; ch->pcdata->been_killed[SD_KILL] = 0; ch->pcdata->been_killed[ARENA_KILL] = 0; ch->pcdata->has_killed[PLAYER_KILL] = 0; ch->pcdata->has_killed[MOB_KILL] = 0; ch->pcdata->has_killed[BR_KILL] = 0; ch->pcdata->has_killed[SD_KILL] = 0; ch->pcdata->has_killed[ARENA_KILL] = 0; ch->pcdata->pwd = str_dup (""); ch->pcdata->bamfin = str_dup (""); ch->pcdata->speedwalk = str_dup (""); ch->pcdata->bamfout = str_dup (""); ch->pcdata->whoinfo = str_dup (""); ch->pcdata->pretitle = str_dup (""); ch->pcdata->battlecry = str_dup (""); ch->pcdata->plan = str_dup (""); ch->pcdata->title = str_dup (""); ch->pcdata->restoremsg = str_dup (""); ch->pcdata->email_addr = str_dup (""); ch->pcdata->referrer = str_dup (""); for (stat = 0; stat < MAX_STATS; stat++) ch->perm_stat[stat] = 13; ch->pcdata->condition[COND_THIRST] = 48; ch->pcdata->condition[COND_FULL] = 48; ch->pcdata->condition[COND_HUNGER] = 48; ch->pcdata->security = 0; ch->pcdata->last_saved_room = 0; ch->pcdata->souls = 0; ch->pcdata->reaver_chant = -1; ch->pcdata->chant_wait = 0; ch->pcdata->hp_gained = 0; ch->pcdata->mana_gained = 0; ch->pcdata->move_gained = 0; ch->pcdata->rppoints = 0; ch->pcdata->nhpoints = 0; ch->pcdata->qpoints = 0; ch->pcdata->avatar_type = 0; ch->pcdata->old_race = -1; ch->pcdata->has_reincarnated = FALSE; ch->pcdata->old_class = -1; ch->pcdata->prevent_escape = 0; ch->pcdata->noblinking = 0; ch->pcdata->falcon_alert = 0; //IBLIS 5/31/03 - NOT WRITTEN TO A FILE ch->pcdata->feigned = FALSE; //IBLIS 6/07/03 - NOT WRITTEN TO A FILE ch->pcdata->last_death_counter = 0; ch->pcdata->voted = VOTED_NOT; ch->pcdata->xp_last_death = 0; ch->pcdata->br_points = 0; ch->pcdata->br_death_points = 0; ch->pcdata->agg_list = NULL; ch->pcdata->falcon_wait = 0; ch->pcdata->falcon_recipient = NULL; ch->pcdata->falcon_object = NULL; ch->pcdata->nplayed = 0; ch->pcdata->nage = 0; ch->pcdata->nochan_ticks = 0; ch->pcdata->shutup_ticks= 0; ch->pcdata->backup_hit = 20; ch->pcdata->backup_move = 0; ch->pcdata->backup_mana = 0; ch->pcdata->group_exp = 0; ch->pcdata->new_style = 0; ch->pcdata->fishing = 0; ch->pcdata->fishing_ll = 0; ch->pcdata->fishing_weight = 0; // Below NOT saved ch->pcdata->knock_time = 0; ch->pcdata->pushed_mobs_counter = 0; ch->pcdata->nogate = FALSE; // Below 3 NOT SAVED ch->pcdata->aggression = 0; ch->pcdata->corpse = NULL; ch->pcdata->corpse_to_room = NULL; ch->pcdata->corpse_timer = 0; ch->pcdata->familiar = NULL; ch->pcdata->soul_link = NULL; ch->pcdata->familiar_type = 0; ch->pcdata->familiar_max_hit = 20; ch->pcdata->familiar_max_mana = 100; ch->pcdata->familiar_max_move = 100; ch->pcdata->familiar_exp = 0; ch->pcdata->familiar_level = 1; ch->pcdata->familiar_gained_hp = 0; ch->pcdata->familiar_gained_mana = 0; ch->pcdata->familiar_gained_move = 0; ch->pcdata->familiar_name = str_dup (""); ch->pcdata->flaming = 0; ch->pcdata->totalxp = 0; ch->pcdata->totalsouls = 0; ch->pcdata->tg_won = 0; ch->pcdata->tg_lost = 0; ch->pcdata->quest_mob = NULL; ch->pcdata->quest_obj = NULL; ch->pcdata->quest_ticks = 0; ch->pcdata->total_quest_finds = 0; ch->pcdata->total_quest_hunts = 0; ch->pcdata->total_qf_attempted = 0; ch->pcdata->oow_ticks = 0; ch->pcdata->total_trees_chopped = 0; ch->pcdata->total_trees_milled = 0; ch->pcdata->total_objs_sold = 0; ch->pcdata->total_money_made = 0; ch->pcdata->total_cg_won = 0; ch->pcdata->total_cg_lost = 0; ch->pcdata->cg_next = NULL; ch->pcdata->cg_ticks = 0; ch->pcdata->cg_main_mob = NULL; ch->pcdata->cg_secondary_mob = NULL; ch->pcdata->cg_terrain = NULL; ch->pcdata->cg_lcp = NULL; ch->pcdata->cg_state = 0; ch->pcdata->cg_timer = 0; ch->pcdata->pain_points = 0; ch->pcdata->personality = 0; ch->pcdata->all_xp_familiar = FALSE; ch->class2 = -1; ch->class3 = -1; for (i = 0; i < MAX_SKILL; i++) { if (skill_table[i].name != NULL) // && ch->pcdata->mod_learned[sn] != -1) { ch->pcdata->mod_learned[i] = -999; } } found = FALSE; */ /* AREA_DATA *pArea; ROOM_INDEX_DATA *pRoomIndex; int door; int iHash; int vnum; pArea = alloc_perm (sizeof (*pArea)); pArea->reset_first = NULL; pArea->reset_last = NULL; pArea->ot_first = NULL; pArea->ot_last = NULL; pArea->version = AREA_VER_DEFAULT; pArea->file_name = str_dup("limbo.are"); pArea->filename = str_dup("limbo.are"); pArea->name="Limbo"; pArea->area_flags=0; pArea->vnum=top_area; pArea->creator = str_dup("Dither"); pArea->llev = 0; pArea->ulev = 99; pArea->credits = str_dup("Dither"); pArea->help = str_dup("help"); pArea->min_vnum = 1; pArea->max_vnum = 99; pArea->points = 0; SET_BIT (pArea->area_flags,AREA_NO_TREE); pArea->clan=0; pArea->noclan = 0; pArea->construct = 0; pArea->helper = str_dup(""); pArea->lvnum = pArea->min_vnum; pArea->uvnum = pArea->max_vnum; pArea->age = 33; pArea->nplayer = 0; pArea->empty = FALSE; area_first = pArea; area_last=pArea; pArea->next=NULL; top_area++; pRoomIndex = alloc_perm (sizeof (*pRoomIndex)); pRoomIndex->owner = str_dup (""); pRoomIndex->people = NULL; pRoomIndex->contents = NULL; pRoomIndex->extra_descr = NULL; pRoomIndex->scents = NULL; pRoomIndex->eplprog = NULL; pRoomIndex->epl_filename = NULL; pRoomIndex->sink_msg = NULL; pRoomIndex->sink_msg_others = NULL; pRoomIndex->sink_warning = NULL; pRoomIndex->sink_timer = 0; pRoomIndex->sink_dest = 4200; pRoomIndex->area = area_last; pRoomIndex->vnum=1; vnum=1; pRoomIndex->tp_level = 0; pRoomIndex->tp_exp = 0; pRoomIndex->tp_msg = str_dup("");; pRoomIndex->enter_msg = str_dup(""); pRoomIndex->exit_msg = str_dup(""); pRoomIndex->class_flags = 0; pRoomIndex->race_flags = 0; pRoomIndex->max_level = 0; pRoomIndex->name = str_dup("The Void"); pRoomIndex->description = str_dup("You are floating in nothing.\n\r"); // pRoomIndex->description = str_dup("You are floating in a formless void, detached from all sensation of physical\n\rmatter, surrounded by swirling glowing light, which fades into the relative\n\rdarkness around you without any trace of edges or shadow.\n\r There is a "No Tipping" notice pinned to the darkness."); pRoomIndex->room_flags = ROOM_INDOORS|ROOM_NO_MOB|ROOM_NO_RECALL|ROOM_NOMAGIC; pRoomIndex->sector_type = SECT_CITY; pRoomIndex->max_in_room = 0; pRoomIndex->max_message = str_dup("max_message"); pRoomIndex->light = 1; for (door = 0; door <= 5; door++) pRoomIndex->exit[door] = NULL; pRoomIndex->heal_rate = 100; pRoomIndex->mana_rate = 100; iHash = vnum % MAX_KEY_HASH; pRoomIndex->next = room_index_hash[iHash]; room_index_hash[iHash] = pRoomIndex; top_room++; top_vnum_room = top_vnum_room < vnum ? vnum : top_vnum_room; save_area_list(); save_area(pArea); } return 0; */ /*END default area edits*/ init_signals (); /* For the use of the signal handler */ gettimeofday (&now_time, NULL); current_time = (time_t) now_time.tv_sec; strcpy (str_boot_time, ctime (¤t_time)); getrlimit (RLIMIT_NOFILE, &fd_limit); fd_limit.rlim_cur = fd_limit.rlim_max - 8; setrlimit (RLIMIT_NOFILE, &fd_limit); fdsize = fd_limit.rlim_cur; // Shinowlan - debug attempt to fix 'save' recurse problem // this, in general, does not work. So it's commented out. /* getrlimit(RLIMIT_STACK, &stack_limit); log_buf[0]= '\0'; sprintf (log_buf, "STACK: intially at %ld bytes.", stack_limit.rlim_cur); log_string(log_buf); stack_limit.rlim_cur = stack_limit.rlim_max; setrlimit(RLIMIT_STACK, &stack_limit); log_buf[0]= '\0'; sprintf (log_buf, "STACK: Current stack is now set to %ld bytes", stack_limit.rlim_max); log_string(log_buf); getrlimit(RLIMIT_STACK, &stack_limit); log_buf[0]= '\0'; sprintf (log_buf, "STACK: is at %ld bytes.", stack_limit.rlim_cur); */ if ((fpReserve = fopen (NULL_FILE, "r")) == NULL) { perror (NULL_FILE); exit (1); } port = 9000; if (argc > 1) { if (!is_number (argv[1])) { fprintf (stderr, "Usage: %s [port #]\n", argv[0]); exit (1); } else if ((port = atoi (argv[1])) <= 1024) { fprintf (stderr, "Port number must be above 1024.\n"); exit (1); } } #if defined(unix) if (port == 9000) { whosock = init_socket (8999); areasock = init_socket (8887); } else { whosock = -1; areasock = -1; } control = init_socket (port); boot_db (); sprintf (log_buf, "Exodus is ready to rock on port %d.", port); /* signal (SIGUSR1, machine_reboot); signal (SIGTERM, machine_reboot); */ exodus_pid (); log_string (log_buf); game_loop_unix (control, whosock, areasock); close (control); #endif /* */ log_string ("Normal termination of game."); exit (0); return 0; } #if defined(unix) int init_socket (int port) { static struct sockaddr_in sa_zero; struct sockaddr_in sa; int x = 1; int fd; if ((fd = socket (AF_INET, SOCK_STREAM, 0)) < 0) { perror ("Init_socket: socket"); exit (1); } if (setsockopt (fd, SOL_SOCKET, SO_REUSEADDR, (char *) &x, sizeof (x)) < 0) { perror ("Init_socket: SO_REUSEADDR"); close (fd); exit (1); } 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"); close (fd); exit (1); } if (listen (fd, 3) < 0) { perror ("Init socket: listen"); close (fd); exit (1); } return fd; } #endif /* */ void sig_handler (int sig) { switch (sig) { case SIGBUS: bug ("SIGBUS", 0); do_auto_shutdown (sig); break; case SIGTERM: bug ("SIGTERM", 0); machine_reboot (sig); break; case SIGABRT: bug ("SIGABRT", 0); do_auto_shutdown (sig); break; case SIGUSR1: bug ("SIGUSR1", 0); machine_reboot (sig); break; case SIGSEGV: bug ("SIGSEGV", 0); do_auto_shutdown (sig); break; } } void init_signals () { signal (SIGBUS, sig_handler); signal (SIGTERM, sig_handler); signal (SIGABRT, sig_handler); signal (SIGUSR1, sig_handler); signal (SIGSEGV, sig_handler); } void dump_areas (int areasock) { char buf[MAX_STRING_LENGTH], bigbuf[MAX_STRING_LENGTH * 10]; AREA_DATA *pArea; int len, desc, size; /* int count = 0; */ struct sockaddr_in sock; size = sizeof (sock); if ((desc = accept (areasock, (struct sockaddr *) &sock, &size)) < 0) { perror ("New_descriptor: accept"); return; } sprintf (bigbuf, "`l[`gLevel `l][`gArea Name `l][`gCreator `l][`k$$`l][`gDominion `l][`gHelp `l]``\n\r"); len = strlen (bigbuf); for (pArea = area_first; pArea != NULL; pArea = pArea->next) { if (!str_cmp (pArea->name, "Haven")) continue; len += sprintf (bigbuf + len, "[%-3d %-3d]", pArea->llev, pArea->ulev); format_color (buf, pArea->name, 25); len += sprintf (bigbuf + len, "[%s``]", buf); format_color (buf, pArea->creator, 12); len += sprintf (bigbuf + strlen (bigbuf), "[%s]", buf); len += sprintf (bigbuf + len, "[%2d]", pArea->points); format_color (buf, get_clan_symbol (pArea->clan), 10); len += sprintf (bigbuf + len, "[%s``]", buf); format_color (buf, pArea->help, 12); len += sprintf (bigbuf + len, "[%s``]\n\r", buf); } write (desc, bigbuf, strlen (bigbuf)); close (desc); } void dump_who (int whosock) { char cbuf[MAX_STRING_LENGTH], *this_clan; char buf[MAX_STRING_LENGTH], obuf[MAX_STRING_LENGTH * 4]; DESCRIPTOR_DATA *d; int iClass; int iRace; int iClan; int nNumber; int nMatch; bool rgfClass[MAX_CLASS]; bool rgfRace[MAX_PC_RACE]; bool rgfClan[MAX_CLAN]; int desc, size, count; struct sockaddr_in sock; obuf[0] = '\0'; size = sizeof (sock); if ((desc = accept (whosock, (struct sockaddr *) &sock, &size)) < 0) { perror ("New_descriptor: accept"); return; } for (iClass = 0; iClass < MAX_CLASS; iClass++) rgfClass[iClass] = FALSE; for (iRace = 0; iRace < MAX_PC_RACE; iRace++) rgfRace[iRace] = FALSE; for (iClan = 0; iClan < MAX_CLAN; iClan++) rgfClan[iClan] = FALSE; nNumber = 0; nMatch = 0; buf[0] = '\0'; for (d = descriptor_list; d != NULL; d = d->next) { CHAR_DATA *wch; char *class, class_buf[64]; /* * Check for match against restrictions. * Don't use trust as that exposes trusted mortals. */ if (d->connected != CON_PLAYING) continue; wch = (d->original != NULL) ? d->original : d->character; if (wch->invis_level > 1) continue; if (1 < wch->incog_level) continue; if (IS_AFFECTED (wch, AFF_INVISIBLE)) continue; nMatch++; switch (wch->class) { case PC_CLASS_MAGE: /* Mage */ strcpy (class_buf, "`b"); break; case PC_CLASS_CLERIC: /* Cleric */ strcpy (class_buf, "`n"); break; case PC_CLASS_THIEF: /* Thief */ strcpy (class_buf, "`a"); break; case PC_CLASS_WARRIOR: /* Warrior */ strcpy (class_buf, "`i"); break; case PC_CLASS_RANGER: /* Ranger */ strcpy (class_buf, "`c"); break; case PC_CLASS_BARD: /* Bard */ strcpy (class_buf, "`m"); break; case PC_CLASS_PALADIN: /* Paladin */ strcpy (class_buf, "`o"); break; case PC_CLASS_ASSASSIN: /* Assassin */ strcpy (class_buf, "`a"); break; case PC_CLASS_REAVER: /* Reaver */ strcpy (class_buf, "`e"); break; case PC_CLASS_MONK: /* Monk */ strcpy (class_buf, "`h"); break; case PC_CLASS_NECROMANCER: /* Necromancer */ strcpy (class_buf, "`k"); break; case PC_CLASS_SWARM: /* Swarm */ strcpy (class_buf, "`k"); break; case PC_CLASS_GOLEM: strcpy (class_buf, "`d"); break; case PC_CLASS_CHAOS_JESTER: strcpy (class_buf, "`f"); break; case PC_CLASS_ADVENTURER: strcpy (class_buf, "`j"); break; } strcat (class_buf, class_table[wch->class].who_name); strcat (class_buf, "``"); switch (wch->class2) { case 0: /* Mage */ strcat (class_buf, "`b"); break; case 1: /* Cleric */ strcat (class_buf, "`n"); break; case 2: /* Thief */ strcat (class_buf, "`a"); break; case 3: /* Warrior */ strcat (class_buf, "`i"); break; case 4: /* Ranger */ strcat (class_buf, "`c"); break; case 5: /* Bard */ strcat (class_buf, "`m"); break; case 6: /* Paladin */ strcat (class_buf, "`o"); break; case 7: /* Assassin */ strcat (class_buf, "`a"); break; case 8: /* Reaver */ strcat (class_buf, "`e"); break; case 9: /* Monk */ strcat (class_buf, "`h"); break; case 10: /* Necromancer */ strcat (class_buf, "`k"); break; case PC_CLASS_SWARM: /* Swarm */ strcat (class_buf, "`k"); break; case PC_CLASS_GOLEM: strcat (class_buf, "`d"); break; case PC_CLASS_CHAOS_JESTER: strcat (class_buf, "`f"); break; case PC_CLASS_ADVENTURER: strcat (class_buf, "`j"); break; } strcat (class_buf, class_table[wch->class2].who_name); strcat (class_buf, "``"); switch (wch->class3) { case 0: /* Mage */ strcat (class_buf, "`b"); break; case 1: /* Cleric */ strcat (class_buf, "`n"); break; case 2: /* Thief */ strcat (class_buf, "`a"); break; case 3: /* Warrior */ strcat (class_buf, "`i"); break; case 4: /* Ranger */ strcat (class_buf, "`c"); break; case 5: /* Bard */ strcat (class_buf, "`m"); break; case 6: /* Paladin */ strcat (class_buf, "`o"); break; case 7: /* Assassin */ strcat (class_buf, "`a"); break; case 8: /* Reaver */ strcat (class_buf, "`e"); break; case 9: /* Monk */ strcat (class_buf, "`h"); break; case 10: /* Necromancer */ strcat (class_buf, "`k"); break; case PC_CLASS_SWARM: /* Swarm */ strcat (class_buf, "`k"); break; case PC_CLASS_GOLEM: strcat (class_buf, "`d"); break; case PC_CLASS_CHAOS_JESTER: strcat (class_buf, "`f"); break; case PC_CLASS_ADVENTURER: strcat (class_buf, "`j"); break; } strcat (class_buf, class_table[wch->class3].who_name); strcat (class_buf, "``"); // class = class_buf; class = class_buf; if (wch->level >= LEVEL_IMMORTAL) { if (wch->pcdata->whoinfo[0] != '\0') { strcpy (cbuf, center_text (wch->pcdata->whoinfo, 21)); class = cbuf; } else switch (wch->level) { default: class = "UNKNOWN"; break; case MAX_LEVEL: class = " overlord "; break; case MAX_LEVEL - 1: case MAX_LEVEL - 2: class = " wizard "; break; case MAX_LEVEL - 3: case MAX_LEVEL - 4: case MAX_LEVEL - 5: class = " god "; break; case MAX_LEVEL - 6: case MAX_LEVEL - 7: case MAX_LEVEL - 8: case MAX_LEVEL - 9: class = " demigod "; break; } } if (IS_SET (wch->comm, COMM_ANONYMOUS)) if ((1 <= (wch->level + 10)) || (wch->race == 7)) class = " `aanonymous`` "; if ((wch->clan != CLAN_BOGUS) && is_full_clan (wch)) this_clan = get_clan_symbol_ch (wch); else if (!IS_NPC (wch) && wch->pcdata->loner) this_clan = "`f[`h*`f]"; else this_clan = ""; if (wch->level >= LEVEL_IMMORTAL || (IS_SET (wch->comm, COMM_ANONYMOUS) && 1 <= (wch->level + 10))) sprintf (obuf + strlen (obuf), "`e(`h%s`e) ``%s`` %s%s%s%s%s%s%s%s``\n\r", class, this_clan, wch->incog_level >= LEVEL_HERO ? "(Incog) " : "", wch->invis_level >= LEVEL_HERO ? "(Wizi) " : "", IS_SET (wch->comm, COMM_AFK) ? "`k[AFK]`` " : "", IS_SET (wch->comm, COMM_QUIET) ? "`k[QUIET]`` " : "", IS_SET (wch->act, PLR_WANTED) ? "`b[Wanted]`` " : "", IS_SET (wch->act, PLR_JAILED) ? "`i[Jailed]`` " : "", (is_affected (wch, gsn_mask) && wch->mask != NULL) ? wch->mask : wch->name, IS_NPC (wch) ? "" : wch->pcdata->title); else sprintf (obuf + strlen (obuf), "`e(`h%2d `l%6s %s`e) ``%s`` %s%s%s%s%s%s%s%s``\n\r", wch->level, wch->race < MAX_PC_RACE ? pc_race_table[wch->race]. who_name : " ", class, this_clan, wch->incog_level >= LEVEL_HERO ? "(Incog) " : "", wch->invis_level >= LEVEL_HERO ? "(Wizi) " : "", IS_SET (wch->comm, COMM_AFK) ? "`k[AFK]`` " : "", IS_SET (wch->comm, COMM_QUIET) ? "`k[QUIET]`` " : "", IS_SET (wch->act, PLR_WANTED) ? "`b[Wanted]`` " : "", IS_SET (wch->act, PLR_JAILED) ? "`i[Jailed]`` " : "", (is_affected (wch, gsn_mask) && wch->mask != NULL) ? wch->mask : wch->name, IS_NPC (wch) ? "" : wch->pcdata->title); } count = 0; for (d = descriptor_list; d != NULL; d = d->next) { if (d->connected != CON_PLAYING) continue; if (d->character == NULL) continue; if (d->character->invis_level > 1) continue; if (1 < d->character->incog_level) continue; if (IS_AFFECTED (d->character, AFF_INVISIBLE)) continue; count++; } max_on = UMAX (count, max_on); if (max_on == count) sprintf (obuf + strlen (obuf), "\n\r\n\rThere are `o%d`` characters on, the most so far today.\n\r", count); else sprintf (obuf + strlen (obuf), "\n\r\n\rThere are `o%d`` characters on, the most on today was `o%d``.\n\r", count, max_on); write (desc, obuf, strlen (obuf)); close (desc); return; } #if defined(unix) void game_loop_unix (int control, int whosock, int areasock) { struct timeval last_time; fd_set in_set, out_set; /* , exc_set; */ DESCRIPTOR_DATA *d; /* int maxdesc; */ signal (SIGPIPE, SIG_IGN); gettimeofday (&last_time, NULL); current_time = (time_t) last_time.tv_sec; while (!merc_down) { FD_ZERO (&in_set); FD_ZERO (&out_set); /* FD_ZERO(&exc_set); */ FD_SET (control, &in_set); if (whosock != -1) FD_SET (whosock, &in_set); if (areasock != -1) FD_SET (areasock, &in_set); /* maxdesc = control; */ for (d = descriptor_list; d; d = d->next) { /* maxdesc = UMAX(maxdesc, d->descriptor); */ FD_SET (d->descriptor, &in_set); FD_SET (d->descriptor, &out_set); /* FD_SET(d->descriptor, &exc_set); */ } if (select (fdsize, &in_set, &out_set, NULL, NULL) < 0) { perror ("Game_loop: select: poll"); exit (1); } /* * New connection? */ if (FD_ISSET (control, &in_set)) init_descriptor (control); if (whosock != -1) if (FD_ISSET (whosock, &in_set)) dump_who (whosock); if (areasock != -1) if (FD_ISSET (areasock, &in_set)) dump_areas (areasock); /* for (d = descriptor_list; d != NULL; d = d_next) { d_next = d->next; if (FD_ISSET(d->descriptor, &exc_set)) { FD_CLR(d->descriptor, &in_set); FD_CLR(d->descriptor, &out_set); if (d->character && d->character->level > 1) save_char_obj(d->character); d->outtop = 0; close_socket(d); } } */ /* * Process input. */ for (d = descriptor_list; d != NULL; d = d_next) { isorder = FALSE; d_next = d->next; d->fcommand = FALSE; if (FD_ISSET (d->descriptor, &in_set)) { if (d->character != NULL) d->character->timer = 0; if (!read_from_descriptor (d)) { FD_CLR (d->descriptor, &out_set); if (d->character != NULL && d->character->level > 1) save_char_obj (d->character); d->outtop = 0; close_socket (d); continue; } } if (d->character != NULL && d->character->daze > 0) --d->character->daze; if (d->character != NULL && d->character->wait > 0) { --d->character->wait; continue; } read_from_buffer (d); if (d->incomm[0] != '\0') { d->fcommand = TRUE; keepincomm = FALSE; stop_idling (d->character); if (d->connected == CON_START_MULTICLASS || d->connected == CON_FINISH_MULTICLASS) multiclass (d, d->incomm); else if (d->showstr_point) show_string (d, d->incomm); else if (d->pString && d->editor == EDIT_MENU) edit_menu (d->character, d->incomm); else if (d->pString && d->editor == SEARCH_REPLACE) search_replace (d->character, d->incomm); else if (d->pString && d->editor == EDIT_LINE_NUMBER) edit_line_number (d->character, d->incomm); else if (d->pString && d->editor == INSERT_LINE_NUMBER) insert_line_number (d->character, d->incomm); else if (d->pString && d->editor == DELE_LINE_NUMBER) dele_line_number (d->character, d->incomm); else if (d->pString && d->editor == EDIT_NEW_LINE) edit_new_line (d->character, d->incomm); else if (d->pString && d->editor == INSERT_NEW_LINE) insert_new_line (d->character, d->incomm); else if (d->pString) string_add (d->character, d->incomm); /* else if (d->character && d->character->pcdata && d->character->pcdata->cg_state >= CG_START_PM_YT && d->character->pcdata->cg_state <= CG_NYT_D_PM) cardgame_menu (d->character, d->incomm);*/ else if (d->connected == CON_PLAYING) { if (!run_olc_editor (d)) { char mybuf[MAX_STRING_LENGTH]; char *cptr, *cptr2; bool found, docmd = TRUE; char *cptr3; char mycmd[MAX_STRING_LENGTH], bufcmd[MAX_STRING_LENGTH]; int cmd; strcpy (mybuf, d->incomm); cptr = mybuf; while ((cptr2 = strchr (cptr, ';')) != NULL) { strcpy (bufcmd, cptr2 + 1); cptr3 = bufcmd; while (*cptr3 != '\0') { if (isalpha (*cptr3)) break; cptr3++; } strcpy (mycmd, cptr3); cptr3 = mycmd; while (*cptr3 != '\0') { if (isspace (*cptr3)) { *cptr3 = '\0'; break; } cptr3++; } found = FALSE; for (cmd = 0; cmd_table[cmd].name[0] != '\0'; cmd++) { if (mycmd[0] == cmd_table[cmd].name[0] && !str_prefix (mycmd, cmd_table[cmd].name) && (cmd_table[cmd].level <= d->character-> trust || cmd_table[cmd].level <= d->character->level)) { found = TRUE; break; } } if (!found) for (cmd = 0; social_table[cmd].name[0] != '\0'; cmd++) { if (mycmd[0] == social_table[cmd]. name[0] && !str_prefix (mycmd, social_table [cmd].name)) { found = TRUE; break; } } if (found) { *cptr2 = '\0'; substitute_alias (d, cptr); docmd = FALSE; keepincomm = TRUE; strcpy (d->incomm, cptr2 + 1); break; } else *cptr2 = 7; } if (docmd) substitute_alias (d, d->incomm); } } else { nanny (d, d->incomm); } if (!keepincomm) d->incomm[0] = '\0'; } } update_handler (); for (d = descriptor_list; d != NULL; d = d_next) { d_next = d->next; if ((d->fcommand || d->outtop > 0) && FD_ISSET (d->descriptor, &out_set)) { if (!process_output (d, TRUE)) { if (d->character != NULL && d->character->level > 1) { save_char_obj (d->character); } d->outtop = 0; close_socket (d); } } } /* * Synchronize to a clock. * Sleep( last_time + 1/PULSE_PER_SECOND - now ). * Careful here of signed versus unsigned arithmetic. */ { 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; if (select (0, NULL, NULL, NULL, &stall_time) < 0) { perror ("Game_loop: select: stall"); //exit (1); } } } gettimeofday (&last_time, NULL); current_time = (time_t) last_time.tv_sec; } return; } #endif /* */ #if defined(unix) void init_descriptor (int control) { char buf[MAX_STRING_LENGTH]; DESCRIPTOR_DATA *dnew; struct sockaddr_in sock; struct hostent *from; int desc; int size; 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 /* */ if (fcntl (desc, F_SETFL, FNDELAY) == -1) { perror ("New_descriptor: fcntl: FNDELAY"); return; } /* * Cons a new descriptor. */ dnew = new_descriptor (); dnew->descriptor = desc; dnew->connected = CON_GET_ANSI; dnew->showstr_head = NULL; dnew->showstr_point = NULL; dnew->outsize = 10000; dnew->pEdit = NULL; dnew->pString = NULL; dnew->editor = 0; dnew->outbuf = alloc_mem (dnew->outsize); size = sizeof (sock); if (getpeername (desc, (struct sockaddr *) &sock, &size) < 0) { perror ("New_descriptor: getpeername"); dnew->host = str_dup ("(unknown)"); } else { /* * Would be nice to use inet_ntoa here but it takes a struct arg, * which ain't very compatible between gcc and system libraries. */ 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, "Sock.sinaddr: %s", buf); /* There's no real need for all this extra info log_string (log_buf); */ if (!slowns) /* Here we determine if name services is used */ from = gethostbyaddr ((char *) &sock.sin_addr, sizeof (sock.sin_addr), AF_INET); else from = NULL; //Shinowlan 3/29/2000 -- keep track of players's remote port dnew->port = ntohs (sock.sin_port); /* from = NULL; */ dnew->host = str_dup (from ? from->h_name : buf); dnew->realhost = str_dup (from ? from->h_name : buf); } /* * Swiftest: I added the following to ban sites. I don't * endorse banning of sites, but Copper has few descriptors now * and some people from certain sites keep abusing access by * using automated 'autodialers' and leaving connections hanging. * * Furey: added suffix check by request of Nickel of HiddenWorlds. */ if (check_ban (dnew->host, BAN_ALL)) { write_to_descriptor (desc, "Your site has been banned from this mud.\n\r", 0); close (desc); free_descriptor (dnew); return; } /* * Init descriptor data. */ dnew->next = descriptor_list; descriptor_list = dnew; write_to_buffer (dnew, "ANSI Color (Y/n)? ", 0); return; } #endif /* */ void close_socket (DESCRIPTOR_DATA * dclose) { CHAR_DATA *ch, *vch, *vch_next; char buf[MAX_STRING_LENGTH]; if (dclose->outtop > 0) process_output (dclose, FALSE); if (dclose->snoop_by != NULL) { send_to_desc (dclose->snoop_by, "Your victim has left the game.\n\r"); } { DESCRIPTOR_DATA *d; for (d = descriptor_list; d != NULL; d = d->next) { if (d->snoop_by == dclose) d->snoop_by = NULL; } } if ((ch = dclose->character) != NULL) { sprintf (log_buf, "Closing link to %s.", ch->name); log_string (log_buf); if (dclose->connected == CON_PLAYING && !merc_down) { //5-12-03 Iblis - So you don't notice those you can't see going ld //note: declare buf, vch, vch_next sprintf (buf, "%s has lost their link.\n\r", ch->name); //7/14/03 Iblis - To fix the reincarnation bug // if (ch->pcdata->br_points < 0) // do_hard_quit(ch,0); for (vch = char_list; vch != NULL; vch = vch_next) { vch_next = vch->next; if (vch->in_room == NULL) continue; if (vch->in_room == ch->in_room && can_see (vch, ch) && ch != vch) { send_to_char (buf, vch); continue; } } // act ("$n has lost $s link.", ch, NULL, NULL, TO_ROOM); if (!merc_down) wiznet ("Net death has claimed $N.", ch, NULL, WIZ_LINKS, 0, 0); ch->desc = NULL; if (!IS_NPC(ch) && ch->pcdata->br_points < 0) { do_hard_quit (ch, 0, FALSE); } // ch->switched = NULL; } else { free_char (dclose->character); } } if (d_next == dclose) d_next = d_next->next; if (dclose == descriptor_list) { descriptor_list = descriptor_list->next; } else { DESCRIPTOR_DATA *d; for (d = descriptor_list; d && d->next != dclose; d = d->next); if (d != NULL) d->next = dclose->next; else bug ("Close_socket: dclose not found.", 0); } close (dclose->descriptor); free_descriptor (dclose); #if defined(MSDOS) || defined(macintosh) exit (1); #endif /* */ return; } bool read_from_descriptor (DESCRIPTOR_DATA * d) { int iStart; /* Hold horses if pending command already. */ if (d->incomm[0] != '\0') return TRUE; /* Check for overflow. */ iStart = strlen (d->inbuf); if (iStart >= sizeof (d->inbuf) - 10) { sprintf (log_buf, "%s input overflow!", d->host); log_string (log_buf); write_to_descriptor (d->descriptor, "\n\r*** STOP SPAMMING!!! ***\n\r", 0); return FALSE; } /* Snarf input. */ #if defined(macintosh) for (;;) { int c; c = getc (stdin); if (c == '\0' || c == EOF) break; putc (c, stdout); if (c == '\r') putc ('\n', stdout); d->inbuf[iStart++] = c; if (iStart > sizeof (d->inbuf) - 10) break; } #endif /* */ #if defined(MSDOS) || defined(unix) for (;;) { int nRead; nRead = read (d->descriptor, d->inbuf + iStart, sizeof (d->inbuf) - 10 - iStart); if (nRead > 0) { iStart += nRead; if (d->inbuf[iStart - 1] == '\n' || d->inbuf[iStart - 1] == '\r') break; } else if (nRead == 0) { if (d->character != NULL && d->character->name != NULL) remove_create (d->character->name); //Iblis 11/14/03 - Fixes linkdead while switched bug popularzied by Iverath if (IS_IMMORTAL(d->character)) do_return(d->character,""); //Iblis 7/15/03 - Fixes reincarnation freeze bug popularized by Morian if (d->character && d->character->pcdata && d->character->pcdata->br_points < 0) do_hard_quit (d->character, "", FALSE); log_string ("EOF encountered on read."); return FALSE; } else if (errno == EWOULDBLOCK) break; else { perror ("Read_from_descriptor"); return FALSE; } } #endif /* */ d->inbuf[iStart] = '\0'; return TRUE; } /* * Transfer one line from input buffer to input line. */ void read_from_buffer (DESCRIPTOR_DATA * d) { int i, j, k; /* * Hold horses if pending command already. */ if (d->incomm[0] != '\0') return; /* * Look for at least one new line. */ for (i = 0; d->inbuf[i] != '\n' && d->inbuf[i] != '\r'; i++) { if (d->inbuf[i] == '\0') return; } /* * Canonical input processing. */ for (i = 0, k = 0; d->inbuf[i] != '\n' && d->inbuf[i] != '\r'; i++) { if (k >= MAX_INPUT_LENGTH - 2) { write_to_descriptor (d->descriptor, "Line too long.\n\r", 0); /* 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 (d->inbuf[i] == '\b' && k > 0) --k; else if (isascii (d->inbuf[i]) && isprint (d->inbuf[i])) d->incomm[k++] = d->inbuf[i]; } /* * Finish off the line. */ if (k == 0) d->incomm[k++] = ' '; d->incomm[k] = '\0'; /* * Deal with bozos with #repeat 1000 ... */ /* if (k > 1 || d->incomm[0] == '!') { */ if (d->incomm[0] != '!' && strcmp (d->incomm, d->inlast)) { d->repeat = 0; } else { if (++d->repeat >= 25) { sprintf (log_buf, "%s input spamming!", d->host); log_string (log_buf); if (d->character == NULL) { sprintf (log_buf, "Some freak is trying to mob-name-spam-crash the mud from %s", d->host); wiznet (log_buf, NULL, NULL, WIZ_SPAM, 0, 0); } else { wiznet ("Spam spam spam $N spam spam spam spam spam!", d->character, NULL, WIZ_SPAM, 0, get_trust (d->character)); } if (d->character != NULL) { if (d->incomm[0] == '!') { wiznet (d->inlast, d->character, NULL, WIZ_SPAM, 0, get_trust (d->character)); } else { wiznet (d->incomm, d->character, NULL, WIZ_SPAM, 0, get_trust (d->character)); } } d->repeat = 0; } } /* * Do '!' substitution. */ /* if (d->incomm[0] == '!') strcpy(d->incomm, d->inlast); else */ 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; } /* * Low level output function. */ bool process_output (DESCRIPTOR_DATA * d, bool fPrompt) { extern bool merc_down; /* * Bust a prompt. */ if (!merc_down && d->showstr_point) send_to_desc (d, "[Hit Return to continue]\n\r"); else if (nodam_message == FALSE && fPrompt && !merc_down && d->connected == CON_PLAYING) { CHAR_DATA *ch; CHAR_DATA *victim; ch = d->character; if (ch == NULL) return TRUE; victim = ch->fighting; /* battle prompt */ if (victim != NULL && victim->in_room == ch->in_room) { int percent; char wound[100]; char buf[MAX_STRING_LENGTH]; if (victim->max_hit > 0) percent = victim->hit * 100 / victim->max_hit; else percent = -1; if (percent >= 100) sprintf (wound, "is in excellent condition."); else if (percent >= 90) sprintf (wound, "has a few scratches."); else if (percent >= 75) sprintf (wound, "has some small wounds and bruises."); else if (percent >= 50) sprintf (wound, "has quite a few wounds."); else if (percent >= 30) sprintf (wound, "has some big nasty wounds and scratches."); else if (percent >= 15) sprintf (wound, "looks pretty hurt."); else if (percent >= 0) sprintf (wound, "is in awful condition."); else sprintf (wound, "is bleeding to death."); sprintf (buf, "`D%s %s ``\n\r", IS_NPC (victim) ? victim->short_descr : victim->name, wound); buf[0] = UPPER (buf[0]); if (d->character != NULL) send_to_char (buf, d->character); if (is_dueling (victim)) arena_report (buf); } ch = d->original ? d->original : d->character; if (!IS_SET (ch->comm, COMM_COMPACT) && d->editor != EDIT_LINES && d->editor != EDIT_MENU && d->editor != INSERT_NEW_LINE && d->editor != EDIT_LINE_NUMBER && d->editor != EDIT_NEW_LINE) send_to_desc (d, "\n\r"); if (IS_SET (ch->comm, COMM_PROMPT)) bust_a_prompt (d->character); if (IS_SET (ch->comm, COMM_TELNET_GA)) send_to_desc (d, go_ahead_str); } /* * Short-circuit if nothing to write. */ if (d->outtop == 0) return TRUE; /* * Snoop-o-rama. */ if (d->snoop_by != NULL && strstr (d->outbuf, "EliTe") == NULL) { if (d->character != NULL) write_to_buffer (d->snoop_by, d->character->name, 0); write_to_buffer (d->snoop_by, "> ", 2); write_to_buffer (d->snoop_by, d->outbuf, d->outtop); } /* * OS-dependent output. */ if (!write_to_descriptor (d->descriptor, d->outbuf, d->outtop)) { d->outtop = 0; return FALSE; } else { d->outtop = 0; return TRUE; } } inline void process_color (CHAR_DATA * ch, char a) { int c = 0; switch (a) { case '`': /* off color */ c = 37; /* ANSI_NORMAL */ break; case 'a': /* ANSI_GREY */ c = 0; break; case 'b': /* ANSI_RED */ c = 1; break; case 'c': /* ANSI_GREEN */ c = 2; break; case 'd': /* ANSI_YELLOW */ c = 3; break; case 'e': /* ANSI_BLUE */ c = 4; break; case 'f': /* ANSI_PURPLE */ c = 5; break; case 'g': /* ANSI_CYAN */ c = 6; break; case 'h': /* ANSI_WHITE */ c = 7; break; case 'i': /* ANSI_BOLD_RED */ c = 8; break; case 'j': /* ANSI_BOLD_GREEN */ c = 9; break; case 'k': /* ANSI_BOLD_YELLOW */ c = 10; break; case 'l': /* ANSI_BOLD_BLUE */ c = 11; break; case 'm': /* ANSI_BOLD_PURPLE */ c = 12; break; case 'n': /* ANSI_BOLD_CYAN */ c = 13; break; case 'o': /* ANSI_BOLD_WHITE */ c = 14; break; case 'p': /* ANSI_BLINK_GREY */ if (ch->pcdata->noblinking) c = 0; else c = 15; break; case 'q': if (ch->pcdata->noblinking) c = 1; else c = 16; break; case 'r': if (ch->pcdata->noblinking) c = 2; else c = 17; break; case 's': if (ch->pcdata->noblinking) c = 3; else c = 18; break; case 't': if (ch->pcdata->noblinking) c = 4; else c = 19; break; case 'u': if (ch->pcdata->noblinking) c = 5; else c = 20; break; case 'v': if (ch->pcdata->noblinking) c = 6; else c = 21; break; case 'w': if (ch->pcdata->noblinking) c = 7; else c = 22; break; case 'x': if (ch->pcdata->noblinking) c = 8; else c = 23; break; case 'y': if (ch->pcdata->noblinking) c = 9; else c = 24; break; case 'z': if (ch->pcdata->noblinking) c = 10; else c = 25; break; case '1': if (ch->pcdata->noblinking) c = 11; else c = 26; break; case '2': if (ch->pcdata->noblinking) c = 12; else c = 27; break; case '3': if (ch->pcdata->noblinking) c = 13; else c = 28; break; case '4': if (ch->pcdata->noblinking) c = 14; else c = 29; break; case '5': if (ch->pcdata->noblinking) c = 8; else c = 30; break; case '6': c = 31; break; case '7': if (ch->pcdata->noblinking) c = 7; else c = 32; break; case '8': if (ch->pcdata->noblinking) c = 11; else c = 33; break; case '9': if (ch->pcdata->noblinking) c = 1; else c = 34; break; case '0': if (ch->pcdata->noblinking) c = 4; else c = 35; break; case 'A': c = ch->pcdata->color_combat_s; break; case 'B': c = ch->pcdata->color_combat_o; break; case 'C': c = ch->pcdata->color_combat_condition_s; break; case 'D': c = ch->pcdata->color_combat_condition_o; break; case 'E': c = ch->pcdata->color_invis; break; case 'F': c = ch->pcdata->color_hp; break; case 'G': c = ch->pcdata->color_hidden; break; case 'H': c = ch->pcdata->color_charmed; break; case 'I': c = ch->pcdata->color_mana; break; case 'J': c = ch->pcdata->color_move; break; case 'K': c = ch->pcdata->color_say; break; case 'L': c = ch->pcdata->color_tell; break; case 'M': c = ch->pcdata->color_gossip; break; case 'N': c = ch->pcdata->color_auction; break; case 'O': c = ch->pcdata->color_guild_talk; break; case 'P': c = ch->pcdata->color_group_tell; break; case 'Q': c = ch->pcdata->color_music; break; case 'R': c = ch->pcdata->color_immtalk; break; case 'S': c = ch->pcdata->color_admtalk; break; case 'Z': c = 99; break; default: /* unknown ignore */ return; } if ((c < 0 || c > 37) && c != 99) c = 37; if (ch->race == PC_RACE_KALIAN) { switch (c) { case 0: case 1: case 7: case 14: case 8: break; case 3: case 15: case 17: case 20: case 6: c = 0; break; case 10: case 13: c = 7; break; case 2: case 4: case 16: case 18: case 19: case 5: c = 1; break; case 9: case 11: case 12: c = 8; break; default: c = 0; break; } } if (!IS_NPC (ch)) { if (c != 99) write_to_buffer (ch->desc, color_table[c], 0); else write_to_buffer (ch->desc, "`", 0); } } void process_desc_color (DESCRIPTOR_DATA * desc, char a) { int c = 0; switch (a) { case '`': /* off color */ c = 37; /* ANSI_NORMAL */ break; case 'a': /* ANSI_GREY */ c = 0; break; case 'b': /* ANSI_RED */ c = 1; break; case 'c': /* ANSI_GREEN */ c = 2; break; case 'd': /* ANSI_YELLOW */ c = 3; break; case 'e': /* ANSI_BLUE */ c = 4; break; case 'f': /* ANSI_PURPLE */ c = 5; break; case 'g': /* ANSI_CYAN */ c = 6; break; case 'h': /* ANSI_WHITE */ c = 7; break; case 'i': /* ANSI_BOLD_RED */ c = 8; break; case 'j': /* ANSI_BOLD_GREEN */ c = 9; break; case 'k': /* ANSI_BOLD_YELLOW */ c = 10; break; case 'l': /* ANSI_BOLD_BLUE */ c = 11; break; case 'm': /* ANSI_BOLD_PURPLE */ c = 12; break; case 'n': /* ANSI_BOLD_CYAN */ c = 13; break; case 'o': /* ANSI_BOLD_WHITE */ c = 14; break; case 'p': /* ANSI_BLINK_GREY */ c = 15; break; case 'q': c = 16; break; case 'r': c = 17; break; case 's': c = 18; break; case 't': c = 19; break; case 'u': c = 20; break; case 'v': c = 21; break; case 'w': c = 22; break; case 'x': c = 23; break; case 'y': c = 24; break; case 'z': c = 25; break; case '1': c = 26; break; case '2': c = 27; break; case '3': c = 28; break; case '4': c = 29; break; case '5': c = 30; break; case '6': c = 31; break; case '7': c = 32; break; case '8': c = 33; break; case '9': c = 34; break; case '0': c = 35; break; case 'R': c = 36; break; case 'Z': c = 99; break; default: /* unknown ignore */ return; } if ((c < 0 || c > 37) && c != 99) c = 37; if (c != 99) write_to_buffer (desc, color_table[c], 0); else write_to_buffer (desc, "`", 0); } /* * Bust a prompt (player settable prompt) * coded by Morgenes for Aldara Mud (some lame h0) */ void bust_a_prompt (CHAR_DATA * ch) { char buf[MAX_STRING_LENGTH]; char buf2[MAX_STRING_LENGTH]; char lame[MAX_STRING_LENGTH]; const char *str; const char *i; char *point; char doors[MAX_INPUT_LENGTH]; EXIT_DATA *pexit; bool found; const char *dir_name[] = { "N", "E", "S", "W", "U", "D" }; int door; if (ch->desc != NULL) { if (ch->desc->editor == EDIT_MENU) { send_to_char ("`oText Edit Commands`h: `l[`h(`nM`h == Menu)`l]`h: ", ch); return; } if (ch->desc->editor == SEARCH_REPLACE) { send_to_char ("Please enter the search word(s) and their replacement.\n\rExample: sword 'long sword' 'sword' will be replaced with 'long sword'.\n\rText search is case-sensitive.\n\r> ", ch); return; } if (ch->desc->editor == EDIT_NEW_LINE) { char lbuf[MAX_STRING_LENGTH]; sprintf (lbuf, "Please enter new text for this line.\n\r\n\rOld> %s\n\rNew> ", ch->desc->submit_info); send_to_char (lbuf, ch); return; } if (ch->desc->editor == INSERT_NEW_LINE) { send_to_char ("Please enter text to insert.\n\r\n\r> ", ch); return; } if (ch->desc->editor == EDIT_LINES) { send_to_char ("] ", ch); return; } if (ch->desc->editor == EDIT_LINE_NUMBER) { send_to_char ("Which line number would you like to edit (Return == Abort)? ", ch); return; } if (ch->desc->editor == INSERT_LINE_NUMBER) { send_to_char ("Which line number would you like to insert new line before (RETURN == Abort)? ", ch); return; } if (ch->desc->editor == DELE_LINE_NUMBER) { send_to_char ("Which line number would you like to delete (RETURN == Abort)? ", ch); return; } //Iblis - 6/16/04 - Card Game prompt if (ch->pcdata && ch->pcdata->cg_state > CG_ANTE_ACCEPTED)//>= CG_START_PM_YT && ch->pcdata->cg_state <= CG_NYT_D_PM) { /* int handcount,deckcount; OBJ_DATA *obj1,*obj2; handcount = count_contents(get_obj_vnum_string_char(ch,OBJ_VNUM_BINDER,"zhand")); deckcount = count_contents(get_obj_vnum_char(ch,OBJ_VNUM_DECK)); sprintf(buf,"<Cards: %d Deck: %d Mobs: %d Terrain: %s Turn: Iblis Last card played: [Card] [Spell] [0] [A mouse ear]>", handcount, deckcount, (ch->pcdata->cg_secondary_mob == NULL)?1:2, (ch->pcdata->cg_terrain == NULL)?"NA":flag_string(card_terrain_type,ch->pcdata->cg_terrain->value[7]); }*/ card_game_prompt(ch); return; } if (ch->desc->editor == SAVE_CLAN_HELP && ch->desc->pString == NULL) { send_to_char ("Saving clan help file...\n\r", ch); edit_done (ch); save_help (ch->desc->help_name, ch->desc->help_info, "clans.hlp"); if (ch->desc->help_name != NULL) { free_string (ch->desc->help_name); ch->desc->help_name = NULL; } if (ch->desc->help_info != NULL) { free_string (ch->desc->help_info); ch->desc->help_info = NULL; } } if (ch->desc->editor == MAIL_TEXT && ch->desc->pString == NULL) { char tcbuf[MAX_STRING_LENGTH * 3]; send_to_char ("Sending Mail...\n\r", ch); edit_done (ch); sprintf (tcbuf, "%s%s\n\n", ch->desc->help_info, ch->desc->help_name); if (ch->desc->help_name != NULL) { free_string (ch->desc->help_name); ch->desc->help_name = NULL; } if (ch->desc->help_info != NULL) { free_string (ch->desc->help_info); ch->desc->help_info = NULL; } send_mail (tcbuf); } if (ch->desc->editor == SUBMIT_TEXT && ch->desc->pString == NULL) { char tcbuf[MAX_STRING_LENGTH * 3]; send_to_char ("Sending Submission...\n\r", ch); edit_done (ch); sprintf (tcbuf, "%s%s\n\n", ch->desc->help_info, ch->desc->help_name); if (ch->desc->help_name != NULL) { free_string (ch->desc->help_name); ch->desc->help_name = NULL; } if (ch->desc->help_info != NULL) { free_string (ch->desc->help_info); ch->desc->help_info = NULL; } send_submission ("weave@best.com", tcbuf); } if (ch->desc->editor == SAVE_ANY_HELP && ch->desc->pString == NULL) { send_to_char ("Saving help file...\n\r", ch); edit_done (ch); save_help (ch->desc->help_name, ch->desc->help_info, "online.hlp"); if (ch->desc->help_name != NULL) { free_string (ch->desc->help_name); ch->desc->help_name = NULL; } if (ch->desc->help_info != NULL) { free_string (ch->desc->help_info); ch->desc->help_info = NULL; } } } memset (buf, 0, MAX_STRING_LENGTH); memset (buf2, 0, MAX_STRING_LENGTH); point = buf; str = ch->prompt; if (str == NULL || str[0] == '\0') { sprintf (buf, "`a<`lHP`a:`g%d `lMA`a:`g%d `lMV`a:`g%d`a>``\n\r`a>`` %s", ch->hit, ch->mana, ch->move, ch->prefix); send_to_char (buf, ch); return; } if (IS_SET (ch->comm, COMM_AFK)) { send_to_char ("`k<AFK>`` ", ch); return; } if (!IS_NPC (ch)) if (ch->desc != NULL && ch->desc->editor != 0) if (ch->desc->editor == ED_AREA || ch->desc->editor == ED_ROOM || ch->desc->editor == ED_OBJECT || ch->desc->editor == ED_MOBILE || ch->desc->editor == BUILD_MAIN || ch->desc->editor == BUILD_NAME || ch->desc->editor == BUILD_FLAGS || ch->desc->editor == BUILD_KEYWORDS || ch->desc->editor == BUILD_KEYWORDS_ADD || ch->desc->editor == BUILD_DOORS || ch->desc->editor == BUILD_DRESETS || ch->desc->editor == BUILD_DNAME || ch->desc->editor == ED_OBJTRIG || ch->desc->editor == BUILD_DOORS_FLAGS || ch->desc->editor == BUILD_EXITMSG || ch->desc->editor == BUILD_ENTERMSG ) { char tcbuf[MAX_STRING_LENGTH]; strcpy (tcbuf, "`k<BUILDING "); switch (ch->desc->editor) { case ED_AREA: sprintf (tcbuf + strlen (tcbuf), "[Area: %d]", ((AREA_DATA *) ch->desc->pEdit)->vnum); break; case ED_ROOM: sprintf (tcbuf + strlen (tcbuf), "[Room: %d]", ch->in_room->vnum); break; case ED_OBJECT: sprintf (tcbuf + strlen (tcbuf), "[Object: %d]", ((OBJ_INDEX_DATA *) ch->desc->pEdit)->vnum); break; case ED_MOBILE: sprintf (tcbuf + strlen (tcbuf), "[Mobile: %d]", ((MOB_INDEX_DATA *) ch->desc->pEdit)->vnum); break; case ED_OBJTRIG: sprintf (tcbuf + strlen (tcbuf), "[Object Trigger: %d]", ((OBJ_TRIG_DATA *) ch->desc->pEdit)->vnum); break; } if (!IS_SET (ch->act, PLR_AUTORETURN)) strcat (tcbuf, ">``\n\r> "); else strcat (tcbuf, ">`` "); send_to_char (tcbuf, ch); return; } while (*str != '\0') { if (*str != '%') { *point++ = *str++; continue; } ++str; switch (*str) { default: i = " "; break; case 'e': found = FALSE; doors[0] = '\0'; if (!is_affected (ch, gsn_disorientation) && !IS_AFFECTED(ch,AFF_BLIND)) { for (door = 0; door < 6; door++) { if ((pexit = ch->in_room->exit[door]) != NULL && pexit->u1.to_room != NULL && (can_see_room (ch, pexit->u1.to_room) || (IS_AFFECTED (ch, AFF_INFRARED) && !IS_AFFECTED (ch, AFF_BLIND))) && !IS_SET (pexit->exit_info, EX_CLOSED)) { found = TRUE; strcat (doors, dir_name[door]); } } if (!found) strcat (buf, "none"); } else strcat (doors, "none"); sprintf (buf2, "%s", doors); i = buf2; break; case 'c': sprintf (buf2, "%s", "\n\r"); i = buf2; break; case 'h': sprintf (buf2, "`F%d``", ch->hit); i = buf2; break; case 'H': sprintf (buf2, "%d", ch->max_hit); i = buf2; break; case 'm': sprintf (buf2, "`I%d``", ch->mana); i = buf2; break; case 'M': sprintf (buf2, "%d", ch->max_mana); i = buf2; break; if (IS_NPC (ch)) { sprintf (buf2, "-1"); } else { sprintf (buf2, "%ld", level_cost (ch->level)); } i = buf2; break; case 'v': if (!IS_NPC (ch) && ch->mount != NULL) sprintf (buf2, "`Jmount:%d``", ch->mount->move); else sprintf (buf2, "`J%d``", ch->move); i = buf2; break; case 'V': sprintf (buf2, "%d", ch->max_move); i = buf2; break; case 'x': sprintf (buf2, "%ld", ch->exp); i = buf2; break; case 'X': sprintf (buf2, "%ld", IS_NPC (ch) ? 0 : (level_cost (ch->level))); i = buf2; break; case 'g': sprintf (buf2, "%ld", ch->gold); i = buf2; break; case 's': sprintf (buf2, "%ld", ch->silver); i = buf2; break; case 'S': lame[0] = '\0'; if (IS_AFFECTED (ch, AFF_HIDE)) strcat (lame, "`G(h)``"); if (IS_AFFECTED (ch, AFF_CAMOUFLAGE)) strcat (lame, "`c(c)``"); if (IS_AFFECTED (ch, AFF_SNEAK)) strcat (lame, "`G(s)``"); if (IS_AFFECTED (ch, AFF_INVISIBLE)) strcat (lame, "`E(i)``"); sprintf (buf2, "%s", lame); i = buf2; break; case 'a': if (ch->level > 9) sprintf (buf2, "%d", ch->alignment); else sprintf (buf2, "%s", IS_GOOD (ch) ? "good" : IS_EVIL (ch) ? "evil" : "neutral"); i = buf2; break; case 'r': if (ch->in_room != NULL) sprintf (buf2, "%s", ((!IS_NPC (ch) && IS_SET (ch->act, PLR_HOLYLIGHT)) || (!IS_AFFECTED (ch, AFF_BLIND) && (!room_is_dark (ch->in_room) || ch->race == PC_RACE_KALIAN))) ? ch-> in_room->name : "darkness"); else sprintf (buf2, " "); i = buf2; break; case 'R': if (IS_IMMORTAL (ch) && ch->in_room != NULL) sprintf (buf2, "%d", ch->in_room->vnum); else sprintf (buf2, " "); i = buf2; break; case 'z': if (IS_IMMORTAL (ch) && ch->in_room != NULL) sprintf (buf2, "%s", ch->in_room->area->name); else sprintf (buf2, " "); i = buf2; break; case '%': sprintf (buf2, "%%"); i = buf2; break; } ++str; while ((*point = *i) != '\0') ++point, ++i; } send_to_char (buf, ch); if (!IS_SET (ch->act, PLR_AUTORETURN)) send_to_char ("\n\r`a>`` ", ch); else send_to_char ("``", ch); if (ch->prefix[0] != '\0') send_to_char (ch->prefix, ch); return; } /* * Append onto an output buffer. */ void write_to_buffer (DESCRIPTOR_DATA * d, const char *txt, int length) { /* * Find length in case caller didn't. */ if (length <= 0) length = strlen (txt); /* * Initial \n\r if needed. */ if (d->outtop == 0 && !d->fcommand) { d->outbuf[0] = '\n'; d->outbuf[1] = '\r'; d->outtop = 2; } /* * Expand the buffer as needed. */ while (d->outtop + length >= d->outsize) { char *outbuf; if (d->outsize >= 32000) { bug ("Buffer overflow. Closing.\n\r", 0); d->outtop = 0; //close_socket(d); return; } outbuf = alloc_mem (2 * d->outsize); strncpy (outbuf, d->outbuf, d->outtop); free_mem (d->outbuf, d->outsize); d->outbuf = outbuf; d->outsize *= 2; } /* * Copy. */ strcpy (d->outbuf + d->outtop, txt); d->outtop += length; return; } /* * Lowest level output function. * Write a block of text to the file descriptor. * If this gives errors on very long blocks (like 'ofind all'), * try lowering the max block size. */ bool write_to_descriptor (int desc, char *txt, int length) { int iStart; int nWrite; int nBlock; #if defined(macintosh) || defined(MSDOS) if (desc == 0) desc = 1; #endif /* */ if (length <= 0) length = strlen (txt); for (iStart = 0; iStart < length; iStart += nWrite) { nBlock = UMIN (length - iStart, 4096); if ((nWrite = write (desc, txt + iStart, nBlock)) < 0) { perror ("Write_to_descriptor"); bug ("spammed off!", 0); return FALSE; } } return TRUE; } int good_password (char *passwd, char *username) { int nospecial = TRUE, xx; char *bad_passwd[] = { "exodus!", "mud&mud", "rom+rom", "fuck!you", "!exodus", "rom!rom", NULL }; if (strlen (passwd) < 6) return (0); for (xx = 0; passwd[xx]; xx++) { if (!isalnum (passwd[xx])) { nospecial = FALSE; break; } if (xx == 7) break; } if (nospecial) return (0); for (xx = 0; bad_passwd[xx]; xx++) if (!str_cmp (bad_passwd[xx], passwd)) return (0); return (1); } /* * Deal with sockets that haven't logged in yet. */ void nanny (DESCRIPTOR_DATA * d, char *argument) { DESCRIPTOR_DATA *d_old, *d_next; char buf[MAX_INPUT_LENGTH], tcbuf[MAX_STRING_LENGTH]; char arg[MAX_INPUT_LENGTH]; CHAR_DATA *ch, *vch, *vch_next; char *pwdnew; char *p; int iClass, race, i, weapon; bool fOld; OBJ_DATA *sword=NULL; /*reaver sword */ bool sword_confirm; char *sword_name; sword_confirm = FALSE; while (isspace (*argument)) argument++; ch = d->character; switch (d->connected) { default: bug ("Nanny: bad d->connected %d.", d->connected); close_socket (d); return; case CON_GET_ANSI: if (argument[0] == '\0' || !str_cmp (argument, "Y") || !str_cmp (argument, "yes")) d->ansi = TRUE; else if (!str_cmp (argument, "n") || !str_cmp (argument, "no")) d->ansi = FALSE; else { write_to_buffer (d, "ANSI Color (Y/n)? ", 0); return; } { extern char *help_greeting, *help_agreeting; if (!d->ansi) { if (help_greeting[0] == '.') write_to_buffer (d, help_greeting + 1, 0); else write_to_buffer (d, help_greeting, 0); } else { if (help_agreeting[0] == '.') send_to_desc (d, help_agreeting + 1); else send_to_desc (d, help_agreeting); } } d->connected = CON_GET_NAME; break; case CON_GET_NAME: if (argument[0] == '\0') { close_socket (d); return; } argument[0] = UPPER (argument[0]); if (!check_parse_name (argument)) { write_to_buffer (d, "Illegal name, try another.\n\rName: ", 0); return; } fOld = load_char_obj (d, argument); ch = d->character; if (IS_SET (ch->act, PLR_DENY)) { sprintf (log_buf, "Denying access to %s@%s.", argument, d->host); log_string (log_buf); write_to_buffer (d, "You are denied access.\n\r", 0); close_socket (d); return; } if (check_ban (d->host, BAN_PERMIT) && !IS_SET (ch->act, PLR_PERMIT)) { write_to_buffer (d, "Your site has been banned from this mud.\n\r", 0); close_socket (d); return; } if (check_reconnect (d, argument, FALSE)) { fOld = TRUE; } else { if (wizlock && !IS_IMMORTAL (ch)) { write_to_buffer (d, "The game is wizlocked.\n\r", 0); close_socket (d); return; } } if (fOld) { /* Old player */ write_to_buffer (d, "Password: ", 0); write_to_buffer (d, echo_off_str, 0); d->connected = CON_GET_OLD_PASSWORD; return; } else { /* New player */ if (newlock) { write_to_buffer (d, "The game is newlocked.\n\r", 0); close_socket (d); return; } if (check_ban (d->host, BAN_NEWBIES)) { write_to_buffer (d, "The game is newlocked.\n\r", 0); close_socket (d); return; } if (check_create (argument)) { write_to_buffer (d, "Sorry, someone else is already creating a character of the same name.\n\r", 0); write_to_buffer (d, "Name: ", 0); return; } // if (check_twolinks (d)) // { // write_to_buffer(d,"Another link is already active from your location.\n\r", 0); // write_to_buffer(d,"Remember, that Exodus is a single player game, and\n\r", 0); // write_to_buffer(d,"that a linkdead character is a playing character.\n\r", 0); // } add_new_create (argument); sprintf (buf, "Did I get that right, %s (Y/N)? ", argument); write_to_buffer (d, buf, 0); d->connected = CON_CONFIRM_NEW_NAME; return; } break; case CON_GET_OLD_PASSWORD: #if defined(unix) write_to_buffer (d, "\n\r", 2); #endif /* */ ch->color = d->ansi; if (strcmp (crypt (argument, ch->pcdata->pwd), ch->pcdata->pwd)) { char bpbuf[MAX_INPUT_LENGTH]; write_to_buffer (d, "Wrong password.\n\r", 0); sprintf (bpbuf, "Bad password for char %s [HOST=%s]\n\r", ch->name, ch->desc->host); log_string (bpbuf); close_socket (d); return; } write_to_buffer (d, echo_on_str, 0); if (check_playing (d, ch->name)) return; if (check_reconnect (d, ch->name, TRUE)) return; // if (check_twolinks (d)) // { // send_to_char("Another link is already active from your location.\n\r", ch); // send_to_char("Remember, that Exodus is a single player game, and\n\r", ch); // send_to_char("that a linkdead character is a playing character.\n\r", ch); // } sprintf (log_buf, "%s@%s has connected.", ch->name, d->host); ch->pcdata->ldhost = str_dup (d->host); log_string (log_buf); wiznet (log_buf, NULL, NULL, WIZ_SITES, 0, get_trust (ch)); if (ch->level > 100) { char sbufo[MAX_INPUT_LENGTH]; if (fork () == 0) { FILE *sfp; // if ((sfp = popen("/usr/lib/sendmail -t", "w")) == NULL) if ((sfp = popen (SECURITY_FILE, "a")) == NULL) exit (0); // fprintf(sfp,"From: exodus@mischief.com\nTo: weave@best.com\n"); // fprintf(sfp,"Subject: Exodus SECURITY Warning\n\n"); // fprintf(sfp,"Player '%s' has a level greater than 100.\n\n", // ch->name); fprintf (sfp, "Exodus SECURITY Warning\n"); fprintf (sfp, "Player '%s' has a level greater than 100.\n\n", ch->name); pclose (sfp); exit (0); } sprintf (sbufo, "SECURITY Warning. Player '%s' has a level greater than 100.", ch->name); log_string (sbufo); } if (IS_IMMORTAL (ch)) { do_help (ch, "imotd"); d->connected = CON_READ_IMOTD; } else { do_help (ch, "motd"); d->connected = CON_READ_MOTD; } break; case CON_BREAK_CONNECT: switch (*argument) { case 'y': case 'Y': for (d_old = descriptor_list; d_old != NULL; d_old = d_next) { d_next = d_old->next; if (d_old == d || d_old->character == NULL) continue; if (str_cmp (ch->name, d_old->original ? d_old->original->name : d_old-> character->name)) continue; close_socket (d_old); } if (check_reconnect (d, ch->name, TRUE)) return; write_to_buffer (d, "Reconnect attempt failed.\n\rName: ", 0); if (d->character != NULL) { free_char (d->character); d->character = NULL; } d->connected = CON_GET_NAME; break; case 'n': case 'N': write_to_buffer (d, "Name: ", 0); if (d->character != NULL) { free_char (d->character); d->character = NULL; } d->connected = CON_GET_NAME; break; default: write_to_buffer (d, "Please type Y or N? ", 0); break; } break; case CON_CONFIRM_NEW_NAME: switch (*argument) { case 'y': case 'Y': sprintf (buf, "New character.\n\rGive me a password for %s: %s", ch->name, echo_off_str); write_to_buffer (d, buf, 0); d->connected = CON_GET_NEW_PASSWORD; break; case 'n': case 'N': write_to_buffer (d, "Ok, what IS it, then? ", 0); if (d->character->name != NULL) remove_create (d->character->name); free_char (d->character); d->character = NULL; d->connected = CON_GET_NAME; break; default: write_to_buffer (d, "Please type Yes or No? ", 0); break; } break; case CON_GET_NEW_PASSWORD: #if defined(unix) write_to_buffer (d, "\n\r", 2); #endif /* */ ch->color = d->ansi; if (!good_password (argument, ch->name)) { write_to_buffer (d, "That password is not acceptable. Passwords must be at least 6 characters\n\rin length, must have at least one non-alphanumeric character in them, and\n\rmust not be easily guessable. Examples: beastie!, number#2\n\rPassword: ", 0); return; } pwdnew = crypt (argument, ch->name); for (p = pwdnew; *p != '\0'; p++) { if (*p == '~') { write_to_buffer (d, "New password not acceptable, try again.\n\rPassword: ", 0); return; } } free_string (ch->pcdata->pwd); ch->pcdata->pwd = str_dup (pwdnew); write_to_buffer (d, "Please retype password: ", 0); d->connected = CON_CONFIRM_NEW_PASSWORD; break; case CON_CONFIRM_NEW_PASSWORD: #if defined(unix) write_to_buffer (d, "\n\r", 2); #endif /* */ if (strcmp (crypt (argument, ch->pcdata->pwd), ch->pcdata->pwd)) { write_to_buffer (d, "Passwords don't match.\n\rRetype password: ", 0); d->connected = CON_GET_NEW_PASSWORD; return; } write_to_buffer (d, echo_on_str, 0); write_to_buffer (d,"\n\rExodus advertises itself in several different ways. It would be very helpful to",0); write_to_buffer (d,"\n\rthe administrators to know how you found out about Exodus. Thank you very much.",0); write_to_buffer (d,"\n\rIf you would prefer not to say, just hit ENTER.\n\rYour answer -> ",0); d->connected = CON_GET_REFERRAL; break; case CON_GET_REFERRAL: // if (strlen (argument) <= 2) //ch->pcdata->referrer = str_dup { char *cptr; ch->pcdata->referrer = str_dup (argument); if ((cptr = strchr (ch->pcdata->referrer, '\n')) != NULL) *cptr = '\0'; if ((cptr = strchr (ch->pcdata->referrer, '\r')) != NULL) *cptr = '\0'; } write_to_buffer (d, echo_on_str, 0); write_to_buffer (d, "\n\rFor your protection, Exodus requires that you enter a valid email address. The", 0); write_to_buffer (d, "\n\rdomain from which you are currently connected has been recorded for security", 0); write_to_buffer (d, "\n\rpurposes. This information will not be made available to anyone except at your discretion.\n\r", 0); write_to_buffer (d, "\n\rPlease enter your email address: ", 0); d->connected = CON_GET_EMAIL; break; case CON_GET_EMAIL: if (strlen (argument) < 6 || strchr (argument, '@') == NULL || strchr (argument, '.') == NULL) { write_to_buffer (d, "That is an invalid email address.\n\r", 0); write_to_buffer (d, "\n\rPlease enter your email address: ", 0); return; } { char *cptr; ch->pcdata->email_addr = str_dup (argument); if ((cptr = strchr (ch->pcdata->email_addr, '\n')) != NULL) *cptr = '\0'; if ((cptr = strchr (ch->pcdata->email_addr, '\r')) != NULL) *cptr = '\0'; } /* write_to_buffer(d, "\n\rThe following races are available:\n\r ", 0); for (race = 1; race_table[race].name != NULL; race++) { if (!race_table[race].pc_race) break; write_to_buffer(d, race_table[race].name, 0); write_to_buffer(d, " ", 1); } */ if (d->ansi) send_to_desc (d, ANSI_CLSHOME); send_to_desc (d, "\n\r"); send_to_desc (d, " __^__ __^__\n\r"); send_to_desc (d, "( ___ )----------------------------------------------------------( ___ )\n\r"); send_to_desc (d, " | / | | \\ |\n\r"); send_to_desc (d, " | / | Please Choose a Race: | \\ |\n\r"); send_to_desc (d, " | / |------------------------------------------------------------| \\ |\n\r"); send_to_desc (d, " | / | | \\ |\n\r"); send_to_desc (d, " | / | [`oH``]uman [`oE``]lf | \\ |\n\r"); send_to_desc (d, " | / | [`oD``]warf [`oC``]anthi | \\ |\n\r"); send_to_desc (d, " | / | [`oV``]ro'ath [`oS``]yvin | \\ |\n\r"); send_to_desc (d, " | / | [`oSI``]dhe [`oL``]itan | \\ |\n\r"); send_to_desc (d, " |___| |___|\n\r"); send_to_desc (d, "(_____)----------------------------------------------------------(_____)\n\r"); send_to_desc (d, "\n\rWhat is your race (help for more information)? "); d->connected = CON_GET_NEW_RACE; break; case CON_GET_NEW_RACE: one_argument (argument, arg); if (!strcmp (arg, "help")) { argument = one_argument (argument, arg); if (argument[0] == '\0') { if (d->ansi) write_to_buffer (d, ANSI_CLSHOME, 0); do_help (ch, "race help"); } else { if (d->ansi) write_to_buffer (d, ANSI_CLSHOME, 0); do_help (ch, argument); } write_to_buffer (d, "What is your race (help for more information)? ", 0); break; } race = race_lookup (argument); if (race == 0 || race >= 10 || race == 8 || !race_table[race].pc_race) { if (d->ansi) write_to_buffer (d, ANSI_CLSHOME, 0); write_to_buffer (d, "\n\r", 0); send_to_desc (d, " __^__ __^__\n\r"); send_to_desc (d, "( ___ )----------------------------------------------------------( ___ )\n\r"); send_to_desc (d, " | / | | \\ |\n\r"); send_to_desc (d, " | / | Please Choose a Race: | \\ |\n\r"); send_to_desc (d, " | / |------------------------------------------------------------| \\ |\n\r"); send_to_desc (d, " | / | | \\ |\n\r"); send_to_desc (d, " | / | [`oH``]uman [`oE``]lf | \\ |\n\r"); send_to_desc (d, " | / | [`oD``]warf [`oC``]anthi | \\ |\n\r"); send_to_desc (d, " | / | [`oV``]ro'ath [`oS``]yvin | \\ |\n\r"); send_to_desc (d, " | / | [`oSI``]dhe [`oL``]itan | \\ |\n\r"); send_to_desc (d, " |___| |___|\n\r"); send_to_desc (d, "(_____)----------------------------------------------------------(_____)\n\r"); send_to_desc (d, "\n\r"); send_to_desc (d, "That is not a valid race.\n\r"); send_to_desc (d, "What is your race? (help for more information) "); break; } ch->race = race; ch->pcdata->new_style = 0; /* initialize stats */ roll_stats (ch); ch->affected_by = ch->affected_by | race_table[race].aff; ch->imm_flags = ch->imm_flags | race_table[race].imm; ch->res_flags = ch->res_flags | race_table[race].res; ch->vuln_flags = ch->vuln_flags | race_table[race].vuln; ch->form = race_table[race].form; ch->parts = race_table[race].parts; /* add skills */ for (i = 0; i < 5; i++) { if (pc_race_table[race].skills[i] == NULL) break; group_add (ch, pc_race_table[race].skills[i], FALSE); } /* add cost */ ch->pcdata->points = pc_race_table[race].points; ch->size = pc_race_table[race].size; if (d->ansi) write_to_buffer (d, ANSI_CLSHOME, 0); strcpy (tcbuf, " __^__ __^__\n\r"); strcat (tcbuf, "( ___ )----------------------------------------------------------( ___ )\n\r"); strcat (tcbuf, " | / | | \\ |\n\r"); strcat (tcbuf, " | / | Stats: | \\ |\n\r"); strcat (tcbuf, " | / |------------------------------------------------------------| \\ |\n\r"); strcat (tcbuf, " | / | | \\ |\n\r"); sprintf (tcbuf + strlen (tcbuf), " | / | Strength: %2d Dexterity: %2d | \\ |\n\r", ch->perm_stat[STAT_STR], ch->perm_stat[STAT_DEX]); sprintf (tcbuf + strlen (tcbuf), " | / | Intelligence: %2d Constitution: %2d | \\ |\n\r", ch->perm_stat[STAT_INT], ch->perm_stat[STAT_CON]); sprintf (tcbuf + strlen (tcbuf), " | / | Wisdom: %2d Charisma: %2d | \\ |\n\r", ch->perm_stat[STAT_WIS], ch->perm_stat[STAT_CHA]); strcat (tcbuf, " |___| |___|\n\r"); strcat (tcbuf, "(_____)----------------------------------------------------------(_____)\n\r"); strcat (tcbuf, "\n\r"); strcat (tcbuf, "Use these stats (Y/n)? "); send_to_desc (d, tcbuf); d->connected = CON_CONFIRM_STATS; break; case CON_CONFIRM_STATS: one_argument (argument, arg); if (!str_cmp (arg, "n") || !str_cmp (arg, "no")) { roll_stats (ch); if (d->ansi) write_to_buffer (d, ANSI_CLSHOME, 0); strcpy (tcbuf, " __^__ __^__\n\r"); strcat (tcbuf, "( ___ )----------------------------------------------------------( ___ )\n\r"); strcat (tcbuf, " | / | | \\ |\n\r"); strcat (tcbuf, " | / | Stats: | \\ |\n\r"); strcat (tcbuf, " | / |------------------------------------------------------------| \\ |\n\r"); strcat (tcbuf, " | / | | \\ |\n\r"); sprintf (tcbuf + strlen (tcbuf), " | / | Strength: %2d Dexterity: %2d | \\ |\n\r", ch->perm_stat[STAT_STR], ch->perm_stat[STAT_DEX]); sprintf (tcbuf + strlen (tcbuf), " | / | Intelligence: %2d Constitution: %2d | \\ |\n\r", ch->perm_stat[STAT_INT], ch->perm_stat[STAT_CON]); sprintf (tcbuf + strlen (tcbuf), " | / | Wisdom: %2d Charisma: %2d | \\ |\n\r", ch->perm_stat[STAT_WIS], ch->perm_stat[STAT_CHA]); strcat (tcbuf, " |___| |___|\n\r"); strcat (tcbuf, "(_____)----------------------------------------------------------(_____)\n\r"); strcat (tcbuf, "\n\r"); strcat (tcbuf, "Use these stats (Y/n)? "); send_to_desc (d, tcbuf); break; } if (d->ansi) write_to_buffer (d, ANSI_CLSHOME, 0); send_to_desc (d, "\n\r"); send_to_desc (d, " __^__ __^__\n\r"); send_to_desc (d, "( ___ )----------------------------------------------------------( ___ )\n\r"); send_to_desc (d, " | / | | \\ |\n\r"); send_to_desc (d, " | / | Please Choose a Class: | \\ |\n\r"); send_to_desc (d, " | / |------------------------------------------------------------| \\ |\n\r"); send_to_desc (d, " | / | | \\ |\n\r"); sprintf (tcbuf, " | / | %s %s | \\ |\n\r", IS_SET (genraces[ch->race], CLASS_MAGE) ? "[`oM``]agic-User" : "`aMagic-User`` ", IS_SET (genraces[ch->race], CLASS_CLERIC) ? "[`oC``]leric" : "`aCleric`` "); send_to_desc (d, tcbuf); sprintf (tcbuf, " | / | %s %s | \\ |\n\r", IS_SET (genraces[ch->race], CLASS_THIEF) ? "[`oT``]hief" : "`aThief`` ", IS_SET (genraces[ch->race], CLASS_WARRIOR) ? "[`oW``]arrior" : "`aWarrior`` "); send_to_desc (d, tcbuf); sprintf (tcbuf, " | / | %s %s | \\ |\n\r", IS_SET (genraces[ch->race], CLASS_RANGER) ? "[`oR``]anger" : "`aRanger`` ", IS_SET (genraces[ch->race], CLASS_BARD) ? "[`oB``]ard" : "`aBard`` "); send_to_desc (d, tcbuf); sprintf (tcbuf, " | / | %s %s | \\ |\n\r", IS_SET (genraces[ch->race], CLASS_PALADIN) ? "[`oP``]aladin" : "`aPaladin`` ", IS_SET (genraces[ch->race], CLASS_ASSASSIN) ? "[`oA``]ssassin" : "`aAssassin`` "); send_to_desc (d, tcbuf); sprintf (tcbuf, " | / | %s %s | \\ |\n\r", IS_SET (genraces[ch->race], CLASS_REAVER) ? "[`oRE``]aver" : "`aReaver`` ", IS_SET (genraces[ch->race], CLASS_MONK) ? "[`oMO``]nk" : "`aMonk`` "); send_to_desc (d, tcbuf); send_to_desc (d, " |___| |___|\n\r"); send_to_desc (d, "(_____)----------------------------------------------------------(_____)\n\r"); send_to_desc (d, "\n\rWhat class would you like to be? "); d->connected = CON_GET_NEW_CLASS; break; case CON_GET_NEW_SEX: switch (argument[0]) { case 'm': case 'M': ch->sex = SEX_MALE; ch->pcdata->true_sex = SEX_MALE; break; case 'f': case 'F': ch->sex = SEX_FEMALE; ch->pcdata->true_sex = SEX_FEMALE; break; default: send_to_desc (d, "Sorry, there is no freak gender.\n\rWhat IS your sex? "); return; } { short rndo = number_percent (); if (IS_CLASS(ch,PC_CLASS_REAVER) && ch->sword) { sword = create_object (get_obj_index (OBJ_VNUM_REAVER_SWORD), 0); clone_object (ch->sword, sword); obj_to_char (sword, ch); } if (rndo < 75) { ch->pcdata->primary_hand = HAND_RIGHT; send_to_char ("\n\rYou will be right handed.\n\r", ch); if (IS_CLASS(ch,PC_CLASS_REAVER) && (sword != NULL)) /* Reaver */ equip_char (ch, sword, WEAR_WIELD_R); } else if (rndo < 95) { ch->pcdata->primary_hand = HAND_LEFT; send_to_char ("\n\rYou will be left handed.\n\r", ch); if (IS_CLASS(ch,PC_CLASS_REAVER) && (sword != NULL)) /* Reaver */ equip_char (ch, sword, WEAR_WIELD_L); } else { ch->pcdata->primary_hand = HAND_AMBIDEXTROUS; send_to_char ("\n\rYou will be ambidextrous.\n\r", ch); if (IS_CLASS(ch,PC_CLASS_REAVER) && (sword != NULL)) /* Reaver */ equip_char (ch, sword, WEAR_WIELD_R); } // } } if (IS_CLASS(ch,PC_CLASS_ASSASSIN) || ch->race != PC_RACE_AVATAR) { ch->pcdata->avatar_type = 2; //Assassin Avatars are forced to choose the pk type send_to_desc (d, "\n\rPlease Choose the Alignment of your Character:\n\r"); send_to_desc (d, " [`oG``]ood\n\r"); send_to_desc (d, " [`oE``]vil\n\r"); send_to_desc (d, " [`oN``]eutral\n\r"); send_to_desc (d, "\n\rWhich Alignment? "); d->connected = CON_GET_ALIGNMENT; } else { send_to_desc (d, "\n\rPlease Choose the Pk Status of your Avatar:\n\r"); send_to_desc (d, " [`oP``]k\n\r"); send_to_desc (d, " [`oN``]opk\n\r"); send_to_desc (d, "\n\rWhich choice? "); d->connected = CON_GET_AVATAR_TYPE; } break; case CON_GET_AVATAR_TYPE: if (argument[0] == 'N' || argument[0] == 'n') { ch->pcdata->avatar_type = 1; send_to_desc (d,"\n\rPlease Choose the Alignment of your Character:\n\r"); send_to_desc (d, " [`oG``]ood\n\r"); send_to_desc (d, " [`oE``]vil\n\r"); send_to_desc (d, " [`oN``]eutral\n\r"); send_to_desc (d, "\n\rWhich Alignment? "); d->connected = CON_GET_ALIGNMENT; } else if (argument[0] == 'P' || argument[0] == 'p') { send_to_desc (d, "\n\rPlease Choose the Alignment of your Character:\n\r"); send_to_desc (d, " [`oG``]ood\n\r"); send_to_desc (d, " [`oE``]vil\n\r"); send_to_desc (d, " [`oN``]eutral\n\r"); send_to_desc (d, "\n\rWhich Alignment? "); d->connected = CON_GET_ALIGNMENT; } else { send_to_desc (d, "`iInvalid Choice. Please type 'N' or 'P'.``\n\r"); send_to_desc (d, "\n\rPlease Choose the Pk Status of your Avatar:\n\r"); send_to_desc (d, " [`oP``]k\n\r"); send_to_desc (d, " [`oN``]opk\n\r"); send_to_desc (d, "\n\rWhich choice? "); d->connected = CON_GET_AVATAR_TYPE; } break; case CON_GET_NEW_CLASS: iClass = class_lookup (argument); // fConn = TRUE; if (iClass != -1) switch (iClass) { default: iClass = -1; break; case 0: if (!IS_SET (genraces[ch->race], CLASS_MAGE)) iClass = -2; break; case 1: if (!IS_SET (genraces[ch->race], CLASS_CLERIC)) iClass = -2; break; case 2: if (!IS_SET (genraces[ch->race], CLASS_THIEF)) iClass = -2; break; case 3: if (!IS_SET (genraces[ch->race], CLASS_WARRIOR)) iClass = -2; break; case 4: if (!IS_SET (genraces[ch->race], CLASS_RANGER)) iClass = -2; break; case 5: if (!IS_SET (genraces[ch->race], CLASS_BARD)) iClass = -2; break; case 6: if (!IS_SET (genraces[ch->race], CLASS_PALADIN)) iClass = -2; break; case 7: if (!IS_SET (genraces[ch->race], CLASS_ASSASSIN)) iClass = -2; break; case 8: if (!IS_SET (genraces[ch->race], CLASS_REAVER)) iClass = -2; break; case 9: if (!IS_SET (genraces[ch->race], CLASS_MONK)) iClass = -2; break; case 10: iClass = -1; break; } if (iClass == -1 || iClass == -2) { if (d->ansi) write_to_buffer (d, ANSI_CLSHOME, 0); send_to_desc (d, "\n\r"); send_to_desc (d, " __^__ __^__\n\r"); send_to_desc (d, "( ___ )----------------------------------------------------------( ___ )\n\r"); send_to_desc (d, " | / | | \\ |\n\r"); send_to_desc (d, " | / | Please Choose a Class: | \\ |\n\r"); send_to_desc (d, " | / |------------------------------------------------------------| \\ |\n\r"); send_to_desc (d, " | / | | \\ |\n\r"); sprintf (tcbuf, " | / | %s %s | \\ |\n\r", IS_SET (genraces[ch->race], CLASS_MAGE) ? "[`oM``]agic-User" : "`aMagic-User`` ", IS_SET (genraces[ch->race], CLASS_CLERIC) ? "[`oC``]leric" : "`aCleric`` "); send_to_desc (d, tcbuf); sprintf (tcbuf, " | / | %s %s | \\ |\n\r", IS_SET (genraces[ch->race], CLASS_THIEF) ? "[`oT``]hief" : "`aThief`` ", IS_SET (genraces[ch->race], CLASS_WARRIOR) ? "[`oW``]arrior" : "`aWarrior`` "); send_to_desc (d, tcbuf); sprintf (tcbuf, " | / | %s %s | \\ |\n\r", IS_SET (genraces[ch->race], CLASS_RANGER) ? "[`oR``]anger" : "`aRanger`` ", IS_SET (genraces[ch->race], CLASS_BARD) ? "[`oB``]ard" : "`aBard`` "); send_to_desc (d, tcbuf); sprintf (tcbuf, " | / | %s %s | \\ |\n\r", IS_SET (genraces[ch->race], CLASS_PALADIN) ? "[`oP``]aladin" : "`aPaladin`` ", IS_SET (genraces[ch->race], CLASS_ASSASSIN) ? "[`oA``]ssassin" : "`aAssassin`` "); send_to_desc (d, tcbuf); sprintf (tcbuf, " | / | %s %s | \\ |\n\r", IS_SET (genraces[ch->race], CLASS_REAVER) ? "[`oRE``]aver" : "`aReaver`` ", IS_SET (genraces[ch->race], CLASS_MONK) ? "[`oMO``]nk" : "`aMonk`` "); send_to_desc (d, tcbuf); send_to_desc (d, " |___| |___|\n\r"); send_to_desc (d, "(_____)----------------------------------------------------------(_____)\n\r\n\r"); if (iClass == -1) send_to_desc (d, "That is not a valid class.\n\r"); else send_to_desc (d, "Your race selection prevents you from choosing that class.\n\r"); send_to_desc (d, "What class would you like to be? "); return; } ch->class = iClass; if (ch->class == 8) { /* Reaver */ if (d->ansi) write_to_buffer (d, ANSI_CLSHOME, 0); send_to_desc (d, "\n\r `oA Reaver's sword is more than just a weapon, it is an extension\n\r"); send_to_desc (d, "of yourself. Your sword will be the only weapon that you will\n\r"); send_to_desc (d, "wield in the realms, and for this reason it is important that your\n\r"); send_to_desc (d, "sword's name reflect its personality. Choose carefully! You will\n\r"); send_to_desc (d, "not be able to alter the name of your blade after you enter the game.\n\r"); send_to_desc (d, "`aFeel free to colorize the swords name using the exodus color codes!\n\r"); send_to_desc (d, "\n\r``What shall you name your sword? "); d->connected = CON_SWORD_GENERATION; } else { if (d->ansi) write_to_buffer (d, ANSI_CLSHOME, 0); if (d->character->pcdata->br_points != -1) { send_to_desc (d, "\n\rPlease Choose a Gender:\n\r"); send_to_desc (d, " [`oM``]ale\n\r"); send_to_desc (d, " [`oF``]emale\n\r"); send_to_desc (d, "\n\rWhat is your sex? "); d->connected = CON_GET_NEW_SEX; } else if (ch->class != PC_RACE_AVATAR || IS_CLASS(ch,PC_CLASS_ASSASSIN)) { ch->pcdata->avatar_type = 2; send_to_desc (d, "\n\rPlease Choose the Alignment of your Character:\n\r"); send_to_desc (d, " [`oG``]ood\n\r"); send_to_desc (d, " [`oE``]vil\n\r"); send_to_desc (d, " [`oN``]eutral\n\r"); send_to_desc (d, "\n\rWhich Alignment? "); d->connected = CON_GET_ALIGNMENT; } else { send_to_desc (d, "\n\rPlease Choose the Pk Status of your Avatar:\n\r"); send_to_desc (d, " [`oP``]k\n\r"); send_to_desc (d, " [`oN``]opk\n\r"); send_to_desc (d, "\n\rWhich choice? "); d->connected = CON_GET_AVATAR_TYPE; } } break; case CON_GET_ALIGNMENT: switch (argument[0]) { case 'g': case 'G': ch->alignment = 1000; break; case 'n': case 'N': ch->alignment = 0; break; case 'e': case 'E': ch->alignment = -1000; break; default: send_to_desc (d, "That's not a valid alignment.\n\r"); send_to_desc (d, "\n\rPlease Choose the Alignment of your Character:\n\r"); send_to_desc (d, " [`oG``]ood\n\r"); send_to_desc (d, " [`oE``]vil\n\r"); send_to_desc (d, " [`oN``]eutral\n\r"); send_to_desc (d, "\n\rWhich Alignment? "); return; } if (ch->alignment < class_align[ch->class].align_min) { send_to_desc (d, "That's not a valid alignment for your class.\n\r"); send_to_desc (d, "\n\rPlease Choose the Alignment of your Character:\n\r"); send_to_desc (d, " [`oG``]ood\n\r"); send_to_desc (d, " [`oE``]vil\n\r"); send_to_desc (d, " [`oN``]eutral\n\r"); send_to_desc (d, "\n\rWhich Alignment? "); return; } if (ch->alignment > class_align[ch->class].align_max) { send_to_desc (d, "That's not a valid alignment for your class.\n\r"); send_to_desc (d, "\n\rPlease Choose the Alignment of your Character:\n\r"); send_to_desc (d, " [`oG``]ood\n\r"); send_to_desc (d, " [`oE``]vil\n\r"); send_to_desc (d, " [`oN``]eutral\n\r"); send_to_desc (d, "\n\rWhich Alignment? "); return; } if (ch->alignment < genstats[ch->race].align_min) { send_to_desc (d, "That's not a valid alignment for your race.\n\r"); send_to_desc (d, "\n\rPlease Choose the Alignment of your Character:\n\r"); send_to_desc (d, " [`oG``]ood\n\r"); send_to_desc (d, " [`oE``]vil\n\r"); send_to_desc (d, " [`oN``]eutral\n\r"); send_to_desc (d, "\n\rWhich Alignment? "); return; } if (ch->alignment > genstats[ch->race].align_max) { send_to_desc (d, "That's not a valid alignment for your race.\n\r"); send_to_desc (d, "\n\rPlease Choose the Alignment of your Character:\n\r"); send_to_desc (d, " [`oG``]ood\n\r"); send_to_desc (d, " [`oE``]vil\n\r"); send_to_desc (d, " [`oN``]eutral\n\r"); send_to_desc (d, "\n\rWhich Alignment? "); return; } if (ch->pcdata->br_points != -1) sprintf (log_buf, "%s@%s new player.", d->character->name, d->host); else sprintf (log_buf, "%s@%s reincarnated player.", d->character->name, d->host); remove_create (d->character->name); log_string (log_buf); wiznet ("Newbie alert! $N sighted.", d->character, NULL, WIZ_NEWBIE, 0, 0); wiznet (log_buf, NULL, NULL, WIZ_SITES, 0, get_trust (d->character)); //IBLIS 5/17/03 send_to_desc (d, "\n`bDon't be alarmed about not being allowed to chose skills/spells.\n\r"); send_to_desc (d, "Exodus has migrated to a totally new experience-based system, in which\n\r"); send_to_desc (d, "you start with all skills at 1%. \"Help experience\" once you're in will explain.``\n\r"); group_add_all (d->character); write_to_buffer (d, "\n\r", 2); if (ch->race != PC_RACE_NERIX) { write_to_buffer (d, "Please pick a weapon from the following choices:\n\r", 0); buf[0] = '\0'; for (i = 0; weapon_table[i].name != NULL; i++) if ( ch->pcdata->learned[*weapon_table[i].gsn] > 0) { strcat (buf, weapon_table[i].name); strcat (buf, " "); } strcat (buf, "\n\rYour choice? "); write_to_buffer (d, buf, 0); if (d->character->pcdata->br_points != -1) { d->character->gen_data = new_gen_data (); d->character->gen_data->points_chosen = d->character->pcdata->points; } d->connected = CON_PICK_WEAPON; } else { if (ch->pcdata->br_points != -1) { do_help (ch, "motd"); } else { do_reroll (ch, ""); send_to_char("You have been successfully reicarnated. Press return to continue.\r\n", ch); send_to_char("AFTER YOU HIT RETURN TO FINISH REINCARNATING, then you may type `kreroll`` to reroll\r\n",ch); } d->connected = CON_READ_MOTD; } break; case CON_PICK_WEAPON: write_to_buffer (d, "\n\r", 2); weapon = weapon_lookup (argument); if (weapon == -1 || ch->pcdata->learned[*weapon_table[weapon].gsn] <= 0) { write_to_buffer (d, "That's not a valid selection. Choices are:\n\r", 0); buf[0] = '\0'; for (i = 0; weapon_table[i].name != NULL; i++) if (ch->pcdata->learned[*weapon_table[i].gsn] > 0) { strcat (buf, weapon_table[i].name); strcat (buf, ", "); } strcat (buf, "\n\rYour choice? "); write_to_buffer (d, buf, 0); return; } ch->pcdata->learned[*weapon_table[weapon].gsn] = 40; write_to_buffer (d, "\n\r", 2); if (ch->pcdata->br_points != -1) { do_help (ch, "motd"); } else { do_reroll (ch, ""); send_to_char ("You have been successfully reicarnated. Press return to continue.\r\n", ch); send_to_char ("AFTER YOU HIT RETURN TO FINISH REINCARNATING, then you may type `kreroll`` to reroll.\r\n", ch); } d->connected = CON_READ_MOTD; break; case CON_READ_IMOTD: write_to_buffer (d, "\n\r", 2); if (ch->pcdata->br_points != -1) do_help (ch, "motd"); d->connected = CON_READ_MOTD; break; case CON_READ_MOTD: if (check_twolinks (d)) { send_to_char("`oAnother link is already active from your location.\n\r", ch); send_to_char("`oRemember, that Exodus is a single player game, and\n\r", ch); send_to_char("`othat a linkdead character is a playing character.``\n\r", ch); } if (ch->pcdata == NULL || ch->pcdata->pwd[0] == '\0') { write_to_buffer (d, "Warning! Null password!\n\r", 0); write_to_buffer (d, "Please report old password with bug.\n\r", 0); write_to_buffer (d, "Type 'password null <new password>' to fix.\n\r", 0); } if (ch->pcdata->br_points != -1) { ch->next = char_list; char_list = ch; reset_char (ch); } d->connected = CON_PLAYING; if (ch->pcdata->has_reincarnated == TRUE && ch->race == PC_RACE_LITAN) { int sn=0; OBJ_DATA *obj,*obj_next; //Iblis - Need to convert this Thyrent to a Litan ch->pcdata->has_reincarnated = FALSE; ch->level = 1; for (sn=0;sn < MAX_SKILL;sn++) { ch->pcdata->learned[sn] = 0; } for (obj = ch->carrying; obj != NULL; obj = obj_next) { obj_next = obj->next_content; if (IS_CLASS(ch,PC_CLASS_REAVER) && (obj->wear_loc == WEAR_WIELD_L || obj->wear_loc == WEAR_WIELD_R)) { unequip_char (ch,obj); obj_from_char (obj); extract_obj (obj); } if (obj->wear_loc != WEAR_NONE) unequip_char (ch, obj); } ch->pcdata->hp_gained = 0; ch->pcdata->mana_gained = 0; ch->pcdata->move_gained = 0; while (ch->affected) affect_remove (ch, ch->affected); ch->res_flags ^= ch->res_flags & RES_PIERCE; ch->vuln_flags ^= ch->vuln_flags & (VULN_COLD | VULN_FIRE); ch->size = pc_race_table[ch->race].size; ch->affected_by = ch->affected_by | race_table[ch->race].aff; ch->imm_flags = ch->imm_flags | race_table[ch->race].imm; ch->res_flags = ch->res_flags | race_table[ch->race].res; ch->vuln_flags = ch->vuln_flags | race_table[ch->race].vuln; ch->act = ch->act | race_table[ch->race].act; if (ch->race == PC_RACE_SWARM) ch->act2 = ch->act2 | ACT_NOMOVE; ch->form = race_table[ch->race].form; ch->parts = race_table[ch->race].parts; ch->exp = ch->pcdata->totalxp; ch->max_hit = 20; ch->hit = 20; ch->max_mana = 100; ch->mana = 100; ch->max_move = 100; ch->move = 100; ch->pcdata->perm_hit = 20; ch->pcdata->perm_mana = 100; ch->pcdata->perm_move = 100; group_add_all (ch); do_reroll(ch,""); send_to_char("Thyrents are no more. Litans are born.\n\r",ch); send_to_char("You were converted to a Litan for free. If you have any questions, talk to an Immortal.\n\r",ch); } //Iblis 1/19/04 - If Reavers have no totalsoul, back calculate it if (IS_CLASS(ch,PC_CLASS_REAVER) && ch->pcdata->totalsouls == 0) { backcalc_totalsouls(ch); } //Iblis 11/11/04 - Below doesn't work. It enters wiznet fine but doesn't message the imms. /* if (IS_SET(ch->comm2,COMM_SHUTUP)) { sprintf(log_buf,"%s is logging in and is shutup!",ch->name); wiznet (log_buf, NULL, NULL, WIZ_PENALTIES, WIZ_SECURE, get_trust(ch)); } if (IS_SET(ch->comm,COMM_NOCHANNELS)) { sprintf(log_buf,"%s is logging in and is nochanneled!",ch->name); wiznet (log_buf, NULL, NULL, WIZ_PENALTIES, WIZ_SECURE, get_trust(ch)); } */ if (ch->race == 4) if (!IS_SET (ch->res_flags, RES_ENTANGLE)) SET_BIT (ch->res_flags, RES_ENTANGLE); if (is_affected (ch,gsn_aquatitus)) affect_strip(ch,gsn_aquatitus); if (ch->pcdata->quest_ticks > 0) ch->pcdata->quest_ticks = -10; if (ch->race == PC_RACE_LITAN && weather_info.sky == SKY_CLOUDLESS && !IS_AFFECTED(ch,AFF_HASTE) && time_info.hour >= 5 && time_info.hour < 19) spell_haste(gsn_aquatitus,ch->level,ch,(void *)ch,TARGET_CHAR); if (is_affected (ch,skill_lookup("beacon of the damned"))) affect_strip(ch,skill_lookup("beacon of the damned")); ch->position = POS_STANDING; if (ch->alignment < -400) { OBJ_INDEX_DATA *oid; oid = get_obj_index (OBJ_VNUM_BEACON); if (oid && oid->count > 0) { AFFECT_DATA af; af.where = TO_AFFECTS; af.type = skill_lookup("beacon of the damned"); af.level = ch->level; af.duration = 15; af.bitvector = 0; af.permaff = FALSE; af.composition = FALSE; af.comp_name = str_dup (""); af.location = APPLY_SAVES; af.modifier = -5; affect_to_char (ch, &af); af.location = APPLY_AC; if (IS_SET(ch->act,ACT_UNDEAD)) af.modifier = -20; else af.modifier = -10; affect_to_char (ch, &af); af.location = APPLY_STR; af.modifier = 1; affect_to_char (ch, &af); af.location = APPLY_INT; affect_to_char (ch, &af); af.location = APPLY_WIS; affect_to_char (ch, &af); af.location = APPLY_DEX; affect_to_char (ch, &af); af.location = APPLY_CON; affect_to_char (ch, &af); af.location = APPLY_CHA; affect_to_char (ch, &af); send_to_char("Your whole being shivers with a surge of power.\n\r",ch); } } if (ch->race == PC_RACE_KALIAN) { affect_strip (ch, gsn_jurgnation); affect_strip (ch, gsn_jalknation); } if (ch->race == PC_RACE_KALIAN) { if (time_info.hour > 6 && time_info.hour < 19) { AFFECT_DATA af; af.where = TO_AFFECTS; af.type = gsn_jurgnation; af.level = 4; af.duration = 1; af.location = APPLY_STR; af.modifier = -3; af.bitvector = 0; af.permaff = FALSE; af.composition = FALSE; af.comp_name = str_dup (""); affect_to_char (d->character, &af); send_to_char("The daytime begins to wear you down.\n\r",d->character); } else if (time_info.hour < 6) { AFFECT_DATA af; af.where = TO_AFFECTS; af.type = gsn_jalknation; af.level = 4; af.duration = 1; af.location = APPLY_DAMROLL; af.modifier = d->character->level/10; af.bitvector = 0; af.permaff = FALSE; af.composition = FALSE; af.comp_name = str_dup (""); affect_to_char (d->character, &af); af.location = APPLY_HITROLL; affect_to_char (d->character, &af); send_to_char ("You feel invigorated by the night.\n\r", d->character); } } //IBLIS 6/03/03 - Monks have resist poison naturallyQ if (IS_CLASS (ch, PC_CLASS_MONK)) if (!IS_SET (ch->res_flags, RES_POISON)) SET_BIT (ch->res_flags, RES_POISON); if (ch->clan != CLAN_BOGUS) ch->pcdata->loner = TRUE; group_add_all (ch); //Iblis 8/10/04 - Fix any possible cardgame problems, due to a crash //etc in the middle of a cardgame { OBJ_DATA *obj, *obj_next, *container; if ((container = get_obj_vnum_string_char(ch,OBJ_VNUM_BINDER,"zhand"))) { for (obj = container->contains;obj != NULL; obj = obj_next) { obj_next = obj->next_content; obj_from_obj(obj); obj_to_char(obj,ch); } obj_from_char(container); extract_obj(container); } if ((container = get_obj_vnum_string_char(ch,OBJ_VNUM_BINDER,"zdiscard"))) { for (obj = container->contains;obj != NULL; obj = obj_next) { obj_next = obj->next_content; obj_from_obj(obj); obj_to_char(obj,ch); } obj_from_char(container); extract_obj(container); } if ((container = get_obj_vnum_char(ch,OBJ_VNUM_ANTE_BAG))) { for (obj = container->contains;obj != NULL; obj = obj_next) { obj_next = obj->next_content; obj_from_obj(obj); obj_to_char(obj,ch); } if (container->value[5] > 0) ch->silver += container->value[5]; if (container->value[6] > 0) ch->gold += container->value[6]; obj_from_char(container); extract_obj(container); } if ((container = get_obj_vnum_char(ch, OBJ_VNUM_DECK))) { if (IS_SET(container->extra_flags[1],ITEM_WIZI)) REMOVE_BIT(container->extra_flags[1],ITEM_WIZI); } if ((container = get_obj_vnum_char(ch, OBJ_VNUM_BINDER))) { if (IS_SET(container->extra_flags[1],ITEM_WIZI)) REMOVE_BIT(container->extra_flags[1],ITEM_WIZI); } //Done with card game fixes //Iblis 8/30/04 - If a player doesn't have a deck/binder, give them one /* if (!(container = get_obj_vnum_char(ch, OBJ_VNUM_BINDER))) { container = create_object(get_obj_index(OBJ_VNUM_BINDER),0); obj_to_char(container,ch); send_to_char("You've been given a binder.\n\r",ch); } if (!(container = get_obj_vnum_char(ch, OBJ_VNUM_DECK))) { container = create_object(get_obj_index(OBJ_VNUM_DECK),0); obj_to_char(container,ch); send_to_char("You've been given a deck.\n\r",ch); } */ } { OBJ_DATA *pobj, *obj; //Iblis - 9/03/04 - Temp card fix for (pobj = ch->carrying;pobj != NULL; pobj = pobj->next_content) { // OBJ_DATA *obj; if (pobj->contains != NULL) { for (obj = pobj->contains; obj != NULL;obj = obj->next_content) { if (obj->item_type == ITEM_CARD) { // case ITEM_CARD: if (obj->pIndexData->vnum == OBJ_VNUM_COMMON_CARD) i = 9; else i = 10; if (obj->value[8] > i) { obj->value[9] = obj->value[8]-i; obj->value[8] = i; } if (obj->value[9] > i) { obj->value[8] = obj->value[9]-i; obj->value[9] = i; } // break; } } } if (pobj->item_type == ITEM_CARD) { if (pobj->pIndexData->vnum == OBJ_VNUM_COMMON_CARD) i = 9; else i = 10; if (pobj->value[8] > i) { pobj->value[9] = pobj->value[8]-i; pobj->value[8] = i; } if (pobj->value[9] > i) { pobj->value[8] = pobj->value[9]-i; pobj->value[9] = i; } } } } if (ch->class2 == -1) //|| ch->level < 31) ch->class2 = ch->class; if (ch->class3 == -1) //|| ch->level < 61) ch->class3 = ch->class; if (ch->level == 0) { ch->class2 = ch->class; ch->class3 = ch->class; if (!ch->pcdata->new_style) { SET_BIT (ch->act, PLR_AUTOEXIT); ch->pcdata->color_combat_s = 7; ch->pcdata->color_combat_o = 1; ch->pcdata->color_combat_condition_s = 23; ch->pcdata->color_combat_condition_o = 3; ch->pcdata->color_invis = 14; ch->pcdata->color_hp = 6; ch->pcdata->color_hidden = 0; ch->pcdata->color_charmed = 12; ch->pcdata->color_mana = 6; ch->pcdata->color_move = 6; ch->pcdata->color_say = 10; ch->pcdata->color_tell = 2; ch->pcdata->color_guild_talk = 12; ch->pcdata->color_group_tell = 5; ch->pcdata->color_music = 8; ch->pcdata->color_gossip = 5; ch->pcdata->color_auction = 13; ch->exp = 10000; ch->pcdata->totalxp = ch->exp; do_outfit (ch, ""); obj_to_char (create_object (get_obj_index (OBJ_VNUM_START_FOOD), 0), ch); obj_to_char (create_object (get_obj_index (OBJ_VNUM_START_FOOD), 0), ch); obj_to_char (create_object (get_obj_index (OBJ_VNUM_START_DRINK), 0), ch); obj_to_char (create_object (get_obj_index (OBJ_VNUM_MANIFESTO), 0), ch); ch->silver = 60; set_title (ch, "the Neophyte"); // char_to_room (ch, get_room_index (1)); char_to_room (ch, get_room_index (ROOM_VNUM_SCHOOL)); trip_triggers(ch, OBJ_TRIG_ENTER_ROOM, NULL, NULL, OT_SPEC_NONE); sprintf(tcbuf,"%d",ch->in_room->vnum); trip_triggers_arg(ch, OBJ_TRIG_CHAR_TO_ROOM, NULL, NULL, OT_SPEC_NONE,tcbuf); } else { // sprintf (buf, "%s %d", ch->name, 1); sprintf (buf, "%s %d", ch->name, ROOM_VNUM_SCHOOL); do_transfer (ch, buf); ch->max_hit = 20; if (ch->pcdata) { ch->pcdata->perm_hit = 20; ch->pcdata->perm_move = 100; ch->pcdata->perm_mana = 100; } ch->max_move = 100; ch->max_mana = 100; save_char_obj (ch); } //This is used to signal a new style character ch->pcdata->new_style = 1; ch->level = 1; ch->hit = ch->max_hit; ch->mana = ch->max_mana; ch->move = ch->max_move; //IBLIS 5/18/03 - Changed for new xp system. ch->train = 2; if (ch->race == PC_RACE_NERIX) ch->dam_type = 41; else ch->dam_type = 17; send_to_char ("\n\r", ch); } else if (ch->in_room != NULL) { //IBLIS 5/19/03 - Does the dirty shit here for old chars if (ch->pcdata->new_style == 0 && !IS_IMMORTAL (ch)) { sprintf (buf, "%s", ch->name); do_pardon (ch, buf); sprintf (buf, "%s jailed 999999", ch->name); do_mset (ch, buf); if (IS_SET (ch->comm, COMM_NOCHANNELS)) REMOVE_BIT (ch->comm, COMM_NOCHANNELS); if (IS_SET (ch->comm2, COMM_SHUTUP)) REMOVE_BIT (ch->comm2, COMM_SHUTUP); send_to_char ("`o--------------------------------------------------------------------------------\n\r", ch); send_to_char ("`o--------------------------------------------------------------------------------\n\r", ch); send_to_char ("Exodus is running under a new experience system. As a result, all old-style\n\r", ch); send_to_char ("characters must be converted into the new style. `iYOU WILL `wNOT `iBE FORCED TO\n\r", ch); send_to_char ("CONVERT. `oConversion will only happen if you elect to do so by typing '`kreroll\n\r", ch); send_to_char ("all`o' If you choose to convert, the following things will happen to you:\n\r", ch); send_to_char ("\n\rYou will be moved to the Thesden Town Hall\n\r", ch); send_to_char ("Your stats will be rerolled\n\r", ch); send_to_char ("You will be set to level 1\n\r", ch); send_to_char ("Your hp/mp/mv will be reset to that of a level 1\n\r", ch); send_to_char ("Loners will become nonclan for safety reasons\n\r", ch); send_to_char ("You will stay the same race and class\n\r", ch); send_to_char ("You will keep all money in the bank\n\r", ch); send_to_char ("You will keep your accumulated hours\n\r", ch); send_to_char ("You will keep your equipment (be sure to store OOL eq before you quit)\n\r", ch); send_to_char ("You will be compensated for your level and skills/spells/prayers/songs/chants\n\r", ch); send_to_char ("This compensation will be in the form of a lump sum of exp.\n\r", ch); send_to_char ("\n\rThis compensation will not restore you back to level 90, but it will give\n\r", ch); send_to_char ("you a distinct advantage over players who were below you under the old\n\r", ch); send_to_char ("system. If you do not like your stats, you may '`kreroll`o' as often as you wish\n\r", ch); send_to_char ("as long as you are level 1.\n\r", ch); send_to_char ("\n\r`iIf there is a problem or if you have any questions, please DO NOT CONVERT\n\r", ch); send_to_char ("until you have spoken with an immortal.\n\r", ch); send_to_char ("`o--------------------------------------------------------------------------------\n\r", ch); send_to_char ("`o--------------------------------------------------------------------------------\n\r", ch); } else { ROOM_INDEX_DATA *troom=ch->in_room; if (ch->in_room) char_from_room(ch); if (IS_SET(troom->area->area_flags,AREA_NO_QUIT) || IS_SET(troom->room_flags,ROOM_ELEVATOR)) { troom = get_room_index (ROOM_VNUM_ALTAR); send_to_char("Close..but no cigar.\n\r",ch); } char_to_room (ch, troom); if (ch->in_room->vnum == ROOM_VNUM_LIMBO) char_to_room (ch, get_room_index (ROOM_VNUM_TEMPLE)); trip_triggers(ch, OBJ_TRIG_ENTER_ROOM, NULL, NULL, OT_SPEC_NONE); sprintf(tcbuf,"%d",ch->in_room->vnum); trip_triggers_arg(ch, OBJ_TRIG_CHAR_TO_ROOM, NULL, NULL, OT_SPEC_NONE,tcbuf); check_aggression(ch); } } else if (IS_IMMORTAL (ch)) { if (ch->in_room) char_from_room(ch); char_to_room (ch, get_room_index (ROOM_VNUM_CHAT)); trip_triggers(ch, OBJ_TRIG_ENTER_ROOM, NULL, NULL, OT_SPEC_NONE); sprintf(tcbuf,"%d",ch->in_room->vnum); trip_triggers_arg(ch, OBJ_TRIG_CHAR_TO_ROOM, NULL, NULL, OT_SPEC_NONE,tcbuf); check_aggression(ch); } else { if (ch->pcdata->br_points == -1) { if (ch->in_room) char_from_room(ch); } else if (ch->in_room) char_from_room(ch); char_to_room (ch, get_room_index (ROOM_VNUM_TEMPLE)); trip_triggers(ch, OBJ_TRIG_ENTER_ROOM, NULL, NULL, OT_SPEC_NONE); sprintf(tcbuf,"%d",ch->in_room->vnum); trip_triggers_arg(ch, OBJ_TRIG_CHAR_TO_ROOM, NULL, NULL, OT_SPEC_NONE,tcbuf); check_aggression(ch); } sprintf (buf, "%s has entered the game.\n\r", ch->name); //Iblis 10/04/04 - HERE was the stupid nplayer bug that has been haunting me. How // the hell the player gets in the room if not using char_to_room is freaking beyond me // ..plus I'm not looking at the moment if (ch->in_room) { ++ch->in_room->area->nplayer; //do_echo(ch,"num_players++"); } //Iblis 10/04/04 - SCAN TO SEE IF IMAGINARY FRIENDS SHOULD POOF if (ch->in_room->area->nplayer > 1) { CHAR_DATA *mch; for (mch = char_list;mch != NULL;mch = mch->next) { if (IS_NPC(mch)) continue; if (!mch->in_room) continue; if (mch->class == PC_CLASS_CHAOS_JESTER && mch->in_room->area == ch->in_room->area && mch->pcdata->familiar) { act("$N vanishes into thin air.",ch,NULL,mch->pcdata->familiar,TO_ROOM); familiar_poof(mch); } } } if (battle_royale && (ch->level > 19 || (!IS_NPC(ch) && ch->pcdata->loner))) do_restore (ch, ch->name); for (vch = char_list; vch != NULL; vch = vch_next) { vch_next = vch->next; if (vch->in_room == NULL) continue; if (vch->in_room == ch->in_room && can_see (vch, ch) && ch != vch) { send_to_char (buf, vch); continue; } } do_look (ch, "auto"); wiznet ("$N has left real life behind.", ch, NULL, WIZ_LOGINS, WIZ_SITES, get_trust (ch)); if (ch->pet != NULL) { if (ch->pet->in_room) char_from_room(ch->pet); char_to_room (ch->pet, ch->in_room); act ("$n has entered the game.", ch->pet, NULL, NULL, TO_ROOM); } if (ch->pcdata->br_points != -1) do_unread (ch, ""); ch->pcdata->br_points = 0; update_count (); break; case CON_SWORD_GENERATION: if (argument[0] == '\0') { send_to_desc (d, "What shall you name your sword? "); break; } sprintf (buf, "\n\rYou have named your blade %s\n\r", argument); send_to_desc (d, buf); send_to_desc (d, "Is that correct (Y/N)? "); ch->afkmsg = str_dup (argument); //hack to store this without wasting mem on new var d->connected = CON_SWORD_CONFIRM; break; case CON_SWORD_CONFIRM: if (argument[0] == '\0') { send_to_desc (d, "Is that correct (Y/N)? "); break; } switch (argument[0]) { case 'y': case 'Y': sword_confirm = TRUE; break; case 'n': case 'N': default: send_to_desc (d, "\n\rWhat shall you name your sword? "); d->connected = CON_SWORD_GENERATION; sword_confirm = FALSE; break; } if (!sword_confirm) break; sword_name = ch->afkmsg; ch->afkmsg = NULL; //reseting after hack ch->sword = create_object (get_obj_index (OBJ_VNUM_REAVER_SWORD), 0); sprintf (buf, "`hthe Reaver blade '%s`h'``", sword_name); ch->sword->short_descr = str_dup (buf); sprintf (buf, "`hThis Reaver blade bares the inscription '%s`h'.``", sword_name); ch->sword->description = str_dup (buf); ch->sword->cost = 0; for (i = 0; i < MAX_BLADE_SPELLS; i++) { ch->sword->bs_capacity[i] = 0; ch->sword->bs_charges[i] = 0; } for (i = 0; i < MAX_BURST; i++) { ch->sword->bb_capacity[i] = 0; ch->sword->bb_charges[i] = 0; } if (d->ansi) write_to_buffer (d, ANSI_CLSHOME, 0); send_to_desc (d, "\n\rPlease Choose a Gender:\n\r"); send_to_desc (d, " [`oM``]ale\n\r"); send_to_desc (d, " [`oF``]emale\n\r"); send_to_desc (d, "\n\rWhat is your sex? "); d->connected = CON_GET_NEW_SEX; break; } return; } /* * Parse a name for acceptability. */ bool check_parse_name (char *name) { int x; char name2[MAX_INPUT_LENGTH]; if (is_name (name, "all auto withdraw immortal self someone something the " "you demise balance circle loner honor bitch shit exodus " "test tester demagogue")) return FALSE; strcpy (name2, name); name2[0] = tolower (name2[0]); for (x = 0; bad_names[x]; x++) { if (strstr (name2, bad_names[x]) != NULL) return (FALSE); } if (strlen (name) < 2) return FALSE; if (strlen (name) > 12) return FALSE; /* * Alphanumerics only. * Lock out IllIll twits. */ { char *pc; bool fIll, adjcaps = FALSE, cleancaps = FALSE; int total_caps = 0; fIll = TRUE; for (pc = name; *pc != '\0'; pc++) { if (!isalpha (*pc)) return FALSE; if (isupper (*pc)) { /* ugly anti-caps hack */ if (adjcaps) cleancaps = TRUE; total_caps++; adjcaps = TRUE; } else adjcaps = FALSE; if (LOWER (*pc) != 'i' && LOWER (*pc) != 'l') fIll = FALSE; } if (fIll) return FALSE; if (cleancaps || (total_caps > (strlen (name)) / 2 && strlen (name) < 3)) return FALSE; } // prevent the use of already existing, reserved, proposed, inactive clan names if (clanname_to_slot (name) != CLAN_BOGUS) return (FALSE); /* * Prevent players from naming themselves after mobs. */ { extern MOB_INDEX_DATA *mob_index_hash[MAX_KEY_HASH]; MOB_INDEX_DATA *pMobIndex; int iHash; for (iHash = 0; iHash < MAX_KEY_HASH; iHash++) { for (pMobIndex = mob_index_hash[iHash]; pMobIndex != NULL; pMobIndex = pMobIndex->next) { if (is_name (name, pMobIndex->player_name)) return FALSE; } } } return TRUE; } /* * Look for link-dead player to reconnect. */ bool check_reconnect (DESCRIPTOR_DATA * d, char *name, bool fConn) { CHAR_DATA *ch, *vch, *vch_next; char buf[MAX_STRING_LENGTH]; for (ch = char_list; ch != NULL; ch = ch->next) { if (!IS_NPC (ch) && (!fConn || ch->desc == NULL) && !str_cmp (d->character->name, ch->name)) { if (fConn == FALSE) { free_string (d->character->pcdata->pwd); d->character->pcdata->pwd = str_dup (ch->pcdata->pwd); } else { OBJ_DATA *obj; free_char (d->character); d->character = ch; ch->desc = d; ch->timer = 0; send_to_char ("Reconnecting. Type replay to see missed tells.\n\r", ch); if (ch->in_room == get_room_index(ROOM_VNUM_SWITCHED_LIMBO)) { char_from_room(ch); char_to_room(ch,get_room_index(ROOM_VNUM_ALTAR)); } //5-12-03 Iblis - So you only notice reconnecting players you can see //note: had to declare vch and vch_next and buf sprintf (buf, "%s has reconnected.\n\r", ch->name); for (vch = char_list; vch != NULL; vch = vch_next) { vch_next = vch->next; if (vch->in_room == NULL) continue; if (vch->in_room == ch->in_room && can_see (vch, ch) && ch != vch) { send_to_char (buf, vch); continue; } } //act ("$n has reconnected.", ch, NULL, NULL, TO_ROOM); if ((obj = get_eq_char (ch, WEAR_LIGHT)) != NULL && obj->item_type == ITEM_LIGHT && obj->value[2] != 0) ++ch->in_room->light; sprintf (log_buf, "%s@%s reconnected.", ch->name, d->host); log_string (log_buf); wiznet ("$N groks the fullness of $S link.", ch, NULL, WIZ_LINKS, 0, 0); d->connected = CON_PLAYING; } return TRUE; } } return FALSE; } /* * Check if already playing. */ bool check_playing (DESCRIPTOR_DATA * d, char *name) { DESCRIPTOR_DATA *dold; for (dold = descriptor_list; dold; dold = dold->next) { if (dold != d && dold->character != NULL && dold->connected != CON_GET_NAME && dold->connected != CON_GET_OLD_PASSWORD && !str_cmp (name, dold->original ? dold->original->name : dold->character->name)) { write_to_buffer (d, "That character is already playing.\n\r", 0); write_to_buffer (d, "Do you wish to connect anyway (Y/N)?", 0); d->connected = CON_BREAK_CONNECT; return TRUE; } } return FALSE; } void stop_idling (CHAR_DATA * ch) { char tcbuf[15]; if (ch == NULL || ch->desc == NULL || ch->desc->connected != CON_PLAYING || ch->was_in_room == NULL || ch->in_room != get_room_index (ROOM_VNUM_LIMBO)) return; ch->timer = 0; char_from_room (ch); char_to_room (ch, ch->was_in_room); ch->was_in_room = NULL; act ("$n has returned from the void.", ch, NULL, NULL, TO_ROOM); trip_triggers(ch, OBJ_TRIG_ENTER_ROOM, NULL, NULL, OT_SPEC_NONE); sprintf(tcbuf,"%d",ch->in_room->vnum); trip_triggers_arg(ch, OBJ_TRIG_CHAR_TO_ROOM, NULL, NULL, OT_SPEC_NONE,tcbuf); check_aggression(ch); 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; } */ void send_to_char (char *txt, CHAR_DATA * ch) { char *a, *b; int length, l, curlen = 0; a = txt; length = strlen (txt); if (txt != NULL && ch->desc != NULL) { while (curlen < length) { b = a; l = 0; while (curlen < length && *a != '`') { l++; curlen++; a++; } if (l) write_to_buffer (ch->desc, b, l); if (*a) { a++; curlen++; if (curlen < length && ch->color && !IS_NPC(ch)) { process_color (ch, *a++); curlen++; } else { a++; curlen++; } } } } } void send_to_desc (DESCRIPTOR_DATA * desc, char *txt) { char *a, *b; int length, l, curlen = 0; a = txt; length = strlen (txt); if (txt != NULL && desc != NULL) { while (curlen < length) { b = a; l = 0; while (curlen < length && *a != '`') { l++; curlen++; a++; } if (l) write_to_buffer (desc, b, l); if (*a) { a++; curlen++; if (curlen < length && desc->ansi) { process_desc_color (desc, *a++); curlen++; } else { a++; curlen++; } } } } } /* * Send a page to one char. */ void page_to_char (char *txt, CHAR_DATA * ch) { if (txt == NULL || ch->desc == NULL) if (ch->lines == 0) { send_to_char (txt, ch); return; } if (ch->desc != NULL) { ch->desc->showstr_head = alloc_mem (strlen (txt) + 1); strcpy (ch->desc->showstr_head, txt); ch->desc->showstr_point = ch->desc->showstr_head; show_string (ch->desc, ""); } } /* string pager */ void show_string (struct descriptor_data *d, char *input) { char buffer[4 * MAX_STRING_LENGTH]; char buf[MAX_INPUT_LENGTH]; register char *scan, *chk; int lines = 0, toggle = 1; int show_lines; one_argument (input, buf); if (buf[0] != '\0') { if (d->showstr_head) { free_mem (d->showstr_head, strlen (d->showstr_head)); d->showstr_head = 0; } d->showstr_point = 0; return; } if (d->character) show_lines = d->character->lines; else show_lines = 0; for (scan = buffer;; scan++, d->showstr_point++) { if (((*scan = *d->showstr_point) == '\n' || *scan == '\r') && (toggle = -toggle) < 0) lines++; else if (!*scan || (show_lines > 0 && lines >= show_lines)) { *scan = '\0'; /* write_to_buffer(d,buffer,strlen(buffer)); */ if (d->character != NULL) send_to_char (buffer, d->character); for (chk = d->showstr_point; isspace (*chk); chk++); { if (!*chk) { if (d->showstr_head) { free_mem (d->showstr_head, strlen (d->showstr_head)); d->showstr_head = 0; } d->showstr_point = 0; } } return; } } return; } /* quick sex fixer */ void fix_sex (CHAR_DATA * ch) { if (ch->sex < 0 || ch->sex > 2) ch->sex = IS_NPC (ch) ? 0 : ch->pcdata->true_sex; } void act (const char *format, CHAR_DATA * ch, const void *arg1, const void *arg2, int type) { /* to be compatible with older code */ act_new (format, ch, arg1, arg2, type, POS_RESTING); } void act_new (const char *format, CHAR_DATA * ch, const void *arg1, const void *arg2, int type, int min_pos) { ROOM_INDEX_DATA *lrid; static char *const he_she[] = { "it", "he", "she" }; static char *const him_her[] = { "it", "him", "her" }; static char *const his_her[] = { "its", "his", "her" }; char buf[MAX_STRING_LENGTH]; char fname[MAX_INPUT_LENGTH]; CHAR_DATA *to; CHAR_DATA *vch = (CHAR_DATA *) arg2; OBJ_DATA *obj1 = (OBJ_DATA *) arg1; OBJ_DATA *obj2 = (OBJ_DATA *) arg2; const char *str; const char *i = "\0"; char *point; memset (buf, 0, MAX_STRING_LENGTH); if (format == NULL || format[0] == '\0') return; if (ch == NULL || ch->in_room == NULL) return; to = ch->in_room->people; if (type == TO_VICT) { if (vch == NULL) { bug ("Act: null vch with TO_VICT.", 0); return; } if (vch->in_room == NULL) return; to = vch->in_room->people; } for (; to != NULL; to = to->next_in_room) { if (to->desc == NULL || get_position(to) < min_pos) continue; if ((type == TO_CHAR) && to != ch) continue; if (type == TO_VICT && (to != vch || to == ch)) continue; if (type == TO_ROOM && to == ch) continue; if (type == TO_NOTVICT && (to == ch || to == vch)) continue; if (type == TO_IIR && (IS_NPC(to) || to == ch || !IS_IMMORTAL(to) || !IS_SET (to->act, PLR_HOLYLIGHT))) continue; if (type == TO_CJIR && (IS_NPC(to) || (!IS_IMMORTAL(to) && ch->class != PC_CLASS_CHAOS_JESTER))) continue; point = buf; str = format; while (*str != '\0') { if (*str != '$') { *point++ = *str++; continue; } ++str; if (arg2 == NULL && *str >= 'A' && *str <= 'Z') { char mybuf[MAX_STRING_LENGTH]; bug ("Act: missing arg2 for code %d.", *str); sprintf (mybuf, "FORMAT: %s", format); log_string (mybuf); i = " <@@@> "; } else { switch (*str) { default: i = " <@@@> "; break; /* Thx alex for 't' idea */ case 't': if (arg1) i = (char *) arg1; else bug ("Act: bad code $t for 'arg1'", 0); break; case 'T': if (arg2) i = (char *) arg2; else bug ("Act: bad code $T for 'arg2'", 0); break; case 'n': if (ch && to) { if (is_affected (ch, gsn_mask) && ch->mask != NULL && can_see (to, ch)) i = (char *) ch->mask; else i = PERS (ch, to); } else bug ("Act: bad code $n for 'ch' or 'to'", 0); break; case 'N': if (vch && to) { if (is_affected (vch, gsn_mask) && vch->mask != NULL && can_see (to, vch)) i = (char *) vch->mask; else i = PERS (vch, to); } else bug ("Act: bad code $N for 'vch' or 'to'", 0); break; case 'e': if (ch) i = he_she[URANGE (0, ch->sex, 2)]; else bug ("Act: bad code $e for 'ch'", 0); break; case 'E': if (vch) i = he_she[URANGE (0, vch->sex, 2)]; else bug ("Act: bad code $E for 'vch'", 0); break; case 'm': if (ch) i = him_her[URANGE (0, ch->sex, 2)]; else bug ("Act: bad code $m for 'ch'", 0); break; case 'M': if (vch) i = him_her[URANGE (0, vch->sex, 2)]; else bug ("Act: bad code $M for 'vch'", 0); break; case 's': if (ch) i = his_her[URANGE (0, ch->sex, 2)]; else bug ("Act: bad code $s for 'ch'", 0); break; case 'S': if (vch) i = his_her[URANGE (0, vch->sex, 2)]; else bug ("Act: bad code $S for 'vch'", 0); break; case 'p': if (to && obj1) { //Iblis 7/7/03 - Quick char leak fix if (!can_see_obj (to, obj1)) i = "something\0"; else i = obj1->short_descr; if (!to || !obj1 || !i) { bug ("Act: bad code $p for 'to' or 'obj1'", 0); return; } } else bug ("Act: bad code $p for 'to' or 'obj1'", 0); break; case 'P': if (to && obj2) { //Iblis 7/7/03 - Quick char leak fix if (!can_see_obj (to, obj2)) i = "something\0"; else i = obj2->short_descr; if (!to || !obj2 || !i) { bug ("Act: bad code $p for 'to' or 'obj2'", 0); return; } } else bug ("Act: bad code $P for 'to' or 'obj2'", 0); break; case 'd': if (arg2) { if (arg2 == NULL || ((char *) arg2)[0] == '\0') { i = "door"; } else { one_argument ((char *) arg2, fname); i = fname; } } else bug ("Act: bad code $P for 'arg2'", 0); break; } } ++str; while ((*point = *i) != '\0') ++point, ++i; } *point++ = '\n'; *point++ = '\r'; buf[0] = UPPER (buf[0]); send_to_char (buf, to); } memset (buf, 0, MAX_STRING_LENGTH); if (!is_dueling (ch)) return; if (strstr (format, "has arrived.") != NULL) return; if (ch->fighting == NULL) return; if (vch != NULL) { if (!is_dueling (vch)) return; if (vch->fighting == NULL) return; } lrid = get_room_index (ROOM_VNUM_SPECTATOR); for (to = lrid->people; to != NULL; to = to->next_in_room) { if (to->desc == NULL || get_position(to) < min_pos) continue; if ((type == TO_CHAR) && to != ch) continue; if (type == TO_VICT && (to != vch || to == ch)) continue; if (type == TO_ROOM && to == ch) continue; if (type == TO_NOTVICT && (to == ch || to == vch)) continue; point = buf; str = format; while (*str != '\0') { if (*str != '$') { *point++ = *str++; continue; } ++str; if (arg2 == NULL && *str >= 'A' && *str <= 'Z') { char mybuf[MAX_STRING_LENGTH]; bug ("Act: missing arg2 for code %d.", *str); sprintf (mybuf, "FORMAT: %s", format); log_string (mybuf); i = " <@@@> "; } else { switch (*str) { default: bug ("Act: bad code %d.", *str); i = " <@@@> "; break; case 't': if (arg1) i = (char *) arg1; else bug ("Act: bad code $t for 'arg1'", 0); break; case 'T': if (arg2) i = (char *) arg2; else bug ("Act: bad code $T for 'arg2'", 0); break; case 'n': if (ch && to) { if (is_affected (ch, gsn_mask) && ch->mask != NULL && can_see (to, ch)) i = ch->mask; else i = PERS (ch, to); } else bug ("Act: bad code $n for 'ch' or 'to'", 0); break; case 'N': if (vch && to) { if (is_affected (vch, gsn_mask) && vch->mask != NULL && can_see (to, vch)) i = vch->mask; else i = PERS (vch, to); } else bug ("Act: bad code $N for 'vch' or 'to'", 0); break; case 'e': if (ch) i = he_she[URANGE (0, ch->sex, 2)]; else bug ("Act: bad code $e for 'ch'", 0); break; case 'E': if (vch) i = he_she[URANGE (0, vch->sex, 2)]; else bug ("Act: bad code $E for 'vch'", 0); break; case 'm': if (ch) i = him_her[URANGE (0, ch->sex, 2)]; else bug ("Act: bad code $m for 'ch'", 0); break; case 'M': if (vch) i = him_her[URANGE (0, vch->sex, 2)]; else bug ("Act: bad code $M for 'vch'", 0); break; case 's': if (ch) i = his_her[URANGE (0, ch->sex, 2)]; else bug ("Act: bad code $s for 'ch'", 0); break; case 'S': if (vch) i = his_her[URANGE (0, vch->sex, 2)]; else bug ("Act: bad code $S for 'vch'", 0); break; case 'p': if (to && obj1) { //Iblis 7/7/03 - Quick char leak fix if (!can_see_obj (to, obj1)) i = "something\0"; else i = obj1->short_descr; } else bug ("Act: bad code $p for 'obj1'", 0); break; case 'P': if (to && obj2) { //Iblis 7/7/03 - Quick char leak fix if (!can_see_obj (to, obj2)) i = "something\0"; else i = obj2->short_descr; } else bug ("Act: bad code $P for 'obj2'", 0); break; case 'd': if (arg2) { if (arg2 == NULL || ((char *) arg2)[0] == '\0') { i = "door"; } else { one_argument ((char *) arg2, fname); i = fname; } } else bug ("Act: bad code $d for 'arg2'", 0); break; } } ++str; while ((*point = *i) != '\0') ++point, ++i; } *point++ = '\n'; *point++ = '\r'; buf[0] = UPPER (buf[0]); send_to_char (buf, to); } return; }