Difference between revisions of "AI War 2:The Paradigm Shift"

From Arcen Wiki
Jump to navigation Jump to search
Line 36: Line 36:
  
 
* Fixed an exception that could happen in RemoveInvalidatedOrdersAndReturnFirstValid_IncludingDecollision() somewhat at random on multiplayer clients, mainly as a race condition.
 
* Fixed an exception that could happen in RemoveInvalidatedOrdersAndReturnFirstValid_IncludingDecollision() somewhat at random on multiplayer clients, mainly as a race condition.
 +
** Thanks to crawlers and Driftwood for reporting.
 +
 +
* For whatever exact reason, the Macrophage faction really doesn't work well if the client is also trying to calculate all the decisions for things in multiplayer.  This is referring to the DoPerSecondLogic_Stage3Main_OnMainThreadAndPartOfSim() method in general, but the telium spawning logic in particular.
 +
** Since this was a constant source of errors, and since the desync repair code should catch things like this quickly in general, for now we're just not running this on the client at all anymore.  This stops the errors, and any divergences should be quickly and easily picked up by the desync repair logic.
 
** Thanks to crawlers and Driftwood for reporting.
 
** Thanks to crawlers and Driftwood for reporting.
  

Revision as of 11:10, 13 November 2020

Known Issues

  • Any bugs or requests should go to our mantis bugtracker
    • If you need to submit log files, those can generally be found under your PlayerData folder in the folder your game is installed in. The most relevant one is called ArcenDebugLog.txt. You can send us the whole thing, or just strip out relevant parts.
    • In rare cases, mainly if your entire game crashes (that almost never happens), we will need your unity player log. That gets overwritten the next time you run the game after a crash, unlike the other log. These can be found here:
      • Windows: C:\Users\username\AppData\LocalLow\Arcen Games, LLC\AIWar2\Player.log
      • macOS: ~/Library/Logs/Arcen Games, LLC/AIWar2/Player.log
      • Linux: ~/.config/unity3d/Arcen Games, LLC/AIWar2/Player.log

What Does Multiplayer Alpha Mean?

Please see this link for details on multiplayer. This wound up taking up too much space in this document, so all of the multiplayer-relevant bits have been moved to the other page.

What's this phase all about?

Multiplayer is fully playable at this point, but still has a variety of glitches and doesn't have all of the features that we intend to have in the long term. So hence it still being in alpha status. But we greatly welcome folks to play, and hopefully give us reports on what is going wrong if something does go wrong.

We expect to be to a fully-polished non-beta status for multiplayer in November or December, if things continue as they have.

Our second expansion for the game, Zenith Onslaught, has a whole heck of a lot of it completed, but still needs more doing. Badger has done all of his parts for it, and has retired like Puffin before him, so at this point we are down to basically a one-person show again (me, Chris) on bugfixing, finishing multiplayer, finishing my parts of DLC2, and finishing the last of the kickstarter obligations. So if the schedule slips some, it's likely because I had trouble juggling that, or wanted extra time to make things truly shine, whichever. But at the start of this phase, things are feeling very positive.

Version 2.631

