1. Rhythm Quest
  2. News

Rhythm Quest News

Devlog 79 - Hard Charts, Settings Tweaks, and More

[h2]Easy/Hard Difficulty Charting[/h2][p]I've been quietly plugging away making the easy/hard mode charts for all of the existing levels. Back in June I got done with recharting level 4-1, but since then I've gotten through another 7 levels and am now finished with those additional charts for level 5-3, plus some of the bonus levels![/p][p]Since everyone loves seeing videos, here's one that demonstrates some of the harder patterns in action. Some of these later levels are getting quite tough![/p][previewyoutube][/previewyoutube][p][/p][p]I especially appreciate the patterns where the ghost enemies jump forward into grouped sequences of flying enemies, like in this sequence from level 4-5:[/p][p][/p][p]
[/p][p]The quick pattern of hold - flying enemy - release has been a really common pattern in the hard difficulty charts. In level 5-2 it gets enhanced to feature green combo enemies at the start:[/p][p][/p][p]
[/p][p]In the normal difficulty, sixteenth-note rhythms aren't introduced until the yellow ghost enemies in level 6-1, and rapid sixteenths aren't used until level 6-3, but in hard mode they start showing up in level 5-3. This was both the point at which I was having trouble making things any harder without using sixteenth rhythms, and also a point in the music where it just made sense to throw them in:[/p][p][/p][p]
[/p][h2]Basic/Advanced Settings Split[/h2][p]In the last devlog I went over my big rework of the settings menus so that everything is available in one unified/paged menu:[/p][p][/p][p]
[/p][p]After a few weeks of actually using this new menu, I found that while it was great for exploring the plethora of miscellaneous options, I actually found it a little tedious for doing common tasks, like toggling auto play or changing music speed, etc. It helps a =bit= that I added page up / page down bindings to flip through the pages quickly (alternatively, you can use the mouse wheel or gamepad shoulder buttons), but I didn't necessarily want to rely on those.[/p][p]The new iteration is a hybrid approach, where I have the most common options in a basic menu format like before, but the "Advanced Settings" button drops you into the paged version where you can access all of the more complicated stuff:[/p][p][/p][p]
[/p][p]Hopefully this approach will combine the best of both worlds, though I'll have to sit with it for a while before forming a new opinion of it.[/p][p]
[/p][h2]Editor Work[/h2][p]I totally broke the level editor a while back when I was doing my big refactor where backdrops and tilesets were specified per checkpoint instead of for the entire level. I've since gotten the editor working again, and turned the backdrop/tileset dialog into a per-checkpoint tool:[/p][p][/p][p]
[/p][h2]Screenreader Fixes[/h2][p]I did another pass on screenreader fixes and support, including making the new advanced settings menu work with screenreader navigation, fixing the level 1-1 tutorial. There was also a fun bug where I was trying to disable built-in screenreader support on Steam Deck, but I was calling that API incorrectly, resulting in a completely different bug where screenreader functionality was broken on Windows if you had a screenreader running...[/p][p]There was also a screenreader issue on Windows where unicode text wasn't being encoded properly, leading to something like "你好" being sent to the voice synthesis as "ä½ å¥½", which was of course unintelligible. I somehow managed to make the appropriate fix to the C++ side of the accessibility plugin that I'm leveraging, along with pulling in code that lets you switch the voice used for the speech synthesis (only works if you have that Windows language pack installed...), and even fixed a race condition.[/p][p]The basic settings menu will also show you a quick shortcut for Accessibility options if you have screenreading enabled or have one running:[/p][p][/p][p]
[/p][h2]Performance Optimizations[/h2][p]I don't have any fancy stuff to talk about regarding performance, mostly just a lot of little things here and there that I took care of. For example, I've completely ripped Unity's animation system out of all of the obstacles in the game and am manually controlling each sprite frame using my own implementation (those animations are quite simple anyways). There were some other random things here and there -- caching some variables here, changing out a data structure there.[/p][p]One other thing that I noticed performance-wise was that the in-game settings menu was struggling to render efficiently, because there are a whole bunch of big transparent dialogs layered on top of all the actual gameplay and backdrops that have to already be rendered in the background. This was especially bad on systems like the Switch, where fillrate and overdraw (having to render a bunch of different layered transparent things on large swaths of the screen) was already an issue.[/p][p][/p][p]
[/p][p]Except...when the settings menu is being displayed, the game is paused and nothing is moving! So there's no reason we need to keep re-rendering the backdrops every frame, we can just turn off the backdrop cameras and updates (except for special cases like when you toggle certain settings) and save on all that rendering time.[/p][p]There's actually something else really big related to performance that I forgot to mention (or even think about) last year when I was doing a big refactor on how backdrops are rendered:[/p][p][/p][p]
[/p][p]The big change I made was that I composite all of the backdrop layers into a temporary texture first, and then draw that final result onto the screen. This might seem like the same amount of work as before (or actually one additional step), but there's one important optimization that past me made: the temporary texture is sized at 1x (no pixel upscaling at all). So if you're playing the game at 1920x1080 (which by default uses a 3:1 pixel ratio), the temporary backdrop texture is actually only 640 pixels wide! Rendering at 33% dimensions means we only need to render 1/9th of the pixels as we originally did, which is huge for performance. It does mean that we lose out on subpixel backdrop scrolling, but that's something that I honestly wasn't a huge fan of to begin with (subpixel scrolling is still supported elsewhere).[/p][p]With all this done, I'm happy to report that the game runs smoothly on Nintendo Switch, even in the later levels where I've got many backdrop layers overlaid on top of each other. Hooray![/p][p]I've also optimized level load times...this was a funny one as it turns out that the grass (!) in levels 1-1 and 1-4 were slowing down ALL level load times (d'oh!). The grass got added to those two levels about four years ago, and I guess at that time I somehow thought that I needed the grass to be dynamically generated by spawning many different small patches of it because otherwise it would look too patterned or something? Or perhaps that was how I solved the issue of how to place grass on slopes? (make lots of small short patches of flat grass across the entire slope)[/p][p]So I had code that spawned a ton of different grass objects at level generation time...and unfortunately, because I had refactored the level generation to use "universal" tiles that supported transitioning to =any= tileset for every level, this happened for every single level load, not just levels 1-1 and 1-4. Well, the grass is no longer dynamically spawned, it just tiles statically and I just made some sloped grass graphics that are super duper straightforward. Not sure why I didn't go with this solution initially, but...there you have it.[/p][p][/p][p]
[/p][h2]Respawn Markers[/h2][p]Because I was already doing some performance optimizations on the song density chart in the level browser, I had a little fun and the game now keeps track of where you died in your fewest-deaths run, marking those with little red "X"s in that chart.[/p][p][/p][p]
[/p][p]This is just a small little throwaway feature at this point, but maybe I could do something a little more fun with it at some point, like after every play show you a more exciting visual animation of all of the times you died. Not really something I want to sink a bunch of time into right now, though.[/p][p]
[/p][h2]And more...[/h2][p]I meant to get this devlog out earlier but kept on working on actual development instead of writing about what I had done so far. I suppose that's not really a terrible thing, probably more efficient for me to spend time actually working on the game instead of writing about it after all. There are a bunch of other random things that I also tackled since my last update 3 months ago (did you know that the values you get from scroll wheel input are completely different on Mac and Windows, and depending on whether you use a trackpad or a mouse? Or have inertial scrolling disabled? Fun...), and I also did a bunch of Steam Deck-specific fixes, but that's all that I'm going to write about this time around. Hopefully I can continue to make good progress through the remainder of the year![/p]

