Golem: my hobby MUD project

What is a MUD?

A Multi-User Dungeon (MUD) is a text-based adventure in a shared network environment. Goontube with less videos and more killin’, and gods instead of mods. :black101:

Some feature more social, roleplay-centric mechanics like a text-based Second Life and others are aimed at an action hack-and-slash kill the monsters, get the loot, cast the magic spells, and level up sort of experience, where you’re responding to a rapid gameplay loop with your combat vitals in a line-based prompt. Some do not allow PVP, some allow intense PVP where all loot is dropped on death, some restrict various “severity of death” to different zones for gameplay reasons.

The themes of these games are varied from smurfs to sci-fi to old western to high fantasy to low fantasy to apocalyptic wasteland debaucheries, and some (many) have many themes coexisting in the same game world.

MUDs are typically delivered using the telnet protocol over TCP. Popular clients include MUSHclient and Mudlet. Telnet as a protocol allows the client and server to negotiate about terminal size and other capabilities without interrupting the the player’s text input and the game’s output using a series of “Interpret as Code” (IAC) statements.

Often ANSI escape sequences are used also to create visually engaging and colourful outputs:

End result is something like:

combat

what_is_a_mud

In the above screenshot instance, you can also see the output of my server app.

SomethingAwful-overlapping users might be familiar with these due to HellMOO. I personally spent a lot of time playing, coding enhancements for, and administrating these games over dial-up connections as a geeky kid, and I’d love to revisit them anew for nostalgia’s sake and possibly community-building/fun for goontube?

For about the last month I’ve been spending a couple of hours most nights after work to build one from scratch.

This is the basic “feel” of the game. Lots in common with the old ROM/SMAUG derivatives I spent the most time playing. I am stumbling through creating what I remember bit by bit, day by day.

I’m getting close to hosting a persistent alpha instance and allowing in public traffic, so I thought I’d start to post about it here.

Keeping the code open as I develop this, if anybody is interested in poking around, or familiarizing themselves with tech that might be relevant to future goontubes.

The work thus far has included a lot of plumbing to allow the basics to be possible, building the network server and implementing telnet protocol/basic gameplay loop stuff/CRUD stuff serializing info to a MySQL store/embedding and integrating a JavaScript scripting engine.

There is presently a core game where you can register/save/load player accounts with object inventories, combat is possible (and all scripted, so the combat engine can be swapped out without restarting the game server), learn and cast/use scripted skills/spells. We have a maze generator and we have a “dungeon generator” that connects multiple maze floors by their most circuitous paths.

I’m aiming to next create an ANSI map wilderness space that connects multiple “dungeons” together, along with a town/town square or safe “hub” area where autogenerated quests will give players a reason to go out in the first place.

The next steps will include a bit more thinking about gameplay mechanics and if it’s actually converging on a good game, text or not. I’m not looking to create something with endless runaway scope creep I can never finish, so a bounded experience with about 50 “levels” and a limited number of player classes/races/skills/spells is a good start. I’m going to keep it to fairly cookie-cutter medieval fantasy stuff for the time being.

We could expand on this later as a community project if anybody is interested in doing some world-building or making this an “us” thing, and this would be the thread for it.

Anyways, I’ll be following up with updates and hopefully later this week some details on how to connect to a persistent instance I’ll host.

4 Likes

Playing MUDs in the late 90s is how I learned how to type quickly, this is awesome

2 Likes

Small update but I worked this evening on completing groups/player parties, experience sharing on kill, and automatically joining a fight if members of your group are attacked.

1 Like

Already forked this and will maybe contribute after I get out of the nuthouse. Amongst all my future projects (like trying to v2p install gentoo and continuing to experiment with AGI) I will have to add learning go and refreshing my javascript skills.

1 Like

Hope you are doing alright Benikis, really excited that you want to join in and learn some Go. When you are able to check this out properly, the “roadmap” in the docs directory is what I’ll be keeping to. Right now my immediate goal is to just host an instance you can connect to and say hi or see the updates that I will continue to post here. Anticipating this over the weekend.

With the disclaimer that this is work in a literally incomplete state - do not expect to be joining a playable game for now - I have set up an instance this weekend that I’ll be keeping persistently online and up-to-date with the codebase, so that it’s possible to at least join and see something, or say hello in the game world.

Host: mud.jskarzin.org
Port: 4000

edit: CatPetter and Tnega were both able to help me to fix a couple of bugs already, a productive first day of running this thing outside of my local.

1 Like

I made a substantial update before bed and it required a DB wipe. Full hot-reloadable scripting support for objects and rooms, with a clear path for mobs too :toot:

e: tested with a red button in-game that when I press it, posts an HTTP POST request behind the scenes to “make it rain” in goontube :v:

Tnega put a trigger on and did a slime genocide for a day and a half, which made me realize I needed to make a little tweak today:

groupings

Where objects are listed, identical descriptions are now grouped and counted.

Yesterday evening I circled back to skills for a bit,