(Not yet released -- we're still working on it!)

  • Fixes to when GetIntValueForCustomFieldOrDefaultValue or GetValueForCustomFieldOrDefaultValue have empty strings in them, to where they will now return the default values properly.
    • Thanks to NR SirLimbo for identifying the problem and likely fix.
  • Kaizers Marauders fixes:
    • Fixed another exception in relation to missing settings. Tracing the issue back lead to finding out that Vanilla GetValueForCustomFieldOrDefaultValue() sometimes still does not return the actual default value but an empty string. OnS0_KaizerUpdating() now detects this and produces an informational popup before correcting it to "Never" which is the actual default value.
    • Debugging lead to the discover of a bug in the Budget Updating logic where (due to the same issue) they would every second set the starting budget of [nothing] without ever beginning to accumulate budget. They now start with 0 and begin accumulating.
      • Thanks to Isiel on Discord for reporting and delivering a save to reproduce these issues with.
  • Fixed an exception that could happen in RemoveInvalidatedOrdersAndReturnFirstValid_IncludingDecollision() somewhat at random on multiplayer clients, mainly as a race condition.
    • Thanks to crawlers and Driftwood for reporting.
  • For whatever exact reason, the Macrophage faction really doesn't work well if the client is also trying to calculate all the decisions for things in multiplayer. This is referring to the DoPerSecondLogic_Stage3Main_OnMainThreadAndPartOfSim() method in general, but the telium spawning logic in particular.
    • Since this was a constant source of errors, and since the desync repair code should catch things like this quickly in general, for now we're just not running this on the client at all anymore. This stops the errors, and any divergences should be quickly and easily picked up by the desync repair logic.
    • Thanks to crawlers and Driftwood for reporting.

Version 2.630 Arbitrary Icon Inclusion And Weapon Exclusion

(Released November 11th, 2020)

  • Add death effect damage a unit has sustained into the tooltip for it at or above Medium detail.
    • Each type of damage is listed separately, and displays the current damage, and the amount required.
    • Thanks to Puffin for adding.
  • Fix a Macrophage typo
    • Thanks to crawlers for reporting
  • Fixed a bug in Astro Trains where they were looking for a nonexistent variable in their custom xml. This was always a harmless bug, but newly showed an error while in the past it was silent.
    • Thanks to ussdefiant60 for reporting.
  • GetDefaultValueOfWhateverSort() on the SpecialFactionData object has been updated to match the way that the default values were returned on the faction screens.
    • Thanks to NR SirLimbo for reporting that this was not working consistently.
  • The CustomFieldValues array on faction objects is now private, so that people don't try to directly add or find data from it.
    • Instead, mods and factions and whatnot should set data through SetCustomFieldValue (which works the same as before), and they should get data via either GetCurrentIntForCustomField() or GetCurrentStringForCustomField().
    • Both of those latter two methods have a method that lets you pass in the specific field (more efficient), or which just takes the name of the field (less efficient).
    • Either way, the idea is that there's never confusion with not getting the default value back when there is a blank present in the main data (which might be an old savegame or quickstart, or various other valid conditions).
    • Thanks to NR SirLimbo for finding this accidental modder-landmine for us.
  • Fixes for Kaizers Marauders:
    • Instead of failing horribly when added as a Random Faction, or when loading older saves where old Marauders were enable (be it just as a beacon), which includes quickstarts they will now use somewhat defaulting values. It's not perfect, and not really intended for use this way (simply because of the sheer amount of options available) but it works.
    • Fixed a potential issue with Debugging global stuff for Marauders (such as logging Kaizer Updating or the Shared Planetary Cooldown List) where the debug could be turned on, but when only a specific Marauder Faction was set to be debugged it could re-overwrite with false later on, leading to no printouts.
  • Remove mentions of 'tiers' from the scourge unit hovertext, since it was confusing peoople. It was only ever a cosmetic thing.
  • Suppressed a pair of harmless-but-annoying exceptions that could show up in your log files if you were shutting down the game from the main menu in just the wrong way. These were related to the Slate cutscenes trying to stop at the same time they were being eaten alive by your OS taking back its memory. All is well, no need for a dying scream.

Fix To Ship Weapons Mismatch

  • Added a new ArcenNonTableUniqueStringList class, which we can now use for keeping lists of arbitrary string that we want to serialize.
    • We're going to be using this for entity systems.
  • EntitySystemTypeDataTable has been removed, and EntitySystemTypeData no longer inherits from ArcenDynamicTableRow.
    • This was really old logic, and is the one instance in the codebase of us really not using dynamic table rows properly.
    • The result was slow during startup, in the best of times, and more recently it has been actually scrambling up the data for systems between different ships! That latter part may be new in the last few builds, or it might just be more common. Either way, this has needed a shift for a while.
    • The EntitySystemTypeData no longer has an InternalName, but instead has InternalName_Original (which is just the raw xml name like FusionBomb), and then an InternalName_Longer (which is the entity type appended in front of it, like "Mugger_FusionBomb").
    • The new serialization for these by index uses the shorter name, which just makes savegames a bit smaller. But it doesn't really matter what is used in the longer-term effect, because these are no longer stored in one central lookup. They are now properly full sub-entities of the GameEntityType.
  • With this change, shockingly, we have still NOT solved the issue of things like Mugger frigates sometimes getting Brawler weapons. So that's going to need even more investigation.
    • This overall change is still worthwhile, as it shrinks future savegames a bit (not ones from prior versions saved in the new build, though), and it also makes loading the initial game program a bit faster and less prone to potential issues... despite still having this particular issue.
    • Note from later: this actually solved 90% of the problem, but there was still a case of us managing something slightly wrong that let it keep bleeding over. So the last 10% is below.
  • The "copy_from" tag, which was never used on entity systems inside an entity, and which probably would not have worked well there if it had, has been removed.
  • Fixed a bug where our "dump data tables on load" debug option was no longer working (the hotkey was, but not the on-start version).
  • Fixed a very peculiar issue that only affected a couple of unit in the prior version (in the main game and DLC, anyhow -- more may have been affected in mods) where if there was a unit that had its systems altered on a child, and there were then other co-children, the other children would sometimes get those altered stats and sometimes not. Normally it should just pass to grandchildren and so forth, not to siblings.
    • Essentially, the way that we handle partial records is normally very explicit (is_partial_record="true"). And in fact, when we have a partial record like that, we WANT for it to inject itself into any other descendants later.
    • But in the case of entity systems, we have this kind of implicit "child partial record" system going on, where you just name the same system in the child as you had in the parent, and make some changes, and those changes then keep going in that lineage.
    • What we do NOT want to have happen is the siblings to also pick up those changes, which is what was sometimes happening here because of the funky way that we handle systems and systems alone in the game.
    • From looking at the raw data, without mods in play this mostly just affected muggers and brawlers, and a few spider turrets. Most everything else was already consistent properly. But if you play with mods on, you may have seen a lot of other chaos happening beyond these particular ones.
    • Thanks to crawlers, Ovalcircle, Spaz, Puffin, and Darkshade for reporting.

Work To Allow Arbitrary Sprites In Game Text, Part 2 (Complete!)

  • The sprites in TextMeshPro have been updated so that their default index is 0, not -1. That way if no sub-name or image is specified, we are still able to figure out where they are.
  • We don't use the mspace monospacing markup, so we're keeping things simple and redefining that to mean "no advance"
    • This essentially lets us put <mspace>around things we want to all be on top of one another</mspace>, which is really useful for our compound icons.
  • Since we already use non-atlased sprites in every location in the UI, and have those present and available as needed, we're just going to go with that for the TextMeshPro sprite embeds as well.
    • There aren't any sprites that we only have in atlases but not also in asset bundles directly, although there are ones that are loose and not in bundles.
    • With that in mind, this lets us avoid the glyph metrics that were working so poorly with our sprite atlases, and the efficiency of the whole thing is not much changed given how compositing on the UI works and how infrequently (overall) we include extra sprites.
    • This actually turned out to be a particularly good move, because what we've discovered is that if there are two different sprites used in a single text area, the following happens:
      • The draw order is based on the order of the first sprite dictionary used that is shared, not the order of the sprites in the text.
      • When multiple sprites are in one dictionary, this can lead to funky results. When there are single sprites per dictionary, the only time this can mess up is when there is a single sprite used more than once AND you want them to overlap one another.
      • It's worth noting that we don't care about the order of sprite drawing, normally, except for the new mspace markup.
  • The new custom TextMeshPro dll has been updated (by building the WorkingTextMeshPro project, as silly as that is) and the result has been put in ReliableDLLStorage so that we can compile against it and use those capabilities in ArcenUniversal, etc.
  • The copies of TextMeshPro code for the other three main projects that use it have all been updated to match the new capabilities.
    • This won't work in the main game build until it actually has a build done, though.
  • Added a new TextEmbededSprite and TextEmbededSpriteTable table, which are in ArcenUniversal and PARTLY filled by xml entries from the new TextEmbededSprites folder.
    • The rest of these are able to be filled programmatically as we load sprites from other locations, specifically when it comes to ships by name.
    • The purpose of these are to define sprites that can be used inline in text for improved display purposes. You can expect to see us doing more of this over time now that we finally have the capability.
    • It is possible for an auto-added sprite in here (such as for a specific unit type) to manually get some tweaks by adding xml for it. The order of that happening does not matter, which makes the system extra flexible.
      • This does mean that, because of the lack of order mattering, this table intentionally allows for malformed entries (those defining some metadata but having no actual sprite assigned). That's a necessary byproduct, since other parts of the code are assumed to add those sprites later, but might not do so if they were themselves removed.
    • bundle_name and filename are optional, and specify the location of where to directly load the Unity Sprite or Texture2D from during game load.
      • These are NOT used in cases where another class (like GameEntityTypeData) is creating new TextEmbededSprites on its own. In those cases, the sprite or texture2D is sent from the other class.
      • In the case where these ARE used, we need to know whether we can load it as a Sprite (ideal) or a Texture2D (slightly slower). The xml tag bundle_target_is_texture2d defaults to false, and so tries to load the target as a sprite. Anything used elsewhere in the UI would work this way. But if you need to load a Texture2D and make a Unity Sprite out of it at runtime, you can set this to true.
  • Added a static CreateRuntimeSpriteFromTexture2D() method on the TextEmbededSpriteTable, which takes in a Texture2D and returns a Sprite.
    • This is something that is particularly useful, because it keeps track of ones that were previously created, and reuses them rather than creating extras. This can only happen on the main thread.
  • About 50 initial sprites have been set up as text embedded sprites for use coming up.
    • There is more metadata that we want to get in there, plus some other things to make these as simple as possible to call on, and we need to actually cross-wire this to the new TextMeshPro stuff that we worked so hard on. But that will come tomorrow.
  • Fixed the AIW2ModdingAndGUI project so that it now has the proper TextMeshPro code embedded within it and so that it won't erase our customizations every time it is reopened in the unity editor.
  • Fixed the WorkingTextMeshPro project so that it now has the proper TextMeshPro code embedded within it and so that it won't erase our customizations every time it is reopened in the unity editor. This is how we build our custom variations on that code, and now we're not at risk of random regressions from unity package manager automatically wiping our changes.
  • The following float options are now available on any of the text embedded sprites for manipulating how they fit into the text they are embedded in:
    • x_draw_offset, y_draw_offset, width_draw_offset, height_draw_offset, advance_draw_offset.
      • All of those do the basics of what you might thing in tems of adjusting how the sprite draws, while advance says how much space to go over before the next character draws (or how it plays into word-wrapping or whatever else).
      • All of these are in fairly abstract units, where roughly something like 100 is about the height of a line, regardless of how many pixels that line actually is.
      • Most of the time you won't want to mess with these at all, but in some cases you may want to adjust the vertical centering by using y_draw_offset in particular. Beyond that, most people would not use any of these.
      • Frankly, to get the kerning of the strength icon working perfectly, we will probably add a few more dials to this soon.
  • Our TextEmbededSprite sprites are actually loaded up into TextMeshPro sprites now, completing the main integration of arbitrary sprites.
  • default_color_hex is a new string option available on the text embedded sprites, for allowing a default color to be applied to sprites.
    • Please note that, unlike sprites we had in the past that were based on vectorized glyphs inserted into a wingdings-like font, these sprites can be full-color to begin with.
    • The one "downside" is that these sprites can't be infinitely zoomed-in-on like a font, but that's hardly a downside given that we could render these crisply on an 8K monitor or more.
    • The default text colors are nice for purposes of things like resource icons that are embedded in text.
  • For now, ArcenFormatting has been updated to stop using the old font-based resource sprites, and now use the new TextEmbededSprite sprites.
    • This is a major jump up in quality in general. Also, now all of the resource icons properly match all throughout the GUI.
    • One thing to note, however, is that these sprites no longer inherit the color from their parent font.
      • So, in order to match the text color properly, we needed to add ArcenExternalUIUtilities.GetStrengthIconWithColor_Wasteful(), which hits the garbage colletor, and ArcenExternalUIUtilities.WriteStrengthIconWithColor(), which does not (use the latter if at all possible).

Main Menu Further Refinement And Expansion Logos

  • The planet that scrolls by in the background of the main menu sometimes has been removed, as it was having some glitchy effects on it that we definitely did not want. In the end, we don't really need the planet in order for this to be a very interesting scene as it is.
    • Thanks to Badger and others for reporting the problem.
  • The material properties of the main game logo have been updated substantially so that they look more natural in the light and shadow of the main game.
    • Thanks to Badger for suggesting.
  • The main menu now has logos for all three of the current and upcoming expansions, and they are more lit-up if they are on (installed and enabled).
  • The AIWarExternalCode library now links against ArcenThirdPartyCode so that it's able to make changes to certain things in the front-end game.
  • The main menu now uses a hook to go in and find our custom BetterRotationScript on the background that spins the space skybox, and slows it down substantially compared to prior releases. This saves us the wait of a 40-minute rebuild process, and in theory actually would let us have a variety of random rotations if we felt like it.
    • Thanks to Badger and Asteroid for suggesting.
  • In fact, since we can, the rotation of the stars in the main menu is now entirely random, but at a much lower overall speed than it was before. It can rotate at a combined maximum velocity that is still only 3/4 of what the prior maximum speed was, and almost all of the time it will be vastly smaller than that.

Version 2.629 Ship Cap Hotfix

(Released November 10th, 2020)

  • Corrected the OpenGL launcher script on GOG, thanks to GOG support (it was our error -- thanks to them for figuring it out!).
    • It appears that the issue didn't affect all flavors of linux, but it certainly did affect some.
    • Thanks to rudhek for reporting.
  • A simple typo was breaking all of the xml parsing for sub-lists of data of the following types (unless they had the requirement of IsUnique on): fint, arcenpoint, vector2, vector3,
    • Most of these were new or unused in general, but fint was not new and is used for the scaling of ship caps in the game, as well as for the engine stun seconds progression.
    • All of our other list parsing, which are more commonly used, were all working fine.
    • Thanks to Wuffell, ArnaudB, ThyReaper, and other for reporting.

Version 2.628 Mod Proliferation

(Released November 9th, 2020)

  • Fixed a bug where the Tame Macrophage Hack was not correctly responding on certain Quickstarts.
    • In actuality, the Enraged subfaction was entirely missing from those quickstarts! Very bizarre.
      • Thanks to Smidlee and Metrekec for the bug report and saves for testing, and StarKelp for fixing.
  • Fixed Cloaked Transport Flagships from starting fleets having the default transport direct tech upgrade costs instead of the higher ones that captured cloaked transports do.
    • Thanks to NR SirLimbo for fixing.
  • Adjusted the amount of Combat Engineers Support Factories get for both starter fleets and captured fleets, balancing them a bit and bringing both spawned and captured fleets more in line:
    • Rejuvinator: 8-13 (starter fleet remains at 10)
    • Overloader: 4-7 (starter fleet changed from 3 to 6)
    • Everything else stays the same, but the Combat Factory starter fleet goes up from 6 to 8 engineers
    • This hopefully kills the bug where Combat Fleets spawn in with 2 Sentry Frigates too.
    • Thanks to NR SirLimbo for making these changes.
  • Added 2 more tiers to Metabolization and Greater Metabolization in preparation to additions to ESV.
    • To clarify: This is NO new types of Metabolization but simply new conversion ratios damage/shot -> Metabolization points. By default Gangsaws for example deal 10x as many Metabolization points as they dealt damage.
    • The new tiers are "BigMajor" for a conversion ratio of 5x, and "SupportWithoutDPS" for a conversion ratio of 50x.
    • Thanks to NR SirLimbo for adding.
  • Some minor buffs to Shark B
  • Fix a typo in the Mesopotamia planet list description
    • Thanks to Lord of Nothing for reporting

Included Mod Updates And Additions

  • For modders reference: rename BadgerFactionUtilityMethods to FactionUtilityMethods.
  • Disabled mods and/or expansions that are installed on your machine no longer temporarily show up as enabled for just a few moments during the initial load of the game. That was confusing.
    • The Settings from any installed-but-disabled mods and expansions ARE loaded, so that those can be kept properly if you are enabling and disabling mods over time, but those are the only parts loaded when they are disabled.
  • KM / AMU mod fixes:
    • Fixed a very strange bug about fireteam debugging where for some reason it couldn't find the Fireteam.GetDangerOfPath() function.
    • Hopefully fixed another very strange null ref exception in the Marauder LRP
  • Civilian Industries mod:
    • Fixed a bug where Fireteams were being rude and not letting civilians use their danger pathing code.
    • Optimized a few pieces of code to hopefully help with the performance issues some people have been recently having.
  • Fixed a literal 1-symbol-bug in Kaizers Marauders where they would not accumulate AIP but instead reset their AIP to the most recent increase.
    • This also lead to the discovery of a bug for the Debug Mode where Marauders produce and use real AIP that multiply AIP by the number of AIs present.
    • Thanks to ussdefiant60 for noticing.
  • New content for the Extended Ship Variants mod and its counterpart for Fallen Spire. Do note that the latter now requires the base ESV installed!
    • Extended Ship Variants:
      • Added 4 new types of Transport Flagships: Engineering (hybrid between a stronger engineer and a transport), Vanguard (hybrid between a Vanguard and a transport), Tugboat (has small drones accelerating everything to at least 700 speed and can slow down enemies) and Target Painter (long-range beam that amplifies damage dealt to a single enemies)
      • Added 3 more types of Mobile Factories: Metabolizing (launches Metabolizing drones), Rescue (creates rescue-beacons that can revive ships), Translocator (good AoE explosion that pushes small ships back and paralyzes them)
      • Added 6 new mobile starter fleets with ESV ships and transports included into them.
      • Added 5 new support starter fleets, 3 with ESV mobile factories and 2 with vanilla mobile factories that did not have a starter fleet before
      • Buffed the Agile Transport: +25% speed on entering a new planet for 5 seconds, -50% damage if attacked from >= 5000 distance, 21 gx engine to resist Black Hole machines
    • Extended Ship Variants for Fallen Spire:
      • New Transport Flagship: Cyber Command (reduced hacking response, much more expensive, much more fragile hull but decent shields)
      • New Mobile Factory: Acidic (launches drones spreading acid onto enemies)
      • New Mobile Starter Fleet: Hacker Fleet (designed to deal with AI hacking responses)
      • New Support Starter Fleet: Combat Engineers and Acidic Factory
  • Increased the timer on Kaizer's derelict to allow for a longer time period to save him. Instead of 1% health per second he now loses only 0.3%, which grants 334 instead of 100 seconds time to save him if the player so desires.
    • From a discussion with SilverLight on Discord.
  • Updated Kaizers Marauders to be compatible with this new AIW2 version (no functional change) so players should be able to hop back in as soon as the update drops, without having to wait for an update of the mod in response to an update of the game itself.
    • Updated the source files on AMU.
    • Worth noting that the Civilian Industries mod did not actually need an update for this new version because it didn't happen to be using the features that changed.
  • Fixed a type mismatch now exposed through the new External Constant Loading in Kaizers Marauders: AIAlliedInvertedTechBonusFactor was declared as FInt, but loaded as int. Is now also declared an int so it works.
    • Curiously this didn't seem to have any impact on the mod in any way... Strange, but ok.
  • ExampleMod and ExampleMod2 have both been removed from the game, as they were utterly pointless at this point.
    • There are more and better ACTUAL mods of all sorts for you to look at if you're thinking of getting into modding.

New Micro Mod Collection By NR SirLimbo!

  • Added the Micro Mod Collection mod to the off-by-default mods.
  • Currently adds:
    • 4 types of Distribution Nodes: 6m metal for 1 AIP, 45 hacking points for 2 AIP, 3k science points for 3 AIP, 4m metal/30 hacking points/2k science points for 4 AIP.
    • Energy Converters (10 for Home Command, 5 for every Economic Command Station) that convert 50k energy to 150 metal/second
    • Research Expedition: Mobile science/hacking gatherer that can speed up gain on owned planets but also extract from allied/neutral worlds, scout adjacent planets and at higher levels decloak/cloak itself. Fragile, high-priority target for the AI, producing 20 AIP on death.
    • Reinforcement Seeder: AI ship dropping Minor Reinforcement Warp Gates that increase planetary reinforcements by 5% per gate.
    • 3 types of AI Command Stations with escalating levels of strength: Gravitic (slow aura), Tachyon (decloaking aura) and Pulsar (periodic paralysis aura).
  • Balance and general feedback required and sought after!

Work To Allow Arbitrary Sprites In Game Text, Part 1

  • Added a working testing project for altering TextMeshPro, while retaining compatibility with all the various unity scenarios in which we use it.
    • Attempted three different ways of updating it to have new sprite embeds, but so far those methods were all a bust. Going to try another method of injecting our own sprites, instead, and for that we need to start basing our things on having some sprites and then shoving them in. Thankfully we have a nice little isolated test project for this, which now has some added info in it.
  • Added some code in ArcenXml that lets us parse xml directly from TextAssets, mainly for testing.
    • This is also used now in parsing the sprite dictionaries that we are creating via TexturePacker.
    • Also set things up so that we can now have sprite dictionaries that are a single sprite loaded directly from a unity-style sprite with borders, etc, intact.
      • This is useful for some of the other new icons-in-text that we want to do.
    • The general purpose of this is partly for test loading sprites of two different categories in a way that we can start trying to get them into TextMeshPro programmatically, but this also would be used long-term once the testing phase is past.
  • Made a change that makes it so that if a sprite material is destroyed (such as one that was created at runtime in the unity editor) it will now just display as a blank image rather than throwing errors inside TextMeshProUGUI. This is mostly helpful for our own internal testing of our injection of our custom sprites into TextMeshPro's rendering pipeline.
  • References to ArcenSprites are now stored on their parent ExternalIconDictionary.
    • We never needed this before, but now that we are translating entire dictionaries into use for TextMeshPro, it's a thing.
  • TextMeshPro has been expanded to allow for us to inject our own images at runtime, from any source (not just Resources, but rather asset bundles and whatever else).
    • We can inject unity Sprite objects, unity Texture2Ds, and our own custom ArcenSprites in their entire ExternalIconDictionary.
    • This new capability is set up so that we can also control things like how they are scaled and offset, and essentially how the kerning works.
    • Whether we use all those features or not is not really relevant, but it's good to have options.
    • This is far more powerful than our old method of drawing images in text in TextMeshPro, which was limited to a special "Arcen Icons" font where we had vectorized some of our icons into a font format and were using that to draw icons.
      • In some respects that was nice because that gave us infinite zoom on those icons, and now we're using raster images with a fixed maximum resolution, but those other icons really did not behave well when it came to trying to line up with varied fonts. Often the offsets and kerning were terrible, and updating them at all required a rebuild of the central game executable, which is time-consuming to say the least (that's about a 40 minute wait).
    • This new approach allows for images to be inserted into text by mods, let alone just our own code.
  • We don't yet have the new TextMeshPro stuff integrated into the main game, but it should be tomorrow.
    • For now, we've got our new data formats and are testing the last of the capabilities we need, and trying to make sure that our sprite dictionaries translate properly to theirs, which is so far not quite working right but getting close. Single images are working great.

