Minerva Labyrinth - a dark magical girl dungeon crawler

I had to be away from game dev again for a while for medical reasons. I am still recovering and I can’t sit at my normal workstation, but I got back into it this weekend and did a bit of itemization and enemy design work. Hopefully I will get to my new normal soon and can get back to work on the game.

In terms of content, there is only one dungeon level left to design and build, including the final boss, plus some bits left to fill in on a few other levels. Once that’s done, I will be in the finishing stage. Sound and music are the biggest things left unfinished, and are also what I have the most trouble with.

I also really need to start thinking about how to actually release this thing. Putting it on Itch is easy, but I’ve never tried to release on Steam before.


I got sidetracked today into experimenting with new status icons. The old ones are on top and the potential new ones are on the bottom. I have gotten feedback, and I tended to agree, that there were too many different status icons and not enough consistency. I wanted to reduce the number of different icons (the ones shown here are not even all of them; I will probably consolidate some similar ones) and use more consistent visual language, so that the player doesn’t have to remember or look up as much.

Effects were already essentially categorized into stat buffs and debuffs, damage or healing, modal control effects, and other special or bundled effects (mostly used by players). I color-coded these more or less by category and by friendly or hostile status, and simplified buffs and debuffs so that effects that change the same stat use the same basic icon. I also darkened the borders to reduce the visual clutter.

I think these look pretty good in isolation here on the help screen, but testing it out in combat raised some additional questions about visual clarity, which I am thinking about how to address and might post about later. In the mean time, feedback on what I have so far is welcome.

oh this is totally on a very smart path. the challenge here is definitely being a bit more distinctive with the yellow icons, for sure.

I’m not sure if this is really a fix or just a bonus thought, but, what about finding more than one spot in the UI to include the icons, where relevant? For example if I have Seal applied to a character, yes you can grey out the actions in the menu, but maybe throw the Seal icon inline with the action names to let players know what exactly is the source of that change. If a SPD buff is affecting the scaling on an ability I could use, throw that inline too so I know it’ll be weaker or stronger than normal.

Or even small adjustments like having specific positioning around the portraits, for example keeping Guts/Defending icons close by the health bar specifically to indicate their relationship with survivability.

Interesting ideas, it does give me some thoughts on how I can communicate the impact of certain effects. The biggest difficulty working at this low resolution is fitting in all of the information that I want to convey and making it readable.

First-person combat view in Minerva Labyrinth. The party is facing three reptilian bipeds with drooling split faces and blades for forearms. The player opens a status window showing the first character's name (Mila), HP, MP, and list of several active status effects with duration and description. The player selects each combatant and turn and the window updates for each one. Since players are at the bottom and enemies are in the middle and top, the window moves to the top or bottom automatically to obscure the subjects less.

Here is a quick look at the new status readout panel for combat that I am working on right now. I have actually wanted to add this for a pretty long time, but now seemed like a good time, since it is immediately relevant to my concurrent work with status icons. This panel lets you quickly scan through all combatants to see exactly what status effects they currently have, as well as the exact HP/MP for players (I may add a skill at some point to enable seeing this for monsters). Selection uses the standard targeting menu and updates immediately on highlighting a target. I’m not sure if this works exactly how I want it yet, but it’s a big step for better communication to the player.

Also visible on the player portraits is a different way of displaying status duration. When I was testing out the new color-coordinated icons, I felt that the loss of color distinction made them a bit harder to identify when partially obscured by a number. This might have always been a problem that I just didn’t see, since I am very familiar with all of the icons by shape and color, but players won’t be. Anyway, I added an option to display the duration (up to 3 rounds) in little white pips instead of a digit, which I think improves readability at a glance. More than 3 pips starts to get too small to see, but more than 3 rounds is also a pretty long time, so the exact number is not as important (and is still visible on the new status panel, if you need it). You can select pips, digits, or no display, and players and enemies can be configured separately, as they are in this GIF.

