David Pittman







MAEK GAEM





Level 2MAEK GAEM Slayer Shock « on: May 23, 2016, 02:27:38 PM » Slayer Shock is a role-playing shooter about hunting vampires in Nebraska. Operating from your headquarters at a college coffee shop, you take missions to patrol the streets, rescue captive humans, and weaken the undead threat. A team of fellow vampire slayers assists you from HQ, providing new weapons, skills, and research.



Slayer Shock is a spiritual successor to my 2013 game



Slayer Shock has been in development since November 2014, and I'm aiming for a release before the end of the year (2016). Notable developments so far include replacing the blocky voxel world of Eldritch with a contemporary mesh-based world, implementing a physically-based (or at least -inspired) deferred shading approach, rewriting almost the entire procedural generation pipeline, and a whole lot of work designing and coding a campaign layer to manage the persistent status of the player, teammates, and major enemies.





















is a role-playing shooter about hunting vampires in Nebraska. Operating from your headquarters at a college coffee shop, you take missions to patrol the streets, rescue captive humans, and weaken the undead threat. A team of fellow vampire slayers assists you from HQ, providing new weapons, skills, and research.is a spiritual successor to my 2013 game Eldritch , in its generated worlds and its immersive simmy blend of stealth, combat, and player choices; but this is not a roguelike game. "Death" is not game over: if you are defeated, you return to HQ to regroup, recover, and plan your next move.has been in development since November 2014, and I'm aiming for a release before the end of the year (2016). Notable developments so far include replacing the blocky voxel world ofwith a contemporary mesh-based world, implementing a physically-based (or at least -inspired) deferred shading approach, rewriting almost the entire procedural generation pipeline, and a whole lot of work designing and coding a campaign layer to manage the persistent status of the player, teammates, and major enemies. « Last Edit: August 24, 2016, 08:03:02 PM by David Pittman » Logged NEON STRUCT - Eldritch - More Games: Slayer Shock

chrilley









Level 2 Re: Slayer Shock « Reply #1 on: May 23, 2016, 02:35:10 PM »



What kinds of enemies are there going to be? Besides the ones in the screenshots? Looks interesting! I would love to see some gameplay footageWhat kinds of enemies are there going to be? Besides the ones in the screenshots? Logged

Twitter - Facebook - DevLog

bexsella









Level 0 Re: Slayer Shock « Reply #3 on: May 24, 2016, 10:51:49 PM » I've enjoyed both Eldritch and NEON STRUCT. Looking forward to this as well. Logged

David Pittman







MAEK GAEM





Level 2MAEK GAEM Re: Slayer Shock « Reply #5 on: May 29, 2016, 10:18:09 AM »



Quote from: chrilley on May 23, 2016, 02:35:10 PM What kinds of enemies are there going to be? Besides the ones in the screenshots?



I'm aiming for around 4 or 5 major enemy types, with some minor variations for a total roster of maybe 7-8 enemies.



Most of the enemies you encounter are little monstrous Count Orlok-esque vampire Minions. They're spawned dynamically using an AI manager, and they're weak but can be pretty dangerous in large numbers. Think Left 4 Dead's zombie horde.



