DevLog #1: WorldEditor.exe


About a year ago, I wrote a short story called Relic.

Creative writing really isn’t my scene, but the idea for that world got stuck in my head and demanded a sort of quick artistic pressure release. This was also shortly after I had just finished replacing my old website (a single page of HTML written in Notepad as a joke) with the new version you see today, so coincidentally I now had both a place for such a story to exist and the excuse to write it. I typed it up in an evening and dumped it online for absolutely nobody to read, like sweeping mental debris out to the curb for the weekly pickup.

That plan didn’t turn out as expected. Instead, it’s been lodged stuck in my brain for over a year now. I can’t stop thinking about it. Like a mold, it creeps up on me anytime I’m not actively occupied by something else. I wasn’t rid of it yet.

As any fellow Dungeonmaster can likely relate to, this new project started - like it always does - with jotting down dozens of whatever silly fragmented and incomplete ideas came to mind on my phone: “robot that looks like a frog”; “circuits charged with magic”; “alchemist vending machine”.

Next come the random doodles. I had an empty notebook laying around that I had purchased on a whim at a local renfaire the year prior. I had zero plans or purpose for it when I bought it, I just thought it was neat. Now though it would fall victim as the canvas for someone with terrible handwritting and no real drawing skills.

The last stage is where it all coagulates into the dreaded Mega Spreadsheet.

Cropped screenshot of tabs in a spreadsheet document.

My god, it’s terminal.

So over the course of the last year, I would occasionally spend a month or two experimenting with poorly-made yet technically functional game prototypes just to see how some of those ideas worked out. Typically this meant coming back to poke at whatever I had made in my previous run, throwing large portions of it out, then rebuilding it back up, slowly dragging everything that doesn’t get left behind closer to the goal, wherever that is. The oldest stuff tends to be what gets thrown out at the time, and there’s very few things that haven’t been thrown out at least once already.

Now that I think about it, I believe the oldest individual file that remains is the model for the aforementioned robot frog. His time draws near.

I should mention I’ve never had the chance to be behind the scenes in a professional gamedev setting. My most relatable technical experiences here are a combination of writing and maintaining software tools for use in a corporate IT environment, and, uh, a few years (in the cosmic sense) of modding and working with editors/makers (shoutouts to the members of KanjiHack, as well as Don Miguel and Stifu for their bootleg RPG Maker 95 translations that got me started on that path.) We’re basically reverse-engineering ourselves a new game, like if an automobile manufacturer suddenly decided they were going to pivot to making a space shuttle. I have no doubt there are better and quicker ways to achieve what I’m trying to do, but finding my own solutions is part of the fun here.

I don’t have anything flashy to show in action, as everything is still greyboxed and a few critical pieces are actively being gutted and rebuilt:
— Multiplayer networking currently only exists in the absolute minimal definition. As in, you can successfully send and receive host/join/leave packets between multiple clients, but that’s it. At one point it was possible to join a map and bump your sliding character models menacingly at each other. Not even remotely functional right now though.

— I completely tore apart my input handler and player controller, separating them from each other and giving them each a rewrite. The fun part about this is that I can now redirect input streams (mouse/keyboard/controller) to any single ‘unit’ of my choosing on the map, as opposed to only the dedicated player controller. Units can even declare themselves the new active input recipient, stealing input away from whatever the previously active controller was. (I’m not sure how much use I’ll get out of those features, but it was a fun detour.) The player character controller was upgraded from a single ‘does-everything’ state machine with fixed results to a resizable multi-state manager. These are back to being functional and stable, but not complete.

— Animation playback was still entirely raw and hard-coded in unacceptable ways. Each model had their own bespoke code meant to handle their own animation trees that didn’t behave consistently and predictably between them. The process of getting models and animations configured and ready for use is definitely where I’m the worst off, so if I ever want to get out of the prototyping phase that workflow needs a new approach.

To experiment with that, I started working on an in-game model viewer (just as a tool, not a feature of the game itself) that would help get me thinking about how I might undo these bad examples and define some vague standard that I could start carrying forward. The goal would be to minimize manual hookups in code as much as possible, add support for setting custom colors, add better support for attachments, and to let as many things fail as gracefully as possible and not cause the entire application window to crash if something unexpected happens.

Application window showing a green-hair elven character model in the center. On the right, a list of options and setting selections used for tweaking the state of the character.

So, here’s where we’re at with that. Blender models are imported as a custom Asset3D class, which can be used to query or set various generic properties related to the model, like checking what animation tracks are available or setting new color values on any available “channels” (limited to just hair, for now.) Attachment mounting points and color channels still require a (very brief) one-time manual setup, but I’m OK with that as it requires considerably less effort than what I had to do before. Improving how attachments work is the current annoyance I’ve yet to solve, but everything else has come out pretty nice. I also still need to add mouse controls to the camera viewport, but that’s more of a convenience feature and not an important part of this exercise.

I originally wrote most of this log nearly two weeks ago, but I kept making such good progress that I kept having to change it! I think this might be the longest post I’ve written on the entire site, so if you made it all the way through, thanks for your time. I suppose I have already obligated myself to do another one of these in the future since I put a number in the title. For fun, here’s a few extra screenshots showing some of the previous iterations of one of the playable character models.

Four distinct pictures showing the same elven character model, but in various unfinished states.

← return to /txt