Category Archives: Game Design

The Lamplighters League!

I’ve gone a bit dark over 2023 and haven’t talked a lot about Auto Fire lately. I do throw time into it as I can, but there’s been another project that has consumed my attention more and more over the past three years I’ve been on it. That is The Lamplighters League and the Tower at the End of the World, the game I’ve been working on as my day job at Harebrained Schemes, the good folks that made Battletech the recent run of Shadowrun RPG’s.

LLatTatEotW is a mouthful of a name, no? This game is a classic turn-based tactical game with a real-time infiltration component, set in an alternate 1930’s where dark occult forces are on the rise. You recruit and control a roster of agents in an attempt to rebuild a secret society that combats these sorts of threats… except they all died around World War I. Your best bet is to recruit the Best of the Worst.

The Lamplighters League release date announcement.

This one has been really fun to work on… There’s realtime infiltration, which opens a lot of interesting presentation and play options. There’s a rich turn-based combat experience, the meat of where the game takes place with a lot of abilities and environmental elements interacting. There are tactical maps with procedural generation that plugs in content, enemies, and so on in key locations to add variety to missions… totally the stuff I groove on.

There’s a metagame experience where the campaign takes place over a series of weeks, charting the ascension of three competing houses of a shadowy cult called the Banished Court. Agents have upgrades, gear loadouts, health and sanity states that was fun to work on… and they also can accrue these tarot-like cards on their characters from a fate-sealing deck called the Undrawn Hand. Normally I don’t dig card mechanics in my RPG’s, but this one really allows for a pretty rich combination of power curve and special abilities… it makes for a huge variety in how each player experiences the game.

There is a pretty serious roster of agents you can choose from and each of them has a very unique playstyle, from sneaky snipers to dashing swordsmen to tanky displacers to mind controllers to incredibly potent support healers and so on. The teleporting agent is mad fun… All the things scratched that design itch: potent combos, overwatch actions, stress breaks, world spreadables, chaining passives… yeah! It was a total blast to work in this space.

Yeah it’ll be on Gamepass but I’ll be playing it on Steam… It’s pretty damn good on the Deck.

After a rest I’ll get back on some Auto Fire and other fun stuff.

Turn Execution Experiments in the Arena

Something you never hear about in game development is the challenge of capturing footage for a trailer or some amount of publicity. Few games, particularly those with any kind of randomness or procedural generation, look 100% perfect at every moment during development. Even if there aren’t bugs, you’re trying to take a slice of time, a single image, where the game shines as what you envision it to be. It can take weeks and weeks and at the end of the process you feel a strange mixture of pride in what you have created and despair over all the things you have left to do.

Skids!

So over August and September as I’ve been catching snippets for use in the Seattle Indies Expo, I got a face full of the driving experience at times when I wanted to feel the Drive Magic. However, as you drive and shoot there are stalls (put in there intentionally) as the game resolves projectiles and impacts.  That sort of turn resolution is pretty common in tactics games, it lets you see the results of your attack (or attacks against you) and process the result before moving on.  I originally set the system up that way because “that’s what Roguelikes usually do“.

However, the frequent halts during my drivin’ and skiddin’ started to bug the crap out of me, especially when there were a lot of enemies nearby. Of course I don’t pause the game when something happens offscreen, but when there are a lot of enemies it can happen often, especially in the arena where enemies were attacking each other.

So, to the experiments!  I decided to try a couple things:

  • I removed the projectile pause entirely and let attacks just resolve while the various vehicles moved to new positions. 
  • I adjusted the speed at which the turn played out based on the player speed, so turns (including those of opponents) just play out faster when the player vehicle is moving at higher speed. Turns at 25 MPH play out faster than turns at 100 MPH.

The results were interesting. Keep in mind that this is still 100% turn-based.  The only thing that has changed is how turn results are represented.

A quick experiment with turn execution

You can specifically see the lack of a delay when the player fires machineguns and rockets.

