Design Diary: The Jester

Tom Francis said this smart thing about game design on twitter the other day – that it’s like “building fires in the dark”.

Basically, for him, the process of game design is like lighting a fire, taking a good look at your surroundings, and exploring what you can see. Before you’ve lit the fire, you don’t know what’s out there, but after you have, you can see everything clearly, and in highsight, your insights seem obvious, even mundane and not worth stating. Which makes taking about game design really difficult.

I can relate to this a lot!

I have a lot of trouble talking about design. I find it really hard to articuate how I work – anytime I try to explain a design decision, I end up just mumbling and saying something like “it just worked better that way, I dunno ยฏ\_(ใƒ„)_/ยฏ”.

I tweeted this, and added – “I’m a bit jealous of designers who can, like, build a model of how something’s going to play in their head – for me, it’s a process of trying a bunch of different stuff and hoping some of it works when I have it playable.”

I worded this very badly. Of course, all designers need to playtest and iterate to figure stuff out. Also, yes, when I’m designing something, I do have a plan for each step of the way! I try lots of changes that I think will work – sometimes they do, sometimes they don’t. The thing I don’t really have, I think, is a good intuition for how each experiment is going to go. I’m frequently surprised by what doesn’t work, and I find I discover lots of things accidentally while trying out random things. Game design often feels a series of happy little accidents to me.

Someone on twitter responded that I should just keep notes, and, actually, I do! Meticulous ones! And I’m going to show them to you! This is how I recently solved a very tricky design problem, step by step.

Recently I’ve been trying to finalise the design of the last character for my new game, Dicey Dungeons. The “Jester” was playable in earlier alpha versions of the game, but they had a bunch of problems, and I wasn’t really happy with them – so, in the last update, I decided to take them out, and go back to the drawing board. I’m certain that there’s something really good here, but the character just wasn’t clicking yet.

(Uh, so, I’ll try to keep it snappy, but fair warning – unlike my big AI blog post, I’m not sure this post is gonna make a lot of sense unless you’re pretty familiar with Dicey Dungeons already. Sorry!)


Who is the Jester?

I unveiled the sixth and final Dicey Dungeons character in v0.13, and they’re very different from the other five.

The different classes in Dicey Dungeons are all about varying the basic rules of the game – each character gives you a different view on the same basic mechanics by varying some fundamental system or other. All characters have equipment with dice slots, and they roll dice which they can assign to those slots. But, for example, the Robot doesn’t actually roll dice on their turn like the other characters do – they have a “push your luck” minigame that they can play to gain the dice they need, and if they lose it, they lose all their equipment. And the Witch doesn’t collect equipment like the other characters – instead, she has a limited spellbook with equipment that she can summon copies of, and change out as needed.

One thing that Dicey Dungeons does differently from other deckbuilding games – it doesn’t have a deck. You find equipment as you explore the dungeon, and you can equip it – but it doesn’t change from round to round. That is, unless you’re playing Jester.

The Jester’s “thing” is that they don’t have a static equipment layout. When they find equipment, it’s added to a deck, which gets shuffled and dealt from. As soon as you use a piece of equipment, another piece is dealt immediately. This all works in Dicey Dungeon’s systems because of a “snap” mechanic, which lets you trade matching cards for an extra dice, which you can then use to play more equipment.


The problem

The Jester was kind of fun to play, but, yeah, there are some serious problems. Two in particular:

  • I was hoping that the “snap” mechanic would mean that you had to make interesting decisions about using your cards, or trading them for dice based on what you thought was coming up and when. In practice, though, it just ended up being more efficient to cycle through your deck as quickly as possible, getting more and more dice to use on the most powerful cards you had. This was the “big” Jester problem – it meant that every single round ended up feeling exactly the same, especially as you got near the end of a run.
  • The balance was pretty badly off. Levels 1 and 2 could trip you up, but by level 3 you were always basically unstoppable, and by level 4, you could often finish bosses in a single turn.

I made a few quick changes to the character for v0.14, but they actually made things much worse:

  • I had a problem where players would cycle through their deck and have a bunch of dice left over with nothing to do with them. This panicked me a little, since one of the things I try to avoid is the player having spare dice at the end of their turn – that basically always feels bad. So I tried out a “Finale Card” system – the last card in your deck is always the same, dice-hungry card. This just made the character even more unbalanced – there was an extra incentive to optimise your deck for cycling.
  • There was very little incentive to pick up bad cards as the Jester – which is a shame, because if you only ever pick up good cards, it’s a little boring. So, I added “Booster Pack” pickups where you’d pick up 3 cards at once – two good cards along with a bad one, mostly. Nobody was ever tempted to pick these up, though, since it was always better to keep a light deck of mostly matching cards than to dilute it with 3 different ones.

I ended up really unhappy with v0.14 Jester, so, in v0.15, they were gone.


Design diary

So, here it is! These are my actual notes from across the last month or so as I tried to figure this problem out. They’re lightly edited for clarity, but, uh, they’re still a bit of a mess.

My design process is mostly just playing through the game over and over again, which in my testing version of the game I can do at 5x speed, and seeing what happened.


The original boop card
10th January:

This was my first day of attempting to fix the character. I started out by identifying what the main problems were, and turning off everything that was making them worse, so I could hopefully see things a bit clearer.

Whenever you see a “-=-=-=-=-” in the notes, I’m probably playtesting!

Ok, Jester iteration 1!

– Let’s change Dice Cannon to Punchline, and weaken punchline.
– Let’s also weaken Dice Cannon, in case it comes up.
– Let’s also nerf Marotte to Max 2 and Max 4
– And completely remove the call for backup cards for now.

This is virtually a baseline. Almost no changes, except for some relatively big ones that should significantly impact the biggest problems.

Thoughts:
– The Jester needs more occasional big hitters to come up to make them work – they don’t really have anything that’s outside of the range of normal attack cards. That might give us something else to build a hand around, perhaps.

=-=-=-=-=-=-=-=-=-=-=-=-=-

Ok, right away, I feel like there’s not much interesting dynamics happening in the initial Jester Hand. Let’s try something RADICAL.

I’m going to put Dice Cannon back, but as a nerfed card, dealing 1 damage per use. I’m also going to reduce the Jester hand to just three cards: Boop, Boop and Wind up Fist. Let’s see how it looks!

=-=-=-=-=-=-=-=-=-=-=-=-=-

Ok, that doesn’t work, but it does reveal some issues.

Finale cards are a *weird* concept that shouldn’t be in your initial line up at all. I’m going to remove them for now.

=-=-=-=-=-=-=-=-=-=-=-=-=-

Ok, removing the finale card feels really good. Let’s run with that for a while.

Taking a walk and a coffee break.

=-=-=-=-=-=-=-=-=-=-=-=-=-

Something I wanna try just throwing in there: cards that give dice on certain numbers, otherwise just damage. Let’s try it!

=-=-=-=-=-=-=-=-=-=-=-=-=-

Ok, nope, I tried out a gold and silver dagger which return dice on odd or even. They’re mostly just confusing, I think.

Let’s try one more radical thing: Snap removes cards, but gives no bonus at all. How does that feel?

=-=-=-=-=-=-=-=-=-=-=-=-=-

That kinda works. Gosh. I dunno though. Maybe worth considering an alternative to the basic snap mechanics here, though.

Here’s one I was thinking about: what if *snap* executed the matching cards for free? It would just figure out a magic dice to use for all the matching cards, and execute them simultaneously. It makes snap into something closer to Fury, only it does what you would expect snap to actually do.

What dice would you use? The best one – so the highest dice that fits. For very very rare cases, we can specify which to use in the spreadsheet, I guess.

=-=-=-=-=-=-=-=-=-=-=-=-=-

I feel like I lost control of the Jester in v0.14. I reacted to player feedback and added two elements to try and patch fundamental problems, and I don’t think either worked – Finale cards and booster packs. I should have ignored that, and followed my own instincts and modified the core mechanics instead.

I think it’s ok, though. Implementing that stuff was useful to help me figure things out. Now that I have, I can try more new stuff and make more progress on all this.

So, end of day one: I’ve removed a bunch of stuff, and I’m starting to figure things out. The main thing I made progress on was realising that the Jester’s snap mechanics (where they traded matching cards for dice) was the key broken thing. Eventually I replaced that with something that works much better – a simple “discard” mechanic, where you just remove matching cards.

It looks like I actually even tried this variation out on that day, but ended up going around in circles before I finally figured out how much better it was.

I also had the idea for the “power snap” mechanic, where matching cards were actually “used” instead of discarded.


The power snap mechanic in action
11th January:

Day two! Before I actually started taking these notes, I implemented the new snap mechanic I’d thought of the day before.

Ugh, I have a cold. I *knew* this was going to happen. Soon as the schedule went all finalised, I’m sick.