Then there's the more passing-for-human category of vampires, which includes Elites and Leaders. They're tougher fighters who dodge, keep their distance, and attack with ranged projectiles. Elites are found in most missions, in fixed numbers. (Unlike Minions, they're not continually spawned during play.) Leaders are stronger uniquely-named Elites with powers of transformation and persuasion. Your main objective is to research, hunt, and destroy the vampire Leaders over the course of a season, but they also pop up periodically to attack or taunt you.



Finally, there's a handful of "twist" vampires like the hulking guy in the screenshot above. They're spawned infrequently by the AI manager to keep things interesting. Thanks for the kind words, folks!I'm aiming for around 4 or 5 major enemy types, with some minor variations for a total roster of maybe 7-8 enemies.Most of the enemies you encounter are little monstrous Count Orlok-esque vampire Minions. They're spawned dynamically using an AI manager, and they're weak but can be pretty dangerous in large numbers. Think's zombie horde.Then there's the more passing-for-human category of vampires, which includes Elites and Leaders. They're tougher fighters who dodge, keep their distance, and attack with ranged projectiles. Elites are found in most missions, in fixed numbers. (Unlike Minions, they're not continually spawned during play.) Leaders are stronger uniquely-named Elites with powers of transformation and persuasion. Your main objective is to research, hunt, and destroy the vampire Leaders over the course of a season, but they also pop up periodically to attack or taunt you.Finally, there's a handful of "twist" vampires like the hulking guy in the screenshot above. They're spawned infrequently by the AI manager to keep things interesting. Logged NEON STRUCT - Eldritch - More Games: Slayer Shock

David Pittman







MAEK GAEM





Level 2MAEK GAEM Re: Slayer Shock « Reply #6 on: May 30, 2016, 02:25:25 PM » Eldritch, and since I just spent the morning changing it even further, I thought it might be interesting to talk about why and how that happened.



For Eldritch's Lovecraftian worlds, messy and chaotic levels were somewhat desirable. Or frankly, I used the theme as a crutch to avoid solving some hard problems. Brick walls would join to caverns or ancient ruins with little regard for spatial or functional coherency. (If you're curious, you can watch me nervously talk about level generation in Eldritch here:



In Slayer Shock, I'm trying to model more familiar spaces. For example, here's an early WIP shot of the suburbs level:





It's not the most complicated thing, but it's coherent: streets intersect in a reasonable way, and houses are oriented to face out onto an adjacent street.



Levels in both games are built from axis-aligned tiles, where each edge of a tile may either be a terminating edge (i.e., a wall) or a connection to another tile (a portal).



The first step toward more coherent levels was to tag the portals with some metadata that defines not only that they *can* connect, but *how* they connect.





For example, this 3-way junction has purple walls on three sides, indicating that the tile must connect to a street on that edge. On the fourth side, the yellow wall marks a curb that should connect to a housing lot.



Another important addition to the level generator was prioritization of tiles and portals. Unconstrained, the generator could theoretically place a street, then a house beside that street, then another parallel street on the opposite side of the house, and so on in that fashion, producing a series of short streets that never intersected:





I'm good at drawing. So anyway, that sort of street plan is obviously silly and undesirable.



My solution was to introduce a priority system that would let me specify certain tiles or portals to always take precedence if expansion through them is available. In this case, I make the generator build a network of interconnected streets first, by prioritizing the street pieces before the housing lots; then after the street expansion has run as far as it is allowed, the remaining holes in the level are filled in with houses wherever they fit. Finally, a high wall is placed beyond the lots to enclose the whole space.



An unfortunate side effect of this approach is that it is possible for the generator to produce invalid worlds. After laying out the street network, it could happen that there are no house tiles that fit the holes in the map. In that case, the generator throws up its hands, discards the level completely, and starts over. It's an acceptable solution, but not ideal. In the worst case, the game will spin at the loading screen for 2-3 seconds while the generator churns through hundreds of abortive levels to find one that works.



I've given some thought to better ways of handling failure cases, but nothing has stuck yet. The idea I keep coming back to is to unwind the last steps of generation and try something else, effectively depth-first-searching the state space in random order. It's a neat idea that might have other value, but it would also be a heavy change to the generator and could actually perform much worse than a discard/restart in the worst cases.



* * *



Edit:

I forgot to mention it, but another *huge* improvement to the level editor and generator is that tiles can be any size now. That 3-way junction above is what I'd call a 1x1 tile, the smallest piece that fits on the level's footprint grid. But tiles can be any multiple of that footprint. For example, this house piece is a 1x2 tile, twice as long as it is wide:





By comparison, in Eldritch, large features had to be painstakingly assembled from a bunch of 1x1 tiles. It was a mess. I mentioned in the first post that I'd rewritten most of the procedural level generation from, and since I just spent the morning changing it even further, I thought it might be interesting to talk about why and how that happened.For's Lovecraftian worlds, messy and chaotic levels were somewhat desirable. Or frankly, I used the theme as a crutch to avoid solving some hard problems. Brick walls would join to caverns or ancient ruins with little regard for spatial or functional coherency. (If you're curious, you can watch me nervously talk about level generation inhere: http://www.gdcvault.com/play/1022110/Level-Design-in-a-Day .)In, I'm trying to model more familiar spaces. For example, here's an early WIP shot of the suburbs level:It's not the most complicated thing, but it's coherent: streets intersect in a reasonable way, and houses are oriented to face out onto an adjacent street.Levels in both games are built from axis-aligned tiles, where each edge of a tile may either be a terminating edge (i.e., a wall) or a connection to another tile (a portal).The first step toward more coherent levels was to tag the portals with some metadata that defines not only that they *can* connect, but *how* they connect.For example, this 3-way junction has purple walls on three sides, indicating that the tile must connect to a street on that edge. On the fourth side, the yellow wall marks a curb that should connect to a housing lot.Another important addition to the level generator was prioritization of tiles and portals. Unconstrained, the generator could theoretically place a street, then a house beside that street, then another parallel street on the opposite side of the house, and so on in that fashion, producing a series of short streets that never intersected:I'm good at drawing. So anyway, that sort of street plan is obviously silly and undesirable.My solution was to introduce a priority system that would let me specify certain tiles or portals to always take precedence if expansion through them is available. In this case, I make the generator build a network of interconnected streets first, by prioritizing the street pieces before the housing lots; then after the street expansion has run as far as it is allowed, the remaining holes in the level are filled in with houses wherever they fit. Finally, a high wall is placed beyond the lots to enclose the whole space.An unfortunate side effect of this approach is that it is possible for the generator to produce invalid worlds. After laying out the street network, it could happen that there are no house tiles that fit the holes in the map. In that case, the generator throws up its hands, discards the level completely, and starts over. It's an acceptable solution, but not ideal. In the worst case, the game will spin at the loading screen for 2-3 seconds while the generator churns through hundreds of abortive levels to find one that works.I've given some thought to better ways of handling failure cases, but nothing has stuck yet. The idea I keep coming back to is to unwind the last steps of generation and try something else, effectively depth-first-searching the state space in random order. It's a neat idea that might have other value, but it would also be a heavy change to the generator and could actually perform much worse than a discard/restart in the worst cases.* * *Edit:I forgot to mention it, but another *huge* improvement to the level editor and generator is that tiles can be any size now. That 3-way junction above is what I'd call a 1x1 tile, the smallest piece that fits on the level's footprint grid. But tiles can be any multiple of that footprint. For example, this house piece is a 1x2 tile, twice as long as it is wide:By comparison, in, large features had to be painstakingly assembled from a bunch of 1x1 tiles. It was a mess. « Last Edit: May 30, 2016, 02:51:50 PM by David Pittman » Logged NEON STRUCT - Eldritch - More Games: Slayer Shock

David Pittman







MAEK GAEM





Level 2MAEK GAEM Re: Slayer Shock « Reply #7 on: June 04, 2016, 11:42:53 AM »



Designing spaces for stealth is weird, because levels are procedurally generated and enemies are spawned dynamically and don't have prescribed patrol paths. Since I can't design specific stealth encounters the way I could in NEON STRUCT, I'm trying to populate regions with just enough stealth opportunities (occlusion and foliage) so there's always a visible safe spot but movement is still risky. The experience changes a lot depending on the (procedural, systems-driven) enemy population, so I expect I'll be iterating for a while on things like the distance between safe spots.



Combat is meant to be Doom-y, more about movement than cover; and flat, open spaces are fine for running and shooting. But uniformly open space is boring, and I'm still learning what makes an interesting combat space for this game. The player has a lot more mobility than enemies do, so the challenge is to make arenas that afford interesting tactical choices without completely hampering enemy movement.







Then I got sidetracked by a collision bug. When I oriented certain meshes in certain ways, they started blocking movement in unexpected, broken ways. I eventually realized I'd overlooked a corner case in my AABB-convex hull tests, but it would only manifest when a hull was rotated on more than one axis, which I'd never done until this week. The solution was more complicated than I anticipated—projecting the transformed 3D hull onto each axis, finding the 2D hull of that, and adding planes to the 3D hull for each edge in the 2D hull—but it was the rare happy programmer moment when everything Just Worked the first time I ran it after implementing the fix.



I also did a second pass on procedural wind animation for foliage, inspired by



My plan for this week was to iterate on combat spaces. I've got a lot of stealth and combat systems implemented, but most of the exterior levels have been too flat and open and homogeneous to fully support the systems.Designing spaces for stealth is weird, because levels are procedurally generated and enemies are spawned dynamically and don't have prescribed patrol paths. Since I can't design specific stealth encounters the way I could in, I'm trying to populate regions with just enough stealth opportunities (occlusion and foliage) so there's always a visible safe spot but movement is still risky. The experience changes a lot depending on the (procedural, systems-driven) enemy population, so I expect I'll be iterating for a while on things like the distance between safe spots.Combat is meant to be-y, more about movement than cover; and flat, open spaces are fine for running and shooting. But uniformly open space is boring, and I'm still learning what makes an interesting combat space for this game. The player has a lot more mobility than enemies do, so the challenge is to make arenas that afford interesting tactical choices without completely hampering enemy movement.Then I got sidetracked by a collision bug. When I oriented certain meshes in certain ways, they started blocking movement in unexpected, broken ways. I eventually realized I'd overlooked a corner case in my AABB-convex hull tests, but it would only manifest when a hull was rotated on more than one axis, which I'd never done until this week. The solution was more complicated than I anticipated—projecting the transformed 3D hull onto each axis, finding the 2D hull of that, and adding planes to the 3D hull for each edge in the 2D hull—but it was the rare happy programmer moment when everything Just Worked the first time I ran it after implementing the fix.I also did a second pass on procedural wind animation for foliage, inspired by Jane Ng's Firewatch talk at GDC and the Crysis implementation in GPU Gems 3 Logged NEON STRUCT - Eldritch - More Games: Slayer Shock

David Pittman







MAEK GAEM





Level 2MAEK GAEM Re: Slayer Shock « Reply #8 on: June 06, 2016, 10:22:19 PM » Slayer Shock is that it should provide lots of opportunity to generate player stories—in other words, some confluence of variables sets up an exciting scenario, such that the player feels they can experience something unique, unexpected, and memorable.



Each mission has a random chance of incorporating a "twist", which is basically a data block that can modify or override virtually anything from global lighting to enemy population rates to specific entity spawners and properties. My first test case was a "dark level" twist, which dramatically changes the light and fog in a level and gives the player an attached flashlight.





The second twist I've implemented is a "miniboss rush" which decreases overall enemy population but increases the frequency of rare, tough enemy spawns. I'm aiming for a good balance of aesthetic and systemic twists like these; and in combination with the number of levels and mission types, there will be a lot of ways to experience the game. One of my goals foris that it should provide lots of opportunity to generate player stories—in other words, some confluence of variables sets up an exciting scenario, such that the player feels they can experience something unique, unexpected, and memorable.Each mission has a random chance of incorporating a "twist", which is basically a data block that can modify or override virtually anything from global lighting to enemy population rates to specific entity spawners and properties. My first test case was a "dark level" twist, which dramatically changes the light and fog in a level and gives the player an attached flashlight.The second twist I've implemented is a "miniboss rush" which decreases overall enemy population but increases the frequency of rare, tough enemy spawns. I'm aiming for a good balance of aesthetic and systemic twists like these; and in combination with the number of levels and mission types, there will be a lot of ways to experience the game. Logged NEON STRUCT - Eldritch - More Games: Slayer Shock

David Pittman







MAEK GAEM





Level 2MAEK GAEM Re: Slayer Shock « Reply #9 on: June 11, 2016, 08:04:33 PM »





I also did a small bit of work on wardrobes. Character outfits are randomly assembled from matching pieces (shirts, trousers, etc.), color schemes, and optional accessories like hats and glasses. I'll need to make a lot more assets, but the system works and has potential.





Today, I built a simple web page (with some placeholder content), and got my itch.io butler pipeline set up. I expect to do a few rounds of limited sales through itch.io refinery later this year, because that's a version of "early access" that suits my needs much better than Steam.



I spent most of this week on various art tasks. I started working on a new forest level called Logan's Woods, loosely inspired by many weekends of my childhood spent hiking around Fontenelle Forest in Bellevue, NE. My original plan was to have the boardwalk path raised a few meters off the ground, but that turned out to be challenging for AI navigation. Lowering the boardwalk to the ground also allows the player more opportunities to take cover behind rocks or in bushes, so I think it's the right thing for the level.I also did a small bit of work on wardrobes. Character outfits are randomly assembled from matching pieces (shirts, trousers, etc.), color schemes, and optional accessories like hats and glasses. I'll need to make a lot more assets, but the system works and has potential.Today, I built a simple web page (with some placeholder content), and got my itch.io butler pipeline set up. I expect to do a few rounds of limited sales through itch.io refinery later this year, because that's a version of "early access" that suits my needs much better than Steam. Logged NEON STRUCT - Eldritch - More Games: Slayer Shock

David Pittman







MAEK GAEM





Level 2MAEK GAEM Re: Slayer Shock « Reply #10 on: June 26, 2016, 08:35:02 PM »



Quote My takeaway from wrestling’s repetition is about how to maximize the limited narrative bandwidth in this particular game. With its procedurally generated levels, there is little room for narrative delivery during core gameplay in Slayer Shock. Plot development happens at the margins of gameplay, in between missions, just as it mostly happens in between matches in wrestling. With such limited opportunity for narrative content, it is critical to reinforce characters through repetition, and there is little time left over to substantially develop them beyond that.

http://www.dphrygian.com/wordpress/?p=160 I just wrote up a big thing on my personal blog about how professional wrestling guided the narrative development of this game. I'm not going to copy the whole thing here because it's over 1800 words, but here's a taste: Logged NEON STRUCT - Eldritch - More Games: Slayer Shock

HoffmanIV Guest

Re: Slayer Shock « Reply #11 on: June 28, 2016, 02:32:15 AM » I saw an article about this posted on Kotaku. I love what you're doing here with respect to trying to weave a narrative in with heavy procedural generation. Looking forward to seeing some gameplay in the future! Logged

Craig Yates









Level 0 Re: Slayer Shock « Reply #13 on: June 29, 2016, 10:35:08 AM » Looking really good so far, I liked Neon Struct a lot so I'll definitely be keeping my eye on this. Would always enjoy reading more about your approach to procedural level generation in particular. Logged Raised By Robots - I'm making games at breakneck speed. That is to say, as if my neck were broken.

oldblood





...Not again.





Level 9...Not again. Re: Slayer Shock « Reply #16 on: June 29, 2016, 01:06:50 PM » This is very cool. Will be following!



Random question... do you have a brother who looks and sounds just like you who also happens to make games? I feel like I've seen you before but working on different games... Logged @jonoldblood | Masochisia Devlog | Masochisia (Steam)