Yes, the result needs a bit of work, specifically:

  • Bullets don’t yet “lead” their targets so they are striking behind the vehicle.
  • Some slow weapons like rockets that take longer than a typical move duration (generally between a quarter and a half second) need to be converted to take multiple turns to reach their destination.
    • …but hey that’s gameplay, y’all!
  • I still need to make sure combat resolution is as readable as possible, such as:
    • Armor impacts and damage numbers are still getting obscured.
    • The armor side that gets hit isn’t as obvious as it should be
  • And of course, special moves will still need to stall the game, but that’s fine for something that doesn’t happen often.

However, in all it did improve the overall feel of driving and smoothness. This was a worthwhile experiment and I’m all in on making sure the game feels great and still has a clear turn-based combat resolution. Not sure where this will lead, and I know that a certain segment of the audience will want to be crystal clear on what’s going on in combat, in the same way that another segment will want to cut loose and skid around fluidly.  Possibly I’ll leave a toggle for the roguelike turn resolution if the player wants that (should be possible).  

More to come as the game continues to evolve!

Desert Generator at Full Power!

Something that is really enjoyable to me, believe it or not, is refining ways to generate cool maps. To see the result of a mad pile of code and some assets turn into something you can play can be a bit addicting. I’ve certainly got a lot to do for entirely new content, but since I was working on creating new types of maps, it was worthwhile to look back at how I was generating outposts.

I was really happy with how the new outposts came out.

Auto Fire uses a few different generators, one for rolling terrain, one for piecing together city blocks, one for populating hand-crafted levels… Originally I had been using the straight terrain generator that I use for battlefields and the overworld maps… a method of laying out blobs of varying terrains using Voronoi regions. If you’re unfamiliar those may sound froo-froo-fancy but for grids they are almost embarrassingly simple: Throw a bunch of spots down on the map that have a particular terrain type: mountains, clearing, rough terrain, etc. Test every tile on the map and mark it as part of whatever spot it is nearest. Add some noise and various other properties of each spot/region, plow roads to get you from place to place and you’re pretty far along. It’s at least enough for stuff like the overworld, where the specific terrain isn’t so important.

The desert overworld, using Voronoi regions

For outposts, however, that was only part of the equation… I needed walled areas, I needed an “inside” and “outside” area. I wanted buildings to make the interior more interesting. I managed to piece together features like the walls and special setpieces like water towers and little dwellings. In the end the placement of buildings were random, which created a lot of unbelievable areas and many dead-ends… a curse for a driving game where speed is king.

The buildings were also single-tile affairs… This scale mismatch was deliberately set on early in the game’s development for cities, but have since been changed to a double scale that allows buildings to be more interesting and for roads to have more width in cities.

What I realized is that I had a really refined measure of control in cities, with varying width roads, support for passability and large crafted areas, and just overall a less random feel.

The revised outpost uses larger buildings, but also build from an entirely different generator structure.

Cities are constructed using 8×8 blocks (which was 4×4 back when buildings were single-tile) that are crafted to hold a 2 or 4-lane road connector or a 1-lane alley (either left or right side). Each block has one or more exits, and a bunch of places where optional exits can be punched through if the system needs to create extra loops.

So why not do this with desert maps? Walls can be made this way of course, but we don’t want a desert map to look like Manhattan… Luckily there are a ton of tricks to keep roads from being straight and buildings falling in irregular patterns. This generator set used 4×4 tiles and almost entirely 1-lane roads, which can meander within a block like a Carcassone tile to keep things from looking too precise. One set of blocks can be used for the inside of the walls, and another for the lighter desert features outside. Everything’s great except that terrain needed to come back into the fore.

And so it did! Parts of the terrain generator came over to the block generator to give the map a more natural appearance… considering it was largely giant squares. With it we got terrain rendering thanks to Microsplat and some pretty nice grass from Advanced Terrain Grass. Our road-plowing routines guaranteed passability and some other code helped give the driveable spaces a little bit of vertical rise and fall.

So “why now” might come to mind… “You’ve had outposts for years now, so what’s the big deal about revising them now?” Fair question. The main reason is my recent investigation into new map types: Industrial parks! Dueling arenas! Race tracks! I have some examples that I’ve hand built with assets I have, but I want to get those generating also… and this same method will work for all of them.