Anyway, gonna keep doing this Jester design work. New snap mechanic is super exciting, but it breaks things a LOT. Let’s step through bit and bit and see what the problems are. I wanna see if I can make it work, because it’s really fun.

=-=-=-=-

Alright: the starting hand is gonna need to be rethought with the new Snap mechanic. Obviously if there’s no matches, it doesn’t work, and we need some way to be able to deal damage that’s comparable to other characters.

I tried having the five basics in the character’s deck (Boop, Deflect, Sweets, Liquorice, Buzzer), but that just feels noisy and unfocused.

Doubling Buzzer is way too powerful – Consider a Fire equivalent instead.
Boop dealing just 1 damage is super weak, but a deck full of them could be pretty fun.
Worth considering something that scales on Snap power too.

Ok: Let’s look at the other classes:

Warrior:
Starts with Sword, usually gets another weapon very early. Early damage range 6, and then 6-12.

Thief:
Lockpick and Dagger. Dagger is great and can deal raw dice damage if you’re lucky, but it depends on the roll. Anywhere from 2-9.

Robot:
Pea Shooter and Plasma Gun. Limit of 9 CPU at level 1, but can find other weapons early. Range 5-7, or 12 if you get a jackpot.

Inventor:
Just one Hammer is a bit weak at first, but you quickly find more weapons. Range 1-6, then 12.

Witch:
On a good roll, (which is most of the time at first), you can do 5 damage on turn 1, 7 on turn 2, then 9 on turn 3.

Jester:
To be consistent, it would be nice to figure out how the Jester might range between 4-8 or so from a starting hand.

The Jester could start with 3 different cards: something which does 1 damage, something which does 2, and something which does 3 – 3 of the first, 2 of the second, and 1 of the third.

Let’s see how that feels to start off.

=-=-=-

Ok! That’s a guaranteed 10 damage per turn, it turns out. Hmm.

Because Snap guarantees you can use the cards, it’s always best to just snap when you have a match. Nothing else needs to be considered.

Ok, here’s another variation: what if, instead, you had to use a dice on the snap button? Instead of an automatic dice being assigned to the cards, then, the dice you choose would get assigned to the matching cards. This could open up some interesting avenues, maybe?

Not sure, tbh, but let’s give it a go.

=-=-=-=-=-=-=-=-=-=-=-=-=-=-

Uh, yeah, sickness got the better of me. Fell asleep. Curled up for the couch for a bit, feeling sorry for myself.

Anyway, small amounts of Jester thoughts:

The thing of adding a dice slot to the jester card seemed like a good idea earlier, but it leads to a bunch of ambiguities – like how to handle slot matching in a way that feels nice? (thinking it through, it just seems messy.)

Also, it does solve a problem, sure, but it doesn’t solve the *real* problem – that playing Jester just feels like going through the motions. So how do I solve that?

I don’t meant to sound bleak about it. Actually, I think it’s totally ok if the Jester ends up being this weird, slightly broken character that I can do fun things with. It’s not the end of the world if I never figure out a perfect design here. But up for trying a bit longer, at least.

The Jester is not the witch. A certain amount of going through the motions is unavoidable. What you want is for the dice to at least act as a randomiser on that.

So, probably more cards with more restrictions, at least. However! That leads to the other big problem with “snapping” – you end up taking difficult, hard-to-use cards and trivialising their usage by making them free. How do we fix that? How do we give interesting decisions back to the player?

Well, you could have multiple choices to balance – do you take more restrictive cards, or duplicates of weaker cards?

If I continue in this power snap direction, then Copy has to be very very rare now, I think.

We could have cards that depend on the number of snaps made per turn – kind of like a thief backstab multiplier. (the problem there, is, that’s not a decision – that’s just another “thing”).

Or, we could have cards that are better if they come first, so the *order* of your deck matters. Maybe it matters so much that you try to set things up in sequence. A card that increases the damage boop cards do is interesting, for example. As is a card that grants fury, or causes your NEXT card to be more effective in some other way. (grappling hook?)

Um, dunno. Sleepy and sick. Will do more thinking about this tomorrow.

So, it turns out? Having the snap mechanic use cards for free is super fun, but also super, super broken. It basically meant that you didn’t care what cards you got, so long as you found more than one of them. This direction ultimately didn’t work as the “core” Jester mechanic.

The other big idea from this day: try out cards that depend on sequence! This ended up being a really important mechanic that made building a Jester deck a lot more interesting.


The new conditional cards
15th January:

I managed to do a little bit of Jester design work while on the plane to PAX South:

On a flight!

It’s almost empty here – I’ve got a whole row to myself. I feel like I should probably make some use out of it and get a bit of work done. On the other hand, am on a flight, so maybe I shouldn’t stress about it too much.

Let’s think about the Jester for a while longer! Gonna need them to have at least two floors playable for PAX if I want to include them, so let’s give it a shot.

=-=-=-=-

So I’m trying to figure out this really basic puzzle with the Jester.

If snapping works like this: Cards that match can be played for free, with the required dice supplied.

Then what are some interesting gameplay consequences of that?

One thing, you definitely want to duplicate cards. Basically nothing is more powerful, in fact.

Problems I can’t seem to figure out:
– Playing as Jester is completely going through the motions, worse than before. You play whatever cards you can, hoping for snaps to come along naturally. Sometimes you selectively play cards if you see a snap coming up, but that’s about it. This is never really a “decision” in combat.
– There’s also never really a decision in picking stuff up. It’s mostly best to keep your deck lightweight, so… Just avoid everything, probably?

So, on the first, I think I want to introduce a new class of cards, Jester focused, which are more concerned with ORDER. Any card that depends on existing stats is great. Existing cards like this are:
– Detonator (deals damage if you’ve poisoned the enemy)
– Shield Grip (deals damage if you have shields)

Let’s introduce both as Jester cards.

Also, let’s make these new ones:
Megaboop – Deal 1 damage for each boop card used this turn
??? – Deal 4 damage for each burning dice/frozen dice

Let’s also make more tempting clutter for the snap cards! Burns and Freezes are a great addition to the mix.

=-=-=-

Ok, those cards are great – they also make so much more sense for the Jester than for the other characters, thanks to the Jester’s non-linear deck, so they feel like they belong.

I’ve been making little tweaks here and there. Let’s check in on where I am:

=-=-=-

– Match three means any raw damage dice card can do about 18 damage when used with new Snap. Gosh. It’s fun, but it’s clearly way too powerful. I might need to change the limit break.
– I’m trying out just three cards for the starting layout – Boop, Infliction, and Magic Missile. This works, and gives me a nice starting hand that ranges between 4 and 8 damage.
– But the whole thing spirals out of control way too quickly. By level 2, I’m already on autopilot, with more nonsense in my deck than I can think about.

=-=-=-

Ok, changes:
– Let’s try a “wildcard” limit break instead of Match 3, to slightly nerf that.
– Instead of magic missile, let’s redo wind-up fist to do five damage – slightly more Jester themed.

=-=-=-

There’s some tech work to do to get that wild card working.

Wondering if it’s worth *trying* a single card use on snap mechanic? Having all the cards trigger is super overpowered, but using one for free might seem fair?

Alright then! Two tech things to explore!

Gonna take a break from all this for the rest of the flight, I think. Maybe watch some telly, or try to nap a bit.

Not bad for a flight! So at this point, I hadn’t quite given up on the “power snap” mechanic, but I’d figured out that it wasn’t going to work and was trying other things. I’d also figured out a clearer plan to have more cards that were sensitive to what order you’d played them on that turn.


An ice themed booster pack
23rd January:

PAX South went really well! It took about a week afterwards until I got around to iterating on the Jester again.

Yay, ok, landed and back in London.

Things are gonna be pretty full on for v0.16. I’m aiming for *next* friday, which is doable but really, really tight. Here’s what’s on the agenda:

– Finish the Jester
– Implement the starting tutorial
– Quest unlocking and progression
– Basic cutscenes

Obviously, the priority is the Jester. But I’m not having that much luck at banging my head against the wall trying to figure it out. So, instead, I think I’m going to just do an hour a day on that for the next week or so, and spend the rest of the time getting on with other things. Just enough time to, like, keep my subconscious on the problem.

Ok, let’s start now! Pomodoro 1!

=-=-=-=-

Alright, so, debrief of stuff I tried on a plane:

– I tried to nerf snap by having it just autoplay a single card. This felt really bad, and I think I’m going to undo it. I also tried making Match 3 and Match 2 to nerf it – that also feels bad. Let’s go back to Match 3.

– I tried Wind up Fist in the opening line up again, but I think I’m kinda past that point of design with the character. You need a big hit in the starting lineup, so instead I’m gonna try out some single use items, like Crystal Sword.

I think I need to *try* some dramatically new mechanics here, just to clear away the feeling of being stuck. I’m going to try ditching the new Snap mechanic, and seeing if I can make the character work without it again. So, back to the snapping cards for extra dice thing!