Giant Overhaul Of Xml Parsing For Accuracy And Speed

  • exclude_children_from_copy was not an xml feature we were using, and it was slowing down xml parsing in general, so we've removed it.
  • The way that child nodes and attributes are determined to NOT be copied in xml is now vastly more efficient, and doesn't involve any GC churn.
    • This should lead to more accuracy when we pair it with some other changes, as well as faster loading times in general once we finish with our changes.
  • Really substantial xml processing speed improvements during game load. These have to do with our checks to make sure that the xml is correctly formatting and we are importing all the proper nodes.
  • The way that attribute-checking is logged and verified is now vastly more efficient than it was, so again loading is faster in the initial part of the game.
  • The xml parsers that were able to give back a list of children no longer do; there are instead DoForChildren methods that don't require a hit to the garbage collector, and which also make it so that they don't have to be wrappered more than once.
    • This is substantially more efficient in several ways.
  • Instead of copying xml attributes and nodes from parents to children in partial records and copy-from records, these are now linked, and calls like GetBool() and similar are able to process through them much faster and with accuracy.
  • Added a new EqualsCaseInvariant() overload to strings based on ArcenUniversal.
    • It turns out that this is very slightly more efficient than doing a ToLower() and comparison to the lower-case version.
  • Our xml parsing now gives visible errors when trying to parse integers that are not valid integers. Before, it was just failing silently and returning the default value.
    • GetInt32List was removed from our xml parsing, as it was inefficient and not something we've been using in AI War 2 in general. This was generally used in some of our older titles.
      • Same with GetInt16List, GetByteList, and GetFloatList.
    • Also, a variety of duplicative methods that were concerned with complaining if a value was missing-or-default have been folded into the main methods for getting from xml. We also now only complain if the value is outright missing, as in basically any case where the default value is specified that is an intentional thing.
      • We have now removed the ComplainIfAttributeNotFound() method, since that was only used when we were looking at complaints about "missing or default, but actually default is fine." This makes for far cleaner code.
  • Our xml parsing of vector3s is now much more efficient, although we do not process those very often anyway.
    • Our xml parsing of FInts is now a bit more efficient, and that is processed extremely often.
    • Our xml parsing of enums is now a bit more efficient, and more normalized (same with FInt actually), as these are processed very frequently.
      • One change that may affect mods is that FillEnumIfPresent has been removed, and is now just FillEnum. Assuming you pass in false to ComplainIfMissing, it will act as you previously experienced.
      • Another is that FillEnumAndComplainIfDefault has been removed, so now you'd just use FillEnum and pass in ComplainIfMissing as true.
        • This is technically a difference in functionality, because this only checks to see if something is missing, not if it has a default value (usually None or whatever).
        • Generally speaking, our experience has been that if someone sets up a default value in xml explicitly, then they probably have a reason to do so. We've been having to work around this with reading in xml in general, and now it doesn't complain about explicitly-set defaults with other data types, either.
        • This should not negatively affect anything current, as any xml that was "invalid" by the old standard would have been complained-about already and preventing clean game launch. Any new xml that is created in such a fashion is probably on purpose.
      • We also got rid of GetStringAndComplainIfMissing(), which had basically the same sort of issues. Just use GetString() or FillString() and complain if it's missing, but if someone sent in an empty string from xml, they probably meant to.
  • The way that we were previously handling "custom data sets" on xml rows was incredibly slow as well as kind of brittle, particularly when it came to modding.
    • This is seeing an entire rework, with the pattern for getting custom data becoming far simpler (but also more powerful, as mods and copy-from and partial records will now work correctly in all cases).
    • First of all, the CustomDataSet class and all its methods have been removed in general. ParseCustomDataIntoSet() and GetCustomAttributeNames() have also been removed. Also the CustomDataLookup class.
    • Custom attributes are instead something that code is able to parse as-needed later on from the xml, and the "requested attributes" code just ignores anything that begins with "custom_"
  • The ExternalCoreConstants, which was not actually used for anything, has been removed.
  • Vector2 xml processing is now consistent with Vector3, whereas before it had only a subset of the capabilities.
    • Same with ArcenPoint.
    • AngleDegrees has instead just been removed, as it's not something we use and we can store that in different formats more easily.
    • Loading DynamicTableRows from xml has also been given full parity, and in addition to that they are now able to take empty commands now to set null instead of the prior row reference. This is a new ability.
  • We were previously using various forms of XmlElement (which is a built-in-class) manipulation in order to handle copy-from and partial records cases.
    • This was not appearing to work as expected, and at any rate is generally something that is probably pretty slow.
    • We are removing our TotallyReplaceContentsOf, CopyAttributesIntoBlanksOf, and CopyChildrenTo methods entirely.
      • The CopyChildrenTo, which affects child nodes, had some notable strangeness that it was overcoming when nodes were being copied from one document to another (aka two different xml files). We just don't need that sort of hassle.
  • The ArcenXMLElement RawElement entry on ArcenDynamicTableRows has been renamed to be OriginalXmlData instead.
    • This is far more clear, and is going to be very key for the later forms of parsing that we're doing.
    • ArcenXmlElements now have private DirectParentsICopiedFrom and PartialRecordsLaterAppliedToMeInOrder variables that get set as-needed. Internal processing handles these properly so that end-user modders or developers don't have to think about these details.
      • These help to ensure that data is applied in the correct order, as intended, and that the data can be reconstructed as needed.
    • HasAttribute() has been removed from ArcenXMLElement, and instead we have GetMostRecentAttributeValueIncludingParentsAndPartials() and GetMostRecentAttributeValueFromSelfOnly().
      • This will seem inconvenient in a variety of places for modders, but it saves us a ton of extra read calls into a potentially expensive method (especially now that we properly handle xml inheritance). Just read the value once, if it's a string, and if it's blank or null then that's your answer. Or use any of the fill methods and just say you don't mind blank entries (or only do if it's not a partial record, your choice). It will fill things properly.
    • During the read of nodes, it now causes either RegisterMyDirectParentsICopiedFrom() or RegisterAPartialRecordAppliedToMe() to be called, and/or OriginalXmlData to be set.
      • From looking at this, in the past versions, most likely OriginalXmlData (aka RawElement) was probably being overwritten improperly once a partial record was applied, and this was probably where our errors were coming from in parsing certain mods.
    • Additionally, if a single xml record is defined as being both a partial record and a copy-from record, it will now throw an exception. That should not have actually been the case on any, but now it should check on them properly.
  • On ArcenAbstractExternalData and its descendant classes, like ExternalConstants for instance, there is now an ArcenXMLElement OriginalXmlData property.
    • This one works just like the one on rows, although in this case it's just used for partial records, mainly (there are not child nodes, and there's only one root node in these files).
    • This then lets us make direct calls to GetCustomFInt_Slow() on the ExternalConstants singleton and similar in order to get "custom" xml data that is added belatedly, as we see for a lot of the faction data and mod data.
    • This particular change will require changes to most mods, as the CustomData by namespace and all that is replaced by far more direct and efficient calls here, now. Though if the results are checked with any frequency, you should still be caching them for sure.
    • We are using wrappered methods, rather than giving direct access to OriginalXmlData, in order to control error handling and make sure that if your mod is looking for a field and fails to find it, it will yell.
      • Bear in mind these particular fields are not found at game launch, but rather whenever the faction or mod initializes. So typos are likely to be cause errors during first unpause with a faction present, rather than during load of the initial game like everything else.
      • The extra error handling that is in this is absolute crazy, incidentally, so if you're not getting the result you expect, then you automatically get an entry in the log with the details of what was present so that you can figure out what your typo was.
  • With external constants and similar dictionaries, it now ensures that the base data is now read in before any partial records are read.
    • It seems like someone was referring to this being hard to mod, and this would likely solve that. At any rate, with our new more-strict reading this also became needed in general.
  • With the new XML parsing, the game does a far better job of reporting problematic data from xml (aka something like a floating point number being imported into an integer field).
    • Why this was not working properly before is a bit of a mystery, but it works now, which is the important thing.
    • There were several bits of rogue data that we've thus fixed, including the amount of extra intensity the scourge gets from human science amounts. This may have some balance impact on the scourge, as those values were probably previously reading in as zero.
  • Full list of data fields now corrected that were previously not reading in properly and thus probably affecting faction performance in some fashion:
    • Scourge difficulty:
      • AllowedBuildersIncreasePerScienceUnit (was always 0 because of type mismatch)
      • BuilderIncomeIncreasePerScienceUnit (was always 0 because of type mismatch)
      • SpawnerIncomeIncreasePerScienceUnit (was always 0 because of type mismatch)
    • Human Resistance Fighters
      • RatioForFriendlyPlanet (was always 0 because of a typo - RxatioForFriendlyPlanet)
  • In the event of partially-mangled data from entity systems, the game now does a bit better job of reporting clearly what the problem is with the xml and setting some general defaults rather than just starting in a completely invalid state.
    • This is most notably with a missing range being set on a system.
    • Additionally, we've added a new WriteSystemDataToLogDueToError() onto GameEntityTypeData, to let us see what the state of all systems on an entity are when a problem arises.
  • There was some funkiness in how some of the passive systems were looking for ranges that they did not need to have, in ComputeBalanceStats_OneTimeOnly(). Those have been corrected/
    • This is a case where we wonder how this was not causing errors in the past, but whatever. Again, it works now.
  • Further cases of fields that had malformed xml and thus did not read in properly:
    • Settings:
      • Windowed Mode Window Height maximum (typo of case Max instead of max led to it being infinite rather than 7000).
      • Kaizer's Marauders Marauder_DebugID, same typo of Max.
      • Hidden field of FullscreenHeight, same typo of Max.
      • Kaizer's Marauders Marauder_FireteamDetailLevel, same typo of Max.
    • AI Types:
      • SimpleEnsemble was not having its type_Difficulty read in, because it should have been type_difficulty
  • The game now allows any fullscreen resolutions that your OS/hardware reports as being available.

