Rhythm Quest Devlog 49 — New Promo Art, Other Random Updates

6 min readJan 29, 2023


Working on Rhythm Quest off and on (~2–3 days per week) makes it harder to find time to do these devlogs, but I’ve still got a bunch of updates to report on nonetheless.

New Promo Art

First and probably most exciting, we have some brand new key art for Rhythm Quest, courtesy of my good friend Kat Jia.

You’ll now see this new art replacing the old pixel drawing in various places, such as on the Steam and itch.io pages, as well as the main Rhythm Quest website. I also went ahead and made a bunch of other versions of the image, such as this tall one which is used for the Steam library view:

The new art turned out amazingly well, and looks really cute and warm. It’s almost a little =too= bubbly for what the actual gameplay looks like, but in coming up with the original pink/purple/yellow color palette I intentionally wanted something that would stand out brightly in a Steam listing against the dark blue background:

It’s maybe not quite as bright as the images that use full yellow backgrounds, but it distinguishes itself pretty well, I think!

Sayuri Sprite Updates

Back in pixel art land, I figured this was a good opportunity to update the in-game Sayuri sprites and actually add in her cat-like ears:

I don’t know why I didn’t just do this originally — they really weren’t hard to draw at all, and I even threw in some minor subpixel animation to give them a little bit of bounce. I’m glad I got around to this; the old version of the sprites just looks weird to me now…

I also got around to fixing up her crouching frame, which I knew was sort of sub-par but hadn’t fixed since it only shows for a split second in actual gameplay. Same silhouette and sizing, but now it looks like she’s actually crouching down instead of being squished by her hair…

New Demo Level

True to my word, as a celebration of hitting 10k wishlists at the end of last year, I made level 3–4 available in the demo!

I had to spend a little bit of time reworking some code to make sure levels 3–2 and 3–3 could correctly be skipped in the demo without breaking anything, but that’s all working now. Level 3–1 averages 1.7 actions per second with a peak of 2.4, whereas level 3–4 averages 2.2 with a peak of 3.0, so it’s quite a step up! Hopefully that will be enough to keep everyone satisfied until I can manage to finish the rest of the game…

OSX Text To Speech

Currently Rhythm Quest integrates with screenreader / text to speech (TTS) functionality in order to provide accessibility for those who are visually impaired. Unfortunately, this has been pretty non-functional for non-English characters (unicode glyphs of all types…).

The TTS implementation that the UI Accessibility Plugin uses is platform dependent, and on OSX it functions by simply spawning a process to invoke the built-in system “say” command. “say” actually comes with a number of different voices, many of which are designed to be used for different languages/regional dialects:

> say -v \?
Albert en_US # I have a frog in my throat. No, I mean a real frog!
Alice it_IT # Salve, mi chiamo Alice e sono una voce italiana.
Alva sv_SE # Hej, jag heter Alva. Jag är en svensk röst.
Amélie fr_CA # Bonjour, je m'appelle Amélie. Ma voix est en français canadien.
Amira ms_MY # Helo, nama saya Amira. Saya bercakap Bahasa Melayu.
Anna de_DE # Hallo, ich heiße Anna und ich bin eine deutsche Stimme.
Bad News en_US # I sure like being inside this fancy computer
Bahh en_US # Do not pull the wool over my eyes.
Bells en_US # Time flies when you are having fun.
Boing en_US # Spring has sprung, fall has fell, winter's here and it's colder than usual.
Bubbles en_US # I sure like being inside this fancy computer
Carmit he_IL # שלום. קוראים לי כרמית, ואני קול בשפה העברית.

Given that, it was pretty simple to add some logic to map the currently-selected language to a voice to use, and pass it as an argument to the “say” command. Here’s that all in action:

Of course, if your particular installation of OSX doesn’t have the particular voices that I chose, this will fail…but hey, at least it’s something? Unfortunately, I couldn’t find any easy way to get foreign language TTS working for the Windows implementation, so that one is still basically nonfunctional for other languages for now…

Other Fixes

The latest two patches included a number of bugfixes and improvements, including a fix for a curious issue that resulted in being able to clip out of bounds under the stage. This happened when the timestep between frames was too large, which didn’t happen under normal circumstances, but tended to occur in unusual scenarios like (as I learned) a WebGL tab being backgrounded (browser-dependent behavior).

The funny part is that I already had some code that was meant to handle this (I frequently ran into this issue when the standalone build lost focus and stopped updating, but the music kept on playing) — I make sure that when advancing the player’s x position, I do it in fine-grained intervals rather than all at once, checking for interactions along the way, to prevent you from skipping across major parts of the level.

The issue here was that if you had y-axis movement going on, I didn’t do any such thing for your vertical velocity, so you’d easily skip past any spikes or flooring collision boxes with a large enough timestep.

I reworked this code so that instead of chunking out each movement axis separately, I just take the overall time difference and chunk =that= into fine-grained intervals, which works just fine.

Ludum Dare 52

In non-Rhythm Quest news…we placed 1st overall in Ludum Dare 52!

Our narrative-based game “A Day in the Life of Death” ended up taking the gold medal overall out of 1,144 entries, also placing 2nd in graphics, 1st in audio, and 2nd in mood. You can check out the game here, if you’d like to give it a try!

That’s going to do it for this update! Hopefully next time around I’ll be able to report some progress on starting up level design for world 5!

Learn more about Rhythm Quest and play the free demo at https://rhythmquestgame.com/