Week 70: UX and playability improvements

An animated GIF of a recording from Meteor Power showing the new radial-menu label, new info panel contents, new styling, and new slow-motion desaturation.
Updates to the radial menu, info panel, slow-motion desaturation, and styling.

tl;dr: Last week I made a lot of improvements to the UX and playability of Meteor Power.

What happened last week?


  • Radial-menu polish.
  • Slow-motion and desaturation updates.
  • Styling updates.
  • Bot and station selection and touch-tracking updates.

Laundry list

  • Radial menu:
    • Disable camera-panning when the radial-menu is open.
    • Fix an issue with radial-menu-item radius sometimes flickering during on-hover transition.
    • Fix radial-menu center-area radius.
    • Fix radial-menu-item hover-out transition.
    • Refactor some radial menu logic live in radial-menu-items rather than the radial-menu.
    • Create a new SpriteModulationRadialMenuItem.
    • Add support for sliding the radial-menu and camera when the radial-menu would otherwise render outside the viewport.
    • Add the station radial menu.
    • Add a label for the currently-hovered radial-menu item.
    • Add support for overriding the radial-menu label with a custom scene.
    • Add an energy cost to the radial-menu label.
A screenshot from Meteor Power showing the new radial-menu label and the new slow-motion desaturation.
A new radial-menu label,
and slow-motion desaturation.
  • Styling:
    • Fix bot lights to not illuminate the bot and nearby parallax background layers.
    • Update SpriteModulationButton to use ColorConfigs.
    • Refactor some color-highlight configuration.
    • Update colors.
    • Add support for desaturating nodes during slow-motion even if they use materials with custom shaders.
    • Add support for slow-motion-desaturating color-modulation-based nodes.
    • Make stations desaturatable.
    • Make bot and station outlines desaturatable.
    • Make backgrounds and tilemaps slow-motion-desaturatable.
    • Make SpriteModulationButtons desaturatable.
    • Make meteors desaturatable.
    • Fix navigation-path-preselection annotation to also show a pulse for the invalid-destination indicator.
    • Fade-out the HUD when a character is active for player control.
    • Add support for dynamically fading the entire HUD and regions of the HUD.
    • Update stations to only ever show run-wire as a persistent overlay-button.
    • Update button image sizes to not include a one-pixel margin.
    • Fix overlay-button touch screen-radius values.
    • Add some new button icons.
    • Update about-screen layout.
    • Hide all overlay-button-panels when fading hud during nav selection, and when radial-menu is open.
    • Configure an offset for where to render the radial-panel; nudge this up a bit for stations.
    • Adjust the styling for the radial-menu-label.
    • Create an EnergyLabel scene for showing energy costs.
    • Create an energy icon.
  • Slow motion:
    • Enable slow-motion when the radial-menu is open.
    • Add support for enabling slow-motion on any AnimationPlayers and AnimatedSprites.
    • Enable slow-motion for meteors and stations.
    • Update display-time values to use a configurable time-type (i.e., slow-motion vs unscaled time).
    • Fix meteor-power configurations for slow-motion:
      • Don't pause music
      • Do show navigation-preselection-path pulse
      • Don't show beat hashes
  • Touch tracking and selections:
    • Add support for deselecting other bots and stations when selecting a new bot.
    • Deselect bots and stations when closing the info panel.
    • Did some experimenting to learn exactly how the sequencing of Godot’s `call_deferred` works:
      • All `call_deferred` invocations are handled in the same frame they are registered.
      • Even if a `call_deferred` is registered from the callback of a previous `call_deferred`, it is still handled within that same frame.
      • The latest `call_deferred` callback is registered at the end of the queue.
      • This is important information to inform how I’ll add support for listening for _unhandled_ touch events.
    • Add support for tracking whether a touch-event is unhandled.
    • Update navigation-path-selection to ignore touch-up events that have already been handled.
    • Remove LevelControl.is_touch_disabled in favor of LevelControl.mouse_filter == Control.MOUSE_FILTER_IGNORE.
    • Disambiguate bot-select taps from bot-navigation taps.
    • Fix issues with radial-menu closing, info-panel closing, and handled-touch-event tracking.
    • Fix an issue with LevelControl level-space position calculations when they were in the HUD canvas layer.
    • Update stations and bots to not swallow touch-up events.
    • Rename player-pointer-listener to player-touch-listener.
    • Fix navigation-preselection to start on touch-down.
    • Add support for disabling all level-control touches.
    • Disable all level-control touches while the player is selecting a navigation path for a character.
    • Update PauseButton and InspectorPanel-footer to be LevelControls.
    • Add support for configuring whether to cancel active-character-for-player-nav selection when selecting an invalid nav destination.
    • Deselect the active bot when selecting an invalid nav destination.
    • Fix pressed/down event-handler for overlay buttons.
  • Camera transitions:
    • Add support for querying the current progress of a tween.
    • Update the camera system to support matching a previous camera's offset and zoom.
    • Reduce camera updates by combining tween-interpolated methods.
    • Add support for an additional zoom-out/in for different cameras.
    • Fix camera extra-zoom to not exceed max-zoom.
    • Fix navigation-preselection to not override zoom.
  • Miscellaneous:
    • Fix a strange issue with Godot Dictionaries failing to erase a null (or probably actually a freed object) key.
    • Add a new home icon.
    • Fix corner-match-tilemap inner-tilemaps to share the same collision and light layer properties as their parent.
    • Fix an issue with pausing music when the pause-screen opens.
    • Update SpriteModulationButton to automatically calculate the sprite scale based on the button size.
    • Add support for ensuring that a character ends up landing on a surface when stopping an in-progress navigation.
    • Exit first-wire-end-pressed mode by tapping again on the first-connection station.
A screenshot from Meteor Power showing the new info-panel contents.
New content in the info panel.

What's next?

  • Some more info panel improvements.
  • Add logic for disabling commands when they don't make sense or their isn't enough energy.
  • Add a simple descriptive tutorial / hints panel.
  • Some small camera polish.
  • Refactor the power-line system.

🎉 Cheers!

This is a simple icon representing my sabbatical.