Version 2.627 Hotfix

(Released November 5th, 2020)

  • Hopefully make Warden fleet ships less likely to turn to the Hunter when in combat
    • Noticed by a lot of people
  • Make reconquista a bit less one-dimensional.
  • Fix a bug where the galaxy map was showing the wrong faction colour for enemy units.
  • Fixed a bug in the prior version where the scrollbars and scrolling in any dropdowns was not working.
    • Thanks to JonnyH13, Karchedon, and Badger for reporting.
  • The selected status of the stance buttons in the bottom left of the screen have been adjusted once again in order to be dimmer and less distracting.
    • Thanks to Metrekec and crawlers for reporting.
  • Balance Adjustments to Kaizers Marauders:
    • Changed the budget income modifiers per intensity to be based off the 0.4 + (AI income/1.5):
    • Also increased higher-intensity base defense buildup cap: Medium Intensity from 40 strength to 50 strength, High Intensity from 70 strength to 125 strength to make them more defensive.
    • When their budget was increased gradually to compensate for the high growth of strength that high-ranking AIs had it made them too powerful when fighting lower-intensity AIs.
    • Now, hopefully, Kaizers Marauder intensity roughly follows the same scaling as AI difficulty, but lower ranks are still supposed to expand further and by comparison are stronger.
    • When picking the intensity for Kaizers Marauders I suggest: Think about their most likely adversary (the AI) and their difficulty as a base line, potentially increase to compensate higher-difficulty AI types and other minor factions to fight.
    • Kaizers Marauders definitely need balancing feedback!

Version 2.626 Kaizer's Marauders

(Released November 4th, 2020)

  • Underlying mechanics now available for mods, but not used by any units at the moment:
    • Added the Classic (AI War 1 style) Hydra regeneration and Hydra Head mechanics.
      • Regeneration is done with: seconds_to_fully_regenerate_hull="" and starts after the normal repair delay.
      • Hydra Heads are done with build_points_per_damage_taken="" and unit_to_make_with_build_points_from_damage_taken=""
      • A head will spawn when build points = total health, / current mark + 1. So a MK1 unit will spawn 1 head at 50% health, a MK2 will spawn every 33%, MK3 every 25%, so on.
      • Current bugs with Hydra Heads: Build points are not serialised and so are lost on load. If a unit with a damage bonus shoots one of these, only the base damage adds to Build Points, not the bonus.
    • Thanks to Puffin for adding this.
  • Drone Fleets (Support Fleets, but most importantly Hive Golems) will now load their drones if ordered so even if enemies are on the planet left.
    • Thanks to NR SirLimbo for implementing.
  • Journals now allow for the insertion of [playername] in them.
    • Thanks to Badger for adding.
  • The FRS now uses a different icon from ARS, to avoid confusion and make it clear what is what.
    • Thanks to Badger for suggesting.
  • Combat Factories of all sorts no longer use normal drones like before (those aggro guard posts in an annoying way).
    • Instead, hidden drone launchers trigger if there are enemies within a certain range of the combat factories. Letting them defend themselves, but not aggro enemy guards just by being on their planet.
    • It's worth noting that existing savegames will still have both kinds of drones present -- those in the fleet, and those from the launchers. So they will be double-powerful but still annoying. Any new campaigns will just have the launchers properly.
    • Thanks to several people for bringing up this issue with combat factories, and Puffin for helping fix it.

UI Reskinning Part 4

  • There are still some little things we want to do with the UI, mostly in the "nice to have" category. The general overhaul is complete, in terms of improving things that were already there.
    • There are a VERY few cases where the old resource icons are used in text, but that should still be easy enough to figure out. We're going to sort that out with new icon-embedding capabilities sooner than later.
  • Fixed an issue where the border bar on the selected ships window would move up and down as that window got larger or smaller.
    • Thanks to Badger for reporting.
  • The glowing states of the following icons in the new UI has been dimmed some:
    • Attack move (leftmost item), pursuit mode, stop and shoot mode, hold fire mode, scrap button. Group move has been left alone.
    • Thanks to Metrekec, crawlers, and Isiel for suggesting.
  • We missed updating the map tab left panel in the lobby, but it now has a proper background and fonts.
  • Updated some prefab buttons so that things like the font in the Tips window now use the expected new font.
  • The visual style of dropdowns in the game has been updated to match the new style of buttons and other elements, and looks much more sleek.
  • The visual style of horizontal sliders in the game has also been updated to match the rest of the new stuff.
  • The tooltip backgrounds have in general been updated to look more like the rest of the new UI.
    • We are opting not to do specific graphics for the planets versus the ships, at least not built into the UI panels per se. We'll handle that stuff via image insertion in text, most likely.
  • The icons for metal harvesters, and energy generation sources, have been updated to the new icons.
    • Same with science (not used as a ship icon anyhow) and "metal to energy," which is.
  • Color improvements to notifications in the top bar.
    • Essentially, notification colors being based on the faction that is discussed is something that looks like it means something else. It looks like red is extra bad, or things like that. We are using color to mean something with the backgrounds and icons up there, and so the text also having color is just problematic unfortunately.
    • We are largely moving the color that was on the text to instead be in the tooltip text.
    • Astro train faction color moved from notification text to tooltip text for notification.
      • Ditto Dark Spire VG notification, although the timer colors are still there.
      • Ditto Dark Spire Loci notification.
    • Things were fully changed with the color from the tooltip for the Dyson Antagonizer.
      • Ditto exostrikes.
      • Ditto exogalactic wormholes.
      • Ditto AI eyes.
      • Ditto raid engines.
      • Ditto instigator bases.
      • Ditto Zenith Trader.
      • Ditto macrophages.
      • Ditto AI relic trains.
      • This was done previously for the Devourer.
      • Relic search was already fine.
      • Debris was already fine.
      • Imperial Spire was already fine.
      • Brownout was already fine.
      • Nemesis was already fine.
      • DLC2 AT civil war was already fine.
      • DLC2 Nm were already fine.
      • DLC2 Zm were already fine.
      • DLC2 Zb were already fine.
    • AI Reserves are keeping their colors for now, in their countdown timer, but if it looks bad or you have feedback on them, please let us know with a savegame.
      • The same is true for counterattacks. Additionally, the icon on these grays out when the counterattack is stalling. This may be confusing people, so we may change this up some.
      • The same is true for hacking notifications. Please let us know if the timer colors look tacky, but the faction bit got moved.
      • Also same for risk analyzers.
    • The planet attack notifications actually show the colors of the attacker and the defender, so keeping those makes a fair bit of sense. Let us know if it looks awful sometimes.
    • DLC2 AT warnings had some mild colorization based on severity, but we were already handling that with the background in recent versions, so the text color is now just always white.
    • Overall we need to do more things with the notification icons themselves very soon. This has been on our list since prior to DLC1.

