Musings upon turning 38. AI, Technological Advancement, And What I’ve Learned In My Career So Far.

I’m turning 38 today, which somehow seems both old and young to me.  How can I only be 38?  I feel much older.  And on the other hand… I still feel like a little kid, and wonder about all these white hairs.

Why I Stopped Writing These Types Of Journals

There’s a lot of personal navel-gazing I could do, but then this would get even longer-winded than I typically am.  But I do notice that I really have not been doing any personal blogging in the last decade or so.  When I was new in my career as a game developer, I felt like I had lots to say, but did all that suddenly stop?

Partly I got busy.  Partly I was very stressed out and very unhappy for a lot of those years.  Some of that was related to work, some of that was being in an unhappy marriage but being unwilling to admit it.  Some of it was… no longer feeling like the answers to things are quite so obvious.  Or at least not easy to explain.

My Older Journal-Style Writings

My original writings on the nature of a superior AI got slashdotted, made the front page of reddit, were top on hacker news, and so on back in 2009.  I was really proud of that.  People read my work, felt like they understood what I was saying even if they don’t work in the field, and came away feeling satisfied and edified.

The problem is, a lot of it was pretty incorrect.  There WERE novel things in there, don’t get me wrong.  But the actual alchemy of what made the AI in the original AI War: Fleet Command really good was not something I myself had a good bead on.  You’d think I would have understood it, but I did not.

Where I Got Things Right

It’s true that I took a novel approach with the AI, and it’s true that it was highly performant code and gave really good results.  And a lot of the design maxims that I came up with are ones I still use:

  • Don’t try to pick truly optimal solutions or things become predictable.
  • Design your gameplay so that it is AI-friendly in the first place.
  • Have a lot of verbs for AIs to choose from.
  • Have a lot of agents so that players can’t follow exactly what the “group” is doing as a whole.

But none of these were at the heart of what I described in 2009, and in fact I was overly focused on my particular methodology.

A Hybrid Approach Surpassed The Original

Throughout the 2010 to 2014 period, Keith LaMothe actually methodically went through the original AI War and upgraded large portions of the AI code to be more “traditional” (aka more loosely based on decision trees and similar rather than flocking), and his results, when blended with mine, yielded a superior result.  When you think about it, that makes sense: blending two very different techniques should give more variability and more interesting results.

But Architectural Adjustments Surpass That

Then in 2015, I came up with a radical new approach for how the AIs should think in Stars Beyond Reach.  That was a game that was never released, but is a lot like Civilization in how it works at a basic level.  Essentially each AI would be simple, and would run in a background thread.  It would make whatever decisions it could, blind to all the other AIs, and they would all turn their results in at once.

I got the idea from bluffing/trick taking card games, of which I am fond.  In those games, I and my family are all sitting around a table, wondering what each of the rest of us are going to do, and we all put down a card that nobody else can see.  When everyone is ready, we turn over our cards and find out all together who read the table and their hands and the other players the best.

It turns out when you have AIs do the same thing, they’re able to run really quickly, and come up with results that are quite good.  When there are problems, like two units trying to move into the same space (which would be invalid), then solve who wins with a coin toss.

The end result was that we were able to run something like 14 AIs in parallel, and have the between-turn timings complete in part of one second where Civilization would groan and stutter over several seconds.  We also were doing less work than Civilization with our simulation, but the savings would have remained if we had continued to build it out.  The approach is just fundamentally better, given modern hardware.

It’s worth noting that, beyond that original idea, I did none of the coding on that.

Back To AI War, Via AI War 2

When we decided to embark on AI War 2 in 2016, we ported over the new AI handling from Stars Beyond Reach.  The old approach of AI in general from AI War Classic was out, and Keith largely built a completely new AI approach that was more traditional and didn’t have any real flocking going on.

Okay, there were a FEW flocking things, but those were largely for the individual ship combat in battles.  Not large strategic decisions.  And the result?  On par with AI War Classic, at least.

Then AI War 2 Evolved

Then Badger game along, and blew both Keith and I out of the water over the course of a couple of years.  Realizing that he had a LOT of time on the CPU with which to do calculations, and that he could store all sorts of working data about sub-groups and similar (fire teams, for example), he coded it to work based on… what I would describe as fairly traditional methods.

Seeing these things be so successful takes a lot of my notions about AI and kind of throws them out the window.  Badger’s code is great, and his strategies for the AI are clever, and in my opinion there is not a better AI opponent out there than what AI War 2 currently offers with its various NPC factions.

But here’s the thing: the actual code itself doesn’t look like something an alien wrote, or some inscrutable neural network that we can’t comprehend.  It looks like very well-organized AI code that you can find in most any game.  This is not a grand reinvention of AI as a concept, in other words.  If anything, compared to my supposed “grand reinvention” in 2009, this is a regression.  But it’s indisputably better.  So what gives?

It All Comes Down To Architecture

This is going to sound like I’m patting myself on the back and taking credit away from Badger, so I think it’s worth noting that I didn’t code any of the actual AI in AI War 2.  Or at least very little of it.  My brain doesn’t easily follow the sort of design patterns that Badger wrote, and I don’t tend to think of AI in the style that he implemented it.  So I’m not sure that I could have pulled off what he and Keith accomplished in the actual AI code.  That’s worth stating up front.

I might be able to now, with their example code already sitting there right in front of me.  But coming up with it out of whole cloth?  I’m not so sure.

It’s also worth noting that now we have NR SirLimbo coming in and making very complicated mods with notable AI, and he’s leaning on a lot of what Badger and Keith created, but also doing brand-new things all of his own. 

It’s ALSO worth noting that StarKelp, who is relatively novice as a programmer in general, came in and made a really fun and convincing faction — Civilian Industries — based around fairly simple rules and just all-around solid design.  He used the tools that were there, did not invent anything remotely new from a technical standpoint, but made one of the most fun factions by just thinking about how he wanted it to work.

So… what the heck?  Why is this sort of thing possible?

Four words: having time to think.

By which I mean both the developers/modders, sure, but mainly the AIs themselves.

Technical Revolutions In General

It feels like computing has not really been all that exciting in the last decade, at least not compared to the decade before it.  And certainly not the decade before that.  But I would argue that the advances in computing in the past decade are just as significant, but widely underappreciated and sometimes underused.

Let’s talk about the original DOOM as an example.  That was a first person shooter that was drawn entirely in software.  There was no dedicated GPU.  So all of the calculations for how to draw these polygons on the screen had to take up CPU time, and had to be run FAST.  So there was only but so much complexity that approach could ever render in an environment.

As we moved into the era of discrete GPUs, a whole array of new things became possible.  And it was very noticeable, because graphics are the easiest thing to see (obviously).  As the shader pipeline became a thing in the 2000s, suddenly we could spin off all these little mini-programs to hundreds or thousands of cores on a GPU, each one saying “take this vertex data and draw it like this.”  Later, the programs (shaders) got vastly more sophisticated, and a new era of Physically Based Rendering (PBR) was born.

So now there’s all this incredible art in tons of 3D games, and it can look pretty close to photo-real, or it can look intentionally anime-like.  You can learn how to make basic shaders on your own, and you can beat the absolute pants of of the best graphic artists from 20 years ago.  The old team working on the original Unreal has nothing on the water physics coded by random students and hobbyists around the world today.  But… that’s not remotely taking anything away from the graphic artists 20 years ago (or it shouldn’t be).

The bottom line is that now when someone goes to make a game, any game, they’re standing on the shoulders of decades of work of technical artists and technical art programmers and chip designers and more in order to do even the most basic things.  So we have all that architecture to our advantage, all of us, and there’s a whole heck of a lot of things we just don’t have to think about anymore.  They “just work,” and so we can think about the actual content.  Sound slightly familiar to something I described with AI War 2?

The Multi-Core Revolution

I follow computing closely.  I like knowing how things work, I like building computers, I like seeing all the different layers of compiled code.  Yet somehow I completely missed just how significant the multi-core revolution was.  I stumbled into it over the past few years, and really only in the last year has it dawned on me just how critical it has been.

Here’s the thing: when you’ve got a CPU that can think about a lot of complex things, and where “a lot” of data in the form of several MB of information is trivial in the scope of RAM… you’re in a whole new world.  Calculations for AIs can run on something approaching human-level timescales, and algorithms can come to better decisions than humans would.

One area of the game that I did work on is targeting logic.  A volunteer/modder, WeaponMaster, also contributed heavily to this area.  This was one of the heaviest part of the original AI War simulation, but I chose to break this out into its own background thread.  More specifically, I chose to have it NOT be part of the simulation at all.  Rather, it does its thinking, and later communicates its results back to the simulation to be integrated at the simulation’s convenience.

This means that instead of having 1-5 milliseconds to do the complex targeting for all the ships in a giant battle, we have… you know, whatever, I guess.  Take a few seconds if you really need it.  Maybe hand the data back to us in batches every few dozen milliseconds?

The absolute insanity of the freedom that gives us is something I can’t understate.  We’re talking about two or three or even four magnitudes of extra time to think about things if we need it.  As a result?  The ship AIs are able to make EXTREMELY good decisions in the heat of battle.  Better than any human.  You think you can micro better than the ships in AI War 2?  Please.  Unless we have a particular oversight in our algorithm somewhere, the machine figured out a better solution in roughly the time it took you to understand the basics of what you’re even looking at.

There will always be edge cases, places where humans can come in and make a better choice by hand, and I actually really like that.  But there’s definitely not a Starcraft-like urgency for you to give every order to all your moron units, because your units are instead largely as smart as you insofar as the limited scope of what they do.  So if you’re super-fast at clicking… well, there’s just not that many corrections for you to make.  If there are that many corrections, you’re better off giving us a suggestion (or looking at the open source code yourself) and we’ll just make the algorithm better again.

None of this was possible in the original AI War, and it isn’t possible in most games in general.  You can’t take that much complex data (positions, bonuses, priorities, ranges, multiple weapon systems, etc) all into one algorithm and spit out a good result in a reasonable amount of time.  So we changed the definition of what “reasonable” means.  And that was made possible by having strong multi-core machines basically be ubiquitous.

The same is true for all of the fire team logic and similar that Badger wrote, or even the simpler logic for StarKelp’s civilian industries.  In any other game I’ve ever worked on, Stars Beyond Reach aside, we would always have been thinking “do we have enough CPU time available for this?”  And if we had a novice programmer joining us, and they made some slightly less optimal choices, we would have been royally annoyed because it was making things worse for everyone.

Oh, hey.  That’s not a thing anymore, either.  If a novice’s mod code runs 20% slower for some reason, mainly because they don’t have a deep multi-decade fascination with the internals of computing and the programming languages we use, then… no harm, no foul.  That’s all on its own thread, and isn’t blocking anything else, so the game is completely unaffected.

This is, frankly, revolutionary.  Most games have not caught on to this yet.  Maybe I shouldn’t mention it, and keep a completive advantage.  But how you structure your AI code, and your simulation code as a whole, is essentially as important as what the actual AI code is, these days.  This structure, and optimizing it and refining it, is where I’ve spent the vast majority of my time over the past few years.

Not All Mult-Threading Is Equal

Right now we’re still a bit in the wild west of multithreading.  It reminds me of the “Web 2.0” days of the Internet, or the pre-PBR generation of shader programming.  There are not codified best practices for games as a whole, and any libraries that are out there (and there are a lot) are usually pretty task-specific.  We have not yet reached a state of general-purpose multi-core processing for games AI and simulations in the way that we have for game physics, game audio, or game graphics.

And I’m cool with that.  What I find most interesting is that I’m not sure how much people are even paying attention to this as a goal to achieve.  It’s certainly not on the list of any engine developers, near as I can tell.  They have indeed started making strides to make a lot of things use more cores in general, but they’re still very… task-oriented.  A lot of them follow my 2009 style of thinking, with a focus on individual agents (because in the case of these systems now, that actually is much simpler to do).

What I’m not seeing is a lot of large-scale AIs or multi-thread simulations being developed where individual parts of the simulation or AI are allowed to run for seconds at a time before their data is reintegrated.  Being able to do that is like a superpower.

I Like The Wild West

