Gaming Your Way

May contain nuts.

Node based pathfinding

So the refactoring has turned more into re-coding with regards the baddies.

Due to the collisions being a lot ( Lot ) more robust than in the previous two games, it's highlighted a large issue with the baddie AI. Basically it was cheating badly. Now it can no longer cheat the baddies are too dumb. Joy. So lets make those bad boys a bit smarter, with some pathfinding.

That's a section from level 2 ( It's pretty ugly designing levels ). Those brown circles are our nodes which we're going to use to path find. Luckily this is about as complex a layout as we're going to have in the game, so I won't be killing myself putting a million nodes down every where.

What we do at present is a line of sight check from the baddie to the player. If there is one then he'll head off towards the player as before. Every couple of frames I check to see if that line of sight is still present. If not, then the baddie has to find a different way to the player, and the path finding kicks in ( Before they'd just pick a random direction and walk off towards it ).

It works using a form of Dijkstra's algorithm. When the level is created all the nodes are stored away. Each node is then told about all the other ones and then calculates the distance from itself to the others. The idea is to pre-calculate everything as much as possible before hand, so the actual pathfinding runs as quickly as possible.

Every frame the game works out which node is closest to the player, and sorts an array based on that ( So array[0] is the closest ). I'm slightly concerned about the impact that will have on performance, but it's a pre-sorted list which doesn't change that much ( Relative to the game running at 35 fps ) and it's not showing up as taking that much time, so I can live with it ( Plus I imagine I could skip the check every 5 frames or so without it causing any harm ).

When the baddie needs to find a path it calculates which node it's closest to. I don't check all the possible nodes on a level as that's a waste, if it's more than 10 nodes to get the player then the baddie is more than likely well off screen and we can just pause it. Now we know the nearest node, and we know that the destination node is always closest to the player ( array[0] ) we just run a simple check to find out a path from the baddies node to the players based on the pre-stored distances. This is stored in a Vector of x,y coords for each node, and sent back to the baddie. It then walks from node to node until he gets to the end and then he'll start again.

As you can see there, node 0 is the one which was nearest to the baddie, he's already got there, and he's moving down the path.

Now it's not fool proof, he won't always find the shortest path, but to be honest I'm not worried. The baddies aren't meant to be super smart, and compared to how they were before they've had a hell of an IQ boost. In a perfect world when there are a couple of baddies following slightly different paths it'll feel like they're flanking you.

There's still more stuff to add to the baddie code, it's been a major upheaval, but hopefully it'll be finished in the next couple of days and then I can retro fit all these amends into all the other baddie types.

And that's how we do things at the start of Feb.

Squize.

Refactoring... Joy

The other day I wrote about the gyroscope / fan / blades of death thing. I wasn't too happy about it, I wanted it so if you pushed an object in there, say a crate, the blades would really hit it hard and send it flying.

After an hour or so of should I / shouldn't I, I opted to update the version of Nape I was using for all the physics in the game. That's come as quite a shock, as I'm using a really old version and even though I wrote a wrapper class to try and shield me from pain like this, in real life unless everything goes through the wrapper ( Which is slow ) it means a lot of re-writing.

The current version [ of Nape ] is really excellent, feels quicker and does a whole lot more much easier than before. For example the laser sight on your weapon works by ray casting. We fire a ray out until it hits something, then use some trig to calculate what the new length ( Technically the height ) of the line should be. Using the new version of Nape my 20+ lines of code is now about 3. Sexy.

New Nape also rotates objects around 0,0 rather than having to centre align everything, which means I no longer need to put objects into Sprites to centre align them, I can just add a bitmap to the stage. This means nice performance improvements.
Taking a crate as an example, I'd have a sprite with the actual crate image in it, the fire animation and then another sprite for it's shadow ( So the shadow would rotate correctly ). Now we just add the crate and shadow bitmaps to the screen directly. This meant that I now have to have the fire animation in it's own movieclip, which means updating it's x,y and rotation. A small overhead really, as the fire isn't always active.
The added bonus from this is that I can put the fire animation in a different layer, which is what I've done. It's now in a layer above the shadows, so if you shoot something until it catches fire you can then push that object into a dark corner and it'll light it up. It doesn't sound much I know, but it's right, and it opens up some game play possibilities ( Such as having a dark area where you have to set things a light to find your way through it ).