Rhythm Quest Demo v0.38.0 Released

[p]The Rhythm Quest Demo has been updated to version 0.38.0.  This update includes a rework to the settings menu organization, as well as many other fixes and improvements.[/p][p]Full changelog:[/p]
Version 0.38.0
- Split settings into basic settings and advanced settings menus
- Fixed some coin sfx playing even when disabled
- Fixed doubled input bug when using steam deck or certain other gamepads
- Fixed broken jump inputs when using steam deck touchscreen
- Fixed crash/lockup on level browser screen
- More robust handling of device suspend/pause events
- Better load time / more efficient grass for level 1-1 and level 1-4
- Fixed y-axis scaling in level browser density charts
- Performance enhancements
- Level load time improvements
- Density chart now uses magenta color for 300-360 notes per second
- Added failsafe to automatically trigger respawn if y position is too far off
- Fixed inconsistent beat pulsing for some in-game menus
- Respawns (for best runs) are now tracked in save data and displayed on density charts
- Shortened "Perfect" text in level select list
- Compacted ui elements in level select list for low width aspect ratios
- Give more space to right half of level select list
- Allow variable line width for level select descriptions to prevent overflow
- Fixed behavior when changing music speed while unpausing
- Fixed accessibility audio cues using wrong volume/audio bus
- Fixed accessibility audio cues always being panned to one side
- Fixed broken accessibility audio cue for jump release
- Add audio cue setting for jump hold + attack
- Fixed screenreader navigation for advanced settings menu