When I originally started writing this post, I was going to talk about how I’m grateful for all the various wild west periods I’ve been able to participate in.  The early days of indie game development was a big one.  I was feeling a bit sad about how some of those wild wests have instead become populous and post-gold-rush settled civilizations. 

I was thinking that, eventually, there will be no more frontiers to discover, and that’s a pretty big bummer.  But rather than feeling bummed out about it, I was feeling grateful to live in the time that I do now.  I was feeling a bit bad for people 100 years from now, who will have so many things mapped out for them, and so few constraints on resources, that they won’t get to innovate in certain ways that I’ve been fortunate to be able to.

But as I started to write, and as I compared my 2009 self to my 2020 self — and in particular as I thought about computer graphics and how those have changed from 1998 to 2020 — my perspective shifted.

I can make really awesome 3D scenes, on my own, these days.  I can do character art.  I can do my own motion capture, from my own body and face, in my home, for males and females and creatures.  These technological advancements give me the tools I need to make really interactive and believable cutscenes, if I were so inclined (I am inclined, I just don’t have time in my schedule).  Ten years ago, the idea of any of that would have been impossible, and I don’t feel sorry for myself now that I have this new power.  If I am to work on a cutscene, now I get to focus on the actual content, and not the technology or minutia of it.

AI, sooner or later, is going to head that same direction.  Same with game simulations for games like AI War 2.  Right now I get to live on the bleeding edge and help do things that nobody else can do, like those developers for Unreal 20 years ago.  But 20 years from now, a novice just poking around at game development for fun will be able to casually craft something far more involved than anything I, Keith, or Badger ever can in this moment.

Thinking of it in those terms, I’m okay with that.  There are a ton of games that I’d like to create, but that I can’t because they’d be too expensive (and thus too risky) to make.  I really do love being able to push the limits of technology, and there will probably always be some area in which I can do that.  But that won’t always be so directly coupled to the game itself.

A game like Stardew Valley offers nothing new on the technological stage, but is a revolution in design and personality and just plain fun.  Even with all our modern tools, it still took one developer a really long time to make that game.  This was someone focused entirely on the content and the artistry, not someone bogged down in the details of how to push the bleeding edge of technology. 

In my own way, in my own areas, that’s the sort of thing I also look forward to being able to do. 2021 is going to have a lot of that, I think.  I’ll still be slaying technical demons and pushing the edge of technology in still other areas, because that’s just plain one of my interests, but I won’t HAVE to in the way I was forced to for much of the last decade.  That’s a welcome thought.

AI War 2 v2.701 Released! “Multiplayer Shared-Faction Reaches Beta”

It’s been sixty-six days since the last major release writeup, with THIRTY-FIVE releases in all, and notes starting here and ending here.

We are now in a mix of multiplayer alpha and beta!  (Depends on how you play, some methods are feature-complete and others are not.) If you want the full info on multiplayer’s current status, the place to look at that  is here.

Badger’s Retirement

Okay, this would be a really really long digression, but I hope you take a moment to click over and read about the legacy of Badger and Puffin.  Both have retired from working on the game fully (although both still hang out and occasionally poke things in), and so I’m now the sole remaining active developer on the game.

With that being said, this is “news” as of a month and a half ago (for Badger — for Puffin, it was much earlier this year), and we’ve had 28 releases since Badger retired, so I do okay on my own.  This isn’t a cause for concern, but rather a moment to take stock of their achievements and celebrate them.

It’s also worth noting that Badger is still doing some remaining work here and there on DLC2, and he’s already decided to return and is working on content for DLC3.

New Main Menu

You might have noticed the new main menu if you’ve logged into the game in the last month:

If your computer fans turn on and your FPS is only like 30, please don’t freak out.  This is actually the (by a really large margin) most intensive scene in the entire game.  I get 90fps on it and in the game on my main dev machine, and a measly 30fps on my under-min-sys-requirements mac computer, but it’s usable on both.  Even my below-specs mac is getting like 60-90 fps in-game with ship models turned off.

The main menu might seem like a strange thing to revise, but it’s the first thing that you see when you load up the game.  We wanted something that felt more epic and exciting, and that had a darker and more appropriate thematic feel for the game.  Personally, I also wanted a view from inside a spaceship looking out, since usually we only ever see spaceships from the outside during actual gameplay.

I also majorly updated the ending scenes (both win and loss), so those are more epic now.

UI Overhaul, And Usability Galore

Okay, so for one thing I did a complete visual overhaul of what buttons look like, and backgrounds on all the UI bits, and things like that.  This no longer feels vaguely website-ish.  It feels like… well, like a hardcore strategy game with a lot of space themes.

But that’s not all we did.  There are new functions for doing searches for units or planets by name on the galaxy map.  There are a ton of new galaxy map filters that show more information of various sorts.  You can easily see where threat is, or the hunter or warden, etc.  You can edit planet names, set priorities per planet like the first game (but with more options), add narrative notes to planets, and more.

You can also ping planets or locations on planets, and you can ping with multiple colors to help communicate meaning while you’re discussing on voice chat.  The notices up at the top of the screen now have backgrounds that indicate their severity/importance, and are automatically sorted by that.

There’s also a new fleet status window that Badger added despite being retired (he actually did a ton of QoL stuff in the last month, since he was actually starting to play both on his own as well as with his family and friends and thus noticing more things).  The fleet status window is particularly helpful for keeping an eye on what is going on in your empire, or in all the empires of players in multiplayer.

…but it’s been 66 days.  Come on, we’re just getting started.

AI Improvements

  • The AI Hunter has gotten more intelligent multiple times over, and fireteams in general have gotten smarter.  You have pre-retirement Badger to thank for these.
  • Deepstriking (the AI Reserves) got a number of AI updates from Badger right before he retired.
  • The way that AI Sentinels handle their reinforcement budget was completely overhauled by me, making them much more threatening and interesting.
  • The way that AIs use turrets has also been redone, so that they really don’t use remotely so many as before.  They really should be putting their resources into things that can strike you offensively, so the planets with a bunch of turrets are now far more rare.
  • Turrets have actually been rebalanced fairly substantially, largely thanks to post-retirement Puffin, who was still collecting ideas from the community and implementing them along with his own thoughts.
  • We made a number of changes to how strength values are calculated, to more accurately represent how dangerous ships actually are.  This makes it easier for you to make good decisions, but also plays directly into the intelligence of the AI and other NPC factions.
  • There were a number of cases where the AI Sentinels would hold onto threatfleet ships (which are not very smart) for too long rather than giving them over to the Hunters.  We looked at that and I decided to just brute force them into giving their ships to the Hunters if they can’t get whatever they think they are doing done in 3 minutes.
  • Thanks yet again to post-retirement Badger, various factions including the nanocaust and marauders are able to invade your galaxy in a delayed fashion, which is pretty cool.  Rather than having them there from moment one, they show up a while into the game.

More Mods!

  • Another new included-by-default mod is now in place: Civilian Industries, by StarKelp.  This is turning out to be a really popular mod, which involves a lot of defensive and economic buddies hanging around.  Strategic Sage has been doing a video series with the Civilian Industries helping him against the Scourge from DLC1.
  • NR SirLimbo has been adding a prolific number of mods, as well as several frameworks for modding.  His Extended Ship Variants (for the base game and for DLC1) have become really standard fare for a lot of players, and his Kaizer’s Marauders are a vastly more complex and dangerous interpretation of the base game Marauders.  At the moment he is working on a new and evolutionary style of Devourer, but that is currently still in earlier testing and not yet included for everyone in the main game.
  • I did an enormous overhaul of our XML Parsing capabilities, upgrading it so that the data is parsed faster, and also more correctly.  This fixed up a number of blocking issues that were preventing certain mods from being possible, and consequently we saw a huge uptick in new mods right after that.
  • Oh man, the mods from NR SirLimbo kept coming!  There’s a micro mods collection in there now, too.  He’s been absolutely prolifically busy on several fronts.  It’s hard to understate just how involved his Kaizer’s Marauders are, in particular.  And his AMU tool is there to support any modders who want to use it, making it easier to make complex mods like his.

Multiplayer Bits

  • Multiplayer itself has seen a ton of improvements at a technical level and otherwise, it probably goes without saying.  But this has been the major focus of mine during this period, despite the detour into quality of life improvements.
  • Multiplayer went through a number of changes at a technical level as I experimented with how to get the smoothest experience in terms of sync, while at the same time keeping things moving.  The end result was not what I had planned on, but is instead something that relies on data I collected in real world use cases.  It works ridiculously well.
  • The ability to swap ship lines between players was added by NR SirLimbo, which was really kind of him and saved me having to do it.  He also made that interface a bit less overwhelming in general even in single player.
  • I added in the ability to finally share control of a single faction, and that’s the mode that is just now going into beta (aka feature-completeness).  The multi-faction mode will hopefully join it in beta status in the next week or two at most.

Other Visual And QoL Improvements

  • I redid all of the visuals for area of effect attacks, most notably tesla attacks.  It looks SO much cooler now.  The old version was okay, but not nearly as varied.  And when I upgraded the lighting pipeline during the runup to DLC1 late last year, the AOE visual effects actually wound up taking a step down in visual quality.
  • I added a new Stationary Flagship Mode, which I had expected to be popular but actually was almost universally hated.  But it is still something that you can enable if it solves a gameplay problem you have.  A few people were enjoying it, so that’s a win in my book.  But it’s no longer on by default for everyone.
  • The way that galaxy map links are drawn has been updated to be a gradient of the two colors of the owners between those planets, which was a cool addition of post-retirement Badger.
  • For a long while, we’ve had some trouble with trying to use one button for toggling on or off modes like pursuit and attack move and so on, and so I split those into two functions where you can clearly tell it if you are turning them on or off.  This solves a lot of intermittent frustrations people were having.
  • Post-retirement Badger added a whole host of other quality of life improvements.
  • Post-retirement Puffin added about thirty-six new space backgrounds of various sorts, for use in-game and on the galaxy maps.  These were mostly created using the shader tool I set up a few years ago, but the results are the result of a lot of artistic work and experimentation on his part.  They really spruce up the variety in the game, and in particular make the galaxy maps look nicer.
  • I also spent a goodly while making it so that we are now able to include arbitrary sprites in text.  This involved further customizing our version of TextMeshPro, which now has a number of unique features for us.  This paired well with our overhaul of the icons for various resources, and in the future we’ll do things like embedding ship icons in tooltips.
  • The visuals for shots themselves are now a lot more appropriately-scaled for various zoom levels, so battles look nicer.
  • There are also now battle indicators on the galaxy map, making it more obvious where there are fights happening in your territory without it becoming a circus.

What’s Else Is New?

  • Astro Trains got a buff to make them more interesting.
  • Post-retirement Badger also added a variety of roguelike options for not revealing things about what the galaxy you are entering entails, which is a cool feature.
  • A bunch of performance improvements in text generation, and UI updates in general, have been made.  SirLimbo and I wound up going down a giant rabbit hole on the text generation in particular, but it makes it so that really length text narratives and dynamically-generated lists of ship tooltips no longer suck the performance out of your game.
  • Error handling is also vastly more robust in the game, and when errors happen you now get much more information about what is happening and especially if there are a bunch of silent errors hammering your log.
  • Ever thought that “snipers and drones are useless, because they just aggro entire enemy planets and get me killed?”  Well, they now have a new aggro invisibility ability, which solves that problem and lets them remain useful without being unfair or annoying.
  • For our linux players, we’ve added a variety of tools to get around the unity bug with mousewheel scroll being backwards, so that is one annoyance off the list.
  • The number of bugfixes and general balance tweaks are too staggering to recount, but it’s a lot.

More to come soon!

Multiplayer Schedule?

There are two ways of playing: a shared faction, which is now in beta and thus basically complete aside from bugfixing; and multiple faction, which still has some known issues and missing features and thus remains in alpha.

I expect to sort out the remaining known issues, while fielding ongoing bug reports, over the next 1-2 weeks at the most.  At that point, multiplayer is effectively finished aside from just giving it time to collect any more bug reports people come up with.

