Week 39: Robust navigation-interruption resolution

An animated GIF showing an interrupted navigation. The player selects a path, but the character hits an unexpected surface while falling-down and moving around a corner.
Navigation can be interrupted by hitting an unexpected surface.

An animated GIF showing a correction to the previously interrupted navigation scenario. The player selects a path, and even though the character hits an unexpected surface while falling-down and moving around a corner, the positioning and surface-grab state of the character is kept as expected by the navigation.
I added support for forcing navigation state to ignore unexpected interruptions.


tl;dr: I added more-robust options for resolving navigation interruptions, I finished adding support for oddly-shaped surfaces, and I participated in the Ludum Dare 49 game jam!


What happened last week?

Highlights

  • I added more-robust options for resolving navigation interruptions.
    • In particular, I added support for forcing the character position and surface-attachment-state to match what is expected for the current edge playback.
  • I finished adding support for oddly-shaped surfaces!
  • I participated in the Ludum Dare 49 game jam over the weekend!
    • I'll talk about that in a separate post later this week.

Laundry list

  • Better support for handling navigation interruptions:
    • Add support for forcing surface-state to match the expected next frame when a navigation interruption occurs.
    • Add support for treating stuck-navigations as an interruption.
    • Add support for configuring how SurfaceNavigator should handle interruptions.
      • These are the different resolution modes:
        • Cancel navigation.
        • Retry navigation.
        • Skip the current edge.
        • Force the character position and surface-attachment-state to match what is expected for the current playback of the current edge.
    • Fix an issue with edge-interruption false positives.
    • Add support for forcing surface-state to match what is expected, when the previous edge ends successfully because the character was grabbing the next-neighbor instead of the destination surface.
  • More support for oddly-shaped surfaces:
    • Add a check that intra-surface edges don't collide too early with concave neighbors.
    • Add support for detecting when the character-rounding-corner surface-state is interrupted by a collision with an unexpected surface.
    • Fix climb-to-adjacent-surface start/end position calculations for concave connected surfaces of opposite sides.
    • Abandon climb-to-adjacent-neighbor edges when either end can't actually overlap the required surface.
    • Add general support for abandoning calculations with surfaces that the character shape could not be projected onto (due to concave neighbors).
    • Fix climb-to-adjacent-edge interruption and completion logic to correctly allow touching the next-neighbor and to ensure no-longer touching the origin.
    • Update climb-to-adjacent-surface edges for concave corners to use different start and end positions, which can better ensure that following collisions will be with the destination surface rather than the origin surface.
    An animated GIF showing the character moving around a level full of oddly-shaped surfaces. No matter the size or shape of surfaces and corners, the character can now move around everywhere.
    The character can now successfully navigate all of the oddly-shaped surfaces and corners!
    • Miscellaneous:
      • Fix a regression with character-surface-state logic that could indicate that multiple surfaces were being grabbed simultaneously.
      • Fix a small mixup between surface_type and edge_type for intra-surface-edges and climb-to-adjacent-surface-edges.
      • Update player-navigation-behavior to only cancel nav on keypresses that correspond to explicit movement.
      • Fix a nav log statement to show edge state instead of path state.
      • Fix a bug involving a position-along-surface shared-reference and mutation.
      • Add some improvements to logging info.
      • Add some asserts to ensure the expected surface is being used.
      • Update surface-state logic to disable attachment when pressing the jump button.
      • Update initial-surface-attachment to record the last_position_along_surface value.
      • Fix various PositionAlongSurface usages to mutate rather than reassign, which prevents unexpected bugs due to mutations from another reference.
      • Add a temporary work-around for a stale character.reachable_basis_surface value.
      • Update debug flags to skip deeply-validating surfaces, in order to speed-up level-load times.
      • Assert collidable_tilemap spacing matches what's expected from manifest and ruler annotation
      • Fix initial camera zoom.
      • Various small code cleanups.
      • Tested current builds on HTML.
        • Verified that things run well, and that framerates aren’t too low.
        • At least, framerates are ok once logging and extra annotations are disabled...
      • Cut new releases for the Surfacer and Scaffolder frameworks.
        • On both GitHub and the Godot Asset Library.
        • Highlights for this release:
          • Add support for oddly-shaped and single-vertex surfaces.
          • Add more-robust navigation-interruption resolution.
          • Add navigation is-stuck detection.
          • Improve annotation renderings.
          • Improve documentation.

    What's next?

    • I'll spend some time making some follow-up improvements to my game-jam game that I didn't have time for over the weekend.
    • I'll try-out and vote-on other game-jam submissions.
    • I'll make some improvements to my surface-parsing logic, which I've been planning since adding support for oddly-shaped surfaces.
    • I'll write the last post in my AI movement series.
      • I was supposed to publish that last week!
      • But I figured preparing for the game jam was more important.


    🎉 Cheers!


    This is a simple icon representing my sabbatical.

    Comments