Rhythm Quest Demo v0.37.2 Released

[p]The Rhythm Quest Demo has been updated to version 0.37.2.  This update includes some major fixes to accessibility/screenreader functionality, as well as UI tweaks and other fixes.[/p][p]Full changelog:[/p]
Version 0.37.2
- Adjusted default pixel clamping behavior to allow for "subpixel" scrolling
- Added pixel clamp option to restore previous behavior
- Finally (?) fix sprite clamping artifacts causing horizontal/vertical lines/gaps
- Fixed level generation bug causing shifted/overlapped spikes
- Fixed character disappearing on world transitions in level select
- Fixed odd menu transition between first calibration and level select
- Fixed settings menu navigation bugs
- Tweak darkening effect for settings menu
- Fixed minor issues with level select UI
- Performance improvements for some UI screens
- Fixed tablet mode blocking mouse/keyboard inputs
- Add ability to page through settings screens using pgup/pgdown/scroll wheel
- Fixed and improved screenreader functionality for settings screen
- Fixed and improved screenreader functionality for level select screen
- Fixed and improved screenreader functionality for difficulty select screen
- Fixed and improved screenreader functionality for level browser

Rhythm Quest Demo v0.37.0 Released

[p]The Rhythm Quest Demo has been updated to version 0.37.0.  This large update includes a ton of bugfixes and some new functionality, including a brand new settings menu.[/p][p]Full changelog:[/p]
Version 0.37.0
- Replaced "Settings" and "Mods" with new unified settings menu
- Faster "Restart Level" without reloading entire scene
- "Start Game" now skips difficulty selection
- Full difficulty select menu now accessible from the level select screen
- Fixed incorrect ramp placement for level 1-1
- Fixed missing level 1-3 water effects
- Added level 1-3 water effects to level select menu
- Fixed level 2-2 flight zone speedup
- Adjusted camera tracking - added camera height smoothing
- Fixed broken diamond indicators for ghost enemies
- Fixed input timeline hold indicators on subsequent level loads
- Correctly despawn input timeline markers when warping in practice mode
- Fixed music sync issue when pausing before first beat of a song
- Added ability to skip/quicken main menu transitions with an additional press
- Added setting to enable auto play but disable saving progress (Jukebox mode)
- Fixed track preview not following track vertical position
- Removed initial calibration prompt and automatically start calibration unless skipped
- Fixed navigation keys/buttons triggering calibration inputs
- Fixed auto play text being hidden behind tutorial prompts
- Fixed auto play text not being shown in practice mode
- Added experimental support for tablet PC input (Settings -> Controls -> Tablet Mode)
- Remove audio fading behavior when quick scrolling through song select menu (delay start instead)
- Allow clicking directly on non-active items in song select menu
- Added clickable/draggable scrollbar to song select menu
- Fixed incorrect pageup/pagedown behavior for song select menu
- Decrease outline thickness on smooth font
- Fixed mouse clicks on bottom of screen not registering even when practice mode is disabled
- Tweaked pixel snapping behavior for many sprites
- Fixed some text wrapping issues with unicode font
- Made autoplay less prone to missing inputs during FPS drops/skips
- Coin UI decrements more quickly when losing a large number of coins
- Fixed obstacles not respawning correctly after end of level in practice mode
- Adjusted vertical positioning of input timeline
- Fixed practice mode speed override display behavior
- Fixed bug when changing music speed and pausing simultaneously
- Retain menu selection when disabling full screenreader control
- Fixed Fade screen filter

Devlog 78 - Unified Settings, Camera Smoothing, etc.