From this lens: All the characters have some basic mechanics to introduce *uncertainty* into the game, right? (I mean on top of what equipment you find and what dice you roll). For the warrior, you can reroll dice, the thief can split randomly with the lockpick, the robot has the CPU counter and the chance of errors, the inventor has to discard equipment, and the witch’s normal dice rolling uncertainty is multiplied thanks to her dependence on the spellbook.

The Jester gets draw order.

So, using *just* that, can I make the character interesting to play?

=-=-=-

Gonna make a list of different things to try that might go somewhere:

– Have cards that add more cards to your deck *as you play*. So, a card that adds a boop to your deck on an even dice, say.
– What are some *risks* that your cards could have? Why is it better to choose poison cards over ice, say?
– What are some chain mechanics that are less full on that I could explore? Less powerful duplicates, illuminates, etc.

=-=-=-

Ok! I made a card that adds infliction cards to your deck, that’s cool. It kinda works, too!

Let’s make it chainable – instead of infliction, let’s add cauldrons. That’ll mean your damage output is 1, 2, 3, 4, 5 per turn. Which is a little low? On top of other things, though, maybe that’s ok.

=-=-=-

Ah! Ok, Marotte Machine is my new card. This is great.

Marotte Machine gives you a new Marotte for a countdown of 5, which gets added to your deck. They do 3 damage and reroll the dice, so as you get more and more they start to get really powerful, but it’s not a sure thing.

Ok, so Marotte chaining is fun, and somewhat powerful, but unpredictable. But that’s just one set of mechanics, so let’s think about some others that work with it:

– A lockpick basically ensures that you can use all of your marottes, and helps with chaining
– Illuminate is a bit confusing as Jester, but the idea of stashing dice until the next turn is very good. Some kind of next turn setup in general is worth thinking about.

Ah, ok, that was way more than an hour, but whatever, this feels like a breakthrough.

At the time, it definitely felt like I’d made a big discovery with the “Marotte Machine” card – but it ended up really not working. It’s gone now. Nothing I added on this day actually made it in.


The final version of the “Marotte Machine” card
24th January:

Still, I’d gotten back into the swing of things! This ended up being my most productive day so far:

Ok! It’s Jester hour ๐Ÿ˜€

So, biggest discovery from yesterday’s experiments: Marotte Machine is pretty cool. Great!

Still worried that powered up snap is way too powerful. With two marottes in your hand, it just does six damage and gives you two extra dice, which is super broken.

I dunno, though. It’s such a nice mechanic.

I def want to continue to keep it in the game in some form – but maybe not as the central thing? Varying snap mechanics is a super strong direction to keep aside for quests, anyway.

Hmm. Let’s get back to a new starting point.

So, as an experiment I’m back to the behaviour where Snap exchanges matching cards for dice, and the new Juggling Ball mechanic discovery as a pickup on level 1. (I renamed Marottes to Juggling Balls – it fits much better, and nobody knows what a Marotte is.)

The Jester lacks real *progression*. You start off underpowered, and end up crazy overpowered. You end up quickly burning through your entire deck every turn.

This indicates to me that things really aren’t so bad at the start, but that you need to figure out a way to pace the character better. Getting to the point where you can just burn through your deck should (a) be something you plan around and (b) be a choice, and one that’s an alternative to other choices, like going in heavy on damage dealing cards, say.

Anyway, from this starting point, let’s just play!

=-=-=

I’ve got the Jester with Wind Up Fist (newly reduced to 5), Two boops, sweets and Liquorice. Let’s change that to start:

Boop|Boop|Sweets|Sweets|Liquorice|Liquorice|Wind up Fist

My thinking is: having duplicates of almost all the starting cards gives you some strategy from the get go – if you don’t care about Poison, you can dismiss that for the extra dice. In practice, this means…

That you get five dice on turn 1, and ensures that you can use the Wind up Fist. Hmmm.

Ok, gosh. What if you didn’t get a dice on snaps? What if it literally just removes the cards?

=-=-=

Oh, huh! That’s interesting! It means you can focus on different things on your turn without it being the entire point of it. Right away it creates all these situations where you have to decide between using cards and advancing the deck for other, situationally more useful things. Huh!

=-=-=

Ok, this really seems to be working. Let’s try this instead for a while.

=-=-=

So, Match 3 is no longer useful as a limit break, in this world. What else might be?

Extra dice would work, but that’s a little dull. You could make it change to the execute snap behaviour, but that’s pretty overpowered.

In any case, you probably want *something* that’s Jester specific – that has to do with the card system.

=-=-=-

Hmm, ok, I can’t think of anything. Let’s just try making the limit break be the powered up snap mechanic! When in doubt, go for the fun, overpowered thing!

The issue with it is that it makes the limit break incredibly powerful, and probably encourages a limit break heavy strategy. But let’s see how much of a big deal it is.

=-=-=-

That limit break is AMAZING. Fucking hell. Yeah, this is super fun. It gives it this pac-man like feeling of briefly being super powerful, and then going back to normal.

So, main problems at this point: progression is all off. I would consider pushing all the levels back by 1, maybe. The Jester should probably find less “stuff” in the Dungeon than other characters do.

Anyway, I think that’s me hit against today’s hour, and then some. I’m gonna move on for today.

It took me a while to get there, but this version of the snap mechanic – discard cards to advance through your deck when playing normally, and use your limit break to change to the “power snap” mode – is the thing that worked, and is what I’m doing in the final version of the character.


The new “snap” limit break
8th February:

I took a break from the Jester for a little while here to focus on other things that needed to be done in the game. When I came back, I’d figured a few more things out.

(The notes from this day are a little all over the place, and mostly didn’t work out. Feel free to skim or skip ahead.)

Ok! With the tutorial basically good to go now, I’m focused on finishing up the Jester. I did a few hours on them last week, which I think helped, but I’m still not really feeling them.

By the end of today, I’d really like to have a plan, one way or another. Here are some stray thoughts:

– You’re missing the “building” from deck building
– Your current starting hand is awesome, when it lands
– Having the player decide what to add is very difficult
– Duplicates are the heart of the class, but there are several problems with it that I need to figure out

– You’re missing the “building” from deck building

Ok, so, the real heart of deck building is this: on turn one, you’re not that powerful. On turn 10, you’re insanely powerful. If you get to make interesting choices along the way, then great!

In Dicey Dungeons, this plays out over multiple battles, mostly. You start with 2 dice and a sword and a reroll, but by the end, with five dice, you’re unstoppable.

So for the Jester, I have an opportunity to do something else! Here are some mechanics that I haven’t been able to explore in Dicey Dungeons yet:

Thinning out your deck: The Jester, could, in theory, have a card that deleted a card from your deck forever, once per battle. If used, you could create a post-combat thing of thinning out your deck (including, if you were done with it, destroying this card.) You could do exactly the same thing with a copy and upgrade card.

Cards that depend on other cards you’ve played: Like Ascension or Star Realms – if you play a yellow card, then each yellow card is worth extra, or whatever. These are a bit complicated, but I’m trying them out right now with the damage based on burn/freeze and Megaboop cards.

Chaining: Cards that work in sequence: say three cards that will do X damage if you play them in order. Or cards that say, nudge a dice and then change powerup.

– Your current starting hand is awesome, when it lands

Two problems with the starting hand:

You just need it to contain certain thrashy things, otherwise you’d never pick them up.

You have enough in your starting hand to do real damage, especially with the limit break.

Thinking about limiting the use of the limit break to contain that a bit maybe?

– Having the player decide what to add is very difficult

So, here’s an idea: what if I just double up every single pickup as this class? That’s already supported in code, so why not? You never want to pick up single, difficult to use cards, but if they can be snapped or power snapped, then it becomes a more interesting choice right away.

– Duplicates are the heart of the class, but there are several problems with it that I still need to figure out

Some thoughts on this: I want to try properly embracing pairs. No single cards any more!

Snapping to “remove” cards feels so weak. It’s way more interesting to play, because you end up thinking of snaps as deck management rather than a move in and of itself, but I can’t get over the feeling of it being a bit “pointless”.

Would it be crazy if snapping hurt you for 1 hp? Maybe. What if it bumped a random dice? Too confusing. Do one damage? Maybe, but I dunno.

The limit break is *amazing* to pull off, and feels great. It requires just enough deck manipulation to be interesting, and is crazy powerful. Maybe too powerful, to be honest – I wonder if I could limit the power snap counter or something.

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

Ok, so, the opening set. The boops are good, but I’m gonna try removing Liquorice and Sweets. Instead, I’ll add Spark and Snowflake, and an extra wind-up fist. Let’s try that, and see how it feels!

=-=-=-

Not bad, but having such a full inventory is so excessive. I think ideally we’d just have four, to stop things feeling overwhelming. But then…

There are a whole bunch of confusing concepts: why discard cards? And if we don’t have any matches, what does that button even do?