One thing I should point out is that this is an insanely complicated game from a technical standpoint, and so the more testers the better.  The game might be working perfectly for most people in most situations, and then you come along with your friends and run into something catastrophic and wonder how anyone could possibly play this.

Send me your bug reports, and I can generally have that stuff knocked out in a couple of days.  But without your bug reports, if other people aren’t running into it, I’ll never know it’s there.

DLC2: Zenith Onslaught

Our first non-kickstarter-related expansion comes out in early 2021.  Maybe January, or potentially February.  You can read all about it, at least in a limited preview format.  We’ve had a number of testers banging on this for months now, and the detailed unit design and art to go with it are the last pieces we’ll be putting together.

This expansion represents a large opportunity for us, since it will coincide with the game fully launching its multiplayer mode.  A lot of news outlets didn’t fully cover the original launch of AI War 2 because we released it in a crowded season and it came out with too little advance notice.  So we’re trying to turn that around with this expansion and hopefully get some more traction with a wider audience for the base game itself.

DLC3: The Neinzul Abyss

Our second piece of DLC for 2021 will hopefully come out more around the middle of the year, and you can read about that here.  It’s something that came into existence largely because Badger kept adding too many things to DLC2.  DLC2 was either going to be massively expensive, or any other DLC we ever did was going to look paltry and small by comparison.

We made the sensible decision to split these out into two products that we can thus offer at better prices — and also take extra time to do cool extra things for DLC3.  I’m looking forward to getting to fully design my first faction, versus just collaborating on factions with others or doing the art and technical support for them.

Remaining Kickstarter Stuff?

There’s a diminishing number of things.  I covered a lot of it back in update #65.  Interplanetary Weapons are something still coming for free to the base game (they were a stretch goal), and I’ll be working on those while I work on DLC3.  The backer planet naming will happen around the same time, as well as the ability to send some taunts back from the player at the AI.

We’ll probably do another batch of AI taunts as well, and the Cyber Cipher reward for mysterious messages will be something that we tackle during that DLC3 period.  Design and Name an AI is something that will be around the same time as the third DLC3, same as the Text-Based or Design-based Mercenary Stuff.  There are two lingering art-related backer rewards I still need to follow up on, but then that’s it.

What Happens After That?

That really depends.

The release of this game started out going well, and I think that the reviews that folks have been leaving for the game were a big help for folks passing by at the start.  2020 has been a rough year, though, when we really look at the data.  The company’s income has fallen to less than half of what it was in 2019, and that was already one of our lower years in terms of income.

We do have those two new DLC planned for 2021, along with the giant multiplayer updates and so on that are free, so hopefully that trend will turn around.  If you’ve been playing the game and enjoying  it, we’d greatly appreciate it if you’d drop by and leave your own thoughts, too.

If the trend doesn’t turn around?  I don’t know, exactly.  The structure of modern online stores may ultimately wind up forcing our hand.  I’d probably have to either choose between working on an entirely new project unrelated to AI War 2, or start working on a sequel instead of more expansion.  Both prospects have a lot of downsides, but they also have some substantial upsides.

Right now I don’t feel super inclined to leave the AI War franchise after all this work and developing this giant engine, so I’m more inclined to stick to something closer to home than try to reinvent the wheel.  If you look at the evolution of AI War 2 since launch, the current build you’re able to play is already practically AI War 3.  It looks better, plays better, has better AI, has more content, and is much more technically advanced.

Right now the frustration is that more or less we’re doing most of that work for free (personally I have still lost about $240k in making AI War 2, versus earning any actual money, if you look at my spent money versus earned), and it’s hard to get press attention for a “year old game.”  Since we started this project, more than half a console generation has come and gone, sheesh!  I have no shortage of ideas, but I don’t want to work for someone else and right now the open market is feeling fairly indifferent.

I have a lot of hope for 2021, though. 🙂

Please Do Report Any Issues!

If you run into any bugs, we’d definitely like to hear about those.

Thank you!

Problem With The Latest Build?

If you right-click the game in Steam and choose properties, then go to the Betas tab of the window that pops up, you’ll see a variety of options.  You can always choose most_recent_stable from that build to get what is essentially one-build-back.  Or two builds back if the last build had a known problem, etc.  Essentially it’s a way to keep yourself off the very bleeding edge of updates, if you so desire.

The Usual Reminders

Quick reminder of our new Steam Developer Page.  If you follow us there, you’ll be notified about any game releases we do.

Also: Would you mind leaving a Steam review for some/any of our games?  It doesn’t have to super detailed, but if you like a game we made and want more people to find it, that’s how you make it happen.  Reviews make a material difference, and like most indies, we could really use the support.

Enjoy!

Chris

AI War 2 v2.604 Released! “A Thousand Screaming Idiots”

It’s been six days since the last major release writeup, with four releases in all, and notes starting here and ending here.

We are in multiplayer alpha!  If you want the full info on multiplayer’s current status, the place to look at that from now on is here.  We’ve had the first victory over the AI in multiplayer happen, and we’re knocking down MP bugs steadily.

AI Improvements And Additions

Okay, this is a really big release, actually.  Far more than we had intended to do, but so it goes.

First off, the star of the show is definitely the new “Tsunami CPA” option in the galaxy options screen.  You can turn it on for existing savegames or new campaigns, but temporarily it is off by default.  It turns Cross Planet Attacks into the sort of… scary tidal wave of doom or glory that the pre-3.0 days of AI War Classic used to enjoy.

We’ll always keep the option to have boring-style CPAs in this game, where basically the CPA just releases a bunch of threat that join the Hunter fleet.  That’s… fine.  But as a number of people have noticed, that’s a very anticlimatic result after a scary countdown timer.

The hunter is its own thing, and is intelligent and scary in its own way, but it’s also cautious and coordinated.  That’s the very opposite of what a Cross Planet Attack used to represent, 8 years or so ago, in the first AI War.  A Cross Planet Attack is meant to be a flood of ships from all over the galaxy, only lightly coordinated at best, that wash up on the shores of your defenses and either dissipate or carry the wreckage inland.

So that’s what happens now, if you turn on the Tsunami CPA option.  It’s basically a thousand screaming idiots running at you from every direction, only sort of avoiding danger.  And they go for the throat, too, if they can get past your external defenses.  It’s thrilling and quite unlike anything the AI War multiverse has seen since maybe 2012.  How I’ve missed this.

However, here’s the thing that makes this extra cool and also quite new-feeling: the hunter may be cautious, but it also is quick to capitalize on openings.  And it operates alongside the Tsunami CPAs.  So while those are washing up on your defenses, and you think you’re going to be okay… sometimes the hunter shows up at just the wrong time and tips the balance.  It turns out that a meticulous and ruthless planner, given a thousand screaming idiots for cover, is even more effective.

Moving on from the keystone feature:

In a whole bunch of other areas for the AI, there are things that look on the surface like nerfs to the ship budgets for the AI, but actually are not quite what they seem.

The changes are complicated enough that it’s really easy to misunderstand the implications of them even if you read really carefully.

But to summarize the most important one, essentially the AI is… less reactive in how it applies its budgets when it feels like its king is under pressure.  It now trusts that it has been building a good and solid defense for a long time, and keeps pressing its own attacks on you.

Previously you could run into REALLY protracted final battles with the AI homeworlds, where the AI was being super defensive and making it really hard for you to win… but also really hard for you to lose.  Now the AI final fights won’t be quite so hard to win… but at the same time there is a dramatically higher chance of you outright losing during them.

Aside from this, there are what amount to some legitimate nerfs to the AI in the warden and praetorian guard sub-factions, if those are at their full cap for whatever reason.  Rather than donating excess income to general defenses (which made some AI types turn out to have generalized defenses that were way inflated in an inappropriate way), they just lose that budget.  This is more in keeping with the first AI War as well, and should not affect most games.  A few specific AI types may wind up needing a buff, but let us know how those feel (Special Forces Master and Praetor, mainly).

Oh, also speaking of the AI’s intelligence, the highest-level AIs (difficulty 8 and up) will now underestimate their strength a bit when deciding to engage you.  This will make them tend to engage you with overwhelming force more often, again like the first game.

And in general, turrets were being undervalued in terms of strength, which was hurting the decision-making of all factions.  So the strength values of those have been tweaked upwards (how the strength is reported, not what the damage of the actual turrets is), and that should lead to all factions making more sensible decisions on heavily turreted player planets.

Oh, and it’s harder to bait the hunter into your meat grinders on difficulty 8 and up.  You’re welcome. 😉

What’s Else Is New?

  • There’s a bunch of new little lore bits that now appear in the game when you are getting started!  This includes backstory on the Spire and Zenith if relevant when you find them, and backstory on the AI.  Some of these bits of lore are brand new information, and other are things that were easy to miss.
  • The Civilian Industries mod not only now works again, but also has been getting a number of substantial updates by its author, StarKelp.
  • Lots and lots of bugfixes.
  • One bugfix in particular fixes an issue where all of the fireteam-based faction ships were being lobotomized upon loading a savegame since September 3rd.  So that made the hunter, the nanocaust, scourge, etc, all really stupid for at least 30 seconds after loading a savegame.  That was a one-line typo on my part, but is now fixed.
  • The Nanocaust has seen a bunch of buffs in general, since they were starting to seem lackluster compared to the newer factions that are more powerful.  The devourer golem is coming up soon in terms of getting some new power levels (in its case those will be lobby options instead of a straight buff).
  • In the arena of multiplayer, we found an interesting bug a while back that was causing any ships in transports to get duplicated endlessly on clients, which led to all manner of bugs and eventually crashes.  The bugs we’ve been fixing since then have not been nearly so serious, and it’s really great to see how a variety of people are playing a variety of multiplayer scenarios with success now.  There are still plenty of missing MP-specific features and MP-specific bugs, but it’s coming a long way fast thanks to testers.

More to come soon!

Looking for more information about multiplayer and DLC2?  A recent post on September 25th has a lot of details.

Please Do Report Any Issues!

If you run into any bugs, we’d definitely like to hear about those.

The release of this game has been going well so far, and I think that the reviews that folks have been leaving for the game have been a big help for anyone passing by who’s on the fence.  For a good while we were sitting at Overwhelmingly Positive on the Recent Reviews breakdown, but there have been a lot fewer reviews lately and so that has definitely had a material negative effect.  Go figure.  Having a running selection of recent reviews definitely is helpful, but at least we have a pretty healthy set of long-term reviews.  If you’ve been playing the game and enjoying  it, we’d greatly appreciate it if you’d drop by and leave your own thoughts, too.

More to come soon.  Enjoy!

Problem With The Latest Build?

If you right-click the game in Steam and choose properties, then go to the Betas tab of the window that pops up, you’ll see a variety of options.  You can always choose most_recent_stable from that build to get what is essentially one-build-back.  Or two builds back if the last build had a known problem, etc.  Essentially it’s a way to keep yourself off the very bleeding edge of updates, if you so desire.

The Usual Reminders

Quick reminder of our new Steam Developer Page.  If you follow us there, you’ll be notified about any game releases we do.

Also: Would you mind leaving a Steam review for some/any of our games?  It doesn’t have to super detailed, but if you like a game we made and want more people to find it, that’s how you make it happen.  Reviews make a material difference, and like most indies, we could really use the support.

Enjoy!

Chris

AI War 2 v2.600 Released! “Multiplayer Alpha”

Can you hop into multiplayer and play now?  Why… yes, you can!  There will be bugs, at this point, but we’re well into alpha now, and the first waves of testers have helped us fix a lot of things.

Since the last update post fifty-seven days ago (WHOAH), we’ve had thirty releases, starting with notes here and ending here.

If you want the full info on multiplayer’s current status, the place to look at that from now on is here.