As a side note, I really like Godot’s GUI tools. Themes make it easy to ensure that each menu has a consistent look and feel, and containers do most of the sizing and positioning work for me. Adding the new “Status” button to the combat menu was as simple as copy and pasting an existing button and editing the copy, no need to recalculate, reposition, and resize everything by hand, like I had to do in Unity. The new panel just holds a flow container with a bunch of child elements that arrange themselves automatically. The panel even dynamically expands itself when needed (I have to tell it when to shrink again, but it’s a single method call, no calculations needed).

GUI work will never be my favorite thing, but I find it a lot less painful in Godot than in Unity. It has exceeded my expectations by supporting the detailed interface I needed for this game while also making it fast and easy to build and iterate, once I learned how to use it.

Lots of miscellaneous work over the past week or so.

My final dungeon level is implemented, except for the final boss, but needs some visual polishing. I tried something slightly different this time, so I’m not sure yet if it worked out, both visually and in terms of gameplay. I have not playtested the final dungeon yet at all other than just making sure the scripting works, so it’s still a rough draft. It might be too mean, or not mean enough. It’s comprised of four levels and is (rightly so) the most complex of all the dungeons, so it was a lot of work to build it all. It’s also the only dungeon to be built from scratch in Godot, rather than being converted from Unity.

Aside from that, I have been cleaning up some rough parts of the game rules that have needed attention for a while. I am not making major rules changes at this point, but I do want to refine a few things that aren’t quite where I want them. It’s not the perfect RPG system, but I think it works well enough. There will be plenty of opportunity to revise it in the next game. The rules for Minerva Labyrinth are already dramatically more advanced than the rules for MM0.

I also added a few small features. One is a unique equipment effect that has been on my to-do list for a while. Another is an optional confirmation box for fleeing combat, instead of immediately attempting to flee after clicking the flee button. I accidentally click that way too often and wanted to stop those mistakes, but I also added the option to turn it off, for people who are not as careless as me.

Speaking of fleeing, you actually get a small cumulative bonus to your chance to flee for every failed attempt, but this wasn’t apparent to the user. I updated the Flee command so that it reads “Flee (+X)” after a failed attempt to show your current bonus.

Finally, I added one more improvement to the combat GUI, which twky gave me the idea for. If a character’s turn is skipped because of a status effect like stun or fear, there is now a popup that says “skip” along with the effect icon. Previously the timeline just skipped over them completely, unless they had other effect resolutions that produced popups. I am thinking this will help communicate that someone is currently disabled and why, though I might add an option to turn it back off, as well.

Minerva Labyrinth trailer

I made a trailer! Not sure how to embed it, so here’s a link. I have never made a trailer before, so it was a learning experience. I also have my Steam capsule assets ready to go, though I probably should have registered a Steamworks account a long time ago, since I guess there’s a lead time in getting it set up. It was just never something I thought much about or prioritized.

Fingers crossed for 2025.

This week I filled out and submitted my Steam page for approval (there’s a lot to fill out) and also spent a lot of time on making the game a bit more presentable. The Steam Next Fest is in June (not the next Next Fest, the next Next Fest after the next one) and I would like to have a demo ready at least by then. Six One Indie is also doing their showcase next month and I think I will try submitting to it, though I don’t expect to get in.

I could technically set up a demo build right now, but I’m not quite ready to show it yet because it still has some rough spots. Some of the things I have been working on are updating some early-game art and music that I wasn’t happy with, adding another hairstyle and hair color or two, and creating an on-screen keyboard for name entry with a controller (this was the only part of the game that wasn’t controller-accessible). Today I have been redoing most of my sound effects. The sounds currently in the game are from Tower of Metal, which I made very quickly during the jam period and without taking much time to figure out how BFXR works. My results today are noticeably better, I think, but I still have some work to do.

One new thing on my to-do list is to add controller glyphs. This is required to list full controller support on Steam. I don’t know why I need to show a picture of the A button when I can just print [A], but I should probably do it if I can.

Steam page is live!

Meanwhile, I did get controller glyphs working. It actually wasn’t too much trouble, so I went ahead and made all three major glyph sets, with the option to choose the one you want. I also cleaned up some rough spots in the rebinding menu while I was at it. I think I can safely claim “full controller support” now on Steam.

