Login
User Name:

Password:



Register

Forgot your password?
do_advance
Jun 27, 2026 10:32 am
By Remcon
Time spamming LOP1.6
Jun 17, 2026 4:03 pm
By Remcon
A Bash Startup Script
Feb 7, 2026 3:49 pm
By eldhamud
Force Skills
Jan 1, 2026 3:58 pm
By Elwood
Overland with Bitmaps
Jul 4, 2025 11:57 pm
By Samson
SWFotEFUSS 1.5.4
Author: Various
Submitted by: Samson
SWRFUSS 1.4.4
Author: Various
Submitted by: Samson
SmaugFUSS 1.9.9
Author: Various
Submitted by: Samson
AFKMud 3.0.0
Author: AFKMud Team
Submitted by: Samson
SillyMUD 1.2a
Author: J. Brothers, J. Sievert, et al
Submitted by: Samson
Users Online
Anthropic, Baiduspider, DotBot, Bing, Petal Search, Amazonbot

Members: 0
Guests: 27
Stats
Files
Topics
Posts
Members
Newest Member
516
3,813
19,727
593
Madonna088

Files
Upload Rules | File Index | Search | Recent Uploads
» Root » AFKMud
AFKMud 3.0.0
Author Submitted by Version D/L File Size Date Added Last Updated

AFKMud Team Samson 3.0.0 2 1.70 MB Jul 17, 2026

Description
AFKMud 3.0.0 has been released.

This is a major upgrade release covering new issues fixed since the previous release, as well as major overhauls to the entire codebase to upgrade it to C++23.

For details, check the AFKMud repository on GitHub.

Changes for AFKMud 3.0.0

Changes

AFKMud will now enforce the requirement for C++23. That was formalized in October of 2024 so it should be widely available anyway. GCC 13.3 or newer will be necessary.

A major refactoring of many portions of the code has been done:
* All uses of snprintf have been converted to use std::format. This eliminates one of the biggest sources of buffer handling issues in the code.
* Other "printf" style functions have either been elevated to use std::format, or eliminated due to no longer being used.
* Every member of a class or struct that used char* in any form has been elevated to std::string.
* Overhauled the descriptor input/output system using modern methods.
* Overhauled the color code parsing system using modern methods.
* Overhauled the room mapping code using modern methods.
* Overhauled the Prompt system to get rid of its mass of C buffers.
* Overhauled the ban module using modern methods.
* Overhauled the act() function using modern methods.
* Updated all of the file read and write functions throughout the codebase to use cleaner, safer, modern methods.
* All time variables, such as current_time, have been changed from time_t to use the std::chrono library.
* Overhauled the random name generation and name authorization system.
* Overhauled the DNS resolution system to modern standards.
* Overhauled the fread_* functions for both numbers and strings to use more modern, safe methods.
* The UMIN, UMAX, and URANGE macros have been fully replaced with function calls in handler.cpp.
* The renumbering code in renumber.cpp has been overhauled using modern methods.
* A large number of functions which accepted const std::string or const char* have been upgraded to use std::string_view. This will cut down on heap allocations in memory and also happens to perform better.
* All uses of init_memory have been removed. Instead, each class and/or struct will have default values initialized in their code definitions. This will be done at compile time. This results in much better memory safety as long as you don't forget to set defaults in your headers and such.
* The mapout module has been significantly upgraded:
>> No more use of dangerous char[] arrays for parsing.
>> Consolidated repeating if-checks into a single function that can be reused.
>> Put an additional guardrail on exit linking to keep it from intruding into someone else's area - this would have been disastrous otherwise.
>> Cleaned out unused data and converted it to use std::list instead of singly linked lists for the index data.
>> Added support to save a work in progress map on the player rather than expecting them to do it all in one session.
>> And most importantly: Documented what this thing is actually doing instead of leaving everyone to guess about it. [See mapout.cpp]
* The CREATE, RECREATE, DISPOSE, STRALLOC, STRFREE, QUICKLINK and OLD_DISPOSE macros have been eliminated as there is no longer any portion of the codebase that used them.
>> As a result, the shared string hashing system has also been removed as it only lived to server those macros.
* All uses of strdup, and strlcat have been eliminated as they are no longer needed for std::string variables. Some calls to strlcpy remain for the edit buffer and shell code.
* char* and const char* versions of the following functions have been removed - they have all been replaced with std::string versions:
>> number_argument, smash_tilde, show_tilde, one_argument, char_data::start_editing, char_data::copy_buffer, is_name2_prefix, nifty_is_name_prefix, one_argument2.
* All string manipulation functions now reside in string_tools.cpp and editor.cpp is exclusively functions for the in-game line editor.
* The MUD now uses poll() instead of select() for descriptor processing. This is a faster and more optimized means of handling network connections without getting into the rarified air of using epoll().
* All file I/O operations have been upgraded to use std::ifstream and std::ofstream instead of the old FILE* system.