Ok, this has turned into a dry techy ramble. Long story short, the change has affected around 50 classes, which means going through each one fixing them then optimising them. Painfully boring, but it'll pay off.

Squize. 

Is it survival horror ?

Every now and again I like to check in on the games on NG, to see if we've got any new comments as I think it's important to maintain a relationship with our players ( I wish I could say the same about Kong, but it usually just makes me angry. Sorry, but it's true ).

Anyway a recent comment really got under my skin, I don't know why, somethings just do don't they.

"It isn't scary. A rather glaring flaw in a Survival Horror game, isn't it?"

Ok, possibly a valid point, so I decided to look into scary games to see what we were doing wrong in comparison. I've finally bought Dead Space, after reading every other comment telling us that Outpost:Haven is so similar ( Oh you crazy kids, we stole everything from Alien Breed, not Dead Space. We're old ), so my survival horror playing is quite limited, the old Resident Evil games and that, so I'm sure there are other examples which will disprove my theories, let it be.

The core themes in survival horror gameplay seem to be:

- Restricted movement. You're always kind of sluggish which creates a feeling of vulnerability, which increases the fear. Knowing your avatar can't parkour up the wall to safety means you're always going to be drawn into a confrontation. They normally add a run button for those between the action bubble times, as you don't want to be plodding between scary rooms, but when you're in actual combat the run is usually pretty ineffective.

- Restricted view. RE and Dead Space use that over the shoulder 3rd person view for a reason. Your own avatar creates tension as it blocks a lot of your view, forcing you to rotate around to see that blind spot. It's the gaming equivalent of opening the big fridge door when you know the beast with the teeth and claws is going to be there when you close it again for a shock reveal.

- Monster closets. A jump is the easiest way to get a shock, the toaster makes me jump every time when it pops, and I know it's going to because I put the bread in there. A lot of games in this genre rely on that, the monster jumping out of nowhere to make you fill your pants. Which leads nicely onto...

-QTE. Tap the hell out of (A) to get away from the thing with the razor teeth, otherwise it's going to eat your face. The only way you can really have monster closets is to allow the player to break free ( And almost turn it into a mini-game ). Basically it's a fix for broken gameplay. If you played a platformer and a baddie appeared out of nowhere and killed you, you wouldn't play that game again as it's not fair. Monster closets aren't fair, so there needs to be a fix for that unfairness so they can keep the easy scares, and QTE's are just that.

- Limited Resources. In the DN8 games I tried to always make you, our sexy player, the most powerful thing on screen. You should always feel like you can kick arse, and it's just the sheer weight of numbers of the baddies which make it a challenge.
In a survival horror game it's the opposite. It goes back to that word again, vulnerability. You're always trying to get more ammo and health, and usually you have to sacrifice something cool out of your inventory to make room. You're traditionally the weakest thing in the game, it's an uphill struggle, good vs evil, Davis vs Goliath. Like most horror stories the end evil is always more powerful than the protagonists, and it depends on a mixture of their inherent goodness and cunning to beat the unbeatable. Survival horror games have just taken that and ran with it.