Heck yeah, congrats on this milestone!

Really appreciate the option to manually choose the preferred glyphs. I almost exclusively use steam input (for the screenshot button to work). And so in any game with auto-detect only i always get shown xbox glyphs no matter the controller. Somehow all big games fail to implement this

I’ve been doing a lot of work to get the game as polished and presentable as I can so that I can release a demo. I’m not sure though what the best timing is. Should I get as many nice-to-have features in as I can? Or just release as soon as the must-haves are done?

Valve for some reason suggests waiting until the first day of Next Fest in June to release it, but that’s three months away; I’m not sure how it benefits me to wait that long?

I would say go for it!

The main benefit is going to be that next fest will offer magnitudes more “foot traffic” than launching a demo independently, because steam will at least group the game in lists people sift through. launching the demo outside of that would leave it up to you to drive any and all clicks, at this point. that’s if you trust the coming next fest won’t be swarmed by fake ai games trying to game the charts. there are a lot of lets players and such who dedicate time to next fest specifically as a chance to do some ‘curation’ and find new things. its maybe one of the better things to come to steam as a platform since it opened the gates for anyone to list games for $100

If you are planning on doing any sort of playtesting leading up to the release of a demo, 3 months sounds like about the right timeline to me, because you will likely need a bit of leighway for testers to fit into their schedule both playing the game and writing some feedback. so if you feel like you can assemble the demo faster than three months, that’s what I’d spend the remainder of the time trying to organize leading up to a public demo release for next fest

I definitely intend to participate in Next Fest, but I don’t strictly need to hold the demo until then in order to do that, unless I’m mistaken. I have had some playtesting on the demo already, but not on the full game just yet. I’m not planning a major playtesting push, because finding playtesters for something like this is very difficult and I gave up trying, honestly.

It’s possible that I might receive some public feedback from a demo, but probably not, since I lack the will to market it very much. The Steam page does get some traffic (from where, I’m not really sure), so I like the idea of having a demo available. Itch only publicly lists games that have a download or web player available, so ML gets basically zero traffic there, whereas MM0 still gets regular visits and downloads.

I just published my free demo on Steam and Itch! Links are in the OP.

Getting this ready to release was a ton of work. Time to take a breather (assuming nothing breaks immediately) and then get back to work on finishing the rest of the game.

After fixing a couple of issues in the demo and completing a few other items from my to-do list, I took a break from development this weekend and did some sprite work. There were quite a few outstanding enemy sprites from the late game, some recolors and some brand-new, and I made a lot of progress towards finishing these. I believe these are the only art assets left to create. My current objective is to have all content 100% finished and playable through the end of the game.

Over the past month I have mostly been cleaning up a lot of issues and blank spots in the rest of the game (after the demo ends). This means filling in missing art, doing a writing pass over a lot of the rougher text and dialogue (there was one scene in particular that I struggled with for a few days), fixing a number of bugs that have been low priority until now, cutting an idea or two that didn’t work out, and drawing and scripting the final boss (still in progress).

I have also released two more pretty sizable patches for the demo, cleaning up a lot of (mostly minor) errors left over from the Unity conversion and adding a few QoL features. I am actually still iterating on the first level, the subway. This has been the part of the game that I have gone over the most. This is partly just because it’s the oldest, but mainly because it’s a fairly linear prologue and tutorial, and getting the balance and pacing of exposition, tutorializing, and actual gameplay, while trying not to give the wrong impression of the real game, is really hard. Among other things, I trimmed some of the more front-loaded dialogue, which I think makes the first few minutes flow better (and the first few minutes are important).

One request I have gotten from several people is to be able to hold down a movement key to move continuously in one direction, so I decided to implement that. I thought this would be relatively simple, but it ended up being ridiculously complicated. Following are the dry implementation details, which I just really felt like talking about.