Additional Space Backgrounds By Puffin

  • Thirty new space box backgrounds for planets created by Puffin have been added to the game.
  • Six new space box backgrounds for the galaxy map created by Puffin have been added to the game.

Revised AIP Mark Level Thresholds By Difficulty

  • The AIP amount required for an AI to go to a higher level used to be as follows: https://bugtracker.arcengames.com/file_download.php?file_id=15174&type=bug
    • We are making the following changes:
      • Mark 3:
        • Diff 4: 295 from 305
        • Diff 5: 275 from 295
        • Diff 6: 255 from 285
        • Diff 7: 235 from 275
        • Diff 8: 215 from 265
        • Diff 9: 195 from 255
        • Diff 10: 175 from 245
      • Mark 4:
        • Diff 4: 470 from 480
        • Diff 5: 450 from 470
        • Diff 6: 430 from 460
        • Diff 7: 410 from 450
        • Diff 8: 390 from 440
        • Diff 9: 370 from 410
        • Diff 10: 380 from 420
      • Mark 5:
        • Diff 5: 650 from 670
        • Diff 6: 650 from 660
        • Diff 7: 640 from 650
        • Diff 8: 620 from 640
        • Diff 9: 600 from 630
        • Diff 10: 590 from 620
      • Mark 6:
        • Diff 5: 810 from 820
        • Diff 6: 800 from 810
        • Diff 7: 790 from 800
        • Diff 8: 780 from 790
        • Diff 9: 770 from 780
        • Diff 10: 760 from 870 (the original was an error in general)
      • Mark 7:
        • Diff 6: 1100 from 1110
        • Diff 7: 1080 from 1100
        • Diff 8: 1060 from 1090
        • Diff 9: 1010 from 1080
        • Diff 10: 980 from 1070
    • Thanks to Ovalcircle for reporting the discrepancy, and to Badger for suggesting these numbers get a bit of a look in general.

New Included Mods By NR SirLimbo

  • Uploaded the AMU (AI War 2 Modding Utils) and Kaizers Marauders mods.
    • Kaizers Marauders is a new spin on an old faction gone, for lack of a better word, insane. Expect an entirely new Marauder minor faction with its own unique ships, turrets, superstructures, new and improved raiders and tons more. The forum thread is here: https://forums.arcengames.com/ai-war-ii-modding/mod-kaizers-marauders/
      • It started out as a request to the AIW2 devs to include journals. So I wrote some mods. Months later it's turned out to be a full rework with TONS of special stuff added and everything is in - except for a hand full of journals. Wow.
      • Some highlights: Unique Marauder ships, turrets, forcefields, etc. Most of these can be acquired by the player for themselves.
      • Some featured mechanics: A realistic metal economy, defectors, super-smart fireteams, tech upgrading, and even an alternate victory condition.
      • For more check the forum thread.
    • AMU is a requirement for Kaizers Marauders and consists out of modding functions to be used by various other mods, even further reworks I'm planning todo, as well as any other modder. It will get a full documentation and forum thread, but for now simply ping me on discord (-NR-SirLimbo) for debugging it. A partial documentation is already distributed, along with the C# project itself.

Bugfixes

  • Fixed Lone Wolf fleets being excluded from the ability to load ships. If for whatever reason (mostly mods) ship lines end up in Lone Wolf fleets they will now obey loading/unloading orders entirely and not hug the centerpiece perpetually
    • Thanks to NR SirLimbo for fixing.
  • Updated StarKelp Civilian Industries for the latest version of the game.
  • Fixed a race condition that could occur when setting militia caps.
    • Thanks to various people for reporting, most notably SirLimbo.
  • Fixed multiple places not having reservations for Lone Wolf fleets (both officer and golem):
    • CalculateContentsCount(bool IsForNetworkSyncCheck)
    • CalculateHasAnyContents()
    • GetStrengthOfContentsIfAny()
    • GetEnergyCostOfContentsIfAny()
    • Noticed and fixed by NR SirLimbo when unloading a fleet of Kaizer's Marauders-boarded ships began to cause brownouts...
  • For Extended Ship Variants: Fixed the Strike Wing having its damage bonus based on target time on planet, not its own time
    • Thanks to zeusalmighty428 for wondering why it was raid tech
  • Put in a fix for various of the new shaders for UI glows logging "doesn't have _Stencil property" warnings logged into the player.log.
    • We aren't actually using this property, but then again we're not allowing for these buttons to interact with stencils and masks and so don't need it.
    • Thanks to Puffin for noticing this.

Beta 2.624 Revised Resource Bar

(Released October 30th, 2020)

  • When AI units with Metabolization kill something, the AI now uses its extra metal to boost its reinforcement budget
    • Prompted by a discord conversation led by TechSy730
  • Tsunami CPAs are now the default.

Roguelike Changes

  • By default, the Esc menu no longer tells you what factions are in the galaxy until you actually encounter them in game. The goal is to give the game a stronger feeling of exploration and finding the unknown.
    • You can have the old behaviour by enabling the Always Show Factions option under Scouting in the game lobby
  • Add a new Quickstart, "The Rogue Badger" taking advantage of this. You won't know what factions are in the galaxy till you find them
    • Please don't load this quickstart into a game lobby or it will ruin the surprise.

Quality of Life

  • In an ARS, GCA or fleet you could capture, the number of ships for a given ship line is now coloured to let you know how good the roll was
    • If the number is a bright green you rolled close to the upper-end of ships you could have. If its a dark green, you rolled closer to the lower end.
      • Only applies to newly started games
    • Thanks to ParadoxSong for pointing me in this direction
  • Capturable flagships adjacent to the player homeworld will always get good RNG with how many ships it has.
    • The goal is to make sure the player gets something to be excited about early. Also to make it harder to have games that are screwed by bad RNG
  • The selection window now shows the strength of the selected units
    • Thanks to TechSY730 for suggesting
  • Improve the hovertext for factories for more clarity. The name of the fleet now indicates how many losses it needs to rebuild
  • Improve the AI Reserves notification
    • If there are no wormholes spawned, it gives you the countdown of seconds until a wormhole spawns
  • Autosaves are now in a more readable format
  • The objective hovertext for ARSs is now in a better style
  • If you double-click a fleet's keybinding while in the galaxy map, it now centers the galaxy map at that fleet
  • Clicking a Planet Under Attack notification from the galaxy screen, it now centers you on that planet
    • Thanks to Vortex for these two bug reports

UI Reskinning Part 3

  • The bottom left icons on the main screen are no longer quite as glowy when you are not hovering over them. They light up the same amount while hovered, though.
    • The idea is to make it less visually distracting when you are just checking the game clock.
    • Thanks to Badger for suggesting.
  • The ship selection UI has been updated so that the icons are the same as before, but they now have similar glowy appearance to the buttons in the bottom left of the screen.
    • The "hotkey indicators" are now colored to match the button's general highlighted color, but the baseline color is now that same dull blue rather than bright white like it was before.
    • When these are highlighted, they now glow brightly in their specific color, and if they are moused over the same thing happens.
  • The sidebar backgounds have been reworked to better function with the different heights that they can all have, rather than looking really wrong and off when stretched.
  • In the top bar, the galaxy map icon has been reworked, and now looks like a galaxy rather than a map pin. It also now glows and reacts to mouseover.
    • The hover for the planet name now also highlights the background of that button in the top bar in general.
    • The metal icon has been replaced (anvil becomes metal pieces).
      • Note that metal harvester icons still need to be updated, and metal icons in text.
    • The energy icon, and science icon, and hacking icon, and threat icon have also all been updated.
    • The old threat icon is the new AIP icon.
    • Thanks to Badger, Puffin, -NR-SirLimbo, Tzarro, and zeusalmighty for all helping figure these out.
  • The various fonts in the sidebars have been updated to be more legibile at smaller sizes in particular.
    • Some were returned to the way they previously were, others are new.
    • Thank to Strategic Sage for reporting the grainy appearance and eye fatigue with the other new bits we tried.
  • In the top resource bar, all of the text and numbers are in a new font that is a bit clearer and quicker to read.
    • In times where the metal would say "Starving" in the past, it now says "Drain" to save space.
  • The hacking and tech sidebars now use the correct image, and also react to hovering with a glow.
  • The background from the load menu has been kept the same, but is now vastly darker rather than being bright and in your face.
  • The background for the save menu has been made to match that of the load menu, and is also now darker like the other one is. The other one was particualrly tacky and distracting.
  • Fixed a minor issue with the notifications not being properly rounded up in the top area.
  • The game has been updated to actually set and use the fancy new priority level backgrounds for the notifications in the top bar.
    • Bear in mind that this is something that we may tune over time based on feedback, in terms of what gets what notification priority level.
    • The notifications are now sorted by priority level from OMG, major, medium, minor, informational, and then hacking, prior to whatever the rest of their sorting would be.
  • Wave notifications (of various sorts) now have the following notification levels:
    • All CPAs are major for now.
    • Any waves against not-a-player that are shown are considered minor for now.
    • Reconquest waves are all major for now, unless they are not aimed at the player.
    • If a wave isn't one of the above and also is not targeting a planet, it's considered minor for now.
    • If a wave is headed to a planet, but that planet isn't allied to the local faction or has no owner, considered minor for now.
    • If the wave is weaker than 2/3 of the combatants friendly to the local faction at the planet, then this is minor.
    • If the wave is stronger than 200% of the combatants friendly to the local faction at the planet, AND this is a player home planet then this is OMG.
    • If the wave is stronger than 150% of the combatants friendly to the local faction at the planet, then this is major.
    • Otherwise this wave is considered a medium priority.
  • Regular notifications that are created by whatever other means are now required by code to specify their priority level when they are being created.
    • Those shake out as follows for now:
      • AI Reserves notifications are always major for now, given reports on the difficulty of these by players lately.
      • Dark Spire vengeance strikes and loci are medium and major respectively.
      • Dyson antagonizers are major.
      • Nanocaust frenzies got removed from the code, since those aren't a thing since fireteams anyhow!
      • Wormhole Invasions are always OMG level at the moment, we may adjust this.
      • Devourer Golem is informational if it's on a planet that is not owned by anyone or which is not friendly to you. It's minor if it's on a planet of you or ally.
      • Zenith Trader is always informational.
      • Hacking events are hacking priority.
      • Spire Relic Train is informational, and so are risk analyzers.
      • Spire relics and debris are also informational. Same with imperial spire.
      • Brownouts are OMG.
      • Macrophage of 4 or more are medium, less than that are minor.
      • Enemy nemesis is OMG, allied is now shown for the first time and is informational.
      • DLC2 NP move is informational.
      • DLC2 AT expansion is medium, civil war of it is major.
      • DLC2 ZM mnrs > 0 is major, just probes is medium.
      • DLC2 ZB are medium, unless all are in flight in which case are informational.
      • When your planet is under attack, the priority is normally medium, unless:
        • If it's a human homeworld, and enemies outnumber you and allies, then it's OMG.
        • If it's a human homeworld, and enemies are more than 50% of your strength, then it's major (just in case).
        • If it's a human homeworld, and enemies are less than 10% of your strength, then it's minor.
        • On non-homeworlds, if you and allies are outnumbered 2:1 in strength, it's major.
        • On non-homeworlds, if enemies are less than 50% of your strength, then it's minor.
      • Exo strikes are major until they are 95% charged, at which point they turn OMG. MDC exos no longer exist (they do something cooler), so the code for that is just scrubbed.
      • Raid engines are medium, unless they are targeting a non-player faction in which case they are informational.
      • AI Eyes, since they don't spawn anything, are rated minor.
      • Counterattacks are:
        • Minor if they are stalled
        • Still minor if the strength of the counterattack plus all local enemies at that planet is less than all the local allies and own ships at that planet (aka you are outnumbering even if the counterattack launches).
        • Major if the strength of all those enemy forces noted above is at least twice what the allied local forces mentioned are.
        • Medium if it's in the middle range.
      • Astro Trains are generally minor, but if one is headed to a depot that does something once X number of trains have reached it, and there X-1 trains have already reached it, then it jumps up to major.
      • Instigators are generally medium, but if a given instigator has done its thing at least four times, then it upgrades to major status.
    • Huge thanks to zeus for suggesting most of these, and Badger for helping figure out details, and Ovalcircle and DEMOCRACY? DEMOCRACY! for helping a ton also. And Puffin!
  • GetIsHostileTowards(), GetIsNeutralTowards(), and GetIsFriendlyTowards() on the planet faction now take in variants with a faction directly.
  • On planets, there is a new GetStrengthOfFactions_HostileTo() that gets the strength of all enemies of a faction at a planet.
    • There is also a GetStrengthOfFactions_FriendlyTo(), which lets a faction include itself in that total or not, as well.
    • There is also a new GetStrengthOfFactions_Self() that gets it just for the faction in question.
  • Fixed a pair of typos with astro train journals not firing properly.
  • The devourer golem no longer shows its warning with the color of its faction directly in the notification. That blends really poorly now in general.
    • In the tooltips it will now show that, but with deep blue in the tooltip it was a blurry smudge. We will have to make some more changes to notifications over time to make this all more clear.

