I was just thinking about the challenges of generating a city map for Auto Fire and realized that I’ve accomplished a whole lot and haven’t really discussed it in a long while.
Really early on in development I created some tools to generate block templates that get placed during map generation. This allows me to work with actual crafted sections of map (with variant buildings and other things that can be adjusted after the template is laid down). It’s more or less a requirement for cities since the classic “cave-style” procgen or even dungeon layout techniques don’t work as well as I’d like.
I create template patch objects that have a bunch of data attached to them such as exit points (for cities) as well as a variety of variable bits like spots for random decor and building styles (depending on the generation profile I’m using).
The block data that I save out actually even supports 9-slice scaling, so I can declare borders to be of a fixed size, but the center to be a repeating tile section that can be any size. It’s really useful in some situations like when I want a long crafted section of wall, or a large 4-lane boulevard on a city map.
For cities, however, I actually work mostly in blocks that are 4×4 in size, with street connectors that are 1, 2 or 4-lanes in size. If I want to make a larger block such as 4×8 or 12×16 I can do that as well. Getting the whole system to rotate blocks properly was probably the hardest part (you can see in the build right now that I have a few multi-tile objects that don’t yet collide properly… my work is never done).
I’ve got several workspace maps that I use to create these blocks of content (desert outpost, city, overworld, etc), and it’s a scalable system that could support a whole ton of layouts. When I say “damn I gotta work on content”, making 10x the tile variations and cities with specific flavors are ways that I could take advantage of the systems I’ve created.
Anyway, this approach isn’t particularly new but it works great for my needs… It deserves a more crunchy article dedicated to it, but it’ll have to go on the to-do list for sometime in the future. For now, hope the peek at the approach was a little interesting.
This past weekend I attended the Roguelike Celebration, which I had heard was more of a fan gathering as compared to the developer-focused IRDC… Still, it’s a pretty cheap flight down to SF so I decided to attend based on the recommendation of friends. We thought it would be a good place to show off Auto Fire and gather good feedback from people that are dedicated to the genre.
What I wasn’t prepared for was that it was the single best developer’s conference I’ve ever attended, whether that was the focus or not. Informative, entertaining, comfortable, stylish, professional… It was filled with some legendary creators and you’d be hard pressed to find even a shred of ego anywhere. Nothing but mutual respect and support, wall to wall.
These people were accessible and open. They were humble and eager to learn themselves. They shared openly. Everyone was positive, whether we were discussing a text-based passion project with the classic @ for the player, or a high-falutin’ mass-market-friendly game using roguelike principles. (Which is good, because I’m aiming slightly for the latter, although I want to stop short of making a “Roguelite”).
There was talk after talk after talk, and most of the presentations were pretty relevant to general game creation beyond Roguelikes. In particular, Roguelike developers are intensely focused on two things…
The first is (of course) procedural generation. This includes not just map generation, but encounter/trap creation, procedural storytelling, god/pantheon/myth/food/whatever generation, and so on. What started as a passion for building noodly dungeon spaces has turned into a community dedicated to crafting entire universes through intensely clever processes.
The second is creating a flexible game architecture that allows for nearly infinite rule expansion. A trademark of Roguelikes is that the creators just add on feature after feature for years and years, which lead to so many interconnected systems that have to elegantly support (for example) the player getting polymorphed into some new form that has extra arms, which allows you to wield more weapons, or being able to animate any world object including bookcases and walls, then charming them to becoming your faithful pets.
The approach for solving this issue mostly shakes out to a couple core philosophies, but the humility, willingness to learn, and eagerness to share was pretty amazing from these creators… young or old, aspiring or legendary.
At the end of the first day, they set us up in GitHub’s phenomenal common area with drinks and food and let whomever set up whatever they were working on and showing it off. I had a potato-level laptop that barely ran Auto Fire at 2 FPS, but a fantastic soul named Jaxon (whose last name I unfortunately never discovered) was amazingly cool enough to let me use his super-baller laptop for the night. Jim spectacularly scrounged up a giant TV and we were able to show it at around 100 fps x 55 inches.
It was a blast and tremendously inspiring to he feedback was awesome. I got some really good comments on the game and came back with a big list of what sorts of things I wanted to take care of.
I am working on the skid model most of all. I just showed it at the Roguelike Celebration conference and got a lot of good feedback. I want players to be keenly aware of how close they are to skidding out, and to be able to better influence their skids once the tires break loose. I think a combination of feedback and control tweaks will help that.
I am eager to push into more content so that I get more of a game loop, but UI and feedback will be visited up front. I want to get another update out before I head to Wisconsin next week.
Over the past several months I’ve been working through some significant issues to get Auto Fire up to snuff… Good ol’ Jim talked me into going to the Roguelike Celebration 2018 in San Francisco this weekend so I could start showing my game to people more widely. Pretty exciting! Also pretty nerve-wracking given all the other stuff going on this summer.
Unfortunately there were a ton of things about my game that still drove me crazy… For example I wasn’t able to save the state of maps between visits… which meant that the overworld in particular would regenerate every time you left a location. I had to finally take the plunge and deal with that particular issue.
Man I hate two-years-ago me. I did some real hack jobs to get that 7DRL challenge done, and I guess I wasn’t done paying off that technical debt. 😛
Luckily I got all the proper stuff to function, save off map states and basically am ready for honest-to-god savegames (although I don’t do save/load just yet.) I’ve also made a whole bunch of quality-of-life improvements based on early player feedback:
The camera is now behind the vehicle at all times. This way the WASD weapon keys are always consistent and understandable, and you don’t have to envision tank controls. I had always suspected this would be a problem, but I think I was so used to camera-always-north that I didn’t have any trouble playing. The added benefit is that the game has a fairly unique look as compared to other Roguelikes now.
Improved feedback for speed. This is always a work in progress. The player needs to know when they are speeding or skidding. Putting the camera at a shallow angle and adding speed lines is my current strategy. I also shake the camera a bit, but that may just be too much. We will see where things go as feedback comes in.
Recolored environment. A good friend did a paintover of a screenshot of my city environment a while back and it helped me gravitate towards dark ground surfaces, light obstructions, and bright colored gameplay elements. This wasn’t the case with deserts (because, y’know, desert), but I’ve been darkening things quite a bit and trying to get the colors to pop. Still a work in progress.
Revised balance and loot drops. This isn’t really finely balanced, but I did make the early-play experience quite a bit easier so that people that wanted to try out the build could get a good idea of what the game was about quickly. I also brought down the size of the average “loot pinata” that existed when I was testing loot out. I really still need to do a huge push towards making content, maybe after the RogueCel.
Revised location names. More on that next article!
New garages in the overworld and desert outposts. I’m trying to make sure that the player has plenty of places to equip all the weapons and vehicle components I’m dropping. That includes in hostile areas. That will be a balancing act in the future.
UI improvements. Again from feedback, I flash the weapon when you try to use it but can’t, and flash the grip meter if you are skidding and try to accelerate.
Music and sound improvements. I got some new weapon sounds and hooked them up. The quality is steadily improving there. On the music front, I went back to Michael La Manna‘s excellent western apocalypse music… The quality is really high and fits the feel of the game really well.
My next step is to get the game out onto itch.io so that more people can play. That will be sooner than you think!
Some days you take pleasure in the smallest of victories.
More and more of my time is spent messing with data rather than code. A procedurally-generated game like Auto Fire has a lot of data to shuffle around, defining a nearly endless list of things. These titles generally rely on complex rules to assemble what might be one-off creations in other games. These rules are for things as varied as:
Map sectors, layout generation data, name generation data
Map Locations, loot tables, shops
Tiles, obstacles, decals
Enemies, squads, encounters
Cars, chassis types
Tires, engines, armor upgrades
Weapons, equipment, ram plates
Luckily I was able to use a bit of code given me by a good friend as a framework for defining these. Since I hooked the system in, the definitions have spread across 15 directories and 70 files, and that’s with not a lot of content defined as of yet. By comparison, Dungeonmans has nearly 600 data files just for content definitions (nothing to do with actual art or audio content), plus god knows how many other little files squirreled away.
Creating the content itself is daunting, but nearly as tough is managing all this. It can be hard to organize and keep straight. A small victory this morning was when I improved comment support in my definitions, but more importantly I added inheritance. This allows me to define a base definition and then overlay changes with another definition. It cuts down on a lot of extra text and correction as I add new features to the game, and makes creating a whole line of related objects a quadrillion times easier.
For example, a vehicle’s chassis defines a lot of the weapons and equipment you can mount on it, as well as the model that is used for your vehicle on the battlefield. You will ultimately be able to buy a new vehicle at a car dealer, and pick out the chassis that will serve your needs the best.
The Stallion is a line of muscle cars, each of which is beefier and sports a larger engine than the last. With inheritance I can create a set of upgrades much more easily:
name "Econo Stallion"
armor_base "100 100 100 100"
Engine "None default engine_rank_1"
Tires "None default tires_base"
Armor "None default armor_base"
WeaponRam "None default wpn_ram_base"
flavor "The doors rattle a bit if you slam them, but you'll feel like a thousand bucks behind the wheel of any Stallion."
name "Grand Stallion"
Engine "None default engine_rank_2"
flavor "Listen to the throaty purr of the Thundercat engine. Revel at the enhanced electronics package, and even stash more cargo! Welcome to the Grand Stallion."
It only took like 20 minutes to implement, I can’t believe I put it off so long. I guess my data was so in flux that I haven’t been creating a lot of content, just a lot of systems… Now I gotta go clean up my data.
The Seattle summer has finally gotten into full swing and it’s harder to stay inside, but in spite of this I’ve pulled together some time to work on Auto Fire’s core player systems… and this involved a lot of time with Photoshop and Word as well as with Unity and Visual Studio.
As a rule, I design in a a very top-down way… Visuals, mockups, and models are very important for me to get my head around the design as well as to communicate it to others for feedback. My objective with Auto Fire was to keep the spirit of the deep car customization from games like Car Wars, but to streamline it for a smoother play experience.
I was a huge fan of Car Wars back in the eight-e’s, but building a car for the game involved a wholllllle lot of pencil lead and eraser nubs…. like, blackened rubber crumbs all over the damn place. Players had to choose their body style, chassis, engine, tires, armor, weapons and equipment, all while balancing out limited space, weight and engine power to push everything forward. It was great, but it was a solid half-hour (more or less depending on your experience) to make a good build… If it helps you get a feel, think of the time investment of rolling up a new pen-and-paper character or, say, building a new Magic deck.
Incorporating mechanics for hardcore things like weight and spaces wasn’t impossible to pull off, but things like switching out weapons or changing gear can feel like something of a chore… I felt I could do better. For years and years now I toyed with the idea of applying a Diablo-style inventory grid, perhaps combined with the damage grid system from a number of FASA titles (I personally was a fan of the Renegade Legion series). The idea had some promise, in that players had to find space on their vehicle for various weapons, and make tradeoffs to clear space for special equipment, huge engines, or cargo. In addition, damage could be allocated square by square, penetrating into the car and damaging components as it reached them.
Being a top-down designer, my preferred way to hash out problems like this is to mock up the interface, move parts around, and visualize how it will feel for the player. As I played with the parts I started to realize that applying “damage templates”, is really a kind of magic made for pencils and templates and the tension of rolling locations and hoping the template doesn’t include your driver or engine. In a digital product where you don’t color in the squares yourself, it threatens to descend a bit into indecipherable noise. In addition, when rearranging a car into different configurations, the spatial rules of vehicles started to clash with the system… often the only extra room for a driver or engine was in the back corner or something. It just didn’t feel like a vehicle the way I wanted. Finally, I really wanted to incentivize the player to socket in new equipment as it is encountered, acquire new cars and choose various ones to meet the specialties for specific missions. Ideally buying a new car gets you more than just a new set of numerical stats and grid layout. “Vehicle loadout Tetris” still fascinates me and I’d love to try a PnP version of it or implement it into a arena-based game, but I’m steering away from it for this particular project. (See what I did there, wakka wakka).
Sooooooo in the end I went back to something a little more akin to decking out gear in an RPG, but there are some nuances that I believe will feel fresh when applied to vehicle loadouts. When decking out a vehicle, the starting point is always the Chassis. This is the body that everything else is built upon… The player can acquire them at car dealerships, receive them as mission bounty, or salvage them in the wilds as loot. Each chassis has some base stats that any equipment will modify, such as handling, armor, and fuel capacity. It also has some built-in equipment as well as slots that can be customized… Each vehicle body ultimately sports a fairly unique configuration.
Some chassis can sport large engines, but have limited handling. Some can hold huge amounts of armor, but can only mount a large tank weapon in the front. Some might have a turret mount, but the armor cannot be upgraded. Some have a slower engine that cannot be replaced, but can haul an amazing amount of cargo.
Chassis and equipment can be found with mods that add additional bonuses and abilities that make finding loot interesting. Weapons can be placed on any side of most vehicles, but heavy weapons need special mounts to be used, and turret slots are fairly rare. Ram Plates can have explosive charges or sharpened edges for added effects. Engines define a vehicle’s top speed, but it can also have acceleration benefits or a larger fuel capacity. Tires can improve handling, but they can also resist damage from spikes or add to stealth properties. An Armor Frame can boost a car’s armor, make it fireproof or laser-reflective, or even add mounted blades to slash on-foot enemies when driving adjacent to them.
Cargo Capacity is one of the most important reasons for players to change up their rides, as each chassis has a different number of cargo slots. Most found equipment can be picked up without concern for weight or space (again, I didn’t want being out in the waste recovering gear to be a hassle), but cargo slots are used to hold major items for courier jobs like scientific gear, or priceless art, or passengers. Rather than always running at capacity, however, a smart Driver may leave an extra space available in their vehicle during a run. This way they are prepared in case they run into special salvage out in the wilds, or a civilian who needs transport to safety… for a hefty price, of course. And if you find a crate of priceless military tech as you pick your way through a wrecked convoy and have no room…? Well, you can always kick that sorry bastard to the side of the road to make space.
So all of this has to come together into a playable whole, of course. I’ve got a lot of the core systems and definitions together for dozens of pieces of gear, but the next step is to implement the garage interface where players can buy and sell equipment as well as reconfigure their loadouts. And there’s much more to do to make sure that decking out your car is as interesting as it possibly can be. It’ll be an interesting summer.
In case you’re new to Auto Fire, here’s an overview. If you are familiar with it, here’s a hint of what’s been happening over the past few months…
Auto Fire is a turn-based roguelike auto combat RPG set in the roads and cities of the shattered American west. Enhance your vehicle, take on missions and build your name in a world where the only way to thrive is to drive.
Auto Fire is a deep, randomly-generated experience that combines the free-roaming adventure of games like Autoduel and FTL with the turn-based precision driving of games like Roadwar 2000 and the original Car Wars tabletop game.
An important part of the game is the player’s relationship with his or her car, and the ability to mount bigger and better weapons and equipment.
I’ve been a game developer for 24 years, both as a programmer and a designer. In my past I have worked on titles like Heretic II, Jedi Outcast, X-Men Legends, and Dead Space 2 and 3. These days I do design exclusively for my day job, and I miss programming. I was also a big fan of the tabletop vehicle combat games of the 1980’s and want to create something worthy of that world.
I use Unity 5.6, Visual Studio, Adobe Photoshop. Blender and Perforce when I get desperate.
Over the past couple of months I’ve been reworking the weapons systems to allow for special attacks over time such as machinegun bursts and oil slicks. An equipment system is in place that allows for secondary abilities to be mounted on the car such as radar sweeps and targeting computers. These systems are coming on line as well as a new inventory system.
A city map can now generate complex environments with special boss arenas and repair stations. The starting enclave has now been enhanced with new assets. New music, vehicles and effects have worked their way into the build as well.
In the past few days I’ve managed to add a whole bunch of loops to the city generation. This was achieved by adding optional exits to the blocks that I lay down… These are invisible overlays that, if a road tries to enter a block that doesn’t have an entrance on that side, can be stamped down over the existing block to let it link back. It helps a lot with the four-lane highways in particular, which would act like a barrier that didn’t integrate into the rest of the street maze if I didn’t allow it to reconnect.
More loops are important because driving and having to turn around is fairly bad… the fewer dead ends the better.
Once the map is complete, I put down more obstacles and overgrowth. Then finally I take some Perlin noise to the map and add destroyed swaths, both rubble and driveable stuff, just to add interest.
I think I can move beyond generation for the time being. Now it’s time to get fog of war back in so that the map feels more mysterious and ready to explore. Then I’ll lay out a boss battle fortress… woo!
I managed to carve a good chunk of time working on city generation over the 4-day Thanksgiving, but I wish I were done. My core accomplishments was in creating single-wide alleys, more crafted patches for both 2-lane and alley roads, and most importantly: Allowing patches to be rotated when placed.
This allows me to create more variety, not just because things look different when rotated, but also because I can spend my time on crafting unique areas without having the create four direction rotations of them. It’s getting there…
The biggest problems beyond variety is playability. The most interesting maps should have some interesting tactical spaces, and more importantly enough loops that give the players a better sense of exploration as well as not punishing them as much for getting some speed going (which dead ends can completely wreck). Typical Roguelikes (Dungeonmans included) introduce at least a few loops so that exploring the map doesn’t force endless backtracking.
A whole bunch more work is needed, including:
Make additional large patches with interesting tactical features such as open areas, wide runways and so on. This will help keep the game from just being a bunch of corridors.
Create an evenlarger 4-lane road type and seed the map with a couple of large roads. This should present some neat places to build up some speed.
Checking patches before they are laid down to make sure that they are not blocking off an adjacent road (this leads to a series of roads that lead to nowhere).
When the map has been expanded as far as it can be (usually a set value, such as 1000 attempts at placing a patch), make sure that all the “unexplored” road tiles are capped with dead ends or are connected up to their neighbors. (Again, this avoids road connections that terminate abruptly.
Add some “overlay” rules and tagging that allows for “optional” entrances into a block. This way if I try to lay down a block next to another block, I can more easily “bust a hole” between the blocks as needed. This will be huge for generating loops.
Create a few rules to evaluate a “good” map, including if there is enough space to explore and that there are areas suitably deep in the city where boss areas can be placed… and if those criteria are not met, throw the whole map out and start over.
I basically need to take this as far as needed until it’s fun, and then step away from it and worry about making it perfect later. Something like this could take all of my time for many months if I let it. Over time I’ll try to add new models, streetlights, textures, buildings and so on, but I need to work towards something I can play again.
Once the map generates well (hopefully in another week), I’ll need to properly populate it with encounters, and create a boss area fairly far from the entrance that players need to play towards. Once I’ve got that I’ll be back to having a game loop and can push to sharing a build out. That’s something I really want to get done before the holidays.