Until this point, the game could read player-skill associations from the database but wouldn’t assign them to players, making them unavailable without developer-y access to the database or pre-seeded skills in the data. The extra database models required are now loaded and skill attachments are made for PCs when they reach the appropriate level/job. A method to mass update PC skill %s to the database is added and invoked when PCs save.

There is now a trainer NPC in the dev area where you can use a new argument to the practice command to spend practice sessions to increase a skill. Practicing requires an in-room NPC to have the CHAR_PRACTICE flag set.

practice

There is a new ITEM_DECAYS flag for objects to self-expire them which gets automatically set on corpses in order to prevent the 200 body piles Tnega has been creating in the developer area test monster cell. Container objects decaying will “spill” their contents into the room.

decay

This weekend:

  • Going to try to make the maze attached to the spawn area a little bit more interesting by connecting scripting with “plane” areas (incl. mazes) and allowing connected scripts to do some light content generation

  • Trying to sleuth out a new (?) bug creating duplicate PC pointers in a room

It was a productive weekend of tinkering on this with a lot of help from Tnega testing all sorts of stuff and finding all sorts of bugs or edge cases I had not considered. Thanks Tnega!

  • The maze below the starting area is now full of aggressive monsters that hit harder but reward more experience.
  • There is still a pointer issue going on where PCs are getting removed from the game’s global character list and duplicating/other weirdness.

Hoping that by next weekend, the testing we’re doing is more about grouping up with another player or two to see how it balances out with parties in larger dungeons with more varied, generated NPCs. This isn’t meant to be a solo dungeon crawl.

did you do a pwipe or did I just forgot how to spell the name of my mage Moltoliquro?

1 Like

Wiped a couple times since the molt days

Right, given that I am afking killing slimes, I added a trigger to force me out of the abattoir. say #gonorth or ooc #gonorth and robotnega will… go north, out of the room.

1 Like

Sorted out some of the lingering bugs and moving on to new feature dev for this. Here’s a little demo video showing roughly where we’re at now.

Today’s little update may not be so thrilling from the gameplay side but it does showcase a few system-side features I worked on since last time and again this evening:

  • In the last couple of updates, I extended the game’s relationship to its scripting engine by allowing the scripting engine to hijack the input handler of the socket for an indefinite period of time, allowing more flexibility in how the flow of control for a user’s input is passed around the app… I wanted to be able to do more on the scripting side and less on the hardcoded side
  • To make use of this gobbledygook and validate that the scripting engine can be used for more involved systems, I implemented a generic line-based string editor that can be reused to allow a client to edit any multiline string
  • To make use of that text editor, I allowed it to edit the scripts that are used to handle the requests that hit an optional HTTP server for “webhooks”; the admin/developers users can create/manage webhooks and scripts all in-game without any external app or DB editing required
  • The video demonstrates creating a “webhook”, creating a script, editing the script with the scripted text editor, connecting and detaching the script from a webhook, visiting the webhook from a web browser, and editing the code in-game/hot reloading the code and seeing the immediate change

I’ve player-wiped about a dozen times mercilessly this week, forgive me, I’m doing the things :slight_smile:

Updates continuing to roll steadily:

  • Shops are in, with a shopkeeper placed east of the starting area and some items
  • It is possible to obtain and save gold now, in order to buy items from the store
  • There were several bug fixes and output-related quirks fixed thanks to a larger testing session this Sunday where ace, Tnega, TaoJones, and MrTophat all helped out and played around with the game so far

As more people start to get involved in poking around periodically, I want to make sure that I mention a couple of things:

  • There are still likely going to be regular player wipes at this stage in development, even though it’s a persistent instance, I’m often making structural tweaks where the fastest way to deploy is to wipe everything that exists. Things like stat progression and exp requirements are themselves likely to change, too
  • Tnega, maybe you can verify: I think player skills and practices are saving just fine, but you are experiencing me grabbing all the player records and porting them between player-wipes without also bringing over the skill relationship table. You’re saving after spending your practices, I grab player record with 0 practices and without the skills, you lost everything in the wipe
  • Anticipate 1-2 weeks until it is possible to start authoring some content in the game with special builder commands and having it save from session to session. When we get to this point, I’m going to stop nuking the DB every time and start actually using the migration strategy I’ve already set up.

double-dorkiness

pictured: gooning out like it’s 1996/goons between worlds.

Thanks for the Sunday testing session!

Next fixes coming are the group combat/refocusing combat stuff.

So far, looks like practices are now saving.
Minor bug report: sometimes aggro slimes spawn on the first tile of the dungeon, which is a safe area. They cannot attack,or be attacked.

1 Like

Items can be given to NPCs. Equipped items, when given, keep their equipped status, causing the recipient to instantly equip them.

2 Likes

I started messing around with a Slime focused story line:

Story:

Map:

LMK what ya think. Work in progress :v:

1 Like

This won’t happen again (after the next DB migration, anyways!)

Ouch, this one was a silly omission on my part since the “wear location” (if it is equipped) is just a property on the object and saves with the rest of the inventory. It is corrected now.