itch.io is community of indie game creators and players

Devlogs

Documentation

A Route Up
A browser game made in HTML5

Documentation


Player Scripts

Player Sprite: The player sprite along side all the animations were made by me within Aseprite


PlayerController.cs — This controls all player movement including running, jumping, double jumping, wall sliding, wall jumping, and ladder jump-offs using a Rigidbody2D and input action references.

PlayerData.cs — A Scriptable Object that stores every value for the player including movement speed, jump height, gravity scales, wall jump forces, and health, with jump force and gravity derived automatically from height and time-to-apex.

PlayerHealth.cs — Keeps track of the player's current health, handles damage intake with invincibility frames and knockback, triggers a damage flash on the sprite, and fires death and damage Unity Events for the UI to read.

PlayerAutoShooter.cs — Automatically finds the nearest enemy within a configurable range each frame and fires a bullet toward it at a set rate without any input from the player.

PlayerBullet.cs — Moves a fired bullet in a set direction, destroys it on contact with an enemy or environment collider, and calls TakeDamage on whichever enemy it hits.

PlayerUI.cs — Controls all the health display along side the ladder display, showing all the stats that the player needs.



Ladder Scripts


Ladder Sprite: https://constantine-and-marble.itch.io/ladders


Ladder.cs — A self-building object that constructs its own climb trigger, wall collider, and one-way top platform collider on Awake, and tiles a sprite vertically to fill its height.

LadderClimbHandler.cs — Detects overlapping ladders, snaps the player to the nearest ladder's X position on climb entry, zeroes gravity while climbing, and hands control back to PlayerController on exit.

LadderDeployer.cs — Listens for a mouse click input and instantiates a ladder prefab at the cursor's world position, tracking the count against a configurable maximum.



Enemy Scripts

Enemy Sprites: The Ferret and the Snake along side the simple animations were made by me within Aseprite


BlockerEnemy.cs — A flying enemy that enters from off-screen, positions itself above the player to obstruct climbing, bobs in place for a random duration, then repositions, cycling until it is killed.

BlockerHealthUI.cs — A script which is linked to a canvas above the head of the enemy, it has a red and green image that get shown to represent health.

FlyingShooterEnemy.cs — A hovering enemy that tracks the player, auto-spaces itself in a shared lane with other active instances to avoid overlapping, and fires projectiles downward at a set fire rate.

FlyingShooterEnemyUI.cs —A script which is linked to a canvas above the head of the enemy, it has a red and green image that get shown to represent health.

EnemyBullet.cs — Moves in a straight line, deals damage to the player on contact, and destroys itself on hitting the player or environment.



Interactable and Controller Scripts

Space Ship Sprite and Animations: https://ansimuz.itch.io/warped-vehicles

Caution Tape Sprite: https://www.pixilart.com/art/caution-tape-e86a7b07a44a7f3

World Tiles Sprite: https://eriksvan.itch.io/2d-pixel-space-horror-pack

Font: https://tinyworlds.itch.io/free-pixel-font-thaleah


Loot.cs — A collectible object that bobs in place, shows an interact prompt when the player is in range, sets the global loot collected flag on pickup, and triggers the enemy spawner.

TimerCheck.cs — A base interactable class that detects player proximity, shows a prompt, and calls a virtual OnInteracted method when the player presses the interact button.

LevelStartGate.cs — Extends TimerCheck to remove its blocking collider and start the level timer when the player interacts with it. This is linked to the caution tape sprite referenced above.

SpaceShipInteract.cs — The level exit that stops and saves the timer, marks the level complete to unlock the next one, and fires a Unity Event to trigger the scene transition.  This is linked to the space ship sprite referenced above.

TimerManager.cs — A singleton that runs the level timer, stops it and saves the result to PlayerPrefs if it beats the stored best time, and exposes a static FormatTime method for display.

TimerDisplay.cs — Reads the current elapsed time from TimerManager each frame and updates a TextMeshPro element in the player's HUD.

LevelSelectManager.cs — Populates the level select screen with unlock states and best times read from PlayerPrefs, handles level loading, and exposes a static CompleteLevel method to unlock the next level.

GameState.cs — A static class that holds the loot collected flag and resets it automatically on every scene load via a SceneManager callback.


The world was all created by me using the TileMap system within Unity, they are seperated onto multiple different scenes all accessed via the Level Select screen.  I used the World Tiles sprite referenced above to create 4 levels plus a tutorial explaining the games systems


Lastly the font used all throughout the game is also referenced above and it is called: Thaleah


Concept vs Actual Game

Genre:

The genre of the game stayed the same, a vertical platformer using a main gimmick to make your way back up as quickly as possible.

Concepts vs Final Implementation:

Traversal Tools: This changed from a rope within the concept phase to a ladder in the final development. This change allowed me to be more creative with the use case of the ladder, simply climbing up and down using W and S, solid walls allowing for wall jumps, and a solid top allowing for a double jump off it.

Momentum Parkour: A lot of the planned side to side fluidity was taken away due to time limitations and the levels ultimately being more vertical than horizontal. The goal of accurate vertical movement was kept with everything on the player being tweakable within the editor.

Enemies: The enemies did not change from the concept to the final game as I always intended to implement them regardless of how the game played.  There is one Blocker Enemy and one Shooter Enemy. They only spawn on the climb up to force you to place the ladders smartly and efficiently on the way down.

Auto Aiming and Shooting: To keep the gameplay focused on the climbing I decided back in the concept that the shooting was going to be automatic. It detects when an enemy is within range and begins to shoot bullets up at the enemies dealing damage, leading to the enemies dying.



Asset Lists

Every level was copied off of a base scene which has a certain set of assets essential for the game to function.



I tried my best to keep the assets organised for my own sanity but eventually gave up within my scripts folder.  At the end of production this is what the final asset list looks like.


Leave a comment