Beta 2.622 Hangar Ship Diversity

(Released October 28th, 2020)

  • Fix a typo in one of the Tips for returning players
    • Thanks to Breach for reporting
  • One can no longer manually click on a ship with active repair-delay and get your engineers to repair it
    • Thanks to Arides for reporting
  • Exos that are being sync'ed with Wormhole Invasions or CPAs now always have a notification
  • Slightly improve the nanobot center hovertext
  • The Esc menu now shows the "Display Name" of the map type instead of the "Internal Name"
  • Slight buffs to the AI on intensity 10. The goal is a bit more raw power.
  • Fixed a bunch of cases of "address" being spelled with three Ds.
    • Thanks to Ovalcircle for reporting.
  • CPAs are now a bit smarter at detecting when they planet they were going to is no longer relevant. CPAs for higher difficulties (AI difficulty >= 8) are now better at focusing their forces.
  • Add a new Game Lobby setting to prevent Beacons from spawning in the game
    • Intended for people trying for Pure 10 runs, and for anyone who hates beacons
  • Add a setting for 'Hide Undiscovered Factions from Esc menu'.
    • This is mostly for people who like surprises and have a poor memory of what was going on in their games
  • If some piece of UI doesn't load properly, the main menu should no longer freak out and throw endless errors.
  • If you are adding a new faction in the game lobby and that faction has the same FactionCenterColour as an existing faction, the new faction gets a random colour

Astro Train Changes

  • Astro Trains now count as 'Large Ships' for the 'planet in combat' notification hovertext
  • Astro Trains get fewer guards. Guards now attrition (quickly) if their train is dead, and they attrition slowly if their train is on a different planet
  • Astro Trains are now better at heading to their Stations, and not getting distracted
  • This section thanks to feedback from GreatYng

Refinements To Main Menu

  • The reflection probe on the main menu is now located more to the side, so that it is not in the path of ships that go flying through out.
    • This makes it so that the reflection of the ships is shown, but there is not a giant flash on the entire screen as a ship exits the view.
  • The AI War 2 and Arcen Games logos are now subtly on the wall in 3D in the background on the main menu.
  • The old ship that was being used for the main menu animation in yesterday's build is no longer used at all. That was a junky dark ship that was never actually used in the game.
    • Now we are using spiders, bombers, raiders, and MLRS corvettes.
    • There are two different animations for each one leaving the hangar, and the quality of the animation is now higher, as well.
    • The overall idea here is to give a lot more of a sense of life and personality to the scene, and make it clear that these are multiple ships launching instead of just one repetitive animation on loop.
    • There are also now point lights on these ships, which helps give even more of a dramatic bit of motion that interacts with the rest of the scene as they exit the hangar.
  • Added a new ArcenFramerateTracker that now let's us track the framerate of the game at any time. We've previously been tracking sim performance, but not the actual framerate.
  • Also added a new ArcenCutscenePerformanceManager class that lets us react to poor framerates during a cutscene by reducing the reflection probe load.
  • On the main menu, next to where it shows the amount of time it has taken to load the game, it now also shows the FPS of the game on the main menu.

UI Reskinning Part 2

  • Fixed an unsightly bit of extra partially-transparent white pixels in the corner of the rounded menu backgrounds.
  • The textbox used throughout the game has been updated to look much more attractive than it has in the last few beta versions.
    • Actually, then we updated it yet again to make its construction vastly more complicated, but to show the halftone pattern undistorted, the borders cleanly, the interior drop shadow properly, and all that at a variety of sizes as need. Whoof, that took forever.
  • Updated fonts on the tutorial screen, and the background to help differentiate it more from the other similar screens.
    • And gave the same treatment to the load quickstart window, but with a different background that is more golden and different shapes to help tell this one apart from others.
    • And also the load game menu, where it looks like a bunch of microprocessors and similar.
  • The following windows have had their fonts updated, but no special backgrounds as they are not used all that frequently and don't need differentiating:
    • Controls window.
    • Credits window (also updated it so that the names on the right-hand screen are not cut off).
    • Kickstarter backer credits window.
    • Background story window (this also has been updated to have a more readable and better-sized font for the central story).
    • Add/edit profile window.
    • Color picker (team and border based).
    • MP client connect by IP and List windows.
    • MP client connection status window.
    • Same for the two general "popup list option" window components.
  • The chat/log window has been updated like the others, but also with a dark blue background in there to set itself apart a bit more.
    • The factions window has also been updated and has a new different background, but it's a very subtle one.
      • The sectional factions and galaxy options tabs in the main menu has been updated to match a combination of this and the chat window, since it incorporates elements from both. This really helps to make them stand apart.
        • The standalone chat on the right in the map tab in the lobby in multiplayer then matches the chat colors and such from THAT.
    • The personal settings window now has different visuals, slightly, from the galaxy-wide settings menu. Again to help with people knowing where they are at a glance.
      • The tips window also now has its own variant off the personal settings.
    • The settings sidebar popout has also now been updated (this is mainly used for fleets, but can be for other things also).
  • The notifications images have been updated a bit to have a slight bit of extra detail in their background.
    • These also now have different background images that we can swap in for minor, medium, major, OMG, informational, and hacking events.
    • Right now all the notifications are just set to medium, but we will hook them up to use different backgrounds later.
    • Thanks to Badger, zeus, Tzarro, Ovalcircle, and NR SirLimbo for helping figure these out.
  • Updated the visuals for tabs, and the top bar in general in the lobby.
    • Also updated the tabs on the left of the main screen to match this new style, including slightly different spacing for the tabs themselves.
    • Updated the build sidebar's fonts slightly, and in general its backgrounds and so on.
    • Same for the fleets tab.
    • Same for the hacking tab, except for the header part that has the hacking icon. That bit will be updated later. The button color here has also become green.
    • Same for the journal tab.
    • And outguard tab.
    • And intel tab.
    • And science tab. Here again the header icon has not yet been updated.
    • And the planet tab. Later there will be many updates here, but those will have to wait.
  • The selected ships window has been updated except for its icons, which are going to be replaced and improved.
    • Same for the main header resource bar in the game.
    • These will get some more work done on them tomorrow.

Beta 2.621 Gorgeousification

(Released October 24th, 2020)

  • It is now possible to set up material swaps on a list of images related to a given button, which in turn lets us make the glows more intense or even different colors.
    • We're now using this for the buttons in the lower left corner of the main view, so that as you hover over them it's super clear what you are hovering over. This feels far more interactive, and has a lot more in common with what we are doing with other buttons elsewhere in the game.
  • Added a new "pre-canvas LDR camera" that makes sure to do a no-algorithm tonemapping from the HDR range to the LDR range.
    • This essentially does add an extra compositing step, but makes it so that anything that might peek into the HDR range from things like hovering over certain faction icons can't possibly interact with the new bloom effect that is used for buttons.
    • Because we have a number of special extra cameras for things like the effects where we have not scouted or don't have current intel, this was the cleanest way to make sure that nothing else goes wrong.
    • Thanks to NR SirLimbo and Puffin for reporting.
  • The asteroid belt ring that goes around the playing area on planets has been updated so that it has full lighting effects on it, with a dark side and a light side that also matches the direction of the sunlight hitting the planet.
    • On dark starfield backgrounds, you'll mostly just see the brighter side of these asteroids, but you'll still finally be able to see them.
    • On light starfield backgrounds (lots of nebulas), you'll mostly see the shadowed side, which then looks a lot like before.
    • On areas of transition and contrast, you still have something to visually pick out in either situation.
    • Thanks to a lot of folks for reporting this over the years. I tried this a while ago and couldn't get it to look acceptable, but this time it worked out.
  • The timer text in the bottom left corner of the main view is now a bit smaller so that it can hopefully always fit its contents in there.
    • Thanks to NR SirLimbo for reporting.
  • The new background image behind the right window in the escape menu was actually too far forward, and was also set as a raycast target. Consequently, it looked slightly wrong and also caused the scrollbar to not be clickable.
    • Thanks to Badger for reporting.