What’s New Other Than Multiplayer Stuff?

  • Heck of a lot of bugfixes and balance tweaks, as you might imagine.
  • You can have multiple Devourers and Zenith Traders if you like.
  • The Imperial Spire (in DLC1) has a number of improvements.
  • Ion Cannons are particularly more effective now.
  • Melee units now do battle far more effectively, too.
  • The way the galaxy map is drawn has had a lot of improvements, most notably in the lobby.  This feels SO much better in singleplayer and multiplayer.
  • Some features from the upcoming DLC2 (which is now pushed until January 2021) have been backported to the base game.  Notably, you can now hack Dyson Spheres like an ARS.
  • Dark Spire got a number of improvements, including more interactivity with other factions that hate them.
  • Hit the R key to reset the camera rotation and orientation, at long last.
  • Improvements and flavor updates to Human Resistance Fighters.
  • Lots of changes to AI Eyes to actually make them formidable again.
  • Lots of improvements to mod compatibility, which broke code-based mods temporarily, but ultimately make them work better in both singleplayer but especially multiplayer.
  • Scourge (from DLC1) intelligence improvements.
  • Civilian Industries By StarKelp has been added as our second off-by-default mod that we’re distributing for the mod author.  It may be broken at the moment because of some of the overhauls relating to multiplayer, but we’ll have a working build again as soon as that is ready from the author.  It’s a very cool mod.
  • More Starting Options By ArnaudB has been added as our third off-by-default mod.  This one adds a lot of new options for starting fleets for you.
  • There is a new “Find Planet” command (cmd:findp yourtexthere) that lets you find planets by name, which is super useful.
  • Better Default Screen Resolutions!  This has been bugging people for a while.  It’s now defaulting to your desktop resolution and fullscreen windowed mode when you start the game for the very first time.
  • More voice lines related to the nanocaust and a few other factions.
  • The AI difficulty descriptions have been completely rewritten and are way more clear as to what you can expect, without making you feel bad.  Huge thanks to Tzarro on this!
  • “Fireteam dynamic resizing” is a new feature that leads to massive performance gains in very late-game situations with a lot of enemy factions in play.  Huge win by Badger.

More to come soon!  Read on to hear about multiplayer and DLC2.

What’s The State Of Multiplayer?

If you want a truly exhaustive writeup about multiplayer, this has everything.

We have now been in multiplayer alpha for sixteen days, in a “soft launch” status.  Basically, we only told people who were really paying a lot of attention in the Steam forums or on Discord.  We had enough testers out of that smaller group to run into a whole slew of issues, and thanks to them you are now not going to be one of the folks to run into things that are that bad.

At first it was a situation where errors were immediate, and then it was a case of maybe being able to play 20 minutes at a time.  As of a day or two ago, Suzera and Ipsum were able to play for about three and a half hours without major errors, until they hit a game-breaking dead-stop issue.  However, the host was able to save their game, send it to me, and now on the new version they can keep playing as if nothing had happened; this may well be the first completed “real” multiplayer game of AI War 2 (assuming they win, heh).

At the moment you can definitely still expect some bugs, and things are not quite as smooth (visually) on the clients as we would prefer.  But we’ve made a huge number of strides, and it should be playable from start to finish aside from whatever unknown bugs you run into.  There’s a list of many of the known issues, but most of them are not that serious at the moment.

What’s The Difference Between Alpha And Beta?

Beta means feature-complete.  We’re not there yet, on multiplayer.  Things like sharing a faction between two players doesn’t have an interface yet.  Spectator mode has only been somewhat tested.  Lots more testing is needed in general.  Balance needs to be thought about by people who are actually playing it.  There are some features like gifting between players that are an obvious need.  Etc.

There’s a list of questions for multiplayer alpha testers that can have a major material impact on what beta (and later fully released) multiplayer functions will be like, so if you have an opinion, please feel free to let us know!

What Makes Multiplayer Beta?

When we have all of the major features missing from the alpha, then that’s a relatively feature-complete multiplayer experience.  When sync issues are not routinely a problem, and other bugs are not prevalent, then you can basically have an expectation of a “normal multiplayer experience.”  Connect, play, disconnect when done.

The purpose of the beta period is to have lots of people attempting that, so that we find the strange edge cases.  Or other features that are needed that we are missing.  Or balance problems that are specific to having multiple players.

At this point, the schedule is such that we’ll be hitting beta status sometime in October.  But we’re in a more-robust-than-I-expected alpha status at the moment, so there is that.

If you’re wondering “when can I play with my friends and actually just have a good time doing it,” my hope is that the answer is… maybe now?  Depends on your tolerance for bugs.

If you’re new to the game, or have a low tolerance for things that break, then my real answer to that question is “it should feel like finished and polished multiplayer in November,” based on how things have been going so far.

What About DLC2?

This is something we haven’t really been talking about too much, mainly because it seemed in poor taste to be talking about it before multiplayer was ready.  At any rate, Badger has really outdone himself on his part of it, and I’m very excited by what is there.

For my part of it, I have yet to even start it, and probably won’t be able to until sometime in October at the earliest because of multiplayer work.  So the end release for this expansion will probably be in January, which is when we’ll likely also call multiplayer “fully gold” in order to maximize the chance of marketing.  But realistically, hopefully multiplayer is there for you in every meaningful respect in November.

What can I tell you about this new expansion?  Well, it’s much larger than the first one.  It’s also not free to kickstarter backers, as an aside.  It’s called Zenith Onslaught, and it does live up to its name.  I look forward to being able to share more about that with you in the future, but for now I need to keep my eye on the multiplayer ball.

Please Do Report Any Issues!

If you run into any bugs, we’d definitely like to hear about those.

The release of this game has been going well so far, and I think that the reviews that folks have been leaving for the game have been a big help for anyone passing by who’s on the fence.  For a good while we were sitting at Overwhelmingly Positive on the Recent Reviews breakdown, but there have been a lot fewer reviews lately and so that has definitely had a material negative effect.  Go figure.  Having a running selection of recent reviews definitely is helpful, but at least we have a pretty healthy set of long-term reviews.  If you’ve been playing the game and enjoying  it, we’d greatly appreciate it if you’d drop by and leave your own thoughts, too.

More to come soon.  Enjoy!

Problem With The Latest Build?

If you right-click the game in Steam and choose properties, then go to the Betas tab of the window that pops up, you’ll see a variety of options.  You can always choose most_recent_stable from that build to get what is essentially one-build-back.  Or two builds back if the last build had a known problem, etc.  Essentially it’s a way to keep yourself off the very bleeding edge of updates, if you so desire.

The Usual Reminders

Quick reminder of our new Steam Developer Page.  If you follow us there, you’ll be notified about any game releases we do.

Also: Would you mind leaving a Steam review for some/any of our games?  It doesn’t have to super detailed, but if you like a game we made and want more people to find it, that’s how you make it happen.  Reviews make a material difference, and like most indies, we could really use the support.

Enjoy!

Chris

AI War 2 v2.112 Released! “Steam Networking Complete” (Multiplayer Alpha Approaches)

Multiplayer is not ready yet — but this is a big milestone on that path.  We expect to be into the alpha for multiplayer sometime next week.

Since the last update post sixteen days ago, we’ve had ten releases, starting with notes here and ending here.

I recently talked a lot about multiplayer and our plans for that in the short and middle term.  I think all that is still accurate, but I’m going to talk about things again based on what I now know.  Our release notes page also has a section with the current multiplayer todo list for your easy reference.

What’s New Other Than Multiplayer Stuff?

  • Relating to DLC1, the Scourge have gotten a number of new tweaks and fixes.
  • Various other UI tweaks and improvements, including a few to the lobby.
  • A fix to a memory leak and a crash to the desktop that were possible for some people to hit in the last month.  Those had to do with some newer ways of loading assets faster that didn’t always agree with everyone’s computer.
  • We fixed a handful of cross-threading exceptions that were possible.
  • The imperial spire now always give you vision properly.
  • Several ship behavior improvements.
  • The music selection/change window is now much improved.
  • The Dyson sphere got a few buffs.
  • A couple of speed improvements in parts of the codebase, and a couple of serialization fixes.
  • A fix for the self-building ships owing extra metal above their actual cost.
  • Several improvements to how stacks of ships behave, balance-wise.  This most notably improves Vanguard Hydras.
  • Campaigns in the load menu are now sorted by how recently something was saved in them, not alphabetically.  Oh my goodness this feels so much better.
  • Some minor nanocaust tweaks, and AI Exogalactic War unit tweaks in general.
  • Some balance tweaks to the Fallen Spire ships.

More to come soon!

What’s The State Of Multiplayer?

This is a screen (edited to blur out some names) that makes me very happy:

For multiplayer, the intent is to have three general solutions for HOW data is transmitted across the Internet.  Two our of three of those are complete.  This doesn’t mean that the game is ready to play, though, because WHAT data is transmitted across the Internet (or LAN) matters a whole lot more, and that still has a ways to go.  But we’ll talk about that in a minute.

First up, how do we connect to players and how does data get between them?

  1. LiteNetLib.  Originally FORGE Remastered, but that was not performing well in my tests, so I swapped it out.  This is fully working.  This is what you would use if you want absolutely no central services or servers, or you want to play on a LAN or a VPN with friends.  It’s extremely fast, and will try to do NAT traversal if you are playing across the Internet, but there’s a very high possibility that you would need to use port forwarding with this.  I built in a lot of things to make it easy to find your IP addresses with this, and it should support IPv4 or IPv6 with no troubles (though only IPv4 has been tested).
  2. Steam.  This is fully working.  Basically, the host opens the lobby in multiplayer mode, or loads a savegame.  The client clicks join game and sees a screen like the above with all of their Steam friends.  Click connect next to the one who is hosting, and Steam brokers a route through any firewalls you have, sets up a very fast relay through their own servers, and connects you with your friend without ever revealing the IP addresses of either of you.  It’s not possible that you would have to worry about ports or port forwarding or any of that sort of thing, as it doesn’t use any of that in a traditional sense.
  3. GOG Galaxy.  Not yet working.  This solution will only work for Windows and OSX right now, and not also Linux like the other two solutions do.  This one will work a whole lot like Steam, although with less in the way of relay servers.  I’m still working with GOG to figure out a few technical bits at the moment.

At this point, this covers HOW data gets around.  Other than GOG, which I’m waiting on information for, I’m completely done with this work (any future found bugs aside). 

The work of this stuff is:

  • Getting you and one or more friends connected.
  • Then keeping you connected and data moving fast between you.
  • And finally, making sure you know when someone disconnects.

These have no idea what is being said while you are connected, or really any concept of what the game is or what it is doing.  Their job is immensely complicated, but it’s all about the shipping and transfer of data, and not about what the data is.

What’s The Barrier To Multiplayer Alpha?

In order to play multiplayer at all, you first have to get connected and stay connected.  That’s done.  The game also then has to have a system for talking between clients and the host, and keeping everything in sync.  Someone clicks a button or gives orders to a unit, and everyone else sees the result.  Etc.

A huge amount of that sort of data-sharing is already done:

  • The initial sharing of the state of the galaxy, so that everyone is on the same starting point, is done.  It nicely pauses things until everyone is caught up, so that if someone is popping in in the middle that’s not a problem.
  • The actual routing of all the GameCommands that the AI and players issue, and the central time clock ticking, and that sort of thing has been done since 2017, and something we’ve been continually working on keeping up to date.  I’m sure there will be bugs, but I can verify that the vast bulk of this is working correctly already.
  • With the lobby itself, there’s a bunch of UI stuff that is particularly complicated, more than the rest of the game in some respects, and that is partially done.  Right now there are a number of known bugs in there that I’m sorting through.
  • We also have to know which players are controlling which factions, or who is choosing to just be a spectator, etc.  That’s on my list for early next week along with the lobby bugs.
  • During gameplay, certain things will drift out of sync because of the multithreading that we do, and because of floating point inconsistencies between machines in a few places.  We need to have the game roll through and self-analyze itself and fix those sync errors.  A lot has been built out here in terms of design, but the basic version needs to be implemented before people can play for too long without sync errors being hilariously in the way.

And in terms of a multiplayer alpha, that’s kind of all that we have left to do.  The main time question mark is just how many bugs I run into.  I also do want to convert the GameCommands into a new format that is more efficient, and that will probably introduce even more bugs, but that will ultimately be a speed boost for both single-player and multiplayer games.

What Will Multiplayer Alpha Be Like?

Buggy, probably.  And definitely not feature-complete.  Hopefully you can play with a friend for at least 20-30 minutes before there are catastrophic pileups of sync errors, and then saving and reconnecting is fast (3-10 seconds, probably).  But I would not expect to be able to play an entire game.

