So I’m in the gameplay balancing stage of things and it’s been a blast so far. I’ve learned a LOT, in terms of game design. I’ve been hacking away at the code adding more and more nuances to it and I thought today it’d be interesting to talk about how the game has gone from it’s initial difficulty curve, up and down to both extremes of the easy/difficult spectrum, and what I’ve learned from the process that’s finally helping the difficulty settle down into a perfect curve. If you’re an iOS developer I highly highly recommend the TestFlight service. It was easy to set up and allows me to publish builds to multiple testers anywhere with an Internet connection, and the feedback, as you’ll read, has been extremely valuable.
This was the default gameplay balancing (from here on called the Hazard AI, or just AI). Basically hazards (all the objects in the game that are thrown at you) had 5 speed levels, and every 15 – 30 seconds the next speed level would be used. At the same time a frequency delay between the throws was reduced over time. The end result was a steady “throw ….. throw ….. throw … throw … throw . throw . throw throw throwthrow” that took about 90 seconds to reach it’s fastest speed. And at Speed1 the throw animations would have a solid 20 frames. By Speed5 they’d only have like 5 frames.
The difficulty ramped too steadily. It was predictable. You got used to the pacing of throw, throw, throw, so you could almost get into a hypnotic trance where you’re just kind of zoned out and not thinking/moving in-between throws because, well, why would you, your brain knows nothing is going to happen so you can chill after each throw. Also when the game got hit it’s faster speeds it became pretty much impossible. You could survive, in theory, but it was complete luck. Basically no one could get past 1:30-ish, and most of the time would be within 10 seconds of that time.
Here I added some staggering to the timing. Now the frequency had a % chance of randomly dropping down dramatically here and there. So instead of a steady rhythm you’d get “throw ….. throw ….. throwthrow throw … throw ….. throw throwthrowthrow ….. throw” I was just messing around but when I actually tried it out I found this helped get rid of that hypnosis feeling, because now you didn’t know exactly when the hazard was coming. You had to be on your toes at all times incase the hazard was immediately followed up by another hazard. This is kind of like that psychology experiment that’s something like a mouse can press a button to get food but the button will zap him…if it zaps him at predictable intervals he’ll adapt to that but if it’s totally random he’ll get paranoid and freak out and be scared of it. I’m probably butchering the explanation of how the experiment actually went, but I think the concept is similar to what’s going on here. Fascinating.
The totally random delay meant that occasionally you’d get “throw (nothing for 5 seconds) throwthrow (nothing for 8 seconds) throw, throwthrow, throw (nothing for 2 seconds) throw (nothing for 10 seconds), throw”. This meant big gaps at times. On the one hand this wasn’t a BAD thing per say, I found the pauses built paranoia. Like you KNOW something is coming, but you don’t know when so you’re on your toes going “c’mon… c’mon… I know you’re comin’, do it, DO it!!” The problem was these breaks happened too frequently and the intensity of actually dodging things died down because of them.
To solve the intensity dying I told it to clump between 10 and 20 objects together at a time before allowing a random-length break in the action. This created an oldschool arcade “waves of enemies” feel, where you have to deal with a handful of objects and then you get a break before the next handful. This was feeling really good, but I still had issues elsewhere in the design.
Common feedback I was getting was “I feel like I can’t do BETTER.” I narrowed this down to everyone hitting a “wall” where they felt their skills were no longer relevant and survival became pure luck. My thinking on this was that the highest speeds had too few frames to react to, so the game basically became unfair on Speeds 4 and 5 (ESPECIALLY 5). I’m tracking Flurry stats and this was reflected in them…I have a stat triggered every time a new Speed is reached and everyone could make it to Speed3, but only a few made it more than a few seconds into Speed4, and no one could reach Speed5. So essentially there was a wall people felt couldn’t be passed…so why keep playing the game, if there’s no way you can do better?
Another problem was that health items were too hard to catch. You COULD catch them if you were going slow, but if you were zipping fast across the screen, there’s only one frame where the Riceball/Sushi detect if you’ve caught them so unless the planets aligned just right for your timing to hit that exact frame, you’d miss. TECHNICALLY, you suck and are in the wrong…but I think the biggest thing I’ve been asking my testers from the start is “When you die, do you feel like “That was BS, no one could do that!” or “This game is broken!” or “I should have gotten that!!”, or do you feel like “Ahh, damn, I shouldn’t have gone for that” or “Oops I shouldn’t have trapped myself in the corner like that!”?”
I learned this from a friend’s game actually. When he released it the controls were very unforgiving, so people complained like crazy that they “should’ve” won. He ended up having to loosen the controls up a bit and let the player win little control battles that realistically they shouldn’t have. Once he did that, everyone loved the controls…they couldn’t tell that the game was helping them out a bit.
Also there’s a Deflection ability in the game that creates a burst of energy that deflects a hazard if it hits you. Essentially this is a panic button move that fills up every time you dodge 10 objects. Unfortunately the feedback I got was that no one really saw a use for this, it was faster/easier to just dodge instead of hoping to time this right. It was kind of like timing a Parry in Street Fighter III or a counter in Dead or Alive…you had to be a little TOO precise for it to be very benefitial.
When I realized the difficulty wall issue was the impossibility, I figured out that I was approaching things wrong with making the game more difficult later on. Instead of speeding up the actual travel motion of the hazards, I could keep them slow by removing the top 2 tiers of travel speed, but speed up the frequency. So now instead of 2 or 3 lightning-fast hazards that are impossible to dodge, you end up with a slower-paced “wave” of 4 or 5 hazards that you have to weave through the openings between them (like moving through a crowd without touching anyone). To fix the health items I set it up so if you’re moving super-fast, your collision box for health items actually widens a bit. On top of that, I removed the health items’ multiple speed levels so they’re ALWAYS at Speed1 no matter what the rest of the game’s hazards are doing. The end result is the game doesn’t just hand you the health items, but when you think you should’ve gotten it, you’ll find that you did. It feels WAY more smooth and less frustrating.
I also increased the length of time the Deflection is alive…instead of just lasting for one hazard that should be just about to hit you, it now lasts for a full 2 seconds, deflecting anything that comes near you, essentially giving you a burst of invincibility. Now it’s WAY more useful!
At this point things were feeling pretty solid all around, until I sat down and actually tried to survive as long as I could. The problem now is that once you get used to the top hazard speed which is fairly slow after removing the top 2 tiers of speed, the game isn’t very difficult. Now instead of everyone hitting a wall at 1:30-ish, there’s NO WALL at all. I was able to play for 5+ min without breaking a sweat and only let myself die because I got bored, and this matched up with my testers’ experience. One tester said “Around the 1:40 mark I start to feel less engaged, I think something needs to happen to make it more challenging without being impossible, or something ot mix up the gameplay?”. Now pile on 5 minutes of gameplay after that 1:40 mark and no way will you ever pick the game up again, it’s boring and unchallenging. Plus now you can catch all the health items pretty easily and the new Deflection lasting forever makes it so you’re never really in danger.
I toyed with a lot of ideas here. I thought about adding stuff…like what if the play area gets thinner over time (the roof on the edges lights on fire or something and it closes in on you) so everything happens in a tighter and tighter area? No, that means adding more art and a lot more code and testing out restricting the playfield it didn’t really feel any more fun. What about making the Deflect meter take longer to fill up as the game goes on so at first it fills up after 10 dodges, but later on it takes 30? No, then you need some indication to the player of what’s going on or he’ll wonder why his Deflect meter is broken and get annoyed when he expects it to be full and it’s not. Also I’m a crappy coder and couldn’t figure out how to do this nicely, haha What about allowing way more objects on-screen? No, that’s going to lag the game because it’s already pushing limits on some devices as it is with all the huge hand-drawn art.
Okay so I want to just work with what I HAVE. So I figure I want to combine a little of the hardness of Version 3 with the “my skill level makes a difference” of Version 4. I decided to re-introduce Speed4 (Speed4 and Speed5 were cut in Version 4). But Version 3 told me that Speed4 made things feel impossible. The solution? Speed4 in smaller doses! Now when Speed4 is reached, there’s a % random chance that it’ll drop to a random speed below it, even Speed1. When I was a kid I played Street Fighter II with a buddy all the time and one of the strategies we figured out was to throw “fast Hadouken, fast Hadouken, fast Hadouken, SLOWWWWWW Hadouken” The fast ones would get the other guy used to the timing and then the slow one snuck in there would trip him up. So that’s essentially what this is duplicating. As a result Speed4 is less unrelenting, and ALSO has become a little trickier psychologically…a double-whammy of goodness!
I also slowed up the health item frequency over time. So at the start there’s like a 10% chance of a health item being thrown. But as time goes on that % goes down.
Very few!! Things feel really tight and I think I’m getting close to the perfect difficulty curve. Beginners should be able to last a minute with no problem, intermediate players should get to around 1:30, good players will probably be able to make it to about 2 minutes, but only really skilled players will be able to make it past 2 minutes. And it feels like your skill level makes a difference now because it’s not so much about “play until it’s too fast for anyone to realistically survive”, it’s about “play until it gets smart enough that it’s trying it’s hardest to trip you up, but if you can stay sharp you could keep going”. This has effectively removed the skill wall that the earlier versions had, but also kept the gameplay around the 1:20 – 2:00 minute mark so it doesn’t drag out into 5 – 10 minute games of boredom.
This is what I’m working on now. I’m adding a few more nuances to it, with regards to predicting common strategies the player will use and giving the AI ways to counter them. It’s pretty amazing to see how huge and nuanced the AI code has gotten compared to the start. I honestly wasn’t expecting this at all, but the end result is that Version 5 has (and Verison 6 will have) a COMPLETELY different feel and level of fun than Versions 1 and 2.
I can’t stress the importance of playtesting enough. Even if all you’re doing is getting a handful of friends to play it and observing their reactions. I’ve noticed that the feedback you get tends to be a variety of things from each tester, but if you jot notes down about each point they bring up, then compare them all in the end, you notice common themes or patterns throughout the testers’ experiences and THOSE are the things you want to take a look at changing because those are what’s giving everyone trouble even if they each describe their actual issue a little differently…you have to read between the lines and break down “okay what exactly is causing this reaction across the board?”