Revised Key Scenes

  • The victory screen has been completely overhauled in terms of the visual background style, and the fonts used, and the composition of where text is, etc.
    • The overall color scheme and the visuals are based on what the main menu has been for the last few years, except it's more dramatic than before in the sky and the lighting.
    • We were fond of that old main menu screen, and so wanted to keep it around in some fashion, but also to make it more dramatic in a way that is fitting for a victory screen.
    • We were NOT fond of the old victory screen visuals, so those are just tossed out.
  • Fixed a typo in the victory text.
    • Thanks to Venger for reporting.
  • The loss screen has been pretty cool for a while, and it was based on an even older version of the main menu (go figure), but it still needed some work.
    • First of all, the armada in the background has been repositioned and also doubled in size, to better fit with the composition of where the AI overlord is located and not distract from certain other elements of the image.
    • Secondly, the background visuals are far more vicious and red and angry, and have even more visual interest, in terms of how and where they are positioned.
    • Thirdly, the blue planet now has an even stronger glow off its atmosphere, but more pale and more in the background.
    • Fourth, the lens flare and glare has been turned off of the bloom effect being used here, to keep things more consistent with the rest of the game.
    • Lastly, the text has been moved around a fair bit, and the fonts changed and button repositioned, etc. It's more similar to the loss screen, but not the same.
    • This screen is not the super most legible text, just by nature, but it's at least attractive now and it definitely is readable. But if any screen is going to cause a bit of eye strain while reading, it's this one. We figure that's okay, as you don't really need to read the parts that would be at all that way, anyhow.
  • The main menu scene is now completely overhauled, and shows a scene from inside the hangar of one of your fleet leaders.
    • This ship is moving around in such a way that the starfields outside are spinning past, and you can see the reflections of these, and the planet that goes by, affect the dark metals of the large ship you find yourself inside.
    • Through the floor, ship after ship is raised up from the bowels of the structure and accelerated out into space. Those who have been playing the game for a really long time will recognize this ship from being the "mascot ship" on the main menu 2-3 years ago. It had the game logo and company logo in 3D on the side of itself back then, but no longer does.
    • As part of this change, now that this scene is so much darker than the old main menu, the buttons fit in better in general. We are no longer tilting those backwards in order to make them fancier. It has always introduced aliasing issues around the edges of those buttons.
    • To make the ship move and accelerate properly, we have now integrated Slate Cinematic Sequencer by Paradox Notion. We've had that for years, but never had anything worth integrating it for in this project. We're aware that Unity Timeline exists, but this was a quick and familiar thing.
    • This overall scene is pretty heavy, so if it's causing lag on the main menu, please let us know.
      • On an i7 from 2016, and with a GTX 1070, at the moment we seem to only be getting around 40fps, which is a surprise. In earlier testing with this scene we were getting 130fps or so.
      • We're not sure if this is related to the Slate cutscene stuff, which was the most-recent-added, or if it's something else that we're not clear on. At any rate, the realtime reflection probe at a really high quality doesn't help matters, but boy is it gorgeous.
    • At the moment, the main menu scene (after the loading scene, which is the same as it has been for a really long time) does not include the AI War 2 logo or any other logos.
      • Later it would be nice to include the main logo and expansion logos, but perhaps integrated into the scene in some fashion.
    • Overall this, plus the changes to the other two scenes, are requiring about 300MB more disk space, and something along those lines in terms of RAM. It doesn't have any effect on the speed of loading the game.

Beta 2.620 Hotfixes

(Released October 24th, 2020)

  • Fixed an error in the most recent beta where the lobby was broken if you didn't have DLC2.
    • Thanks to cml and UFO for reporting, and Puffin for pointing us to where the issue was.
  • Fixed a known issue from the last beta where the settings and chat visible buttons in the lower left corner of the main screen were not working.

Beta 2.619 Quality Of Life And Polish

(Released October 23rd, 2020)

Since there are many visual changes in progress, to save confusion this is only on the beta branch on steam and gog right now.

  • Marauder Outposts now have more health
  • The faction list of the Esc menu is improved. It is now sorted for easier reading, and the 'allegiance' section of the Esc menu is color coded and simplified.
  • Updated the galaxy map camera view to now use a 4-camera stack instead of a 3-camera stack. The new camera on the stack is just for rendering the space background, and it now uses a field of view of 60 rather than 40 so that it has the proper perspective and scale on those background starfields and nebulas versus seeming super zoomed-in. The field of view of the map parts itself remains at 40, to avoid distortion on them.
    • Thanks to Puffin Emeritus for suggesting.
  • Harmonic turrets must be fully constructed in order to apply their "Strengthen other harmonic turrets" buff. Turrets under construction no longer count, and neither do remains
    • Reported by ArnaudB
  • Updated Harmonic mechanic to be able to increase per Mark. Harmonic turrets gain 10% of the original value per Mark.
  • Vengeance Generators now prioritize other VGs close to deploying ships when sharing energy. The goal is to get multiple battles going at once. Also improve the hovertext for VGs with some colour
    • Thanks for GreatYng for prompting
  • Astro Trains guards now spawn pre-stacked if appropriate
  • Add a new setting to not show the Dotted Lines between player planets and AI planets without wormholes. I like being able to see the colour gradient better.
    • Off by default

Journal Tweaks

  • The game now does a better job of telling you when journal entries appear through their Chat text
  • When there are new journal entries to read the "Journal" tab on the sidebar now changes colour to make it easier to notice
  • Add a few journal entries for the astro trains

UI Reskinning Part 1

  • Textboxes throughout the game now go to an ellipsis if there is not enough room for their contents, rather than looping to a second line in a strange way. This rarely came up because of character limits.
  • When you go from hovering over a textbox to then clicking it, it no longer flashes a different color for a moment.
  • Designed some new UI shaders that allow for us to use HDR blooms on icons.
    • Added a post-processing stack bloom item on the GUI-layer camera that is specifically for anything that is still in the HDR range when it is post-processing there.
    • This should not apply to anything except the UI itself, since everything else should have been mapped back down to the LDR range by the tonemapping prior to now.
    • At any rate, this then lets us use, very selectively and carefully, some glows on icons and similar in the UI and have that behave properly and give a much better sci-fi effect.
  • We've been working on this all week, but at this point the various UI elements are about... maybe 1/3rd updated to a new and improved style.
    • The escape menu, and all of the popup yes/no windows, are all done. The main menu buttons area is done (but not the actual main menu scene in the background or the angled-buttons stuff).
    • New font selections for headers and buttons are done, but they're not universally applied everywhere yet.
    • The bottom-left corner buttons and timer on the main view is fully updated, but the sidebar and resource bar and selection windows and such are not at all.

Version 2.618 Astro Reserve Tuning

(Released October 21st, 2020)

  • Add some warning text to the X map saying it has balance issues
  • Fix a bug where ai-allied factions like the scourge or marauders weren't correctly allied to things like Astro Trains. This was causing a number of issues, like 'Astro Trains never spawn'
  • CPAs will group-move more often
    • Suggested by Crabby on steam
  • Change the way Threat numbers for the resource bar are counted.
    • AI and AI-aligned factions (Instigators, CPAs. Not AI-Allied Marauders or the like) are the only factions that now count as Threat.
  • Add an Experimental setting under "Game" to allow Hunter ships required to go after a specific faction to go through other factions on the way
    • The most usual case was if you owned the center of an Octopus map, and the AI homeworld on one of the legs was building up Threat against a Nanocaust on another leg. The AI really didn't want to send attack you with its Anti-Nanocaust ships, so they would just sit around.
    • I'm not sure how well this works, and whether it has potential problems, so I'm making it an opt-in setting to get feedback.
  • AI Reserves ships now attrition much more slowly
    • Attritioning is done as a neat thematic, and also to make sure that the reserves will die if they can't get back to their wormhole, but it was going much too quickly
    • Thanks to GreatYng for pointing this out.
  • Fixed an issue where command stations and NPC fleet leaders could be seen to be in the new "stationary flagship" mode.
  • The new "stationary flagship" status now defalts to off, and for all savegames prior to this one will have them all set to off.
    • Thanks to Strategic Sage, Metrekec, Smidlee, Asteroid, TechSY730, crawlers, and others for weighing in on this.
  • For the included "Extended Ship Variants" Mod:
    • Fixed the Oculus not having a limit on the damage modifier, which meant that it could deal an amazing 1430x damage to them (assuming the 2.5x multiplier based on time also applies). A single Oculus Mark 7 could do 926,640 points of damage - per shot (120 x 5.4 x 1430).
    • Found by ArnaudB, when his Spire Great-Shield Emitter got eaten in an instant.
  • For the included "Extended Ship Variants" Mod and the Fallen Spire version as well:
    • General Change: The AI ship group weight of all variants was reduced by 50%. So now they should be spending much less budget on them, and more on base variants
    • The Void Bomber's full-invulnerability fortification effect has been nerfed
      • It now only applies to shield, and reduces damage to 0.1% (so only 1 in 1000 points of damage applies). Shields were also buffed from 250 to 500 points.
      • Hull was increased from 500 to 2500 to resist at least a bit of fusion damage, which (along with melee) is king against them
      • The defense buff now activates at a range of 350 instead of 1000
    • The Vex Guard had its cost increased: AI Budget cost up a quarter from 80 to 100, Metal cost from 4500 to 6500 and Energy cost reduced from 800 to 500
    • Also from a discussion with ArnaudB on Discord.
  • For the included "Extended Ship Variants Fallen Spire" Mod and the Fallen Spire version as well:
    • Buffed the EMP Missile Frigate up again, increasing its paralysis potential
      • The description now (accurately) states that it has 10 shots (instead of 5, it always had 10), but it now also gains 2 shots per mark level beyond 1 for a full 22 at Mark 7. This is because, as fights expand, more missiles will inevitably get shot down.
      • The maximum amount of targets hit per EMP missile is 7 instead of 5
      • EMP Missiles have an albedo of 0.6 instead of 0.3, making them immune to most tractor beams (if not all).
      • The base cap has been increased from 1-2 to 2-3 ships, or from 2-3 to 3-4 ships in the Frigates-With-Support fleet template.

Astro Train Buffs

  • Astro trains mark level goes up based on the number of trains spawned. When they begin spawning stronger variants the mark level resets to 1.
    • Previously the astro trains had just taken on the mark level of the AI, which meant it generally stayed low all the time.
  • The astro trains can now have Guards; each train can have some Guards who will deploy when there are enemies, and will return to the train when there are no longer enemies
  • Astro Trains can get more guards when they reach a Station. They also can heal a bit on reaching a station.
    • Guard strength increases based on trains killed (regardless of who killed the trains)
    • Guards are intended to make trains a bit harder
  • Astro Trains can spawn stronger variants after enough trains have been killed by the player
  • The largest balance change is letting the train mark level increase more readily. Guards are intended to be a bit of extra cool/flavour with some balance impact.

