devoops
Cover image

Atiya’s Quest Dev Log

published 16/07/2025 in Games | tags : Linux, Windows, Android, Atiya's Quest, Games, Release, Dog, Pom, Pomeranian, Atiya, PuzzleQuest

  Estimated read time: 9 min.

Atiya’s Quest Dev Log

Back in 2024, I released a free game that’s available for Linux, Android and Windows.

It’s a match-3 puzzler game featuring my Pomeranian dog Atiya.

While I’m not super into the match-3 genre itself, a game that I really enjoyed growing up was PuzzleQuest, and I spent countless days and evenings playing that on my Playstation PSP. I’ve always wanted to make my own version and I’ve been learning Godot.

Anyways, so I’ve been making my own PuzzleQuest-like. And I’ll try to detail the progress I’ve been making over the past year since I released the puzzle-only version last year.

First Steps

With the puzzle version created, I had an essential part created that I’d need, a grid of tiles that can be swapped and matched.

The next part was adding monsters and a battle system. I wanted to have a turn-based battle system where you can swap tiles to attack monsters, and I wanted to have a variety of monsters with different abilities.

Monster and Manabars

At this point I had monsters, and manabars, so matching colors would grant the appropriate mana colors, I didn’t have any win conditions yet as you can see the monsters hp’s at -3. But it’s a start, and it helped me understand how to use / create custom Resources or Prefabs in Godot (I wrote an article on them previously if any clarification is needed on them).

I also added some very basic abilities that the player and eventually monsters could use.

Turns and Combat Log

Next I needed some state and turns, so that the player and the monster would each get turns matching tiles.

I made a very basic turn transition screen, that I’m still using now, but I’ll eventually fix it up to be more presentable, but it works for now! Also I’ve added a combat log to be able to display the log of the various abilities / mana gain done over the course of combat.

showing the turn screen

Particles and Shaders

Next I wanted to have some floating damage numbers (I’m not sure if that’s the technical term, but I remember it was the name of a MOD in world of warcraft that basically did the same).

To achieve these, numbers, it involves creating a subviewport that looks at a label. Which then screenshots the label, and can then use it as a particle effect texture. Which is kinda neat, and maybe I’ll write some more about some of the effects that you can create with this trick in a later article, I’ve used it for quite a few things it turns out. Evade messages, Critical Strike notifications, XP, gaining gold, using Continues, etc.

showing off floating damage numbers

Another thing you can spot here are the shader effects on the bomb pieces on the scene here, while it’s a screenshot you can’t really see the glowing effect clearly, they’ll be featured in some later gifs. However I’d never written any shaders ever, so it was a really interesting subject, and I have a new found respect for dedicated shader writers. The one’s I’ve written so far have mostly been really simplistic, and mostly to highlight/glow, but you can do pretty much anything with them, it’s quite amazing.

glow shader

In the above picture you can see a shader effect for my row bomb, and also my Hint effect that’s just created with a Tween and position jitter.

Finally playing with different shaders, and trying to write a decent glow / highlighter, I was testing it out on my title screen.

Shaders on my titlescreen

Some more experimentation with shaders:

shader playground

If this doesn’t give you epilepsy, I don’t know what will. But it was a fun experiment in comparing my various shader implementations.

Gameplay

Next we have some early shots of how the gameplay was diverging from the basic puzzle grid that I had created. Now bombs glowed, and I had implemented glowing healing and damage effects over top of the player and monster images. You could do damage, and the abilities now showed their mana cost, and could go on cooldowns, same goes for the monsters (their abilities can be found below their portraits).

showing off some early gameplay

Abilities / Jobs

Next I needed an interface for equipping abilities, but I also wanted to tie unique skills / stats to each possible (250) combinations along with a unique title granted to the player for each combination available.

abilities1 abilities1 abilities1

Here you can see some of the various costs and ability descriptions, but also the unique job titles and some of the stats granted by them.

As you add more abilities to your action bar, your job title evolves along with your stats and abilities. So equipping more pink abilities will keep giving you more involved stats.

Showing job swapping when adding abilities

Bark abilities / jobs

bark abilities

Skills Tree!

For the skill tree, I wanted to give as many interesting choices and flexibility to the player as I could, so I took inspiration from the Path of Exile tree’s which are now infamous.

skill tree screenshot

The skill tree allows you to increase your characters stats and unlock abilities that you can use during gameplay, and unlock different jobs.

Level select / Dungeons

Now we needed dungeons to discover and explore. The level selection is inspired by the branching graph choices from Slay the Spire and the dungeon crawling from BuriedBorne.

Shows the early dungeon crawling