Since the game is grid-based but still animates motion, my input handling buffers a direction for a short time, then processes it when the player is able to move again (with no buffer, movement feels too staccato). In order to get the feel of continuous movement right, so that it carries the player along intuitively without feeling too slippery, I had to:

  • Refactor movement input buffering from the player mover class into the input handler. This is probably a better place for it, but the buffering dates back to the original jam code, long before I even had a dedicated input handler class.
  • Adjust the buffering behavior to also keep track of the held movement key, but only after a short delay. With no delay, it is very easy to accidentally move twice.
  • Process turning and sidestepping while “running.” This way, the player can make turns or adjustments without interrupting their momentum and having to wait for the delay again. However, the standard buffer (0.08 seconds) is too short for this; when testing it out, I found that I was rarely able to time it correctly. My solution was to suspend clearing this buffer as long as a movement key is held down, which gives a lot more leeway.
    – My first solution for handling additional movement input was to have sidestepping take over as the new run direction, but I found that I didn’t like this. I was much more likely to want to correct left or right and maintain the same general direction than I was to suddenly want to run to the side or backwards without watching where I was going.
  • Implement the same behavior for the on-screen movement arrow buttons (not something I like to use, but some people do). These originally issued a buffering request directly, but I found that the best solution was to simulate an input event and let the input handler process it like any other (luckily Godot has built-in functionality to do this).
  • Do all of this without altering the current behavior of press-and-release input handling.
  • Fix A LOT of new input bugs. These were mostly around either buffered input being processed (or cleared) when it shouldn’t be, or around held input not being released when it should be (the click buttons were the worst about this, because they have a tendency to get stuck in certain circumstances). One of the most alarming - something I hadn’t even thought about until I just happened to test in an area where it could happen - was the player dying instantly upon touching a hazard wall. This was because movement wasn’t being halted properly on touching a wall, so the trap damage script just queued up a few dozen copies of itself.
  • Fix some existing input bugs, too, that were uncovered by all of this effort. Unsurprisingly, my input code wasn’t the best, being (by necessity) one of the first things I wrote when I migrated to Godot.
    – The biggest problem was one that my brother found while streaming to his Steam Deck using a PS4 controller. He was getting stuck in the items menu, with the GUI SFX indicating that the game was hearing his input, but often not returning him to the field. It took me several hours to figure out how to reproduce this, and it turned out to be because of analog noise. Analog sticks have a tendency to jitter a bit and feed useless input to the system even while apparently at rest; this is partly what deadzones are for. However, Godot defines deadzones per action, not per physical input, so this jitter still sends an input event through standard processing (efficiency fail). My problem was that I was routing all the menu input and such in _UnhandledInput - which can be called multiple times per frame, and thanks to the analog noise, often was. This meant that e.g. the item menu key could be processed multiple times per frame, thus closing and then re-opening it. I solved this (at least, I think I have solved it) by moving the command routing into _Process, so that it only happens once per frame. This is probably where it should have been in the first place.
    – Naturally, THAT change messed up the frame timing of scripts that relied on the popup dialogue window, because now pressing a button to continue was handled after _Draw, instead of before. This caused the text window and some other GUI elements to flicker between scripts. I solved this by changing some wait-for-next-frame code to wait-for-signal code. The funny part is that waiting for the next frame was originally a solution for GUI elements flickering.

Here’s the final product in motion.

All told, this took the better part of a week to implement, most of which was testing and bug fixing. It is actually a good thing that I decided to work on this sooner rather than later, since it exposed some flaws in my input handling that were causing actual problems. I finally pushed it live last night, along with some other fixes and improvements. Now I really need to get back to finishing the post-demo content.

I have mixed emotions about my demo being live now, but it is probably for the best that I released it well in advance of Next Fest, so that it can be in the best possible shape. If I had waited to release it, a lot of the issues I have addressed over the past month would probably have stayed undetected. I was already mortified when one player experienced a hard lock early in the game; having that issue live during Next Fest would have been a disaster. I don’t expect a lot of traffic from Next Fest, honestly, but if I am going to participate at all, I might as well give it the best showing I can.

I make it a point of pride to at least deliver a smooth and working experience to the player. Crashes, visual glitches, gameplay and input bugs, and so on are unacceptable to me in my own work, to the extent that I can realistically prevent them.