Minerva Labyrinth - a dark magical girl dungeon crawler

Checkbox: display demo download button as more prominent green box above the list of purchase options

OK, so, pro tip. Find this option under Special Settings and check it. Otherwise, your demo MAY or MAY NOT appear in a big green box, instead of a tiny unnoticeable link in the sidebar. I say may or may not because I didn’t have this box checked, but I always saw the green box, even when not logged in or with the demo not claimed on the active account, and no one has mentioned it not being there until today. I don’t understand why that is, but it’s stupid that this is an option at all, let alone disabled by default, and I am very upset that I wasn’t aware of it or the problems it was causing until now.

Much has changed in the past five months. Two playtesters have completed the game and gave a lot of good feedback. I also participated in Feedback Quest and gathered a lot of feedback there: some very positive and some very critical. I’ve made tons of GUI improvements; iterated on my dungeon designs over and over; done a thorough writing pass to clean up the gaps and inconsistencies left over from early development; revamped several classes and skills, and added some new ones; completely overhauled the way the tutorial works and how the rules are documented in-game; and more.

My internal target date, which I loosely set at the beginning of the year simply because Steam requires one, was September 1st. I tried hard to be ready by that date, but I just wasn’t, especially since that was right in the middle of Feedback Quest. Delaying it was the right decision, because I think it’s in much better shape now than it was even six weeks ago. I wish Feedback Quest had happened earlier in the year, but I’m glad I participated.

It’s almost ready, though. I should be able to announce a release date pretty soon.

This entire year has been a much more difficult crunch than I anticipated, though for once that is of my own making, since I am determined to release in 2025. I have largely stuck to the original scope of what I wanted to create, but I underestimated the massive amount of polish and iteration that was still needed (or put another way, I overestimated how production-ready it was). It’s all for the best, though. Every playthrough I do feels better and better.

That said, this is still a humble game. The press will not notice it, it will not win awards, it will not attract viral attention, it may not even hit ten Steam reviews (the threshold to stop being shadowbanned, apparently). It is not that kind of game, and was never going to be. But it’s my game, made exactly as I wanted to make it, or as close as I could get, at least. That’s why I do this in the first place. If I’m not making what I want to make, then what am I even doing?

Looks like the release date will be November 5th.

It’s finally out!

Congratulations on the release!!! I’ve done my part in passing around the proverbial same 7 dollars, will check it out as soon as i am able!

Awesome, thank you! Would love to hear your thoughts when you have a chance.

hey congrats on the release! I’ve picked up my copy as well when you announced in the thread + throwing a link on the frontpage shoutbox until someone reminds me months from now that it’s still up there :)

Thanks, I appreciate the support. I’ve been taking a break from it for a few days to do other things (like play indie games), but there’s more work to do. I’d like to write a post-mortem on Itch as well, when I have the time and energy. It has been an eventful five years.

I am also thinking about what dungeon crawler I want to make next, which honestly is going to be influenced by how much new work I will have to do for it. I don’t want my next game to take another five years. ML2 would obviously be the most straightforward, but I’d also really like to get back to the tech fantasy setting that I started in Tower of Metal.

In the mean time, for anyone who gives ML a try, would you consider leaving a(n honest) Steam review? It helps out with visibility, since you have to get to 10 reviews before Steam will put you in the discovery queue.

I never ended up writing a full post-mortem. There’s a lot that I could talk about, given how long and difficult the development was, but it turns out that I don’t really want to, after all. Besides being a lot of effort to write, I think a lot of it just feels like stuff that I don’t want or need to revisit. Maybe after a while.

Anyway, the launch went alright. Nothing shipped seriously broken, I’ve put out a few small patches, and I made it to eight Steam reviews. There were some features like difficulty settings that didn’t make it in for launch that I could potentially add, but right now I am more interested in thinking about my next game.

I just released my 1.0.7 update, which has a lot of updates to skill balance and a few other things. Some of the updates are things that I’ve been thinking about addressing for a while, but wasn’t sure about or didn’t have the right perspective so close to launch. I also polished up a few things that I didn’t get to until now, like adding color-coding to item descriptions to match skill descriptions.

I’ve also been working out what I want to change for my next game. I’m not totally happy with my RPG ruleset, so I’m trying to streamline and improve some things. I’m also trying to do this with an eye towards making my own life easier; a lot of the data management for ML1 involves too much manual tweaking, and I want to simplify that if I can.

In other news, I finally made it to ten Steam reviews. Here’s the impact that had on my traffic:

The moral is to always leave reviews for indies, it’s crucial for visibility.

I haven’t done a significant discount yet, just 10% at launch and again for the winter sale (I released in November, so I didn’t want to cut more than that so soon after launch). I’m going to try 20% for the spring sale and see how that goes. I don’t know what I’m doing at all, but the indie race to the bottom frustrates me, so I am trying to be conservative with discounts for now.

1000% - a little curious here, how does this spike compare to launch numbers, if thats comfortable to share?

A bit less than double the total from launch day, although with more of a tail over the last month. I guess I was in the discovery queue (brown line) for launch day and then hidden again, or something. I don’t know what the other small spikes are about.


In the interest of contributing more data, here’s what that pattern looks like after 6 months. As you can see, the discovery queue (brown line) didn’t provide any long-term traffic. My guess is that you get a short trial period before getting kicked back off if you’re not a giant seller.

Just for fun, I thought I’d talk about my die-rolling algorithm.

One recurring piece of feedback that I got prior to release (and I agreed) was that attacks seemed to miss more than expected, and that streaks of misses were too common. This is of course (as is well-documented) partly down to the way we perceive unfavorable events, but games use a variety of techniques to mitigate that and improve the experience.

I was originally just using Godot’s built-in random number generator, and my tests produced distributions with something like a 5-10% variance from the mean. I’m not sure if that’s considered unusually high, but I did some research and found a design pattern for finite distributions called the shuffle bag pattern. This works a bit like a deck of cards: you shuffle all numbers in the distribution into a list, then pull one at a time until you’ve used them all. This produces a perfectly uniform distribution.

So, I took this pattern as a starting point and wrote a class that I call DiceBag. The bag contains sets of integers corresponding to die sizes (currently just d20 and d100), and each set contains one of each possible roll. However, I can also partition them further. Let’s look at the d100 set, which is used for attack rolls. I split the d100 rolls into five sets, incremented by fives. So, before being shuffled, the d100 set looks like:

Partition 1: 1, 6, 11, 16…
Partition 2: 2, 7, 12, 17…
etc.

Players and enemies also have separate roll sets, so that a lucky or unlucky roll from one side doesn’t influence the other side.

On application startup, I populate and shuffle all partitions and randomly pick one as the starting point. Whenever a die roll is requested, I issue the next available number. When I reach the end of one partition, I reshuffle it and move on to the next one.

I partition the shuffle bag for two reasons:

  • To limit the period over which a full spread of values is guaranteed.
  • To reduce streaking by ensuring that no* two rolls are closer than 5.

Some games go further in artificially manipulating outcomes to remain within certain boundaries - e.g. if you miss twice in a row, your next hit is a guaranteed critical - but I didn’t want to do that. I see this strictly as improving the uniformity of roll distribution, which doesn’t technically favor the player.

I did make two other small adjustments to the rules in the player’s favor, though. First, I gave the player front row a small (5%) accuracy bonus, which serves both to reduce the physical fighters’ miss rate a bit and add a little more incentive to place someone in the front row. I also removed the 95% hit chance cap for players (I kept it in place for enemies, since we love it when the enemies miss). The reason was that this caused situations where a character could artificially miss an otherwise guaranteed hit. When you’ve got a +20 accuracy buff and spend MP on an attack skill that adds another +20, and you still miss against the slowest enemies in the game, it feels like something is wrong. This was a D&D holdover that didn’t actually improve the game. It’s probably more valid for tabletop, where rolling a natural 1 is a tactile event that clearly communicates what just happened.

This all ended up working quite well. Combat felt smoother, more fair, and less streaky. I can’t quantify any statistical differences between the basic shuffle bag pattern and the modified version that I’m using, but the modifications at least narrow its behavior down to something I can better understand and control.

* When switching to a new partition, there’s a small chance of rolling an adjacent number, but this is rare enough that I’m not worried about it.

That’s an interesting approach! And told me that I should actually check whether the random number generator I implemented works properly and produces a uniform distribution

One approach I saw at fixing the gap between percieved and real probability is to make the distribution not actually uniform. Like in Fire Emblem, they generate two random numbers and take the average, which skews distribution towards higher and lower rolls. 50% chance is still 50/50, but higher chance rolls are even more likely to succeed, lower chance are even more likely to fail. Curiously, they use this skewed distribution for hit chance, but uniform distribution for crit chance. I guess people subconsciously percieve hitting as more consistent than critting, so they react to the same numbers differently