Scooping the Loot

One bit of feedback I got when showing the game to a friend recently was that it was fun to drive, but picking up loot was beyond terrible.  That’s because you have to manage traction, speed and direction even when you’re just trying to hoover up whatever you found in a weapons cache you just blew up.  It’s just a whole bunch of stunt driving to scoop of some stuff that might only be worth a few bucks.

“Got it covered,” I boasted…  I’d already planned to add in a “radar pulse” that would do the triple duty of revealing hidden things on the field, “painting” targets for improved accuracy, and acquiring items in a small radius around the player’s car.  Super-convenient when you are in between fights, but when you’re in the thick of it you do have to deal with its cooldown.  There’s also the precious action that you have to use to activate it, rather than using it to shoot or turn.

Feeling smug about my clever solution, I recalled how long ago I decided on my solution.  It was………..  over a…. year ago.  For something like 15 months I’d been picking up loot in the worst way possible.  Errr… awesome.   Guess I should get that damn thing in.

It took an embarrassingly short amount of time given the sheer weight of procrastination behind it.

Deluge of Definitions

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
  • Abilities, projectiles
  • etc etc

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:

defThing chassis_stallion_L1
{
class adChassisData

prefab Vehicles/Stallion_body_L1

name "Econo Stallion"
manufacturer GrandMotors
logo UI/Logos/logo_tri
chassistype Coupe

level 1
value 2000

defense_base 0
health_base 100
handling_base 100
armor_base "100 100 100 100"
cargo_slots 2

Engine "None default engine_rank_1"
Tires "None default tires_base"
Armor "None default armor_base"
WeaponRam "None default wpn_ram_base"
WeaponFront Standard
WeaponRight Standard
WeaponBack Standard
WeaponLeft Standard
WeaponTurret None
Support1 Standard
Support2 Standard

flavor "The doors rattle a bit if you slam them, but you'll feel like a thousand bucks behind the wheel of any Stallion."
}

