Posted November 13, 2019 by Pandaqi
#godot #level design #mechanics #playtesting #iteration
Welcome to the twenty-fourth devlog!
Last devlog marked the release of v0.2 of the game, with MANY changes to the gameplay. In this devlog I want to explain what was changed and why I did it. Hopefully you learn a lot about game development, and if not, you’ll at least see the progress I made in the game.
When I playtest the game, I do the following things:
After my first few playtests, I noticed the game was still a bit too difficult to start playing. The tutorial explained too many things at once:
Even for seasoned gamers, this might be a bit much. I really needed to improve this before I could continue working on other parts of the game. Look at this! I explain 3 different buttons (6 on keyboard), the delivery system, AND the buttons in-game within the first few seconds of playing the level!
(I'm still experimenting with the best workflow for uploading footage to devlogs. This is a GIF hosted on Imgur.)
For the past few weeks, I’d already done a lot of research (reading articles, watching videos, experimenting with small prototypes) on co-op and puzzle level design.
One of the things everyone kept mentioning, is how puzzles are usually as simple/small as possible. Puzzle games take a single mechanic and try to get as many levels as they can out of that single mechanic. Only if they’ve exhausted absolutely every option, they’ll introduce a new mechanic.
So, that night, an idea dawned on me: “what if … we only start with movement?”
The first world only introduces the move key/stick (on controller). The second world introduces jumping. The third world introduces grabbing packages, and so forth. This solved many problems in one go:
So that’s what I did!
It greatly simplified the level design and instructions/tutorial needed. Now, I show a single image on the campaign screen that explains movement on controller/keyboard, and that’s it. (Of course, this will become prettier in the final version of the game.)
Now, when I tested the game, people needed absolutely no introduction or explanation from me. (They did, however, occasionally ask things like “but when will we finally be able to JUMP!?” But that was meant more as a joke.)
Now, the question on your mind is probably: “but if players can only move, how will they deliver packages?!”
The solution presented itself immediately when I turned off the “package grab” code in my engine: players could just push the packages!
Things seemed to be going well. I created almost 10 new levels in which the only thing you could do is move the player. By adding trampolines, height differences, push buttons, and other elements I could keep the levels varied and challenging.
But then I ran into problems again …
After a few playtests, with different people and different versions of the game, I ran into a HUGE problem: players were getting frustrated. The fun from the first few levels quickly turned into frustration.
The main reason for that? You guessed it: the package pushing.
It was hard to control, very unpredictable, and felt a little slow/sluggish. Players were fighting with their controller and getting more and more frustrated about not being able to move a package properly over a short distance!
Because players couldn’t jump anymore, and they couldn’t grab packages, the game felt a lot more finnicky, out of the players control, too difficult to handle.
Sometimes, you pushed a package and it did exactly what you wanted. The other 50% of the times, the package turned away from you, or bounced a little too far, or moved too much towards the edge (which meant players had NO way of getting the package to the delivery zone anymore). It came down to VERY precise movement, which isn’t just hard, it’s also not the type of game I want this to be.
Look at me (the CREATOR of the game) having an extremely difficult time pushing a package over a small distance:
Puzzle games have a sort of “golden rule”: The puzzle should be hard to solve, challenging, even require out-of-the-box thinking. But once players know what to do or have a plan, it should NOT be hard to execute.
My game was doing the exact opposite: players knew they wanted to use the trampoline, but they just kept jumping past it. Players knew that a package needed to be dropped from a certain platform, but they kept accidentally throwing the package off the edge.
Although this game isn’t strictly a puzzle game, it did result in lots of frustration.
There’s also another “golden rule”: Succeed slowly, fail fast
This basically means that the feedback/retry loop of the game should be very short. Successfully delivering a package should be challenging, but if you make a mistake, you should very quickly be able to reset and try again.
Again, my game did the opposite: sometimes, if you just mistimed a jump, it would take a good 20-30 seconds to get back to your position again and be able to do something useful.
As I write this down, in hindsight, it’s always hard to believe the choices you made. With the knowledge I have now, I really don’t understand why past me (from, like, 3 weeks ago) decided that pushing packages was a good idea. But hey, we learn a little every day.
Solving this problem didn’t come down to a genius idea popping into my head. It came down to making a list of possible solutions, and testing them one by one:
When I implemented the kicking system, suddenly everything fell into place, and I immediately felt gameplay was much nicer.
Here's a video of me playing the new level 3, which has a glue powerup mechanic. This also neatly solved the issue of not being able to grab packages in World 1: by glueing packages to players, they retain lots of control, while at the same time using a very fun mechanic! (Sorry for the choppy frame rate, otherwise GIF size became too large.)
And another video of me playing the new level 2 (with ... conveyor belts), just to illustrate the kicking mechanic on its own, and how it interacts with other forces in the environment.
But why was kicking the best solution?
I quickly created a few levels with this system, tested them, and voila: problem solved. Players were loving the game even more than before. (No really. This might seem like an exaggeration to sell the game or anything, but I was genuinely surprised. The next day, some of the players even walked up to me to say “that game you made was actually really fun”)
Of course, things weren’t perfect: kicking was a bit too strong and sensitive, the levels could be much prettier and interesting, etc. But things were already looking really good. It gave me lots of new ideas (and motivation to work on the game even faster!)
After all this playtesting and experimenting, I learned a lot. Not only about level design, and code, and making things clear visually, but also about how to make a co-op game.
All the levels I’ve created thus far, were “single component” levels. The game created the package for you, including all components inside, and you just needed to deliver it. This is very useful for tutorial levels and keeps the game clear/streamlined when you first start … but it’s not enough for engaging levels.
Out of all my research, I realized that timers and multi-components were absolutely necessary to make all parts of the game click.
Players even started asking for it or expecting it:
At first, I planned to add these in later worlds. Maybe world 2 or 3, the game would finally have deliveries with multiple parts.
But I decided to move these to the front. The whole first world is a “tutorial/training world” (don’t worry, there’s a story which makes it interesting and logical), and the last few levels will already have different components that require time.
Here's some rough sketches I made. These changes/systems will surely be in the game when the next update rolls around.
That’s exactly what I’m working on right now! It’s a lot of work, because I need to rewrite/modify huge parts of the core of the delivery system. (And I need to create icons for the different components, plus models for different zones/houses where these components will appear.) But once it’s done, I can finish world 1, and within a few weeks I hope to announce v0.3!
So that’s what happened these past few weeks: the game changed a lot, now you know why. It’s astonishing how something so simple (pushing or kicking packages) can make a difference like night and day. But I’m glad I eventually cracked the code to making this game work.
Until next devlog,
Pandaqi
P.S. I’ve been noticing a trend in these devlogs: I explain how I did something … and then redo it … and then redo it again, explaining why the previous idea is bad. I hope this isn’t confusing (and doesn’t paint me as someone who just cannot make up his mind) – it’s just the way development works. By iteration, by prototyping, I can find the golden nuggets of gameplay mechanics.
As I am rewriting parts of the core code, I am able to HEAVILY optimize it and clean it up. Remember: I wrote this code completely by myself 1-2 months ago, and there’s already lots to improve. But if I hadn’t written this “bad code” to begin with, I would have never improvement up to this point. “Fail faster”, as they always say.