Here’s another thing I’m thinking of: what if you get a free snap each round? That could be fun, but would make the character incredibly powerful again…

Let’s try this: We’re gonna start with just the following: Boop x2, Spark x2, and Slapjack (which gives you a power snap charge).

=-=-=-

Ok! That’s kind of fun, as a starting arrangement! It’s complicated, yeah, but in an acceptable way. I think all the pieces are there so that a player can figure it out.

The only problem is Wind-up Fist – I might just ditch it. Powerful spells this early just end up feeling broken.

I’m still a bit worried about people not picking stuff up – I guess I’ll just playtest that style and see what happens. It’s a fact: pick up as little as possible early on, and you’ll be more powerful later…

So, I’m going around in circles again, but what if you started with Boop x2, Slapjack, Spark and Snowflake, and we ditched the double pickup thing, instead adding support for booster pack style pickups in every situation. Then the first pickup could be Boop, Spark x2 or Snowflake x2, or even Liquorice x2! And any of them are justifiable.

=-=-=-

Ok! I’m feeling pretty happy with floor 1 now, yay.

On to floor 2, and it’s problems –

– The booster pack concept isn’t really relevant anymore, whoops.

– Juggling Ball is a nice piece of equipment. Probably worth starting with one, or getting one on floor 1, so that you know what “incoming” is going to do.

– Incoming should also transform into a Juggling ball for the rest of the turn, just to make the whole thing cleaner.

– Shield Grip + two deflects is a super cool pickup. Let’s add that to the mix again.

=-=-=-

Ok. Floor 2.

By the time you have 11 cards or so, things are already pretty confusing. So, I’m thinking maybe we push back the current level 1 rewards to level 2 – all you need to find on floor 1 is a juggling ball, I reckon.

Not sure about finding copy shop on floor 2. Let’s try 50-50ing with upgrade instead.

=-=-=-

Yeah, let’s just make that Upgrade instead of Copy.

Huh. It’s not clear to me that Incoming is really a good card, actually… It’s fun, but it kinda overwhelms and becomes the focus of each battle.

I’m gonna try taking it out. As for the Juggling Ball, let’s make it a level up reward.

=-=-=-

Ok, I think starting with a ton of matches in your hand is way more interesting than starting with mostly unmatching cards. It’s more fun to play off the bat, the discard mechanic makes sense, the level up makes sense, and I *don’t* think it’s that overwhelming. Gonna stick with this.

=-=-=-

Overlapping status effects for Jester continues to be a little annoying – you both freeze and burn dice a lot.

Gonna try swapping out Spark for Liquorice. Poison is a damage boost, but it takes away the status issue.

This day was a bit unfocused. I tried out this weird idea of having every single pickup be two copies of a card, but that didn’t work at all.

I also tried different incentives for the “discard” move, but none of them worked – any incentive or disincentive to use discard seemed to make the character less interesting to play, so I stopped that.

The other weird thing I tried today was having “charges” on the “power snap” mechanic – so using the limit break would give you three charges, which could carry over to the next turn. This was ok, but I took it further by introducing a “SnapJack” card which gave you a single power snap charge, and that was a mess. I eventually scrapped the whole concept of limit break charges, and the “SnapJack” card is gone now.

The big thing I did figure out on this day was the starting arrangement of the deck made more sense with duplicates of weak cards. I eventually reintroduced Dice Cannon at 1 damage per dice, and now the starting Jester layout feels really nice.


“Spark”, the new weak Fire card for Jester
9th February:

This day was mostly about taking what I’d figured out about the basic mechanics, and trying to make a new dungeon layout based on that.

Bit of Saturday work, still trying to figure this whole Jester thing out.

I did some thinking about quests:

Jester Finders Keepers (Losers, Weepers) –
Jester must take *all* equipment after each fight, yikes! Limit break allows you to delete a card of your choosing. (which is useful, because you’ll quickly fill your deck up with all sorts of crap). Discard becomes “Discard All”, maybe, I’m not sure.

Expect the Unexpected –
Instead of a next up display, just have four cards available to play. Other rules remain the same.

=-=-=-

I’m going around in circles a little, but some notes on the starting distribution:

– Too many different cards is overwhelming
– But too few, and you don’t have good incentives to pick stuff up unless it’s really good
– More than two of a thing is good
– It’s really hard to explain the discard/snap mechanics off the bat no matter what you do

Currently trying two boops, a juggling ball and a two sparks, with the first pick either being another juggling ball, boop, or a spark|boop pack.

=-=-=-

Ok, The snapjack level up is insane (it gives you two snap charges instead of one) – that should probably have a higher countdown, and the level up should maybe just reduce the countdown again.

Upgrade is a bad call on floor two because you don’t really have any interesting cards. Copy is better after all. Switch it back again!

=-=-=

Playthrough!

Died on floor 3 to a Sorceress. Had an overcomplicated deck and just didn’t get as many discards or even snaps as I needed. Regretted taking the snowflakes.

Found myself wanting healing. Consider adding sweets instead of Spark.

Megaboop doesn’t work as well as I’d hoped. It kinda ends up hanging around your hand until you have a chance to use it, which slows down the rest of the run. OR! You have to use a dice to dismiss it, which is no fun at all.

How about we try making it a skill instead of a dice? So you press a button instead of wasting a dice on it?

Not sure what to give on first level up reward. Megaboop will increase in power if we make it a skill, so it can stay – but what else? Come back to that.

Level up progression still feeling too steep. Let’s slow it down again! I can push one of the level 1 pickups to floor two, and so on. In fact, here’s what I’ve got so far:

Level 1:
Juggling Ball
One of “Boop”, “Spark|Spark|Boop”

Level 2:
Copyshop
One of “Boop|Boop|Boop”, “Snowflake|Snowflake|Snowflake”, “Spark|Spark|Spark”, “Deflect|Deflect|Shield Grip”, “Liquorice|Liquorice|Liquorice”
Shop containing A delete, one of “Juggling Ball”, “Boop”, “Lament”, “Battle Axe”, “Hammer”, one of “Lockpick”, “Spanner”, “Bump”, “Glass Cauldron”

Level up rewards: Dice, either a megaboop or another Slapjack

Level 3:
Not really sure yet!

Yikes, ok, this is all way too much, too fast. Let’s slow this right down.

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

Quick aside: what equipment is *interesting* to power snap?

Dice creation equipment: power snapping dice creation equipment gives you free dice – a minimum of two, in fact. Using two spanners creates FOUR dice, Jesus. (two sixes in the two slots, which are basically just returned)

Charge based weapons: Electromagnet I guess charges the individual copies? Hmm.

Reusable equipment: AHHHHHH. Reusable equipment logically discards, yes, but when using snap, you can activate it over and over. So daggers will just do six damage over and over until you run out of charges, yikes.

Crucible: get unlimited numbers of dice? hah

=-=-=-

Playing through a whole run finally, and the main thing I’m finding:

– Unlimited Snapping is probably more fun than having a set counter, even if it’s a little broken. I’m planning my run around that anyway, so why not embrace that? It’s actually less powerful, in a way, to force you to try and do everything in one move, since that’s really hard to pull off.

The problem behind that is: you end up just being better off not picking stuff up, again. Uff. I can’t get away from this. I’m not interested in “deciding”-what-to-keep based gameplay. Should I consider some kind of mandatory pickup mechanic? Nah, that’d feel terrible I think.

Upgrades are basically pointless, I never use ’em.

Fighting Vampire as the final boss, haha. With Match 3 gone and no mechanism at all now to discard single unwanted cards, this is terrible. What if you picked up two Vampire Stakes instead of one when playing Jester?

Ok, yeah that’s pretty funny ๐Ÿ˜€


The final version of the “Megaboop” card, which does extra damage for each “boop” played
11th February:

Skipping ahead a little, on the 11th I did a lot more work on the dungeon layout, the level up rewards, and finally figured out a progression from start to finish!

The new card from today, “Miniboop”, eventually got renamed “Boop”, and the “Boop” card got renamed “Bop”. These are probably bad names.

Morning Terry! Some quick late night Monday notes:

– The starting layout is feeling pretty good now, with the Juggling Ball on the floor as an uncertain element, and the Boop x2 and Sweets x2. Sweets change is good.
– It’s a little too easy to just go through your deck entirely each turn right now. This leaves me feeling very unsure about adding stuff to it. I tried to buy the deletes to remove Detonator on the last playthrough.
– Detonator is too expensive to work as well as the spark or snowflake pick ups, I think. Poison is maybe strong enough already, though, so you could just combo it with another card, maybe. Let’s make Detonator easier to use! It’s in need of a buff anyway.
– Starting with 3 dice feels much better for sure, but picking up spare 3s feels really bad, since you’ll basically always get them and then end up chaining your whole deck. Maybe just be very, very careful with dice manipulation. I think it’s important to not break the dice balance, because that ends up making the character feel very play-by-numbers.

