The MUD Connector

Mud Development and Administration => Advanced Coding and Mud Design => Topic started by: Maeglin - RealmsMUD on December 06, 2017, 11:12 PM

Title: RealmsMUD mudlib
Post by: Maeglin - RealmsMUD on December 06, 2017, 11:12 PM
First, a disclaimer: Way back in 1991 when I was in college, I started playing RealmsMUD. Soon after, I became a wiz, made an area, quickly shot up to "god", rewrote the core lib, graduated and found other pursuits. By about 20 years ago, I vanished from the scene. I've been a software engineer/architect for the last 22 years... I say this because:

In 2011, the mud was finally about to die. I came back on the scene and set it up to run on one of my servers. I decided that it'd be a fun project to modernize it (after all, too much of the lib was that horrible stuff I wrote before I knew what "responsible development" meant.) A bunch of the other wizards volunteered to help but never did. I wasn't surprised when everything failed, though I was a bit disappointed - I decided to not waste my time continuing to work on Realms.

In 2014, I began working on a Unity3D-based game based in a world I'd created. I spent the next couple years doing a small amount of development whilst herding voice actors and artists. Over the course of the next three years, I got a large portion of the roughly 800,000 lines of dialog I'd written acted out. I also decided to pay some artists for some amazing 3D assets. The easier parts of the game were done and "the world" was largely peopled. I'd resisted the urge to make it have any type of online presence but then at the beginning of this year, I decided to go ahead and do that.

But how?

I came back to the LPMud driver. I chose LDMUD-3.5.0 (the old Realms is currently running 3.2.17 and I'm hoping to do a compat layer to bring in the many tens of thousands of rooms in the old lib forward to the new stuff I wrote and this was the path of least resistance.) There were a lot of shortcomings about using an LPMUD backend, but it also has a ton of really useful stuff - from the technical side, it already has all the interesting network interaction stuff and is a pretty decent virtual machine for the "programs" it runs (players, monsters, rooms, items, etc). I began to hack the driver to suit my purposes and decided, "what the heck..."

I won't go into all of the details about what I implemented in the lib, but some of the more interesting things I did include:

- I wanted to practice sensible engineering practices. I set up a VSTS site (Visual Studio Team Services) to both use for source control (it's git under the hood) and project management (even as a team of one, it's useful to track features and their implementation progress). I also did a few minor hacks to the driver such that I could run it as a "compiler" instead of a driver. That way, I was able to set up a Jenkins server to do automated builds / execute and report a full suite of tests written for the mudlib.

- To that end, I created a gtest-like testing framework for LPC.

- I haven't kept up with what others are doing in the LP world, but I identified some core lib things that I needed - event handling and a UML state machine implementation, for example - and wrote them.

- I wanted to be able to build detailed quests/stories akin to what one might find in games like the Witcher series, Dragon Age, Mass Effect, etc. This includes things like complex, state-based quests and conversation trees (without guessing what to 'say'), research (think Civ-style but for various crafting, player background, guild, etc stuff), Crusader Kings-style (well, sort of) character traits.

- I implemented an ASN.1 lib for the driver (because, why not). I'm using it to transmit driver data to the 3D client I'm working on. The long-term vision is that people can either use telnet (or whatever text-based client they want) OR the 3D one.

- To that end, I changed the way that rooms are created. Instead of writing descriptions, you add objects to the environment. For those who have used any of the game editors that came with Neverwinter Nights, the Bethesda games, and others - it's like that. In text-mode, this gets translated via a "mad libs" style message parser I created and converted into a description. For the other mode, the objects/positions get sent raw.

The down side is that I added a ton of executional complexity. The act of a player hitting a monster can now trickle down into a few dozen cascading function calls... Since the hardware it's running on is pretty good (32 cores, 128G RAM) and it's the only thing running on it, the only real concern is the limitations of the LDMUD driver. I suppose I'll find those when I find them.

So, what was my point in posting this? Well, I wanted to let people know what I'm up to because I think (not to be immodest) that I've done a few pretty cool things. When I do release everything, the license should be pretty easy to follow (ie: do whatever you want with it, just give me credit).

Assuming there's interest, I'm perfectly happy to do some show-and-tell - this just didn't seem the appropriate time or post location to do so... and if anyone wants to dive in and create some stuff with it, all the better (though that might require doing so on a RealmsMUD instance I stood up - I haven't tried to detangle to be portable to other drivers as I did add some simulated efuns and a couple real ones (primarily around git and zfs support).