I also expect to see some funky things that we did not expect, such as trouble using certain interfaces or issuing certain commands.  Those should be pretty quick to fix, on average.

There’s also a bunch of features that are multiplayer-specific that will be missing.  Want to trade ship lines with a friend?  Too bad, at first.  Text chat?  Sure, that’s there already.  Science sharing?  Yep, already there!  Passing some metal over?  Nope, not yet.

During the alpha, one of the things that we’ll be soliciting feedback on is what features you want.  We have a pretty good idea, based on all those years of co-op in AI War Classic, but it’s still good to hear what feels lacking here, since there are a lot of concepts and features in this game that did not exist in the first.

What Makes Multiplayer Beta?

When we have all of the major features missing from the alpha, then that’s a relatively feature-complete multiplayer experience.  When sync issues are not routinely a problem, and other bugs are not prevalent, then you can basically have an expectation of a “normal multiplayer experience.”  Connect, play, disconnect when done.

The purpose of the beta period is to have lots of people attempting that, so that we find the strange edge cases.  Or other features that are needed that we are missing.  Or balance problems that are specific to having multiple players.

I’m still hopeful that we’ll reach the start of beta during August, and at the moment that seems like a reasonable goal.  The one real wildcard remaining is how much of a bear the sync code winds up being, since everything else is either complicated-but-done, or some type of code I have done many times over the last 11 years.

The Steam networking integration, and even to some extent LiteNetLib, were the other two major wildcards, and it’s really rewarding to have both of those behind me.  I do need some extra assistance from the GOG SDK team in the short-term before I get that platform up and running, but if that isn’t ready until sometime in the beta period that wouldn’t be the end of the world.  I would just prefer it to be done sooner.

We will probably have a multi-month beta period, just to let people have lots of time to run into any particular issues.  This will also give me time to then step back and do my work on DLC2, and then we can officially launch both that and the free multiplayer update at the same time.  October still seems reasonable for both.

If you’re wondering “when can I play with my friends and actually just have a good time doing it,” my hope is that the answer is “during beta, later this month.”  Fingers crossed!

Please Do Report Any Issues!

If you run into any bugs, we’d definitely like to hear about those.

The release of this game has been going well so far, and I think that the reviews that folks have been leaving for the game have been a big help for anyone passing by who’s on the fence.  For a good while we were sitting at Overwhelmingly Positive on the Recent Reviews breakdown, but there have been a lot fewer reviews lately and so that has definitely had a material negative effect.  Go figure.  Having a running selection of recent reviews definitely is helpful, but at least we have a pretty healthy set of long-term reviews.  If you’ve been playing the game and enjoying  it, we’d greatly appreciate it if you’d drop by and leave your own thoughts, too.

More to come soon.  Enjoy!

Problem With The Latest Build?

If you right-click the game in Steam and choose properties, then go to the Betas tab of the window that pops up, you’ll see a variety of options.  You can always choose most_recent_stable from that build to get what is essentially one-build-back.  Or two builds back if the last build had a known problem, etc.  Essentially it’s a way to keep yourself off the very bleeding edge of updates, if you so desire.

The Usual Reminders

Quick reminder of our new Steam Developer Page.  If you follow us there, you’ll be notified about any game releases we do.

Also: Would you mind leaving a Steam review for some/any of our games?  It doesn’t have to super detailed, but if you like a game we made and want more people to find it, that’s how you make it happen.  Reviews make a material difference, and like most indies, we could really use the support.

Enjoy!

Chris

AI War 2 v2.099 Released! “Last Rabbit Holes”

Since the last update post twelve days ago, we’ve had six releases, starting with notes here and ending here.

Last time I talked a lot about multiplayer and our plans for that in the short and middle term.  You can read the details, but in order to keep things organized our current release notes page has a section with the current multiplayer todo list for your easy reference.

One other really cool thing since last time is that I’ve written up an explanation of the AI in this game, and how it’s different from the much-vaunted-in-2009 AI of the original.  That’s definitely worth a read.

What’s New?

  • A lot of code reorganization has happened to get us through the first couple of todo items of multiplayer.  Things are so much easier now; I was going to do a first “discussion between two computers in AI War 2 since 2018” yesterday, but I got sidetracked with other items.  At any rate, that’s hopefully what I’ll be up to tomorrow, now.
  • Quick Starts were initially broken for a lot of players in version 2.090, but we got that taken care of quickly.  One of those things that can happen when the game is in a beta branch for a long time.
  • We improved the speed at which certain pieces of code can search for entities, which basically makes it so that various mods and factions can use less CPU time to do their thing.  There was a discussion on discord about methodologies, and I had a stroke of inspiration.  Figured why wait.
  • Badger has started adding some new “Reactive Guidance” for new players, which basically gives you journal entries suggesting alternatives if it notices you falling into certain kinds of traps.  For those who skip the tutorials or are otherwise rusty or unsure, this helps to keep them aware of the framework they might want to consider working within.
  • We had several other speed boosts to parts of the game, and a number of small bugfixes both long-coming and to recent things resulting from the beta.
  • Keith and Badger both added some new ship intelligence items, which make your own ships that much smarter without you having to micro them.  Engineers peeling off of their normal duties to prioritize a cripple flagship that just limped home is thanks to Keith.
  • Left clicking on your metal income now shows you some new stats for units you’ve killed.  Right-clicking shows the old flows data.  This is kind of a sneak preview feature.
  • A bunch of updates have been made to the main menu to prep it for multiplayer’s alpha coming up so soon.
  • You can now properly have multiple player profiles, and add new ones and switch between them and edit and delete them.  This is another item that’s useful for multiplayer.
  • There are some new features that let you actually run the game without loading all the ship graphics other than icons, which effectively lets you run the game under the normal minimum system requirements.  Two of the computers I want to use for multiplayer testing at my desk fall into that category, so that’s quite useful.  And if you want a just-icon view for your low-powered laptop, that’s now a feasible thing, in general.
  • There was some major confusion in the last couple of versions with the ability to enable and disable mods and expansions — it required a restart of the game, but did not make you do that or tell you so.  Now it makes you do that, and so the potential for accidental confusion is fixed up.
  • We’ve made the defaults for the icons in gamespace larger, so that you can see them better on average-sized screens.  If you’re running a very large screen or a very high DPI screen, you can still adjust these to be smaller (or even bigger if the opposite is true!), but this new default should be more comfortable for more people.
  • Mods with code can now distribute their code all in one folder, which makes them far easier to install and remove.
  • Mods can FINALLY add new icons, although I need to make a tutorial on how to do that.  But this is the last area that wasn’t moddable.
  • Our methods of loading and drawing icons are improved in general, and use a lot less RAM and VRAM, as well as allowing us more space for an indefinite number of icons.  In our one big monolithic sprite dictionary, we were going to be running out of space before finishing DLC2 in the prior approach.
  • It’s worth noting that with the new style of drawing icons, lowest-supported-level GPUs will probably see a significant speed boost.  This is because they can now store the entire material and its textures all in direct tiny amounts of VRAM rather than shared system/virtual VRAM that is slower; this is a major benefit for the older Intel HD 4000 HD cards in particular.
  • There are several new things that are pooled now on the galaxy map, making galaxy map generation even faster again.  This should also fix a DLC2-only memory leak with nomad planets, but we’ve not properly tested that yet.  Hopefully our DLC2 early testers let us know.
  • There is now a galaxy setting to grant players Watch vision for 1, 2 or 3 hops from all command stations.
  • On the galaxy map, we’ve reworked the shader for how we draw the icons of planets and ships at them, and thanks to that we no longer ever have problems with the planet drifting away from the wormhole lines leading to it when you view it at a somewhat oblique angle (usually the side of your screen).  That was a really longstanding irritation!
  • And that hopefully concludes my last couple of rabbit holes, so I can get on with multiplayer proper.  I do think that the improvements to performance are a nice boon, though.

More to come soon!

Please Do Report Any Issues!

If you run into any bugs, we’d definitely like to hear about those.

The release of this game has been going well so far, and I think that the reviews that folks have been leaving for the game have been a big help for anyone passing by who’s on the fence.  For a good while we were sitting at Overwhelmingly Positive on the Recent Reviews breakdown, but there have been a lot fewer reviews lately and so that has definitely had a material negative effect.  Go figure.  Having a running selection of recent reviews definitely is helpful, but at least we have a pretty healthy set of long-term reviews.  If you’ve been playing the game and enjoying  it, we’d greatly appreciate it if you’d drop by and leave your own thoughts, too.

More to come soon.  Enjoy!

Problem With The Latest Build?

If you right-click the game in Steam and choose properties, then go to the Betas tab of the window that pops up, you’ll see a variety of options.  You can always choose most_recent_stable from that build to get what is essentially one-build-back.  Or two builds back if the last build had a known problem, etc.  Essentially it’s a way to keep yourself off the very bleeding edge of updates, if you so desire.

The Usual Reminders

Quick reminder of our new Steam Developer Page.  If you follow us there, you’ll be notified about any game releases we do.

Also: Would you mind leaving a Steam review for some/any of our games?  It doesn’t have to super detailed, but if you like a game we made and want more people to find it, that’s how you make it happen.  Reviews make a material difference, and like most indies, we could really use the support.

Enjoy!

Chris

AI War 2 v2.090 Released! “Returning From Beta”

Since May 22nd, we’ve been working hard on the game in the beta branch, and now we’re back onto the main branch for everyone to enjoy the new items.  The full release notes start here and finish here.  Let’s see if I can’t summarize that down a bit, though.

The TLDR is that this is almost all prep for multiplayer.  If building and testing multiplayer was a car trip, this would be like getting the car in tip-top shape right before you start the trip.  If the trip is into rough terrain, then good preparation is going to mean a far smoother trip once you get on the road. 

So let’s take a look at that, and then the other bits that are unrelated.

Data Compaction, Many Times Over

Savegames are vastly smaller.  They’re also more efficient to write to disk, and to read.  This was a massive overhaul, but it also directly effects the way we will be transmitting network data messages.

I’ve written about the benefits of this at length in the past, so I’ll skip rehashing that here.  But the short version is that essentially there is a LOT going on in this game, and during networked play we need to be able to fix desyncs on the fly.  The only way to really do that is if we can efficiently send large amounts of correction data in the background while not interrupting your main play.

Back in May, I wasn’t feeling really confident that it would work out well.  It was borderline, but the processing load and the amount of network packets required was going to be iffy.  Any good engineering student knows that you want to build in redundancy: if your bridge can only hold ten tons, and it will have nine tons on it regularly, you’re asking for a terrible accident.  You want to start out with a lot more extra capacity to avoid the tragedy, and you also want to do that from the start rather than trying to strengthen the bridge while people are driving on it.

So that’s where we are now: the metaphorical bridge is ridiculously braced and ready for action.  This was a really massive undertaking, and it was the chief thing that led to the extended beta period here, so hopefully it makes intuitive sense why I chose to do this before getting into a functional multiplayer alpha rather than mixing the two together.

Game Loading Improvements

This might seem unrelated to multiplayer, but one of the things that we have to be really careful of is that all the players have the same data about game units when they load in.