Good solutions to that are more restrictive cards, or powerful single cards that become decisions: do I use this now and end the turn, or do I attempt to keep going?

Turns out, this is very hard!

Dream Quest, for example, does this by using weak attack cards, which are naturally chain breaking. You can then get past this by deleting the attack cards, which makes chains more likely, or getting special cards that draw more cards excessively, boosting your chain.

Dicey Dungeons can’t do this, because the snap mechanic naturally leads to chaining!

Worse than that, because your limit break requires chaining, anything that gets in the way of that weakens the character. It is *always* the best move to try to chain your entire deck, regardless of what’s at the end.

Hmm. I’m not sure what to do here that’ll make things feel fun.

Anyway, bedtime. Monday’s problem!

=-=-=-

Ok! Let’s get back into this!

So after sleeping on the problem a bit, I realised that I’m missing the friction that comes from having more than one set in your starting deck to “discard”. In fact, my discard button is basically pointless until floor 3, because my lean starting deck means that I never even need to use it.

How do I fix that? I need more trash cards. Stuff that you don’t *want* in your deck.

I’m going to start with an extreme addition, add see how that plays out: Three cards that just do 1 damage. We’ll call it Miniboop for now, and see how things feel with it in there. Will I want to delete them? Probably! That’s a good thing!

=-=-=-

Hmm, well, Miniboops are the new “Sweets” now – a trash card I never want to play, ever. Maybe they’d work slightly better at 2hp?

=-=-=-

Quick maths:

I’m now offering Juggling Balls at level up, so, with a starting deck, it looks like this:

Max damage with 3 dice: Boop + Boop + Miniboop = 8 dmg per turn
At level 2 with 1 Juggling Ball: 11 dmg per turn
At level 3 with 2 Juggling Ball: 14 dmg per turn
At level 4 with 3 Juggling Ball: 17 dmg per turn

I mean, yikes, ok, these ARE best case scenarios. But the point is: a starter deck can do 17 damage per turn reliably by level 4 – without picking up anything. You could win the game on just that.

As a baseline that is JUST too high. I’m gonna remove the Juggling Balls for now. Level up rewards for Jester are pretty tough ๐Ÿ™

=-=-=-

Could also consider making the Jester susceptible to bad rolls. What if boops were MIN3? Would make things much less automatic.

Eh, let’s quickly try that.

=-=-=-

Ah wow, that’s so so much much better!

Why did it take me so long to try that? Ahh it solves so many problems – it makes each turn far more “bumpy” and fun without weakening the actual damage output. It works with other equipment really well too – Juggling ball becomes a reroll with a 2/3rd chance of enabling you to use Boop. It makes you consider using the miniboops. It’s just a lot better in lots of different ways, yay.

=-=-=-

Ok, this is feeling much better now! Small problems aside that I’ll polish out later, I think I’m ready to move to floor three.

I am finding, with the amount of deletes I have, that I quickly get back into a play-by-numbers deck. Why not start with more trash cards and see how that feels? I’m gonna add another Miniboop and Boop and see how it goes.

Also, floor 4 is just the worst. I got offered a booster pack with trash and an absolute zero card, which is even worse than trash, somehow, because it’s basically unusable as Jester.

My ice attack thing is way too strong. I nerfed it a little. But worth rethinking?

So my fire attack is great: it’s just three times the number of fire damage on the enemy. That really works.

The ice one is different, though – bonus damage if the enemy is frozen. So it becomes about trying to set up the conditional. I had to nerf the actual damage amount a lot, since most of it was just based on raw dice damage.

Let’s instead change it to offer a single snowflake, and two conditional damage cards (versus two snowfakes and one conditional damage card) – so we can do up to 12 damage per turn if we get it right! This compares to six for fire, which somehow feels better? I dunno ๐Ÿ™

Let’s just leave the distribution at two snowflakes + 1 ice shatter, then.

=-=-=-

Ok, good news! The extra cards, as matches, do not slow down the early game at all, so that’s great. Remains to be seen how they affect the late game…

=-=-=-

Ice thingy is still too powerful? Hmm.

Maybe don’t offer deletes near the end – they’re less useful, and I want people to consider buying some cards instead!

=-=-=-

That run was really fun! Let’s make those changes, have a walk, and try again.

=-=-=-

This is starting to get really good.

It seemed like a small thing at the time, but maybe the biggest discovery of the day was the new “Bop” card – a 3 damage card that has a restricted slot. It added a crucial missing bit of texture to the starting deck, and instantly made the character way more fun to play.


“High Voltage”, the lightning conditional card
13th February:

At this point, I’m coming to the end of the process – Jester is playable from start to finish, and works. It’s very exciting!

So, it’s way beyond what I had timed it for, but I should be wrapping up the Jester today. I think they’ve come out really, really well. In the end, the crucial insight was figuring out how delicate the dice balance was, and respecting that. This is maybe a lesson that other deckbuilders get to have much earlier in development, but static layout thing let me put off figuring that out, I think.

Anyway: all the big problems are solved, and I’m now down to the details, I think. I’m gonna do one last playtest, then move on.

=-=-=-=-=-=-=-=-

Yay, Shield Bash is a surprisingly fun run. A smart player will upgrade shield grip, which means having a weaker deck for a floor, and then things become powerful but not too much. I like it a lot!

=-=-=-=-=-

Ok, so, weirdly, near the end, I’m finding the character underpowered. I’ve lost to Cornelius twice now! I think that means I’m missing a power card or something from between levels 2 and 3… Maybe adding a duplicate to the Deck would help? It might be excessive, but let’s try it!

=-=-=-

Yeah, the duplicates are a welcome power up, and the character’s still very interesting – died to the boss in the last test.


The New Jester

So, it’s the 18th of February now, and I’m feel really great about where the Jester’s landing. A quick summary of the changes (so far!):

  • “Snap” replaced with “Discard” – instead of changing matching cards for Dice, you just discard them. This sounds like it shouldn’t work, but makes the character much more interesting to play.
  • “Match 3” limit break replaced with “Snap”, which changes the Discard button to a “Snap” button, allowing you to activate matching cards for free on that turn. This is by far the most powerful limit break in the game now, and is super fun, especially when you pull it off and get 4 or 5 snaps in a turn.
  • Starting deck has changed dramatically – Wind up Fist is gone, instead you have four “Boops” (do 2 damage), three “Bops” (do 3 damage, MIN 3 slot), and two “Sweets” (get 2 HP, overhealing becomes a shield).
  • Finale cards are still around, but they’re much weaker. Dice Cannon does just one damage per dice now.
  • All the “Backup” skill cards have been redesigned.
  • In general, Jester is very careful about Dice balance – you get a single dice on level 2, and after that you get duplicate cards. There are some dice manipulation cards in the Jester pool, but they’re rarer and usually not the overpowered ones (e.g. Cauldron instead of Doppledice).
  • Pickups are larely designed around a new class of card where order matters – Flame Blast does damage based on how many burns you have on the enemy, for example. There are Fire, Ice, Shock, Weaken, Poison and Shield equipment paths, and they’re all pretty interesting to play.

Phew!

The thing about this iterative process is that things never feel done. Even though this is feeling really fun now, there are new things I want to try and tweaks I want to make. I think it’s important to make yourself stop at some point, though, or you can end up with systems that feel “overcooked”.

Oh my gosh you’re still reading, well done, that was a long one! I’m hoping to get this character finished and playable very soon – can’t wait to see how people get on with them ๐Ÿ™‚ Thanks for reading!

(usual reminders: if you want to know when the game comes out on steam, then you can wishlist us here! Or, if you wanna try out the alpha version right now, it’s available on itch.io for a discount price of just $7.50!)

* Post a Comment

Dice related stuff

Hello! It’s been a while! Let’s catch up! What’s been going on?


More Dice Stuff

For now and probably for a while to come, pretty much all my news is gonna be Dicey Dungeons related. ยฏ\_(ใƒ„)_/ยฏ

This last month, in particular, has been really full on. It feels like a lot of people are discovering the game for the first time right now! This is probably because of some combination of our IGF nomination (๐Ÿ˜Š), our new gameplay trailer (below), and word of mouth now that we’re getting closer to finished.

But, far more than anything else, I think lots of people are discovering us right now because of Angory Tom and his awesome youtube series on the game (above!). If that includes you, hi! Thanks for checking out the game!


We went to PAX South

Ahhh, I’m back from my first ever PAX! (Check out our new gameplay trailer that we made for the show!)

I’ve exhibited my work at other shows in the past, but PAX was something very different. For one thing, it’s way more player focused than other conventions I’ve done (which have generally been developer focused).

And it’s huge – people kept telling me that PAX South was “the small one”, but it’s easily the biggest convention I’ve ever been to. It had what felt like an acre of *just* tables for people to play board games on. I heard there were talks and a jumbo stadium sized cinema screen somewhere too, but I didn’t even see that side of things.