Juicing up!

(Mostly just shader shenanigans)

While not natively a gamedev, I wanted to add some neat effects to properly indicate the turns, and make the mana bars have some cooler effects (like the Bloodborne healthbars). You can see the gaining health “glow” effect in these as well as the turn indicator highlights.

turn indicator turn indicator

Balatro / Dynamic Shader BG’s

Getting more familiar with shaders, and the release of Balatro (If for some reason you haven’t played it, it’s one of the best games of the last few years). I put some effort in making dynamic backgrounds for some of my levels using only shaders. And Balatro makes great use of these, I found a reference shader on shadertoy and ported it to Godot, and here’s the result when jammed into my game. I will likely remove this in the final release but for now it’s a nice surprise when running into it on random runs.

grid turned off, balatro bg different shader background

Grid based abilities

I needed more abilities, here’s some prototyping of different grid based abilities.

First the “Slam” ability, which knocks out a crosshair shape out from the center of the screen.

slam ability

And the Bork ability which makes an X shape.

bork ability

World Map

The overworld, or world map, allows you to investigate various locations (forests, caves, settlements) and interact with some NPC’s farmers, cityfolk etc. From here I’ll be able to eventually add Quests and Vendors and a bunch of RPG elements.

On my world map, I also start toying around with menu’s and dialogue trees and interactable npcs.

Below you can briefly see my worldmap and dialogue tree when entering a short level select screen, before engaging in combat.

brief worldmap interaction

Events

If we are emulating Slay the spire, and just about every other dungeon crawler, you can’t get away from random events.

Here I’ve implemented the beginnings of an event system.

events

Achievements

Unlocks and Achievements are a nice fun part of most games, so I went to work implementing them for Atiya’s quest, they are a simple panel that can take an Achievement prefab that I’ve created for the various achievements. I’ve also created an unlock system, that is driven mostly from unlocking certain achievements. Below are my character unlock screen and some achievements in their current incarnation, I’m sure like most things they’ll change over time, as most features have gone over several iterations.

Achievement viewer:

achievement

Character select screen:

character unlocks

Dice Rolls 2D

Like most things going through several iterations, here’s my first iteration on doing dice rolls / skill checks.

Starting simple I made a 2d dice roller, with some Tweens and Particles.

Iteration 1 initial dice:

d10's 2d

Iteration 2 with basic skill check:

d10's 2d second iteration

Iteration 3 Skill check with shader burn:

dice in a skillcheck

Iteration 4 3D Dice on a skillcheck:

3d dice in a skillcheck

Iteration 5 on the loot screen w/roll highlighting:

3d dice in a loot screen

Difficulty settings

Now I am starting to stitch most of the disparate systems that I’ve been creating together to make it resemble more of a game. But first we need a difficulty screen.

difficulty select screen

Putting more pieces together

Stats viewer, we need something to browse our stats, that we get from all the equipment, abilities and jobs. Something that lets us track down where and what bonuses we are getting.

Basic stat viewer:

stat viewer screen

Full stats screen:

stats screen

Finally Steamdeck!

So I wanted to play this on my Steamdeck, but my default resolution for this game is set to 720x1280 since I mostly play it on my cellphone. This gets scaled incorrectly on the steamdeck, it’s still playable as-is, if you have tiny fingers or extreme patience to use the controller.

However in the immortal words of Raymond Hettinger“there has to be a better way”.

Clearly the only way to deal with this was to rotate the whole thing 90 degrees and swap the resolution to 1280x720 (SD uses x800, but 720 is close enough for now).

So first thing I do is write up a rig that can rotate my scenes on load, and a few helper methods to detect if I’m running on the steamdeck or not.

This however lead to many issues that I didn’t realize I would have. Firstly, anything using a subviewport (which by default PopupMenu’s, Tooltips and a few other native Godot types use), suffers from not actually getting rotated when we rotate the entire scene. Which meant implementing my own custom UI components to replace the menu’s and tooltips that I was using.

Here’s an early shot of my rotation shenanigans.

screen rotation

If you are quick you can see on my settings screen the OS / Distro information and GPU settings, I use these to determine if you are running on a steamdeck or not and then apply the resolution / rotation automagically. Otherwise it’s toggleable, in the event you want to play whilst hurting your neck at the same time.

Conclusion

There’s no conclusion, I keep working at this when I have spare time, as it’s a super interesting project, I really enjoy reverse engineering different systems from games I really love, and working them into my own little creation here. Let me know if there’s anything you’d like me to cover in the next updates, but I feel as if this ones already getting pretty long. Thanks to anyone that’s made it this far.