Last weekend I made a game for Ludum Dare 34, Chaintanks!
This is the second time I’ve participated in LD, with Telemage being first game I made for the competition. Overall this Ludum Dare went a lot better than the first one. I had a better idea of how much I can get done in 48 hours, a far better grasp on Unity from working on Telemage and Psycho Cyclist, and a better appreciation of just how valuable every minute of a game jam is. The majority of the time I spent on the game was solid focused work, and I ended up getting a lot done.
Chaintanks turned out a lot better than Telemage, at least in my opinion. My recent experience with Unity made everything I did faster. Adding new features, enemies, or whatever else was doable in a few minutes where it might have taken me an hour or so last time.
I had a basic understanding of Unity’s UI features and was able to make a proper menu. I was even able to quickly throw together a tutorial page with some tips and screenshots which I think would have been a huge benefit to Telemage. The largest benefit of making Chaintanks, however, was the game design experience it gave me.
With such a limited amount of time the pressure was on to get started on something as quickly as possible once the theme dropped. There were two themes this time around: two button controls and growing. I chose to focus on growing simply because more ideas came to mind for that theme.
I had three ideas for games right out of the gate. The first was a game where you play an alien life form consuming every living thing in a remote base, slowly growing larger and larger and gaining the ability to eat more things rather than be destroyed by them. The second was a puzzle game where you play cancerous tumors spreading throughout someone’s body. The third was a game set in a desert environment inspired by Mad Max. You’d drive some sort of vehicle upgrading it with scrap collected from enemies and making it larger by adding trailing pieces like truck trailers or train cars and customizing hardpoints on them with different weapons.
I chose the third idea since the first would probably end up being a stealth game and I’m not a big fan of the genre, the second was a bit morbid, and I had no idea how to make a compelling puzzle game with so little time.
I had initially wanted to have an entire UI for upgrading the segments of the player’s chain as well as customizable hardpoints with different layouts depending on the vehicle. That would have been far too much though, so I cut that down to simply collecting scrap and having it auto upgrade simpler pieces with one random turret each.
Once I’d finished the game I focused on getting some feedback on it. In Ludum Dare it’s as simple as playing and rating other people’s games which, boosts your ‘coolness’ rating and pushes your game up the list so more people see it. Most of the time the comments section of a Ludum game is all positive even if the game itself isn’t very good, but there’s still valuable feedback in there.
A few people managed to get well over 100 vehicles in their chain, something I didn’t really expect. Unfortunately, the game slowed down to less than 1 FPS on them. Optimization is not something I should be spending much time on during a game jam, but in the future I could either avoid game designs that have a lot of stuff on screen, or put in measures to limit that to some extent.
A couple of people in the comments as well as others I showed it to said the controls were a bit awkward. I knew I wanted to limit the rate the player could turn at so they couldn’t get tangled up too badly or make the physics act oddly. I went with WASD controls where you press in the direction you want to go and the tank turns towards that direction on its own. Unfortunately, this wasn’t as intuitive as I thought it would be.
The alternative was WS to accelerate or stop and AD to turn the tank. The problem with that was if the player was moving down then left and right would get flipped which might confuse them, so this control scheme might not have been any better.
The next time I make a game for Ludum Dare, if I can’t decide between two control schemes, I’ll consider providing the option to choose between the two of them and leave whichever I think is best as the default.
The place where play testing fails with Ludum Dare is iterating on a design. Submissions are final, so getting feedback on an updated version of the game is a lot more difficult. That doesn’t mean I can’t learn more by playing it myself after the jam is finished.
So When I Actually Played It…
While I was working on the game I didn’t have time for anything more than some very brief balance testing. After the jam was over I sat down to try to get as far as I could and managed to get to 191 vehicles.
When I first saw people in the comments saying they got that high I was surprised, but after doing it myself I can see the game totally breaks down with chains longer than 15 or 20 vehicles.
The game actually performed decently, but I was using the windows version on a fairly powerful machine so I only saw a few framerate hiccups when my chain got long. Performance wasn’t what broke the game, at least on the windows version. The design and implementation are simply flawed beyond the early stages of the game in a few different ways.
The first problem was the enemy AI. I programmed enemies to target random segments of the player’s chain with a higher chance to attack the first vehicle. Enemies try to orbit around their target segment at a chosen distance while randomly switching their target every 7 seconds.
With small chains this makes enemies seem to constantly harass you by trying to sever parts of your chain or by attacking your lead vehicle. With large chains they’ll often follow parts of you that are offscreen where bullets vanish instantly and get stuck pushing into your chain trying to orbit around their target. This makes the game get easier and easier as it goes on simply because the AI can’t intelligently attack you anymore.
The second problem was with how healing was poorly balanced. Picking up scrap heals all segments in your chain for 2 HP. With a small chain this feels decently balanced, or even a little bit too weak. With large chains you can heal hundreds of HP with just one piece of scrap. This is clearly overpowered, especially when you consider how much the AI ends up spreading their damage around when you have a large chain.
The third problem was with how destroying one of the first vehicles in the chain would make the rest of the chain stop. With small chains it feels like a useful and interesting tactic, but not overpowered. As the chains get longer and the amount of firepower grows, severing the head of an enemy chain is trivially easy. Once the head is gone you can simply shoot the helpless pieces left behind and soak up even more scrap which further exacerbates the problem.
So, how do I fix it?
There are a few things I think I can do to fix Chaintanks’ late game. The first would be to change scrap healing to provide a flat amount of health and have it favor healing tanks at the front before tanks at the back. This will let players protect their vulnerable front segments more easily while bringing the power of scrap healing into line.
The second change will be to add a LOT more upgrade levels to enemy chains, and probably a few for the player’s segments too. There are three upgrade levels for enemy segments right now, and the level 3 segments simply don’t hold up in the late game.
The way enemies scale right now is actually by giving them increasing amounts of scrap when they spawn. When a tank is given scrap by collecting it or spawning as an enemy, the scrap marches down the chain with a 35% chance to upgrade each segment. If it upgrades something it stops, and if it gets to the end it adds a level 1 segment. This tends to make the front segments get fully upgraded, then taper off towards the end.
If I add a lot more levels and perhaps reduce the upgrade chance of later levels, late game enemies should have hardened fronts and more vulnerable backs, which will make shooting the front or back both equally valid tactics.
Adding more levels will also shorten the chains by funneling more of the scrap into the strength of the chain rather than it’s size which should improve performance on the web version.
I really enjoyed working on Chaintanks! It was a great chance to practice designing a game, cutting features, identifying problems with a design, and coming up with solutions to them.
After going over the design of Chaintanks, I’ve decided to try to fix some of the problems to practice iterative design. For the next few weeks I’m going to put Psycho Cyclist on hold and focus on polishing up Chaintanks for release on Newgrounds!
I was also planning to write about Telemage here, but I’ve gone on long enough already, so check back soon for another Ludum Dare postmortem!