[p]Somehow the springtime always seems to be extra busy for me, and I ended up not really making much progress on Rhythm Quest last month due to having a million other things to worry about. I'm back at it, though, at least for now...[/p][h2]Unified Settings Menu[/h2][p]I've been somewhat dissatisfied with the overall organization of the settings menus for some time now. The design of each menu itself was pretty ok (I wrote about this in an early devlog), allowing for intuitive interaction with any control scheme:[/p][p][/p][p]
[/p][p]However, as I've added countless different tweaks and options (there are over 60 in total so far, and I'm only making more as I go), separating them all into their own menus has proven to be cumbersome. I have something on the order of 20 of these different settings menus, because each menu can only hold about 4 or 5 rows worth of actual toggles (remember, buttons and text need to be readable and easily tappable even on a mobile device!). I've already had to divide these into "Settings" and "Game Mods", which itself is a distinction I've become less and less happy with:[/p][p][/p][p][/p][p]
[/p][p]Recently I tried to actually set some time aside to think of an alternative design where I could unify multiple settings menus into a single thing that you can navigate and flip through, instead of a bunch of disparate menus. If this were a desktop or console-only game I'd just have a big scrolling list, but I feel like that paradigm doesn't really work well when you use touch or mouse input. Instead I tried to have multiple horizontal "pages" that you can flip between.[/p][p]Here was my first attempt at a unified settings menu:[/p][p][/p][p]
[/p][p]Looks relatively clean, though it introduces a few new issues. One is that there's just too many pages to flip through to find what you want. There's no sort of indexing or hierarchical structure, so it can feel like you're just paging through a million different screens without a good way to find something specific.[/p][p]I didn't want to go back to having a top-level menu, and I didn't have enough screen real estate to add another tab or index. Instead I tried to at show you the titles of the adjacent pages, so that you can navigate based on the headings:[/p][p][/p][p]
[/p][p]I also show the adjacent pages with a lowered opacity, to give the impression that you're browsing through cards in a stack and give a visual indicator that there is something else to scroll to. Initially I had all of the pages wrap around in an infinite loop, but I actually decided not to do that as it felt more "anchored" to have an actual left "end" page or right "end" page to give you a reference point as to where each of the pages are individually within the list.[/p][p]With keyboard/gamepad input this all works really intuitively as it just navigates seamlessly between pages. With mouse/touch input you instead need to click on the left/right arrows directly to navigate. It's probably broken for screenreader input, but that's a battle I'll have to wage another day...[/p][p]As an added bonus, I'm taking this opportunity to make sure that I reuse as much of the same menu paging system for the in-game menu as well, instead of trying to organize that differently. There's still some adjustments that will need to be made there, but hopefully I won't need to manage two entirely different sets of menu pages...[/p][h2]Camera Smoothing[/h2][p]I've now implemented a simple algorithm for smoothing the vertical movement of the camera. Instead of directly tracking every height change in the track, it now interpolates so that height changes are anticipated slightly and are in general more "eased". Here's the before and after:[/p][p][/p][p]
[/p][p][/p][p]
[/p][p]I had to play around with this a bit before I decided that I liked it, but I'm pretty sold on it now. I was initially thinking of adding a new menu setting where you could adjust how much smoothing is applied, but I decided against that in the end -- I don't think this is the kind of thing that people need a choice for.[/p][p]Overall this is a minor change, but you can really notice it on certain track sections, and it also helps some issues that were present with the old implementation around very long airjump/flight sections.[/p][h2]Timing Indicator[/h2][p]This one has been on my to-do list for a while -- an (optional) visual timing indicator for more advanced players (or anyone looking to verify their calibration). I ended up implementing this in two ways; the first style is a fixed bar that stays in place on screen, with markers indicating how early or late you are on each successful obstacle interaction:[/p][p][/p][p]
[/p][p]I also have an alternative version that you can use that displays the timing offset for every obstacle as you pass them. Not sure if this is really more readable, but it's an option![/p][p][/p][p]
[/p][p]This is getting closer and closer to being able to have an (optional) traditional judgment system for your note timings. I want to be pretty deliberate about when or if I end up implementing this, as it could end up snowballing into a bunch of additional work (grading systems mean a more complicated result screen, adding more save data, etc.) for something that is intentionally not part of the core experience.[/p][h2]Fast Level Restart[/h2][p]Restarting a level now no longer reloads the level from scratch (if you want to do that you can still just quit the level entirely and then play it again). Instead, it keeps the level loaded and just gives you a respawn to the very beginning of the level, resetting all of the obstacles and coins. This is similar to the behavior that you get if you disable checkpoint respawns, and should help you out if you're trying to go for a high score but aren't using that toggle.[/p][p][/p][p]
[/p][h2]Song Select Tweaks[/h2][p]The song select menu has been an interesting UI hurdle since it (along with the rest of the UI in the game) needs to handle multiple different input mechanisms. I previously implemented touch swipe controls for this list, but one downside of the existing UI is that you were only allowed to click on the currently-highlighted song. Clicking on any of the other ones would simply scroll it into the middle, which worked "OK" but not ideal.[/p][p][/p][p]
[/p][p]I've reworked this so that you can simply click on any of the songs in the list to instantly ready it up. If you're using a mouse, the easiest way to navigate through the rest of the song list is to use a mouse wheel, but...of course, there's no guarantee you even have one of those (hi laptop/trackpad players?). To make sure everything is still sensible, I implemented a scrollbar on the right side of the list that you can click or drag:[/p][p][/p][p]
[/p][h2]Game Start/Menu Flow[/h2][p]After some mulling over in my head, I ended up changing my mind and "Start Game" now takes you directly to the world select menu (except for a first-time player, where it takes you directly to level 1-1), skipping the difficulty selection screen. The difficulty selection screen is now accessed through the button on the top of the level select:[/p][p][/p][p]
[/p][p]I previously thought that it was important to me to feature the difficulty selection screen before you start playing the game, but I'm backpedaling on that a bit because I feel like level 1-1 is probably going to be a fine experience for anyone regardless of skill level since you need to get introduced to the basic flow of the game anyways. The level 1-1 charts don't differ that much between easy/normal/hard anyways and after clearing that level you might have a better sense of whether you want to change up the difficulty. It's more important for me to get people into the game without getting bogged down with a bunch of menus![/p][p]Along that same vein, the audio calibration now starts up automatically instead of asking the player whether they want to do it (and recommending that they do). You can still skip it if you want, this is again just a way to eliminate one extra screen of reading and processing. The audio calibration UI itself still needs work (I've seen a lot of people fare really poorly on this screen), but that'll have to be a project for later...[/p][p][/p][p]
[/p][p]And finally, the default sliding menu transitions can be skipped through if you simply hit a button an additional time, allowing you to navigate through the menus slightly faster if you want:[/p][p][/p][p]
[/p][h2]Bugfixes and More[/h2][p]I've also been fixing a number of other random issues here and there, including the fact that I accidentally got rid of the nice pretty water effect for level 1-3 entirely (whoops). I also finally knocked out another todo item in that the water for level 1-3 now actually displays in the level select screen (it never did before):[/p][p][/p][p]
[/p][p]There was also an interesting edge case that's been on my todo list for a while: double or multi-hit enemies that span across multiple checkpoints:[/p][p][/p][p]
[/p][p]Previously this didn't work properly, as every enemy was assumed to only "belong" to one specific checkpoint. So if the last hit of a ghost enemy was just past a checkpoint, it wouldn't actually respawn correctly after you reached that checkpoint. But this now works properly and the ghost is reset to the correct state depending on where you are in the song. Works with double-hit enemies too, if they happen to cross over a checkpoint threshold![/p][h2]Issue Tracking[/h2][p]This isn't available publicly yet, but I've also started working on setting up a form for people to submit bug reports and issues via github:[/p][p][/p][p][/p][p][/p][p]Thinking about how to handle bug reports and issues has actually been on my mind for quite a few months now (right now there is just a scrappy #suggestions channel on the Rhythm Quest Discord which I'd like to eliminate). Initially I invested heavily into trying to create an in-game flow for submitting bug tickets -- I was implementing code that would automatically capture a game screenshot and then be able to upload it to a hosting site, then use the github API to create a ticket and link the attached screenshot.[/p][p]In-game bug reporting has some nice advantages in that you don't need to leave the game to report issues, and I can automatically include a bunch of information such as the build version and platform, and maybe even some relevant log output. But in the end I checked myself and felt like the effort I would need to invest to make a sensible UI for all of this didn't justify the benefits. I couldn't think of a way to really make the feature very discoverable either, so in the end I'm falling back to just using github issues to track this sort of stuff.[/p][p]You end up requiring a github account in order to file issues with this flow, but that isn't necessary a bad thing either. In the end I realized that I'm only a single person and even if I had a ton of bug reports coming it it's not like I would be able to timely address all of them anyways -- so it's to my advantage to choose a solution that's more prone to giving me a smaller number of quality issue tickets.[/p]