diff --git a/lib/text/greetings b/lib/text/greetings index 5792e0d..29fa60f 100644 --- a/lib/text/greetings +++ b/lib/text/greetings @@ -1,7 +1,15 @@ - T B A M U D - 2 0 2 5 + You are descending into... - Based on CircleMUD by Jeremy Elson and DikuMUD by Hans-Henrik Staerfeldt, - Katja Nyboe, Tom Madsen, Michael Seifert, and Sebastian Hammer + ___ ____ _ _ + | \/ (_) | | | | + | . . |_ _ __ __ _ _ __ | |_| |__ __ _ ___ + | |\/| | | '__/ _` | '_ \| __| '_ \ / _` / __| + | | | | | | | (_| | | | | |_| | | | (_| \__ \ + \_| |_/_|_| \__,_|_| |_|\__|_| |_|\__,_|___/ + -By what name do you wish to be known? +Select an option: + [C] Connect to the game + [X] Disconnect from the game + +Enter choice: diff --git a/lib/text/help/help.hlp b/lib/text/help/help.hlp index 88c6692..80f2657 100644 --- a/lib/text/help/help.hlp +++ b/lib/text/help/help.hlp @@ -7069,14 +7069,14 @@ questions, you may want to ask someone whose level is at least 32. Of course, everyone is encouraged to help everyone else, but know that those who are not at least level 32 may have relatively little experience. -Level 31 (Immortal) Anyone who is new to TBA and is working on their trial +Level 2 (Immortal) Anyone who is new to TBA and is working on their trial vnum or zone. -Level 32 (God) An experienced builder with proven knowledge that is +Level 3 (God) An experienced builder with proven knowledge that is willing to teach others. Immortals of level 32 and above are considered staff. -Level 33 (Greater God) An experienced builder that has contributed significantly +Level 4 (Greater God) An experienced builder that has contributed significantly to TBA. -Level 34 (Implementor) Current developers: Welcor, Wyld, and Opie. +Level 5 (Implementor) Current developers: Welcor, Wyld, and Opie. Please do not bother asking to be advanced. If your goal is merely to rise in the ranks, you are wasting your time. The Gods here are dedicated to helping diff --git a/lib/text/imotd b/lib/text/imotd index dd554f0..c618b0e 100644 --- a/lib/text/imotd +++ b/lib/text/imotd @@ -1,11 +1,7 @@ -(lib/text/imotd) - -Welcome to tbaMUD! - -This is the immortal MOTD -- the file that immortals will see when they -log in to the game. You should change it to something more interesting -when you get a chance (as well as most of the other files in lib/text.) - -If you need help, find a bug, or wish to contribute please stop by -The Builder Academy at: tbamud.com 9091 or @Chttp://tbamud.com@n. - ++-----------------------------------------------------------------------------+ +| | +| Based on tbaMUD by Rumble, CircleMUD by Jeremy Elson, and DikuMUD by | +| Hans-Henrik Staerfeldt, Katja Nyboe, Tom Madsen, Michael Seifert, | +| and Sebastian Hammer. | +| | ++-----------------------------------------------------------------------------+ diff --git a/lib/text/motd b/lib/text/motd index 909d5ff..c618b0e 100644 --- a/lib/text/motd +++ b/lib/text/motd @@ -1,4 +1,7 @@ - Welcome to - T B A M U D - D E V E L O P M E N T P O R T - Please be brutal with the bug, idea, and typo commands. -- Rumble ++-----------------------------------------------------------------------------+ +| | +| Based on tbaMUD by Rumble, CircleMUD by Jeremy Elson, and DikuMUD by | +| Hans-Henrik Staerfeldt, Katja Nyboe, Tom Madsen, Michael Seifert, | +| and Sebastian Hammer. | +| | ++-----------------------------------------------------------------------------+ diff --git a/src/comm.c b/src/comm.c index ebe70b5..bfb3266 100644 --- a/src/comm.c +++ b/src/comm.c @@ -1449,7 +1449,7 @@ static void init_descriptor (struct descriptor_data *newd, int desc) *newd->output = '\0'; newd->bufptr = 0; newd->has_prompt = 1; /* prompt is part of greetings */ - STATE(newd) = CONFIG_PROTOCOL_NEGOTIATION ? CON_GET_PROTOCOL : CON_GET_NAME; + STATE(newd) = CONFIG_PROTOCOL_NEGOTIATION ? CON_GET_PROTOCOL : CON_GET_CONNECT; CREATE(newd->history, char *, HISTORY_SIZE); if (++last_desc == 1000) last_desc = 1; @@ -2135,7 +2135,7 @@ static void check_idle_passwords(void) for (d = descriptor_list; d; d = next_d) { next_d = d->next; - if (STATE(d) != CON_PASSWORD && STATE(d) != CON_GET_NAME) + if (STATE(d) != CON_PASSWORD && STATE(d) != CON_GET_NAME && STATE(d) != CON_GET_CONNECT) continue; if (!d->idle_tics) { d->idle_tics++; diff --git a/src/interpreter.c b/src/interpreter.c index c64ea98..d1aa345 100644 --- a/src/interpreter.c +++ b/src/interpreter.c @@ -1321,7 +1321,7 @@ EVENTFUNC(get_protocols) write_to_output(d, buf, 0); write_to_output(d, GREETINGS, 0); - STATE(d) = CON_GET_NAME; + STATE(d) = CON_GET_CONNECT; return 0; } @@ -1366,6 +1366,26 @@ void nanny(struct descriptor_data *d, char *arg) case CON_GET_PROTOCOL: write_to_output(d, "Collecting Protocol Information... Please Wait.\r\n"); return; + case CON_GET_CONNECT: + if (!*arg) { + write_to_output(d, GREETINGS, 0); + return; + } + switch (UPPER(*arg)) { + case 'C': + write_to_output(d, "By what name do you wish to be known? "); + STATE(d) = CON_GET_NAME; + return; + case 'X': + write_to_output(d, "Goodbye.\r\n"); + STATE(d) = CON_CLOSE; + return; + default: + write_to_output(d, + "That is an invalid selection.\r\n"); + write_to_output(d, GREETINGS, 0); + return; + } case CON_GET_NAME: /* wait for input of name */ if (d->character == NULL) { CREATE(d->character, struct char_data, 1); @@ -1437,7 +1457,7 @@ void nanny(struct descriptor_data *d, char *arg) /* Check for multiple creations of a character. */ if (!valid_name(tmp_name)) { - write_to_output(d, "Invalid name, please try another.\r\nName: "); + write_to_output(d, "Invalid name, please try another.\r\nBy what name do you wish to be known? "); return; } CREATE(d->character->player.name, char, strlen(tmp_name) + 1); @@ -1468,7 +1488,7 @@ void nanny(struct descriptor_data *d, char *arg) echo_off(d); STATE(d) = CON_NEWPASSWD; } else if (*arg == 'n' || *arg == 'N') { - write_to_output(d, "Okay, what IS it, then? "); + write_to_output(d, "Okay, what IS it, then?\r\nBy what name do you wish to be known? "); free(d->character->player.name); d->character->player.name = NULL; STATE(d) = CON_GET_NAME; @@ -1721,42 +1741,44 @@ case CON_QCLASS: } case CON_PLR_DESC: - /* If the player canceled or has no description, prompt again */ - if (!d->character->player.description || !*d->character->player.description) { + /* Description accepted — save and continue */ + save_char(d->character); + + if (!GET_BACKGROUND(d->character) || !*GET_BACKGROUND(d->character)) { write_to_output(d, - "\r\nYou must provide a description before entering the world.\r\n" - "Please try again. Type '/s' on a blank line when finished.\r\n\r\n"); + "\r\nBefore stepping into Miranthas, share a bit of your character's background.\r\n" + "Guideline: aim for at least four lines that hint at where they came from,\r\n" + "who shaped them, and why they now walk the Tyr region. Touch on things like:\r\n" + " - The city-state, tribe, or caravan that claimed them.\r\n" + " - Mentors, slavers, or patrons who left a mark.\r\n" + " - A defining hardship, triumph, oath, or secret.\r\n" + " - The goal, vengeance, or hope that drives them back into the wastes.\r\n" + "\r\nExample 1:\r\n" + " Raised beneath the ziggurat of Tyr, I learned to barter gossip between\r\n" + " templars and gladiators just to stay alive. Freedom came when Kalak fell,\r\n" + " but the slave-scar on my shoulder still aches. I now search the desert\r\n" + " for the relic my clutch mates died protecting, hoping to buy their kin peace.\r\n" + "\r\nExample 2:\r\n" + " I rode caravan outrider routes from Balic until giants shattered our train.\r\n" + " Two nights buried in silt taught me to whisper with the wind and trust only\r\n" + " my erdlu. I hunt the warlord who sold us out, yet coin and company on the\r\n" + " road must come first.\r\n" + "\r\nExample 3:\r\n" + " Born outside Raam, I was tempered by obsidian shards and psionic murmurs.\r\n" + " A defiler ruined our oasis, so I swore to hound such spell-scars wherever\r\n" + " they bloom. Rumor of a hidden well near Tyr is the lone hope that guides me.\r\n" + "\r\nType your background now. Use '/s' on a blank line when you finish.\r\n" + "If you'd rather keep it secret, just save immediately and we'll note the mystery.\r\n\r\n"); d->backstr = NULL; - d->str = &d->character->player.description; + if (GET_BACKGROUND(d->character) && *GET_BACKGROUND(d->character)) + d->backstr = strdup(GET_BACKGROUND(d->character)); + d->str = &d->character->player.background; d->max_str = PLR_DESC_LENGTH; + STATE(d) = CON_PLR_BACKGROUND; send_editor_help(d); return; } - /* Count lines */ - { - int line_count = 0; - for (char *p = d->character->player.description; *p; p++) - if (*p == '\n') - line_count++; - - if (line_count < 4) { - write_to_output(d, - "\r\nYour description must be at least four lines long.\r\n" - "Please expand on your appearance and try again.\r\n"); - free(d->character->player.description); - d->character->player.description = NULL; - d->backstr = NULL; - d->str = &d->character->player.description; - d->max_str = PLR_DESC_LENGTH; - send_editor_help(d); - return; - } - } - - /* Description accepted — save and continue */ - save_char(d->character); - write_to_output(d, "%s\r\n*** PRESS RETURN: ", motd); STATE(d) = CON_RMOTD; @@ -1781,72 +1803,6 @@ case CON_QCLASS: break; case '1': - /* Require a description before entering the world */ - if (!d->character->player.description || !*d->character->player.description) { - write_to_output(d, - "\r\nBefore entering the world, you must describe your character.\r\n" - "Focus on what others can immediately see — height, build, complexion,\r\n" - "facial structure, hair, eyes, and other physical traits.\r\n" - "When done, type '/s' on a blank line.\r\n\r\n"); - d->backstr = NULL; - d->str = &d->character->player.description; - d->max_str = PLR_DESC_LENGTH; - STATE(d) = CON_PLR_DESC; - send_editor_help(d); - return; - } else { - int line_count = 0; - for (char *p = d->character->player.description; *p; p++) - if (*p == '\n') - line_count++; - if (line_count < 4) { - write_to_output(d, - "\r\nYour description must be at least four lines long.\r\n" - "Please expand it before entering the world.\r\n\r\n"); - d->backstr = NULL; - d->str = &d->character->player.description; - d->max_str = PLR_DESC_LENGTH; - STATE(d) = CON_PLR_DESC; - send_editor_help(d); - return; - } - } - - if (!GET_BACKGROUND(d->character) || !*GET_BACKGROUND(d->character)) { - write_to_output(d, - "\r\nBefore stepping into Athas, share a bit of your character's background.\r\n" - "Guideline: aim for at least four lines that hint at where they came from,\r\n" - "who shaped them, and why they now walk the Tyr region. Touch on things like:\r\n" - " - The city-state, tribe, or caravan that claimed them.\r\n" - " - Mentors, slavers, or patrons who left a mark.\r\n" - " - A defining hardship, triumph, oath, or secret.\r\n" - " - The goal, vengeance, or hope that drives them back into the wastes.\r\n" - "\r\nExample 1:\r\n" - " Raised beneath the ziggurat of Tyr, I learned to barter gossip between\r\n" - " templars and gladiators just to stay alive. Freedom came when Kalak fell,\r\n" - " but the slave-scar on my shoulder still aches. I now search the desert\r\n" - " for the relic my clutch mates died protecting, hoping to buy their kin peace.\r\n" - "\r\nExample 2:\r\n" - " I rode caravan outrider routes from Balic until giants shattered our train.\r\n" - " Two nights buried in silt taught me to whisper with the wind and trust only\r\n" - " my erdlu. I hunt the warlord who sold us out, yet coin and company on the\r\n" - " road must come first.\r\n" - "\r\nExample 3:\r\n" - " Born outside Raam, I was tempered by obsidian shards and psionic murmurs.\r\n" - " A defiler ruined our oasis, so I swore to hound such spell-scars wherever\r\n" - " they bloom. Rumor of a hidden well near Tyr is the lone hope that guides me.\r\n" - "\r\nType your background now. Use '/s' on a blank line when you finish.\r\n" - "If you'd rather keep it secret, just save immediately and we'll note the mystery.\r\n\r\n"); - d->backstr = NULL; - if (GET_BACKGROUND(d->character) && *GET_BACKGROUND(d->character)) - d->backstr = strdup(GET_BACKGROUND(d->character)); - d->str = &d->character->player.background; - d->max_str = PLR_DESC_LENGTH; - STATE(d) = CON_PLR_BACKGROUND; - send_editor_help(d); - return; - } - /* Proceed into the world */ load_result = enter_player_game(d); send_to_char(d->character, "%s", CONFIG_WELC_MESSG); diff --git a/src/modify.c b/src/modify.c index ffd8bd3..a9a6cb9 100644 --- a/src/modify.c +++ b/src/modify.c @@ -125,6 +125,7 @@ void string_write(struct descriptor_data *d, char **writeto, size_t len, long ma void string_add(struct descriptor_data *d, char *str) { int action; + char **orig_str = d->str; /* Determine if this is the terminal string, and truncate if so. Changed to * only accept '\t' at the beginning of line. - JE */ @@ -207,6 +208,7 @@ void string_add(struct descriptor_data *d, char *str) /* Ok, now final cleanup. */ if (action == STRINGADD_SAVE || action == STRINGADD_ABORT) { int i; + int chain_write; struct { int mode; void (*func)(struct descriptor_data *d, int action); @@ -231,15 +233,18 @@ void string_add(struct descriptor_data *d, char *str) (*cleanup_modes[i].func)(d, action); /* Common post cleanup code. */ - d->str = NULL; - d->mail_to = 0; - d->max_str = 0; - if (d->character && !IS_NPC(d->character)) { - REMOVE_BIT_AR(PLR_FLAGS(d->character), PLR_BUG); - REMOVE_BIT_AR(PLR_FLAGS(d->character), PLR_IDEA); - REMOVE_BIT_AR(PLR_FLAGS(d->character), PLR_TYPO); - REMOVE_BIT_AR(PLR_FLAGS(d->character), PLR_MAILING); - REMOVE_BIT_AR(PLR_FLAGS(d->character), PLR_WRITING); + chain_write = (d->str && d->str != orig_str); + if (!chain_write) { + d->str = NULL; + d->mail_to = 0; + d->max_str = 0; + if (d->character && !IS_NPC(d->character)) { + REMOVE_BIT_AR(PLR_FLAGS(d->character), PLR_BUG); + REMOVE_BIT_AR(PLR_FLAGS(d->character), PLR_IDEA); + REMOVE_BIT_AR(PLR_FLAGS(d->character), PLR_TYPO); + REMOVE_BIT_AR(PLR_FLAGS(d->character), PLR_MAILING); + REMOVE_BIT_AR(PLR_FLAGS(d->character), PLR_WRITING); + } } } else if (action != STRINGADD_ACTION && strlen(*d->str) + 3 <= d->max_str) /* 3 = \r\n\0 */ strcat(*d->str, "\r\n"); @@ -300,6 +305,41 @@ static void exdesc_string_cleanup(struct descriptor_data *d, int action) if (action == STRINGADD_ABORT) write_to_output(d, "Description aborted.\r\n"); + if (d->character && (!GET_BACKGROUND(d->character) || !*GET_BACKGROUND(d->character))) { + write_to_output(d, + "\r\nBefore stepping into Miranthas, share a bit of your character's background.\r\n" + "Guideline: aim for at least four lines that hint at where they came from,\r\n" + "who shaped them, and why they now walk the Tyr region. Touch on things like:\r\n" + " - The city-state, tribe, or caravan that claimed them.\r\n" + " - Mentors, slavers, or patrons who left a mark.\r\n" + " - A defining hardship, triumph, oath, or secret.\r\n" + " - The goal, vengeance, or hope that drives them back into the wastes.\r\n" + "\r\nExample 1:\r\n" + " Raised beneath the ziggurat of Tyr, I learned to barter gossip between\r\n" + " templars and gladiators just to stay alive. Freedom came when Kalak fell,\r\n" + " but the slave-scar on my shoulder still aches. I now search the desert\r\n" + " for the relic my clutch mates died protecting, hoping to buy their kin peace.\r\n" + "\r\nExample 2:\r\n" + " I rode caravan outrider routes from Balic until giants shattered our train.\r\n" + " Two nights buried in silt taught me to whisper with the wind and trust only\r\n" + " my erdlu. I hunt the warlord who sold us out, yet coin and company on the\r\n" + " road must come first.\r\n" + "\r\nExample 3:\r\n" + " Born outside Raam, I was tempered by obsidian shards and psionic murmurs.\r\n" + " A defiler ruined our oasis, so I swore to hound such spell-scars wherever\r\n" + " they bloom. Rumor of a hidden well near Tyr is the lone hope that guides me.\r\n" + "\r\nType your background now. Use '/s' on a blank line when you finish.\r\n" + "If you'd rather keep it secret, just save immediately and we'll note the mystery.\r\n\r\n"); + d->backstr = NULL; + if (GET_BACKGROUND(d->character) && *GET_BACKGROUND(d->character)) + d->backstr = strdup(GET_BACKGROUND(d->character)); + d->str = &d->character->player.background; + d->max_str = PLR_DESC_LENGTH; + STATE(d) = CON_PLR_BACKGROUND; + send_editor_help(d); + return; + } + write_to_output(d, "%s", CONFIG_MENU); STATE(d) = CON_MENU; } diff --git a/src/structs.h b/src/structs.h index 3c2de8e..085e25c 100644 --- a/src/structs.h +++ b/src/structs.h @@ -340,6 +340,7 @@ #define CON_MSGEDIT 32 /**< OLC mode - message editor */ #define CON_PLR_BACKGROUND 33 /**< Entering a new character background */ #define CON_GET_PROTOCOL 33 /**< Used at log-in while attempting to get protocols > */ +#define CON_GET_CONNECT 34 /**< Login connect/disconnect menu */ /* OLC States range - used by IS_IN_OLC and IS_PLAYING */ #define FIRST_OLC_STATE CON_OEDIT /**< The first CON_ state that is an OLC */