Demons Hand - card roguelike

Hello Defold community! This is Demons Hand. A card roguelike with MMO PvE multiplayer. We’ve been working part time on this in a team of three for almost 1.5 years now!

Influences: Diablo, Hearthstone, World of Warcraft, Slay the Spire, NetHack


Ok what are we talking about here?


This is an online only game (maybe it should be called Demons Hand Online, hmmm). ALL the game logic is implemented on our servers. The Defold game is actually a “thin client”. It receives events (eg. draw card, play effect, remove card, etc) and the client just obliges.


Players start by themselves but then in the later levels can enter rooms that have other players in them. We’ve crammed in cards that synergise with other players, so try to cooperate nicely! Party up and slay the demons together! :wink:

Why Defold?

Because it’s awesome! :sunglasses: Ok, but seriously, I have a dream of making a super low latency mobile game that throws you straight into game as soon as you open the app. Defold is amazing for this because the app size is smaller than all the other engines. Our design goal is to make a rich multiplayer game world that is easy to get into (ie. fast boot up, fast connect, etc) :dash:


Lots of cards. So many cards. Maybe too many cards?

This is a deck builder. You pick a unique class character (eg. Samurai) and then build your card deck by: 1. Picking up loot, 2. Selling cards, 3. Buying cards, 4. Fusing two cards into a new card, 5. Using skill stones to get class exclusive cards, 6. Slamming cards on the anvil shrine to upgrade them


“When it’s done”:sweat_smile: Haha, we actually really want to do an external beta in the near future.


The game looks amazing! I really look forward to playing it!!! How can we follow the progress of this game?


Wow how come this is the first time I’m seeing it, looks absolutely stunning! I really want to play it :slight_smile:


I’ll be sure to mark “when it’s done” on my calendar! :wink:


Thanks for your kind responses! We are busy trying to do some spring cleaning (we’re aussie developers :kangaroo:) so that we can start handing out beta access to Android users at some point. If you want to follow along please check our instagram:


This looks amazing and if you release it, I will again lose hours if not days of my life :sweat_smile:


I can see that :grin: But so am I!

And your game really looks great.

1 Like

Android beta is live! Join our discord to get access!

We just finished exhibiting at PAX Australia. We talked to a thousand people. :smiling_face_with_three_hearts:

Some learnings from PAX:

  1. Remove MMO from our marketing

Even though technically we have all players play in the same global dungeon, the “MMO” description is pushing our genre too far (ie. deck builder roguelike). It seemed like an awesome marketing idea at the time but players really want to understand what your game is immediately. “MMO” confuses players more than anything, ie. MMO players don’t want to try your deck builder game out, and deck builder players don’t want to touch MMO, lose-lose.

  1. Start marketing cooperative play

It was surprising to see a ton of players (eg. parent and child, board game friends, etc) were excited about being able to play cooperatively. We’ll build out some social features to cater for this, eg. “Summon friend portal” which sends a deep link to friends. One of our key design goals now is to reduce barriers to getting friends to play with each other.

  1. Put up a steam page ASAP

A large number of people want to play on Steam. We’re going to get cracking on releasing a desktop version! Having the game be crossplay is going to improve the experience on mobile (ie. there will be more players online). The longer we don’t have a Steam page the more wishlists we are missing out on! :dizzy_face:

  1. Some UX changes are necessary

0% of players ever tapped the level up button! We are going to make this button more prominent. Can you spot the level up arrow button at the bottom of this screenshot? :sweat_smile:

One player was adamant that we speed up the card reveal animation which is (checks source code) 600ms at the moment. Wow we really need to half that… at least. This is another one of those developer times when you’ve been playing the game so much but fail to question fundamental basics you’ve grown used to.

For the most part the game is intuitive once someone has SHOWN you how to play. We need to spend some more time on the tutorial because not all players will have someone around to explain!! In this screenshot at the very beginning, the game is suggesting that you play the Strike card at the gate, OR the “belt” slots. This is not so good, because the belt is a concept we should teach later on in the dungeon. The proper fix here is to HIDE the belt until the player gets further along


Looks great, and I’m happy to hear that you’re jumping on Steam too!

If you’re new to Steam (I am), I can recommend, run by Chris Zukowski, as a guide to the platform. On the HTMAG Discord you can get feedback on your Steam page, trailer, capsule design etc., and there’s a tracker there for upcoming Steam festivals so that you don’t miss out on signing up for any.


For anyone else looking for the Discord URL:

@beandaddy, I had to work a bit to find the link. The Discord server is mentioned on Instagram but not linked to.

Screenshot 2023-10-09 at 09.56.11

And on the webpage it also mentions the Discord server but doesn’t link to it:

Screenshot 2023-10-09 at 09.56.27

I had to scroll up again to discover the Discord icon:


Oh no:

1 Like

Crikey! Thanks for the heads up. Just fixed Instagram and the website

But you still didn’t link it here! You should really spam your social media at any opportunity someone gives you, people can’t click your social media links if you don’t link them to begin with :smiley:


Correct link is

1 Like

We released a large update early in January! Here are some of the highlights.

iOS beta

We sent invite URLs to the wonderful iPhone owners who’ve been on our waiting list since October. Over 50% installed the game within two days. 0% have had any crashes, thanks Defold! :heart_eyes:

Frame shop

Still a work in progress but in this screen you’ll be able to view and use the frames you’ve collected. Eventually the frame will appear in the highscore screens.

Settings screen

Notice the “multiplayer” checkbox. This was added because we wanted players to opt-into multiplayer. Generally new players don’t want to see other players haha.

Share link

Sometimes players want others to join their game, so we added this button to create a deeplink players can tap to join other players games. I really want to put in more social stuff like this - it feels like the Right Thing™ to do for a mobile game.

End turn refinements

We’ve removed the ability to end turn “scum”. This is when a player hits the end turn button continuously to take advantage of healing effects. We never cared too much about scumming because it destroys your “turn” score. However we realised it doesn’t feel so good to players who don’t care about the “turn” score.

Changes included:

  • end turn button vanishes when you clear a room
  • transformed the end turn button into a “draw” button when you reach waypoints. The player can go wild and draw their entire deck without it impacting their turn score
  • monsters can move diagonally so will eventually get to you if you don’t do anything
  • added an Angel that spawns in your dungeon if you hit endturn too many times (a la Spelunky ghost)

Next up

  • fix the bugs (want to move away from daily hotfixes :sweat_smile:)
  • get sign in working
  • get In App Purchases working

Where did you get the art work? That’s my biggest challenge.

1 Like

I’m interested in hearing about the multiplayer aspect of the game. Which libraries and backend services are you using, if you don’t mind sharing?


@schlista We have an amazing artist :star_struck:

@WhiteBoxDev extension-websocket is used to communicate between client and server.

Everything the player can interact with has an ID. When you drag a card onto a monster the client sends a “play card ID1 on piece ID2” websocket message to the server. The server replies with events, eg. “piece ID2 took 5 damage”, “piece ID5 moved to tile ID8”, “hand contains cards, A, B, C, D”. The app is a “dumb client”, it doesn’t know the game rules. The server sends tons of metadata (eg. what pieces a card can target and the pieces affected by the area of effect). It works great sending events/deltas but sometimes client bugs can cause desynchronisation issues, eg. invisible monsters, strange card targets. Also we gotta be careful that the websocket messages we receive are split up ( fails because of huge tables from the websocket messages).

The “server” is hosted in AWS. API Gateway manages the websocket connections. API Gateway proxies websocket messages to Kinesis. There’s a Lambda function that consumes the Kinesis records and sends events on the API Gateway websocket connections. Everything is pay per request (except for a Kinesis hourly charge). The Lambda functions are written in a different language and don’t know about Defold.

Kinesis is nice because it works as a FIFO queue BUT we can have multiple consumers. Also Kinesis is configured as a “tumbling window” which means we don’t need to persist game state every play. One consumer processes the game events, and another calculates achievements and statistics. We use multiple consumers to reduce latency (eg. We do the achievement calculations in the 2nd consumer so that the latency in the game consumer is as low as possible). Every 20 seconds we persist the game state to DynamoDB. Having multiple consumers is tricky because we MUST have zero non-determinismistic bugs otherwise the consumers desync from each other.

Another nice thing about Kinesis is that we can replay the game events in a 24hr window. This is handy for debugging.

I want to put in a 3rd Kinesis consumer that produces a video stream so we can have spectators…

It’s interesting because serving multiplayer is a data processing problem. As long as the incoming data is FIFO it works. In fact, we have a testing environment that uses FIFO SQS instead of Kinesis - works a little slower and without achievements but works.


Great, thanks for the generous details!

I might be wrong, but it seems like the client should be able to figure out these details without requiring larger packets from the server. Since the client and the server both know the state of each object with an id, the logic for “what pieces a card can target and the piece affected by the area of effect” is doable on both the client and the server. Is there a reason you decided to only run the simulation on the server? (Not having to duplicate code is certainly a valid reason) :sweat_smile:

I don’t see any pre-existing backend service for managing things like friendlists or other common videogame requirements. Were functionalities like this written manually, instead of using something like Nakama?

Kinesis sounds interesting and very useful. I’m not sure what you mean by “multiple consumers” in this context, but I assume you mean “consumers of incoming websockets messages from clients”?

1 Like

Did you set everything up yourself? Are you in touch with anyone at AWS to help you optimize cost and resource usage?