Omakase 1: Ropeman

Every month, I'm going to build a game. Each one will be small, and in each game I'm going to focus deeply on a single aspect and try and improve myself at it. At the end, I'll release the game along with a writeup of how it went, what I was thinking, and what we ended up with.

As a key point, the game itself can be anything. Omakase is a term meaning to "trust the chef", and I hope that you all will trust me to produce something interesting at the end of each month!

Without further ado, the first Omakase, from June to July: Ropeman!

Ropeman

This month, I wanted to focus on platforming mechanics. Platformers have been a big influence on my game design -- both Rain and Alight are 2D sidescrollers that borrow a lot from the field of action platformers.

At the same time, a technique I've been recently inspired by is the idea of taking a single mechanic, and pushing it to its limit. In traditional platforming games, this mechanic is the jump. Every other element in the game, from breakable blocks to enemies weak from the top, is designed to make the experience of jumping more enjoyable.

So, for this month's game, I tried to build a platformer where jumping wasn't the focus. Instead, I chose another core mechanic -- the rope swing.

Shamelessly stolen from Alight's forest level?

The first thing I tried was to recreate the rope swing from Alight in a blank canvas. In Alight's implementation, the rope swing is actually a simple circular motion, where the player's speed is determined by a sine function over time:

GameFlow.Instance.player.position = new Vector3(transform.position.x + Mathf.Sin(Mathf.Sin(timer*3)*rotforce*rotdir*Mathf.Deg2Rad)*playerdist, transform.position.y - Mathf.Cos(Mathf.Sin(timer*3)*rotforce*rotdir*Mathf.Deg2Rad)*playerdist, GameFlow.Instance.player.position.z);  

This works for very specific trajectories, but if I was going to build a whole game around swinging, I would need to implement it with proper physics.

Rope physics?

In this first iteration, the player is controlled by the trusty PlatformerController2D movement when in regular movement mode. When the player clicks, they shoot out a hinge joint, and Unity physics takes over.

The result was underwhelming. The switch in physics calculations is jarring, and the rope feels slow and moves weirdly.

The next thing I tried was a series of interlocked hinge joints, to simulate the real feel of a rope that bent and turned. While this felt more realistic, it still didn't feel as satisfying as the fast movement of the original swinging behavior.

At this point, the key observation I made is that it wasn't that important for the game physics to be realistic, as long as it felt good to control. The interlocked rope frequently pulled back on itself, which felt weird and uneven. Instead, I stuck with the single hinge, and added in some tricks to make the behavior feel smooth.

The biggest change was syncing velocity between the platform control and the rope control. While the rope swinging uses a different physics calculation, I transfer the velocity between the two when switching, making the transition feel a lot more natural. I also apply a circular force immediately after the rope connects, and ditched the cursor-based aiming for a fully keyboard-based control scheme which felt more fluid.

What other moves?

At this point, I was happy enough with the core rope swinging behavior to start thinking about other mechanics. With just swings, the player can cover horizontal distance super easily. But traveling upwards was still basically impossible.

The solution? The player can pull on the rope to boost themselves towards the rope's hook point. This destroys the rope, but allows the player to quickly move towards any direction they can land a rope on.

Finally, I could begin drafting a level. This was a very unstructured process for me, involving lots of iteration over what kinds of terrain let the player feel satisfied and show off their skills.

The end result for the first "chunk" of the game world was this:

I decided to use coins as the main goal of the levels, with the overall objective to collect them all. This let me design the entire game as a single world with many pathways between goals, rather than a set of single-path stages. We can still see the whole world as a series of challenges, however, if we break them down by section.

Tutorial

The point of the very first section in the game is simple: make sure the player knows how to rope swing. By building a very simple room with a single exit, the player is forced to mess around with the controls enough to clear the gap, which is otherwise impassable.

Ramp Up

The next section is a simple series of swings to build the player's confidence with the rope swing and provide a bit more space to explore the mechanics.

Hub

After completing that first basic stretch, the player is rewarded with a coin! So cool! The Hub serves two purposes here -- it's a fork in the road leading to both the Overpass and the Underpass, and it's also the first introduction of the Green Block.

The Hub is a soft-block similar to the first tutorial section, in that the player can't progress unless they learn a key mechanic, in this case that Green Blocks teleport the player upwards on contact.

Overpass

From the Hub, some players may choose to follow the conveniently placed series of Green Blocks leading upwards. They'll be faced with a tempting block to their left. The challenge in this section is to build up enough momentum to swing all the way to the left, and collect the coin above the spawn point.

This section depends on the player understanding that velocity and momentum can be built up from rope swings to clear large gaps.

Underpass

The final coin in the starter chunk is also hidden to the left, but underneath the level. To claim this coin, the player has to duck under the Hub and re-traverse the level, this time using the platforms in Ramp Up as surfaces for rope swinging.

There wasn't really a specific thing I was testing the player on here -- I just thought it would add to the connectiveness of the world if the player had to revisit an old place, but in a different context.

Of course, everything I've said above is just what I was sort of thinking at the time. I definitely could have executed better -- the spacings of the platforms could have been tuned, and the behavior of the Green Blocks could have been explained better. But overall, I'm pretty happy with the philosophy and structure I developed for how the world should guide the player's progression.

Conclusions

Ropeman was an experiment for how well I could take a single mechanic and push it to the limit. I took the idea of rope swinging, and built off it by ditching conventional platformer level design and instead creating a world that focused on building momentum in-air. I introduced mechanics that helped control this feeling, such as the Green Block and the rope-pull.

As always, when looking back on a creation, the flaws stand out even more than during development. I definitely could have tuned the rope-swinging behavior -- the movement feels especially choppy when near walls and edges. It could be more clear exactly where the rope is going to latch onto when thrown out -- I added a bit of info by indicating the player's shooting direction with a black line, but more could have been done. Finally, there was still a world of mechanics to explore -- things like moving objects to rope onto and bouncy terrain would have made some interesting level designs.

On a meta-level, the first Omakase project ended up well and I'm super glad! It feels good to be able to iterate fast and look back at what worked and what didn't, and this writeup is definitely forcing me to get better at that.

As promised, grab the game here! I've included a second chunk of fresh, unspoiled coins, so best of luck in the collection.