
Totems of Tag
Welcome to another devlog about a āOne Week Gameā! (Which are, unsurprisingly, games completely developed in a single week.)
This one is about Totems of Tag. (Click the link to visit the official page. The game is for 2-4 players and free on all platforms.)
The first one week games were āA Recipe For Disasterā and āI Wish You Good Hugā. Both projects were a great success. Especially for something made in just a week!
But ⦠they were very similar. Both featured a grid, throwing stuff, and cooperation enforced by people being split into their own separate regions.
Another problem was their scope. Even though I managed to finish them, they were still too large for my liking (and stress levels).
Thatās why I wanted to try something different! A silly physics-based game, that should be very very simple.
In the end, I settled on the idea of making a game like ādodgeballā (you know, from high school PE), but with a few clever twists.
All the other ideas I had were perhaps better, but also larger. I do these projects to help me finish stuff and keep it simple, so I want to do the simplest ideas first.
Whatās the idea?
All players are dropped in a single-screen arena, with a few lives, and a few balls.
Throwing a ball against someone else removes one of their lives! When you have no lives left, you die and are out of the game. The winner is the last one standing.
So far, so simple, right? Well, yeah. And developer can make this in a few hours, which also means it would be quite boring and clichƩ.
So I permitted myself a few twists:
When throwing, you can rotate your character to add curve to the ball.
There are all sorts of special powerups and ball types. (Both good and bad.)
Many powerups can only be acquired by throwing a ball against them, from a distance.
I planned a second button for ⦠something, but I didnāt know what at this time.
In my head, I had this image of these circular totems with parts that could rotate independently from each other. The more you rotated (when powering up your throw), the more your ball would curve. (This image was partly inspired by the boardgame Iwarii.)
Lesson #1: Donāt leave visuals for last
The general consensus, which Iāve read/heard time and time again over the years, is to ābuild the whole game first with placeholder graphics, then add the actual graphics at the endā
Usually, graphics and design are seen as the very last things you do to the game. And I see where people are coming from and largely agreed all those years.
But more and more ⦠I realize this isnāt necessarily a good idea.
You see, I was ready to give up this project. I woke up and was like āwhat am I doing, wasting a whole week on a very boring and simple game?ā I just wasnāt impressed by any of the ideas or mechanics, and had a million ideas I was more excited about.
Trying to convince myself to at least do something for the project, I started creating visuals. Some cute characters (with different angles for rotation), some actual colored balls, some particles, some animations.
I basically spent 5 hours, right at the start of the project, creating all those things you are supposed to leave for the end. And guess what? It completely restored my faith in the project. Many of these visuals are still in the game, because they ended up being fitting perfectly.
Over the course of the week, whenever I was losing motivation, I repeated this exercise. I searched for an area that could be improved and created some visual thing (a sprite, an animation, particles, tween, whatever) to make it just a little nicer.
If I hadnāt done so, this project would never have gotten further than the āsome square people on a grey background are throwing circles at each otherā
The main lesson? Visuals are vital to any game. Use them to motivate yourself and make your project look/feel fun as early as possible. Visuals should inform gameplay, and vice versa. Donāt just slap them on at the end.
Lesson #2: 2D isnāt always easier than 3D
At first, I wanted to make this game 3D. It just feels like a better fit: totems feel like something I could create and animate in 3D (with my very limited skills). And if thatās done, I just need to give everything a proper collision body, and basically 90% of the game is done.
But I didnāt do it. Why? Again, because I needed to keep this game simple. And in my experience, 2D was always way easier than 3D.
This was probably a mistake.
If you work in a sort of āfake 3Dā world, you need to apply many tricks to make it look and feel realistic. I had to think a lot about how to draw stuff, which collision shapes to give them, and more detailed physics-related stuff.
Why? Letās say a shrub is standing in the middle of the field. If a player approaches from the back, they need to be stopped by it, but not immediately! They should be able to stand behind the shrub, moving a few pixels into the sprite before stopped, because thatās how it would work in 3D.
Moreover, the ball floats a bit above the ground when thrown. So, it should be able to move even further into the sprite than players, because itās higher off the ground!
If all of this is confusing, let me tell you: yeah, it is. It was a lot of work to make the physics, the perspective, the sprites all work together (and properly sorted) to give the illusion of a 3D playing field.
In the end, that energy was probably better spent actually creating this game in 3D. Which I might still do as my next project.
The main lesson? 2D is easier than 3D, but not if you try to force 2D to be fake 3D. In that case, just bite the bullet and go full 3D.
Lesson #3: Be mindful of taking decision away from players
Okay, let me explain that heading.
When I first started making games, I was like: āplayers should be able to have total freedom! In my games, they can decide whatever they want, have control over everything, hooray!ā
After some projects, though, I realized the error of my ways. Such amount of freedom, such choices, are overwhelming. Most players arenāt even looking for that. They just want the game delivered in a clear-cut way that makes it the most fun for them, which usually means that many parts of the game are decided or automated by the code.
For example: take the FIFA games. By default, many things are enabled to help you. When shooting or passing a ball, it automatically picks a corner/teammate which roughly corresponds with where your stick is pointing. You can turn this off, if you want! You can enable manual aiming, which allows you to be much more precise ⦠but is also waaay harder to pull off. Most people just arenāt looking for that. They are fine with the help, with the decision being taken away.
So, when I developed this game, I locked in almost everything. Powerups were always good. But if you get hit with a ābad ballā, you receive a random powerup that is always bad.
Your throwing power and throwing curve were always the same. (The more curve, the harder the shot.)
All powerups and balls were picked up by simple walking over them.
I removed almost all freedom and it hurt the game severely. Yes, it made the game very simple to play, but it also turned the game into more of a ⦠simulation? You could do and decided so little, that each round turned out similar to the last. You couldnāt really train to improve your skill.
Thatās why I gave the player more choice again:
All powerups can be good or bad.
Some powerups are picked up by walking over them, but others must be actively grabbed by throwing a ball against it.
Balls must always be grabbed. This also immediately added the mechanic of ācatching a ballā before it could hurt you.
Throwing power is controlled by how long you hold the button.
Throwing curve is controlled by how much you rotate.
This way, you can make a strategy. You can decide to work a little harder to pick up a really useful powerup. Or, if you donāt watch out, you can accidentally get yourself stuck with very bad ones.
Similarly, if you train a bit, you can throw the ball any way you like. A soft curve ball. A fast straight ball. You can take quick surprise shots (by quickly tapping the throw button), but canāt really aim those. Or you can take a few seconds to line up the perfect throw.
Making these changes made the game way more strategical, yet also skill-based. And it was all a result of doing less work and giving many decisions to the players. (Instead of programming my own code to help you, I just ⦠removed that code.)
The main lesson? Strike a balance between giving freedom/decisions to players, and helping them by making the computer take care of stuff.
Lesson #4: Make the bare minimum fun
This one is very important, learned after many years of making games!
Games are about challenge. You try to reach an objective, but something is in the way. By trying stuff, playing again and again, you get better and get more skill with the gameās controls and mechanics.
However, challenge is very subjective. What I might find easy, is too hard for others. Failure that makes me go āhmm, interesting, I should try X next timeā, makes others go āhuh? Weird game, Iāll just try the same thing again. Or quit.ā
The last few years, Iāve created many games (or small prototypes), and asked other people to test them. And guess what? Many of them donāt care about all those challenging mechanics I put in the game. They might not even care about what all the buttons do. Theyāre contend with learning the basic controls (usually moving + one button) and just doing something.
In other words, they will do the bare minimum. And you, the developer, should make that fun as well.
This is, I think, one of the big failures of my past games. Their āfunā was only unlocked if you knew your way around a controller, played quite seriously, āunderstoodā what it was trying to do.
For this game, I fixed that from the start. (And I will do that for all games going forward.)
Case Study: letās meet āHankā. Heās not a pro gamer and just wants to have some fun. He only knows the controls for movement and that pressing a button will do something.
What will they try? And how do we make sure they have fun?
If they walk up to a ball, and press that button, they should grab it. Even if itās not that precise. Even if their timing is off.
If they release the button, the ball should be thrown with considerable speed. Even without charging power, or adding curve, they should be able to throw balls and hit others.
If they accidentally walk over a powerup, they automatically enable it, so that works. (They are not ālocked outā of that system in the game.)
This way, they donāt need to be good at the game, or know all the controls or mechanics, to have fun and take (serious) part in the game.
It might feel stupid. Like treating your players like idiots or rewarding them for doing nothing. But itās absolutely the right thing to do and an art in itself. Just make sure that ādoing the bare minimumā is not rewarded 100%, not the best strategy. There should be room to grow, expand your skill, be better than that.
The main lesson? Make every separate mechanic/system/part of the game fun and easy to interact with, so even the bare minimum means youāre having fun. And yes, this will feel like treating your players like idiots.
Lesson #5: Hardcoding is fine
I love random generation. Iām just endlessly interested in what the computer will come up with, given a few simple rules. It creates infinite variation and surprises in a game.
But ⦠not everything is suited to random generation. I tried to randomly generate the arenas, but soon realized it wasnāt worth the effort.
The results were just bad and unfair. On such a small space, where hitting someone can come down to a few pixels, itās just not fun to start with potentially unbalanced or ugly arenas.
Okay, plan B: manually create a few maps out of a set of tiles. This would have been a good idea if the game didnāt have this weird fake 3D effect going on. Due to that, it was hard to make tiles that seamlessly fit together, both visually and physically. (Placing two blocks after each other, for example, should not leave a gap that a ball or player can fly through.)
So I settled on plan C: manually create every map from scratch. This meant that I could draw anything, and just import it into the game engine, and add bodies/functionality where needed. As such, most arenas in the game are just a few huge sprites with smaller sprites for objects that should be separate (e.g. because you can move them around or stand behind them).
And you know what? Even though Iād never done it this way before, and it felt ⦠weird to me, it was absolutely fine. It allowed me to create a few varied arenas very quickly. (Considerably quicker than writing all the code for randomly generating them.) It allowed me, again, to finish this game within a week.
The main lesson? Manually creating a small amount of content can be completely fine, and can be preferable over random generation.
(This motto was literally written, in all caps, on top of my notebook: āStop thinking in terms of tiles, just sketch the full area and build it.ā Iāve done so many tile/grid-based games, it was hard to get out of the mindset :p)
Lesson #6: Sharing is comparing
These are local multiplayer games. I make these because I donāt play games for myself, I play them for the social experience. To share a moment with others, have fun with others.
Thatās why I think itās perhaps more important to focus on that social aspect, than the game itself.
And when it comes to humans, we are weird social creatures that enjoy comparing ourselves with others. Cheering when we do something nice, talking smack when somebody does something annoying.
So here are some things I added to this game to facilitate that:
At the game over screen, it shows statistics for each player. Hit the most players? Youāre a sniper. Walked the largest distance? Youāre a runner.
During the game, there are some messages reacting to the game state. If you hit someone that previously hit you, you get a āRevenge!ā If a ball misses you by the slimmest of margins you get a āHa, almost!ā
These are small things, because I didnāt have the time for more (and donāt have much experience with coding these things yet). But they help a lot and always result in a fun discussion during/after a game.
The main lesson? Iām learning more and more that creating a fun game doesnāt necessarily mean the game mechanics are absolutely amazing, but also means the whole experience around it (game feel, tiny details, effects, etc.) is just āfunā. So itās okay to focus on that a lot and make the game itself pretty simple or standard.
Lesson #7: UI = first impression
Usually, game developers leave the menus and buttons and UI (user interface) for last. But with each game I make, I learn (even more) how important the interface is, and how you should spend more time on it.
For this game, the interface is all about configuring the game you want to play. Which arena do you want? Which balls do you want to include? Which powerups? Etcetera.
At first, I sketched a big screen full of sliders and buttons and stuff. Because thatās how many games do this: a plain old āsettingsā menu.
But then some of my previous experience kicked in and said: āNo! This is too hard to comprehend, too many options to process, too much on one screen.ā
So I split it up. The interface now has multiple screens, in order, where you choose your settings. First it only shows the āarenasā and you can select the one you want. Continue. It shows all different ball types, you can select the ones you want. Continue. After four screens, you continue into the actual game.
Yes, this took some effort to implement, especially since Iāve never done this before. But it made a huge difference. Configuring your game was now a quick experience. Each screen only showed a few options, all within the same category. You only had to move around (using your default move input, aka arrow keys or joystick) and toggle stuff on/off with the press of a button.
From now on, Iāll probably do this for all games.
But the story continues! At first, all navigation was done with your move input. If you tried to move right, but there was no option anymore (you were at the edge of the grid), it would automatically continue to the next screen.
Even though I really like this and think itās intuitive ⦠itās not so quick when you donāt want to change a lot of settings. In that case, you are just pressing right, right, right, right at least twenty times before the game actually starts. (My playtesters actually revealed this flaw and I just saw their mood dropping when they realized they had to move through the whole menu again.)
As usual with these One Week Games, there is some ābonus timeā. A full day, maybe more (or less) after the week has ended, where Iām allowed to fix the most important stuff.
Well, quite some time was spent adding better controls and graphics to the interface. Now you can immediately skip screens by pressing SPACE (forward) or BACKSPACE (backward). Underneath the arrows is a picture of this key (or the corresponding key on your controller).
In fact, almost all text has been removed from the whole interface now, and you can very quickly move around.
The result? My playtesters did not mind going through the interface and changing some settings anymore, and I did not see their mood or energy drop when they had to do that. Itās literally 5-10 seconds between startup and playing a game (if you want to keep your previous settings).
Even though that did not change gameplay at all, I think it made every impression of the game at least ten times as good.
Lesson #8: Start with extremes, then scale back
Many properties of this game used to be more extreme, but were softened after I did some playtests. I see this pattern a lot and think itās more useful than the other way around (i.e. being very careful with your settings, then cranking them up when they donāt seem to work).
For example, you used to be able to dash and tackle continuously. Then you could only dash once the previous dash ended. Now thereās a timer of 5 seconds before you can dash again.
Or the āshrinking fieldā rule (where the arena slowly shrinks, and you die if youāre outside the āsafe zoneā) used to be too quick and unexpected. A game with this rule enabled would end within a minute, and mostly because players didnāt see it coming and suddenly died (to their annoyance ā¦) So now it waits longer and flashes a short warning before it starts to shrink.
Or the āstatistics/traitsā shown at the game over screen. At first, it showed 3 per person. But thatās 12 traits appearing on your screen for 4 players! Just too much, overwhelming, and players stop reading them after the first game. So I scaled back and it now randomly shows between 1-3 traits.
(The list goes on and on. There used to be more teleports in that āteleport arenaā, the edges of the arena used to be pushed more outward but it caused players to lose their character if too close to the edge, there were originally 6 powerup slots (SIX! What was I thinking?!) per player.)
Working this way, I think most values and mechanisms in the game ended up quite balanced. Only a few playtests, a few days, were needed to scale back from the extreme.
Properties that went the other way around, however, gave me more trouble. When I first implemented āthrowing the ballā, they went too slowly. So I increased the power. And I increased it more. I did a playtest and increased it even further. But no matter how often this cycle repeats, I was never completely satisfied.
Probably because I (and my playtesters) got used to the game, and the old rules, so now they were like āwhy am I walking so slow?ā and āwhy canāt I throw the ball faster?ā
I donāt know if Iām adequately explaining this, maybe I can do a better job once I understand it better myself. It just feels like itās better to balance games by starting with extremes, because starting āconservativelyā makes it easy to just completely miss mechanics or their impact, so you donāt even know what youāre trying to balance.
Remark: on a related note, I have the tendency to think āoh man this mechanic just doesnāt workā when my playtesters donāt really understand or use it. But thatās way too radical :p Usually, the problem is one of balance, of tuning the parameters. Maybe players donāt use mechanic X because itās too weak right now, but if I make it twice as fast it might be the best thing ever. So I try to catch myself when Iām having these thoughts, and simply try other values/parameters before scrapping the whole idea.
Conclusion
So yeah, thatās it. A game thatās nothing special, very small, good for a few quick rounds here and there.
But still, itās a game. A finished game people enjoy. Something that taught me these lessons I explained above.
And thatās what these āone week gamesā are all about: finishing, learning, and mostly having a good time with my friends/family when testing these games.
The next one will probably be completely different again. After all the wonky physics stuff I did for this one, Iām done with that part of game dev for the time being :p
Alternatively, if I find the courage, I will port this game to actual 3D.
Until the next devlog,
Pandaqi
Remark: Just wanted to state that I lost hours trying to find the weirdest bug of my life. Whenever I exported the game, half of my font files were just ⦠missing. It seemed really random, because the exact same font would work in one scene, but be gone in the other.
It turned out that it was an issue with case sensitivity. Apparently, when creating the project, I called the āFontsā folder āFOntsā instead. A simply typo, which I immediately fixed ⦠or so I thought. I had already used the font in a few locations before changing the name. (Iāve done this so many times, that I probably did it within a minute, on autopilot.) So when I changed the folder name (outside of my game engine), it all went mayhem a few days later.
So I renamed all font-related stuff āsnake_caseā-style, relinked everything, and it was fine. (I use Godot game engine by the way.)