I’ve been doing a lot of work recently on enemies in Alchementalist. I want to get the game into a state where I can really test different mechanics out and see how the emergent gameplay works, and that means populating the world with a bunch of bad dudes intent on making your life as a player difficult.
The most recent one I’ve added is tentatively titled “Nightstalker”. They are void based creatures (which means they’re all dark and phantom-ey) and they have a teleport attack. Now whenever people talk about making their games, I always want them to drill down into the details of the code so I can learn actual techniques from them, but sadly, I’m going to disappoint even myself and not do that here, rather I’m going to talk about how trying to tweak some very minor graphical decisions led to more emergent depth within the gameplay of Alchementalist.
Firstly, let’s come to grips with the Nightstalkers. The mechanics behind the Nightstalkers is thus: You walk into their visual range and they “see” you, turning to face you, you then have a grace period where they bide their time waiting to attack, then they teleport to a random area behind where you are facing and finally they launch an attack that has a relatively small range.
Now the problem I had is that I had a teleporting enemy, but the teleportation was very sudden and it was hard to predict when it would happen, making them feel kind of strange and not too good to fight against:
This would be ameliorated by having a “windup” animation (all the featured Nightstalker sprites are very WIP and some animations are missing entirely), but I still wanted something that would make the timing a little more clear to the player beyond just a windup, so I settled on having some sort of targeting indicator.
My first iteration was this:
I was pretty happy with this (and it’s pretty close to the current implementation, at least for now); it gives a clear indication of when the teleport will happen and gives the player directional information about where the threat is coming from. However, I wanted some feedback about the indicator that wasn’t just my brain (which can be exceptionally stupid sometimes), so I decided to post a twitter thread asking for input. You can read the thread here if you want: The Thread.
Some helpful folks (@ottergamesdev and @Eluem and @sevenports1 specifically) chimed in and helped make the indicator look cleaner, but one of the suggestions wasn’t about the indicator itself, instead it was to make the area the Nightstalkers were targeting stop updating a little bit before the actual indicator resolved. The reasoning being that if the player is moving, the Nightstalkers will always be aiming a few frames “in the past” before they teleport and therefore their attack is a little easier to dodge through movement.
Now, I did have something similar to this originally. When I first implemented it, the timer after they teleported, but before they attacked was longer. I shortened it dramatically because I didn’t like the way the Nightstalkers stood there for a little bit like idiots after teleporting before they would attack. The alternate method mentioned in the twitter thread is better than my method because the “delay” is invisible to the player. It looks like they are always targeting exactly where you are, but in reality, moments before they teleport, they stop updating their targeting positions invisibly.
I liked the idea, so I implemented it in. Then I noticed something interesting. By adding this invisible targeting delay, it introduced an entirely new mechanic. Originally, as long as you were moving fast enough and you weren’t running directly through the enemy, you could escape any attack they launch. I was relying on the player having to avoid other enemies and therefore being forced into a situation where the Nightstalkers hit would land. With this delayed implementation though, the decision that reflected whether you would get hit was both the direction you were facing and the direction you were moving combined, a much more active decision compared to simply moving away from them:
Let me explain. The Nightstalkers teleport behind you. This means that if you are facing them, but running backwards away from them (as you almost definitely will be if you are trying to attack them), they teleport further ahead of you in the direction you are running because that’s the opposite of the direction you are facing, meaning you are essentially running into them after they teleport. If you are facing away from them while you are running away from them, they teleport behind you except this time, you are running away from them. This gives the player complete agency over whether they get hit or not. If you make a mistake and are attacking them when they teleport (meaning you are facing them), you will get hit. If not, you won’t get hit. Awesome. Here’s another example with the latest graphical iteration of the targeting indicator showing this more clearly:
You can see that as long as I’m facing away from the enemies and also running away from them, I will not get hit. However, if I’m facing them while running away from them, I’m guaranteed to get hit.
This mechanic was vaguely in the previous iterations, but because there was no targeting delay, it didn’t matter if you were running into them or away from them, it only mattered whether you were moving or not.
This is one of the many examples of why iterative design and getting feedback is a great thing. If I had of been happy with my original indicator and started working on something else, I would have missed a great chance of adding emergent depth. By spending a little more time and asking around, I stumbled into a perfect opportunity to add a hidden mechanic to the game. There will now be a noticeable difference between a skilled player and someone who is new to the game when fighting this enemy.
This might seem like such a little thing to talk about for such a big blog post, but part of making a game that people love is finding ways to squeeze all the sweet pulpy juice out of every little moment and giving them the opportunity to showcase their skill, even if it’s just to themselves. A player who is good enough can still essentially dodge every attack this enemy throws (as could be done before, simply by running), on the other hand being able to do that in the middle of a chaotic fight with other enemies and mechanical checks coming their way is very hard. But it’s not impossible, and that’s the rub.