carrotcake Blog 🍃


official devlog for carrotcake written by Louis Durrant

Thursday Report: Designing Progress

Posted on Jan 24, 2019

With the holiday’s now long gone, it’s time to get deep into some dev time. Despite needing to blow off the dust and getting the ball rolling again, I’ve made some pretty comfortable progress already this month.

The general roadmap for this game has been to spend 2018 learning Godot, (which was very successful) then spending 2019 building the game’s systems to allow a smooth 2020 of content creation. This, above all, is a game about content. Even if that content might reveal itself slowly, a sandbox game needs huge variety to keep the intrigue ticking.

All players have different interests, and while they might play the same game and enjoy it, their drive for what keeps them playing can be widely different. Many players will enjoy the act of designing and curating their garden, and even if there are no further objectives, if the tools compliment their creativity well enough, no further systems need to be in place.

However other players may need something more — not everyone gets a thrill from design, and not everyone has the creativity to set their own goals. Sometimes, even if they do, they need that small push that rewards and inspires it.

So those are the two foundations for the game — providing fun tools for creativity, and providing a sense of progression.

Sweet, sweet statistics.

Progression often comes in two forms — horizontal and vertical. Vertical progression is where your character simply becomes stronger, and objectively better than they were when they started. Horizontal, on the contray, is where the player obtains more options. For a classic example — a character might find a better sword that kills enemies quicker, or they might find an axe that has the same power as their current sword, but attacks in a new interesting way that the player might enjoy, or might be better against certain enemies, but worse against others. More options.

I believe that most games these days find a balance between the two. Vertical games suffer from ‘power creep’, where (since the only way is up) things become so powerful that anything beneath it becomes trivial or obsolete. Horizontal games can obscure any feeling of progression — that player might unlock a hundred different unique weapons, but find they still like the first or second weapon they ever obtained the most.

Fortunately, ‘unlocks’ tend to be a compelling reason to progress for many players regardless of genre. Take Mario Odyssey, a game infamous for its huge number of ‘moons’ the player can achieve. While to begin with you will need to collect a certain number of moons to progress, many players will still enjoy collecting all remaining moons for nothing more than the glory of doing so. I’m the opposite. Any ‘unlock’ that doesn’t effect the game itself is ‘just a number’ and doesn’t engage me at all.

I hold the mantra that good design is when everything feels connected, and everything has a purpose. So why not give unlocks a purpose that effect the game in a meaningful way?

New star unlocked?

I came up with ‘constellations’ as what I hope will be an essential part of urging players to continue playing, by giving them meaningful objectives. Stars will become unlocked by the player completing a huge variety of different tasks, both menial and obscure. One star, for instance, might be for catching 20 fish, another might be catching a rare fish that only comes out at a certain time.

Once the right stars are unlocked, they can be connected as constellations. If a correct constellation is drawn, is becomes activated, and provides a unique change to the garden while it is active. Say four or five ‘fish’ related stars are connected, perhaps this increases the number of fish in the garden, or increases the speed at which fish go for the bait.

In this way, players both have a record of their accomplishments, but they can also utilise those accomplishments to actually benefit them in fun ways.

Elsewhere in the game, some players will get a kick out of finding clothing and cute matching outfits, or unlocking their favourite villagers to live in their perfectly designed garden. But why not also reward those that want to find the right gear that gives them the best stats for the task, or unlock the best combination of villagers with the right personality types to help unlock the most furniture types? The goal is to give each play style a chance to be gratifying, without being the ‘best’ way to play.

The ground-to-stars transition as-is.

I knew I wanted a transition to go from the game view to the stars. Being a top-down game, this makes things a little tricky. The imaginary camera would be pointing downward at the scene, and then would have to tilt upward toward the stars. This is a 3D motion, but in a 2D game this wouldn’t be possible without placing things on a 3D plane, or some smart shaders to bend the pixels in a convincing way.

What I did have on my side was speed — the stars are ultimately a menu, so it should be snappy going in and ou. What looks good isn’t always what ‘feels’ good, and while a slower transition might be more to behold, having to watch that transition for the 100th time might start feeling sluggish.

Speed helps with the illusion; the fewer frames, the more the brain fills in the gaps. The transition is made of a few moving parts, the camera, the gradient, the clouds, and the stars.

As the camera pans up on the Y axis (remember, it’s not tilting, this is 2D), the gradient (which is just three colours: complete transparency, sky colour, night sky colour) pans down.

Me moving the gradient up and down with my mouse.

Somewhere midway, the clouds (which are panning down with the gradient) do a little split animation. The clouds are made of four cloud sprites moving at different speeds to give a slight sense of depth.

Cue choir.

And that’s it. Once the gradient is all the way down, it’ll be the colour of the night sky, so we can just fade the stars in to form the scene for the menu.

I think it’s a pretty neat effect, and it conveys what it needs to convey without playing around with perspective. Again, the speed obscures that. I’m not entirely happy with the rhythm, so to speak, it feels a touch robot where it could be smoother. But, for now, it works just fine for testing purposes.

Also implemented was a system to move the furnishing around. This was pretty simple, the effect is put on the object to make it translucent and blue for that ‘blueprint’ look we’ve come to expect, and then it’s position is simply updated as it’s moved. The object can also be cancelled to move back to where it was.

The tricky part is actually determining exactly what item the player wants to move. Each item has it’s own zone that the player must be standing in for it to know the player might want to move it. But what if those zones are overlapping? Currently I have a system where the game finds all the items (yes, all — so we’ll see how performance is once we have a sizable furnished garden) and then compares the distances from the center of each item to the center of the player.

The same system works for NPCs as well, so I killed two birds with one stone. No more having two characters yapping at you when you only wanted to talk to one.

After all, three is a crowd.

Follow me on Twitter.