Huge post-Chill Jam patch


Improvements:

  • Slightly increased player run and climb speed
    • The game is called Quick Ascent, so the player should move more quickly! It’s hard to figure out exactly what these numbers should be, and any change to these requires re-balancing of the level design, so hopefully this doesn’t need further tweaking.

  • Moved hook, ice, and platform placements to better represent core level designs
    • There were areas that I wanted the encourage the player to explore a particular route, such as tethering into a hook when jumping off an ice block, but it wasn’t positioned in an obvious enough way and most of the time it was more natural to just avoid the hook altogether. There were also areas that the timing felt a little too tight to go from one point to another that I wanted to reduce the difficulty level on, and other optional routes that I wanted to do the opposite.

  • Tweaked snow particles slightly
    • There was one particular spot in the first section where the snow wasn’t reaching, so I adjusted the position of the particle emitter to be able to reach it. This could use further tweaking, as the way it’s set up right now, a lot of particles in the bunch get rendered off screen and wasted, producing occasional pockets of too few snowflakes.

  • Changed hitbox of where player can hook into ice from
    • I wanted to make the collision area of the player hooking into the ice more realistic to the animation. This was previously the whole top half of the sprite, but I narrowed it down to about a third of the sprite size instead.

  • Added buffer time to jump from when the player leaves ice
    • The previous change made it so that sometimes when you wanted to transition from moving from being hooked in ice to jumping, you’d accidentally fall and miss your jump timing. This adds a tiny bit of leeway to help prevent that, as well as adding the same behavior to jumping from platforms.

  • Added input buffering on jump, grab, and tether
    • Sometimes you’d press an input slightly too early and not get the intended action, this helps to remedy that feeling.

  • Improved physics when jumping from tether
    • The logic to determine velocity when jumping from a hook was very custom before and while it felt okay, it didn’t behave how you’d expect a body detaching from a pendulum should. Now it is calculated using the computed velocity vector from the last 2 movements while on the tether, with the y velocity clamped to a reasonable range after that so that the player doesn’t get awkward jumps from specific angles that either keep them fully horizontal or send them flying upwards. This isn’t mathematically the accurate way to calculate the speed coming out of a rope swing (using formulas for potential energy and kinetic energy that take into account height from bottom of rope swing and gravity), but for now this suits the game well.

  • Improved physics when jumping onto tether
    • Similar to the previous improvement, the calculation to determine the initial tethered velocity was rushed and at times very inaccurate to what you’d expect. This time around I used the initial x and y velocity, influenced by the sine and cosine of the player’s angle from the hook when they initially tether, and a clamping factor to make sure things don’t get too out of hand to calculate an initial angular velocity.

  • Improved ice floor behavior
    • The slick ice floors were making the player go too fast, and get to that speed too quickly. They also weren’t properly preventing turning on a dime. I changed around the linear interpolation gravity values, removed a minimum ice floor speed, and lowered the maximum ice floor speed.

  • Added platform leeway
    • I wanted to add some assistance when you got your foot snagged on the corner of a platform that you were jumping to, so I added a second collider on the player body that is slightly higher than the first, and when the player’s main collider hit a platform near the peak of their jump that the secondary collider didn’t hit, I would move the player’s position up equal to the distance between the collision point and the bottom of the secondary collider.

  • Allow user to gracefully drop from ice or tether
    • It felt necessary to give the player another option off the hook or ice besides jumping upward, but I didn’t want to make it the same button they used to grab on in the first place, to avoid accidental double press incidents. Now the game checks if down is being held while jumping off from ice or tether and if it is, it does not add any upward momentum.

  • Improved text legibility
    • All of the fonts I tried did not render well at low font sizes, which I needed to do since the game window is only 320x180. There are some workarounds that would have required a lot more implementation and testing, such as creating a larger viewport scene to render the larger font on that would scale down to the user’s window within the code, but instead I simply found a font that rendered as expected at 8px size.

  • Allow user to move up and down tether rope
    • Sometimes you didn’t grab the rope at the height you wanted, so it should be easier to readjust than having to jump off and re-tether. This was easier to implement than expected: while tethering, pressing up or down gives a y velocity that influences the player’s y value which then gets used to calculate the new angle and x position before re-rendering.

  • Added pause menu
    • Since this is a timed game, it made sense to allow players to pause during their run, and also restart if they mess up a crucial jump! This was made easy with Godot’s built in pause and reloading scenes, as well as using an overlay in the viewport’s canvas layer.

  • Added finish line celebration
    • Once the player reaches the finish, it should be celebrated with confetti and fanfare! This is a particle system attached to the flag object that emits small shapes of randomized colors at a specific hue when the player enters its collision area.

  • Prevent player from spamming jump on ice
    • There was a much faster way to climb ice, which was to repeatedly re-hook into the ice and jump from it. I wanted to disable this since all speedruns would require constant jumping, but also make sure I don’t disable doing extremely fast jumps from one body of ice to another. Now, there is a .5 second timer that runs after jumping from being hooked, and before you can hook in it makes sure either that timer has finished, or you have exited the last area of ice you were in.

  • Added sound when icicle breaks
    • Previously this was controlled by the player script, but then the icicle didn’t make sound when hitting the floor. It also needed to be an element that is aware of the camera location so that the player doesn’t hear far away icicles all the way from the start of the level.

Bug fixes:

  • Fixed an issue where you couldn’t go from one grappling hook to another if the first was above the second
    • This has to do with the area around a hook being a full circle, as half circle hitboxes are not an option. There’s additional logic to check whether your character is in the lower half of that circle which was causing this bug, so it was refined to ensure this doesn’t happen.


Unfortunately, a lot of these changes required me to repeatedly re-test and re-arrange the entire level to make sure I didn’t make certain jumps impossible or unintended routes possible, so it took longer than expected. Better now than after building out multiple entire levels though. Stay tuned for more updates coming in the future!

Leave a comment

Log in with itch.io to leave a comment.