I had a lot of fun demoing our game there! We had a *lot* of enthusiastic players come by and check it out, and took a lot of playtesting notes that are gonna make the next version of the game even better. Can’t wait for PAX East!


We’re hard at work on v0.16

The next version of the game is coming out pretty soon! I’m aiming sometime early February for this one, but no promises ๐Ÿ˜›

For this version, the focus is on finally introducing some light story elements into the game. I was a bit worried about this step at first, but seeing how well it’s coming together, I think everyone is gonna like it a lot. The story is really helping the whole thing feel more connected and complete, without feeling like it’s in the way.

I’m also tackling on a lot of design stuff for this update, most importantly, reintroducing the Jester into the game, and doing a full design audit on the enemies. Also planning to take on as much stuff as I can from this scary list!

It’s really exciting to be this close to completion. I’m not sure exactly how many more alphas we’ll have before the final version is ready, but we’re getting very close.

(usual reminders: if you want to know when the game comes out on steam, then you can wishlist us here! Or, if you wanna try out the alpha version right now, it’s available on itch.io for a discount price of just $7.50!)

* 6 Comments

On a roll

Hey all! Happy new year!

Out with the old

Around this time every year, I clean up my blog sidebar, move old completed projects into annual folders, make room for new things. But last year, for the first time since I started this system in 2008, I didn’t finish any new games. In fact, the only other things I even worked on were State Machine, and a joke jam game, which I didn’t finish.

I’m finding myself weirdly at peace about this. I guess I’m just not in a “small” game phase of my life right now? Maybe that’ll change again in future, but for now, I’m just really enjoying working on this big dumb dice game.

In with the new

In Dicey Dungeons news: we have a new update! v0.15 came out on Christmas morning, and it’s *massive*. It features the quest system, which is the big idea at the heart of the game that I’ve been so excited to finally share. It also showcases the new enemy AI (previously written about in detail here), as well as a bunch of art, tech and design improvements. The whole team worked really hard on this one, and I’m really happy with how it’s turned out!

Finally, I’m incredibly proud our game is up for an IGF this year, for Excellence in Design! We are, I think it’s fair to say, kind of a long shot – but it means a lot to me to even be in the running. I can’t even.

I still don’t know exactly when Dicey Dungeons is going to be finished, but we are into the final stages of development now, and things are starting to fall into place. Gonna be a very busy couple of months for us! Thank you for playing <3

* 1 Comment

When’s the next update coming out?

Hey! So, it’s been a while since the last build of Dicey Dungeons. In fact, it’s been two months. I think it’s time for an update!

First of all, I’m sorry about how long this is taking. In the early days of the project, I was able to commit to updates every couple of weeks, which was amazing. But we’re approaching the end now, and that’s not really possible anymore. I am mostly trying to keep my head down and just focus on the work – but there is a lot to be done. I need to do better at communicating estimates and update plans – I’m sorry about that.

v0.15 is taking a long time because it is not like other updates. It’s foundational. I’m basically taking on all of the biggest, scariest, fundamental problems in the game at the same time. In my post after Day of the Devs, I identified five major issues that I wanted to address in the next version of the game: Story, Tutorials, Enemy AI, Quests, and the final character (the Jester).

Given how big this update is shaping up to be, I’ve decided to split these issues up into two updates!

v0.15 will now focus on the following:

  • Quests: This system is my plan for more playful repeated runs and meta progression, and I’m really excited about it.
  • New Enemy AI: Lots of work done on this recently! See this huge blog post for more info!
  • Basic Tutorial Features: This includes things like tooltips, seeing enemy moves on your turn, animation speed, etc.

While v0.16 will focus on:

  • Finishing the Jester: There’s not much left here, but I don’t want to rush this.
  • Story: We’ve been making a lot of progress on this over the last two months – as a team, we’ve figured out the story we want to tell, and we’re working with a writer to help us tell it. But this is something that’s going to take some time to get right.
  • A full tutorial: The other side of “tutorialisation”, I want to make a really good introduction level that both teaches new players how to play and introduces our story. Again, this sorta thing is really hard to get right, and we don’t want to rush it.

While I don’t want to give an exact date, we are hoping to have v0.15 ready before Christmas.

Thank you for your patience! The whole team is really excited about how the game is coming together, and we can’t wait to share the new version with everyone!

* 6 Comments

How Enemy AI works in Dicey Dungeons

Hey all! For the past month or so, I’ve been tackling one of the biggest technical problems in my new game, Dicey Dungeons – improving the enemy AI enough for the final release of the game. It’s been pretty interesting, and lots of it was new to me, so I thought I’d write a little bit about it.

First up, a sort of disclaimer: I’m not a computer scientist – I’m just one of those people who learned enough about programming to make video games, and then stopped learning anything I didn’t have to learn. I can usually muddle through, but a real programmer probably wouldn’t have approached all this the way I did.

I tried to write all this in a fairly high level approach in mind, so that hopefully the basic ideas all make sense to other non-programmers. But I’m for sure no expert on all this stuff, and if I’ve gotten any of the details wrong in explaining the theory, let me know in the comments – happy to make corrections!

Let’s start by explaining the problem!

The problem

If you’ve not played Dicey Dungeons, here’s a crash course: it’s a deckbuilding RPG, where each enemy has a selection of equipment cards that do different things. Also, they roll dice! They then place those dice on the equipment to do damage, or cause various status effects, or heal, or shield themselves from damage, or lots of other things. Here’s a simple example of a tiny frog using a big sword and a little shield:

A more complicated example: this Handyman has a spanner, which allows it to add two dice together (so 3 + 2 would give you a single 5, and a 4 + 5 would give you a 6 and a 3). It also has a Hammer, which “shocks” the player if they use a six on it, and a Pea Shooter, which doesn’t do much damage, but which has a “countdown” which persists across turns.

One more important complication: there are status effects which change what you can do. The most important of these are “Shock”, which disables equipment at random until you unshock it by using an extra dice on it, or “Burn”, which sets your dice on fire. When your dice are on fire, you can still use them – but it’ll cost you 2 health points. Here’s what a clever Handyman does when I shock and burn all his equipment and dice:

There’s more to it than that, of course, but that’s basically the gist of it!

So, the problem: how do you make an AI that can figure out the best thing to do on it’s turn? How does it know which burning dice to extinguish, which dice to use for unshocking and which dice to save for important equipment?

What it used to do

For a long time, my AI in Dicey Dungeons just had one rule: It looked at all the equipment from left to right, figured out the best dice to use on it, and used it. This worked great, until it didn’t. So, I added more rules.

For example, I dealt with shocking by looking at the unshocked equipment, and deciding what dice I would want to use on it when it was unshocked, then marking that dice as “reserved” for later. I dealt with burning dice by just checking if I had enough health to extinguish them, and choosing whether or not to do it by random chance.

Rule after rule after rule to deal with everything I could think of, and ended up with an AI that sorta kinda worked! Actually, it’s amazing how well this hodge-podge of rules held together – the AI in Dicey Dungeons might not have always done the right thing, but it was definitely passable. At least, for a game that’s still a work in progress.

But over time, this system of adding more and more rules to the AI really started to break at the seams. People discovered consistent exploits to get the AI to do stupid things. With the right setup, one of the bosses could be tricked into never actually attacking you, for example. The more rules I added to try to fix things, the more weird things would happen, as rules started to conflict with other rules, and edge cases started to crop up.

Of course, one way to fix this was to just apply more rules – work through each problem one by one, and add a new if statement to catch it. But I think that would have just been kicking the problem further down the road. The limitation this system had was that it was only ever concerned with this question: “What is my next move?”. It could never look ahead, and figure out what might happen from a particular clever combination.

So, I decided to start over.

The classic solution

Look up AI stuff for games, and likely the first solution you’ll come across is a classic decision making algorithm called Minimax. Here’s a video that explains how it’s applied to designing a Chess AI:

Implementing Minimax works like this:

First, you create a lightweight, abstract version of your game, which has all the relevant information for a particular moment in time of the game. We’ll call this the Board. For Chess, this would be the current position of all the pieces. For Dicey Dungeons, it’s a list of dice, equipment, and status effects.

Next, you come up with a value function – a way to measure how well the game is going for a particular configuration of the game – i.e. for a particular board. For Chess, maybe a board where all the pieces are in their initial positions is worth 0 points. A board where you have captured an enemy Pawn is maybe worth 1 point – and maybe a board where you’ve lost one of your own Pawns is worth -1 points. A board where you have your opponent in checkmate is worth infinity points. Or something like that!

Then, from this abstract board. you simulate playing all the possible moves you can make, which gives you a new abstract board. Then, you simulate playing all the possible moves from those boards, and so on, for as many steps as you want. Here’s an excellent illustration of that from freecodecamp.org:

What we’re doing is creating a graph of all the possible moves both players can make, and using our value function to measure how the game is going.

Here’s where Dicey Dungeons splits from Minimax: Minimax comes from mathematical game theory, and it’s designed to figure out the best series of moves in a world where your opponent is trying to maximise their score. It’s so named because it’s about trying to minimise your loss when your opponent plays so to as to maximise their gain.

But for Dicey Dungeons? I actually don’t care what my opponent is doing. For the game to be fun, you just want the AI do make moves that make sense – to figure out the best way to play their dice on their equipment to make it a fair fight. In other words, all I care about is the Max, not the Min.

Which means: for the Dicey Dungeons AI to make a good move, all I need to do is create this graph of possible moves, and look for the board which has the best score – then make the moves that lead to that point.

A simple enemy turn

Ok, examples! Let’s look at this frog again! How does it decide what to do? How does it know that it’s chosen action is the best one?

It basically just has has two options. Place the 1 on the broadsword and the 3 on the shield, or do it the other way around. It obviously decides that it’s better off putting that 3 on the sword than the 1. But why? Well, because it looked at all the outcomes:

Place the 1 on the sword and you end up with a score of 438. Place the 3 on it, and you end up with a score of 558. Great, ok! Then, I get a better score by placing the 3 on the Sword, done.

Where’s that score coming from? Well, the Dicey Dungeons scoring system currently considers:

  • Damage: The most important case – 100 points for every point of damage dealt.
  • Poison: An important status effect that the AI considers almost as important as damage – 90 points for each poison.
  • Inflicting other Status effects: Like Shock, Burn, Weaken, etc. Each one of these is worth 50 points.
  • Bonus status effects: Inflicting yourself with positive status effects like Shield, etc, is worth 40 points each.
  • Using equipment: Using any piece of equipment is worth 10 points – because if all else fails, the AI should just try to use everything.
  • Reducing countdowns: Some equipment (like the Pea Shooter) just needs a total value of dice to activate. So, the AI gets 10 points for every countdown point it reduces.
  • Dice Pips: The AI gets 5 points for every unused Dice Pip – so a 1 is worth 5, and a 6 is worth 30. This is intended to make the AI prefer not to use dice it doesn’t need to use, and does a lot to make its moves look more human like.
  • Length: The AI loses 1 point per move, making it so that long moves have very slightly lower scores than short ones. This is so that if there are two moves that would otherwise have the same score, the AI will pick the shorter one.
  • Healing: Worth just 1 point per health point healed, because while I want the AI to consider it in a tie break, I don’t want it to be preoccupied with it. Other things are always more important!
  • Bonus score: Bonus score can be applied to any move, to trick the AI into doing something they might not otherwise decide to do. Used very sparingly.

Finally, there’s also two special cases – if the target of the attack is out of health, that’s worth a million points. If the AI is out of health, that’s worth minus a million points. These mean that the AI will never accidentally kill themselves (by extinguishing a dice when they have very low health, say), or never pass up a move that would kill the player.

These numbers aren’t perfect, for sure – take, for example, these currently open issues: #640, #642, #649 – but it actually doesn’t matter that much. Even roughly accurate numbers are enough to incentivise the AI to more or less do the right thing.

Harder enemy turns

The frog case is simple enough that even my shoddy code can figure out every single possibility in 0.017 seconds. But, then things get a bit more complicated. Let’s look at that Handyman again.

It’s decision tree is, uh, a little more complicated:

Unfortunately, even relatively simple cases explode in complexity pretty quickly. In this case, we end up with 2,670 nodes on our decision graph to explore, which takes quite a bit longer to figure out than the frog did – maybe as much as a second or two.

A lot of this is combinatorial complexity – for example, it doesn’t matter which of the 2s we use to unshock the equipment initially, this algorithm considers them as two separate decisions, and creates a whole tree of branching decisions for both. This ends up with a branch that’s a totally unnecessary duplicate. The are similar combination problems with deciding which dice to extinguish, which equipment to unshock, what dice to use in what order.

But even spotting unnecessary branches like this and optimising them (which I’ve been doing to some extent), there is always going to be a point where the complexity of the possible permutations of decisions leads to huge, slow decision trees that take forever to figure out. So, that’s one major problem with this approach. Here’s another:

This important piece of equipment (and things like it) cause a problem for the AI, because they have an uncertain outcome. If I put a six in this, maybe I’ll get a five and a one, or I might get a four and two, or maybe I’ll get two threes. I won’t know until I do it, so it’s really hard to make a plan that takes this into account.

Thankfully, there is a good solution to both of these problems that Dicey Dungeons uses!

The modern solution

Monte Carlo Tree Search (or MCTS, for short) is a probabilistic decision making algorithm. Here is a, uh, slightly odd video which nevertheless explains the idea behind Monte Carlo based decision making really well:

Basically, instead of graphing out every single possible move we can make, MCTS works by trying out sequences of random moves, and then keeping track of the ones that went the best. It can magically decide which branches of our decision tree are the “most promising” thanks to a formula called the Upper Confidence Bound algorithm:

That formula, by the way, is from this very helpful article on Monte Carlo Tree Searches. Don’t ask me how it works!

The wonderful thing about MCTS is that it can usually find the best decision without having to brute force everything, and you can apply it to the same abstract board/move simulation system as minimax. So, you can kinda do both. Which is what I’ve ended up doing for Dicey Dungeons. First, it tries to do an exhaustive expansion of the decision tree, which usually doesn’t take very long and leads to the best outcome – but if that’s looking too big, it falls back to using MCTS.

MCTS has two really cool properties that make it great for Dicey Dungeons:

One – it’s great at dealing with uncertainty. Because it’s running over and over again, aggregating data from each run, I just let it simulate uncertain moves like using a lockpick naturally, and over repeated runs, it’ll come up with a pretty good range of scores of how well that move will work out.

Two – it can give me a partial solution. You can basically do as many simulations as you like with MCTS. In fact, in theory, if you let it run forever, it should converge on exactly the same result as Minimax. More to the point for me, though – I can use MCTS to generally get a good decision out of a limited amount of thinking time. The more searches you do, the better the “decision” you’ll find – but for Dicey Dungeons, it’s often good enough to just do a few hundred searches, which only takes a fraction of a second.

Some cool tangents

So, that’s how the enemies in Dicey Dungeons decide how to kill you! I look forward to introducing this in the upcoming version v0.15 of the game!

Here are some tangential thoughts that I don’t really know where to put:

Those graphs I’ve been showing gifs of? Including this one on twitter:

I created these by writing an exporter for GraphML, which is an open source graph file format that can be read with many different tools. (I’ve been using yEd, which is great and which I can recommend a lot.)

Also! Part of making this all work was figuring out how to let the AI simulate moves, which was a big puzzle in and of itself. So, I ended up implementing an action scripting system. Now, when you use a piece of equipment, it runs these tiny little scripts that look like this:

These little scripts are executed by hscript, a haxe based expression parser and interpreter. This was definitely kind of a pain to implement, but the payoff is great: it makes the game super, super modable. I’m hoping that when this game finally comes out, people will be able to use this system to design their own equipment that can do basically any cool thing they can think up. And, even better, because the AI is smart enough to evaluate any action you give it, enemies will be able to figure out how to do whatever weird modded equipment you give it!

Thanks for reading! Happy to answer any questions or to clarify any of this in the comments below!

(And, finally, if you’re interested in playing Dicey Dungeons, you can get alpha access on itch.io right now, or if you prefer, wishlist us on steam, which will send you a little reminder when the game comes out.)

* 7 Comments

Day after the Devs

Hey! It’s been a while since I posted anything here. Let’s catch up!

Since March this year, I’ve been working on a new game called Dicey Dungeons! You might have seen me talk about it a bit on twitter. It’s a deck-building RPG that I started making for this year’s 7 day roguelike. (I’ve gone a bit over the seven days now, though.)

I’m incredibly excited about this game, and could talk all day about why I think it’s great – but what’s really huge about this project for me, personally, is that I’m doing something that I’ve NEVER done before. I put a team together.

Team Dicey Dungeons is me, and three other full timers – Niamh “Chipzel” Houston on the music, Marlowe Dobbe on the art, and Justo Delgado Baudรญ on the programming. I’m also getting help from Lars Doucet with steam workshop and modding support, and Dana Trebella, who’s helping me figure out how PR and Marketing works in 2018. Oh, and I’m translating the game into 16 languages. It all kinda just happened, one person at a time.

I feel very lucky. The team is amazing, and I think our game is gonna be great. It’s the most fun I’ve had making stuff since I first went indie, and I think that’s something you can really feel when you play it. I spend as much time playing the game as working on it.

But, occasional gifs on twitter aside, I really haven’t been as good about talking about this game as I should be, and I want to try changing that. So, I’m gonna try blogging about how things are going a little bit more! Here’s what’s been happening lately:


We went to Day of the Devs

