No Signal :( is a brutally challenging 2D platformer game created during my first year in DigiPen for a game project. I worked in a group of 3 designers and 2 artists, and took on the role of the main programmer and producer of the team, implementing all design and gameplay elements through Unity.
We were an ambitious bunch of students and we wanted to create a game that served as a medium that could blend all our talents together for a proper showcase of our abilities. We decided to take on the platformer genre, providing many benefits for the team's structure by specializing within our roles.
Game mechanics and feel
Level design
Story and game flow
Character art and animations
Environmental art and props
The game had a simple concept of controlling a TV head character, CRT-15, who has the ability to toggle electrical appliances around him on and off. He had lost his signal, so his main goal was simply to climb up in order to get his signal back. We targeted a scope of 11 levels, with the game split into 2 different acts of climbing up the Slums and the City.
I took inspiration from Celeste and researched various platformer mechanics to create a platformer controller that felt good to play with. Instead of using Unity's built-in gravity, the game's platforming physics were entirely custom-made. Here are some of the techniques that I implemented:
Ground and aerial acceleration: I had separate values for movement acceleration when the player was grounded and in the air. Players would have tight movement controls when walking on the ground but had floaty movement with less control when they were in the air, leading to a more natural feel of movement controls.
Jump apex control: Players don't exactly lose all control of the character when they are in the air. At the apex of each jump, players are given more control over their character so that they can land where they intend to. This was done by giving the character a bonus to their horizontal velocity movement when their vertical velocity is low.
Coyote time: Players were given a short grace period to execute their jump after running off a ledge before pressing the jump input. This makes the controls feel more responsive as there would be fewer situations of a jump input being "eaten".
Input buffering: Same as above, but with a grace period to read inputs when the player presses jump right before touching the ground.
Variable jump height: Players could control their jump height based on how long they held the jump button. They could also fall faster by pressing the down input.
Fall speed clamping: The player's downward velocity accelerates the longer they fall, but this is clamped after a certain point. This allows players to have more control of their character when falling instead of their fall accelerating to uncontrollable speeds.
Momentum transfer: Standing on a moving platform transfers its velocity to the player, allowing players to stand in place on top of moving platforms. Additionally, jumping off a moving platform allows players to retain this velocity, allowing them to use the momentum of moving platforms to perform a bigger jump.
Vertical camera dampening: The vertical camera movement is dampened, making the camera movement less nauseating when players are constantly jumping.
We quickly iterated on different platformer mechanics that could make use of the player's toggle ability. These were put into a sandbox testing level where their usability and feel were judged based on how we could potentially use them in certain dynamics for levels. We decided to settle on these toggleable objects for level mechanics:
Patrol Platform: A moving platform that goes from point A to B and vice versa when toggled.
Flippy Platform: A platform that activates or deactivates when toggled.
Laser Beam (initially known as acid): A hazard obstacle that fires a beam in its direction, killing the player if they enter the beam. Toggling will activate and deactivate the laser beam.
Fan: A wind current that pushes the player in the direction it is blowing. Toggling will activate and deactivate the wind current.
When designing levels for the Slums, we wanted each level to feature a unique dynamic by combining 2 different mechanics together. We put the 4 level mechanics on a matrix to assess their compatibility and estimate their difficulty when put together in a level. With the first level being treated as a tutorial stage, we then took the 4 most compatible combinations and ordered their difficulty in ascending order such that levels can have a smooth difficulty progression.
The 5 levels for the Slums were more focused on low-pressure obstacles with puzzle elements. Players would be able to clear them at their own pace and familiarize themselves with the platformer controls in these stages, exploring the gameplay systems they could interact with within the game.
The City introduces a new dash mechanic to the player in the form of a battery pickup. Players would be able to dash once in 1 of 8 directions after picking up the battery. This powerup would also expire after a duration, adding a timed dynamic to the game. Dash amplifier blocks were also added, allowing players to dash into them to extend their dash. I'll be real — I added this purely because the dash-extending space blocks from Celeste that went WAOWAOWAOWAOWAO was my favorite mechanic from that game and I wanted it in our game as well.
The City levels were more focused on technical skill and execution of movement mechanics, with each level having a futuristic-themed version of the different toggleable objects to keep each level fresh. At this point of the project, we were overflowing with ideas on what levels we wanted to fit into the 6 City levels, with the first being an introductory level and the last being a finale that combined all level mechanics together. We selected the best 4 ideas and slotted them into the 2nd to 5th City levels. As these stages are put from the middle to the end of the game, we set the difficulty of these levels to be much higher than before.
Levels generally went through the process of drafting, testing, and revision. Concept sketches could be quickly recreated within Unity for them to be tested and refined.
Only 1 viable pathway to take
Dying on the top half of the level made players redo the bottom half, which was annoying
4 possible routes to clear the level
No way to die in the top half after clearing the bottom half
My role as the game producer also required effective communication with my artists in order to blend design, art, and implementation as efficiently as possible. We took a minimalist approach toward UI by integrating info on the characters and props itself. With less UI clutter and intentional design, our artwork could stand out more.
Dash charge indicated on the character's TV screen
Toggle state indicated by the green/red lights of appliances
We decided to make our levels using tilemaps, as it meant that we could design around more tangible and measurable units. We could also work with a placeholder tileset template that would then be swapped over with completed artwork, meaning that both designers and artists could work concurrently on levels without needing to wait for each side to complete their part.
For UI backings and other level assets that would not be placed in a tilemap format, 9-spliced sprites were used such that artists would only need to create 1 asset that could be resized in any way that designers would require them to be without having any stretching artifacts.
The project was a massive success and we were able to execute on showcasing and appealing to the team's vision for the game. We were initially criticized for having an over-scoped plan of 11 levels, but with proper planning and good teamwork, we managed to deliver on our goals. By ensuring a clear sense of direction of what we wanted to achieve and sticking to our roots of design philosophies, we were able to confidently proceed with design decisions made after feedback received from the numerous play-testing sessions.
And yes, the sad face in the game title "No Signal :(" is there to boost our SEO KPIs. Do check out our game if you haven't already done so :)