What's been the biggest coding challenge you've tackled during your 19 years with Sindome?
There are a few possible answers to this. Dealing with Grid 3.0 is high on my list of 'difficult' because it's so very different than coding in MOO. Another really difficult challenge was implementing XTerm256 colors in the MOO, from scratch. It was time-consuming, and a lot of code needed to be updated to handle the color tags. I'd say overall, though, it turned out pretty well. And it allowed us to remove some C code that was handling ANSI and eating the ^ symbol (anyone remember that? I sure do. Ate it when displaying verbs and messed up lots of regex's)
This question is about the biggest challenge, though… If we take it in sheer lines of code, I suppose it would be Grid 4.0. Another good one is a refactor I did to the way $vision works on players (and admin) to make it more extensible.
And moving us to ToastStunt from LambdaMOO, that was a pretty big one.
How has the MOO codebase evolved since you started? What were some of the major system overhauls you've implemented?
Hmm. How has it evolved... It's better documented now. A lot of legacy systems were written by different developers and then left untouched for a long time, but then they become such a core part of the game that no one wants to touch them. I love refactoring those systems.
We have also added a lot of awesome verbs to the built-in packages like $time_utils, $string_utils, $object_utils, $list_utils, etc.
Some big overhauls I've done (at various points, to varying degrees of success):
- Rooftops/edges and jumping/gliding
- Sniping
- Vision (to support things like colored drug experiences, cyberware, admin vision, etc.)
- Redid Tac-comps in like 2008.
- Motorcycles (moved and updated from Straylight Run)
- Drugs (full overhaul, done this like 3 times)
- PDS (full overhaul, at least twice)
- A bunch of admin commands like @attention, @paged-notes, (SQL notes in general), @grid, @lease
- Space saving (disk space) efforts have kept us relatively stable at ~200 megs for the past 5+ years (writing photos to disk was a big help here)
- Fixing mementos to work with maps
- Working off some vehicle combat issues
- Armor refactor (recently)
- Grid 3.0 mods/bug fixes since it was released
- Grid 4.0
This could be a very long list if I kept going. And I'm probably forgetting some big stuff.
What's your favorite piece of code you've written for Sindome, and why?
Grid 4.0 is my favorite system, thus far. I really liked coding King of the Mix. I have always had a fondness for "Dope Wars" styled games and used to make them back when I was a teen in Visual Basic.
But my favorite, by far, is a recent addition. We always have to present table-style data to players and admins, and it feels like anywhere we do that, we spend a ton of time writing custom presentation logic for it. I finally took the time to make a verb that does this, with a bunch of configuration options (and sane defaults). I use this everywhere these days. It's all over Grid 4, for example, and saves so much time. Here's the code for it in full:
How do you balance making new systems powerful enough to be interesting, but not so overpowered they break game balance?
Practice. Trial and Error. Staff feedback. Player feedback. Nothing works perfectly at first. There is always a transitive period between the idea in my head and how I imagine it working and being used, and how it is actually used. Balance is a constant struggle, not just because people use things differently and more inventively than I imagine, but because the play style and expectations of players change over time.
You wear multiple hats - coder, builder, GM, and loremaster. How do these different roles inform each other when you're working on the game?
I think you can add 'Community Manager' on there as well :) I see myself as a coder first these days. I think being able to do whatever needs to be done at any time is a blessing and a curse. It can be hard to focus on writing code when there is a BGBB thread blowing up with posts, or xhelps with people experiencing issues, or reports of people breaking the rules that need to be investigated, or SGMs to be trained, etc.
I treat Sindome as a marathon, not a sprint, and I encourage everyone else (on staff or the player side) to do the same thing, or risk burning out… There is always more work to do. Take things one step at a time. Figure out what the biggest priority is and focus on that.
In terms of how it informs what I'm working on, I read the BGBB, listen to staff, and am constantly surprised by what people think the biggest issues are. So I just keep listening and trying to understand what people need and what people want, and if that fits with what we're trying to accomplish with the game and its theme.
It's definitely nice to be able to take a project across all of the domains, from start to finish, on my own, if I want. Though I usually rely on the GMs or Builders, etc., to help, both for time and training purposes.
Don't think I've really answered the original question, but that's what I've got.
What's the most satisfying system you've built that players might not even realize you created?
It would have to be all the admin tooling I've created for the staff to manage the game effectively. When I first joined the staff, we had commands, most of which were not documented, and everything was passed down via tribal knowledge. The problem with that was that if there were gaps in that knowledge, everything was lost and needed to be relearned.
The automated, and semi-automated systems that the game has now are based on my own and others experience with what tends to fall through the cracks (missed xhelps, people standing at NPCs for hours pinging them every 5 minutes to see if a GM is available to RP, things falling off the $scheduler, people needing a coder to do stuff like service requests). I built all that so that our relatively small staff could keep up effectively with all the work.
I think the biggest time saver is probably the @lease system, which just automates the very time-consuming process of turning a lease over from person to person or person to NPC or NPC to person.
I also spent a lot of time in the badlands as a player, being banished, and it was unfun, so over the years I've tried to expand the offerings out there. Things like building fires, fishing, and such. It's not a complete and closed loop, but it's better than it was.
Oh! I know. The $dispatcher, NPC pathing, and elevators. Yeah, it's definitely those. NPCs use a combination of waypoints and depth-first search to find paths between places. This puts a lot of load on the CPU because the searches take a long ass time. I created an auto-expiring cache for pathing. This took a lot of load off the CPU and let us have more NPCs wandering around more often without noticeable lag. Then I implemented NPCs' ability to path through elevators, which was a very interesting problem. And then implemented the $dispatcher, which is what handles things like NPCs going to hang out at bars and order a drink automatically, gang backup, NPCs spraypainting, NPCs going and causing trouble at corps, NPCs taking taxis places, and more.
How do you approach debugging when players find creative ways to break your code that you never anticipated?
I rely on bug reports. The better the bug report, the less work I have to do to figure out what is broken. Oftentimes, though, I reach out to the player and have them show me what they did. Usually, the issue becomes clear at that point (if it was a system I wrote anyway) and I can fix it pretty quickly.
If it's not a system I created or am overly familiar with (robots, market mazes, dynamic space issues in general like flying, e-notes, Grid 3) then it's much more of an investigation into what the INTENTION of the system was, and if what we're seeing is a bug, or if it was an intended usage, etc. Those take a lot more time.
The faction system, combat engine, and character progression - which of these core systems do you think works best and why?
I think all of these systems work fairly well and don't require a lot of maintenance. They are accomplishing what they were intended to accomplish, with minimum fuss. Arguments can be made for all of them from a player perspective, on if players like them, but from a game systems perspective, they accomplish what we want them to.
What was Sindome like when you first joined 19 years ago versus now? What are you most proud of in terms of how it's evolved?
I joined as a player in 2003, so that's over 22 years ago.
I joined in June 2006 as a GM.
Sindome was the perfect game for me in 2003. It was mysterious. There was a hard learning curve. The community was friendly (mostly). People were very IC. There always seemed to be planning, plotting, murder, mayhem, and mystery. Most of it was player-driven because there were like 2 GMs.
Back then, though, everyone on staff was in every role (GM, Builder, Coder, etc).
I'm sure if we booted up a core from 2089, people would recognize the world. The biggest surprises would be the lack of coded systems. There were some deep systems, but they were few and far between.
I think the thing I'm most proud of in terms of evolution is the documentation changes we've made to improve the player and admin experience. No one likes writing documentation, but it's such an important process for teaching people. Especially as the complexity of the game has grown over the years.
I think we've grown with the times and the feedback we've received. The staying power of the game is what I'm most proud of, but I think that existed before I joined. I hope I've added to it, though.
You've seen countless players come and go - what player behavior or moment stands out as your favorite over the years?
- Assuming positive intent when interacting OOCly with other players and staff
- Recognizing that IC actions do not indicate OOC like/dislike of a person (IE, killing someone ICly doesn't mean you dislike them OOCly)
- Good bleed management
- Cool accents
- Playing to lift
How has your approach to coding for a roleplay-focused game changed over time?
When I started coding for Sindome, I wanted to make all the cool systems I wished the game had. Over time, that has been tempered to considering not just what would be cool, but the broader implications of how introducing a new system will impact the game. It has moved from 'what do I want the game to have' to 'what does the game need' to 'what roleplaying is this system going to add to the game'.
The sad truth is that there are some really cool things we could make, that would be awesome and themely and totally make sense for the universe. They would also destroy roleplay.
Any system we implement needs to be done with an eye towards whether it adds roleplay to the game or removes roleplay from the game.
Being able to pay your SIC bill remotely is a good example. Why the hell wouldn't this be possible? There is no good reason. At the same time, paying your SIC bill is a freaking adventure for some players that involves a fair amount of danger and possibly needing distractions and lots of other RP to make it happen. We don't want to take that away just to make it easier for the players who don't have any real RP associated with it.
Having predictable things people need to do also opens them up to the dangers inherent in a PvP game.
What's something you built early on that you'd do completely differently now with your current experience?
The WJF Tac-Comp revamp I did works pretty well, but I used some design patterns that I would not use if I did it today. It would be very different now.
Motorcycles were a great example of a system I made, and that has had to basically be completely redone multiple times because of the problems it had.
Sniping, paragliding, rooftops, gun mods, basically anything I coded before say, 2014, I have either already refactored completely, or wish I had the time to rewrite :)
What does a typical day/week look like for you as the primary coder? How do you prioritize what to work on?
From 2021 to 2024, I was entirely focused on fixing bugs. That's what I spent the vast majority of my time on.
Now that there are fewer bugs, I have found I have more time to focus on larger projects, such as the armor rebalance and now Grid 4.0.
I'm planning to continue focusing on Grid 4.0 for a while, as there will be bugs and new features I want to introduce. I'm also fixing bugs that I can work on.
Then, is there any support I can lend the GMs... I'm also helping with some builder tasks, documentation, and xhelps, and other typical admin stuff, and responding to posts on the BGBB and such.
In terms of priorities, I ask the staff and the players and base my decisions on what they are telling me + my instincts for what is needed, + what I'm motivated to work on. If I'm not motivated to work on something, I am not likely to work on it at this point.
How do you handle it when players discover bugs versus when they find creative intended uses of your systems?
There have been plenty of times I've discovered players were creatively using a system that they thought was fine, and I thought was a bug. When that happens, I try to understand the impact of the system as it is being used versus how it was intended to be used. Then I make a decision to fix or leave the system. In many cases, for balance purposes, it means fixing or at least modifying the system.
What's the most complex interconnected system in Sindome that players probably don't realize how much work went into it?
NPC movement and responses, maybe?
Any legendary bugs or crashes over the years that you can laugh about now?
I've crashed the MOO a bunch of times. We actually keep track of @mistakes that admins make so that future admins know it's OK to make a mistake. Here are a few of my highlights:
Fengshui (Sat Mar 25 16:29:55 2023 PDT): I manually @edit'd and saved the sic ads property and it was too big so it instead deleted everything.
Fengshui (Sat May 1 12:16:27 2021 PDT): monitored an admin, and then that admin monitored me, and that isn't supposed to happen so I created a monitoring loop which lagged out the whole moo and required luck and builtin programming verbs to fix.
Fengshui (Sun Jul 7 08:08:23 2019 PDT): I was processing a service request to reap a test character and reaped the admin that made the test character instead. #shouldhaveknownbetter
Fengshui (Sun Mar 10 12:02:45 2019 PDT): I wrote a verb to wrap text and it got some data I didn't expect which caused an infinite double while loop that required emergency holographic surgery to fix.
Fengshui (Sat Jul 14 11:24:52 2018 PDT): I manually created a character and copy and pasted an email which some how had a tab in it, and a day later the website started crashing because tabs are NOT allowed.
Fengshui (Sat Nov 4 15:30:51 2017 PDT): I was manually reaping players when the reaper broke, I reaped an active, logged in player by mistake.
Fengshui (Mon Sep 4 19:49:55 2017 PDT): A newbie forgot their character name so I wrote a bit of code that scanned all players and did a player.email_address == "[email protected]" to tell me their character name, only I forgot one of the = signs and overwrote every players email with this newbs email.
Fengshui (Wed Jun 7 19:32:01 2017 PDT): I was trying to clean up the MOO once and instead of moving all empty clips to my inventory I accidently moved EVERY ammo clip in the game into my inventory. It was several hours work to put them all back.
Fengshui (Wed Jun 7 19:23:30 2017 PDT): Once, I overwrote every account at the bank with nothing and we had to restart the entire game from a several hour old backup. Johnny was displeased.
Fengshui (Wed Jun 7 19:15:48 2017 PDT): I edited a very important verb that every other verb uses and broke the MOO for everyone. It took me several minutes to fix it and it got so bad that the MOO texted Johnny to alert him of the fuckup.
After 19 years, what keeps you motivated to keep coding for Sindome?
Sindome offers me a creative outlet for a variety of my passions (coding, management, community building, roleplaying, teaching).
How do you balance listening to player feedback while maintaining your vision for how systems should work?
I try to look at problems from all perspectives. I often implement things that I don't personally agree with because I'm convinced by the arguments of others.
What advice would you give to aspiring MUD/MOO developers who want to build something lasting like Sindome?
Surround yourself with people you trust and with whom you get along. If there is someone who is causing friction, you have to choose between working with that person to improve the behavior or removing them from your team (if you have the ability to do that). Either is a valid answer, but both have upsides and downsides. Learn from your mistakes. Expect others to learn from theirs. Hold yourself and others accountable. Celebrate successes. Take breaks. Write documentation. Keep at it.
There are a few possible answers to this. Dealing with Grid 3.0 is high on my list of 'difficult' because it's so very different than coding in MOO. Another really difficult challenge was implementing XTerm256 colors in the MOO, from scratch. It was time-consuming, and a lot of code needed to be updated to handle the color tags. I'd say overall, though, it turned out pretty well. And it allowed us to remove some C code that was handling ANSI and eating the ^ symbol (anyone remember that? I sure do. Ate it when displaying verbs and messed up lots of regex's)
This question is about the biggest challenge, though… If we take it in sheer lines of code, I suppose it would be Grid 4.0. Another good one is a refactor I did to the way $vision works on players (and admin) to make it more extensible.
And moving us to ToastStunt from LambdaMOO, that was a pretty big one.
How has the MOO codebase evolved since you started? What were some of the major system overhauls you've implemented?
Hmm. How has it evolved... It's better documented now. A lot of legacy systems were written by different developers and then left untouched for a long time, but then they become such a core part of the game that no one wants to touch them. I love refactoring those systems.
We have also added a lot of awesome verbs to the built-in packages like $time_utils, $string_utils, $object_utils, $list_utils, etc.
Some big overhauls I've done (at various points, to varying degrees of success):
- Rooftops/edges and jumping/gliding
- Sniping
- Vision (to support things like colored drug experiences, cyberware, admin vision, etc.)
- Redid Tac-comps in like 2008.
- Motorcycles (moved and updated from Straylight Run)
- Drugs (full overhaul, done this like 3 times)
- PDS (full overhaul, at least twice)
- A bunch of admin commands like @attention, @paged-notes, (SQL notes in general), @grid, @lease
- Space saving (disk space) efforts have kept us relatively stable at ~200 megs for the past 5+ years (writing photos to disk was a big help here)
- Fixing mementos to work with maps
- Working off some vehicle combat issues
- Armor refactor (recently)
- Grid 3.0 mods/bug fixes since it was released
- Grid 4.0
This could be a very long list if I kept going. And I'm probably forgetting some big stuff.
What's your favorite piece of code you've written for Sindome, and why?
Grid 4.0 is my favorite system, thus far. I really liked coding King of the Mix. I have always had a fondness for "Dope Wars" styled games and used to make them back when I was a teen in Visual Basic.
But my favorite, by far, is a recent addition. We always have to present table-style data to players and admins, and it feels like anywhere we do that, we spend a ton of time writing custom presentation logic for it. I finally took the time to make a verb that does this, with a bunch of configuration options (and sane defaults). I use this everywhere these days. It's all over Grid 4, for example, and saves so much time. Here's the code for it in full:
":tableify(LIST lines, ?MAP configuration) => LIST";
"pretty print a table of data with customizable options. useful for terminals, signs, etc.";
"";
"CONFIGURATION is passed as a MAP of optional key/value pairs. Sane defaults will be used if an option is ommitted. eg. [\"alignment\" -> \"right\", \"title_line_color\" -> \"bryellow\"]";
"[";
" \"alignment\" -> STR # default -> \"left\" # can be any of [left, right, center]";
" \"title_line_color\" -> STR # default -> \"brwhite\" # can be any $ansi:color, including normal";
" \"padding_on_cell\" -> INT # default -> 3 # amount of extra padding a cell should have";
" \"filler_character\" -> STR # default -> \" \" # can be anything passable to $su:left/center/right";
" \"include_breakline\" -> BOOL # default -> false # controls if a break line is placed between lines[1] (header) and the rest of the data in the table";
" \"breakline_fill_character\" -> STR # default -> \"-\" # can be anything passable to $su:space";
" \"blank_line_after_breakline\" -> BOOL # default -> true # controls if a blank line is placed after the break line";
" \"line_A_color -> STR # default -> false # controls the color of every other line, when false, no color applied";
" \"line_B_color -> STR # default -> false # controls the color of every other line, when false, no color applied";
"]";
"";
"Example Usage: ;me:tell_lines($su:tableify({{\"TITLE\", \"AGE\", \"BIRTHDAY\"}, {\"Mr President\", \"23\", \"January 3rd\"}, {\"Noble Grand\", \"50\", \"July 29th\"}, {\"Vice Grand\", \"22\", \"September 31st\"}}, [\"alignment\" -> \"left\", \"title_line_color\" -> \"bryellow\"]))";
{lines, ?configuration = []} = args;
"Set up the defaults for the configuration object, and validate the input";
if (!maphaskey(configuration, "alignment"))
configuration["alignment"] = "left";
elseif (!(configuration["alignment"] in {"left", "right", "center"}))
raise(E_ARGS, "alignment must be one of {left, right, center}");
endif
if (!maphaskey(configuration, "title_line_color"))
configuration["title_line_color"] = "brwhite";
endif
if (!maphaskey(configuration, "padding_on_cell"))
configuration["padding_on_cell"] = 3;
endif
if (!maphaskey(configuration, "filler_character"))
configuration["filler_character"] = " ";
endif
if (!maphaskey(configuration, "include_breakline"))
configuration["include_breakline"] = false;
endif
if (!maphaskey(configuration, "breakline_fill_character"))
configuration["breakline_fill_character"] = "-";
endif
if (!maphaskey(configuration, "blank_line_after_breakline"))
configuration["blank_line_after_breakline"] = true;
endif
if (!maphaskey(configuration, "line_A_color"))
configuration["line_A_color"] = false;
endif
if (!maphaskey(configuration, "line_B_color"))
configuration["line_B_color"] = false;
endif
cell_lens = [];
for line in (lines)
$cu:sin(0);
for x in [1..length(line)]
$cu:sin(0);
try
current_cell_len = length(tostr(line[x]));
except e (ANY)
$critical(line, x);
return;
endtry
if (maphaskey(cell_lens, x))
if (cell_lens[x] > current_cell_len)
continue;
endif
"our current line len is greater than the previous high";
cell_lens[x] = current_cell_len;
else
"we have no entry currently, so we save this one";
cell_lens[x] = current_cell_len;
endif
endfor
endfor
table_lines = {};
line_count = 0;
for line in (lines)
$cu:sin(0);
line_count = line_count + 1;
new_line = "";
for x in [1..length(line)]
$cu:sin(0);
"alignemnt will be $su:left or $su:right or $su:center";
new_line = tostr(new_line, $su:(configuration["alignment"])(line[x], cell_lens[x] + configuration["padding_on_cell"], configuration["filler_character"]));
endfor
"get the current line length before any ANSI is applies";
current_line_length = length(new_line);
if (line_count == 1)
"handle the title line colorization";
new_line = $ansi:(configuration["title_line_color"])(new_line);
elseif (configuration["line_A_color"] && line_count % 2 == 1)
"odd lines should be line_A_color";
new_line = $ansi:(configuration["line_A_color"])(new_line);
elseif (configuration["line_B_color"] && line_count % 2 == 0)
"even lines should be line_B_color";
new_line = $ansi:(configuration["line_B_color"])(new_line);
endif
table_lines = {@table_lines, new_line};
if (line_count == 1 && configuration["include_breakline"])
"handle the breakline after the title";
table_lines = {@table_lines, tostr("+", $su:space(current_line_length - 2, configuration["breakline_fill_character"]), "+")};
"include a blank line if we want one";
if (configuration["blank_line_after_breakline"])
table_lines = {@table_lines, ""};
endif
endif
endfor
return table_lines;
How do you balance making new systems powerful enough to be interesting, but not so overpowered they break game balance?
Practice. Trial and Error. Staff feedback. Player feedback. Nothing works perfectly at first. There is always a transitive period between the idea in my head and how I imagine it working and being used, and how it is actually used. Balance is a constant struggle, not just because people use things differently and more inventively than I imagine, but because the play style and expectations of players change over time.
You wear multiple hats - coder, builder, GM, and loremaster. How do these different roles inform each other when you're working on the game?
I think you can add 'Community Manager' on there as well :) I see myself as a coder first these days. I think being able to do whatever needs to be done at any time is a blessing and a curse. It can be hard to focus on writing code when there is a BGBB thread blowing up with posts, or xhelps with people experiencing issues, or reports of people breaking the rules that need to be investigated, or SGMs to be trained, etc.
I treat Sindome as a marathon, not a sprint, and I encourage everyone else (on staff or the player side) to do the same thing, or risk burning out… There is always more work to do. Take things one step at a time. Figure out what the biggest priority is and focus on that.
In terms of how it informs what I'm working on, I read the BGBB, listen to staff, and am constantly surprised by what people think the biggest issues are. So I just keep listening and trying to understand what people need and what people want, and if that fits with what we're trying to accomplish with the game and its theme.
It's definitely nice to be able to take a project across all of the domains, from start to finish, on my own, if I want. Though I usually rely on the GMs or Builders, etc., to help, both for time and training purposes.
Don't think I've really answered the original question, but that's what I've got.
What's the most satisfying system you've built that players might not even realize you created?
It would have to be all the admin tooling I've created for the staff to manage the game effectively. When I first joined the staff, we had commands, most of which were not documented, and everything was passed down via tribal knowledge. The problem with that was that if there were gaps in that knowledge, everything was lost and needed to be relearned.
The automated, and semi-automated systems that the game has now are based on my own and others experience with what tends to fall through the cracks (missed xhelps, people standing at NPCs for hours pinging them every 5 minutes to see if a GM is available to RP, things falling off the $scheduler, people needing a coder to do stuff like service requests). I built all that so that our relatively small staff could keep up effectively with all the work.
I think the biggest time saver is probably the @lease system, which just automates the very time-consuming process of turning a lease over from person to person or person to NPC or NPC to person.
I also spent a lot of time in the badlands as a player, being banished, and it was unfun, so over the years I've tried to expand the offerings out there. Things like building fires, fishing, and such. It's not a complete and closed loop, but it's better than it was.
Oh! I know. The $dispatcher, NPC pathing, and elevators. Yeah, it's definitely those. NPCs use a combination of waypoints and depth-first search to find paths between places. This puts a lot of load on the CPU because the searches take a long ass time. I created an auto-expiring cache for pathing. This took a lot of load off the CPU and let us have more NPCs wandering around more often without noticeable lag. Then I implemented NPCs' ability to path through elevators, which was a very interesting problem. And then implemented the $dispatcher, which is what handles things like NPCs going to hang out at bars and order a drink automatically, gang backup, NPCs spraypainting, NPCs going and causing trouble at corps, NPCs taking taxis places, and more.
How do you approach debugging when players find creative ways to break your code that you never anticipated?
I rely on bug reports. The better the bug report, the less work I have to do to figure out what is broken. Oftentimes, though, I reach out to the player and have them show me what they did. Usually, the issue becomes clear at that point (if it was a system I wrote anyway) and I can fix it pretty quickly.
If it's not a system I created or am overly familiar with (robots, market mazes, dynamic space issues in general like flying, e-notes, Grid 3) then it's much more of an investigation into what the INTENTION of the system was, and if what we're seeing is a bug, or if it was an intended usage, etc. Those take a lot more time.
The faction system, combat engine, and character progression - which of these core systems do you think works best and why?
I think all of these systems work fairly well and don't require a lot of maintenance. They are accomplishing what they were intended to accomplish, with minimum fuss. Arguments can be made for all of them from a player perspective, on if players like them, but from a game systems perspective, they accomplish what we want them to.
What was Sindome like when you first joined 19 years ago versus now? What are you most proud of in terms of how it's evolved?
I joined as a player in 2003, so that's over 22 years ago.
I joined in June 2006 as a GM.
Sindome was the perfect game for me in 2003. It was mysterious. There was a hard learning curve. The community was friendly (mostly). People were very IC. There always seemed to be planning, plotting, murder, mayhem, and mystery. Most of it was player-driven because there were like 2 GMs.
Back then, though, everyone on staff was in every role (GM, Builder, Coder, etc).
I'm sure if we booted up a core from 2089, people would recognize the world. The biggest surprises would be the lack of coded systems. There were some deep systems, but they were few and far between.
I think the thing I'm most proud of in terms of evolution is the documentation changes we've made to improve the player and admin experience. No one likes writing documentation, but it's such an important process for teaching people. Especially as the complexity of the game has grown over the years.
I think we've grown with the times and the feedback we've received. The staying power of the game is what I'm most proud of, but I think that existed before I joined. I hope I've added to it, though.
You've seen countless players come and go - what player behavior or moment stands out as your favorite over the years?
- Assuming positive intent when interacting OOCly with other players and staff
- Recognizing that IC actions do not indicate OOC like/dislike of a person (IE, killing someone ICly doesn't mean you dislike them OOCly)
- Good bleed management
- Cool accents
- Playing to lift
How has your approach to coding for a roleplay-focused game changed over time?
When I started coding for Sindome, I wanted to make all the cool systems I wished the game had. Over time, that has been tempered to considering not just what would be cool, but the broader implications of how introducing a new system will impact the game. It has moved from 'what do I want the game to have' to 'what does the game need' to 'what roleplaying is this system going to add to the game'.
The sad truth is that there are some really cool things we could make, that would be awesome and themely and totally make sense for the universe. They would also destroy roleplay.
Any system we implement needs to be done with an eye towards whether it adds roleplay to the game or removes roleplay from the game.
Being able to pay your SIC bill remotely is a good example. Why the hell wouldn't this be possible? There is no good reason. At the same time, paying your SIC bill is a freaking adventure for some players that involves a fair amount of danger and possibly needing distractions and lots of other RP to make it happen. We don't want to take that away just to make it easier for the players who don't have any real RP associated with it.
Having predictable things people need to do also opens them up to the dangers inherent in a PvP game.
What's something you built early on that you'd do completely differently now with your current experience?
The WJF Tac-Comp revamp I did works pretty well, but I used some design patterns that I would not use if I did it today. It would be very different now.
Motorcycles were a great example of a system I made, and that has had to basically be completely redone multiple times because of the problems it had.
Sniping, paragliding, rooftops, gun mods, basically anything I coded before say, 2014, I have either already refactored completely, or wish I had the time to rewrite :)
What does a typical day/week look like for you as the primary coder? How do you prioritize what to work on?
From 2021 to 2024, I was entirely focused on fixing bugs. That's what I spent the vast majority of my time on.
Now that there are fewer bugs, I have found I have more time to focus on larger projects, such as the armor rebalance and now Grid 4.0.
I'm planning to continue focusing on Grid 4.0 for a while, as there will be bugs and new features I want to introduce. I'm also fixing bugs that I can work on.
Then, is there any support I can lend the GMs... I'm also helping with some builder tasks, documentation, and xhelps, and other typical admin stuff, and responding to posts on the BGBB and such.
In terms of priorities, I ask the staff and the players and base my decisions on what they are telling me + my instincts for what is needed, + what I'm motivated to work on. If I'm not motivated to work on something, I am not likely to work on it at this point.
How do you handle it when players discover bugs versus when they find creative intended uses of your systems?
There have been plenty of times I've discovered players were creatively using a system that they thought was fine, and I thought was a bug. When that happens, I try to understand the impact of the system as it is being used versus how it was intended to be used. Then I make a decision to fix or leave the system. In many cases, for balance purposes, it means fixing or at least modifying the system.
What's the most complex interconnected system in Sindome that players probably don't realize how much work went into it?
NPC movement and responses, maybe?
Any legendary bugs or crashes over the years that you can laugh about now?
I've crashed the MOO a bunch of times. We actually keep track of @mistakes that admins make so that future admins know it's OK to make a mistake. Here are a few of my highlights:
Fengshui (Sat Mar 25 16:29:55 2023 PDT): I manually @edit'd and saved the sic ads property and it was too big so it instead deleted everything.
Fengshui (Sat May 1 12:16:27 2021 PDT): monitored an admin, and then that admin monitored me, and that isn't supposed to happen so I created a monitoring loop which lagged out the whole moo and required luck and builtin programming verbs to fix.
Fengshui (Sun Jul 7 08:08:23 2019 PDT): I was processing a service request to reap a test character and reaped the admin that made the test character instead. #shouldhaveknownbetter
Fengshui (Sun Mar 10 12:02:45 2019 PDT): I wrote a verb to wrap text and it got some data I didn't expect which caused an infinite double while loop that required emergency holographic surgery to fix.
Fengshui (Sat Jul 14 11:24:52 2018 PDT): I manually created a character and copy and pasted an email which some how had a tab in it, and a day later the website started crashing because tabs are NOT allowed.
Fengshui (Sat Nov 4 15:30:51 2017 PDT): I was manually reaping players when the reaper broke, I reaped an active, logged in player by mistake.
Fengshui (Mon Sep 4 19:49:55 2017 PDT): A newbie forgot their character name so I wrote a bit of code that scanned all players and did a player.email_address == "[email protected]" to tell me their character name, only I forgot one of the = signs and overwrote every players email with this newbs email.
Fengshui (Wed Jun 7 19:32:01 2017 PDT): I was trying to clean up the MOO once and instead of moving all empty clips to my inventory I accidently moved EVERY ammo clip in the game into my inventory. It was several hours work to put them all back.
Fengshui (Wed Jun 7 19:23:30 2017 PDT): Once, I overwrote every account at the bank with nothing and we had to restart the entire game from a several hour old backup. Johnny was displeased.
Fengshui (Wed Jun 7 19:15:48 2017 PDT): I edited a very important verb that every other verb uses and broke the MOO for everyone. It took me several minutes to fix it and it got so bad that the MOO texted Johnny to alert him of the fuckup.
After 19 years, what keeps you motivated to keep coding for Sindome?
Sindome offers me a creative outlet for a variety of my passions (coding, management, community building, roleplaying, teaching).
How do you balance listening to player feedback while maintaining your vision for how systems should work?
I try to look at problems from all perspectives. I often implement things that I don't personally agree with because I'm convinced by the arguments of others.
What advice would you give to aspiring MUD/MOO developers who want to build something lasting like Sindome?
Surround yourself with people you trust and with whom you get along. If there is someone who is causing friction, you have to choose between working with that person to improve the behavior or removing them from your team (if you have the ability to do that). Either is a valid answer, but both have upsides and downsides. Learn from your mistakes. Expect others to learn from theirs. Hold yourself and others accountable. Celebrate successes. Take breaks. Write documentation. Keep at it.
(Edited by Mench at 12:19 pm on 8/1/2025)