Because this game was built from the ground up with mod support in mind, there are certain things that I realized could be impairing this consistency.  So I put in a bunch of new auto-checking to make sure that things happen the way I expect, and in the process:

  1. Fixed a few issues that were impacting mainly mod authors, making them have far more xml than they needed to.
  2. Made the game load vastly faster for everyone (depends on your computer, but for me it loads in 7-24 seconds now instead of 16-90 seconds.  The big variance is largely based on how busy my hard drives are and what is already cached in RAM from prior runs.
  3. Made it possible for mods to adjust base units (like Raider) and then have those modded changes cascade to all of the descendants of that base unit (Daggers, etc).
  4. Implemented some code that lets us verify that things are consistent regardless of how your OS does the sorting of files in its filesystem.  This sort of thing was going to be a potential barrier to cross-platform play between OSes, but it no longer is.
  5. This also lets you now disable mods and expansions that you have installed from within the game UI, if you don’t want to play with them at the moment.  This is key for multiplayer, where you might not have or want the same mods or expansions as someone else you are playing with, and the people with extra stuff can now just disable that in order to play with one another — no need for someone to reach for their wallet just to play multiplayer with you, if you have extra DLC, for instance.
  6. This prior one also lets us now distribute some mods with the game, but have them be in an “off by default” starting state.  This lets various mods be a lot more easily-accessible, without us having to support them in an official capacity or them affecting every game anyone plays.  The first mod to be included like this is The Spire Railgun Shop by Lord of Nothing.

Rebuilt Compiler Pipeline

This sounds like a yawn sort of item, so I’ll keep it brief.  But it’s something that first Keith and then later I had been working on since 2017 or so, and there were some key limitations with how we were able to link against some of the extra language features that… well, the various multiplayer libraries we’re going to be using (Steam, GOG, and Forge Remastered) all use.

This mean that there was a certain indirection I had to previously build in in order to load those things, and in order to test and change pieces of code in those specific areas it was literally an ELEVEN MINUTE wait for me while I hoped that whatever I changed was okay.  Normally it should be a couple of seconds of turnaround, but because of our compiler chain limitations, these specific libraries couldn’t be linked in the direct fashion we prefer.

This was going to make bugfixing in multiplayer an absolute nightmare, as you can imagine, since being able to routinely test things without eleven minute delays peppered all throughout my day is pretty important.  If I have a one-line typo, I need to be able to fix that and then see the results within a few seconds, not after 11 minutes.  That whole thing was making me dread working on certain aspects of multiplayer, so I put more time into it and finally managed to fix the root problem.  Hooray!

Prepping For Efficient Multiplayer Messages

We have long used a very efficient “serialize by index” (instead of name) method to make savegames smaller and more efficient, but that sort of thing could not work in multiplayer because there was no way to have a shared set of agreed-upon indices between the host and client(s).

The game has now been upgraded to handle fully setting those up so that now the host and clients get those synced automatically when the game starts, and so the ultra-efficient smaller messages now work in multiplayer and not just on disk.

Fireteam Specialists

This is a major new feature that Badger created for the upcoming second DLC for the game, which will be called Zenith Onslaught.  (Please put away any pitchforks — I have not been working on DLC2 at all yet, as my focus is appropriately on multiplayer.  And multiplayer is not something in Badger’s scope to help with).

Anyhow, like fireteams themselves (which were developed initially for DLC1), these new abilities for them have been backported into the base game.

Basically this lets some group, like the AI Hunters, have a sub-group that is chasing just a specific faction.  Or just a certain part of your faction.  Examples:

1. You’re The Little Fish

Let’s say that perhaps the nanocaust is being absolutely terrifying, and they are a third-party against you and the AI.  A faction like them is now able to piss off the AI enough to cause extragalactic war units of the AI to appear.  Those are things like the flenser, at the upper levels, where just one of those is absolutely game-ending for you as a player if you don’t have the fallen spire or some other sort of mega faction going on on your own side.

Anyhow, previously we couldn’t use something like the flenser in this fashion, since the AI would eventually probably turn it on you and end the game prematurely and unfairly.  But now we can keep the flenser fully focused on whatever aggro’d it so much in the first place — the nanocaust, in my current example.

This means that you can be present in the galaxy while the AI is fighting a much larger foe than you are, using much larger firepower.  This is… just plain cool.  It also has strategic ramifications, as you’ll want to avoid the planet with the flenser while it’s fighting the other foe, even though the flenser will never fully turn on you and go wreck all your planets.  It’s just going to be a fight that doesn’t involve you, but that you have to work around, and the flenser will head back out of the galaxy to deal with its war there once it deals with the target here.

(Of course, the flenser is an extreme example.  Mostly you’d see smaller extragalactic war units making an appearance.  But mods, and probably DLC2, could aggro the AI enough to cause a really strong faction like that to get into a war that is larger than the one you yourself are engaged in).

2. A Specialist Group Is After Your Treasure

Right now this is used for Major Data Centers (MDCs) in particular.  Previously when you captured those, the challenge that they presented was exogalactic waves that would spawn against the planet of the MDC while you were hacking it.  If you survived the entire time, then you’d get to keep the MDC.

That mechanic is… overused and kind of boring.  For MDCs, we no longer use exogalactic waves at all.  Instead, the AI hunter fleet gets a bit of extra budget with some specific objectives to go kill your MDCs.  This makes the AI have an appropriate response to you getting the new treasure, but it’s not in the form of this series of kind of hacky waves that come at you over and over.  Instead these are groups of specialists in fireteams who are intent on intelligently taking out that treasure when they can.  This makes the AI seem much more alive and intelligent, versus just a dump of units at you that you have to withstand temporarily.

3. Changes To Player-Allied Factions

Your allies will no longer go around popping warp gates, which was causing AIP to increase.  Instead the AI is now able to use these new mechanics with specialist hunter teams to hunt your allies appropriately.  In other words, the AI is now able to mount a proportional response to actions, but without your allies having to do something annoying like destroying warp gates that you might prefer consider existing.

Other Items

  • Holy cow, the one bad thing about an extended beta is that it can delay certain fixes.  One of those was that all of the AI (and I think Outguard units as well) had the equivalent of mark 1 hull and shields for the last couple of months if you weren’t on the beta branch.  That’s going to be a bit of a jump in difficulty on campaigns that were vanilla if you were on the last non-beta one all this time — apologies.
  • There were a bunch of other bugs fixed that were less likely to affect everyone, but which were still annoying and which are great to finally have on the main branch.
  • A bunch of achievements that were not triggering correctly now do.
  • The Parasitic Starting Fleet has had its balance improved, and should be more attractive to start with now.
  • AI ships from spire debris are now a lot more dangerous.
  • The Imperial Spire Fleet now gives you vision on their planets so that you can watch the fireworks.
  • Multiple copies of the same faction type (whether they are friends or enemies to one another) now try to spread themselves out in the galaxy to make things a lot more interesting.  If your playing with good and evil marauders both at once, then they won’t be neighbors most of the time, now.
  • We improved how we are doing our fixed-integer math, which fixes some math rounding issues that could lead to a bit of odd data with certain bonuses on the UI in particular.
  • Fixed a very unusual bug where the AI was basically able to get frigates “for free” as part of their reinforcements in the rare cases that they actually used them.
  • Make the Marauder less likely to suicide themselves against Praetorian Dragons.
  • During gameplay, when you click into the Galaxy-Wide Options screen it now shows you ALL of the values, not just the ones you can edit.
    As with the factions screen, it just has the ones that are non-editable as text values, but you can examine your settings this way and also see their tooltips.
  • If the game runs into an exception while trying to start up, it now gives you a visual error rather than the loading process just seeming to hang.
  • The Nanocaust and Dark Spire shouldn’t be able to rebuild a Nanobot Center or a Locus for at least a few minutes after a previous one on that planet was destroyed.
  • Cross planet waves against a specific faction now will stay focused on that faction (and not go off and attack the player).
  • The “brighter color” hex and color for faction teams now uses new logic by -NR-SirLimbo to make sure that faction names should always be nicely readable even if their actual colors are normally very dark.
  • Various more voice lines have been integrated into the game.
  • The game now has a Notification for when Dark Spire Loci are warping in.
  • It turns out there were some sort of edge cases where the AI king could be dead but its faction would not have gone through the “we have lost” logic. We don’t yet know how that could possibly be possible, but we now have a safety check from then on in the future that makes sure that even if the kings death was somehow missed when it happens, it now recognizes that it happened in the next few seconds and will mark the faction as defeated.
  • Fixed a SUPER longstanding bug where it would sometimes write “Was looking for a wormhole (some stuff) but couldn’t find one.”  This was also causing some bad ship behavior.   It’s been around, but rare, for years now.
  • Fixed a “fun” bug where some enemy ships with fireteamss would be unable to decide between targets; they would get partway to one target, then turn around as if going to the other target. This looked like a Buridan’s ass style problem with the targeting code.  The actual problem was that Fireteams were incorrectly declaring themselves winners of a battle without showing up.
  • Fixed what appears to have been a relatively old bug (somehow?) where the max strength of a lot of fleets was not being properly calculated. It seems like this may have slipped by for a few months, or since a bit before DLC1 somehow.
  • Also fixed a bug that probably goes back to the start of fleets, where instead of the current strength of fleets on the fleets sidebar, it was showing their total strength. For command station fleets, it was showing a max that they could not even hit, too.

More to come soon!

But here’s some further reading on what we’re doing in detail:

Multiplayer Schedule, And Why

It feels like an endless wait for multiplayer, doesn’t it?  I hear you on that — I think it probably feels even longer for me, since I’m the one working directly on it daily and it’s been so many things.

I wanted to take a minute to step back and address WHY things are taking so long.  You may or may not know this, but we actually had fully functioning multiplayer for this game back in 2017, before turning it off because we couldn’t reliably try to keep sync in the game while building out so many features like we were doing until late 2018.

It seems like it should have been a simple matter of just turning back on that old code, right?  Well… unfortunately as we developed the game, it got a lot more complex.

Essentially, the first AI War existed in a perfectly deterministic state where, after initial game sync, nothing had to be sent between clients and the host except for commands from the players and the higher-level AIs.  It also sent some basic check messages to make sure that results were not diverging on your machines — and if it detected a divergence, then it would flag that as a desync and stop you from playing until you saved, reloaded, and had the clients reconnect.

That determinism was achieved through a lot of really rigorous coding practices, and using fixed-integer math instead of floating-point math, and only using one thread for the main simulation.

In AI War 2, we can’t really enforce how rigorous modders’ code is; we also are using many threads, all of which are designed to be deterministic but which… turns out sometimes are not because of exceptions that we can’t solve in a deterministic way without slowing the entire game way down; and we have to use some floating point math here and there (forcefield pushback, for one) in order to get the accuracy and performance the game needs.

So what this means is that the entire premise for multiplayer in AI War 2 got more complicated.  The game is MOSTLY synchronous, MOSTLY deterministic, and does a great job at running blazing fast.  But desyncs can and will happen, probably with some frequency depending on how different your PC specs are from the people you are playing with (or what errors in rigor have been made in mods you want to use), and the old approach of stopping the game and making you reload and reconnect is absolutely unacceptable.  You could be running into those sort of issues once an hour, or once a minute, depending on the circumstances.

That means that, while we strive for determinism as much as possible, we also need to have automatic desync repair.  This is familiar more for action games (which exist in a state of constant desync by nature) rather than strategy games.  I have experience with this from the A Valley Without Wind games, but they have an incredibly small fraction of the amount of data that AI War 2 has going on.  It’s a much less intense environment as a multiplayer coder.

Anyhow, this has meant that the environment has to be extra well-prepared for sending efficient messages, since there will be more of them.  It also has to be able to fix small problems in a spot-fix fashion without re-syncing the entire game.

These added challenges meant that I needed to restructure some substantial bits of the code that were working perfectly fine if you look at them from any other context.  I still have some areas to deal with for that, but the list is getting much smaller.

We’re still on track to have multiplayer “in the next few months,” but I realize I’ve been saying that for months now.  The really good news is that alpha of multiplayer should be way more smooth, and a lot shorter of a period before we can get to the point of it being fully polished. 

I’m keenly aware that as soon as folks can play multiplayer, they will do so; and if it’s a broken mess on the first alpha, and it takes me months to make meaningful improvements to it, I will lose my testers.  So I’m being extra cautious and hitting all the areas that I expect I will run into before even starting the first alpha.  That should ultimately be a lot less stressful on me in a time-pressure sense once we start doing multiplayer alpha.

What’s Remaining For Multiplayer?

So what is the todo list, then?  It’s getting shorter!

  • Now that the compiler chain is improved, I need to get Steam and GOG linked in a better way, and also get Forge Networking linked in that fashion.  This will be FAR easier than what we were doing before, and more in line with how those respective libraries expect you to use them.  I’m very excited about this being possible, finally.
  • The actual cycle of multiplayer messages being sent and received, and that keeping the game flow going, is done and has been for years (literally since early 2017), but I need to reintegrate that into our core dlls and improve the efficiency of some bits of it.  It’s not large amounts of code, thankfully.
  • I need to redo how the initial world state is sent to new clients joining in, but that will also be quick — thanks to the rework of world save data styles and sizes.
  • Our old style of desync-detection from 2017 has been stripped out now, and I need to add in a new kind of rolling desync detection that will find problem entities and then allow us to fix them.  To keep this fast and relevant, I’m only going to care about a few things: position, health, and shields.  If those match, then probably everything else is close enough.  How to handle the time differential on this is really challenging, and only in the last couple of months did once facet of this occur to me.  I have a couple of solutions in mind, but it’s going to be… “fun.”
  • The way that we send information in multiplayer is by GameCommand, and right now those are generic and bloated (they are overly multi-purpose).  I am going to replace those with a new set of custom GameCommands that us developers and modders can use as-needed and have them  take full advantage of the new smaller data sizes.  Fun fact, this will also make single-player run very slightly faster when a lot of things are going on.
  • The really big one that remains is making sure that the cross-machine identifiers (PrimaryKeyIDs) are consistent between machines.  I don’t fully have this figured out yet, but I think that the interim state of it will essentially be that there are occasionally too many messages being passed around because of rolling sync errors.  I will probably punt this issue into something I look at during the alpha, so that I can gauge what sort of impact it really has on performance, and where the problems are coming from.
  • After that it’s more or less a matter of making sure that the lobby fully works as we expect, and various other small UI systems to get multiplayer basically playable.  A lot of work went into the lobby in particular in the last few months to make that as close to as ready to go as possible.
  • There are then whatever changes we need to make to balance in order to make things “feel right,” which will be a matter of working with the multiplayer alpha and beta testers.  A lot of things we already did in the past, like making science collection a humanity-wide thing that each player gets a copy of, rather than something people have to do individually (what a pain that was in AIWC).  We will have to scale waves like we did in AIWC multiplayer, or in some other fashion.  But a lot of the difficulty scaling is inherently handled by AIP being higher when you have to take more planets in multiplayer.

So, to sum up the plan for the short term:

  1. I need to re-link the networking libraries using the new compiler chain.  This might take a couple of days.  I’ll do it on a beta branch in the next week or so, at least for a bit, because it will potentially break the ability to log achievements on some machines or OSes until I get it fixed back properly (assuming it doesn’t work on try one).
  2. Then I will pull the network-loop code back into the main game, which is a part of one day job.
  3. Then I need to generalize that to work for all three networking code paths (Steam, GOG, Forged), which probably will only take a couple of days at most.
  4. Then I need to re-code GameCommands to be more efficient and special-purpose.  This is probably a job that is a couple of days long, and will potentially lead to widespread bugs for a week or so after it.
  5. Then I need to implement V1 of the desync detection and correction code, which should probably only take a few days.
  6. Then I need to get the basic connection interfaces working, so that you can choose to connect to players via Steam, GOG, or a direct IP address (forged).  This will be a moderate challenge, because Steam and GOG both have APIs that I’m pretty unfamiliar with in this exact area.  Once the connection is going, it’s much easier.  But with the new compiler chain, at least I can hopefully get these going in a matter of days or a week rather than it being something that takes multiple weeks.
  7. At that point we should be able to reasonably declare that the multiplayer alpha is ready, as you should be able to connect to friends and play with them, and the desyncs would cause network performance degradation rather than something permanent that your game can’t recover from.
  8. Then it’s a matter of the other features on multiplayer, mainly regarding things like donating fleets between one another, and/or whatever else we come up with that is desirable.
  9. Oh, and during that period if we’re seeing network degradation or other issues due to the constant need to sync errors, then that will be to be investigated and improved.  But those things are most of what the focus of the alpha/beta will be on.

How long will each of those line items take in reality?  I guess it depends on what gotchas I run into that are unexpected at the moment, but you can always watch the release notes to see how things are coming.  A lot of the really hefty things that required major reworks of the game are done, so that’s a win.

There are some things that I’d probably prefer to do sooner than later, like allow you to enable and disable expansions/mods from the main menu without a restart of the game, so that might take a chunk out as well.  But it should make things easier on everyone as they get more into multiplayer.

Please Do Report Any Issues!

If you run into any bugs, we’d definitely like to hear about those.

The release of this game has been going well so far, and I think that the reviews that folks have been leaving for the game have been a big help for anyone passing by who’s on the fence.  For a good while we were sitting at Overwhelmingly Positive on the Recent Reviews breakdown, but there have been a lot fewer reviews lately and so that has definitely had a material negative effect.  Go figure.  Having a running selection of recent reviews definitely is helpful, but at least we have a pretty healthy set of long-term reviews.  If you’ve been playing the game and enjoying  it, we’d greatly appreciate it if you’d drop by and leave your own thoughts, too.

More to come soon.  Enjoy!

Problem With The Latest Build?

If you right-click the game in Steam and choose properties, then go to the Betas tab of the window that pops up, you’ll see a variety of options.  You can always choose most_recent_stable from that build to get what is essentially one-build-back.  Or two builds back if the last build had a known problem, etc.  Essentially it’s a way to keep yourself off the very bleeding edge of updates, if you so desire.

The Usual Reminders

Quick reminder of our new Steam Developer Page.  If you follow us there, you’ll be notified about any game releases we do.

Also: Would you mind leaving a Steam review for some/any of our games?  It doesn’t have to super detailed, but if you like a game we made and want more people to find it, that’s how you make it happen.  Reviews make a material difference, and like most indies, we could really use the support.

Enjoy!

Chris

AI War 2 v2.073 Released! “Filesize Finalization”

This is on the beta branch, as there are still a lot of unstable changes that we are working through.  The more testers the better, please!  Full notes here.

How To Play A Beta Branch Build

To play this on Steam, please go under betas and choose current_beta from the drop-down list. We would really appreciate some testers on this so that we can get back out of beta status as quickly as possible! There is not currently a way to get the beta versions on GOG, but we won’t be in that status for more than a week, knock on wood.

We want to make sure we didn’t break anything with all the substantial changes in here, but we fully expect some savegames to throw cosmetic errors at the very minimum. Please report and upload those here: https://bugtracker.arcengames.com/

What’s New?

  • Last release that I wrote up was one about data compaction and how that affects savegame filesizes.  We had managed to get one very large (8.3507 MB) savegame down to 2.4009 MB, and a lot of other saves had also been shrunk notably.   At the time I noted I was not done yet, though.
  • Using even more aggressive and targeted optimization for key fields, and for strings, that key savegame has dropped from 2.4009 MB to 1.3444 MB.
  • Why the heck does that matter so much?   Multiplayer.  The game has to be synced when a new player connects, but beyond that we also have to be able to run desync-repair from the host to the clients.  The smaller that data is, the more efficiently it will run.  The newest methods not only are smaller amounts of data, but also use less CPU power to do their work.
  • There will be some future work on GameCommands themselves — those things that the game passes around for both singleplayer and multiplayer games to keep them running in a consistent way — but the really heavy lifting on the data-formatting side is all done now.
  • We actually had three other releases since the last one I wrote up, and a lot of other things have happened in there beyond just my push for data efficiency.
  • Badger fixed a ton of bugs, and I fixed a few.
  • The Parasitic Starting Fleet is now a lot more buff, hopefully feeling more balanced.
  • A bunch of bugs relating to 2.062 beta were fixed, including allegiances that were wrong, too many waves spawning at times, etc.  We are really glad we did a beta for this!
  • Several more fixed achievements.
  • A variety of fixes that make modding easier for certain pieces of data (or possible at all).
  • A major revision to our internal FInt (fixed integer math) class, repairing a very minor bug that caused some strange math results for the last 10 years or so (since well before AIW2).
  • The Warden and Hunter fleets now actually do something again on the beta branches, whereas they’ve been complacent since 2.062.
  • Marauders got smarter.
  • And so on.

More to come soon!

But here’s some further reading on what we’re doing in detail:

What’s Next For Multiplayer?

I’ve been so heavily focused on making savegames smaller and getting the data storage/transmission formats as efficient as possible, that most other things for multiplayer seem like they’ve taken a back seat.  But!  I’ve also been taking this time to review many parts of our codebase and continue to make plans for desync avoidance and desync repair, the two major things that would be gumming up your network connection if not handled correctly.

  • I still need to get the latest version of Forge Networking Remastered in place, and then I’ll be working on actual multiplayer data transmissions through that, Steam, and/or GOG, depending on how you choose to connect.
  • The actual cycle of multiplayer messages being sent and received, and that keeping the game flow going, is done and has been for years (literally since early 2017).
  • I do need to redo how the initial world state is sent to new clients joining in, but that will be quick.
  • Our old style of desync-detection from 2017 has been stripped out now, and I need to add in a new kind of rolling desync detection that will find problem entities and then allow us to fix them.  To keep this fast and relevant, I’m only going to care about a few things: position, health, and shields.  If those match, then probably everything else is close enough.
  • Making sure that the cross-machine identifiers (PrimaryKeyIDs) are consistent between machines is really tough, and that I’ve been looking at a couple of methods for that.  This is one of the things that I’ve been investigating the most alongside the data size compaction.  There are some code path changes I will likely make in order to make this work properly, we shall see.
  • After that it’s more or less a matter of making sure that the lobby fully works as we expect, and various other small UI systems to get multiplayer basically playable.
  • There are then whatever changes we need to make to balance in order to make things “feel right,” which will be a matter of working with the multiplayer alpha and beta testers.  A lot of things we already did in the past, like making science collection a humanity-wide thing that each player gets a copy of, rather than something people have to do individually (what a pain that was in AIWC).  We will have to scale waves like we did in AIWC multiplayer, or in some other fashion.  But a lot of the difficulty scaling is inherently handled by AIP being higher when you have to take more planets in multiplayer.
  • Anyhow, I really didn’t want to have to take a multi-week hiatus during the middle of active multiplayer testing in order to optimize our data formats (which was going to be needed), so I went ahead and did that up front instead.  It’s a relief to have that part done, so I can move forward on other bits!

Please Do Report Any Issues!

If you run into any bugs, we’d definitely like to hear about those.

The release of this game has been going well so far, and I think that the reviews that folks have been leaving for the game have been a big help for anyone passing by who’s on the fence.  For a good while we were sitting at Overwhelmingly Positive on the Recent Reviews breakdown, but there have been a lot fewer reviews lately and so that has definitely had a material negative effect.  Go figure.  Having a running selection of recent reviews definitely is helpful, but at least we have a pretty healthy set of long-term reviews.  If you’ve been playing the game and enjoying  it, we’d greatly appreciate it if you’d drop by and leave your own thoughts, too.

More to come soon.  Enjoy!

Problem With The Latest Build?

If you right-click the game in Steam and choose properties, then go to the Betas tab of the window that pops up, you’ll see a variety of options.  You can always choose most_recent_stable from that build to get what is essentially one-build-back.  Or two builds back if the last build had a known problem, etc.  Essentially it’s a way to keep yourself off the very bleeding edge of updates, if you so desire.

The Usual Reminders

Quick reminder of our new Steam Developer Page.  If you follow us there, you’ll be notified about any game releases we do.

Also: Would you mind leaving a Steam review for some/any of our games?  It doesn’t have to super detailed, but if you like a game we made and want more people to find it, that’s how you make it happen.  Reviews make a material difference, and like most indies, we could really use the support.

Enjoy!

Chris

AI War 2 v2.062 Released! “Savegame/Networking Data Compaction”

This is on the beta branch, as it’s a freaking huge number of changes.  The more testers the better, please!  Full notes here.

How To Play A Beta Branch Build

To play this on Steam, please go under betas and choose current_beta from the drop-down list. We would really appreciate some testers on this so that we can get back out of beta status as quickly as possible! There is not currently a way to get the beta versions on GOG, but we won’t be in that status for more than a week, knock on wood.

We want to make sure we didn’t break anything with all the substantial changes in here, but we fully expect some savegames to throw cosmetic errors at the very minimum. Please report and upload those here: https://bugtracker.arcengames.com/

What’s New?

  • The biggest thing for me personally is the new data compaction stuff, which I have been pouring hours into in preparation for multiplayer.  The last thing I want is for multiplayer to be functional, but immediately laggy as soon as we have the desync repair stuff going.  I needed to start with efficient data storage and transmittal so that there wouldn’t be a point where I need to disappear for a week to redo all that after we’re into multiplayer’s alpha.
  • I’m not entirely done with my data compaction shenanigans, but I’m very excited about how it has turned out so far.  I do expect it to result in a number of user-facing errors, though, so hence the beta, which I really hope you’ll partake in.
  • Badger fixed a number of bugs, including several achievements that were not triggering.  Also that all the AI units have had the equivalent of mark 1 shields/hull for the last two weeks??
  • Meanwhile, Badger also implemented another major fireteams upgrade, this one which is intended for the upcoming DLC2 but has been backported to the base game.
  • The first use of this fireteams code is to let the AI really fight some other faction other than you with giant fists, without killing you in the process.  Aka, let it fight the Marauders or the Nanocaust using REALLY BIG AND SCARY GUNS if those two factions are taking over the galaxy… but don’t have that be game-ending for you.  You’re not the problem, after all, from the AI’s point of view.
  • The second use of this is to let us have certain sub-groups of the AI faction, most notably Hunters right now, which have a sub-subgroup that just focuses on one objective after you harass them.  The example in place right now is Major Data Centers (MDCs).  Those always triggered an Exogalactic Wave, previously, which was boring — more ships come in increasing waves, and you survive them or don’t.  It felt kind of uninspired.  NOW, instead, the hunters get a major buff to a certain sub-team that explicitly hunts the MDC and its protectors… and if it wins against that, eventually, then they just leave you alone — “job’s done, bye!”
  • The way that the hunter deals with allied factions to you is a lot more interesting, too, rather than your allies causing rapid AIP gains by killing all the warp gates and aggroing the AI in that way.
  • These are some major strides forward towards multiplayer being a smooth and fun experience as we get into that, and towards the DLC2 that will come out around the time multiplayer fully releases (multiplayer will be free).   Please note that none of the DLC2 stuff is slowing down multiplayer at all, as Badger is not working at all on multiplayer and I’m entirely focused on that and related things for now.
  • Oh, also, for the sake of modders we’ve documented some new things that will help with making sure mods are multiplayer-compatible.
  • Note that if a mod you like turns out NOT to be multiplayer-compatible, the game should still be playable.  You’ll just have a ton more desync-repair messages going back and forth, related to the mod.  This is an excellent example of why I want those desync-repair messages to be absolutely as efficient as they possibly can be, which means representing all our data in as tiny a format as possible.

More to come soon!

But here’s some further reading on what we’re doing in detail:

Why Do We Care About Compaction?

I explain what I mean by this below, and go into detailed benchmarks.  The release notes have a lot of other detailed info.  But a TLDR of why this matters is certainly a good place to start:

  • Smaller savegames are easier to transmit across the network when you’re initially synchronizing your game from a host to clients.
  • Doing it via our compaction method, versus compression, uses FAR less CPU cycles, and thus makes the transfer of even small, frequent bits of data run more smoothly.
  • Doing it via our compaction method makes even small bits of data… smaller.  Compression often requires a lot of data before it makes much difference.
  • Given that we are going to have frequent small commands being sent back and forth just to have the game run at all, and then we ALSO are going to have the desync-repair data going back and forth that is still small (but substantially larger at the scale of network messages), this is pretty critical.
  • So the TLDR of the TLDR is that we use less bandwidth and less CPU to do the same thing, and thus your game will run way more smoothly in multiplayer.
  • And it has the side benefit of making savegames a lot smaller, and also faster to save.

Data Compaction vs Compression

What the heck is data “compaction?”  Well, in the most direct sense here, it’s a term I made up.    The way I’m defining the term, for purposes of what we’re doing here, is “making data smaller at the level of small objects, as we put it into a binary stream.”

Wait, what?  Basically… it’s something we do as we go along, and it works on very small pieces of information.  A single integer.  One ship and its data.  That sort of thing.

Compression, by contrast, requires a lot of processing AFTER you put in your data to some sort of format.  So to compress a bunch of data in AI War Classic, for instance, we write roughly 30MB of data for a savegame  into a temporary buffer, and  then we run GZIP compression on that, which turns it into maybe 1MB that we can store on the disk or send across the network.

That 30:1 ratio is legitimately what AIWC was seeing, on average, by the  way.  The downside is that it only really works well for very large amounts of data, and it also requires a lot of processing every time it wants to send or save.  You’ll notice that AIWC has a noticeable hitch in itself every time it saves the game.  AI War 2, by contrast, doesn’t use compression and thus doesn’t have that sort of hitching.

AI War 2 is a lot smarter about how it represents its data to start with (using binary formats directly  instead of a unicode-based format), and uses clever tricks to also know when not to send data of certain sorts (if I don’t have X properties, then don’t bother tracking them).  So this realistically converts what would have been 30MB in AI War Classic into something that might be… 5 MB in AI War 2.

Beyond that, though, requires a lot more work, because we actually have far more data here than in AI War Classic — enough that despite our better formats and such, we’d be back up around 10 MB or so for savegames.

Several years ago, perhaps four now, Keith LaMothe came up with a great new concept he called “buzzsaw binary,” and we posted benchmarks on how incredibly efficient it was at storing data.  After working out some kinks with it, we’ve been using that for the last few years, and it saves blazing fast, as you’ve probably noticed.

Basically, this takes each data point that we want to store in binary and writes it directly into a bitstream (which C# does not officially have — they only have bytestreams).  As it writes to  our custom bitstream, it analyzes each piece of data and figures out if it can make it any smaller than would normally happen for that kind of data.  The types of data that Keith built support for were string, 32bit integer, and 64bit integer.  The last of those also gave us support for our own FInt fixed-integer format, and by extension also some limited float support (thought we avoid float as much as possible).

The plan was always to go further, and he left notes to himself to do so directly in the code, actually.  With this format, storing a byte was actually highly inefficient, taking on average 10 bits rather than 8. But we never even tried to directly store bytes, so that was kind of irrelevant.

In most programming languages, integer numbers can be stored as 8, 16, or 32 bits, with or without the ability to have negative numbers (called signed numbers).  In the prior edition of buzzsaw binary, we assumed all numbers were signed and could be up to 64 bits, and wrote them out in a manner that still produced results that were often 16 bits or less for a 32bit number.  That was a savings of 50% or more, in lots of cases.

A big part of the savings is what to do with “default case” numbers, such as those that are 0.  How many bits should you take to store that zero?  By default, a 32bit number will take 32 bits to say 0, and a 64bit number will take 64 bits to say 0.  In buzzsaw binary, regardless of the bit level of the number, it has always taken us 1 bit to store a zero.

One tricky thing is that we use a lot of -1s as defaults for various reasons, and that was something that required 10 bits to store. Ack!

So for me, I went in and finally figured out Keith’s code, and added a ton of comments to make it clear what was going on.  I added explicit support for

  • 8bit (aka byte) and 16bit (aka short) numbers
  • And some special cases for:
  • numbers of 16 or more bits that cannot be negative
  • numbers of 16 or more bits that cannot be any smaller than -1
  • and 8 bit numbers (bytes) that are frequently 0

Those are… strange categories, I know.  But when you look at the data we use, and apply the same sort of buzzsaw binary approach, but with more hinting from the higher-level program (as well as more appropriate number formats for variables instead of int32 for everything), then you wind up with some truly amazing compaction.  I’ve detailed the macro results of that here.

Bytes now take an average of 4.74 bits in a savegame, down from 10ish in our previous implementations.  In the benchmarks I just not the percentage relative to the normal 8 bits. “32 bit numbers that cannot be less than -1” are averaging out at 2.71 bits instead of 32.

Overall file sizes for the game dropped in this build to commonly about 70% of what they previously were, and as low as 28%  in one case.  The actual data format change only represents a savings of 10%, sadly, but it’s still a win, even if it is a minority of the gains.

Please Do Report Any Issues!

If you run into any bugs, we’d definitely like to hear about those.

The release of this game has been going well so far, and I think that the reviews that folks have been leaving for the game have been a big help for anyone passing by who’s on the fence.  For a good while we were sitting at Overwhelmingly Positive on the Recent Reviews breakdown, but there have been a lot fewer reviews lately and so that has definitely had a material negative effect.  Go figure.  Having a running selection of recent reviews definitely is helpful, but at least we have a pretty healthy set of long-term reviews.  If you’ve been playing the game and enjoying  it, we’d greatly appreciate it if you’d drop by and leave your own thoughts, too.

More to come soon.  Enjoy!

Problem With The Latest Build?

If you right-click the game in Steam and choose properties, then go to the Betas tab of the window that pops up, you’ll see a variety of options.  You can always choose most_recent_stable from that build to get what is essentially one-build-back.  Or two builds back if the last build had a known problem, etc.  Essentially it’s a way to keep yourself off the very bleeding edge of updates, if you so desire.

The Usual Reminders

Quick reminder of our new Steam Developer Page.  If you follow us there, you’ll be notified about any game releases we do.

Also: Would you mind leaving a Steam review for some/any of our games?  It doesn’t have to super detailed, but if you like a game we made and want more people to find it, that’s how you make it happen.  Reviews make a material difference, and like most indies, we could really use the support.

Enjoy!

Chris

AI War 2 v2.048 Released! “Bugfixes”

This one is nothing but a collection of bugfixes, but there are some very welcome ones.  Full notes here.

What’s new?

  • You can upgrade forcefield frigates beyond mark 4, as they now use the heavy hull tech type.
  • Fleet Research Stations, new in the last version, now properly charge you AI Progress (AIP) for the things you get from them.
  • Handy new cheat code “heal me” that is useful for bugtesting.
  • Multiple improvements to make tachyon sources way more efficient.
  • A fix to make tachyon sources work at the proper speed when they are on background planets (with coarse processing on) or when you have the sim speed higher than one.  Previously it took longer to decloak enemies, but now it works at the same speed regardless of those factors.  This is a super old issue!  At least two years old, if not more.
  • We also found and removed a really super old form of performance profile logging, which generally was unused but could be toggled on by some unknown mechanism and then slow down your game at some points.  This was code that hadn’t been touched in 2-3 years, s it was a surprising find.
  • Fallen Spire cities that were able to rarely get extra flagships now have those properly scaled back.  And if you ever have a city missing its flagship, it will fix that for you (though we’ve no reports of that).
  • And finally, there was a very annoying issue that if you had selected any ships directly and they changed planets, it would deselect them.  Selecting by fleet did not have this problem, so to people who experienced it, it just seemed intermittent.  As someone who pretty much always selects by-fleet, I had not been seeing the issue until it was pointed out with steps on how to reproduce it.

More to come soon!

Please Do Report Any Issues!

If you run into any bugs, we’d definitely like to hear about those.

The release of this game has been going well so far, and I think that the reviews that folks have been leaving for the game have been a big help for anyone passing by who’s on the fence.  For a good while we were sitting at Overwhelmingly Positive on the Recent Reviews breakdown, but there have been a lot fewer reviews lately and so that has definitely had a material negative effect.  Go figure.  Having a running selection of recent reviews definitely is helpful, but at least we have a pretty healthy set of long-term reviews.  If you’ve been playing the game and enjoying  it, we’d greatly appreciate it if you’d drop by and leave your own thoughts, too.

More to come soon.  Enjoy!

Problem With The Latest Build?

If you right-click the game in Steam and choose properties, then go to the Betas tab of the window that pops up, you’ll see a variety of options.  You can always choose most_recent_stable from that build to get what is essentially one-build-back.  Or two builds back if the last build had a known problem, etc.  Essentially it’s a way to keep yourself off the very bleeding edge of updates, if you so desire.

The Usual Reminders

Quick reminder of our new Steam Developer Page.  If you follow us there, you’ll be notified about any game releases we do.

Also: Would you mind leaving a Steam review for some/any of our games?  It doesn’t have to super detailed, but if you like a game we made and want more people to find it, that’s how you make it happen.  Reviews make a material difference, and like most indies, we could really use the support.

Enjoy!

Chris