I’m just back from San Francisco, where Marlowe, Niamh and I showed the game in public at Double Fine’s Day of the Devs! Marlowe has shown earlier versions of the game before, at local events in Portland, but this was my own first time demoing the game in public.

Day of the Devs is a really fun event! They show 70 or so unfinished games at different stages of development, open to the public, for free. And the line up was amazing! Check out that video, omg!

Dicey Dungeons went down really well. Everyone who played our demo played all the way through to the end, which is honestly a great sign in an environment like this, and we got a lot of really, really enthusiastic feedback. I have a ton of useful notes about improving stuff in the early game that I’m looking forward to implementing.

Personal highlight of the day: a kid, who had played the game twice, dragging their friend over to try it out. I overheard them say “it’s actually really good“! Yay ๐Ÿ˜€


We’re working on the next update

In the early days of the project, I was doing updates every week, then every two weeks, and then… whenever they’re ready. Open development is still pretty new to me, and I guess this is just how things go when a project gets bigger and more people get involved.

v0.15, our next update, is shaping up to be the biggest update we’ve done yet. We’re finally taking on some of the really big, scary problems with the game that we’ve kept pushing back. This includes:

A quest system! I’ve got this cool idea for a meta progression system that I’m dying to try out. People have talked about wanting more from each playthrough – about making the game longer, or harder – but that’s not the direction I wanna take things in. I want to keep Dicey Dungeons short, snappy and fun – and instead, push the design in other directions – weirder, more playful. A good reference point I think about here is doing a level one run in Dark Souls: it’s not interesting because it’s hard, it’s interesting because it gives you this narrow focus on a subset of the design, and makes you think about the systems that you know in a new way.

Finish the Jester! I want to finally finish up the Jester character, and take them out of alpha. Being so different from the other characters, the Jester’s definitely been the toughest character to get right. They’re getting pretty close to done now, though.

Smarter Enemies! I’ve been working on a new AI system, using the same algorithm as AlphaGO, Monte Carlo Tree Search. It’s, uh, maybe a little overkill for Dicey Dungeons, actually. But it is nice to finally have this problem figured out!

Tutorialisation! I want to finally do some work to improve the early game for new players. This includes new features that make it easier to figure out what’s going on, like tooltips and being able to see the enemy deck on your turn, but also better signalling of what’s happening with animations and sounds and UI, and a short tutorial mode to explain how to play. All this stuff is really overdue!

Story! Or, the beginnings of it, at least. We’ve been putting this off for a while, and we’re not planning anything too elaborate – but we have a lot of ideas about this world we’ve created, and we’re looking forward to introducing some of it in the next update.

I consider all five of those things essential for the next update, and we won’t release it until we have all of them. This means that things are going to take a little longer. Thanks you for your patience!


We’re thinking about the end

There’s an argument to be made, especially with roguelikes, that you can, maybe should, work on it indefinitely, constantly tweaking and changing and adding stuff. I don’t agree with that. Ultimately, I believe it’s best for there to be a definitive, final version of Dicey Dungeons. We don’t know exactly when it’s going to be finished, but we are thinking a lot at the minute about what we want in v1.0 of the game.

If you’re interested in the final version of Dicey Dungeons, the best thing to do is wishlist us on steam, which will notify you when the game’s released:

[Wishlist us on steam]

Thanks for following us through all of this. We’re really excited about this project, and hope you’ve enjoyed playing all the early alpha builds so far! <3

* 8 Comments

Help Wanted: Additional Programmer for Dicey Dungeons

Applications are now closed. Thank you!

Hello all! I’m looking for a programmer for a new videogame I’ve been working on, Dicey Dungeons. Itโ€™s a full or part time position for at least two months, and possibly longer. Ideally, youโ€™d be available to start as soon as possible!

Dicey Dungeons is currently available in early alpha on itch.io, and it’s coming to Steam and Mobile in the next few months – i.e. we’re into the last few months of development. You can get the latest version here, or play some earlier free builds here. (Here’s a great youtube video of the most recent version!)

Dicey Dungeons is a three person project right now – a musician, and artist, and me, on design and programming. For the last six weeks, I’ve spent almost all of my time on programming work, and it’s meant design work has come to a halt. I think that’s been bad for the project, and I want to do something about it!

What I’m looking for

Dicey Dungeons is created with Haxe, using my own framework, which is an extension on top of OpenFL and HaxeStarling. I’m looking for someone who’s familiar with at least some of that!

  • Experience with Haxe is a prerequisite.
  • Experience with OpenFL and Starling would help a lot, but isn’t mandatory.
  • Experience with Haxegon isn’t expected.

What kind of work would you be doing?

I’m basically looking for someone to tackle the more technically focused programming jobs, so that I can concentrate on the design focused ones. These jobs include:

  • Optimisation: reduce draw calls, reduce cpu use, and skip unchanged frames where possible to reduce the system requirements of the game and make it run better across all devices.
  • Create a system to automatically create 1080p assets from our 4K assets as needed, and restructure the code so that it can automatically handle different asset resolutions as an in-game setting.
  • Expand the audio tech in the game to increase the range of cool things we can do – weโ€™re really interested in exploring dynamic audio – particularly syncing sounds to music, using real-time filters like reverb, and layering tracks.
  • Figure out a workflow for getting our After Effect animations working in starling fast and efficiently. Potential solutions range from building our own animation tech, to converting the animations to starling friendly file formats.
  • Restructure and simplify the game’s “action” system so that we can implement a minimax AI for the enemies.
  • Do the tech side of getting the game working well on mobile devices (which is mostly about reducing texture memory use – carefully unloading and reloading assets as needed). (I’ll be doing the design side – i.e. resolution independence, UI changes)
  • Work towards making the game more moddable – this mostly means making it possible to load and unload different mods at runtime and creating a system to support that, refactoring existing systems in the game to make it easier for people to create radically different enemies, equipment and characters, and working with the existing modding community to add stuff they might want!
  • Implement platform specific features like cloud saving and achievements for steam, iOS and google play. In particular, I’d really like to add Steam Workshop support.
  • Help out with the more technically focused bugs on this public github issues list.

Money

Payment stuff is negotiable! I can probably afford a rate of ยฃ25/hour GBP for two months, but I’m up for discussing more for less time depending on your qualifications and experience!

This job is for someone working remotely online – I’m based in London, but it doesn’t matter where you’re based.

Applications

If youโ€™re interested, you can apply via this google form! Please fill it in by Monday the 3rd of September.

[Applications closed]

Thank you!

Comments Off on Help Wanted: Additional Programmer for Dicey Dungeons

One more week

Hi! I really hate to do this, but I’ve decided to push v0.11 of Dicey Dungeons back by another week. That means I’m now aiming for the 3rd of August. I should have done this last night, but I really wanted to keep to the schedule. I’m sorry. ๐Ÿ™

The new version is an absolutely huge tech overhaul. We’re totally ditching the old pixel art canvas approach and we’re using 4K art everywhere. Getting this to work has been no small thing, and, if I’m honest, has been something of a learning process for me – it’s not something I’ve ever really done before.

I have a version of the game that more or less works, but it still has some pretty serious tech issues, and I’m very uncomfortable releasing it like this. So, I wanna take another week. Do it right. I think making the game as good as it can be is more important than sticking to what’s ultimately a pretty arbitrary schedule.

I’ve been stressing about this a lot! I’m really sorry! I’m really excited to share it next week!

Edit: Hey. This is taking way, way longer than I expected. I’m basically working flat out to get this finished, but I don’t know when that’s going to be. As soon as I possibly can, is all I can say right now. Thanks for your patience <3

* 6 Comments

Dicey Dungeons v0.11 delayed a week

Hey! Just to let you all know, I’ve decided to push the next version of Dicey Dungeons back a week. This means that the next build, v0.11, will be coming out on the 27th of July instead of the 20th.

I obviously hate doing this – delaying a build is basically a last resort, and this is only the second time since March that I’ve done it. But this is a big, important update, and I don’t want to rush it. I appreciate your patience!

Also, gosh, I’ve been terrible about keeping this blog post up to date! Here’s a recent catch up of Dicey Dungeons related stuff:

  • I finally announced the team! The final version of Dicey Dungeons will feature art by Marlowe Dobbe, and music by Chipzel. The next update is all about finally getting their work into the game, which I’m very excited about.
  • Now that things are getting closer to completion, I’ve stopped releasing alphas for free. However! Alpha versions are still available on itch.io! Buying the game on itch gets you access to the newest alphas, as well as a copy of the finished game.
  • v0.10 is out! This one introduces the fifth character, the Robot!
  • Got a steam page too! Coming soon!
* 3 Comments

Dicey Dungeons v0.8

New Dicey Dungeons update! v0.8 introduces a new class, The Witch!

You can play it here: https://www.terrycavanaghgames.com/dice/8/

<3

* 10 Comments

Older »