Guides

ROM with ROM 2.4

ROM 2.4 remains a foundational DikuMUD derivative widely used for hobby MUDs. This guide addresses the specific friction points of compiling 1990s C code on modern x86_64 systems, patching inherited Merc vulnerabilities, and configuring directory structures for persistent hosting. Assumes Ubuntu 22.04 LTS or equivalent Debian-based server environment.

3-4 hours8 steps
ROM with ROM 2.4 illustration
Placeholder illustration shown while custom artwork is being produced.
1

Install 32-bit Compatibility Libraries

ROM 2.4 assumes 32-bit memory alignment in several Merc-derived pointer operations. On x86_64 systems, install multilib support to prevent segmentation faults during player file loading.

sudo apt-get update && sudo apt-get install gcc-multilib libc6-dev-i386 build-essential

⚠ Common Pitfalls

  • Do not skip this on 64-bit systems or expect immediate crashes on player login
2

Patch Buffer Overflow Vulnerabilities

Stock ROM uses unbounded sprintf in save.c and act_comm.c. Replace with snprintf and define NAME_LEN limits to prevent crashes from long player names or object descriptions.

save.c
// In save.c, replace:
// sprintf( strsave, "%s%s", PLAYER_DIR, ch->name );
// With:
snprintf( strsave, sizeof(strsave), "%s%s", PLAYER_DIR, ch->name );

⚠ Common Pitfalls

  • Check all sprintf instances; there are 12 in stock ROM
  • Verify PLAYER_DIR ends with trailing slash
3

Configure Absolute Directory Paths

Stock ROM uses relative paths in merc.h that fail when the binary executes from cron or systemd services. Define AREA_LIST, PLAYER_DIR, and GOD_DIR as absolute paths pointing to your installation.

merc.h
#define AREA_LIST       "/var/mud/rom/area/area.lst"
#define PLAYER_DIR      "/var/mud/rom/player/"
#define GOD_DIR         "/var/mud/rom/gods/"
4

Adjust Hardcoded Memory Limits

Increase MAX_STRING_LENGTH from 4096 to 8192 and MAX_SKILL from 150 to 300. These 1993-era defaults truncate modern area files and limit class customization options.

merc.h
#define MAX_STRING_LENGTH    8192
#define MAX_SKILL            300
#define MAX_CLASS            10

⚠ Common Pitfalls

  • Increasing MAX_STRING_LENGTH affects mob_index_data size; monitor RAM usage
  • MAX_SKILL requires corresponding skill table updates
5

Modify Makefile for Modern GCC

Add -fno-strict-aliasing to CFLAGS to prevent crashes from Merc's union-based type punning between OBJ_DATA and OBJ_INDEX_DATA. Remove -O3 optimization that breaks legacy pointer arithmetic.

Makefile
CFLAGS = -g -O2 -Wall -Wextra -fno-strict-aliasing -DNOCRYPT
CC = gcc
LIBS = -lcrypt

⚠ Common Pitfalls

  • -fstrict-aliasing is default in GCC 4.0+ and causes intermittent crashes
  • Do not use -O3; it optimizes out critical delay loops
6

Resolve Area File Vnum Collisions

Stock ROM areas contain overlapping virtual numbers. Before booting, scan area files for duplicate vnums between limbo.are and other stock zones that cause fatal boot errors.

check_vnums.sh
grep -h '^#\([0-9]*\)' area/*.are | sort | uniq -d

⚠ Common Pitfalls

  • Duplicate vnums cause immediate SIGSEGV during area loading
  • Backup area files before editing vnum ranges
7

Debug Initial Boot Sequence

Execute the binary under GDB to catch segmentation faults during area parsing. Set breakpoints in boot_db and load_rooms to identify malformed area files before daemonizing.

debug_session.txt
gdb ./rom
(gdb) set pagination off
(gdb) run 4000
# When crash occurs:
(gdb) bt full

⚠ Common Pitfalls

  • Never run as root; create mud user first
  • Ensure area.lst paths match actual .are filenames exactly
8

Configure Network Binding

Verify the MUD binds to 0.0.0.0 rather than 127.0.0.1 for external MUSHclient access. Check with netstat and configure UFW firewall rules for port 4000 or your chosen port.

network_setup.sh
sudo netstat -tlnp | grep rom
sudo ufw allow 4000/tcp

What you built

ROM 2.4 is now operational with modern security patches and memory limits. Next steps include customizing class tables in const.c, removing stock areas from area.lst, and implementing hotboot copyover support. Monitor syslog for crypt() deprecation warnings on newer glibc versions.