- Sights and sounds. A lot of games both visually and sonically play on our fears. It's an inbuilt impulse to dislike certain things, a rotting corpse is nasty because it's in our DNA to think it's nasty, it's to stop us eating it and getting ill. Animals that scurry and slither scare us on a deep biological level as we know they're a potential threat ( Even cats and dogs don't like shit like that, that's why they always spin around a couple of times before sitting down, to make sure there's nothing nasty beneath them to sink it's venom dripping fangs into them ). There's a reason bees are yellow and black, we have all these inbuilt hangups that are just part of us ( And for anyone reading thinking "I'm not scared of spiders though, and they scurry" well you're wrong. So very fucking wrong ).
There are quite a lot of key things like this, and a lot of survival horror games play on them, that's why you'll see a lot of baby type monsters in a game, we're designed to protect the young ( That's why kittens and puppies are so cute, big eyes, cute noses, they are things that we respond to and want to protect. Animals aren't silly ) so having the young turn against us and transform into something horrible jars us. Likewise things bursting out of bodies plays on our sexual hangups in a very deep way. These are cliches, but they work as they're built into is. How many games have you played with a creepy child's laughter, or a woman's scream ? These are on buttons for us.

So where does that leave us with the Outpost games ? Pretty much screwed. We're a top down game which doesn't restrict the players view, as that would be cheating. We can't impair your field of view too much as then that becomes a mechanic [ Creating a forced sense of vulnerability ] which overrides the actual gameplay. Sure we can put you in a room and kill the lights, but we have to turn the lights back on before anything crawls out of the dark, otherwise it wouldn't be fair.
Likewise, we can't really use a Quick Time Event when you're under attack as, well, it's not really playing a game is it ? Mashing a key over and over to be released is a crude fix for a bigger problem. So many games which use that approach will have sequences when there are baddies lined up, and if you get it wrong you're button mashing one baddie and as soon as you break free the next one gets you. It's not enjoyable, it's just a sense of relief when it's over, as it means the frustrating part has ended. It's the gaming equivalent of scratching an itch. As we can't ( Or rather won't ) use QTE's, we can't have monster closets as such. Yes we have spawn holes, but they're always pretty well sign posted and they never trigger so close to you that you can't react.
One thing we did do was restrict movement to a certain degree. Your avatar moves pretty slowly, and even slower when shooting / collecting items / bumping into tables and chairs. This was slated so much that in a dot release of Outpost:Haven I speeded up the movement, and in both Swarm and O2 the movement is faster by default. Not a great success there then.

What other tropes can we take away and use in a top down 2D Flash survival horror ? We sort of limit your resources, but not to any huge degree because we can't use a lot of the above we have to depend on that old chestnut, weight of numbers, to create a sense of terror ( Look at any non-Resident Evil zombie game in the past forever, they're dumb and slow for the most part, but there's just so fucking many of them ), and in Outpost:Swarm we take that to the nth degree, that is basically the whole game.

One thing I didn't mention above was the narrative, as that's common in most games ( Even Donkey Kong has some bullshit story attached to it ). If we do that right, and ground it in realistic terms you can relate to, it can help give us some horror for "Free".
The whole Owlmen theme improved the Outpost games a lot, it hopefully stopped it being a battle between various sprites and became a unravelling mystery. There's a reason Stephen King mostly grounds his stories in realistic environments, it makes it easier for us the reader to believe it, and when the shit goes down it could be us there facing off with a clown with silver eyes. That's why we have papers scattered on the floor in Haven, you know by the time we have big mining ships in space like that paper won't be a thing anymore, we'll all have Google Glasses as contact lenses, or drilled straight into our brain. But to try and ground it in something relatable we use paper as a simple short hand for disarray. We've all unfortunately seen the after math of explosions in office buildings, and dozens of stray sheets of paper is one of the images you take away from that. It doesn't fit the time we're trying to portray, but it fits the theme we're aiming for.

Lastly, we can't compete visually with 3D survival horror games, we're restricted by the format we chose, but sound can make a large difference. I was really proud of the sound we had in O:H, it was so much work but well worth it. With O2 we're adding a lot more, I've just the other day added an "Ambient Sound Manager" which plays additional random noises in the background, which really adds to the experience.

Ok, we're at the end, well done for making it this far. The question was "Is it survival horror", and after looking at the genre, it's still hard to say. Cop out answer I know. We don't adhere to all the usual cliches, but I think it's more than a spooky version of Gauntlet. All I know is that one small comment, in what was really a great review by a Newgrounds member, has inspired me a lot. Both to look into the genre as a whole, and to try and make sure you mess your pants whilst playing O2.

Squize.

Specular lighting

Progress with O2 is still going well, there's just a silly amount to do.

I've spent the past few days swearing at getting bump mapping in the game, creating a specular lighting effect. I think it was worth the pain.

The level without the lighting effect

With specular lighting

I'm really pleased with the effect. I did originally have both diffuse and specular, with the thinking that the outside level floors would look great with the diffuse mapping, but in reality the CPU cost wasn't worth it for the effect, it just didn't look as good as I wanted, so some perfectly good code was killed off today ( But I'm sure it'll make a return, in maybe an iso dungeon crawler, just a wild shot in the dark ).

Squize.

Outpost 2 title animation

Isn't it great when you can just be lazy and link to someone else's blog ?

Construction of the title animation.

Lux has done a great write up of all the steps which go into making the Outpost title screens just so insanely lovely. Maybe one for the artists out there rather than the coders, but getting an insight into good design is always important for everyone.

Squize.