Highways are also a culprit, because they are okay maps, but the road is arrow-straight and can’t really incorporate curves. With my current overworld system I can’t draw two-lane roads without using this block method. Also, a road that curves gently like a highway or race track is best laid out on an 8×8 tile… or even a 16×16. These things are all possible in our brave new world!

That’s the big news of February… a new build will be coming out tomorrow. Excelsior!

October Gameplay Update

Testing out my new hardware in the run-up to my first stream, I whipped up a quick video blog showing off the most recent changes to the build and its vehicle playstyles. Enjoy!

And hey, yes! I did stream for the very first time this week. I unfortunately didn’t know that Twitch didn’t default to saving past broadcasts so the first session isn’t viewable, but head over to my channel and give me a follow! I promise to save all future sessions!

Auto Fire v0.6.06: Perk-olation

It’s been a couple weeks since the last build, but a lot has happened due to things that I’ve wanted to get in for the Rogue Celebration 2019​, which I’ll talk about in another article.

For Auto Fire, RogueCel primarily meant that I had a lot I wanted to do in proving out playstyles.  This manifests in the player’s vehicle chassis selection…  It includes speed perks (passive effects triggered when driving at 60 MPH or higher), and special maneuvers (gas-consuming all-in-one moves that launch the vehicle to a new location and affects everything around it.

As always you can check out the state of development for free on Itch!

Explode-o-Ram Speed Perk

General Improvements

  • Cached Line of Sight: I used to do a pretty dead-simple Line of Sight test… I traced from one tile’s center to the other. Sounds simple, but there are a ton of edge cases that come about from testing that way.
    • To get it right requires a couple extra tests, primarily tracing to each far corner of the tile.
    • This allows you to see tiles that are partially obscured by walls, as well as being able to target walls themselves (such as when shooting the destructible outpost borders).
    • To reduce the load of this, I cache the results of these multiple line traces in all directions out to 15 tiles (this is tunable). That way I can look at the offset from the viewer and quickly retrieve all the tiles I need to query for blocking. Is it done in the most efficient way? Not yet, but it definitely is an improvement so far.
  • Improved item gathering: Vehicles now automatically pick up items from the ground adjacent to the vehicle, rather than requiring the radar to be used.  It feels so much better!
    • The player also automatically picks up adjacent items in the overworld!
Jet Wash Speed Perk

Gameplay Systems

  • One thing I really needed was to introduce more playstyles for players to choose from. I decided to bake in special abilities into various vehicle chassis.
    • To facilitate this, I created the ability for equipment to have passive effects when installed, and remove them when uninstalled. 
    • Effects have an ambient effect on their target, and can also trigger gameplay or visuals as a result of having triggers on its target… such as being hit, losing control, or colliding.
    • Vehicles now have two new equipment slots (which are not player-editable):  Speed Perk and Special Maneuver.  This equipment will in most cases be baked into the chassis itself when used.
    • A minimum speed can now be defined for effects, allowing for things like speed perks which trigger whenever the vehicle is traveling 60 MPH or over.
  • The stun condition keeps an AI (or player) from firing or controlling their movement until it wears off.  This means pedestrians stay in place while vehicles will continue forward at their existing speed (or until they hit something).
  • The focus condition increases the subject’s ability to hit targets and inflict crits.
  • Turret fire (the F key or the gamepad triggers) now can launch any weapon or special ability.  It also won’t attack the ground the way it used to.

Vehicle Upgrades

  • Ram Blast (Stallion):  Speed perk that triggers an explosion whenever the vehicle collides at high speed.
  • Ram Piston (Stallion):  Special maneuver that launches forward and bashes through the selected target, knocking it aside.
  • Advanced Radar (Stallion):  The Stallion has special radar that has a bigger radius than other vehicles.
  • Hyperfocus (Panther):  Speed perk that increases the hit and critical chance when at high speed.
  • Jet Thruster (Panther):  Special maneuver that launches forward and puts the car at max speed, leaving a trail of fire behind.
  • Jet Wash (Cricket):  Speed perk that stuns vehicles and foot soldiers that are passed at high speed.
  • Bootlegger (Cricket):  Special maneuver that launches forward and spins the car around, ending with a large stunning pulse.
  • Note: Special Maneuvers all consume gas!
Jet Thruster Special Maneuver

Visuals

  • Created new shader for the fog of war that scrolls and has interesting edges. 
    • This was only my second or third foray into Amplify shaders… It’s been great to be able to the work in the editor rather than have to code them, since I really did a lot of experimentation here.
    • The main goal was to create something more dynamic on edges and more particular to have fewer tiles obscured by half-opacity textures, which made things feel extra floaty and mushy on a large part of the screen.
  • Destroyed vehicles now do not fly into the air as ridiculously far.  It was fun but you often never even saw the vehicle because it flew so high.
  • Adjusted the color of the ordnance and gas can icon and model to be more prominently colored, so they are easier to spot.
  • Added glinty materials to pickups to make them catch the eye better.
    • This is mostly by cranking up the brightness of the specular in the toon shader I’m using for gameplay objects. It looks pretty nice when the objects spin.

Content

  • Adjusted the loadout of starting vehicles to match playstyles. 
  • Updated start screen to give more description of cars. 
  • Updated some tutorial text to match the new control method.
Revised fog of war using Amplify shader

Bug Fixes

  • Fixed bug with effects such as dropped items. One symptom was smoke and oil overwriting each other. This may also eliminate some of the mysterious crashes I’ve seen.
    • It turns out that in a specific case I was passing a single dictionary around for effects rather than properly instantiating it for each instance of an effect. That caused some serious weirdness, glad to have tracked that down.
  • Fixed a problem with firing while stationary, which remained in slomo during execution.
  • Changed the ragdolls for humans and dogs to move smoothly.

Audio

  • Added audio mixer slowdown when slowing down time. 
  • When destroyed vehicles are flung into the air, they now play sounds when falling to the ground.
  • Added a techy burst sound for the bootlegger.

User Interface

  • Targeting squares are more yellow now, rather than green. 
  • The (A) button prompt disappears when the player centers the gamepad stick.

Auto Fire v0.6.05: Advancing the Experience

It’s been a few weeks since the SIX update, and there’s a lot of meaty gameplay work to show off.  Ammo! Maneuvers! Slo mo visuals! Better ramming!

Slo Moooooo

  • One of the biggest issues of having a turn-based game with realtime visuals is that a lot of the time people don’t grok that the game is waiting for their next input.
    • As a way to get around this, I added a slowdown when the game is waiting for player input. 
    • As a delightful side effect, it looks pretty damn cool. 
  • Had to move a number of UI inputs to use unscaled time so it ignores slomo. I might have missed a few, so will be on the lookout.
  • Made a bunch of UI effects use unscaled time so they play at a normal rate even during slowmo.
  • Fixed camera and a bunch of other elements that slowed down inappropriately during slowmo

Special Maneuvers

  • Special maneuvers appear as “equipment” (currently occupying gadget slot 3), but are eventually going to be baked into specific vehicle chassis, which allow you to take special actions in a crisis.
    • This means that different vehicles will help with different playstyles.
  • The first special maneuver is the Ram Piston
    • This maneuver launches the car forward 2-4 tiles within a set arc and rams an enemy out of the way.
    • You can also use it to get out of a jam by launching to an empty tile.
    • It has a cooldown and also uses gas as its ammo, which you can find out in the field or purchase at a garage.

Resources as Ammo

  • Players have always been able to collect gas, ordnance and parts around the battlefield.  These items are now used as ammunition for some weapons and equipment.
    • Mines and rockets use ordnance
    • Ram piston, flamers and flaming oil takes gas.
  • Many weapons do not require ammo (just a cooldown), so ammo-consuming equipment will be stronger for its limitation.
  • When you highlight a weapon, it should explicitly say the ammo it uses, if any.
    • If you’re out of ammo, hopefully it will be very easy to see and understand.
    • There is a dry-fire sound when out of ammo. 
  • All game hints are now moved to middle-screen and important information such as being out of ammo also appears in that space as needed.
  • Now that ordnance and gas are much more needed by players, I added significantly more drops of them to the loot lists.
    • Loot dropped from cars and crates now has a new definition type, so every drop won’t have 5-6 items in them (it was just out of control)

Ramming

  • Ramming something at a high enough speed will now knock it to the side rather than stop you dead.  It’s far more fun.
  • The mass of an opponent or object now matters more. Your speed and your mass is factored against their mass.
    • NOTE:  More will happen with this in the future, since relative speed and resultant velocity aren’t all factored as they should.

Additional Targeting Changes

  • Area-effect weapons such as rockets, shotguns and flamers can now be aimed at the ground if you want to position their blast for maximum effect.
  • Some weapons and abilities now have a minimum range.
    • Rockets have a min range of 2. 
    • Multifire rockets have a min range of 3.

User Interface

  • Updated the position of resources in the HUD.
  • Revised frames in HUD to use a superthin frame.
  • Updated skid meter and needle, and repositioned turn pips.
  • Boost hint only appears when at max safe speed now.
  • Cleaned up the UI camera for inventory and garage. It’s not blurry anymore. 
  • Fixed broken portrait from game startup.

Audio

  • Revised the collision sound (hated the old one).
  • Added a new wood break and revised rock break sounds.

General

  • Edited the speed lines for movement and ram tile with a new graphic.
  • Fixed some rare crashes

Auto Fire v0.6.03: Gamepad has arrived!

Auto Fire has been going through a lot of work focusing on making the game more approachable for someone that might want to sit down and play.  This is specifically useful in preparation for the SIX show in Seattle on September 1.

In particular, I put a fair amount of work into adding Gamepad Support to the game. Yeah it’s still turn-based, but driving with the stick feels pretty good.  Here’s the quick rundown, assuming you have an Xbox-style stick:

  • Hold the Left Stick in a direction, and you’ll get a preview of the result:
    • Up/Down:  Acceleration/Deceleration
    • Up-Left/Up-Right:  Swerve Left/Right
    • Left/Right:  Turn Left/Right
    • Down-Left/Down-Right:  Hard corner Left/Right
    • Centered:  Coast (if moving) or wait.
  • The Left Trigger will commit the move and advance the turn.
    • If you hold the left trigger you can move multiple times in a row.
  • The Left Shoulder will Boost your vehicle, allowing acceleration over 40 MPH.
  • Tap the Right Stick in a direction and you will target the nearest enemy that uses that weapon.
  • The Right Trigger will fire any available weapon at the nearest target, or the targeted enemy if one is already being targeted.
  • The Directional Pad can adjust your aim target.

Additional functions:

  • The A Button will Activate an entrance.
  • The B Button will Brake.
  • The X Button activates the radar.
  • The Y Button brings up the Character screen.
  • The Right Shoulder and A/B/Y will use the appropriate Equipment slot
  • The Start button brings up the settings menu.
  • The Back button brings up the Automap.

The game is still the same at its heart, but holding a controller just immerses you just that much more, plus you’re not stretching your fingers over the keyboard.  I’d be thrilled to take any feedback you might have on it.

In addition, there should be a lot more information in the game about speed and what direction everyone is travelling in.  As is natural, a common player instinct is that if a vehicle isn’t moving onscreen (while the simulation is waiting for you to make your next move) that it is not currently moving at speed.  The wheel motion, dust from the tires and indication of speed changes should help you digest what the simulation is up to!

As always, there’s another grab bag worth of things that happened along the way:

  • The HUD adjusts the key prompts based on whether the player is using the keyboard or gamepad.
  • Radar now uses the R key (and resides in vehicle equipment slot 4).  It has a separate spot on the UI.
  • Enemies now do not shoot every possible chance they get (rather than move).  They are just as likely to try maneuvering than shooting.
  • Improved AI will not try to move directly in front of your vehicle anymore.  This was really frustrating because they’d keep forcing you to maneuver around them to keep from colliding, rather than shoot them.
  • Enemy cars are more likely to get moving rather than sit-n-spin.
  • Fixed issues with auto-targeting with specific weapon sides.
  • Adjusted some female surnames so I avoid generating women named “Scott” or “Howard”
  • Control remap interface is temporarily disabled until it can be properly revised.

I hope you can check it out!

Check it out!