Version 2.617 Calming For The Nerves

(Released October 16th, 2020)

  • Should now be a new Journal message for AI Relic Trains.

Quality of Life Improvements

  • Add a new Galaxy Map Setting to change how the links look. Instead of using Red for "these two planets are hostile" or Blue for "these two planets are friendly", the game can now show a color gradient between the faction owners
    • The old style version is still available as an option.
  • There is a general problem with "churn" in ships and stacks being so fast that if you have many ships selected it was almost impossible to remove a status effect based off of a simple toggle.
    • Our overall logic was "if at least one of the selected items doesn't have the status, then add the status." But this gets intensely confusing, and we introduced transports that is part of why we made L be load and U be unload.
    • So let's revisit our older standing orders, too, because this is just problematic with trying to toggle them.
      • G is no longer "toggle group move" it is now "Enable Group Move"
        • You now have to use Ctrl+G to remove ships from group move. None of this toggling business!
        • Additionally, on the interface for the game where it shows the icon under selected ships, right-clicking that button now removes, while left-clicking enables. The tooltips are updated to say all this.
      • The same exact setup is now true for "Stop To Shoot Mode" and the K key, including its button and Ctrl+K and all that.
      • Exact same thing again with "hold fire/disable" functions and the N key, and Ctrl+N, the interface button, etc.
      • Ditto again for Pursuit mode and the V key.
      • And a final ditto for attack-move mode and the X key.
    • This is something that has been reported since at the very least February, and even before that, apparently. Somehow or other this still frankly just slipped past our attention. The amount of information overload that we sometimes face is kind of intense when it comes to bug reports.
      • But with that said, holy cow this was incredibly annoying. There's nothing like pressing a button and not having it do what you want to induce rage. We just don't really use these options all that much, or when we do they are with only one fleet selected, and it was working well in single-fleet situations. Something about multiple fleets in one selection was particularly throwing this off, but it's hard to be sure of the exact full reasons.
      • At any rate, we're glad to have it fixed now, and thanks to folks for bringing this up again so that it finally registered in our attention properly. This feels like a major frustrating oversight.
    • Thanks to Strategic Sage, Asteroid, Arides, and TechSY730 for reporting.
  • The escape key no longer clears your selected ships and fleets. There really was no good use case for this, and it was annoying to at least some folks.
    • Thanks to Asteroid for suggesting.
  • If you are on a map that is large enough that you can zoom out so far that the "Icons By Planets Hides At Distance" setting kicks in (default is 1.5, but you can change that up to 10 if you prefer), then now it will still show any fleets or other on-galaxy-map-units that you have selected. Later we can customize other display modes to show things in this scenario in various ways.
    • Thanks to Asteroid for suggesting.

Stationary Flagship Mode

  • New setting in the Ship Controls section of the controls: Hold To Give Orders To Stationary Flagships
    • Normally flagships that are unarmed will not listen to any orders that you give them. This is because usually you select their entire fleet, and you mean 'everybody but you.'
    • However, there are times when you definitely DO want to give them orders to move somewhere, perhaps transport some ships for you, and holding down this key while giving those orders will make them listen to you.
    • The alternative is to take them out of stationary mode, but this is far simpler. Movement orders on the galaxy map screen are always obeyed.
    • Default keybinding: control key.
  • The pre-existing "Flagship Movement Mode" option in the fleet options panel is now renamed to "Flagship Roaming" for the sake of clarity.
  • A new "Flagship Orders" option in the fleet options panel has been added.
    • It is either "Follow All Orders" or "Stationary Flagship Mode".
      • Unarmed flagships are by default stationary, while armed ones by default will follow all orders.
    • Description in the tooltip:
      • Some flagships are meant for fighting, while orders meant for hanging back. How far back is up to you.
      • When this is set to 'Follow All Orders', it acts like any other ship in your fleet. This is great for Golems and Arks. Not so hot for unarmed transports.
      • When this is set to 'Stationary Flagship Mode' mode, the flagship will just sit there and ignore all orders you give it. The assumption is that the orders are meant for the rest of the fleet.
      • To override this while staying in stationary flagship mode, hold Control down while issuing orders to the flagship. It will follow them as if this mode was not even on. This is perfect for rapidly giving different orders to your unarmed transports and the rest of the fleet they are supporting. Movement orders on the galaxy map screen are always obeyed.
  • If a flagship is in this new stationary mode, then they will show up with the "guard" shield icon behind them, which we don't really use for other purposes much.
    • This should help players who are jumping right into this new version realize that something is going on when their ships are not listening to them.
    • When Ctrl is held, then this shield status icon goes away and whatever the normal status icon would be appears. This is immediate visual feedback of what is happening, and also lets you check to see that your flagship is indeed in pursuit mode or what have you.
  • When a flagship is in the new stationary mode, and you are not on the galaxy map (where that is irrelevant), the tooltip for the flagship now shows "Stationary Flagship Mode!" even in the super brief tooltip, and then has more details if you go to medium and then full detail.
  • This whole thing with the flagships sometimes rushing to their deaths has definitely been one of the most singularly-annoying things since we introduced the concept of fleets, way back in the middle of Early Access.
    • At first, more fleets than not had big weapons (Golems and Arks), so it seemed like less of a thing. But over time, it has become more and more annoying.
    • This was something we have thought about for a long time, but for whatever reason we never could come up with a good solution for it despite how much it annoyed us directly, let alone player reports.
    • Thanks to Strategic Sage, nas1m, Asteroid, and others for contributing to this discussion since last December, and then more acutely more recently when this solution was arrived at.

Bugfixes

  • Fix a bug where the AI Reserves journal message was playing incorrectly when loading a sufficiently old game save.
    • Thanks to Metrekec for reporting
  • Fix a typo in the AIP hovertext in the resource bar
    • Thanks to Puffin for reporting
  • Don't let Exos sync with a wormhole invasion if the AIP is too low for wormhole invasions
    • Thanks to NRSirLimbo for reporting
  • Fix a bug where the AI was telling you where its major structures are, even on unexplored planets
    • Thanks to TechSY730 for reporting
  • Add some defensive code to the DoOnAnyDeath code path for the player
    • Problems were reported here in several multiplayer games.
  • Fixed a bug in the nanocaust where any savegames that included them and which were from version 2.614 would fail to load in 2.616.
    • Thanks to Cyborg for reporting, although we also ran into it ourselves.
  • It turns out that in some older savegames, we already had the wrong data types on certain other objects, such as having DoomData on certain ships.
    • We fixed this in later versions of the game and had them become more strict with how they are loading the related data in order to now allow for this sort of wrong data to persist, but in turn this made some older savegames (from the 1.3x timeframe and prior) unreadable.
    • For those older savegames, we've now relaxed the restrictions to allow for the bad data to be read in, and it will throw a warning message as you load those saves but should still actually get them open properly (the example save that we have now loads fully).
    • Thanks to Strategic Sage for reporting.
  • Fixed an exception that could happen in certain circumstances after failing to load a bad savegame.
  • Further updates: after a savegame with old bad data is loaded in, it now discards that old bad data after it loads it. This has no effect on gameplay, it was data that wasn't being used anyhow. But this does make it so that if you save it in a newer version of the game and then try to load the NEW save, you aren't just right back in the same boat with it not loading the save because of that bad data.
  • Updated the TimeBasedPool class to no longer expand, but rather to start large and just use the parts that it needs, throwing any excesses away if there really are any that are that far out of bounds.
    • There was an exceptionally rare exception that could happen when shutting down the game or going to the main menu out of the game with the way it worked before, but much more common was some extra slowness in how it was having to resize arrays to handle those events in general. That is all faster now, and can't have that sort of exception.
    • Thanks to Endovior for reporting.
  • Also put in some changes to further distance ships from pooling, and somewhat start a road toward prepping them more for the new style of PKID generation.
  • Fixed a cross-threading exception that could happen in UpdateEntitiesShownAtPlanetDirectly() if you were on the galaxy map view and a ship died at just the wrong time.
    • Thanks to UFO for reporting.

Version 2.616 Stop Printing Money, AI!

(Released October 14th, 2020)

  • Grappler Guardian balance updates from zeusalmighty, for those new units that come as a unique thing in the new AI Reserves mechanics Badger added yesterday.
  • Added a new Dire Singularity Guardian by zeusalmighty, for basically boss-level seeding in the new AI Reserves mechanics.
  • Fixed an issue where black hole generators that were not also on a ship with a gravitic core of some sort would not work.
  • Fix a bug where the scourge were spawning unlimited builders
    • Thanks to a number of people, including Sombre and ArnaudB for reporting. Thanks to Badger for fixing even after retirement.
  • Fix a bug where right-clicking a journal entry could cause an Exception
    • Thanks to Ahnold for reporting. Thanks to Badger for fixing even after retirement.
  • You can read all about The Badger And Puffin Legacy, if you like. Puffin retired earlier this year, and Badger is retiring now, so this is a good time to pay some respects.
  • The reinforcements seem to have a math bug in them, so we put in extra detail and formatting in how we export them.
  • Fixed a math bug in reinforcements that was basically "printing money" once the game really got going, and would let planets of the AI reinforce almost infinitely.
    • We're not sure if this is fully a new bug, but it has certainly found new expression in the new reinforcement logic.
    • This may have been an older bug that was somewhat suppressed by the old reinforcement logic, or it's a brand new typo, but because of how much code has changed it's hard to be sure.
  • For the first time, we now have a way for the budgets of the AI to dump their details to log files. What we found was a bit surprising and definitely horrifying.
    • First of all, for quite a long time, apparently the logic for partially-neutered planets has been horribly wrong.
      • If a planet was neutered down to 1 reinforcement point, then the budget would be 5% of usual, no problem.
      • If a planet had not lost any reinforcement points, then the budget would be 100% of usual, no problem.
      • If a planet had lost some reinforcement points, then the budget would... be multiplied by whatever the number of reinforcement points are.
        • So, you killed reinforcement points down to 4 left out of 7 original? Congrats, the cap is UP by 400%.
        • The correct number should have been 57% of normal, and now that works properly.
    • Then there was a really harsh AIP multiplier that was being applied. It was adding far too much based on whatever the budget was, and larger budgets were more affected.
      • Now it only adds budget for each AIP above 100, which is softer to begin with, and then it also only adds it based on 10% of the current running total, rather than on the entire running total.
    • Finally, there was a portion that was added based on time (number of 10 minute increments).
      • This was also too harsh. This is now based not on the running total of budget, but 1/10th of it, instead. Making this also a much gentler slope.
    • None of these were new errors, but they were showing up now more because the reinforcement logic calling these budgets was so much more effective.
    • Without these in place, AND with the above actually-charge-me-the-budget fix in place, now reinforcements happen at a rate we would expect.
    • Thanks to ArnaudB and Crabby for the saves where we could verify it, and others also for reporting.

Prior Release Notes

AI War 2: Sunset of The Badger Era