All uses of exit() have been swapped for std::exit().
Moved the pulse timer update to its own function outside of game_loop. Then gave it an overhaul to use std::chrono.
Network and socket connection has been overhauled using more modern methods available now. This should make them more universally compatible across platforms.
Added runtime string and memory hardening. Disable the MEM_FLAG section when compiling for a live environment, as it will impose a steep performance penalty when used. It should now only be enabled on testing ports for development.
In addition, did a major overhaul on the Makefile in general to allow it to be more automated during the build process.
Removed the already commented out block of code in init_socket dealing with SO_DONTLINGER as that has been obsolete for years.
Changed how IP addresses are captured during a new connection using a more standardized method.
Removed the "startup" script and replaced it with "startup.sh". The old script required /bin/csh to be installed which is not often present by default in many Linux distros.
Trimmed the number of includes at the top of each file. Several of them were no longer needed.
Random number generation has been updated to use the Mersenne Twister algorithm. This is far better than the old rand() code.
The pulse_violence variable in update.cpp was no longer being used by anything and has been removed.
Some sysdata values that are never used have been removed. Others that had incorrect settings were updated. Also vastly improved the documentation in mud.h for the whole of sysdata.
All classes and structs will now have default values initialized in their header data. In the process, nearly all headers have had documentation added for what their members do.
The WIN32 module has been deleted. Since this code was never actively hooked up anywhere, it was dead weight. The codebase has also been swept for any WIN32 tags that remain since they'd also be dead weight too.
* If you need to run the codebase on Windows, then use either Cygwin or the Windows Subsystem for Linux (WSL) [preferred].
Moved the login messages command into descriptor.cpp and moved the class definition out of mud.h and into descriptor.cpp. This didn't need to be globally aware.
Removed the unused set of weather macros and enums from mud.h. They were likely orphaned when Kayle's weather system replaced vanilla weather.
Removed the IS_INDOOR macro and promoted it to a function in weather.cpp: is_indoor_sector.
Removed the LOWER and UPPER macros and promoted them to proper functions. [to_lower, to_upper]
Removed the PERS macro and promoted it to a proper function.
Removed the exit flag macros in mud.h and promoted them to proper functions in roomindex.cpp.
An unused *next pointer was dangling in the obj_index class definition and has been removed. Most likely left over from long ago when the MUD switched to std::list.
The reserved names list used for name authorization has been moved into a proper in-memory table instead of being hackishly parsed via a system call to the grep command.
The descriptor_data::read_from_buffer() function has been upgraded to use a std::vector<> for the input buffer for memory safety.
Moved the skill_type class out of mud.h and into smaugaffect.h to cut down on compiler processing since it isn't necessary for the whole MUD to know about it.
Cleaned up the MSSP module to remove fields which are no longer being used by the protocol and to add the IPv6 field it was missing.
Removed unnecessary class members from the OLC data. There was a whole lot of unused pointers to things.
Encryption on player passwords has been upgraded to SHA-512. Existing players with older SHA-256 passwords will be upgraded when they next connect to the game.
The crash interception code has been removed. It was a fun little experiment 20 years ago but is universally considered dangerous now.
There was an APPLY_ANTIMAGIC defined in the olc.h file which was never used by the codebase for anything. It and the associated "amp" pointer in char_data have been removed.