defThing chassis_stallion_L2
{
inherit chassis_stallion_L1

prefab Vehicles/Stallion_body_L2
name "Grand Stallion"
level 2
value 5000
cargo_slots 3

Engine "None default engine_rank_2"
Support3 Standard

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.

Auto Fire Status Update – July 2018

Over the July 4 holiday I managed to get a good, solid, 5-day weekend, which in turn gave me great blocks of time to work on Auto Fire.  It felt great to get some really nagging things out of the way.  There’s a bunch of stuff here that is new since last time I blogged about it:

  • Site System.  I created a new structure for holding what I call “sites”, which is any point of interest on the map.  This can include cities found in the overworld, highway entrances and exits, garages, and even regular landmarks and points of interest.  The sites are what I use to guide road plotting, so roads can connect exits, cities, garages and even just weird old non-functional shacks out in the desert, which I constructed from groups of tiles.  It gave me a system for sprinkling them into a map from a table, which adds more life to most maps.
  • Encounter System.  The encounter system is something that I’ve wanted to do for a while, to allow the player to deal with random stuff that they meet along the way.  Call it FTL-style, although I associate the concept with pen and paper games as well as wayyyy back to ancient games like Odyssey on the Apple II.  This allows players to consider some simple risk-reward propositions, or to choose between acts worthy of fame or notoriety.

  • Stylized Visual Effects.  I took some of the realistic visual effects for weaponry, explosions and smoke and returned them to the stylized versions I had used a year ago.  I found that these stylized VFX had extra punch and grabbed the player’s attention among a lot of noise, but more importantly, fit the oddball scale of the world in Auto Fire.  With buildings and cars and chests all coming in at unrealistic sizes when compared to each other, I found that realistic visuals just made that mismatch even more pronounced.  Somehow having unrealistic smoke and fire just helped with the suspension of disbelief, and I think it can look just as compelling.
  • Western Music.  I took a break from the (really fantastic) western/post-apocalyptic soundtrack by Michael La Manna to try something different, namely an Ennio Morricone-flavored Western soundtrack I found.  I really do love La Manna’s cool-as-ice Badlands music, but those stingers and jaw harps just got me in the feels.  I’ll be playing around with various configurations as time goes on, not sure which way to go.
  • Walled Outpost Generator.  One of the biggest things I got done over the holiday was to finally prepare enough ramshackle walls, dirt roads, windmills and metal-roofed buildings to create a special generator for badlands outposts.  This is a heightmapped terrain map that sets aside a center section as the “core”, where buildings and certain visual points of interest will lie.  Around the perimeter is a wall made of scrap, cars, wood, and anything else…  I had to make a version of my patch generator that would stretch and rotate this wall in any direction with repeating motifs.  Dirt roads are then stretched to the various sites around the map. I’m really happy with how it came out.

  • Smoother Driving Feel.  One thing I did fix in recent months came from feedback I got from right after the 7DRL that spawned Auto Fire…  For some players the movement felt stuttery and halting.  Part of that is unavoidable with a turn-based game, but some of it was fixable.  There is no longer a single-frame stop between various units executing their turn, and if the player cues up multiple moves, it executes smoothly if possible.  The movement from square to square in slightly slower than it was as well, creating an subtle improvement that I feel when running the new build versus an old one.
  • Wall Deflection.  This last one feels intangible as well, but I implemented it because the more I played, the more I felt cheated that the mechanic did not exist.  If the player is heading diagonally towards a wall at high speed, he or she can get deflected off the wall and into a new movement path parallel to the wall.  This is a fairly common occurrence in the city maps in particular, and even lets players use it to their advantage if they wanted to keep shooting rather than steer (this is an option in Auto Fire!)

Okay, so there’s a lot more work to do.  I feel that I’ve hit some fine polish points, but I mainly need to assemble content together into something more playable, to have more of a reason and tension in the overworld.  All that will hopefully come next.

The Road to Brass Tactics

I’ve been quiet since the holidays, but it certainly isn’t for lack of activity.  For my day job, February marked the release of Brass Tactics, a real time strategy game reinvented for VR headsets.  The creation of Brass was really a fascinating adventure, one of the most interesting and invigorating creative challenges I’ve had in a lot of years.

Oculus gave us pretty much carte blanche to recreate a real-time strategy game that took advantage of the Rift platform as well as the Touch controllers.  This allowed us to kick off the process with a delightful freedom on how to make the controls of an RTS feel tactile and engaging.  We started with crazy-woop-woop-nuts ideas, but honed the game down to something that felt familiar yet fresh.

I’ve written a couple of blogs about this process on the Hidden Path website:  The first blog post talks about our discovery of how we wanted to represent the world and how the player might interact with it.  We started from a very wide set of possibilities that explored how to show the most information to the player with the most comfort.  What we ended up with was quite clean, and felt comfortable for most people.  Here’s the first ugly prototype reel.

The second blog was about how the player interacts with their troops, both selecting them and issuing orders.  This seems simple but we went through a long process to figure it out.  What we ended up with feels familiar, like using a mouse, but definitely embraces the physical nature of Touch.  Directing your troops becomes like being a symphony director calling out orders fluidly, a dance that makes war happen.  It was an achievement that we’re very proud of.  Even more ugly here!

I still have one more prototype video that I need to accompany with a blog post.  Luckily the pressure’s been off lately so I’ve been able to get back to working on Auto Fire.  I’ll try to update y’all with where that’s been going shortly.

Holiday Talisman – Now with Pay 2 Win

We have a New Year’s tradition among some local friends of playing the Talisman board game.  This is no casual gathering, but an all-out annual quest for questing…  with nearly every expansion the game becomes a behemoth that barely fits on the dining room table.  The Monopoly-like board of the base set is extended in every direction with dungeons and towns.  Tiny little special encounter and item decks are stacked everywhere…  The main adventure deck, swole with expansion cards, is so massive that we break it into three piles so it won’t topple over.  

There’s a delightful insanity to Talisman’s hodge-podge of fantasy themes, like Tolkien and Gygax thew up in a Milton-Bradley factory.  Werewolves.  Faeries.  Dragons with swords for scales.  It’s also completely unbalanced and random as hell.  Did I say it’s the best game?  It’s also the worst game!  Every roll of a six-sider or draw of a card could result in a game-winning boon or a soul-crushing return to square one.  And the behemoth keeps growing…  people keep buying new expansions, so by now a game takes at least six hours…  Hence the once a year tradition.

Jim, the owner of this pile of cardstock insanity, was looking for ways to make these evenings of hilarity even more memorable.  How could we make Talisman even worse?  The answer was clear:  Pay to Win

Pay to reroll a die!  Pay to stop on a square!  Escape a dungeon!  Cheat death!  We embraced the pain and proceeded on our long evening of questing.

The game was just as random as ever.  People would gather massive arsenals of equipment, just to be turned into a toad and drop it all on the ground.  Talismans (Talismen?) were gained both through mighty deeds and by randomly tripping over one.  The dragon fight at the end to gain the Crown of Command was the usual madness, and as usual an unbeatable card combination helped seize the day.

I gotta admit though, all these little one-dollar kicks to the privates actually made Talisman a bit better.  We could fix our random failings.  Sure, sometimes we put a couple bucks in and got a worse result, but that was part of risk-reward.  Around 2AM we staggered home, some 30 bucks filling the money jar, paying forward into the next game night.   However, I’m not sure how we can top this next year:  Loot boxes?

Climbing Back into Productivity

It’s been a crazy autumn.  My work life has been crazy in the march to polish Brass Tactics for its February 22nd release date on Oculus Rift…  The game was supposed to come out in October (and we were ready to go) but Oculus wanted to pay us to add some more pizzazz and customization features…  Who were we to say no to that?  As a result, we have more levels, a big helping of new units, customizable loadouts and unit colors, and the game is looking a fair amount better because we were able to refine our UI, lighting and materials.  Pretty cool, but things have been a bit nutty.

Among all this, my wife and I headed off around Halloween to Australia and New Zealand for our 20th wedding anniversary, which was a blast.  A couple weeks later things got weirder, however, as we hosted some friends for Thanksgiving dinner…

For some of the meal prep I was using a brand new mandolin slicer on some potatoes for a delicious potato dish.  And those things are really sharp…  As in, I sliced off two of my fingertips.  Doh.

I guess it takes about 7 weeks to grow fingertips back…  The human body is pretty amazing.  (Or maybe I’m part lizard.) In the meantime, typing is kind of a pain in the butt…  which is irritating because the 11-day holiday break is always the absolute best time to get coding done.  I hope to be back in the swing of things (with still bandaged fingers) a little after New Years.  Dammit.

Filling in the Desert

It’s funny how I spent all this time to create a prop distribution system, created tiles and various features to randomize and space out various tiles but never have the time to really find good models to populate the map with…   so sometimes I play on a fairly empty map.

I spent the morning digging up some reasonably non-terrible assets to build tiles out of, and the results are luckily pretty good:

The problem is that whenever I’m doing visual stuff I’m both happy because things look better, but I feel guilty that I’m not working on function…  Back to work!

Fog of Overworld

Auto Fire is continuing to look better these days.   I got rid of the object-based fogging and returned to the old-school concept of putting a 2D plane between the camera and the world.  You’d think it would look obvious but with a little fancy math I can scale and position the plane so that users are (more or less) none the wiser.  I was able to add some perlin noise and give the fog two colors (defined per map) that makes everything smoother and more pro.

I put more effort into the overworld as you can see above.  Those roads are generated now, as well, followed by a smoothing step that places the correct road tiles in the correct locations. There are still a few specific intersections that I neglected to create tiles for (mostly diagonals to other diagonals) but the overworld is now guaranteed passable and locations have roads between them.   The roads make the overworld far more simple to navigate and find out-of-the-way locations.

I still have to finish off some of the world connections and then optimize the hell out of the world generation (currently coming in at 15 seconds) but it should be pretty quick and easy to trim all the low-hanging fruit (I don’t cache the passibility of each tile yet when calculating paths for example).  Always more to do…