Bug Fixes

Fixed some minor formatting issues revealed by GitHub's code scanning tools.
Resolved memory issues with note removals.
Potential pointer corruption with the one_argument function.
Fixed potential buffer overrun in the pfile scan code as well as a possible path traversal issue.
Fixed an issue in the hotboot code if the supermob was unable to dump objects into a room before being called on to do another one. It's a situation that could lead to mass item duplication.
Fixed an issue with the dlsym lookups when commands are being looked up. Handles errors better and catches an edge case. This better error detection also led to the removal of several commands from the commands.dat file that don't exist.
Fixed a potential memory issue in mprog_greet_trigger.
Continent area pointers were not being assigned during startup. This would lead to a crash when attempting to access the overland because it was feeding the weather data a NULL.
Perfectionists will be happy to note that typos in several places throughout the code have been fixed when spotted.
When unmorphing a player, the constitution bonus was not being removed from them, which could eventually result in players with ludicrously high constitution if they used the morphs frequently.
When purging rare items, the loop to check the object's contents needs to be checked through first in case the object itself is going to be extracted for its ego being too high.
The clean_room() function was not handling exit iterators cleanly when extracting the list of room exits.
Fixed an iterator invalidation crash in free_all_chess_games().
Fixed an iterator invalidation crash in do_sset() when deleting an affect from a skill.
When setting clan data, settings that use VNUMs were not being properly validated for out of range values.
The shell code was still able to call "make dns" even though that option has been removed from the Makefile for years.
Fixed a bug in the IPC messenger where capitalizing names was being called incorrectly and never actually compiled.
A non-numerical value was being formatted as a float in the do_identify() function for some reason.
Numerous instances of the progbuf function being called with no actual formatting needed have been corrected.
Conditions on when a player can polymorph into a form were not checking the proper calendar time for morphs that are restricted to certain hours.
The formatting in the morph.dat file was not uniform and needed to be resaved. This lead to uncovering a bug where the "Resistant" field did not have a trailing tilde on it.
Sending an MSP sound to a player did not include the filename for the sound, only the folder. So you'd end up with an invalid request.
Fixed an issue where the overland system would continue to attempt to write a .png file even if the operation to open the file failed.
Fixed a bug where loading connection data was assigning the invisibility data to the type field instead.
Had to rewrite the entire load/save routine for boards. The entire system was broken to the core and judging by the mess, it simply never worked properly and also could not convert boards from the older Smaug system either.
* Unfortunately this also means that in rewriting things, any existing board files you have won't load properly because the file structure was never saved properly.
* Doubly strange in all of this is that Alsherok had boards I can see DID work at some point because there's posts and replies on them. So I have no idea where shit collapsed to the point of being so broken.
* While I was at it, fixed it so that editing a single board doesn't trigger a write on every board. That was excessively unnecessary and a potential risk if something were wrong on the server storage.
* Also triggered a save for the board list when raising or lowering, because this wasn't doing so at all thus making a raise/lower operation pointless.
Creating a new board had no check to make sure a board of the same name didn't already exist.
Examining drink containers or quivers had no code to handle what you saw inside either of them.
fwrite_skill had a long standing bug where it silently passed non-numeric string data to an atoi() call that would fail without any notice.
Fixed a bug in get_skill_help that would crash the game if an affect bit is -1.
Area weather coordinates were being stored, but the code to read them in on bootup was incorrectly in the room loader, not the header data loader.
Fixed an issue where extracted_obj_queue was incorrectly declared in db.cpp.
The weather randomization at midnight was never taking place because RandomizeCells() had never been called from time_update().
Fixed a bug in the pulltype messages where some of the messages were being incorrectly reassigned to the wrong type.
Out of bounds array bug fixed in find_piece() in chess.cpp.
Fixed a bug where a deleting player's items were not properly setting the donation flag.
Fixed a bug where GSN values were not being correctly assigned after the ASSIGN_GSN macro was converted into a function at some point. All because GSN values were being passed in as values and not references.
Insectoids were unable to choose the ranger class because the speech response was setting rogue instead.


Revisions: 0
Rating: | Download | Comments(0)